Attestazione di chiavi e ID

Keystore offre un luogo più sicuro per creare, archiviare e utilizzare le chiavi crittografiche in modo controllato. Quando è disponibile e utilizzato l'archivio chiavi supportato dall'hardware, il materiale della chiave è più sicuro contro l'estrazione dal dispositivo e KeyMint (in precedenza Keymaster) applica restrizioni difficili da aggirare.

Tuttavia, questo è vero solo se le chiavi del keystore sono note per essere in spazio di archiviazione supportato dall'hardware. In Keymaster 1, non era possibile per le app o i server remoti verificare in modo affidabile se questo era il caso. Il daemon del keystore ha caricato l'Hardware Abstraction Layer (HAL) di Keymaster disponibile e ha creduto a tutto ciò che diceva l'HAL in merito al supporto hardware delle chiavi.

Per risolvere questo problema, in Android 7.0 (Keymaster 2) è stata introdotta l'attestazione della chiave e in Android 8.0 (Keymaster 3) è stata introdotta l'attestazione dell'ID.

L'attestazione della chiave ha lo scopo di fornire un modo per determinare con certezza se una coppia di chiavi asimmetriche è supportata dall'hardware, quali sono le proprietà della chiave e quali vincoli vengono applicati al suo utilizzo.

L'attestazione dell'ID consente al dispositivo di fornire la prova dei suoi identificatori hardware, come il numero di serie o l'IMEI.

Attestazione chiave

Per supportare l'attestazione della chiave, Android 7.0 ha introdotto un insieme di tag, tipi e metodi per l'HAL.

Tag

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

Tipo

Keymaster 2 e versioni precedenti

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

Metodo AttestKey

Keymaster 3

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

Keymaster 2 e versioni precedenti

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 è la struttura del dispositivo Keymaster.
  • keyToAttest è il blob della chiave restituito da generateKey per il quale viene creata l'attestazione.
  • attestParams è un elenco di tutti i parametri necessari per l'attestazione. Sono inclusi Tag::ATTESTATION_CHALLENGE e forse Tag::RESET_SINCE_ID_ROTATION, nonché Tag::APPLICATION_ID e Tag::APPLICATION_DATA. Gli ultimi due sono necessari per decriptare il blob della chiave se sono stati specificati durante la generazione della chiave.
  • certChain è il parametro di output, che restituisce un array di certificati. La voce 0 è il certificato di attestazione, il che significa che certifica la chiave di keyToAttest e contiene l'estensione di attestazione.

Il metodo attestKey è considerato un'operazione con chiave pubblica sulla chiave attestata, perché può essere chiamato in qualsiasi momento e non deve soddisfare vincoli di autorizzazione. Ad esempio, se la chiave attestata richiede l'autenticazione dell'utente per l'utilizzo, è possibile generare un'attestazione senza l'autenticazione dell'utente.

Certificato di attestazione

Il certificato di attestazione è un certificato X.509 standard, con un'estensione di attestazione facoltativa che contiene una descrizione della chiave attestata. Il certificato è firmato con una chiave di attestazione certificata. La chiave di attestazione potrebbe utilizzare un algoritmo diverso da quello della chiave da attestare.

Il certificato di attestazione contiene i campi riportati nella tabella seguente e non può contenere campi aggiuntivi. Alcuni campi specificano un valore fisso. I test CTS verificano che i contenuti del certificato siano esattamente quelli definiti.

SEQUENCE del certificato

Nome campo (vedi RFC 5280) Valore
tbsCertificate TBSCertificate SEQUENCE
signatureAlgorithm AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave:
ECDSA per le chiavi EC, RSA per le chiavi RSA.
signatureValue BIT STRING, firma calcolata su tbsCertificate con codifica ASN.1 DER.

TBSCertificate SEQUENCE

Nome campo (vedi RFC 5280) Valore
version INTEGER 2 (indica il certificato v3)
serialNumber INTEGER 1 (valore fisso: lo stesso per tutte le certificazioni)
signature AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave: ECDSA per le chiavi EC, RSA per le chiavi RSA.
issuer Uguale al campo oggetto della chiave di attestazione batch.
validity SEQUENZA di due date, contenente i valori di Tag::ACTIVE_DATETIME e Tag::USAGE_EXPIRE_DATETIME. Questi valori sono espressi in millisecondi a partire dal 1° gennaio 1970. Consulta RFC 5280 per le rappresentazioni corrette delle date nei certificati.
Se Tag::ACTIVE_DATETIME non è presente, utilizza il valore di Tag::CREATION_DATETIME. Se Tag::USAGE_EXPIRE_DATETIME non è presente, utilizza la data di scadenza del certificato della chiave di attestazione batch.
subject CN = "Android Keystore Key" (valore fisso: lo stesso su tutti i certificati)
subjectPublicKeyInfo SubjectPublicKeyInfo contenente la chiave pubblica attestata.
extensions/Key Usage digitalSignature: impostare se la chiave ha lo scopo KeyPurpose::SIGN o KeyPurpose::VERIFY. Tutti gli altri bit non impostati.
extensions/CRL Distribution Points Valore TBD
extensions/"attestation" L'OID è 1.3.6.1.4.1.11129.2.1.17; il contenuto è definito nella sezione Estensione Attestazione di seguito. Come per tutte le estensioni dei certificati X.509, il contenuto è rappresentato come OCTET_STRING contenente una codifica DER della sequenza di attestazione.

Estensione dell'attestazione

L'estensione attestation ha l'OID 1.3.6.1.4.1.11129.2.1.17. Contiene informazioni sulla coppia di chiavi sottoposta ad attestazione e sullo stato del dispositivo al momento della generazione delle chiavi.

I tipi di tag Keymaster/KeyMint definiti nella specifica dell'interfaccia AIDL vengono convertiti in tipi ASN.1 nel seguente modo:

Tipo KeyMint o Keymaster Tipo ASN.1 Note
ENUM INTEGER
ENUM_REP SET of INTEGER
UINT INTEGER
UINT_REP SET of INTEGER
ULONG INTEGER
ULONG_REP SET of INTEGER
DATE INTEGER Millisecondi a partire dal 1° gennaio 1970 00:00:00 GMT.
BOOL NULL La presenza del tag significa true, l'assenza significa false.
BIGNUM Nessun tag ha questo tipo, quindi non è definita alcuna mappatura.
BYTES OCTET_STRING

Schema

I contenuti dell'estensione di attestazione sono descritti dal seguente schema ASN.1:

Versione 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),
}

Versione 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),
}

Versione 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),
}

Versione 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),
}

Versione 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),
}

Versione 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),
}

Versione 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),
}

Versione 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),
}

Campi KeyDescription

attestationVersion
La versione dello schema ASN.1.
ValoreVersione KeyMint o Keymaster
1Keymaster versione 2.0
2Versione Keymaster 3.0
3Versione Keymaster 4.0
4Versione Keymaster 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
400KeyMint versione 4.0
attestationSecurityLevel

Il livello di sicurezza della posizione in cui è memorizzata la chiave attestata.

keymasterVersion/keyMintVersion
La versione dell'implementazione HAL KeyMint o Keymaster.
ValoreVersione KeyMint o Keymaster
2Keymaster versione 2.0
3Versione Keymaster 3.0
4Versione Keymaster 4.0
41Versione Keymaster 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
400KeyMint versione 4.0
keymasterSecurityLevel/keyMintSecurityLevel
Il livello di sicurezza dell'implementazione di KeyMint o Keymaster.
attestationChallenge
La sfida fornita al momento della generazione della chiave.
uniqueId
Un identificatore del dispositivo sensibile alla privacy che le app di sistema possono richiedere al momento della generazione della chiave. Se l'ID univoco non è richiesto, questo campo è vuoto. Per maggiori dettagli, consulta la sezione ID univoco.
softwareEnforced
L'elenco di autorizzazioni KeyMint o Keymaster applicato dal sistema Android. Queste informazioni vengono raccolte o generate dal codice nella piattaforma. Può essere considerato attendibile se il dispositivo esegue un sistema operativo conforme al modello di sicurezza della piattaforma Android (ovvero il bootloader del dispositivo è bloccato e il verifiedBootState è Verified).
hardwareEnforced
L'elenco di autorizzazioni KeyMint o Keymaster applicato dal Trusted Execution Environment (TEE) del dispositivo o da StrongBox. Queste informazioni vengono raccolte o generate dal codice nell'hardware sicuro e non sono controllate dalla piattaforma. Ad esempio, le informazioni possono provenire dal bootloader o tramite un canale di comunicazione sicuro che non implica l'attendibilità della piattaforma.

Valori di SecurityLevel

Il valore SecurityLevel indica la misura in cui un elemento correlato a Keystore (ad esempio coppia di chiavi e attestazione) è resiliente agli attacchi.

Valore Significato
Software Sicuro, a condizione che il sistema Android del dispositivo sia conforme al modello di sicurezza della piattaforma Android (ovvero, il bootloader del dispositivo è bloccato e il verifiedBootState è Verified).
TrustedEnvironment Sicuro finché il TEE non è compromesso. I requisiti di isolamento per i TEE sono definiti nelle sezioni da 9.11 [C-1-1] a [C-1-4] del Compatibility Definition Document di Android. Gli TEE sono altamente resistenti alla compromissione remota e moderatamente resistenti alla compromissione tramite attacco hardware diretto.
StrongBox Sicuro finché StrongBox non è compromesso. StrongBox è implementato in un elemento sicuro simile a un modulo di sicurezza hardware. I requisiti di implementazione per StrongBox sono definiti nella sezione 9.11.2 del Compatibility Definition Document di Android. StrongBox è altamente resistente alla compromissione remota e alla compromissione tramite attacco hardware diretto (ad esempio, manomissione fisica e attacchi side-channel).

Campi AuthorizationList

Ogni campo corrisponde a un tag di autorizzazione Keymaster/KeyMint della specifica dell'interfaccia AIDL. La specifica è la fonte di verità sui tag di autorizzazione: il loro significato, il formato dei loro contenuti, se devono essere visualizzati nei campi softwareEnforced o hardwareEnforced dell'oggetto KeyDescription, se sono reciprocamente esclusivi con altri tag e così via. Tutti i campi AuthorizationList sono facoltativi.

Ogni campo ha un tag specifico per il contesto EXPLICIT uguale al numero del tag KeyMint o Keymaster, che consente una rappresentazione più compatta dei dati in AuthorizationList. Il parser ASN.1 deve quindi conoscere il tipo di dati previsto per ogni tag specifico del contesto. Ad esempio, Tag::USER_AUTH_TYPE è definito come ENUM | 504. Nello schema dell'estensione di attestazione, il campo purpose in AuthorizationList è specificato come userAuthType [504] EXPLICIT INTEGER OPTIONAL. La codifica ASN.1 conterrà quindi il tag specifico per il contesto 504 anziché il tag di classe UNIVERSAL per il tipo ASN.1 INTEGER, ovvero 10.

I seguenti campi sono presenti nelle attestazioni generate da KeyMint 4:
purpose
Corrisponde al tag di autorizzazione Tag::PURPOSE, che utilizza un valore ID tag pari a 1.
algorithm

Corrisponde al tag di autorizzazione Tag::ALGORITHM, che utilizza un valore ID tag pari a 2.

In un oggetto di attestazione AuthorizationList, il valore dell'algoritmo è sempre RSA o EC.

keySize
Corrisponde al tag di autorizzazione Tag::KEY_SIZE, che utilizza un valore ID tag pari a 3.
blockMode
Corrisponde al tag di autorizzazione Tag::BLOCK_MODE, che utilizza un valore ID tag pari a 4.
digest
Corrisponde al tag di autorizzazione Tag::DIGEST, che utilizza un valore ID tag pari a 5.
padding
Corrisponde al tag di autorizzazione Tag::PADDING, che utilizza un valore ID tag pari a 6.
callerNonce
Corrisponde al tag di autorizzazione Tag::CALLER_NONCE, che utilizza un valore ID tag pari a 7.
minMacLength
Corrisponde al tag di autorizzazione Tag::MIN_MAC_LENGTH, che utilizza un valore ID tag pari a 8.
ecCurve

Corrisponde al tag di autorizzazione Tag::EC_CURVE, che utilizza un valore ID tag pari a 10.

Il set di parametri utilizzato per generare una coppia di chiavi con curva ellittica (EC), che utilizza ECDSA per la firma e la verifica, all'interno del keystore del sistema Android.

rsaPublicExponent
Corrisponde al tag di autorizzazione Tag::RSA_PUBLIC_EXPONENT, che utilizza un valore ID tag pari a 200.
mgfDigest

Presente solo nella versione dell'attestazione della chiave >= 100.

Corrisponde al tag di autorizzazione KeyMint Tag::RSA_OAEP_MGF_DIGEST, che utilizza un valore ID tag pari a 203.
rollbackResistance

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::ROLLBACK_RESISTANCE, che utilizza un valore ID tag pari a 303.

earlyBootOnly

Presente solo nella versione dell'attestazione della chiave >= 4.

Corrisponde al tag di autorizzazione Tag::EARLY_BOOT_ONLY, che utilizza un valore ID tag pari a 305.

activeDateTime
Corrisponde al tag di autorizzazione Tag::ACTIVE_DATETIME, che utilizza un valore ID tag pari a 400.
originationExpireDateTime
Corrisponde al tag di autorizzazione Tag::ORIGINATION_EXPIRE_DATETIME, che utilizza un valore ID tag pari a 401.
usageExpireDateTime
Corrisponde al tag di autorizzazione Tag::USAGE_EXPIRE_DATETIME, che utilizza un valore ID tag pari a 402.
usageCountLimit
Corrisponde al tag di autorizzazione Tag::USAGE_COUNT_LIMIT, che utilizza un valore ID tag pari a 405.
userSecureId
Corrisponde al tag di autorizzazione Tag::USER_SECURE_ID, che utilizza un valore ID tag pari a 502.
noAuthRequired

Corrisponde al tag di autorizzazione Tag::NO_AUTH_REQUIRED, che utilizza un valore ID tag pari a 503.

userAuthType
Corrisponde al tag di autorizzazione Tag::USER_AUTH_TYPE, che utilizza un valore ID tag pari a 504.
authTimeout
Corrisponde al tag di autorizzazione Tag::AUTH_TIMEOUT, che utilizza un valore ID tag pari a 505.
allowWhileOnBody

Corrisponde al tag di autorizzazione Tag::ALLOW_WHILE_ON_BODY, che utilizza un valore ID tag pari a 506.

Consente di utilizzare la chiave dopo il periodo di timeout dell'autenticazione se l'utente indossa ancora il dispositivo. Tieni presente che un sensore sicuro a contatto con il corpo determina se il dispositivo è indossato dall'utente.

trustedUserPresenceReq

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::TRUSTED_USER_PRESENCE_REQUIRED che utilizza un valore ID tag pari a 507.

Specifica che questa chiave è utilizzabile solo se l'utente ha fornito una prova di presenza fisica. Ecco alcuni esempi:

  • Per una chiave StrongBox, un pulsante hardware collegato a un pin sul dispositivo StrongBox.
  • Per una chiave TEE, l'autenticazione tramite impronta fornisce una prova di presenza a condizione che il TEE abbia il controllo esclusivo dello scanner ed esegua la procedura di corrispondenza dell'impronta.
trustedConfirmationReq

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::TRUSTED_CONFIRMATION_REQUIRED, che utilizza un valore ID tag pari a 508.

Specifica che la chiave è utilizzabile solo se l'utente fornisce la conferma dei dati da firmare utilizzando un token di approvazione. Per saperne di più su come ottenere la conferma dell'utente, consulta Android Protected Confirmation.

Nota:questo tag è applicabile solo alle chiavi che utilizzano lo scopo SIGN.

unlockedDeviceReq

Presente solo nella versione dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::UNLOCKED_DEVICE_REQUIRED, che utilizza un valore ID tag pari a 509.

creationDateTime
Corrisponde al tag di autorizzazione Tag::CREATION_DATETIME, che utilizza un valore ID tag pari a 701.
origin

Corrisponde al tag di autorizzazione Tag::ORIGIN, che utilizza un valore ID tag pari a 702.

rootOfTrust

Corrisponde al tag di autorizzazione Tag::ROOT_OF_TRUST, che utilizza un valore ID tag pari a 704.

Per maggiori dettagli, consulta la sezione che descrive la struttura dei dati RootOfTrust.

osVersion

Corrisponde al tag di autorizzazione Tag::OS_VERSION, che utilizza un valore ID tag pari a 705.

La versione del sistema operativo Android associata a Keymaster, specificata come numero intero di sei cifre. Ad esempio, la versione 8.1.0 è rappresentata come 080100.

Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.

osPatchLevel

Corrisponde al tag di autorizzazione Tag::PATCHLEVEL, che utilizza un valore ID tag pari a 706.

Il mese e l'anno associati alla patch di sicurezza in uso in Keymaster, specificati come numero intero a sei cifre. Ad esempio, la patch di agosto 2018 è rappresentata come 201808.

Solo Keymaster versione 1.0 o successive include questo valore nell'elenco di autorizzazione.

attestationApplicationId

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_APPLICATION_ID, che utilizza un valore ID tag pari a 709.

Per maggiori dettagli, consulta la sezione che descrive la struttura dei dati AttestationApplicationId.

attestationIdBrand

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_BRAND, che utilizza un valore ID tag pari a 710.

attestationIdDevice

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_DEVICE, che utilizza un valore ID tag pari a 711.

attestationIdProduct

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_PRODUCT, che utilizza un valore ID tag pari a 712.

attestationIdSerial

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_SERIAL, che utilizza un valore ID tag pari a 713.

attestationIdImei

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_IMEI, che utilizza un valore ID tag pari a 714.

attestationIdMeid

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MEID, che utilizza un valore ID tag pari a 715.

attestationIdManufacturer

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MANUFACTURER, che utilizza un valore ID tag pari a 716.

attestationIdModel

Presente solo nelle versioni dell'attestazione della chiave >= 2.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_MODEL, che utilizza un valore ID tag pari a 717.

vendorPatchLevel

Presente solo nelle versioni dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::VENDOR_PATCHLEVEL, che utilizza un valore ID tag pari a 718.

Specifica il livello patch di sicurezza dell'immagine del fornitore che deve essere installato sul dispositivo per poter utilizzare questa chiave. Il valore viene visualizzato nel formato AAAAMMGG, che rappresenta la data della patch di sicurezza del fornitore. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del fornitore installata il 1° agosto 2018, questo valore sarà 20180801.

bootPatchLevel

Presente solo nelle versioni dell'attestazione della chiave >= 3.

Corrisponde al tag di autorizzazione Tag::BOOT_PATCHLEVEL, che utilizza un valore ID tag pari a 719.

Specifica il livello patch di sicurezza dell'immagine del kernel che deve essere installato sul dispositivo per poter utilizzare questa chiave. Il valore viene visualizzato nel formato AAAAMMGG, che rappresenta la data della patch di sicurezza del sistema. Ad esempio, se una chiave è stata generata su un dispositivo Android con la patch di sicurezza del sistema del 5 agosto 2018 installata, questo valore sarà 20180805.

deviceUniqueAttestation

Presente solo nelle versioni dell'attestazione della chiave >= 4.

Corrisponde al tag di autorizzazione Tag::DEVICE_UNIQUE_ATTESTATION, che utilizza un valore ID tag pari a 720.

attestationIdSecondImei

Presente solo nelle versioni dell'attestazione della chiave >= 300.

Corrisponde al tag di autorizzazione Tag::ATTESTATION_ID_SECOND_IMEI, che utilizza un valore ID tag pari a 723.

moduleHash

Presente solo nelle versioni dell'attestazione della chiave >= 400.

Corrisponde al tag di autorizzazione Tag::MODULE_HASH, che utilizza un valore ID tag pari a 724.

Campi RootOfTrust

verifiedBootKey
Un hash sicuro della chiave pubblica utilizzata per verificare l'integrità e l'autenticità di tutto il codice eseguito durante l'avvio del dispositivo nell'ambito dell'avvio verificato. È consigliabile utilizzare SHA-256.
deviceLocked
Indica se il bootloader del dispositivo è bloccato. true significa che il dispositivo ha avviato un'immagine firmata che è stata verificata correttamente da Avvio verificato.
verifiedBootState
Lo stato di Avvio verificato del dispositivo.
verifiedBootHash
Un riepilogo di tutti i dati protetti da Avvio verificato. Per i dispositivi che utilizzano l'implementazione di riferimento di Android Verified Boot, questo campo contiene il digest VBMeta.

Valori VerifiedBootState

Valore Stato di avvio corrispondente Significato
Verified GREEN Una catena di attendibilità completa si estende da una radice di attendibilità protetta dall'hardware al bootloader e a tutte le partizioni verificate dall'Avvio verificato. In questo stato, il campo verifiedBootKey contiene l'hash della radice di attendibilità incorporata, ovvero il certificato incorporato nella ROM del dispositivo dal produttore del dispositivo in fabbrica.
SelfSigned YELLOW Uguale a Verified, tranne per il fatto che la verifica è stata eseguita utilizzando una radice di attendibilità configurata dall'utente anziché la radice di attendibilità incorporata dal produttore in fabbrica. In questo stato, il campo verifiedBootKey contiene l'hash della chiave pubblica configurata dall'utente.
Unverified ORANGE Il bootloader del dispositivo è sbloccato, quindi non è possibile stabilire una catena di attendibilità. Il dispositivo può essere modificato liberamente, pertanto l'integrità del dispositivo deve essere verificata dall'utente fuori banda. In questo stato, il campo verifiedBootKey contiene 32 byte di zeri.
Failed RED Il dispositivo non ha superato la verifica. In questo stato, non ci sono garanzie sui contenuti degli altri campi RootOfTrust.

AttestationApplicationId

Questo campo riflette la convinzione della piattaforma Android in merito alle app che possono utilizzare il materiale della chiave segreta in attestazione. Può contenere più pacchetti se e solo se più pacchetti condividono lo stesso UID. Il campo AttestationApplicationId in AuthorizationList è di tipo OCTET_STRING ed è formattato in base al seguente schema 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
Un insieme di oggetti AttestationPackageInfo, ognuno dei quali fornisce il nome e il numero di versione di un pacchetto.
signature_digests

Un insieme di hash SHA-256 dei certificati di firma dell'app. Un'app può avere più catene di certificati della chiave di firma. Per ciascuno, il certificato "foglia" viene digerito e inserito nel campo signature_digests. Il nome del campo è fuorviante, poiché i dati riepilogati sono i certificati di firma dell'app, non le firme dell'app, perché prende il nome dalla classe Signature restituita da una chiamata a getPackageInfo(). Il seguente snippet di codice mostra un insieme di esempio:

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

Estensione delle informazioni di provisioning

L'estensione delle informazioni di provisioning ha l'OID 1.3.6.1.4.1.11129.2.1.30. L'estensione fornisce informazioni note sul dispositivo dal server di provisioning.

Schema

L'estensione segue lo schema CDDL:

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

La mappa non è versionata e potrebbero essere aggiunti nuovi campi facoltativi.

certs_issued

Un numero approssimativo di certificati emessi per il dispositivo negli ultimi 30 giorni. Questo valore può essere utilizzato come indicatore di potenziali abusi se è maggiore della media di alcuni ordini di grandezza.

validated_attested_entity

L'entità attestata convalidata è una stringa che descrive il tipo di dispositivo che è stato confermato dal server di provisioning come attestato. Ad esempio, STRONG_BOX o TEE.

Chiavi di attestazione

Due chiavi, una RSA e una ECDSA, e le relative catene di certificati vengono fornite in modo sicuro al dispositivo.

Android 12 introduce il provisioning delle chiavi da remoto e Android 13 richiede che i dispositivi lo implementino. Il provisioning delle chiavi da remoto fornisce ai dispositivi sul campo certificati di attestazione ECDSA P256 per app. Questi certificati hanno una durata inferiore rispetto a quelli forniti in fabbrica.

ID univoco

L'ID univoco è un valore a 128 bit che identifica il dispositivo, ma solo per un periodo di tempo limitato. Il valore viene calcolato con:

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

Dove:

  • T è il "valore del contatore temporale", calcolato dividendo il valore di Tag::CREATION_DATETIME per 2592000000, eliminando eventuali resti. T cambia ogni 30 giorni (2592000000 = 30 * 24 * 60 * 60 * 1000).
  • C è il valore di Tag::APPLICATION_ID
  • R è 1 se Tag::RESET_SINCE_ID_ROTATION è presente nel parametro attest_params della chiamata attest_key oppure 0 se il tag non è presente.
  • HBK è un segreto univoco associato all'hardware noto al Trusted Execution Environment e mai rivelato. Il segreto contiene almeno 128 bit di entropia ed è univoco per il singolo dispositivo (l'unicità probabilistica è accettabile dati i 128 bit di entropia). La chiave HBK deve essere derivata dal materiale della chiave fuso tramite HMAC o AES_CMAC.

Tronca l'output HMAC_SHA256 a 128 bit.

Più IMEI

Android 14 aggiunge il supporto per più IMEI nel record di Android Key Attestation. Gli OEM possono implementare questa funzionalità aggiungendo un tag KeyMint per un secondo IMEI. Sta diventando sempre più comune che i dispositivi abbiano più radio cellulari e gli OEM ora possono supportare dispositivi con due IMEI.

Se presente sui dispositivi, l'IMEI secondario deve essere provisionato per le implementazioni KeyMint in modo che queste possano attestarlo nello stesso modo in cui attestano il primo IMEI.

Attestazione dell'identità

Android 8.0 include il supporto facoltativo per l'attestazione dell'ID per i dispositivi con Keymaster 3. L'attestazione dell'ID consente al dispositivo di fornire la prova dei suoi identificatori hardware, come il numero di serie o l'IMEI. Sebbene sia una funzionalità facoltativa, è altamente consigliato che tutte le implementazioni di Keymaster 3 la supportino perché la possibilità di dimostrare l'identità del dispositivo consente di utilizzare casi d'uso come la vera configurazione remota zero-touch in modo più sicuro (perché la parte remota può essere certa di comunicare con il dispositivo giusto, non con un dispositivo che falsifica la sua identità).

L'attestazione dell'ID funziona creando copie degli identificatori hardware del dispositivo a cui può accedere solo il TEE prima che il dispositivo lasci la fabbrica. Un utente può sbloccare il bootloader del dispositivo e modificare il software di sistema e gli identificatori segnalati dai framework Android. Le copie degli identificatori detenuti dal TEE non possono essere manipolate in questo modo, garantendo che l'attestazione dell'ID dispositivo attesti solo gli identificatori hardware originali del dispositivo, sventando così i tentativi di spoofing.

L'API principale per l'attestazione dell'ID si basa sul meccanismo di attestazione della chiave esistente introdotto con Keymaster 2. Quando viene richiesto un certificato di attestazione per una chiave detenuta da Keymaster, il chiamante può richiedere che gli identificatori hardware del dispositivo vengano inclusi nei metadati del certificato di attestazione. Se la chiave è memorizzata nel TEE, le catene di certificati rimandano a una radice di attendibilità nota. Il destinatario di un certificato di questo tipo può verificare che il certificato e i relativi contenuti, inclusi gli identificatori hardware, siano stati scritti dal TEE. Quando viene chiesto di includere gli identificatori hardware nel certificato di attestazione, il TEE attesta solo gli identificatori memorizzati nel suo spazio di archiviazione, come compilati in fabbrica.

Proprietà di archiviazione

Lo spazio di archiviazione che contiene gli identificatori del dispositivo deve avere le seguenti proprietà:

  • I valori derivati dagli identificatori originali del dispositivo vengono copiati nello spazio di archiviazione prima che il dispositivo esca dalla fabbrica.
  • Il metodo destroyAttestationIds() può eliminare definitivamente questa copia dei dati derivati dall'identificatore. La distruzione permanente significa che i dati vengono rimossi completamente, in modo che né un ripristino dei dati di fabbrica né qualsiasi altra procedura eseguita sul dispositivo possa ripristinarli. Ciò è particolarmente importante per i dispositivi in cui un utente ha sbloccato il bootloader e modificato il software di sistema e gli identificatori restituiti dai framework Android.
  • I centri RMA devono essere in grado di generare nuove copie dei dati derivati dall'identificatore hardware. In questo modo, un dispositivo che passa attraverso la RMA può eseguire nuovamente l'attestazione dell'ID. Il meccanismo utilizzato dalle strutture RMA deve essere protetto in modo che gli utenti non possano invocarlo autonomamente, in quanto ciò consentirebbe loro di ottenere attestazioni di ID falsificati.
  • Nessun codice diverso dall'app Keymaster attendibile nel TEE è in grado di leggere i dati derivati dall'identificatore conservati nello spazio di archiviazione.
  • Lo spazio di archiviazione è a prova di manomissione: se i contenuti dello spazio di archiviazione sono stati modificati, il TEE li tratta come se le copie dei contenuti fossero state distrutte e rifiuta tutti i tentativi di attestazione dell'ID. Questa operazione viene eseguita firmando o MACing l'archiviazione come descritto di seguito.
  • Lo spazio di archiviazione non contiene gli identificatori originali. Poiché l'attestazione dell'identità comporta una verifica, il chiamante fornisce sempre gli identificatori da attestare. Il TEE deve solo verificare che corrispondano ai valori originali. L'archiviazione di hash sicuri dei valori originali anziché dei valori consente questa verifica.

Lavori in corso

Per creare un'implementazione con le proprietà elencate sopra, memorizza i valori derivati dall'ID nella seguente costruzione S. Non memorizzare altre copie dei valori ID, ad eccezione delle posizioni normali nel sistema, che un proprietario del dispositivo può modificare tramite rooting:

S = D || HMAC(HBK, D)

dove:

  • D = HMAC(HBK, ID1) || HMAC(HBK, ID2) || ... || HMAC(HBK, IDn)
  • HMAC è la costruzione HMAC con un hash sicuro appropriato (consigliato SHA-256)
  • HBK è una chiave associata all'hardware e non utilizzata per altri scopi
  • ID1...IDn sono i valori ID originali; l'associazione di un valore specifico a un indice specifico dipende dall'implementazione, in quanto dispositivi diversi hanno un numero diverso di identificatori
  • || rappresenta la concatenazione

Poiché gli output HMAC hanno dimensioni fisse, non sono necessari intestazioni o altre strutture per trovare gli hash ID individuali o l'HMAC di D. Oltre a controllare i valori forniti per eseguire l'attestazione, le implementazioni devono convalidare S estraendo D da S, calcolando HMAC(HBK, D) e confrontandolo con il valore in S per verificare che nessun ID individuale sia stato modificato/danneggiato. Inoltre, le implementazioni devono utilizzare confronti a tempo costante per tutti gli elementi dell'ID individuale e la convalida di S. Il tempo di confronto deve essere costante indipendentemente dal numero di ID forniti e dalla corrispondenza corretta di qualsiasi parte del test.

Identificatori hardware

L'attestazione dell'ID supporta i seguenti identificatori hardware:

  1. Nome del brand, restituito da Build.BRAND in Android
  2. Nome del dispositivo, restituito da Build.DEVICE in Android
  3. Nome del prodotto, restituito da Build.PRODUCT in Android
  4. Nome del produttore, restituito da Build.MANUFACTURER in Android
  5. Nome del modello, restituito da Build.MODEL in Android
  6. Numero di serie
  7. IMEI di tutte le radio
  8. MEID di tutte le radio

Per supportare l'attestazione dell'ID dispositivo, un dispositivo attesta questi identificatori. Tutti i dispositivi con Android hanno i primi sei e sono necessari per il funzionamento di questa funzionalità. Se il dispositivo dispone di radio cellulari integrate, deve supportare anche l'attestazione per gli IMEI e/o i MEID delle radio.

L'attestazione dell'ID viene richiesta eseguendo un'attestazione della chiave e includendo gli identificatori del dispositivo da attestare nella richiesta. Gli identificatori sono taggati come:

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

L'identificatore da attestare è una stringa di byte codificata in UTF-8. Questo formato si applica anche agli identificatori numerici. Ogni identificatore da attestare è espresso come stringa codificata in UTF-8.

Se il dispositivo non supporta l'attestazione dell'ID (o destroyAttestationIds() è stato chiamato in precedenza e il dispositivo non può più attestare i propri ID), qualsiasi richiesta di attestazione della chiave che includa uno o più di questi tag non va a buon fine e restituisce ErrorCode::CANNOT_ATTEST_IDS.

Se il dispositivo supporta l'attestazione dell'ID e uno o più dei tag precedenti sono stati inclusi in una richiesta di attestazione della chiave, il TEE verifica che l'identificatore fornito con ciascuno dei tag corrisponda alla sua copia degli identificatori hardware. Se uno o più identificatori non corrispondono, l'intera attestazione non riesce e viene visualizzato ErrorCode::CANNOT_ATTEST_IDS. È valido fornire lo stesso tag più volte. Ciò può essere utile, ad esempio, per l'attestazione degli IMEI: Un dispositivo può avere più radio con più IMEI. Una richiesta di attestazione è valida se il valore fornito con ogni ATTESTATION_ID_IMEI corrisponde a una delle radio del dispositivo. Lo stesso vale per tutti gli altri tag.

Se l'attestazione va a buon fine, gli ID attestati vengono aggiunti all'estensione di attestazione (OID 1.3.6.1.4.1.11129.2.1.17) del certificato di attestazione emesso, utilizzando lo schema riportato sopra. Le modifiche allo schema di attestazione Keymaster 2 sono in grassetto, con commenti.

API Java

Questa sezione è solo informativa. Gli implementatori di Keymaster non implementano né utilizzano l'API Java. Queste informazioni vengono fornite per aiutare gli implementatori a capire come viene utilizzata la funzionalità dalle app. I componenti di sistema potrebbero utilizzarlo in modo diverso, motivo per cui è fondamentale che questa sezione non venga trattata come normativa.