Certificación de ID y claves

Keystore proporciona un lugar más seguro para crear, almacenar y usar claves criptográficas de manera controlada. Cuando el almacenamiento de claves respaldado por hardware está disponible y se usa, el material de claves es más seguro contra la extracción del dispositivo, y Keymaster aplica restricciones que son difíciles de subvertir.

Sin embargo, esto solo es cierto si se sabe que las claves del almacén de claves están en almacenamiento con copia de seguridad de hardware. En Keymaster 1, no había forma de que las apps o los servidores remotos verificaran de forma confiable si este era el caso. El daemon del almacén de claves cargó el HAL de Keymaster disponible y creyó todo lo que dijo el HAL con respecto a la copia de seguridad de claves en hardware.

Para solucionar este problema, Keymaster introdujo la certificación de claves en Android 7.0 (Keymaster 2) y la certificación de ID en Android 8.0 (Keymaster 3).

El objetivo de la certificación de claves es proporcionar una forma de determinar de forma fehaciente si un par de claves asimétricas tiene una copia de seguridad en el hardware, cuáles son las propiedades de la clave y qué restricciones se aplican a su uso.

La certificación de ID permite que el dispositivo proporcione una prueba de sus identificadores de hardware, como el número de serie o el IMEI.

Certificación de claves

Para admitir la certificación de claves, Android 7.0 introdujo un conjunto de etiquetas, tipos y métodos en el HAL.

Etiquetas

  • Tag::ATTESTATION_CHALLENGE
  • Tag::INCLUDE_UNIQUE_ID
  • Tag::RESET_SINCE_ID_ROTATION

Tipo

Keymaster 2 y versiones anteriores

typedef struct {
    keymaster_blob_t* entries;
    size_t entry_count;
} keymaster_cert_chain_t;

Método AttestKey

Keymaster 3

    attestKey(vec<uint8_t> keyToAttest, vec<KeyParameter> attestParams)
        generates(ErrorCode error, vec<vec<uint8_t>> certChain);

Keymaster 2 y versiones anteriores

keymaster_error_t (*attest_key)(const struct keymaster2_device* dev,
        const keymaster_key_blob_t* key_to_attest,
        const keymaster_key_param_set_t* attest_params,
        keymaster_cert_chain_t* cert_chain);
  • dev es la estructura del dispositivo de keymaster.
  • keyToAttest es el BLOB de claves que muestra generateKey para el que se crea la certificación.
  • attestParams es una lista de los parámetros necesarios para la certificación. Esto incluye Tag::ATTESTATION_CHALLENGE y, posiblemente, Tag::RESET_SINCE_ID_ROTATION, así como Tag::APPLICATION_ID y Tag::APPLICATION_DATA. Los dos últimos son necesarios para desencriptar el blob de clave si se especificaron durante la generación de claves.
  • certChain es el parámetro de salida, que muestra un array de certificados. La entrada 0 es el certificado de certificación, lo que significa que certifica la clave de keyToAttest y contiene la extensión de certificación.

El método attestKey se considera una operación de clave pública en la clave certificada, ya que se puede llamar en cualquier momento y no necesita cumplir con restricciones de autorización. Por ejemplo, si la clave certificada necesita la autenticación del usuario para su uso, se puede generar una certificación sin la autenticación del usuario.

Certificado de certificación

El certificado de certificación es un certificado X.509 estándar, con una extensión de certificación opcional que contiene una descripción de la clave certificada. El certificado está firmado con una clave de certificación certificada. La clave de certificación puede usar un algoritmo diferente al de la clave que se certifica.

El certificado de certificación contiene los campos que se indican en la siguiente tabla y no puede contener ningún campo adicional. Algunos campos especifican un valor de campo fijo. Las pruebas de CTS validan que el contenido del certificado sea exactamente como se define.

SEQUENCE del certificado

Nombre del campo (consulta RFC 5280) Valor
tbsCertificate SEQUENCE de TBSCertificate
signatureAlgorithm AlgorithmIdentifier del algoritmo que se usa para firmar la clave:
ECDSA para claves de EC, RSA para claves de RSA.
signatureValue STRING de BIT, firma calculada en tbsCertificate con codificación DER ASN.1.

SEQUENCE de TBSCertificate

Nombre del campo (consulta RFC 5280) Valor
version INTEGER 2 (significa certificado v3)
serialNumber ENTERO 1 (valor fijo: igual en todos los certificados)
signature AlgorithmIdentifier del algoritmo que se usa para firmar la clave: ECDSA para claves de EC, RSA para claves de RSA.
issuer Igual que el campo de asunto de la clave de certificación de lote.
validity SEQUENCE de dos fechas, que contiene los valores de Tag::ACTIVE_DATETIME y Tag::USAGE_EXPIRE_DATETIME. Esos valores se expresan en milisegundos desde el 1 de enero de 1970. Consulta RFC 5280 para ver las representaciones de fecha correctas en los certificados.
Si Tag::ACTIVE_DATETIME no está presente, usa el valor de Tag::CREATION_DATETIME. Si Tag::USAGE_EXPIRE_DATETIME no está presente, usa la fecha de vencimiento del certificado de clave de certificación por lotes.
subject CN = "Android Keystore Key" (valor fijo: el mismo en todos los certificados)
subjectPublicKeyInfo SubjectPublicKeyInfo que contiene la clave pública certificada
extensions/Key Usage digitalSignature: Se establece si la clave tiene el propósito KeyPurpose::SIGN o KeyPurpose::VERIFY. Todos los demás bits no se establecen.
extensions/CRL Distribution Points Valor (TBD)
extensions/"attestation" El OID es 1.3.6.1.4.1.11129.2.1.17. El contenido se define en la sección Extensión de certificación que aparece a continuación. Al igual que con todas las extensiones de certificados X.509, el contenido se representa como una OCTET_STRING que contiene una codificación DER de la SEQUENCE de certificación.

Extensión de certificación

La extensión attestation tiene OID 1.3.6.1.4.1.11129.2.1.17. Contiene información sobre el par de claves que se certifica y el estado del dispositivo en el momento de la generación de claves.

Los tipos de etiquetas de Keymaster/KeyMint definidos en la especificación de la interfaz AIDL se traducen a tipos ASN.1 de la siguiente manera:

Tipo de Keymaster/KeyMint Tipo ASN.1 Notas
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Milisegundos desde el 1 de enero de 1970 a las 00:00:00 (GMT).
BOOL NULL La presencia de la etiqueta significa verdadero y la ausencia significa falso.
BIGNUM Ninguna etiqueta tiene este tipo, por lo que no se define ninguna asignación.
BYTES OCTET_STRING

Esquema

El siguiente esquema ASN.1 describe el contenido de la extensión de certificación:

Versión 300

KeyDescription ::= SEQUENCE {
    attestationVersion  300,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
    attestationIdSecondImei  [723] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 200

KeyDescription ::= SEQUENCE {
    attestationVersion  200,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 100

KeyDescription ::= SEQUENCE {
    attestationVersion  100,
    attestationSecurityLevel  SecurityLevel,
    keyMintVersion  INTEGER,
    keyMintSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    mgfDigest  [203] EXPLICIT SET OF INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    usageCountLimit  [405] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 4

KeyDescription ::= SEQUENCE {
    attestationVersion  4,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    earlyBootOnly  [305] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
    deviceUniqueAttestation  [720] EXPLICIT NULL OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 3

KeyDescription ::= SEQUENCE {
    attestationVersion  3,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
    StrongBox  (2),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    rollbackResistance  [303] EXPLICIT NULL OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    trustedUserPresenceRequired  [507] EXPLICIT NULL OPTIONAL,
    trustedConfirmationRequired  [508] EXPLICIT NULL OPTIONAL,
    unlockedDeviceRequired  [509] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
    vendorPatchLevel  [718] EXPLICIT INTEGER OPTIONAL,
    bootPatchLevel  [719] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
    verifiedBootHash OCTET_STRING,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 2

KeyDescription ::= SEQUENCE {
    attestationVersion  2,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdBrand  [710] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdDevice  [711] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdProduct  [712] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdSerial  [713] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdImei  [714] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdMeid  [715] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdManufacturer  [716] EXPLICIT OCTET_STRING OPTIONAL,
    attestationIdModel  [717] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Versión 1

KeyDescription ::= SEQUENCE {
    attestationVersion  1,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    uniqueId  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    hardwareEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

Campos KeyDescription

attestationVersion
Es la versión del esquema de ASN.1.
ValorVersión de Keymaster/KeyMint
1Keymaster versión 2.0
2Keymaster versión 3.0
3Keymaster versión 4.0
4Keymaster versión 4.1
100KeyMint versión 1.0
200KeyMint versión 2.0
300KeyMint versión 3.0
attestationSecurityLevel

El nivel de seguridad de la ubicación en la que se almacena la clave certificada.

keymasterVersion/keyMintVersion
Es la versión de la implementación de la capa de abstracción de hardware (HAL) de Keymaster/KeyMint.
ValorVersión de Keymaster/KeyMint
2Keymaster versión 2.0
3Keymaster versión 3.0
4Keymaster versión 4.0
41Keymaster versión 4.1
100KeyMint versión 1.0
200KeyMint versión 2.0
300KeyMint versión 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Es el nivel de seguridad de la implementación de Keymaster/KeyMint.
attestationChallenge
Es el desafío que se proporcionó en el momento de la generación de la clave.
uniqueId
Un identificador de dispositivo sensible a la privacidad que las apps del sistema pueden solicitar en el momento de la generación de claves. Si no se solicita el ID único, este campo estará vacío. Para obtener más detalles, consulta la sección ID único.
softwareEnforced
Es la lista de autorización de Keymaster/KeyMint que aplica el sistema Android. El código de la plataforma recopila o genera esta información, y se almacena en la partición del sistema del dispositivo. Se puede confiar en él, siempre y cuando el dispositivo ejecute un sistema operativo que cumpla con el modelo de seguridad de la plataforma de Android (es decir, el bootloader del dispositivo esté bloqueado y verifiedBootState sea Verified).
hardwareEnforced
Es la lista de autorización de Keymaster/KeyMint que aplica el entorno de ejecución confiable (TEE) o StrongBox del dispositivo. Esta información se recopila o genera con código en el hardware seguro y no está controlada por la plataforma. Por ejemplo, la información puede provenir del bootloader o a través de un canal de comunicación seguro que no implique confiar en la plataforma.

Valores SecurityLevel

El valor de SecurityLevel indica en qué medida un elemento relacionado con el almacén de claves (por ejemplo, el par de claves y la certificación) es resistente a los ataques.

Valor Significado
Software Son seguros, siempre y cuando el sistema Android del dispositivo cumpla con el modelo de seguridad de la plataforma de Android (es decir, el bootloader del dispositivo esté bloqueado y verifiedBootState sea Verified).
TrustedEnvironment Es seguro siempre que no se comprometa el entorno de ejecución confiable (TEE). Los requisitos de aislamiento para los TEE se definen en las secciones 9.11 [C-1-1] a [C-1-4] del Documento de definición de compatibilidad de Android. Los TEE son muy resistentes a los peligros remotos y moderadamente resistentes a los ataques directos de hardware.
StrongBox Es seguro siempre y cuando StrongBox no se vea comprometido. StrongBox se implementa en un Elemento seguro similar a un módulo de seguridad de hardware. Los requisitos de implementación de StrongBox se definen en la sección 9.11.2 del Documento de definición de compatibilidad de Android. StrongBox es muy resistente a los ataques remotos y a los ataques de hardware directos (por ejemplo, manipulaciones físicas y ataques de canal lateral).

Campos de AuthorizationList

Cada campo corresponde a una etiqueta de autorización de Keymaster/KeyMint de la especificación de la interfaz de AIDL. La especificación es la fuente de información sobre las etiquetas de autorización: su significado, el formato de su contenido, si se espera que aparezcan en los campos softwareEnforced o hardwareEnforced en el objeto KeyDescription, si son mutuamente excluyentes con otras etiquetas, etc. Todos los campos AuthorizationList son opcionales.

Cada campo tiene una etiqueta específica del contexto EXPLICIT igual al número de etiqueta de Keymaster/KeyMint, lo que permite una representación más compacta de los datos en AuthorizationList. Por lo tanto, el analizador ASN.1 debe conocer el tipo de datos esperado para cada etiqueta específica del contexto. Por ejemplo, Tag::USER_AUTH_TYPE se define como ENUM | 504. En el esquema de extensión de certificación, el campo purpose en AuthorizationList se especifica como userAuthType [504] EXPLICIT INTEGER OPTIONAL. Por lo tanto, su codificación ASN.1 contendrá la etiqueta específica del contexto 504 en lugar de la etiqueta de clase UNIVERSAL para el tipo ASN.1 INTEGER, que es 10.

purpose
Corresponde a la etiqueta de autorización Tag::PURPOSE que usa un valor de ID de etiqueta de 1.
algorithm

Corresponde a la etiqueta de autorización Tag::ALGORITHM que usa un valor de ID de etiqueta de 2.

En un objeto AuthorizationList de certificación. El valor del algoritmo es siempre RSA o EC.

keySize
Corresponde a la etiqueta de autorización Tag::KEY_SIZE que usa un valor de ID de etiqueta de 3.
digest
Corresponde a la etiqueta de autorización Tag::DIGEST que usa un valor de ID de etiqueta de 5.
padding
Corresponde a la etiqueta de autorización Tag::PADDING que usa un valor de ID de etiqueta de 6.
ecCurve

Corresponde a la etiqueta de autorización Tag::EC_CURVE que usa un valor de ID de etiqueta de 10.

Es el conjunto de parámetros empleados para generar un par de claves de curva elíptica (CE), que usa ECDSA para la firma y verificación, en el almacén de claves del sistema Android.

rsaPublicExponent
Corresponde a la etiqueta de autorización Tag::RSA_PUBLIC_EXPONENT de Keymaster que usa un valor de ID de etiqueta de 200.
mgfDigest

Solo está presente en la versión de certificación de claves >= 100.

Corresponde a la etiqueta de autorización Tag::RSA_OAEP_MGF_DIGEST de KeyMint que usa un valor de ID de etiqueta de 203.
rollbackResistance

Solo está presente en la versión de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::ROLLBACK_RESISTANCE que usa un valor de ID de etiqueta de 303.

earlyBootOnly

Solo está presente en la versión de certificación de claves >= 4.

Corresponde a la etiqueta de autorización Tag::EARLY_BOOT_ONLY que usa un valor de ID de etiqueta de 305.

activeDateTime
Corresponde a la etiqueta de autorización Tag::ACTIVE_DATETIME que usa un valor de ID de etiqueta de 400.
originationExpireDateTime
Corresponde a la etiqueta de autorización Tag::ORIGINATION_EXPIRE_DATETIME de Keymaster que usa un valor de ID de etiqueta de 401.
usageExpireDateTime
Corresponde a la etiqueta de autorización Tag::USAGE_EXPIRE_DATETIME que usa un valor de ID de etiqueta de 402.
usageCountLimit
Corresponde a la etiqueta de autorización Tag::USAGE_COUNT_LIMIT que usa un valor de ID de etiqueta de 405.
noAuthRequired

Corresponde a la etiqueta de autorización Tag::NO_AUTH_REQUIRED de Keymaster que usa un valor de ID de etiqueta de 503.

userAuthType
Corresponde a la etiqueta de autorización Tag::USER_AUTH_TYPE que usa un valor de ID de etiqueta de 504.
authTimeout
Corresponde a la etiqueta de autorización Tag::AUTH_TIMEOUT que usa un valor de ID de etiqueta de 505.
allowWhileOnBody

Corresponde a la etiqueta de autorización Tag::ALLOW_WHILE_ON_BODY que usa un valor de ID de etiqueta de 506.

Permite usar la clave después de su período de espera para la autenticación si el usuario todavía lleva el dispositivo consigo. Recuerda que un sensor corporal seguro determina si el dispositivo está en contacto con el cuerpo del usuario.

trustedUserPresenceRequired

Solo está presente en la versión de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::TRUSTED_USER_PRESENCE_REQUIRED que usa un valor de ID de etiqueta de 507.

Especifica que esta clave solo se puede usar si el usuario proporcionó una prueba de presencia física. Entre los ejemplos, se incluyen los siguientes:

  • Para una clave StrongBox, es un botón de hardware conectado con un pin en el dispositivo StrongBox.
  • Para una clave de TEE, la autenticación de huella digital proporciona una prueba de presencia siempre y cuando el TEE tenga control exclusivo del escáner y realice el proceso de coincidencia de huella digital.
trustedConfirmationRequired

Solo está presente en la versión de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::TRUSTED_CONFIRMATION_REQUIRED que usa un valor de ID de etiqueta de 508.

Especifica que la clave solo se puede usar si el usuario proporciona confirmación de que los datos se firmarán con un token de aprobación. Para obtener más información acerca de cómo obtener confirmación del usuario, consulta Confirmación de protección de Android.

Nota: Esta etiqueta solo se aplica a claves que usan el propósito SIGN.

unlockedDeviceRequired

Solo está presente en la versión de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::UNLOCKED_DEVICE_REQUIRED que usa un valor de ID de etiqueta de 509.

allApplications

Corresponde a la etiqueta de autorización Tag::ALL_APPLICATIONS que usa un valor de ID de etiqueta de 600.

Indica si todas las apps de un dispositivo pueden acceder al par de claves.

applicationId
Corresponde a la etiqueta de autorización Tag::APPLICATION_ID que usa un valor de ID de etiqueta de 601.
creationDateTime
Corresponde a la etiqueta de autorización Tag::CREATION_DATETIME que usa un valor de ID de etiqueta de 701.
origin

Corresponde a la etiqueta de autorización Tag::ORIGIN que usa un valor de ID de etiqueta de 702.

rollbackResistant

Solo está presente en las versiones de certificación 1 y 2.

Corresponde a la etiqueta de autorización Tag::ROLLBACK_RESISTANT que usa un valor de ID de etiqueta de 703.

rootOfTrust

Corresponde a la etiqueta de autorización Tag::ROOT_OF_TRUST que usa un valor de ID de etiqueta de 704.

Para obtener más información, consulta la sección en la que se describe la estructura de datos de RootOfTrust.

osVersion

Corresponde a la etiqueta de autorización Tag::OS_VERSION que usa un valor de ID de etiqueta de 705.

Es la versión del sistema operativo Android asociada con Keymaster, especificada como un número entero de seis dígitos. Por ejemplo, la versión 8.1.0 se representa como 080100.

Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.

osPatchLevel

Corresponde a la etiqueta de autorización Tag::PATCHLEVEL que usa un valor de ID de etiqueta de 706.

El mes y el año asociados con el parche de seguridad que se usa en Keymaster, especificados como un número entero de seis dígitos. Por ejemplo, el parche de agosto de 2018 se representa como 201808.

Solo en la versión 1.0 o las versiones posteriores de Keymaster se incluye este valor en la lista de autorizaciones.

attestationApplicationId

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_APPLICATION_ID de Keymaster que usa un valor de ID de etiqueta de 709.

Para obtener más información, consulta la sección en la que se describe la estructura de datos de AttestationApplicationId.

attestationIdBrand

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta Tag::ATTESTATION_ID_BRAND de Keymaster que usa un valor de ID de etiqueta de 710.

attestationIdDevice

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta Tag::ATTESTATION_ID_DEVICE de Keymaster que usa un valor de ID de etiqueta de 711.

attestationIdProduct

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta Tag::ATTESTATION_ID_PRODUCT de Keymaster que usa un valor de ID de etiqueta de 712.

attestationIdSerial

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta Tag::ATTESTATION_ID_SERIAL de Keymaster, que usa un valor de ID de etiqueta de 713.

attestationIdImei

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_IMEI que usa un valor de ID de etiqueta de 714.

attestationIdMeid

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_MEID que usa un valor de ID de etiqueta de 715.

attestationIdManufacturer

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_MANUFACTURER que usa un valor de ID de etiqueta de 716.

attestationIdModel

Solo está presente en versiones de certificación >= 2.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_MODEL que usa un valor de ID de etiqueta de 717.

vendorPatchLevel

Solo está presente en versiones de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::VENDOR_PATCHLEVEL que usa un valor de ID de etiqueta de 718.

Especifica el nivel de parche de seguridad de la imagen del proveedor que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del proveedor. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 1 de agosto de 2018 del proveedor instalado, este valor sería 20180801.

bootPatchLevel

Solo está presente en versiones de certificación >= 3.

Corresponde a la etiqueta de autorización Tag::BOOT_PATCHLEVEL que usa un valor de ID de etiqueta de 719.

Especifica el nivel de parche de seguridad de la imagen del kernel que debe instalarse en el dispositivo para que se use esta clave. El valor aparece en el formato AAAAMMDD, que representa la fecha del parche de seguridad del sistema. Por ejemplo, si una clave se hubiera generado en un dispositivo Android con el parche de seguridad del 5 de agosto de 2018 del sistema instalado, este valor sería 20180805.

deviceUniqueAttestation

Solo está presente en versiones de certificación de claves >= 4.

Corresponde a la etiqueta de autorización Tag::DEVICE_UNIQUE_ATTESTATION que usa un valor de ID de etiqueta de 720.

attestationIdSecondImei

Solo está presente en versiones de certificación de claves >= 300.

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_SECOND_IMEI que usa un valor de ID de etiqueta de 723.

Campos RootOfTrust

verifiedBootKey
Es un hash seguro de la clave pública que se usa para verificar la integridad y la autenticidad de todo el código que se ejecuta durante el inicio del dispositivo como parte del inicio verificado. Se recomienda SHA-256.
deviceLocked
Indica si el bootloader del dispositivo está bloqueado. true significa que el dispositivo inició una imagen firmada que Verified Boot verificó correctamente.
verifiedBootState
El estado de inicio verificado del dispositivo.
verifiedBootHash
Es un resumen de todos los datos protegidos por el inicio verificado. Para dispositivos que usan la implementación de referencia del inicio verificado de Android, este campo contiene el resumen de VBMeta.

Valores de VerifiedBootState

Valor Estado de inicio correspondiente Significado
Verified GREEN Una cadena completa de confianza se extiende desde una raíz de confianza protegida por hardware hasta el bootloader y todas las particiones verificadas por el inicio verificado. En este estado, el campo verifiedBootKey contiene el hash de la raíz de confianza integrada, que es el certificado que el fabricante del dispositivo incorpora en la ROM del dispositivo en la fábrica.
SelfSigned YELLOW Es igual que Verified, excepto que la verificación se realizó con una raíz de confianza configurada por el usuario en lugar de la raíz de confianza que el fabricante incorporó en la fábrica. En este estado, el campo verifiedBootKey contiene el hash de la clave pública que configuró el usuario.
Unverified ORANGE El bootloader del dispositivo está desbloqueado, por lo que no se puede establecer una cadena de confianza. El dispositivo se puede modificar libremente, por lo que el usuario debe verificar su integridad fuera de banda. En este estado, el campo verifiedBootKey contiene 32 bytes de ceros.
Failed RED El dispositivo no superó la verificación. En este estado, no hay garantías sobre el contenido de los otros campos RootOfTrust.

AttestationApplicationId

Este campo refleja la creencia de la plataforma de Android de que las apps pueden usar el material de clave secreta en la certificación. Puede contener varios paquetes solo si estos comparten el mismo UID. El campo AttestationApplicationId en AuthorizationList es de tipo OCTET_STRING y su formato se basa en el siguiente esquema de ASN.1:

AttestationApplicationId ::= SEQUENCE {
    package_infos  SET OF AttestationPackageInfo,
    signature_digests  SET OF OCTET_STRING,
}

AttestationPackageInfo ::= SEQUENCE {
    package_name  OCTET_STRING,
    version  INTEGER,
}
package_infos
Es un conjunto de objetos AttestationPackageInfo, cada uno de los cuales proporciona un nombre de paquete y un número de versión.
signature_digests

Un conjunto de resúmenes SHA-256 de los certificados de firma de la app. Una app puede tener varias cadenas de certificados de claves de firma. Para cada una, el certificado de "hoja" se resume y se coloca en el campo signature_digests. El nombre del campo es engañoso, ya que los datos resumidos son los certificados de firma de la app, no sus firmas, dado que recibe el nombre de la clase Signature que muestra una llamada a getPackageInfo(). El siguiente fragmento de código muestra un conjunto de ejemplo:

{SHA256(PackageInfo.signature[0]), SHA256(PackageInfo.signature[1]), ...}
    

ID único

El ID único es un valor de 128 bits que identifica al dispositivo, pero solo por un período limitado. El valor se calcula con lo siguiente:

HMAC_SHA256(T || C || R, HBK)

donde:

  • T es el "valor del contador temporal", que se calcula dividiendo el valor de Tag::CREATION_DATETIME por 2592000000 y descartando cualquier resto. T cambia cada 30 días (2592000000 = 30 × 24 × 60 × 60 × 1000).
  • C es el valor de Tag::APPLICATION_ID.
  • R es 1 si Tag::RESET_SINCE_ID_ROTATION está presente en el parámetro attest_params de la llamada a attest_key, o 0 si la etiqueta no está presente.
  • HBK es un secreto único vinculado al hardware que el entorno de ejecución confiable conoce y que nunca revela. El secreto contiene al menos 128 bits de entropía y es único para el dispositivo individual (la unicidad probabilística es aceptable teniendo en cuenta los 128 bits de entropía). La HBK debe derivarse del material de clave fusionado a través de HMAC o AES_CMAC.

Truncar la salida de HMAC_SHA256 a 128 bits

Claves y certificados de certificación

Dos claves, una RSA y una ECDSA, y las cadenas de certificados correspondientes, se aprovisionan de forma segura en el dispositivo.

Android 12 presenta el aprovisionamiento de claves remotas, y Android 13 requiere que los dispositivos lo implementen. El aprovisionamiento de claves remoto proporciona a los dispositivos en el campo certificados de certificación ECDSA P256 por app. Estos certificados tienen una vida útil más corta que los certificados aprovisionados de fábrica.

Varios IMEI

En Android 14, se agrega compatibilidad para varios IMEI en el registro de la Certificación de claves de Android. Los OEMs pueden implementar esta función agregando una etiqueta KeyMint para un segundo IMEI. Cada vez es más frecuente que los dispositivos tengan varias radios celulares, y los OEM ahora pueden admitir dispositivos con dos IMEI.

Los OEMs deben tener un IMEI secundario, si está presente en sus dispositivos, que se aprovisione a las implementaciones de KeyMint para que esas implementaciones puedan certificarlo de la misma manera que certifican el primer IMEI.

Certificación de ID

Android 8.0 incluye compatibilidad opcional con la certificación de ID para dispositivos con Keymaster 3. La certificación de ID permite que el dispositivo proporcione pruebas de sus identificadores de hardware, como el número de serie o la IMEI. Aunque es una función opcional, se recomienda que todas las implementaciones de Keymaster 3 brinden compatibilidad con ella, ya que poder demostrar la identidad del dispositivo permite que los casos de uso como la verdadera configuración remota de inscripción automática sean más seguros (porque el lado remoto puede estar seguro de que está hablando con el dispositivo correcto, no un dispositivo que falsifica su identidad).

La certificación de ID funciona creando copias de los identificadores de hardware del dispositivo a los que solo puede acceder el entorno de ejecución confiable (TEE) antes de que el dispositivo salga de fábrica. Un usuario puede desbloquear el bootloader del dispositivo y cambiar el software del sistema y los identificadores que informan los frameworks de Android. Las copias de los identificadores que contiene el TEE no se pueden manipular de esta manera, lo que garantiza que la certificación del ID del dispositivo solo certifique los identificadores de hardware originales del dispositivo, lo que frustra los intentos de falsificación.

La plataforma de API principal para la certificación de ID se basa en el mecanismo de certificación de claves existente que se introdujo con Keymaster 2. Cuando se solicita un certificado de certificación para una clave que tiene el administrador de claves, el llamador puede solicitar que se incluyan los identificadores de hardware del dispositivo en los metadatos del certificado de certificación. Si la clave se encuentra en el TEE, el certificado se vincula a una raíz de confianza conocida. El destinatario de un certificado de este tipo puede verificar que el TEE haya escrito el certificado y su contenido, incluidos los identificadores de hardware. Cuando se le solicita que incluya identificadores de hardware en la certificación, el TEE solo certifica los identificadores que se conservan en su almacenamiento, según se propagan en la fábrica.

Propiedades de almacenamiento

El almacenamiento que contiene los identificadores del dispositivo debe tener las siguientes propiedades:

  • Los valores derivados de los identificadores originales del dispositivo se copian en el almacenamiento antes de que el dispositivo salga de fábrica.
  • El método destroyAttestationIds() puede destruir de forma permanente esta copia de los datos derivados del identificador. La destrucción permanente significa que los datos se quitan por completo, de modo que ni un restablecimiento de la configuración de fábrica ni ningún otro procedimiento realizado en el dispositivo puede restablecerlos. Esto es especialmente importante para los dispositivos en los que un usuario desbloqueó el bootloader, cambió el software del sistema y modificó los identificadores que devuelven los frameworks de Android.
  • Las instalaciones de ADP deben poder generar copias nuevas de los datos derivados del identificador de hardware. De esta manera, un dispositivo que pasa por la ADP puede volver a realizar la certificación de ID. El mecanismo que usan las instalaciones de ADP debe estar protegido para que los usuarios no puedan invocarlo por su cuenta, ya que eso les permitiría obtener certificaciones de IDs falsificados.
  • Ningún código que no sea la app de confianza de Keymaster en el TEE puede leer los datos derivados del identificador que se mantienen en el almacenamiento.
  • El almacenamiento es inviolable: si se modifica el contenido del almacenamiento, el TEE lo trata de la misma manera que si se hubieran destruido las copias del contenido y rechaza todos los intentos de certificación de ID. Para ello, se firma o se aplica un MAC al almacenamiento como se describe a continuación.
  • El almacenamiento no contiene los identificadores originales. Debido a que la certificación de ID implica un desafío, el llamador siempre proporciona los identificadores que se certificarán. El TEE solo necesita verificar que coincidan con los valores que tenían originalmente. Esta verificación se habilita cuando se almacenan hashes seguros de los valores originales en lugar de los valores.

Construcción

Para crear una implementación que tenga las propiedades mencionadas anteriormente, almacena los valores derivados del ID en la siguiente construcción S. No almacenes otras copias de los valores de ID, excepto los lugares normales del sistema, que el propietario del dispositivo puede modificar mediante el acceso raíz:

S = D || HMAC(HBK, D)

donde:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC es la construcción de HMAC con un hash seguro adecuado (se recomienda SHA-256).
  • HBK es una clave vinculada al hardware que no se usa para ningún otro propósito
  • ID1...IDn son los valores de ID originales; la asociación de un valor específico con un índice en particular depende de la implementación, ya que los diferentes dispositivos tienen distintas cantidades de identificadores.
  • || representa la concatenación.

Debido a que las salidas HMAC son de tamaño fijo, no se requieren encabezados ni otra estructura para poder encontrar hashes de ID individuales o el HMAC de D. Además de verificar los valores proporcionados para realizar la certificación, las implementaciones deben validar S extrayendo D de S, calculando HMAC(HBK, D) y comparándola con el valor en S para verificar que no se hayan modificado ni dañado los IDs individuales. Además, las implementaciones deben usar comparaciones de tiempo constante para todos los elementos de ID individuales y la validación de S. El tiempo de comparación debe ser constante, independientemente de la cantidad de IDs proporcionados y de la coincidencia correcta de cualquier parte de la prueba.

Identificadores de hardware

La certificación de ID admite los siguientes identificadores de hardware:

  1. Nombre de la marca, como lo muestra Build.BRAND en Android
  2. Nombre del dispositivo, como lo muestra Build.DEVICE en Android
  3. Nombre del producto, tal como lo muestra Build.PRODUCT en Android
  4. Nombre del fabricante, como lo muestra Build.MANUFACTURER en Android
  5. Es el nombre del modelo, como lo muestra Build.MODEL en Android.
  6. Número de serie
  7. IMEIs de todas las radios
  8. MEID de todas las radios

Para admitir la certificación de ID de dispositivo, un dispositivo certifica estos identificadores. Todos los dispositivos que ejecutan Android tienen los primeros seis, y son necesarios para que esta función funcione. Si el dispositivo tiene radios celulares integradas, también debe admitir la certificación de los IMEI o MEID de las radios.

Para solicitar la certificación de ID, se realiza una certificación de claves y se incluyen los identificadores del dispositivo para certificarlos en la solicitud. Los identificadores se etiquetan de la siguiente manera:

  • ATTESTATION_ID_BRAND
  • ATTESTATION_ID_DEVICE
  • ATTESTATION_ID_PRODUCT
  • ATTESTATION_ID_MANUFACTURER
  • ATTESTATION_ID_MODEL
  • ATTESTATION_ID_SERIAL
  • ATTESTATION_ID_IMEI
  • ATTESTATION_ID_MEID

El identificador que se debe certificar es una cadena de bytes con codificación UTF-8. Este formato también se aplica a los identificadores numéricos. Cada identificador que se certifica se expresa como una string codificada en UTF-8.

Si el dispositivo no admite la certificación de ID (o si se llamó a destroyAttestationIds() anteriormente y el dispositivo ya no puede certificar sus IDs), cualquier solicitud de certificación de claves que incluya una o más de estas etiquetas fallará con ErrorCode::CANNOT_ATTEST_IDS.

Si el dispositivo admite la certificación de ID y se incluyeron una o más de las etiquetas anteriores en una solicitud de certificación de claves, el TEE verifica que el identificador proporcionado con cada una de las etiquetas coincida con su copia de los identificadores de hardware. Si uno o más identificadores no coinciden, toda la certificación falla con ErrorCode::CANNOT_ATTEST_IDS. Es válido que se proporcione la misma etiqueta varias veces. Esto puede ser útil, por ejemplo, para certificar IMEI: un dispositivo puede tener varias radios con varios IMEI. Una solicitud de certificación es válida si el valor proporcionado con cada ATTESTATION_ID_IMEI coincide con una de las radios del dispositivo. Lo mismo se aplica a todas las demás etiquetas.

Si la certificación es correcta, los IDs certificados se agregan a la extensión de certificación (OID 1.3.6.1.4.1.11129.2.1.17) del certificado emitido mediante el esquema anterior. Los cambios del esquema de certificación de Keymaster 2 están en negrita, con comentarios.

API de Java

Esta sección es solo informativa. Los implementadores de Keymaster no implementan ni usan la API de Java. Esto se proporciona para ayudar a los implementadores a comprender cómo las apps usan la función. Los componentes del sistema pueden usarlo de manera diferente, por lo que es fundamental que esta sección no se trate como normativa.