Certificación de claves y IDs

Keystore proporciona un lugar más seguro para crear, almacenar y usar claves criptográficas de forma 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 KeyMint (anteriormente Keymaster) aplica restricciones que son difíciles de eludir.

Sin embargo, esto solo es cierto si se sabe que las claves del almacén de claves se encuentran en un almacenamiento respaldado por hardware. En Keymaster 1, no había forma de que las apps o los servidores remotos verificaran de manera confiable si este era el caso. El daemon del almacén de claves cargó la capa de abstracción de hardware (HAL) de Keymaster disponible y creyó todo lo que dijo la HAL con respecto al respaldo de hardware de las claves.

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

La certificación de claves tiene como objetivo proporcionar una forma de determinar con certeza si un par de claves asimétricas está respaldado por 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 pruebas 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 Keymaster.
  • keyToAttest es el BLOB de clave que se devolvió desde generateKey para el que se creó la certificación.
  • attestParams es una lista de todos los parámetros necesarios para la atestación. Esto incluye Tag::ATTESTATION_CHALLENGE y, posiblemente, Tag::RESET_SINCE_ID_ROTATION, así como Tag::APPLICATION_ID y Tag::APPLICATION_DATA. Los últimos dos son necesarios para desencriptar el BLOB de clave si se especificaron durante la generación de la clave.
  • certChain es el parámetro de salida, que devuelve 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 autenticación del usuario para su uso, se puede generar una certificación sin 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. Es posible que la clave de certificación use 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 fijo. Las pruebas del 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 usó para firmar la clave:
ECDSA para claves EC y RSA para claves RSA.
signatureValue BIT STRING, firma calculada en tbsCertificate codificado en DER de ASN.1.

SEQUENCE de TBSCertificate

Nombre del campo (consulta RFC 5280) Valor
version INTEGER 2 (significa certificado de v3)
serialNumber INTEGER 1 (valor fijo: igual en todos los certificados)
signature Es el AlgorithmIdentifier del algoritmo que se usó para firmar la clave: ECDSA para las claves de EC y RSA para las claves de RSA.
issuer Es igual que el campo de asunto de la clave de certificación por lotes.
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 obtener representaciones de fecha correctas en los certificados.
Si Tag::ACTIVE_DATETIME no está presente, usa el valor de Tag::CREATION_DATETIME. Si no está presente Tag::USAGE_EXPIRE_DATETIME, usa la fecha de vencimiento del certificado de clave de certificación por lotes.
subject CN = "Android Keystore Key" (valor fijo: igual en todos los certificados)
subjectPublicKeyInfo Es un 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 están configurados.
extensions/CRL Distribution Points Valor por definir
extensions/"attestation" El OID es 1.3.6.1.4.1.11129.2.1.17, y el contenido se define en la sección Extensión de certificación a continuación. Al igual que con todas las extensiones de certificados X.509, el contenido se representa como un OCTET_STRING que contiene una codificación DER de la secuencia 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 la clave.

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

Tipo de KeyMint o Keymaster 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 su ausencia, falso.
BIGNUM Ninguna etiqueta tiene este tipo, por lo que no se define ninguna asignación.
BYTES OCTET_STRING

Esquema

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

Versión 400

KeyDescription ::= SEQUENCE {
    attestationVersion  400,
    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,
    moduleHash  [724] 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 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 de KeyDescription

attestationVersion
Es la versión del esquema de ASN.1.
ValorVersión de KeyMint o Keymaster
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
400KeyMint versión 4.0
attestationSecurityLevel

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

keymasterVersion/keyMintVersion
Versión de la implementación de la HAL de KeyMint o Keymaster.
ValorVersión de KeyMint o Keymaster
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
400KeyMint versión 4.0
keymasterSecurityLevel/keyMintSecurityLevel
Es el nivel de seguridad de la implementación de KeyMint o Keymaster.
attestationChallenge
Es el desafío que se proporcionó en el momento de la generación de la clave.
uniqueId
Es un identificador del dispositivo que respeta la privacidad y 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 KeyMint o Keymaster que aplica el sistema Android. Esta información se recopila o genera mediante código en la plataforma. Se puede confiar en él siempre que el dispositivo ejecute un sistema operativo que cumpla con el modelo de seguridad de la plataforma de Android (es decir, que el bootloader del dispositivo esté bloqueado y que verifiedBootState sea Verified).
hardwareEnforced
Es la lista de autorización de KeyMint o Keymaster que aplica el entorno de ejecución confiable (TEE) o StrongBox del dispositivo. Esta información se recopila o genera mediante 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 de SecurityLevel

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

Valor Significado
Software Seguro, 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 el verifiedBootState sea Verified).
TrustedEnvironment Es seguro siempre y cuando el TEE no se vea comprometido. 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 peligros por ataques directos de hardware.
StrongBox Es seguro siempre y cuando no se comprometa StrongBox. 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 la vulneración remota y a la vulneración por ataque directo de hardware (por ejemplo, manipulación física 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 AIDL. La especificación es la fuente de verdad sobre las etiquetas de autorización: su significado, el formato de su contenido, si se espera que aparezcan en los campos softwareEnforced o hardwareEnforced del objeto KeyDescription, si son mutuamente exclusivas con otras etiquetas, etcétera. Todos los campos AuthorizationList son opcionales.

Cada campo tiene una etiqueta EXPLICIT específica del contexto que es igual al número de etiqueta de KeyMint o Keymaster, lo que permite una representación más compacta de los datos en AuthorizationList. Por lo tanto, el analizador de 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 INTEGER de ASN.1, que es 10.

Los siguientes campos están presentes en las certificaciones generadas por KeyMint 4:
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.
blockMode
Corresponde a la etiqueta de autorización Tag::BLOCK_MODE que usa un valor de ID de etiqueta de 4.
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.
callerNonce
Corresponde a la etiqueta de autorización Tag::CALLER_NONCE que usa un valor de ID de etiqueta de 7.
minMacLength
Corresponde a la etiqueta de autorización Tag::MIN_MAC_LENGTH que usa un valor de ID de etiqueta de 8.
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 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 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.
userSecureId
Corresponde a la etiqueta de autorización Tag::USER_SECURE_ID que usa un valor de ID de etiqueta de 502.
noAuthRequired

Corresponde a la etiqueta de autorización Tag::NO_AUTH_REQUIRED 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.

trustedUserPresenceReq

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.
trustedConfirmationReq

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.

unlockedDeviceReq

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.

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.

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 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 de autorización Tag::ATTESTATION_ID_BRAND que usa un valor de ID de etiqueta de 710.

attestationIdDevice

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

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

attestationIdProduct

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

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

attestationIdSerial

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

Corresponde a la etiqueta de autorización Tag::ATTESTATION_ID_SERIAL 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.

moduleHash

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

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

Campos de RootOfTrust

verifiedBootKey
Es un hash seguro de la clave pública que se usa para verificar la integridad y autenticidad de todo el código que se ejecuta durante el inicio del dispositivo como parte del arranque verificado. Se recomienda SHA-256.
deviceLocked
Indica si el bootloader del dispositivo está bloqueado. true significa que el dispositivo inició una imagen firmada que Inicio verificado verificó correctamente.
verifiedBootState
Estado de inicio verificado del dispositivo.
verifiedBootHash
Es un resumen de todos los datos protegidos por el inicio verificado. Para los 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 integrado en la ROM del dispositivo por el fabricante 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 integrada por el fabricante en la fábrica. En este estado, el campo verifiedBootKey contiene el hash de la clave pública configurada por 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 se formatea según 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]), ...}
    

Extensión de información de aprovisionamiento

La extensión de información de aprovisionamiento tiene OID 1.3.6.1.4.1.11129.2.1.30. La extensión proporciona información que el servidor de aprovisionamiento conoce sobre el dispositivo.

Esquema

La extensión sigue el siguiente esquema del CDDL:

  {
        1 : int,       ; certificates issued
        4 : string,    ; validated attested entity (STRONG_BOX/TEE)
  }

El mapa no tiene versiones y se pueden agregar nuevos campos opcionales.

certs_issued

Cantidad aproximada de certificados emitidos al dispositivo en los últimos 30 días. Este valor se puede usar como una señal de posible abuso si el valor es mayor que el promedio en algunos órdenes de magnitud.

validated_attested_entity

La entidad atestiguada validada es una cadena que describe el tipo de dispositivo que el servidor de aprovisionamiento confirmó que se atestiguó. Por ejemplo, STRONG_BOX o TEE.

Claves de certificación

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

Android 12 introduce el aprovisionamiento de llaves remoto, y Android 13 requiere que los dispositivos lo implementen. El aprovisionamiento remoto de claves 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.

ID único

El ID único es un valor de 128 bits que identifica el dispositivo, pero solo por un período de tiempo limitado. El valor se calcula con la siguiente fórmula:

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

En la que:

  • 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 conoce el entorno de ejecución confiable y que este nunca revela. El secreto contiene al menos 128 bits de entropía y es único para cada dispositivo (se acepta la unicidad probabilística, ya que hay 128 bits de entropía). La HBK se debe derivar del material de clave fusionado a través de HMAC o AES_CMAC.

Trunca la salida de HMAC_SHA256 a 128 bits.

Varios IMEI

Android 14 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, y los OEM ahora pueden admitir dispositivos con dos IMEI.

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

Constancia 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 el IMEI. Si bien es una función opcional, se recomienda que todas las implementaciones de Keymaster 3 la admitan, ya que poder demostrar la identidad del dispositivo permite que los casos de uso, como la verdadera configuración remota sin intervención, sean más seguros (porque el extremo remoto puede tener la certeza de que se está comunicando con el dispositivo correcto, no con uno que suplanta su identidad).

La certificación de ID funciona creando copias de los identificadores de hardware del dispositivo a las que solo el TEE puede acceder antes de que el dispositivo salga de la 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 mantiene 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 y, de este modo, frustre los intentos de falsificación.

La superficie principal de la API 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 mantiene Keymaster, el llamador puede solicitar que los identificadores de hardware del dispositivo se incluyan en los metadatos del certificado de certificación. Si la clave se mantiene en el TEE, el certificado se encadena a una raíz de confianza conocida. El destinatario de este certificado puede verificar que el certificado y su contenido, incluidos los identificadores de hardware, fueron escritos por el TEE. Cuando se le solicita que incluya identificadores de hardware en el certificado de certificación, el TEE solo certifica los identificadores que se encuentran en su almacenamiento, tal como se completaron 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 la 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 que se realice en el dispositivo puede restablecerlos. Esto es especialmente importante para los dispositivos en los que un usuario desbloqueó el cargador de arranque, cambió el software del sistema y modificó los identificadores que devuelven los frameworks de Android.
  • Las instalaciones de RMA deben poder generar copias nuevas de los datos derivados del identificador de hardware. De esta manera, un dispositivo que pasa por una 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 sí mismos, ya que eso les permitiría obtener certificaciones de IDs falsificados.
  • Ningún otro código que no sea el de la app de confianza de Keymaster en el TEE puede leer los datos derivados del identificador que se conservan en el almacenamiento.
  • El almacenamiento es a prueba de manipulaciones: Si se modificó el contenido del almacenamiento, el TEE lo trata como si se hubieran destruido las copias del contenido y rechaza todos los intentos de certificación de ID. Esto se implementa firmando o MACeando el almacenamiento como se describe a continuación.
  • El almacenamiento no contiene los identificadores originales. Dado 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ía originalmente. El almacenamiento de hashes seguros de los valores originales en lugar de los valores permite esta verificación.

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 en los lugares normales del sistema, que el propietario del dispositivo puede modificar con acceso de administrador:

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 particular a un índice particular depende de la implementación, ya que diferentes dispositivos tienen diferentes cantidades de identificadores.
  • || representa la concatenación

Dado que los resultados de HMAC tienen un tamaño fijo, no se requieren encabezados ni otra estructura para poder encontrar los 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ándolo con el valor en S para verificar que no se modificaron ni dañaron 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 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 devuelve Build.BRAND en Android
  2. Nombre del dispositivo, como lo devuelve Build.DEVICE en Android
  3. Nombre del producto, tal como lo devuelve Build.PRODUCT en Android
  4. Nombre del fabricante, tal como lo devuelve Build.MANUFACTURER en Android
  5. Nombre del modelo, como lo devuelve Build.MODEL en Android
  6. Número de serie
  7. IMEIs de todas las radios
  8. MEIDs de todas las radios

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

La certificación de ID se solicita realizando una certificación de clave y, luego, incluyendo los identificadores del dispositivo que se certificarán 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 codificada en UTF-8. Este formato también se aplica a los identificadores numéricos. Cada identificador que se debe certificar se expresa como una cadena 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 incluyó una o más de las etiquetas anteriores en una solicitud de certificación de clave, 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 la misma etiqueta se proporcione varias veces. Esto puede ser útil, por ejemplo, cuando se certifican los 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 se realiza correctamente, 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 de certificación emitido, con el esquema anterior. Los cambios del esquema de certificación de Keymaster 2 se muestran 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 usan las apps la función. Los componentes del sistema pueden usarlo de manera diferente, por lo que es fundamental que esta sección no se considere normativa.