<?xml version="1.0" encoding="UTF-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-lu-rats-cross-platform-attestation-00"
     ipr="trust200902"
     submissionType="IETF"
     version="3">
  <front>
    <title abbrev="Cross-Platform Attestation">Cross-Platform Mobile Attestation Normalization</title>
    <seriesInfo name="Internet-Draft" value="draft-lu-rats-cross-platform-attestation-00"/>
    <author fullname="David Lu" initials="D." surname="Lu">
      <organization>Futurewei</organization>
      <address>
        <email>dlu@futurewei.com</email>
      </address>
    </author>
    <date year="2026" month="5"/>
    <keyword>RATS</keyword>
    <keyword>EAT</keyword>
    <keyword>attestation</keyword>
    <keyword>mobile security</keyword>
    <keyword>device integrity</keyword>
    <abstract>
      <t>This document defines a set of requirements and a normalized Entity Attestation Token (EAT) profile for representing attestation evidence produced by attestation services across heterogeneous mobile platforms, including platform-specific mechanisms such as Google Play Integrity, Apple App Attest, Apple DeviceCheck, and other OEM-specific or third-party attestation services.</t>
      <t>The goal is to enable interoperable processing of attestation evidence by verifiers and relying parties without requiring changes to the underlying attestation providers.  This document specifies a canonical mapping of platform-specific attestation claims into EAT claims and defines normalization rules intended to improve consistency across mobile ecosystems.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction" numbered="true" toc="include">
      <name>Introduction</name>
      <section anchor="problem-statement" numbered="true" toc="include">
        <name>Problem Statement</name>
        <t>Attestation is required by many mobile applications to evaluate how trustworthy the device on which they run is, and how trustworthy the applications and devices with which they interact are.  An entity that cannot be attested to be in a trustworthy state can be given reduced permissions or degraded service.</t>
        <t>This document assumes familiarity with the attestation architecture, definitions, and models described in the Remote ATtestation procedureS (RATS) Architecture <xref target="RFC9334"/> and the Entity Attestation Token (EAT) <xref target="RFC9711"/>.</t>
        <t>Mobile platform attestation mechanisms are fragmented across ecosystems, including:</t>
        <ul>
          <li>Google Play Integrity</li>
          <li>Apple App Attest and Apple DeviceCheck</li>
          <li>Third-party and OEM-specific attestation services</li>
        </ul>
        <t>Each system uses distinct formats, encodes claims differently, and applies different trust semantics.  This fragmentation creates problems for cross-platform attestation mechanisms, including divergent verification logic, no unified enforcement of trust, and lack of portability of trust evaluations.</t>
      </section>
      <section anchor="objectives" numbered="true" toc="include">
        <name>Objectives</name>
        <t>This document defines:</t>
        <ul>
          <li>A normalization layer based on the architecture described in <xref target="RFC9334"/></li>
          <li>A mapping of platform-specific attestation outputs into EAT claims as defined in <xref target="RFC9711"/></li>
          <li>Semantic rules to align common attestation signals</li>
        </ul>
        <t>This document does not:</t>
        <ul>
          <li>Define a new attestation protocol</li>
          <li>Define trust scoring or policy engines</li>
          <li>Modify root-of-trust mechanisms</li>
        </ul>
      </section>
    </section>

    <section anchor="terminology" numbered="true" toc="include">
      <name>Terminology</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="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      <t>This document uses terminology from <xref target="RFC9334"/> and <xref target="RFC9711"/>.</t>
      <dl newline="false">
        <dt>Platform Attestation Provider</dt>
        <dd>A system that produces attestation evidence, such as Google Play Integrity or Apple App Attest.</dd>
        <dt>Normalized Evidence</dt>
        <dd>An EAT-compliant representation of attestation data derived from a platform-specific format.</dd>
      </dl>
    </section>

    <section anchor="architecture" numbered="true" toc="include">
      <name>Architecture</name>
      <section anchor="roles" numbered="true" toc="include">
        <name>Roles</name>
        <t>This document assumes the same roles as those defined in <xref target="RFC9334"/> and <xref target="RFC9711"/>.</t>
        <figure anchor="fig-data-flow">
          <name>Data Flow</name>
          <artwork type="ascii-art"><![CDATA[
+------------+     +------------+     +----------------+     +---------------+
|  Attester  | --> |  Verifier  | --> | Normalization  | --> | Relying Party |
|            |     |            |     |     Layer      |     |               |
+------------+     +------------+     +----------------+     +---------------+
]]></artwork>
        </figure>
        <ol>
          <li>The Attester generates evidence for attestation.</li>
          <li>The Verifier evaluates evidence and generates attestation results, which can be in a provider-specific format.</li>
          <li>The normalization layer maps the attestation result and associated evidence into Normalized EAT.</li>
          <li>The Relying Party applies policy to the Normalized EAT.</li>
        </ol>
      </section>
    </section>

    <section anchor="neat-profile" numbered="true" toc="include">
      <name>Normalized EAT Profile</name>
      <section anchor="general-requirements" numbered="true" toc="include">
        <name>General Requirements</name>
        <t>A normalized EAT profile:</t>
        <ul>
          <li>MUST be encoded as a signed token, either in CWT or JWT format.</li>
          <li>MUST preserve the integrity of the original attestation evidence.</li>
          <li>MUST include provenance information for the original attestation provider.</li>
          <li>SHOULD use deterministic normalization rules for claim mapping.</li>
        </ul>
      </section>

      <section anchor="claims" numbered="true" toc="include">
        <name>Claims</name>
        <section anchor="required-claims-summary" numbered="true" toc="include">
          <name>Required Claims Summary</name>
          <t>The following claims MUST be present in the normalized EAT profile.</t>
          <table anchor="tbl-required-claims">
            <name>Required Claims Summary</name>
            <thead><tr><th>Claim</th><th>Type</th><th>Description</th></tr></thead>
            <tbody>
              <tr><td>entity-type</td><td>enum</td><td>Type of attested entity: DEVICE or APPLICATION.</td></tr>
              <tr><td>issuer</td><td>text</td><td>Attestation provider identifier.</td></tr>
              <tr><td>ueid</td><td>bytes</td><td>Globally unique identifier for the entity.</td></tr>
              <tr><td>entity-name</td><td>text</td><td>Device or application instance identifier.</td></tr>
              <tr><td>iat</td><td>timestamp</td><td>Time of issuance.</td></tr>
              <tr><td>eat_nonce</td><td>text or array</td><td>Challenge binding.</td></tr>
              <tr><td>origination</td><td>text</td><td>Source platform.</td></tr>
              <tr><td>trust-level</td><td>enum</td><td>Abstracted entity integrity level: UNTRUSTED, LOW, MEDIUM, or HIGH.</td></tr>
              <tr><td>dbgstat</td><td>enum</td><td>Debug state.</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="device-extension-claims-summary" numbered="true" toc="include">
          <name>Device Attestation Extension Claims Summary</name>
          <t>The following claims MUST be present when entity-type is DEVICE.</t>
          <table anchor="tbl-device-claims">
            <name>Device Attestation Extension Claims Summary</name>
            <thead><tr><th>Claim</th><th>Type</th><th>Description</th></tr></thead>
            <tbody>
              <tr><td>oemid</td><td>text</td><td>Identifier of the Original Equipment Manufacturer.</td></tr>
              <tr><td>hwmodel</td><td>text</td><td>Identifier set by the manufacturer and associated with the oemid.</td></tr>
              <tr><td>hwversion</td><td>text</td><td>Identifier distinguishing versions of the hwmodel.</td></tr>
              <tr><td>oemboot</td><td>enum</td><td>Bootloader status: TRUE or FALSE.</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="application-extension-claims-summary" numbered="true" toc="include">
          <name>Application Attestation Extension Claims Summary</name>
          <t>The following claims MUST be present when entity-type is APPLICATION.</t>
          <table anchor="tbl-application-claims">
            <name>Application Attestation Extension Claims Summary</name>
            <thead><tr><th>Claim</th><th>Type</th><th>Description</th></tr></thead>
            <tbody>
              <tr><td>swname</td><td>text</td><td>Identifier of the software being attested.</td></tr>
              <tr><td>swversion</td><td>text</td><td>Identifier distinguishing versions of swname.</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="optional-claims-summary" numbered="true" toc="include">
          <name>Optional Claims Summary</name>
          <t>The following claims MAY be present when supported by the originating attestation provider and when permitted by relying-party policy.</t>
          <table anchor="tbl-optional-claims">
            <name>Optional Claims Summary</name>
            <thead><tr><th>Claim</th><th>Type</th><th>Description</th></tr></thead>
            <tbody>
              <tr><td>location</td><td>text</td><td>Geographic position of the entity.</td></tr>
              <tr><td>uptime</td><td>integer</td><td>Time since the entity was last booted.</td></tr>
              <tr><td>dloas</td><td>array</td><td>Verifier Digital Letters of Approval.</td></tr>
              <tr><td>submods</td><td>map</td><td>Representation of subsystem architecture.</td></tr>
            </tbody>
          </table>
        </section>

        <section anchor="entity-type" numbered="true" toc="include"><name>entity-type</name><t>The entity-type claim is an enum field that identifies the type of entity from which the Attester collects claims.  This entity is the Target Environment in RATS terminology.</t><dl newline="false"><dt>APPLICATION</dt><dd>Indicates that the Target Environment of the attestation is a software application.</dd><dt>DEVICE</dt><dd>Indicates that the Target Environment of the attestation is a device.  A device in this context includes physical hardware and virtual machines.</dd></dl></section>
        <section anchor="issuer" numbered="true" toc="include"><name>issuer</name><t>The issuer claim is a text field identifying the attestation service that originally issued the claim, such as Google Play Integrity.</t></section>
        <section anchor="ueid" numbered="true" toc="include"><name>ueid</name><t>The ueid claim is a unique identifying value generated according to the rules for creating UEIDs in <xref target="RFC9711" section="4.2.1.1"/> and consumed according to the rules for consuming UEIDs in <xref target="RFC9711" section="4.2.1.2"/>.</t><t>UEIDs are treated as globally unique opaque byte strings.  A consumer MUST NOT rely on externally visible structure in a UEID unless such structure is explicitly specified by the issuer and permitted by policy.</t></section>
        <section anchor="entity-name" numbered="true" toc="include"><name>entity-name</name><t>The entity-name claim is a text string naming the entity for which the attestation is issued.  Unlike ueid, entity-name does not have uniqueness requirements and MUST NOT be used as the sole basis for strict entity identification.</t><section anchor="entity-name-google-play-integrity" numbered="true" toc="include"><name>Google Play Integrity Mapping</name><t>For Google Play Integrity, this claim SHOULD be populated with the requestDetails.requestPackageName attribute when it is available.</t></section></section>
        <section anchor="iat" numbered="true" toc="include"><name>iat</name><t>The iat claim represents the time at which the originating attestation provider issued the attestation result.  It uses the EAT and JWT NumericDate representation unless the selected serialization profile specifies otherwise.</t></section>
        <section anchor="eat-nonce" numbered="true" toc="include"><name>eat_nonce</name><t>The eat_nonce claim is a text string or array of text strings conforming to the eat_nonce claim definition in <xref target="RFC9711" section="4.1"/>.</t><section anchor="eat-nonce-google-play-integrity" numbered="true" toc="include"><name>Google Play Integrity Mapping</name><t>For Google Play Integrity standard API requests, this claim SHOULD be populated with the requestDetails.requestHash attribute.  For classic API requests, this claim SHOULD be populated with the requestDetails.nonce attribute.</t></section></section>
        <section anchor="origination" numbered="true" toc="include"><name>origination</name><t>The origination claim is a text field identifying the platform that originally issued the attestation.  Integrity service providers do not necessarily identify themselves explicitly in verdict payloads, so this document does not define a mandatory syntax for this claim.</t><t>The primary use of this claim is as an informational annotation to support provenance tracking for an attestation verdict.</t></section>
        <section anchor="trust-level" numbered="true" toc="include"><name>trust-level</name><t>The trust-level claim is an enum indicating an abstraction of the device or application integrity level issued by the Verifier.</t><t>The possible values are UNTRUSTED, LOW, MEDIUM, and HIGH.</t><t>These values are derived from proprietary claims made by device and application integrity services.  The derivation of these trust values is specified in <xref target="trust-normalization"/>.  The derivation MUST be transparent and SHOULD be as consistent as possible with existing usage of proprietary claims.</t><t>The intended use of this claim is to provide a portable replacement for proprietary trust-level claims from integrity services.</t></section>
        <section anchor="dbgstat" numbered="true" toc="include"><name>dbgstat</name><t>The dbgstat claim is an enum indicating the entity-wide status of debug facilities.  This applies to both device and application entities.  The characterization of this claim SHOULD conform to the dbgstat claim defined in <xref target="RFC9711" section="4.2.9"/>.</t></section>
        <section anchor="oemid" numbered="true" toc="include"><name>oemid</name><t>The oemid claim is a text field identifying the Original Equipment Manufacturer of the entity being attested.</t><t>This claim MUST be populated when entity-type is DEVICE.</t><t>The format and contents of this claim MUST conform to the oemid claim defined in <xref target="RFC9711" section="4.2.3"/>.</t><t>When entity-type is not DEVICE, this claim is OPTIONAL and MAY be absent.</t><t>The hwmodel and oemboot claims can depend on this claim.</t></section>
        <section anchor="hwmodel" numbered="true" toc="include"><name>hwmodel</name><t>The hwmodel claim is a text field identifying specific hardware models, products, and variants of the entity.  It is used to distinguish entities that otherwise might have the same name.</t><t>This claim MUST be populated when entity-type is DEVICE.</t><t>The format and contents of this claim MUST conform to the hwmodel claim defined in <xref target="RFC9711" section="4.2.4"/>.</t><t>When entity-type is not DEVICE, this claim is OPTIONAL and MAY be absent.</t></section>
        <section anchor="hwversion" numbered="true" toc="include"><name>hwversion</name><t>The hwversion claim is a text field identifying specific versions of the hardware identified by hwmodel.  It is used to distinguish different versions of the same hardware model.</t><t>This claim MUST be populated when entity-type is DEVICE.</t><t>The format and contents of this claim MUST conform to the hwversion claim defined in <xref target="RFC9711" section="4.2.5"/>.</t><t>When entity-type is not DEVICE, this claim is OPTIONAL and MAY be absent.</t></section>
        <section anchor="oemboot" numbered="true" toc="include"><name>oemboot</name><t>The oemboot claim represents the bootloader status or comparable OEM-controlled boot state of the device.  When supported by the originating attestation provider, this claim MUST indicate whether the attested device is in an OEM-approved boot state.</t><t>This claim MUST be populated when entity-type is DEVICE and the originating attestation evidence contains sufficient information to derive it.  If the originating evidence does not contain sufficient information, the claim MUST be absent rather than inferred.</t></section>
        <section anchor="swname" numbered="true" toc="include"><name>swname</name><t>The swname claim is a text field identifying the name used by the attested software entity.  It is a free-form value with no predefined structure and provides no guarantee of uniqueness or precision.</t><t>This claim MUST be populated when entity-type is APPLICATION.</t><t>The format and contents of this claim MUST conform to the swname claim defined in <xref target="RFC9711" section="4.2.6"/>.</t><t>When entity-type is not APPLICATION, this claim is OPTIONAL and MAY be absent.</t></section>
        <section anchor="swversion" numbered="true" toc="include"><name>swversion</name><t>The swversion claim is a text field identifying specific versions of the software identified by swname.  It is used to distinguish different versions of the same software.</t><t>This claim MUST be populated when entity-type is APPLICATION.</t><t>The format and contents of this claim MUST conform to the swversion claim defined in <xref target="RFC9711" section="4.2.7"/>.</t><t>When entity-type is not APPLICATION, this claim is OPTIONAL and MAY be absent.</t></section>
        <section anchor="location" numbered="true" toc="include"><name>location</name><t>The location claim is an OPTIONAL text field describing the geographic position of the entity when such information is supplied by the originating attestation provider and permitted by policy.</t><t>Because location information can be privacy-sensitive, implementations SHOULD omit this claim unless it is necessary for a specific relying-party decision.</t></section>
        <section anchor="uptime" numbered="true" toc="include"><name>uptime</name><t>The uptime claim is an OPTIONAL integer field representing the time since the entity was last booted.  The unit and source of this value MUST be documented by the normalization layer.</t></section>
        <section anchor="dloas" numbered="true" toc="include"><name>dloas</name><t>The dloas claim is an OPTIONAL array containing Verifier Digital Letters of Approval when such information is provided by the verification process and is relevant to relying-party policy.</t></section>
        <section anchor="submods" numbered="true" toc="include"><name>submods</name><t>The submods claim is an OPTIONAL map representing subsystem architecture.  When present, the structure and semantics of submodules SHOULD follow the submodule conventions defined for EAT.</t></section>
      </section>
    </section>

    <section anchor="trust-normalization" numbered="true" toc="include">
      <name>Trust Normalization</name>
      <t>This section describes a policy for producing the trust-level claim in the Normalized EAT.  It is a declarative policy rather than an imperative implementation algorithm.</t>
      <t>All proprietary trust signals that are normalized by this profile MUST map into one of the following levels:</t>
      <ul>
        <li>UNTRUSTED</li>
        <li>LOW</li>
        <li>MEDIUM</li>
        <li>HIGH</li>
      </ul>
      <t>Abstraction methods used to produce this normalization MUST be deterministic, documented, and consistent within the same Verifier.</t>
      <t>Consistency means that if a particular proprietary trust signal results in a particular appraisal by a Relying Party, the normalized trust signal resulting from that same proprietary signal SHOULD result in the same appraisal by the same Relying Party.</t>
      <t>For example, if a banking application would grant a device permission to view account balances in a proprietary attestation architecture, the same device ought to receive the same permission after normalization, assuming the Relying Party policy is otherwise unchanged.</t>
    </section>

    <section anchor="security-considerations" numbered="true" toc="include">
      <name>Security Considerations</name>
      <t>A normalization layer introduces semantic translation risk.  Implementations MUST ensure that normalization does not weaken the security properties of the originating attestation provider or convert provider-specific uncertainty into unwarranted confidence.</t>
      <t>Relying Parties SHOULD retain access to the original attestation evidence, or to a cryptographically protected reference to that evidence, when feasible.  This supports auditability, dispute resolution, and forensic analysis.</t>
      <t>Normalization logic MUST be protected against substitution attacks in which a claim from one platform or provider is represented as if it originated from another platform or provider.  The issuer and origination claims are therefore security-relevant and MUST be integrity-protected by the signed token.</t>
    </section>

    <section anchor="privacy-considerations" numbered="true" toc="include">
      <name>Privacy Considerations</name>
      <t>Attestation evidence can contain persistent device identifiers, application identifiers, platform metadata, and location-related information.  These values can enable correlation across services.</t>
      <t>Implementations SHOULD minimize retention and disclosure of persistent identifiers and SHOULD avoid adding cross-platform correlation vectors during normalization.</t>
      <t>Optional claims such as location SHOULD be omitted unless needed for a specific relying-party policy decision and permitted by applicable privacy requirements.</t>
    </section>

    <section anchor="iana-considerations" numbered="true" toc="include">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions at this time.</t>
      <t>If future versions of this document request registration of new EAT claims, those registrations will be specified in this section.</t>
    </section>
  </middle>

  <back>
    <references anchor="normative-references">
      <name>Normative References</name>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9334.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9711.xml"/>
    </references>
  </back>
</rfc>
