<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.18 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-deeglaze-amd-sev-snp-corim-profile-00" category="std" consensus="true" submissionType="IETF" tocDepth="6" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.22.0 -->
  <front>
    <title abbrev="CoRIM-SEV">CoRIM profile for AMD SEV-SNP attestation report</title>
    <seriesInfo name="Internet-Draft" value="draft-deeglaze-amd-sev-snp-corim-profile-00"/>
    <author initials="D." surname="Glaze" fullname="Dionna Glaze">
      <organization>Google LLC</organization>
      <address>
        <email>dionnaglaze@google.com</email>
      </address>
    </author>
    <date year="2024" month="August" day="07"/>
    <area>Security</area>
    <workgroup>Remote ATtestation ProcedureS</workgroup>
    <keyword>RIM, RATS, attestation, verifier, supply chain</keyword>
    <abstract>
      <?line 109?>

<t>AMD Secure Encrypted Virtualization with Secure Nested Pages (SEV-SNP) attestation reports comprise of reference values and cryptographic key material that a Verifier needs in order to appraise Attestation Evidence produced by an AMD SEV-SNP virtual machine.
This document specifies the information elements for representing SEV-SNP Reference Values in CoRIM format.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/deeglaze/draft-deeglaze-amd-sev-snp-corim-profile"/>.</t>
    </note>
  </front>
  <middle>
    <?line 114?>

<section anchor="sec-intro">
      <name>Introduction</name>
      <t>TODO: write after content.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC8174">RFC2119</xref> when, and only when, they appear in all capitals, as shown here.</t>
      <t>The reader is assumed to be familiar with the terms defined in <xref target="I-D.ietf-rats-corim"/> and Section 4 of <xref target="RFC9334"/>.
The syntax of data descriptions is CDDL as specified in <xref target="RFC8610"/>.</t>
    </section>
    <section anchor="amd-sev-snp-attestation-reports">
      <name>AMD SEV-SNP Attestation Reports</name>
      <t>The AMD SEV-SNP attestation scheme in <xref target="SEV-SNP.API"/> contains measurements of security-relevant configuration of the host environment and the launch configuration of a SEV-SNP VM.
This draft documents the normative representation of attestation report Evidence as a CoRIM profile.</t>
      <t>AMD-SP:
  AMD Secure Processor.
  A separate core that provides the confidentiality and integrity properties of AMD SEV-SNP.
  The function that is relevant to this document is its construction of signed virtual machine attestation reports.</t>
      <t>VCEK:
  Versioned Chip Endorsement Key.
  A key for signing the SEV-SNP Attestation Report.
  The key is derived from a unique device secret as well as the security patch levels of relevant host components.</t>
      <t>VLEK:
  Version Loaded Endorsement Key.
  An alternative SEV-SNP Attestation Report signing key that is derived from a secret shared between AMD and a Cloud Service Provider.
  The key is encrypted with a per-device per-version wrapping key that is then decrypted and stored by the AMD-SP.</t>
      <t>VEK:
  Either a VCEK or VLEK.</t>
      <section anchor="amd-sev-snp-corim-profile">
        <name>AMD SEV-SNP CoRIM Profile</name>
        <t>AMD SEV-SNP launch endorsements are carried in one or more CoMIDs inside a CoRIM.</t>
        <t>The profile attribute in the CoRIM MUST be present and MUST have a single entry set to the uri http://amd.com/please-permalink-me as shown in <xref target="_figure-profile"/>.</t>
        <figure anchor="_figure-profile">
          <name>SEV-SNP attestation profile version 1, CoRIM profile</name>
          <sourcecode type="cbor-diag"><![CDATA[
/ corim-map / {
  / corim.profile / 3: [
    32("http://amd.com/please-permalink-me")
  ]
  / ... /
}
]]></sourcecode>
        </figure>
        <section anchor="amd-sev-snp-target-environment">
          <name>AMD SEV-SNP Target Environment</name>
          <t>The <tt>ATTESTATION_REPORT</tt> structure as understood in the RATS Architecture <xref target="RFC9334"/> is a signed collection of Claims that constitute Evidence about the Target Environment.
The Attester for the <tt>ATTESTATION_REPORT</tt> is specialized hardware that will only run AMD-signed firmware.</t>
          <t>The <tt>class-id</tt> for the Target Environment measured by the AMD-SP is the tagged OID <tt>#6.111(1.3.6.1.4.1.3704.2.1)</tt>.
The launched VM on SEV-SNP has an ephemeral identifier <tt>REPORT_ID</tt>.
If the VM is the continuation of some instance as carried by a migration agent, there is also a possible <tt>REPORT_ID_MA</tt> value to identify the instance.
The attester, however, is always on the same <tt>CHIP_ID</tt>.
Given that the <tt>CHIP_ID</tt> is not uniquely identifying for a VM instance, it is better classified as a group.
The <tt>CSP_ID</tt> is similarly better classified as a group.
Either the <tt>CHIP_ID</tt> or the <tt>CSP_ID</tt> may be represented in the <tt>group</tt> codepoint as a tagged-bytes.
If the <tt>SIGNING_KEY</tt> bit of the attestation report is 1, then the <tt>group</tt> MUST be the <tt>CSP_ID</tt> of the VLEK.</t>
          <sourcecode type="cbor-diag"><![CDATA[
/ environment-map / {
  / class-map / {
    / class-id: / 0 => #6.111(1.3.6.1.4.1.3704.2.1)
  }
  / instance: / 1 => #6.563({
    / report-id: / 0 => REPORT_ID,
    / report-id-ma: / 1 => REPORT_ID_MA
    })
  / group: / 2 => #6.560(CHIP_ID)
}
]]></sourcecode>
        </section>
        <section anchor="amd-sev-snp-attestation-report-measurement-values-extensions">
          <name>AMD SEV-SNP Attestation Report measurement values extensions</name>
          <t>The fields of an attestation report that have no direct analog in the base CoRIM CDDL are given negative codepoints to be specific to this profile.</t>
          <t>The <tt>GUEST_POLICY</tt> field's least significant 16 bits represent a Major.Minor minimum version number:</t>
          <sourcecode type="cddl"><![CDATA[
sevsnpvm-policy-record = [
  abi-major: byte,
  abi-minor: byte
]
]]></sourcecode>
          <t>The policy's minimum ABI version is assigned codepoint -1:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnpvm-policy-abi: -1) => sevsnpvm-policy-record
)
]]></sourcecode>
          <t>The attestation report's <tt>FAMILY_ID</tt> and <tt>IMAGE_ID</tt> are indirectly represented through an extension to <tt>$version-scheme</tt> as described in <xref target="sec-version-scheme"/>.</t>
          <t>The attestation report's <tt>VMPL</tt> field is assigned codepoint -2:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnpvm-vmpl: -2) => 0..3
)
]]></sourcecode>
          <t>The attestation report's <tt>HOST_DATA</tt> is assigned codepoint -3:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnpvm-host-data: -3) => bstr .size 32
)
]]></sourcecode>
          <t>The SEV-SNP firmware build number and Minor.Minor version numbers are provided for both the installed and committed versions of the firmware to account for firmware hotloading.
The three values are captured in a record type <tt>sevsnphost-sp-fw-version-record</tt>:</t>
          <sourcecode type="cddl"><![CDATA[
sevsnphost-sp-fw-version-record = [
  build-number: uint .size 1,
  major: uint .size 1,
  minor: uint .size 1
]
]]></sourcecode>
          <t>The current build/major/minor of the SP firmware is assigned codepoint -4:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-sp-fw-current: -4) => sevsnphost-sp-fw-version-record
)
]]></sourcecode>
          <t>The committed build/major/minor of the SP firmware is assigned codepoint -5:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-sp-fw-committed: -5) => sevsnphost-sp-fw-version-record
)
]]></sourcecode>
          <t>The host components other than AMD SP firmware are relevant to VM security posture, so a combination of host components' security patch levels are included as TCB versions.
The TCB versions are expressed as a 64-bit number where each byte corresponds to a different component's security patch level.
Reference value providers MUST provide an overall minimum value for the combination of components, since lexicographic ordering is vulnerable to downgrade attacks.
Tools for human readability MAY present the TCB version a component-wise manner, but that is outside the scope of this document.</t>
          <t>The <tt>CURRENT_TCB</tt> version of the host is assigned codepoint -6:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-current-tcb: -6) => svn-type-choice
)
]]></sourcecode>
          <t>The <tt>COMMITTED_TCB</tt> version of the host is assigned codepoint -7:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-committed-tcb: -7) => svn-type-choice
)
]]></sourcecode>
          <t>The <tt>LAUNCH_TCB</tt> version of the host is assigned codepoint -8:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-launch-tcb: -8) => svn-type-choice
)
]]></sourcecode>
          <t>The <tt>REPORTED_TCB</tt> version of the host is assigned codepoint -9:</t>
          <sourcecode type="cddl"><![CDATA[
$$measurement-values-map-extension //= (
  &(sevsnphost-reported-tcb: -9) => svn-type-choice
)
]]></sourcecode>
          <t>The <tt>GUEST_POLICY</tt> boolean flags are added as extensions to <tt>$$flags-map-extension</tt>, starting from coedpoint -1.</t>
          <sourcecode type="cddl"><![CDATA[
$$flags-map-extension //= &(
  sevsnpvm-policy-smt-allowed: -1,
  sevsnpvm-policy-migration-agent-allowed: -2,
  sevsnpvm-policy-debug-allowed: -3,
  sevsnpvm-policy-single-socket-only: -4,
  sevsnpvm-policy-cxl-allowed: -5,
  sevsnpvm-policy-mem-aes-256-xts-required: -6,
  sevsnpvm-policy-rapl-must-be-disabled: -7,
  sevsnpvm-policy-ciphertext-hiding-must-be-enabled: -8,
)
]]></sourcecode>
          <t>There are 47 available bits for selection when the mandatory 1 in position 17 and the ABI Major.Minor values are excluded from the 64-bit <tt>GUEST_POLICY</tt>.
The <tt>PLATFORM_INFO</tt> bits are host configuration that are added as extensions to <tt>$$flags-map-extension</tt> starting at <tt>-49</tt>.</t>
          <sourcecode type="cddl"><![CDATA[
$$flags-map-extension //= &(
  sevsnphost-smt-enabled: -49,
  sevsnphost-tsme-enabled: -50,
  sevsnphost-ecc-mem-reported-enabled:-51,
  sevsnphost-rapl-disabled: -52,
  sevsnphost-ciphertext-hiding-enabled: -53
)
]]></sourcecode>
          <section anchor="sec-version-scheme">
            <name>Version scheme extension</name>
            <t>Extend the <tt>$version-scheme</tt> type with as follows</t>
            <sourcecode type="cddl"><![CDATA[
$version-scheme /= &(sevsnpvm-familyimageid-hex: -1)
]]></sourcecode>
            <t>The <tt>-1</tt> scheme is a string representation of the two 128-bit identifiers in hexadecimal encoding as separated by <tt>/</tt>.
The scheme allows for fuzzy comparison with <tt>_</tt> as a wildcard on either side of the <tt>/</tt>.</t>
            <t>An endorsement provider MAY use a different version scheme for the <tt>&amp;(version: 0)</tt> codepoint.</t>
          </section>
          <section anchor="sec-id-tag">
            <name>Notional Instance Identity</name>
            <t>A CoRIM instance identifier is universally unique, but there are different notions of identity within a single attestation report that are each unique within their notion.
A notional instance identifier is a tagged CBOR map from integer codepoint to opaque bytes.</t>
            <sourcecode type="cddl"><![CDATA[
int-bytes-map = { * int => bytes }
]]></sourcecode>
            <t>Profiles may restrict which integers are valid codepoints, and may restrict the respective byte string sizes.
For this profile, only codepoints 0 and 1 are valid.
The expected byte string sizes are 32 bytes.
For the <tt>int-bytes-map</tt> to be an interpretable extension of <tt>$instance-id-type-choice</tt>, there is <tt>tagged-int-bytes-map</tt>:</t>
            <sourcecode type="cddl"><![CDATA[
tagged-int-bytes-map = #6.563(int-bytes-map)
]]></sourcecode>
          </section>
        </section>
        <section anchor="amd-sev-snp-evidence-translation">
          <name>AMD SEV-SNP Evidence Translation</name>
          <t>The <tt>ATTESTATION_REPORT</tt> Evidence is converted into a CoRIM <tt>endorsed-triple-record</tt> using the rules in this section.
Fields of <tt>ATTESTATION_REPORT</tt> are referred to by their assigned names in <xref target="SEV-SNP.API"/>.
If the <tt>ATTESTATION_REPORT</tt> contains <tt>ID_BLOCK</tt> information, the relevant fields will be represented in a second <tt>endorsed-triple-record</tt> with a different <tt>authorized-by</tt> field value, as per the merging rules of <xref target="I-D.ietf-rats-corim"/>.</t>
          <section anchor="environment-map">
            <name><tt>environment-map</tt></name>
            <ul spacing="normal">
              <li>
                <t>The <tt>environment-map / class / class-id</tt> field SHALL be set to the BER <xref target="X.690"/> encoding of OID <xref target="RFC9090"/> <tt>1.3.6.1.4.1.3704.2.1</tt> and tagged with #6.111.</t>
              </li>
              <li>
                <t>The <tt>environment-map / instance </tt> field SHALL be set to an <tt>int-bytes-map</tt> tagged with #6.111 with at least one codepoint 0 or 1.
If codepoint 0 is populated, it SHALL be set to <tt>REPORT_ID</tt>.
If codepoint 1 is populated, it SHALL be set to <tt>REPORT_ID_MA</tt>.</t>
              </li>
              <li>
                <t>The <tt>environment-map / group </tt> field SHALL be set to the VLEK <tt>csp_id</tt> and tagged with #6.111 if <tt>SIGNING_KEY</tt> is 1.
If <tt>SIGNING_KEY</tt> is 0, the field MAY be set to the VCEK <tt>hwid</tt> and tagged with #6.111.</t>
              </li>
            </ul>
          </section>
          <section anchor="measurement-map">
            <name><tt>measurement-map</tt></name>
            <t>The <tt>mkey</tt> is left unset.
The <tt>authorized-by</tt> key SHALL be set to a representation of the VEK that signed the <tt>ATTESTATION_REPORT</tt>, or a key along the certificate path to a self-signed root, i.e., the ASK, ASVK, or ARK for the product line.
The <tt>measurement-values-map</tt> is set as described in the following section.</t>
          </section>
          <section anchor="measurement-values-map">
            <name><tt>measurement-values-map</tt></name>
            <t>The function <tt>is-set(x, b)</tt> represents whether the bit at position <tt>b</tt> is set in the number <tt>x</tt>.</t>
            <ul spacing="normal">
              <li>
                <t>The <tt>digests: 2</tt> codepoint SHALL be set to either <tt>[ / digest / { alg: 7 val: MEASUREMENT } ]</tt> or <tt>[ / digest / { alg: "sha-384" val: MEASUREMENT } ]</tt> as assigned in <xref target="IANA.named-information"/>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-smt-allowed</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 16</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-migration-agent-allowed</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 18)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-debug-allowed</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 19)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-single-socket-only</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 20)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-cxl-allowed</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 21)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-mem-aes-256-xts-required</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 22)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-rapl-must-be-disabled</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 23)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnpvm-policy-ciphertext-hiding-must-be-enabled</tt> codepoint SHALL be set to <tt>is-set(GUEST_POLICY, 24)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnphost-smt-enabled</tt> codepoint SHALL be set to <tt>is-set(PLATFORM_INFO, 0)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnphost-tsmu-enabled</tt> codepoint SHALL be set to <tt>is-set(PLATFORM_INFO, 1)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnphost-ecc-mem-reported-enabled</tt> codepoint SHALL be set to <tt>is-set(PLATFORM_INFO, 2)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnphost-rapl-disabled</tt> codepoint SHALL be set to <tt>is-set(PLATFORM_INFO, 3)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map / sevsnphost-ciphertext-hiding-enabled</tt> codepoint SHALL be set to <tt>is-set(PLATFORM_INFO, 4)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnpvm-policy-abi: -1)</tt> codepoint SHALL be set to  <tt>[ ABI_MAJOR, ABI_MINOR ]</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnpvm-vmpl: -2)</tt> codepoint SHALL be set to <tt>VMPL</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnpvm-hostdata: -3)</tt> codepoint SHALL be set to <tt>HOSTDATA</tt> if nonzero. It MAY be set to <tt>HOSTDATA</tt> if all zeroes.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-sp-fw-current: -4)</tt> codepoint SHALL be set to <tt>[ CURRENT_BUILD, CURRENT_MAJOR, CURRENT_MINOR ]</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-sp-fw-committed: -5)</tt> codepoint SHALL be set to <tt>[ COMMITTED_BUILD, COMMITTED_MAJOR, COMMITTED_MINOR ]</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-current-tcb: -6)</tt> codepoint SHALL be set to <tt>552(CURRENT_TCB)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-committed-tcb: -7)</tt> codepoint SHALL be set to <tt>552(COMMITTED_TCB)</tt></t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-launch-tcb: -8)</tt> codepoint SHALL be set to <tt>552(LAUNCH_TCB)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(sevsnphost-reported-tcb: -9)</tt> codepoint SHALL be set to <tt>552(REPORTED_TCB)</tt>.</t>
              </li>
            </ul>
            <t>If <tt>ID_BLOCK</tt> information is available, it appears in its own <tt>endorement-triple-record</tt> with additional values in <tt>authorized-by</tt> beyond the attestation key.
The <tt>authorized-by</tt> field is extended with <tt>32780(ID_KEY_DIGEST)</tt>, and if <tt>AUTHOR_KEY_EN</tt> is 1, then it is also extended with <tt>32780(AUTHOR_KEY_DIGEST)</tt>.
The Verifier MAY use a base CDDL CoRIM <tt>$crypto-key-type-choice</tt> representation if its public key information's digest is equal to the #6.32780-tagged bytes, as described it <xref target="sec-key-digest"/>.</t>
            <ul spacing="normal">
              <li>
                <t>The <tt>version: 0</tt> codepoint SHALL be set to
~~~cbor-diag
/ version-map / {
  / version: / 0 =&gt; hexlify(FAMILY_ID) '/' hexlify(IMAGE_ID)
  / version-scheme: -1 / =&gt; &amp;(sevsnpvm-familyimageid-hex: -1)
}
~~~
where <tt>hexlify</tt> is a function that translates the a byte string to its hexadecimal string encoding.</t>
              </li>
              <li>
                <t>The <tt>&amp;(svn: 1)</tt> codepoint SHALL be set to <tt>552(GUEST_SVN)</tt>.</t>
              </li>
              <li>
                <t>The <tt>&amp;(digests: 2)</tt> codepoint is in the triple record.</t>
              </li>
              <li>
                <t>The <tt>&amp;(flags: 3) / flags-map</tt> codepoints prefixed by <tt>sevsnpvm-policy</tt> SHALL be set in the triple's <tt>&amp;(flags: 3)</tt> entry as per above translation rules.</t>
              </li>
            </ul>
            <section anchor="tcb-comparison">
              <name>TCB comparison</name>
              <t>The Verifier SHALL use tho <tt>svn-type-choice</tt> comparison algorithm from {-rats-corim}}.</t>
            </section>
          </section>
          <section anchor="sec-key-digest">
            <name>Key digest comparison</name>
            <t>When <tt>ID_BLOCK</tt> is used, the full key information needed for signature verification is provided by the VMM at launch in an <tt>ID_AUTH</tt> structure.
The SNP firmware verifies the signatures and adds digests of the signing key(s) to the attestation report as evidence of successful signature verification.
When a Verifier does not have access to the original public key information used in <tt>ID_AUTH</tt>, the attestation report key digests can still be used as a representation of authority.</t>
            <t>The APPENDIX: Digital Signatures section of <xref target="SEV-SNP.API"/> specifies a representation of public keys and signatures.
An attestation report key digest will be a SHA-384 digest of the 0x403 byte buffer representation of a public key.
If an author key is used, its signature of the ID_KEY is assumed to exist and have passed given the SNP firmware specification.</t>
            <t>If a <tt>$crypto-key-type-choice</tt> key representation specifies an algorithm and parameters that are included in the Digital Signatures appendix, it is comparable to a #6.32780-tagged byte string.</t>
            <ul spacing="normal">
              <li>
                <t>Two #6.32780-tagged byte strings match if and only if their encodings are bitwise equal.</t>
              </li>
              <li>
                <t>A thumbprint representation of a key is not comparable to a #6.32780-tagged byte string since the parameters are not extractable.</t>
              </li>
              <li>
                <t>A PKIX public key (#6.554-tagged <tt>tstr</tt>) or PKIX certificate (#6.555-tagged <tt>tstr</tt>) MAY be comparable to a #6.32780-tagged byte string.</t>
              </li>
            </ul>
            <t>The <xref target="RFC3280"/> specified <tt>AlgorithmIdentifier</tt> has optional parameters based on the algorithm identifier.
The AMD signature algorithm <tt>1h</tt> corresponds to algorithm <tt>ecdsa-with-sha384</tt> from section 3.2 of <xref target="RFC5758"/>, but the parameters MUST be omitted.
The <tt>SubjectPublicKeyInfo</tt> is therefore <tt>id-ecPublicKey</tt> from section 2.1.1 of <xref target="RFC5480"/> to further allow the curve to be specified, despite not further specifying that the signature is of a SHA-384 digest.
The AMD ECSDA curve name <tt>2h</tt> corresponds to named curve <tt>secp384r1</tt> from section 2.2 of <xref target="RFC5480"/>.
The <tt>ECPoint</tt> conversion routines in section 2 of <xref target="SEC1"/> provide guidance on how the <tt>QX</tt> and <tt>QY</tt> little-endian big integers zero-padded to 72 bytes may be constructed.</t>
          </section>
        </section>
      </section>
      <section anchor="amd-sev-snp-launch-event-log">
        <name>AMD SEV-SNP Launch Event Log</name>
        <t>The composition of a SEV-SNP VM may be comprised of measurements from multiple principals, such that no one principal has absolute authority to endorse the overall measurement value represented in the attestation report.
If one principal does have that authority, the <tt>ID_BLOCK</tt> mechanism provides a convenient launch configuration endorsement mechanism without need for distributing a CoRIM.
This section documents an event log format the Virtual Machine Monitor (VMM) may construct at launch time and provide in the data pages of an extended guest request, as documented in <xref target="GHCB"/>.</t>
        <t>The content media type shall be <tt>application/vnd.amd.sevsnp.launch-updates+cbor</tt> for the encoding of a <tt>sevsnp-launch-configuration-map</tt>:</t>
        <sourcecode type="cddl"><![CDATA[
sevsnp-launch-configuration-map = {
  ? (fms: 0) => uint
  ? (sevsnpvm-launch-baseline: 1) => bytes .size 48
  ? (sevsnpvm-launch-updates: 2) => [ + sevsnp-launch-update-data-map ]
  ? (bsp-vmsa: 3) => sevsnp-vmsa-type-choice
  ? (ap-vmsa: 4) => sevsnp-ap-vmsa-type-choice
}
]]></sourcecode>
        <ul spacing="normal">
          <li>
            <t>The <tt>fms</tt> field if included SHALL contain the CPUID[1]_EAX value masked with <tt>0x0fff3fff</tt> to provide chip family, model, stepping information.
  If not included, the Verifier may reference the VEK certificate's extension for <tt>productName</tt>.</t>
          </li>
          <li>
            <t>The <tt>sevsnpvm-launch-baseline</tt> field if not included is SHALL be interpreted as an all zero SHA-384 digest.
The calculation of the launch measurement SHALL use the value is the initial <tt>PAGE_INFO</tt>'s <tt>DIGEST_CUR</tt> value.</t>
          </li>
          <li>
            <t>The <tt>sevsnpvm-launch-updates</tt> field contains an ordered list of inputs to the <tt>SNP_LAUNCH_UPDATE</tt> command:</t>
          </li>
        </ul>
        <sourcecode type="cddl"><![CDATA[
sevsnp-launch-update-sequence-map = [ sevsnp-launch-update-data-map ]
]]></sourcecode>
        <t>The <tt>sevsnp-launch-update-data-map</tt> contains all fields of the <tt>PAGE_INFO</tt> structure that are needed for reconstructing a measurement.
If an update repeats many times, such as an application processor VMSA, then that can be compressed with the <tt>repeat</tt> field.</t>
        <t>The content codepoint MUST NOT be present if the page type is neither <tt>PAGE_TYPE_NORMAL</tt> (01h) nor <tt>PAGE_TYPE_VMSA</tt> (02h).</t>
        <t>For the VMM, there are some updates it does on behalf of a different principal than the firmware vendor, so it may choose to pass through some of the information about the launch measurement circumstances for separate appraisal.</t>
        <t>The encoded <tt>sevsnp-launch-configuration-map</tt> may be found in the extended guest report data table for UUID <tt>8dd67209-971c-4c7f-8be6-4efcb7e24027</tt>.</t>
        <t>The VMM is expected to provide all fields unless their default corresponds to the value used.</t>
        <section anchor="vmsa-evidence">
          <name>VMSA evidence</name>
          <t>The VMM that assembles the initial VM state is also responsible for providing initial state for the vCPUs.
The vCPU secure save area is called the VMSA on SEV-ES.
The VMSA initial values can vary across VMMs, so it's the VMM provider's responsibility to sign their reference values.</t>
          <t>The reset vector from the firmware also influences the VMSAs for application processors' <tt>RIP</tt> and <tt>CS_BASE</tt>, so the VMSA is not entirely determined by the VMM.
The digest alone for the VMSA launch update command is insufficient to represent the separately specifiable reference values when the GHCB AP boot protocol is not in use.</t>
          <t>The bootstrap processor (BSP) and application processors (APs) typically have different initial values.
The APs typically all have the same initial value, so the <tt>ap-vmsa</tt> codepoint MAY be a single <tt>sevsnp-vmsa-type-choice</tt> to represent its replication.
Alternatively, each AP's initial VMSA may be individually specified with a list of <tt>sevsnp-vmsa-type-choice</tt>.</t>
          <t>sevsnp-repeated-vmsa = [
  vmsa: sevsnp-vmsa-type-choice
  repeat: uint
}</t>
          <t>All VMSA fields are optional.
A missing VMSA field in evidence is treated as its default value.
A missing VMSA field in a reference value is one less matching condition.</t>
        </section>
        <section anchor="vmsa-default-values">
          <name>VMSA default values</name>
          <t>Unless otherwise stated, each field's default value is 0.
The <xref target="AMD.SPM"/> is the definitive source of initial state for CPU registers, so any default value in this specification that diverges is a flaw but still MUST be considered the default for a missing value.
Figure <xref target="_figure-vmsa-defaults"/> is a CBOR representation of the nonzero default values that correspond to initial CPU register values as of the cited revision's Table 14-1.</t>
          <figure anchor="_figure-vmsa-defaults">
            <name>SEV-SNP default VMSA values</name>
            <sourcecode type="cbor-diag"><![CDATA[
/ sevsnp-vmsa-map-r1-55 / {
  / es: / 0 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x92 / limit: / 2 => 0xffff }
  / cs: / 1 => / svm-vmcb-seg-map / {
    / selector: / 0 => 0xf000
    / attrib: / 1 => 0x9b
    / limit: / 2 => 0xffff
    / base: / 3 => 0xffff0000
  }
  / ss: / 2 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x92 / limit: / 2 => 0xffff }
  / ds: / 3 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x92 / limit: / 2 => 0xffff }
  / fs: / 4 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x92 / limit: / 2 => 0xffff }
  / gs: / 5 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x92 / limit: / 2 => 0xffff }
  / gdtr: / 6 => / svm-vmcb-seg-map / { / limit: / 2 => 0xffff }
  / ldtr: / 7 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x82 / limit: / 2 => 0xffff }
  / idtr: / 8 => / svm-vmcb-seg-map / { / limit: / 2 => 0xffff }
  / tr: / 9 => / svm-vmcb-seg-map / { / attrib: / 1 => 0x83 / limit: / 2 => 0xffff }
  / cr0: / 33 => 0x10
  / dr7: / 34 => 0x400
  / dr6: / 35 => 0xffff0ff0
  / rflags: / 36 => 0x2
  / rip: / 37 => 0xfff0
  / g_pat: / 63 => 0x7040600070406
  / sev_features: / 91 => 0x1
  / xcr0: / 97 => 0x1
  / mxcsr: / 99 => 0x1f80
  / x87_ftw: / 100 => 0x5555
  / x87_fcw: / 102 => 0x40
}
]]></sourcecode>
          </figure>
          <t>The <tt>rdx</tt> is expected to be the FMS of the chip and SHOULD match the <tt>fms</tt> field of the <tt>sevsnp-launch-configuration-map</tt>.
A VMM provider may sign reference values for a <tt>sevsnp-launch-configuration-map</tt> to specify just the non-default values for the BSP and AP state.</t>
          <t>Note: This is the RESET state, not the INIT state.</t>
          <t>The <tt>sev_features</tt> codepoint is not a typical AMD64 INIT state, but specifies that SEV-SNP is in use for the virtual CPU.</t>
          <section anchor="example-vmm-reference-values-for-vmsa">
            <name>Example VMM reference values for VMSA</name>
            <t>Qemu, AWS Elastic Compute Cloud (EC2), and Google Compute Engine (GCE), all use KVM, which initializes <tt>cr4</tt> and <tt>efer</tt> to non-default values.
The values for <tt>cr4</tt> and <tt>efer</tt> are different from the SPM to allow for <tt>PSE</tt> (page size extension) <tt>SVME</tt> (secure virtual machine enable).</t>
            <t>Only Qemu follows the <xref target="AMD.SPM"/> specification for <tt>rdx</tt>, which is to match the family/model/stepping of the chip used.
GCE provides an <tt>rdx</tt> of <tt>0x600</tt> regardless (following the Intel spec), and EC2 provides <tt>0</tt> regardless.
GCE sets the <tt>G_PAT</tt> (guest page attribute table) register to <tt>0x70406</tt> to disable PA4-PA7.
Both Qemu and GCE set the <tt>tr</tt> attrib to <tt>0x8b</tt>, so it starts as a busy 32-bit TSS instead of the default 16-bit.
GCE sets <tt>ds</tt>, <tt>es</tt>, <tt>fs</tt>, <tt>gs</tt>, and <tt>ss</tt> attributes to <tt>0x93</tt> since that's the initial state on Intel processors and that works fine too.</t>
            <t>Qemu uses the Intel INIT state for the x87 floating point control word (0x37f), but 0 for the x87 floating point tag word.</t>
          </section>
        </section>
      </section>
      <section anchor="amd-sev-snp-launch-event-log-appraisal">
        <name>AMD SEV-SNP Launch Event Log Appraisal</name>
        <t>The <tt>sevsnp-launch-configuration-map</tt> is translated into a full sequence of <tt>SNP_LAUNCH_UPDATE</tt> commands on top of a baseline digest value to calculate following <xref target="SEV-SNP.API"/>'s documentation of digest calculation from <tt>PAGE_INFO</tt> structures.</t>
        <t>The first <tt>PAGE_INFO</tt> structure uses the baseline digest as its <tt>DIGEST_CUR</tt>.
The following pseudocode for the function measurement computes the expected measurement of the endorsement format.
If this measurement equals the digests value with VCEK authority, then add the baseline and updates measurement values to the same ECT as the attestation report.</t>
        <t>Since the VMM only has to provide the gpa, page type, and digest of the contents, the rest of the fields of a <tt>sevsnp-launch-update-data-map</tt> have default values when translated to a <tt>PAGE_INFO</tt> without the <tt>DIGEST_CUR</tt> field.
If the baseline is not provided, it is assumed to be all zeros.</t>
        <artwork><![CDATA[
measurement({fms, baseline, updates, bsp, aps}) = iterate(baseline, infos)
  where infos = update-info ++ [bsp-info] ++ ap-info
        update-info = appendmap(mk_page_info(fms), updates)
        bsp-info = mk_vmsa_info(fms)(bsp)
        ap-info = mk_ap_vmsa_info(fms, aps)
]]></artwork>
        <t>The <tt>iterate</tt> function is applies a <tt>sha384</tt> digest update operation on all given <tt>PAGE_INFO</tt> byte strings:</t>
        <artwork><![CDATA[
iterate(digest_cur, []) = digest_cur
iterate(digest_cur, info:infos) = iterate(digest_next , infos)
  where digest_next = sha384(digest_cur || sha384(info))
]]></artwork>
        <t>The <tt>appendmap</tt> function combines the list results of mapping a function over a list by appending them:</t>
        <artwork><![CDATA[
appendmap(f, []) = []
appendmap(f, x:xs) = append(f(x), appendmap(f, xs))
]]></artwork>
        <section anchor="updates-as-pageinfo-without-digestcur">
          <name>Updates as <tt>PAGE_INFO</tt> without <tt>DIGEST_CUR</tt>.</name>
          <t>The <tt>mk_page_info</tt> function translates update components into a singleton list of their <tt>PAGE_INFO</tt> byte string form:</t>
          <artwork><![CDATA[
mk_page_info(fms)({page-type or PAGE_TYPE_NORMAL,
                   contents,
                   gpa,
                   page-data or 0,
                   vmpl-perms or 0}):list[bytes] = [
  contents || {0x70, 0, page-type, page-data} ||
  leuint64(vmpl-data) || leuint64(gpa),
]
]]></artwork>
          <t>The <tt>leuint64</tt> function translates a 64-bit unsigned integer into its little endian byte string representation.</t>
        </section>
        <section anchor="vmsas-as-pageinfo-without-digestcur">
          <name>VMSAs as <tt>PAGE_INFO</tt> without <tt>DIGEST_CUR</tt>.</name>
          <t>The <tt>bsp-vmsa</tt> will always be measured.
If the VMM does not provide it, the default values will be used.
If the <tt>$sevsnp-vmsa-type-choice</tt> is a <tt>uuid-type</tt> or <tt>oid-type</tt>, the <tt>PAGE_INFO</tt> fields are "well-known" as published by an entity claiming the identifier.
The well-known values are expected to be provided by the Verifier in accordance with the associated published values.</t>
          <t>If the <tt>$sevsnp-vmsa-type-choice</tt> is a <tt>tagged-sevsnp-vmsa-map-r1-55</tt>, then its <tt>PAGE_INFO</tt> byte string is to be defined as follows:</t>
          <artwork><![CDATA[
mk_vmsa_info(fms)(#6.32781(sevsnp-vmsa-map-r1-55)) =
  sha384(to_vmsa_page(sevsnp-vmsa-map-r1-55)) ||
  {0x70, 0, 0x2, sevsnp-vmsa-map-r1-55 / page-data} ||
  leuint64(sevsnp-vmsa-map-r1-55 / vmpl-perms) ||
  leuint64(top_gpa(fms))
]]></artwork>
          <t>The <tt>top_gpa</tt> function provides the top-most representable page-aligned address for the chip model:</t>
          <artwork><![CDATA[
top_gpa(fms) = ((1UL << bitWidth(fms)) - 1) & PAGE_MASK

PAGE_MASK = 0xfffffffffffff000
bitWidth(fms) = 48 if (fms >> 4) == 0xA00F0 ; Milan
bitWidth(fms) = 52 if (fms >> 4) == 0xA10F0 ; Genoa
]]></artwork>
          <t>The <tt>to_vmsa_page</tt> function constructs a VMSA 4KiB page with fields written to their respective locations as specified by the <xref target="AMD.SPM"/>.
Fields not represented in the map are taken to be their default value from figure <xref target="_figure-vmsa-defaults"/>.</t>
          <t>The <tt>ap-vmsa</tt> will be measured only if present.
The list of VMSA type choices is translated to a list of <tt>PAGE_INFO</tt> with the same operation:</t>
          <artwork><![CDATA[
mk_ap_vmsa_info(fms, [ + sevsnp-vmsa-type-choice ]) =
  map(mk_vmsa_info(fms)([ sevsnp-vmsa-type-choice ... ])
]]></artwork>
          <t>The repeated vmsas expand into a list of the same <tt>PAGE_INFO</tt> byte string repeated:</t>
          <artwork><![CDATA[
mk_ap_vmsa_info(fms, #6.32872([vmsa, repeat])) =
  [mk_vmsa_info(fms)(vmsa)]*repeat
]]></artwork>
        </section>
        <section anchor="comparisons-for-reference-values">
          <name>Comparisons for reference values</name>
          <t>An "any" sequence number matches any sequence number.
The uint sequence number starts counting after the baseline matches.
If there is no reference baseline, the sequence numbers start at 0.
If there is a reference baseline, the VMM's provided baseline gets hash-combined with the provided updates until the digest equals the signed baseline, and the sequence numbers s
tart from the following update as if they are 1.
If there is no update that leads to a matching baseline value, no updates match.</t>
          <t>The other <tt>sevsnp-launch-update-data-map</tt> codepoints must match all present codepoints with encoding equality.
The evidence ECT for the matching values are then split into a separate ECT to account for the added authority.</t>
          <t>Note: the VMM may split its baseline and updates at any point, which will drop the specificity of individual updates.
The individual updates of a reference value MUST match individual updates from the VMM.
It is therefore advantageous to combine as many updates in the reference value into the baseline as is feasible.</t>
        </section>
        <section anchor="example-ovmf-with-sevmetadata">
          <name>Example: OVMF with <tt>SevMetadata</tt></name>
          <t>The Open Virtual Machine Firmware project directs the VMM to not just load the UEFI at the top of the 4GiB memory range, but also measure referenced addresses with particular <tt>SNP_LAUNCH_UPDATE</tt> inputs.
Given that the firmware may be built by one party, the VMM another, and <tt>SEV_KERNEL_HASHES</tt> data yet another, the different data spread across the <tt>SNP_LAUNCH_UPDATE</tt> commands should be signed by the respective parties.</t>
          <section anchor="ovmf-data">
            <name>OVMF data</name>
            <t>The GUID table at the end of the ROM is terminated by the GUID <tt>96b582de-1fb2-45f7-baea-a366c55a082d</tt> starting at offset <tt>ROM_end - 0x30</tt>.
At offset <tt>ROM_end - 0x32</tt> there is a length in a 16-bit little endian unsigned integer.
At offset <tt>ROM_end - 0x32 - length</tt> there is a table with format</t>
            <table>
              <name>OVMF footer GUID table type description</name>
              <thead>
                <tr>
                  <th align="left">Type</th>
                  <th align="left">Name</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">*</td>
                  <td align="left">*</td>
                </tr>
                <tr>
                  <td align="left">UINT8[Length]</td>
                  <td align="left">Data</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT16</td>
                  <td align="left">Length</td>
                </tr>
                <tr>
                  <td align="left">EFI_GUID</td>
                  <td align="left">Name</td>
                </tr>
              </tbody>
            </table>
            <t><tt>LE_UINT16</tt> is the type of a little endian 16-bit unsigned integer.
<tt>EFI_GUID</tt> is the UUID format specified in section 4 of <xref target="RFC4122"/>.
The footer GUID and length specifies the length of the table of entries itself, which does not include the footer.</t>
            <t>Within this table there is an entry that specifies the guest physical address that contains the <tt>SevMetadata</tt>.</t>
            <table>
              <name>SevMetadataOffset GUID table entry description</name>
              <thead>
                <tr>
                  <th align="left">Type</th>
                  <th align="left">Name</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Address</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT16</td>
                  <td align="left">Length</td>
                </tr>
                <tr>
                  <td align="left">EFI_GUID</td>
                  <td align="left">dc886566-984a-4798-A75e-5585a7bf67cc</td>
                </tr>
              </tbody>
            </table>
            <t>At this address when loaded, or at offset <tt>ROM_end - (4GiB - Address)</tt>, the <tt>SevMetadata</tt>,</t>
            <table>
              <name>SevMetadata type description</name>
              <thead>
                <tr>
                  <th align="left">Type</th>
                  <th align="left">Name</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Signature</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Length</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Version</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">NumSections</td>
                </tr>
                <tr>
                  <td align="left">SevMetadataSection[Sections]</td>
                  <td align="left">Sections</td>
                </tr>
              </tbody>
            </table>
            <t>The <tt>Signature</tt> value should be <tt>'A', 'S', 'E', 'V'</tt> or "VESA" in big-endian order: <tt>0x56455341</tt>.
Where <tt>SevMetadataSection</tt> is</t>
            <table>
              <name>SevMetadataSection type description</name>
              <thead>
                <tr>
                  <th align="left">Type</th>
                  <th align="left">Name</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Address</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Length</td>
                </tr>
                <tr>
                  <td align="left">LE_UINT32</td>
                  <td align="left">Kind</td>
                </tr>
              </tbody>
            </table>
            <t>A section references some slice of guest physical memory that has a certain purpose as labeled by <tt>Kind</tt>:</t>
            <table>
              <name>OVMF section kind to SEV-SNP page type mapping</name>
              <thead>
                <tr>
                  <th align="left">Value</th>
                  <th align="left">Name</th>
                  <th align="left">PAGE_TYPE</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">1</td>
                  <td align="left">OVMF_SECTION_TYPE_SNP_SEC_MEM</td>
                  <td align="left">PAGE_TYPE_UNMEASURED</td>
                </tr>
                <tr>
                  <td align="left">2</td>
                  <td align="left">OVMF_SECTION_TYPE_SNP_SECRETS</td>
                  <td align="left">PAGE_TYPE_SECRETS</td>
                </tr>
                <tr>
                  <td align="left">3</td>
                  <td align="left">OVMF_SECTION_TYPE_CPUID</td>
                  <td align="left">PAGE_TYPE_CPUID</td>
                </tr>
                <tr>
                  <td align="left">4</td>
                  <td align="left">OVMF_SECTION_TYPE_SNP_SVSM_CAA</td>
                  <td align="left">PAGE_TYPE_ZERO</td>
                </tr>
                <tr>
                  <td align="left">16</td>
                  <td align="left">OVMF_SECTION_TYPE_KERNEL_HASHES</td>
                  <td align="left">PAGE_TYPE_NORMAL</td>
                </tr>
              </tbody>
            </table>
            <t>The memory allocated to the initial UEFI boot phase, <tt>SEC</tt>, is unmeasured but must be marked for encryption without needing the <tt>GHCB</tt> or <tt>MSR</tt> protocol.
The <tt>SEC_MEM</tt> sections contain the initial <tt>GHCB</tt> pages, page tables, and temporary memory for stack and heap.
The secrets section is memory allocated specifically for holding secrets that the AMD-SP populates at launch.
The cpuid section is memory allocated to the CPUID source of truth, which shouldn't be measured for portability and host security, but should be verified by AMD-SP for validity.
The SVSM calling area address section is to enable the firmware to communicate with a secure VM services module running at VMPL0.
The kernel hashes section is populated with expected measurements when boot advances to load Linux directly and must fail if the disk contents' digests disagree with the measured hashes.</t>
            <t>The producer of the OVMF binary may therefore decide to sign a verbose representation or a compact representation.
A verbose representation would have hundreds of updates given that every 4KiB page must be represented.
For an initial example, consider the 2MiB OVMF ROM's 512 4KiB updates as the baseline, and the metadata as individual measurements afterwards.</t>
            <sourcecode type="cbor-diag"><![CDATA[
/ sevsnp-launch-configuration-map / {
  / sevsnp-launch-update-baseline: / 1 =>
    h'70698b35cd5368eb11d27fa2162b7fe5d72d2471efd832598f6815115b08b420259a74fe0954f4dccfa8b9254c1dd4bb'
  / sevsnpvm-launch-updates: / 2 => [
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x800000
      / seq-no: / 5 => 1
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x801000
      / seq-no: / 5 => 2
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x802000
      / seq-no: / 5 => 3
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x803000
      / seq-no: / 5 => 4
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x804000
      / seq-no: / 5 => 5
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x805000
      / seq-no: / 5 => 6
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x806000
      / seq-no: / 5 => 7
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x807000
      / seq-no: / 5 => 8
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x808000
      / seq-no: / 5 => 9
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x80A000
      / seq-no: / 5 => 10
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x80B000
      / seq-no: / 5 => 11
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x80C000
      / seq-no: / 5 => 12
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 5
      / gpa: / 2 => 0x80D000
      / seq-no: / 5 => 13
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 6
      / gpa: / 2 => 0x80E000
      / seq-no: / 5 => 14
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 3
      / gpa: / 2 => 0x80F000
      / seq-no: / 5 => 15
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 1
      / gpa: / 2 => 0x810000
      / seq-no: / 5 => 16
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x811000
      / seq-no: / 5 => 17
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x812000
      / seq-no: / 5 => 18
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x813000
      / seq-no: / 5 => 19
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x814000
      / seq-no: / 5 => 20
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x815000
      / seq-no: / 5 => 21
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x816000
      / seq-no: / 5 => 22
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x817000
      / seq-no: / 5 => 23
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x818000
      / seq-no: / 5 => 24
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x819000
      / seq-no: / 5 => 25
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81A000
      / seq-no: / 5 => 26
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81B000
      / seq-no: / 5 => 27
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81C000
      / seq-no: / 5 => 28
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81D000
      / seq-no: / 5 => 29
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81E000
      / seq-no: / 5 => 30
    },
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 4
      / gpa: / 2 => 0x81F000
      / seq-no: / 5 => 31
    },
  ]
  / ap-vmsa: 4 / => #6.32781({
    / cs: / 1 => / svm-vmcb-seg-map / {/ base: / 3 => 0x800000}
    / rip: / 37 => 0xb004
  })
}
]]></sourcecode>
            <t>In this example the SEV-ES reset vector is located at <tt>0x80b004</tt>.
The AP RIP is the lower word and the CS_BASE is the upper word.
The first unmeasured section is for the SEC stage page tables up to GHCB at address <tt>0x800000</tt>, which has 9 pages accounted for in sequence.
The second unmeasured section is for the GHCB page up to secrets at address <tt>0x80A000</tt>, which has 3 pages accounted for in sequence.
The secrets page is at address <tt>0x80D000</tt>.
The CPUID page is at address <tt>rx80E000</tt>.
The svsm calling area page address is <tt>0x80F000</tt>.
The launch secrets and kernel hashes are at address <tt>0x810000</tt> and fit in 1 page.
The location of the final unmeasured pages are for the APIC page tables and PEI temporary memory.
The final section after the svsm calling area and kernel hashes up to the PEI firmware volume base, so <tt>0x811000</tt> up to <tt>0x820000</tt> for another 15 pages.</t>
            <t>A more compact representation can take advantage of the fact that several of the first update commands are driven entirely by the firmware.
The firmware author may then decide to reorder the section processing to ensure the kernel hashes are last, as there is no requirement for sequential GPAs.
The baseline contains the initial ROM plus all the sections that don't have a dependency on external measured information.
Thanks to the section reordering, only the <tt>SEV_KERNEL_HASHES</tt> need to be called out in the signed configuration.</t>
            <sourcecode type="cbor-diag"><![CDATA[
/ sevsnp-launch-configuration-map / {
  / sevsnp-launch-update-baseline: / 1 =>
    h'5b01655cda55211f900fbd073ec36882400453eec9dba3ed63be7353798850ae561625a0f6e5f136e8c4e196fcbca45f'
  / sevsnpvm-launch-updates: / 2 => [
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 1
      / gpa: / 2 => 0x810000
      / seq-no: / 5 => 1
    },
  ]
  / ap-vmsa: 4 / => #6.32781({
    / cs: / 1 => / svm-vmcb-seg-map / {/ base: / 3 => 0x800000}
    / rip: / 37 => 0xb004
  })
}
]]></sourcecode>
          </section>
          <section anchor="kernel-data">
            <name>Kernel data</name>
            <t>The OVMF image may be provided by a different vendor than the OS disk image.
The user of the VM platform may not have direct access to reference values ahead of time to countersign their combination.
The kernel hashes become an input to the control plane that are then fed to the construction of the VM launch.
The provider of the OS disk image then is responsible for signing the reference values for kernel hashes.
The order in which kernel hashes are loaded, and at which address is irrelevant provided the attestation policy requires some signed value in the end, so the signer does not provide either the <tt>gpa</tt> or <tt>seq-no</tt> values.</t>
            <sourcecode type="cbor-diag"><![CDATA[
/ sevsnp-launch-configuration-map / {
  / sevsnpvm-launch-updates: / 2 => [
    / sevsnp-launch-update-data-map / {
      / page-type: / 0 => 1
      / content: / 2 => / digest / [ 7, h'111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111' ]
    }
  ]
}
]]></sourcecode>
            <t>The digest is of a Qemu data structure that contains different digests of content from the command line.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="new-cbor-tags">
        <name>New CBOR Tags</name>
        <t>IANA is requested to allocate the following tags in the "CBOR Tags" registry <xref target="IANA.cbor-tags"/>.
The choice of the CoRIM-earmarked value is intentional.</t>
        <table anchor="cbor-tags">
          <name>Added CBOR tags</name>
          <thead>
            <tr>
              <th align="left">Tag</th>
              <th align="left">Data Item</th>
              <th align="left">Semantics</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">563</td>
              <td align="left">
                <tt>map</tt></td>
              <td align="left">Keys are always int, values are opaque bytes, see <xref target="sec-id-tag"/></td>
              <td align="left">RFCthis</td>
            </tr>
            <tr>
              <td align="left">32780</td>
              <td align="left">
                <tt>bytes</tt></td>
              <td align="left">A digest of an AMD public key format that compares with other keys <xref target="sec-key-digest"/></td>
              <td align="left">RFCthis</td>
            </tr>
            <tr>
              <td align="left">32781</td>
              <td align="left">
                <tt>map</tt></td>
              <td align="left">A map of virtual machine vCPU registers (VMSA) to initial values <xref target="vmsa-evidence"/></td>
              <td align="left">RFCthis</td>
            </tr>
            <tr>
              <td align="left">32782</td>
              <td align="left">
                <tt>array</tt></td>
              <td align="left">A record of a single VMSA and a count of how many times it repeats <xref target="vmsa-evidence"/></td>
              <td align="left">RFCthis</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <author fullname="W. Ford" initials="W." surname="Ford"/>
            <author fullname="D. Solo" initials="D." surname="Solo"/>
            <date month="April" year="2002"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 Certificate Revocation List (CRL) for use in the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3280"/>
          <seriesInfo name="DOI" value="10.17487/RFC3280"/>
        </reference>
        <reference anchor="RFC4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <author fullname="R. Salz" initials="R." surname="Salz"/>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC5480">
          <front>
            <title>Elliptic Curve Cryptography Subject Public Key Information</title>
            <author fullname="S. Turner" initials="S." surname="Turner"/>
            <author fullname="D. Brown" initials="D." surname="Brown"/>
            <author fullname="K. Yiu" initials="K." surname="Yiu"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="T. Polk" initials="T." surname="Polk"/>
            <date month="March" year="2009"/>
            <abstract>
              <t>This document specifies the syntax and semantics for the Subject Public Key Information field in certificates that support Elliptic Curve Cryptography. This document updates Sections 2.3.5 and 5, and the ASN.1 module of "Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 3279. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5480"/>
          <seriesInfo name="DOI" value="10.17487/RFC5480"/>
        </reference>
        <reference anchor="RFC5758">
          <front>
            <title>Internet X.509 Public Key Infrastructure: Additional Algorithms and Identifiers for DSA and ECDSA</title>
            <author fullname="Q. Dang" initials="Q." surname="Dang"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="K. Moriarty" initials="K." surname="Moriarty"/>
            <author fullname="D. Brown" initials="D." surname="Brown"/>
            <author fullname="T. Polk" initials="T." surname="Polk"/>
            <date month="January" year="2010"/>
            <abstract>
              <t>This document updates RFC 3279 to specify algorithm identifiers and ASN.1 encoding rules for the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) digital signatures when using SHA-224, SHA-256, SHA-384, or SHA-512 as the hashing algorithm. This specification applies to the Internet X.509 Public Key infrastructure (PKI) when digital signatures are used to sign certificates and certificate revocation lists (CRLs). This document also identifies all four SHA2 hash algorithms for use in the Internet X.509 PKI. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5758"/>
          <seriesInfo name="DOI" value="10.17487/RFC5758"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9334">
          <front>
            <title>Remote ATtestation procedureS (RATS) Architecture</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="N. Smith" initials="N." surname="Smith"/>
            <author fullname="W. Pan" initials="W." surname="Pan"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>In network protocol exchanges, it is often useful for one end of a communication to know whether the other end is in an intended operating state. This document provides an architectural overview of the entities involved that make such tests possible through the process of generating, conveying, and evaluating evidentiary Claims. It provides a model that is neutral toward processor architectures, the content of Claims, and protocols.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9334"/>
          <seriesInfo name="DOI" value="10.17487/RFC9334"/>
        </reference>
        <reference anchor="RFC9090">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Object Identifiers</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), defined in RFC 8949, is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>This document defines CBOR tags for object identifiers (OIDs) and is the reference document for the IANA registration of the CBOR tags so defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9090"/>
          <seriesInfo name="DOI" value="10.17487/RFC9090"/>
        </reference>
        <reference anchor="X.690" target="https://www.itu.int/rec/T-REC-X.690">
          <front>
            <title>Information technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)</title>
            <author>
              <organization>International Telecommunications Union</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="ITU-T" value="Recommendation X.690"/>
        </reference>
        <reference anchor="IANA.named-information" target="https://www.iana.org/assignments/named-information">
          <front>
            <title>Named Information</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
        <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignments/cbor-tags">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-rats-corim">
          <front>
            <title>Concise Reference Integrity Manifest</title>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Thomas Fossati" initials="T." surname="Fossati">
              <organization>Linaro</organization>
            </author>
            <author fullname="Yogesh Deshpande" initials="Y." surname="Deshpande">
              <organization>arm</organization>
            </author>
            <author fullname="Ned Smith" initials="N." surname="Smith">
              <organization>Intel</organization>
            </author>
            <author fullname="Wei Pan" initials="W." surname="Pan">
              <organization>Huawei Technologies</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   Remote Attestation Procedures (RATS) enable Relying Parties to assess
   the trustworthiness of a remote Attester and therefore to decide
   whether to engage in secure interactions with it - or not.  Evidence
   about trustworthiness can be rather complex and it is deemed
   unrealistic that every Relying Party is capable of the appraisal of
   Evidence.  Therefore that burden is typically offloaded to a
   Verifier.  In order to conduct Evidence appraisal, a Verifier
   requires not only fresh Evidence from an Attester, but also trusted
   Endorsements and Reference Values from Endorsers and Reference Value
   Providers, such as manufacturers, distributors, or device owners.
   This document specifies the information elements for representing
   Endorsements and Reference Values in CBOR format.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rats-corim-05"/>
        </reference>
        <reference anchor="SEV-SNP.API" target="https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56860.pdf">
          <front>
            <title>SEV Secure Nested Paging Firmware ABI Specification</title>
            <author>
              <organization>Advanced Micro Devices Inc.</organization>
            </author>
            <date year="2023" month="September"/>
          </front>
          <seriesInfo name="Revision 1.55" value=""/>
        </reference>
        <reference anchor="GHCB" target="https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/56421.pdf">
          <front>
            <title>SEV-ES Guest-Hypervisor Communication Block Standardization</title>
            <author>
              <organization>Advanced Micro Devices Inc.</organization>
            </author>
            <date year="2023" month="July"/>
          </front>
          <seriesInfo name="Revision 2.03" value=""/>
        </reference>
        <reference anchor="VCEK" target="https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/specifications/57230.pdf">
          <front>
            <title>Versioned Chip Endorsement Key (VCEK) Certificate and KDS Interface Specification</title>
            <author>
              <organization>Advanced Micro Devices Inc.</organization>
            </author>
            <date year="2023" month="January"/>
          </front>
          <seriesInfo name="Revision 0.51" value=""/>
        </reference>
        <reference anchor="VLEK" target="https://www.amd.com/content/dam/amd/en/documents/epyc-technical-docs/user-guides/58369-010-versioned-loaded-endorsement-key-certificate-definition.pdf">
          <front>
            <title>Versioned Loaded Endorsement Key (VLEK) Certificate Definition</title>
            <author>
              <organization>Advanced Micro Devices Inc.</organization>
            </author>
            <date year="2023" month="October"/>
          </front>
          <seriesInfo name="Revision 0.10" value=""/>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/SEC1-Ver-1.0.pdf">
          <front>
            <title>Standards for Efficient Cryptography Group (SECG), "SEC1: Elliptic Curve Cryptography"</title>
            <author>
              <organization>Certicom Corp.</organization>
            </author>
            <date year="2000" month="September"/>
          </front>
          <seriesInfo name="Version 1.0" value=""/>
        </reference>
        <reference anchor="AMD.SPM" target="https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24593.pdf">
          <front>
            <title>AMD64 Architecture Programmer’s Manual, Volume 2: System Programming</title>
            <author>
              <organization>Advanced Micro Devices Inc.</organization>
            </author>
            <date year="2024" month="March"/>
          </front>
          <seriesInfo name="Revision 3.42" value=""/>
        </reference>
      </references>
    </references>
    <?line 995?>

<section anchor="sec-corim-cddl">
      <name>CoRIM Extensions CDDL</name>
      <sourcecode type="cddl"><![CDATA[
$crypto-key-type-choice /= #6.32780(bytes .size 48)

digest = [
  alg: (int / text),
  val: bytes
]

int-bytes-map = { * int => bytes }

non-empty<M> = (M) .and ({ + any => any })

sevsnp-launch-configuration-map = {
  ? (fms: 0) => uint
  ? (sevsnpvm-launch-baseline: 1) => bytes .size 48
  ? (sevsnpvm-launch-updates: 2) => [ + sevsnp-launch-update-data-map ]
  ? (bsp-vmsa: 3) => sevsnp-vmsa-type-choice
  ? (ap-vmsa: 4) => sevsnp-ap-vmsa-type-choice
}

sevsnp-launch-update-data-map = non-empty<{
  ? &(page-type: 0) => 1..6
  ? &(content: 1) => digest
  ? &(gpa: 2) => uint
  ? &(page-data: 3) => byte .bits sev-snp-page-data
  ? &(vmpl-perms: 4) => uint64
  ? &(seq-no: 5) => uint
}>

sevsnp-launch-update-sequence-map = [ sevsnp-launch-update-data-map ]

sev-snp-page-data = &(
  imi-page: 0
)

sevsnp-repeated-vmsa = [
  vmsa: sevsnp-vmsa-type-choice
  repeat: uint
}

sevsnp-ap-vmsa-type-choice = [ + sevsnp-vmsa-type-choice ] / tagged-sevsnp-repeated-vmsa

$$flags-map-extension //= &(
  sevsnpvm-policy-smt-allowed: -1,
  sevsnpvm-policy-migration-agent-allowed: -2,
  sevsnpvm-policy-debug-allowed: -3,
  sevsnpvm-policy-single-socket-only: -4,
  sevsnpvm-policy-cxl-allowed: -5,
  sevsnpvm-policy-mem-aes-256-xts-required: -6,
  sevsnpvm-policy-rapl-must-be-disabled: -7,
  sevsnpvm-policy-ciphertext-hiding-must-be-enabled: -8,
)

$$measurement-values-map-extension //= (
  &(sevsnpvm-host-data: -3) => bstr .size 32
)

$$measurement-values-map-extension //= (
  &(sevsnpvm-policy-abi: -1) => sevsnpvm-policy-record
)

sevsnpvm-policy-record = [
  abi-major: byte,
  abi-minor: byte
]

$version-scheme /= &(sevsnpvm-familyimageid-hex: -1)

$$measurement-values-map-extension //= (
  &(sevsnpvm-vmpl: -2) => 0..3
)

$$measurement-values-map-extension //= (
  &(sevsnphost-committed-tcb: -7) => svn-type-choice
)

$$measurement-values-map-extension //= (
  &(sevsnphost-current-tcb: -6) => svn-type-choice
)

$$measurement-values-map-extension //= (
  &(sevsnphost-launch-tcb: -8) => svn-type-choice
)

$$flags-map-extension //= &(
  sevsnphost-smt-enabled: -49,
  sevsnphost-tsme-enabled: -50,
  sevsnphost-ecc-mem-reported-enabled:-51,
  sevsnphost-rapl-disabled: -52,
  sevsnphost-ciphertext-hiding-enabled: -53
)

$$measurement-values-map-extension //= (
  &(sevsnphost-reported-tcb: -9) => svn-type-choice
)

sevsnphost-sp-fw-version-record = [
  build-number: uint .size 1,
  major: uint .size 1,
  minor: uint .size 1
]

$$measurement-values-map-extension //= (
  &(sevsnphost-sp-fw-current: -4) => sevsnphost-sp-fw-version-record
)

$$measurement-values-map-extension //= (
  &(sevsnphost-sp-fw-committed: -5) => sevsnphost-sp-fw-version-record
)

sevsnp-tcb-version-type-choice = sevsnphost-tcb-map / svn-type-choice

sevsnphost-tcb-map = {
  &(blspl: 0) => uint
  &(teespl: 1) => svn-type
  ? &(spl4: 2) => svn-type
  ? &(spl5: 3) => svn-type
  ? &(spl6: 4) => svn-type
  ? &(spl7: 5) => svn-type
  &(snpspl: 6) => svn-type
  &(ucodespl: 7) => svn-type
}


sevsnp-vmsa-map-r1-55 = { sevsnp-vmsa-r1-55 }

sevsnp-vmsa-r1-55 = &(
  ? &(page-data: -2) => byte .bits sev-snp-page-data
  ? &(vmpl-perms: -1) => uint64
  ? &(es: 0) => svm-vmcb-seg-map
  ? &(cs: 1) => svm-vmcb-seg-map
  ? &(ss: 2) => svm-vmcb-seg-map
  ? &(ds: 3) => svm-vmcb-seg-map
  ? &(fs: 4) => svm-vmcb-seg-map
  ? &(gs: 5) => svm-vmcb-seg-map
  ? &(ldtr: 6) => svm-vmcb-seg-map
  ? &(gdtr: 7) => svm-vmcb-seg-map
  ? &(idtr: 8) => svm-vmcb-seg-map
  ? &(tr: 9) => svm-vmcb-seg-map
  ? &(pl0_ssp: 10) => uint64
  ? &(pl1_ssp: 11) => uint64
  ? &(pl2_ssp: 12) => uint64
  ? &(pl3_ssp: 13) => uint64
  ? &(u_cet: 14) => uint64
  ? &(vmpl: 15) => byte
  ? &(cpl: 16) => byte
  ? &(efer: 17) => uint64
  ? &(perf_ctl0: 18) => uint64
  ? &(perf_ctr0: 19) => uint64
  ? &(perf_ctl1: 20) => uint64
  ? &(perf_ctr1: 21) => uint64
  ? &(perf_ctl2: 22) => uint64
  ? &(perf_ctr2: 23) => uint64
  ? &(perf_ctl3: 24) => uint64
  ? &(perf_ctr3: 25) => uint64
  ? &(perf_ctl4: 26) => uint64
  ? &(perf_ctr4: 27) => uint64
  ? &(perf_ctl5: 28) => uint64
  ? &(perf_ctr5: 29) => uint64
  ? &(xss: 30) => uint64
  ? &(cr4: 31) => uint64
  ? &(cr3: 32) => uint64
  ? &(cr0: 33) => uint64
  ? &(dr7: 34) => uint64
  ? &(dr6: 35) => uint64
  ? &(rflags: 36) => uint64
  ? &(rip: 37) => uint64
  ? &(dr0: 38) => uint64
  ? &(dr1: 39) => uint64
  ? &(dr2: 40) => uint64
  ? &(dr3: 41) => uint64
  ? &(dr0_addr_mask: 42) => uint64
  ? &(dr1_addr_mask: 43) => uint64
  ? &(dr2_addr_mask: 44) => uint64
  ? &(dr3_addr_mask: 45) => uint64
  ? &(instr_retired_ctr: 46) => uint64
  ? &(perf_ctr_global_sts: 47) => uint64
  ? &(perf_ctr_global_ctl: 48) => uint64
  ? &(rsp: 49) => uint64
  ? &(s_cet: 50) => uint64
  ? &(ssp: 51) => uint64
  ? &(isst_addr: 52) => uint64
  ? &(rax: 53) => uint64
  ? &(star: 54) => uint64
  ? &(lstar: 55) => uint64
  ? &(cstar: 56) => uint64
  ? &(sfmask: 57) => uint64
  ? &(kernel_gs_base: 58) => uint64
  ? &(sysenter_cs: 59) => uint64
  ? &(sysenter_esp: 60) => uint64
  ? &(sysenter_eip: 61) => uint64
  ? &(cr2: 62) => uint64
  ? &(g_pat: 63) => uint64
  ? &(dbgctl: 64) => uint64
  ? &(br_from: 65) => uint64
  ? &(br_to: 66) => uint64
  ? &(last_excp_from: 67) => uint64
  ? &(last_excp_to: 68) => uint64
  ? &(dbgextngfg: 69) => uint64
  ? &(spec_ctrl: 70) => uint64
  ? &(pkru: 71) => uint64
  ? &(tsc_aux: 72) => uint64
  ? &(guest_tsc_scale: 73) => uint64
  ? &(guest_tsc_offset: 74) => uint64
  ? &(reg_prot_nonce: 75) => uint64
  ? &(rcx: 76) => uint64
  ? &(rdx: 77) => uint64
  ? &(rbx: 78) => uint64
  ? &(secure_avic_ctl: 79) => uint64
  ? &(rbp: 80) => uint64
  ? &(rsi: 81) => uint64
  ? &(rdi: 82) => uint64
  ? &(r8: 83) => uint64
  ? &(r9: 84) => uint64
  ? &(r10: 85) => uint64
  ? &(r11: 86) => uint64
  ? &(r12: 87) => uint64
  ? &(r13: 88) => uint64
  ? &(r14: 89) => uint64
  ? &(r15: 90) => uint64
  ? &(sev_features: 91) => uint64
  ? &(vintr_ctrl: 92) => uint64
  ? &(virtual_tom: 93) => uint64
  ? &(tlb_id: 94) => uint64
  ? &(pcpu_id: 95) => uint64
  ? &(event_inj: 96) => uint64
  ? &(xcr0: 97) => uint64
  ? &(x87_dp: 98) => uint64
  ? &(mxcsr: 99) => uint32
  ? &(x87_ftw: 100) => uint16
  ? &(x87_fsw: 101) => uint16
  ? &(x87_fcw: 102) => uint16
  ? &(x87_fop: 103) => uint16
  ? &(x87_ds: 104) => uint16
  ? &(x87_rip: 105) => uint64
  ? &(fpreg_87: 106) => bytes .size 80
  ? &(fpreg_xmm: 107) => bytes .size 256
  ? &(fpreg_ymm: 108) => bytes .size 256
  ? &(lbr_stack: 109) => bytes .size 256
  ? &(lbr_select: 110) => uint64
  ? &(ibs_fetch_ctl: 111) => uint64
  ? &(ibs_fetch_linaddr: 112) => uint64
  ? &(ibs_op_ctl: 113) => uint64
  ? &(ibs_op_rip: 114) => uint64
  ? &(ibs_op_data: 115) => uint64
  ? &(ibs_op_data2: 116) => uint64
  ? &(ibs_op_data3: 117) => uint64
  ? &(ibs_dc_linaddr: 118) => uint64
  ? &(bp_ibstgt_rip: 119) => uint64
  ? &(ic_ibs_extd_ctl: 120) => uint64
)

$sevsnp-vmsa-type-choice = tagged-sevsnp-vmsa-map-r1-55 / uuid-type / oid-type

svm-vmcb-seg-map = {
  ? &(selector: 0) => uint16
  ? &(attrib: 1) => uint16
  ? &(limit: 2) => uint32
  ? &(base: 3) => uint64
}

svn-type = uint
svn = svn-type
min-svn = svn-type
tagged-svn = #6.552(svn)
tagged-min-svn = #6.553(min-svn)
svn-type-choice = tagged-svn / tagged-min-svn

tagged-int-bytes-map = #6.563(int-bytes-map)

tagged-sevsnp-repeated-vmsa = #6.32872(sevsnp-repeated-vmsa)

tagged-sevsnp-vmsa-map-r1-55 = #6.32781(sevsnp-vmsa-map-r1-55)

uint16 = 0..65535

uint32 = 0..4294967295

uint64 = 0..18446744073709551615

]]></sourcecode>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="Y." surname="Deshpande" fullname="Yogesh Deshpande">
        <organization>arm</organization>
        <address>
          <email>yogesh.deshpande@arm.com</email>
        </address>
      </contact>
      <t>Yogesh Deshpande contributed to the data model by providing advice about CoRIM founding principles.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
KsuhygAA

-->

</rfc>
