Attestazione chiave e ID

Il keystore fornisce un luogo più sicuro per creare, archiviare e utilizzare le chiavi di crittografia in modo controllato. Quando lo spazio di archiviazione delle chiavi con integrazione hardware è disponibile e viene utilizzato, il materiale della chiave è più protetto dall'estrazione dal dispositivo e Keymaster applica limitazioni difficili da aggirare.

Tuttavia, questo vale solo se è noto che le chiavi del keystore si trovano in un archiviazione basata su hardware. In Keymaster 1, non era possibile per le app o per i server remoti verificare in modo affidabile se era così. Il daemon del keystore caricava l'HAL Keymaster disponibile e dava credito a tutto ciò che diceva l'HAL in merito al backup hardware delle chiavi.

Per risolvere il problema, Keymaster ha introdotto l'attestazione delle chiavi in Android 7.0 (Keymaster 2) e l'attestazione dell'ID in Android 8.0 (Keymaster 3).

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

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

Attestazione delle chiavi

Per supportare l'attestazione delle chiavi, Android 7.0 ha introdotto un insieme di tag, tipi e metodi nell'HAL.

Tag

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

Digitare

Keymaster 2 e versioni precedenti

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

AttestKey method

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 la certificazione. Sono inclusi Tag::ATTESTATION_CHALLENGE e possibly Tag::RESET_SINCE_ID_ROTATION, nonché Tag::APPLICATION_ID e Tag::APPLICATION_DATA. I due metodi successivi 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 i vincoli di autorizzazione. Ad esempio, se la chiave attestata richiede l'autenticazione dell'utente per essere utilizzata, è 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 rispetto alla chiave di cui viene attestata l'autenticità.

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 come definiti.

SEQUENCE del certificato

Nome del campo (consulta 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 STRINGA DI BIT, firma calcolata su tbsCertificate con codifica DER ASN.1.

SEQUENCE TBSCertificate

Nome del campo (consulta RFC 5280) Valore
version INTEGER 2 (indica il certificato v3)
serialNumber INTEGER 1 (valore fisso: uguale su tutti i certificati)
signature AlgorithmIdentifier dell'algoritmo utilizzato per firmare la chiave: ECDSA per le chiavi EC, RSA per le chiavi RSA.
issuer Uguale al campo dell'oggetto della chiave di attestazione batch.
validity SEQUENZIA di due date contenenti i valori di Tag::ACTIVE_DATETIME e Tag::USAGE_EXPIRE_DATETIME. Questi valori sono in millisecondi a partire dal 1° gennaio 1970. Consulta il documento 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: uguale su tutti i certificati)
subjectPublicKeyInfo SubjectPublicKeyInfo contenente la chiave pubblica attestata.
extensions/Key Usage digitalSignature: impostato 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; i contenuti sono definiti nella sezione Estensione di attestazione di seguito. Come per tutte le estensioni dei certificati X.509, i contenuti sono rappresentati come OCTET_STRING contenente una codifica DER della SEQUENCE di attestazione.

Estensione di 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 tradotti in tipi ASN.1 come segue:

Tipo di Keymaster/KeyMint 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 Milisecondi dal 1° gennaio 1970 00:00:00 GMT.
BOOL NULL La presenza del tag indica true, l'assenza indica false.
BIGNUM Nessun tag ha questo tipo, pertanto non è definita alcuna mappatura.
BYTES OCTET_STRING

Schema

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

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 Keymaster/KeyMint
1Keymaster versione 2.0
2Keymaster versione 3.0
3Versione Keymaster 4.0
4Versione Keymaster 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
attestationSecurityLevel

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

keymasterVersion/keyMintVersion
La versione dell'implementazione dell'Hardware Abstraction Layer (HAL) Keymaster/KeyMint.
ValoreVersione Keymaster/KeyMint
2Keymaster versione 2.0
3Keymaster versione 3.0
4Versione Keymaster 4.0
41Versione Keymaster 4.1
100KeyMint versione 1.0
200KeyMint versione 2.0
300KeyMint versione 3.0
keymasterSecurityLevel/keyMintSecurityLevel
Il livello di sicurezza dell'implementazione di Keymaster/KeyMint.
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, vedi la sezione ID univoco.
softwareEnforced
L'elenco di autorizzazioni Keymaster/KeyMint applicato dal sistema Android. Queste informazioni vengono raccolte o generate dal codice della piattaforma e archiviate nella partizione di sistema del dispositivo. 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 verifiedBootState è Verified).
hardwareEnforced
L'elenco di autorizzazioni di Keymaster/KeyMint applicato dal Trusted Execution Environment (TEE) o dalla StrongBox del dispositivo. Queste informazioni vengono raccolte o generate da 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 comporta la fiducia nella piattaforma.

Valori di SecurityLevel

Il valore SecurityLevel indica il grado di resilienza agli attacchi di un elemento correlato al keystore (ad esempio la coppia di chiavi e l'attestazione).

Valore Significato
Software Sicura se il sistema Android del dispositivo è conforme al modello di sicurezza della piattaforma Android (ovvero il bootloader del dispositivo è bloccato e il verifiedBootState è Verified).
TrustedEnvironment Sicura a condizione che l'ambiente di esecuzione affidabile (TEE) non sia compromesso. I requisiti di isolamento per i TEE sono definiti nelle sezioni 9.11 [C-1-1] a [C-1-4] del Compatibility Definition Document di Android. I TEE sono molto resistenti alla compromissione da remoto e moderatamente resistenti alla compromissione da attacco hardware diretto.
StrongBox Sicura, a condizione che StrongBox non sia 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 è molto resistente alla compromissione da remoto e da attacco hardware diretto (ad esempio manomissione fisica e attacchi lato canale).

Campi AuthorizationList

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

Ogni campo ha un tag EXPLICIT specifico del contesto uguale al numero di tag Keymaster/KeyMint, che consente una rappresentazione più compatta dei dati in AuthorizationList. L'analizzatore 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 sua codifica ASN.1 conterrà quindi il tag 504 specifico del contesto anziché il tag di classe UNIVERSAL per il tipo ASN.1 INTEGER, ovvero 10.

purpose
Corrisponde al tag di autorizzazione Tag::PURPOSE, che utilizza un valore ID tag di 1.
algorithm

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

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

keySize
Corrisponde al tag di autorizzazione Tag::KEY_SIZE, che utilizza un valore ID tag di 3.
digest
Corrisponde al tag di autorizzazione Tag::DIGEST, che utilizza un valore ID tag di 5.
padding
Corrisponde al tag di autorizzazione Tag::PADDING, che utilizza un valore ID tag di 6.
ecCurve

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

L'insieme di parametri utilizzati per generare una coppia di chiavi ellittiche (EC), che utilizza ECDSA per la firma e la verifica, all'interno del keystore di 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::RSA_OAEP_MGF_DIGEST tag di autorizzazione KeyMint che utilizza un valore ID tag pari a 203.
rollbackResistance

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

Corrisponde al Tag::ROLLBACK_RESISTANCE tag di autorizzazione, 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 Keymaster 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.
noAuthRequired

Corrisponde al Tag::NO_AUTH_REQUIRED tag di autorizzazione, 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::ALLOW_WHILE_ON_BODY tag di autorizzazione, 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 sul corpo sicuro determina se il dispositivo è indossato sul corpo dell'utente.

trustedUserPresenceRequired

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

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

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

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

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 ulteriori informazioni su come ottenere la conferma dell'utente, consulta Conferma protetta Android.

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

unlockedDeviceRequired

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.

allApplications

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

Indica se tutte le app su un dispositivo possono accedere alla coppia di chiavi.

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

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

rollbackResistant

Presente solo nelle versioni 1 e 2 dell'attestazione della chiave.

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

rootOfTrust

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

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

osVersion

Corrisponde al Tag::OS_VERSION tag di autorizzazione, che utilizza un valore ID tag di 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::PATCHLEVEL tag di autorizzazione, che utilizza un valore ID tag di 706.

Il mese e l'anno associati alla patch di sicurezza in uso all'interno di Keymaster, specificati come numero intero di 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 delle chiavi >= 2.

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

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

attestationIdBrand

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al Tag::ATTESTATION_ID_BRAND tag Keymaster, che utilizza un valore ID tag di 710.

attestationIdDevice

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al Tag::ATTESTATION_ID_DEVICE tag Keymaster, che utilizza un valore ID tag di 711.

attestationIdProduct

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al Tag::ATTESTATION_ID_PRODUCT tag Keymaster, che utilizza un valore ID tag di 712.

attestationIdSerial

Presente solo nelle versioni dell'attestazione delle chiavi >= 2.

Corrisponde al Tag::ATTESTATION_ID_SERIAL tag Keymaster, che utilizza un valore ID tag di 713.

attestationIdImei

Presente solo nelle versioni dell'attestazione delle chiavi >= 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 delle chiavi >= 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 delle chiavi >= 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 delle chiavi >= 2.

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

vendorPatchLevel

Presente solo nelle versioni di attestazione delle chiavi >= 3.

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

Specifica il livello della patch di sicurezza dell'immagine del fornitore che deve essere installato sul dispositivo per l'utilizzo di questa chiave. Il valore viene visualizzato nel formato AAAAMMGG e 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 di attestazione delle chiavi >= 3.

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

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

deviceUniqueAttestation

Presente solo nelle versioni di attestazione delle chiavi >= 4.

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

attestationIdSecondImei

Presente solo nelle versioni di attestazione delle chiavi >= 300.

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

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 indica 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 digest 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 di 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 root of trust incorporata, ovvero il certificato incorporato nella ROM del dispositivo dal produttore del dispositivo in fabbrica.
SelfSigned YELLOW Come per Verified, tranne per il fatto che la verifica è stata eseguita utilizzando un root of trust configurato dall'utente anziché il root of trust incorporato 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, pertanto non è possibile stabilire una catena di attendibilità. Il dispositivo può essere modificato liberamente, pertanto la sua integrità deve essere verificata dall'utente out-of-band. In questo stato, il campo verifiedBootKey contiene 32 byte di zeri.
Failed RED Il dispositivo non ha superato la verifica. In questo stato, non sono previste garanzie sui contenuti degli altri campi RootOfTrust.

AttestationApplicationId

Questo campo riflette la convinzione della piattaforma Android in merito alle app che sono autorizzate a utilizzare il materiale della chiave segreta nell'ambito dell'attestazione. Può contenere più pacchetti se e solo se condividono lo stesso UID. Il campo AttestationApplicationId in AuthorizationList è di tipo OCTET_STRING ed è formato in base allo schema ASN.1 riportato di seguito:

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 digest SHA-256 dei certificati di firma dell'app. Un'app può avere più catene di certificati delle chiavi di firma. Per ciascuno, il certificato "leaf" viene elaborato e inserito nel campo signature_digests. Il nome del campo è fuorviante, poiché i dati sottoposti a digestione sono i certificati di firma dell'app, non le firme dell'app, perché il nome è associato alla 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]), ...}
    

ID univoco

L'ID univoco è un valore di 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, senza tenere conto del resto. 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 o 0 se il tag non è presente.
  • HBK è un segreto hardware univoco noto al Trusted Execution Environment e mai rivelato da quest'ultimo. Il segreto contiene almeno 128 bit di entropia ed è univoco per il singolo dispositivo (è accettabile l'unicità probabilistica dati i 128 bit di entropia). La chiave HBK deve essere ricavata dal materiale della chiave fuso tramite HMAC o AES_CMAC.

Tronca l'output HMAC_SHA256 a 128 bit.

Chiavi e certificati di attestazione

Nel dispositivo viene eseguito il provisioning sicuro di due chiavi, una RSA e una ECDSA, e delle catene di certificati corrispondenti.

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 di cui è stato eseguito il provisioning in fabbrica.

Più IMEI

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

Gli OEM sono tenuti a disporre di un IMEI secondario, se presente sui loro dispositivi, da eseguire il provisioning per le implementazioni di KeyMint in modo che queste implementazioni possano attestarlo nello stesso modo in cui attestano il primo IMEI

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 seguente:

  {
        1 : int,   ; certificates issued
  }

La mappa non è sottoposta a controllo della versione e possono 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 è superiore alla media di alcuni ordini di grandezza.

Verifica dell'identità

Android 8.0 include il supporto facoltativo per l'attestazione dell'identità per i dispositivi con Keymaster 3. L'attestazione dell'identità consente al dispositivo di fornire la prova dei suoi identificativi hardware, come il numero di serie o l'IMEI. Sebbene sia una funzionalità facoltativa, è vivamente consigliato che tutte le implementazioni di Keymaster 3 forniscano il supporto per questa funzionalità perché la possibilità di dimostrare l'identità del dispositivo consente di rendere più sicuri casi d'uso come la configurazione remota zero-touch (in quanto il lato remoto può essere certo di comunicare con il dispositivo giusto, non con un dispositivo che ne finge l'identità).

L'attestazione dell'identità funziona creando copie degli identificatori hardware del dispositivo a cui solo il Trusted Execution Environment (TEE) può accedere prima che il dispositivo usciti dalla 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'interfaccia API principale per l'attestazione dell'identità si basa sul meccanismo di attestazione delle chiavi esistente introdotto con Keymaster 2. Quando richiede un certificato di attestazione per una chiave conservata da keymaster, il chiamante può richiedere l'inclusione degli identificatori hardware del dispositivo nei metadati del certificato di attestazione. Se la chiave è conservata nel TEE, il certificato si ricollega 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 gli viene chiesto di includere gli identificatori hardware nel certificato di attestazione, la TEE attesta solo gli identificatori memorizzati nella sua memoria, come compilati in fabbrica.

Proprietà di archiviazione

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

  • I valori ricavati dagli identificatori originali del dispositivo vengono copiati nella memoria prima che il dispositivo esca dalla fabbrica.
  • Il metodo destroyAttestationIds() può distruggere definitivamente questa copia dei dati ricavati dall'identificatore. Per distruzione permanente si intende che i dati vengono rimossi completamente, pertanto né un ripristino dei dati di fabbrica né qualsiasi altra procedura eseguita sul dispositivo può ripristinarli. Questo è 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 ricavati dall'identificatore hardware. In questo modo, un dispositivo che passa attraverso l'RMA può eseguire di nuovo l'attestazione dell'identità. 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 attendibile Keymaster nel TEE è in grado di leggere i dati ricavati dall'identificatore memorizzati nello spazio di archiviazione.
  • Lo spazio di archiviazione è protetto da manomissioni: 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'identità. Questo viene implementato tramite la firma o l'utilizzo di un MAC per lo spazio di archiviazione come descritto di seguito.
  • Lo spazio di archiviazione non contiene gli identificatori originali. Poiché l'attestazione dell'identità richiede una verifica, è sempre il chiamante a fornire gli identificatori da verificare. Il TEE deve solo verificare che corrispondano ai valori che avevano inizialmente. Questa verifica è abilitata memorizzando hash sicuri dei valori originali anziché dei valori.

Edilizia

Per creare un'implementazione con le proprietà elencate sopra, memorizza i valori ricavati dall'ID nella seguente costruzione S. Non memorizzare altre copie dei valori ID, ad eccezione dei normali punti del sistema che un proprietario del dispositivo può modificare eseguendo il 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 legata all'hardware non utilizzata per altri scopi
  • ID1...IDn sono i valori ID originali; l'associazione di un determinato valore a un determinato indice dipende dall'implementazione, poiché i diversi dispositivi hanno numeri diversi di identificatori
  • || rappresenta la concatenazione

Poiché le uscite HMAC sono di dimensioni fisse, non sono richieste intestazioni o altre strutture per poter trovare i singoli hash ID 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/corrotto. Inoltre, le implementazioni devono utilizzare confronti in tempo costante per tutti i singoli elementi ID 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'identità 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 è dotato 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 nella richiesta gli identificatori del dispositivo da attestare. Gli identificatori sono contrassegnati 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 autenticare è una stringa di byte codificata in UTF-8. Questo formato si applica anche agli identificatori numerici. Ogni identificatore da attestare è espresso come una stringa codificata UTF-8.

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

Se il dispositivo supporta l'attestazione dell'identità e uno o più dei tag sopra indicati sono stati inclusi in una richiesta di attestazione della chiave, il TEE verifica che l'identificatore fornito con ciascun tag corrisponda alla sua copia degli identificatori hardware. Se uno o più identificatori non corrispondono, l'intera attestazione non va a buon fine con ErrorCode::CANNOT_ATTEST_IDS. È valido fornire lo stesso tag più volte. Questo può essere utile, ad esempio, per attestare gli 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 di Keymaster 2 sono in grassetto, con commenti.

API Java

Questa sezione è solo informativa. Gli implementatori di Keymaster non implementano né utilizzano l'API Java. Questo documento è fornito per aiutare gli implementatori a comprendere come la funzionalità viene utilizzata dalle app. I componenti di sistema potrebbero utilizzarla diversamente, motivo per cui è fondamentale che questa sezione non venga considerata normativa.