Questa pagina fornisce dettagli per assistere gli utenti che implementano Keymaster Strati di astrazione hardware (HAL). Copre ogni funzione del e la versione Keymaster in cui è disponibile la funzione. descrive l'implementazione predefinita. Per i tag, consulta Pagina Tag Keymaster.
Linee guida generali di implementazione
Le seguenti linee guida si applicano a tutte le funzioni nell'API.
Parametri del puntatore di input
Versione: 1, 2
I parametri di puntatore di input che non vengono utilizzati per una determinata chiamata possono essere
NULL
. Il chiamante non deve necessariamente fornire dei segnaposto.
Ad esempio, alcuni tipi e modalità di chiavi potrebbero non utilizzare alcun valore
inParams
per begin, quindi il chiamante potrebbe
imposta inParams
su NULL
o fornisci un parametro vuoto
per iniziare. I chiamanti possono anche fornire parametri inutilizzati e i metodi Keymaster
non generare errori.
Se un parametro di input obbligatorio è NULL, i metodi Keymaster devono restituire
ErrorCode::UNEXPECTED_NULL_POINTER
.
A partire da Keymaster 3, non ci sono parametri puntatore. Tutti i parametri vengono passati dai riferimenti value o const.
Parametri del puntatore di output
Versione: 1, 2
Simili ai parametri del puntatore di input, i parametri inutilizzati del puntatore di output
potrebbe essere NULL
. Se un metodo deve restituire dati in un output
risulta essere NULL
, deve essere restituito
ErrorCode::OUTPUT_PARAMETER_NULL
.
A partire da Keymaster 3, non ci sono parametri puntatore. Tutti i parametri vengono passati dai riferimenti value o const.
Uso improprio delle API
Versione: 1, 2, 3
Esistono molti modi in cui i chiamanti possono effettuare richieste senza senso o sono sciocchi ma non tecnicamente sbagliati. Le implementazioni Keymaster non sono in caso di esito negativo o di fornire una diagnostica. L'uso di tasti troppo piccoli specifica di parametri di input irrilevanti, riutilizzo di IV o nonce, chiave senza scopo (quindi inutile) e simili non dovrebbero essere diagnosticati dalle implementazioni. Omissione dei parametri obbligatori, specifica del parametri obbligatori non validi ed errori simili devono essere diagnosticati.
È responsabilità delle app, del framework e dell'archivio chiavi Android per assicurare che le chiamate ai moduli Keymaster siano sensate e utili.
Funzioni
getHardwareFeatures
Versione: 3
Il nuovo metodo getHardwareFeatures
espone ai client alcuni
caratteristiche importanti dell'hardware sicuro sottostante.
Il metodo non accetta argomenti e restituisce quattro valori, tutti booleani:
isSecure
ètrue
se le chiavi sono archiviate in hardware protetto (TEE ecc.) e non abbandonarlo mai.supportsEllipticCurve
ètrue
se supporta la crittografia basata su curve ellittiche con le curve NIST (P-224, P-256, P-384 e P-521).supportsSymmetricCryptography
ètrue
se l'hardware supporta la crittografia simmetrica, inclusi AES e HMAC.supportsAttestation
ètrue
se supporta la generazione di certificati di attestazione della chiave pubblica Keymaster, con una chiave inserita in un ambiente sicuro.
Gli unici codici di errore che questo metodo può restituire sono ErrorCode:OK
,
ErrorCode::KEYMASTER_NOT_CONFIGURED
o uno dei codici di errore
che indica una mancata comunicazione con l'hardware protetto.
getHardwareFeatures() generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography, bool supportsAttestation, bool supportsAllDigests, string keymasterName, string keymasterAuthorName);
configura
Versione: 2
Questa funzione è stata introdotta in Keymaster 2 e deprecata in Keymaster 3, poiché queste informazioni sono disponibili nei file delle proprietà di sistema, mentre il produttore le implementazioni leggono i file durante l'avvio.
Configura keymaster. Questo metodo viene chiamato una volta dopo l'apertura del dispositivo
e prima di utilizzarlo. È utilizzato per fornire
KM_TAG_OS_VERSION e
Da KM_TAG_OS_PATCHLEVEL a
keymaster. Finché non viene chiamato questo metodo, tutti gli altri metodi restituiscono
KM_ERROR_KEYMASTER_NOT_CONFIGURED
. I valori forniti da questo
sono accettati dal keymaster soltanto una volta per avvio. Successiva
le chiamate restituiscono KM_ERROR_OK
, ma non eseguono alcuna operazione.
Se l'implementazione keymaster è su hardware sicuro e la versione del sistema operativo e
i valori a livello di patch forniti non corrispondono a quelli forniti alla
hardware dal bootloader (o se il bootloader non ha fornito valori),
questo metodo restituisce KM_ERROR_INVALID_ARGUMENT
e tutti gli altri
che continuano a restituire KM_ERROR_KEYMASTER_NOT_CONFIGURED
.
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
Entropia AddRng
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come add_rng_entropy
e rinominata in Keymaster 3.
Aggiunge l'entropia fornita dal chiamante al pool utilizzato dall'implementazione di Keymaster 1 per generare numeri casuali, chiavi, IV e così via.
Le implementazioni Keymaster devono combinare in modo sicuro
all'interno del pool, che a sua volta deve contenere
generata internamente da un generatore di numeri casuali hardware.
Il mix deve essere gestito in modo che un aggressore che abbia il controllo completo
dei bit forniti da addRngEntropy
o di quelli generati dall'hardware
ma non entrambi, non ha alcun vantaggio non trascurabile nel prevedere i bit
generate dal pool di entropia.
Implementazioni Keymaster che tentano di stimare l'entropia nei loro
il pool interno presuppone che i dati forniti
addRngEntropy
non contiene entropia. Le implementazioni Keymaster possono
restituisce ErrorCode::INVALID_INPUT_LENGTH
se vengono forniti più di 2
KiB di dati in una singola chiamata.
generaChiave
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come generate_key
e rinominata in Keymaster 3.
Genera una nuova chiave di crittografia, specificando le autorizzazioni associate,
associati in modo permanente alla chiave. Le implementazioni Keymaster
impossibile utilizzare una chiave in qualsiasi modo non coerente con le autorizzazioni
specificato al momento della generazione. Per quanto riguarda le autorizzazioni
hardware non può essere applicato, l'obbligo dell'hardware protetto è limitato
garantendo che le autorizzazioni non azionabili associate alla chiave
essere modificato, in modo che ogni chiamata
getKeyCharacteristics
restituisce il valore originale. Inoltre, le caratteristiche restituite
generateKey
alloca correttamente le autorizzazioni tra
basate su hardware e software. Consulta
getKeyFeatureistics per ulteriori dettagli.
I parametri forniti a generateKey
dipendono dal tipo di chiave
vengono generati. Questa sezione riepiloga i tag necessari e facoltativi per
ogni tipo di chiave. Tag::ALGORITMO
è sempre necessario specificare il tipo.
Chiavi RSA
I seguenti parametri sono necessari per generare una chiave RSA.
- Tag::KEY_SIZE
specifica la dimensione del modulo pubblico in bit. Se omesso,
Il metodo restituisce
ErrorCode::UNSUPPORTED_KEY_SIZE
. I valori supportati sono 1024, 2048, 3072 e 4096. Valori consigliati sono tutte dimensioni della chiave che sono un multiplo di 8. - Tag::RSA_PUBLIC_EXPONENT
specifica il valore dell'esponente pubblico RSA. Se omesso, il metodo
restituisce
ErrorCode::INVALID_ARGUMENT
. I valori supportati sono 3 e 65537. I valori consigliati sono tutti i valori primi fino a 2^64.
I seguenti parametri non sono necessari per generare una chiave RSA, ma
se crei una chiave RSA senza di essi, ne viene generata una inutilizzabile. Tuttavia,
La funzione generateKey
non restituisce un errore se questi parametri
vengono omessi.
- Tag::PURPOSE specifica scopi consentiti. Tutte le finalità devono essere supportate per le chiavi RSA, in qualsiasi combinazione.
- Tag::DIGEST specifica
algoritmi digest che possono essere usati con la nuova chiave. Implementazioni
che non supportano tutti gli algoritmi digest devono accettare la generazione di chiavi
che includono sintesi non supportate. Le sintesi non supportate devono essere
collocata nella categoria "applicata dal software" nelle caratteristiche chiave restituite.
Questo perché la chiave può essere usata con gli altri digest, ma la digestione è
eseguita nel software. Quindi viene chiamato l'hardware per eseguire l'operazione
con
Digest::NONE
. - Tag::PADDING specifica la
modalità di spaziatura interna utilizzabili con la nuova chiave. Implementazioni
che non supportano tutti gli algoritmi digest, devono inserire
PaddingMode::RSA_PSS
ePaddingMode::RSA_OAEP
pollici l'elenco delle caratteristiche principali applicate dal software, se non supportate vengono specificati algoritmi digest.
Chiavi ECDSA
Solo Tag::KEY_SIZE è necessarie per generare una chiave ECDSA. È utilizzato per selezionare il gruppo EC. I valori supportati sono 224, 256, 384 e 521, che indicano il NIST p-224, p-256, p-384 e p521, rispettivamente.
Tag::DIGEST è necessaria anche per un'utile chiave ECDSA, ma non sono necessari per la generazione.
Chiavi AES
Solo Tag::KEY_SIZE
necessaria per generare una chiave AES. Se omesso, il metodo restituisce
ErrorCode::UNSUPPORTED_KEY_SIZE
. I valori supportati sono
128 e 256, con supporto opzionale per le chiavi AES a 192 bit.
I seguenti parametri sono particolarmente rilevanti per le chiavi AES, ma non necessarie per generarne uno:
Tag::BLOCK_MODE
specifica le modalità di blocco con cui può essere utilizzata la nuova chiave.Tag::PADDING
specifica le possibili modalità di spaziatura interna in uso. Questo vale solo per le modalità ECB e CBC.
Se viene specificata la modalità di blocco GCM, specifica il valore
Tag::MIN_MAC_LENGTH.
Se omesso, il metodo restituisce ErrorCode::MISSING_MIN_MAC_LENGTH
.
Il valore del tag è un multiplo di 8 e compreso tra 96 e 128.
Chiavi HMAC
Per la generazione di chiavi HMAC sono necessari i seguenti parametri:
- Tag::KEY_SIZE specifica la dimensione della chiave in bit. Valori inferiori a 64 e i valori che non sono multipli di 8 non sono supportati. Tutti sono supportati multipli di 8, da 64 a 512. I valori più alti possono essere: supportati.
- Tag::MIN_MAC_LENGTH specifica la lunghezza minima MAC che possono essere generati o verificati con questa chiave. Il valore è un multiplo di 8 e almeno 64.
- Tag::DIGEST
specifica l'algoritmo digest per la chiave. Esattamente
viene specificato un digest, altrimenti restituisce
ErrorCode::UNSUPPORTED_DIGEST
. Se il digest non è supportato dal trustlet, restituisceErrorCode::UNSUPPORTED_DIGEST
.
Caratteristiche principali
Se l'argomento delle caratteristiche è non-NULL, generateKey
restituisce
le caratteristiche della chiave appena generata,
separate correttamente in
basate su hardware e software. Consulta
getKeyCharacteristics per una descrizione
delle caratteristiche da inserire in un elenco. Le caratteristiche restituite
includere tutti i parametri specificati per la generazione delle chiavi, tranne
Tag::APPLICATION_ID e
Tag::APPLICATION_DATA.
Se questi tag sono stati inclusi nei parametri chiave, vengono rimossi da
le caratteristiche restituite in modo che non sia possibile trovarne i valori
esaminando il blob della chiave restituito. Tuttavia, sono legati crittograficamente
al blob della chiave, in modo che se non vengono forniti i valori corretti quando la chiave
non va a buon fine, l'utilizzo non riesce. Analogamente,
Tag::ROOT_OF_TRUST è
crittograficamente associato alla chiave, ma potrebbe non essere specificata
creazione o importazione della chiave e non viene mai restituita.
Oltre ai tag forniti, il trustlet
aggiunge Tag::ORIGIN,
con il valore KeyOrigin::GENERATED
,
e se la chiave è resistente al rollback,
Resistenza al rollback
Resistenza al rollback significa che, quando una chiave viene eliminata deleteKey o deleteAllKeys, sono garantiti da hardware sicuro non sarà mai più utilizzabile. Implementazioni tipicamente senza resistenza al rollback restituire al chiamante il materiale della chiave generato o importato sotto forma di blob di chiavi, formato criptato e autenticato. Quando l'archivio chiavi elimina il blob della chiave, la chiave viene ma un aggressore che in precedenza è riuscito a recuperare il materiale della chiave potrebbe potenzialmente ripristinarlo sul dispositivo.
Una chiave è resistente al rollback se l'hardware sicuro garantisce che l'eliminazione non possono essere ripristinate in un secondo momento. Questo di solito viene fatto memorizzando le chiavi metadati in un luogo attendibile che non può essere manipolato da un utente malintenzionato. Attivato dispositivi mobili, il meccanismo usato solitamente è Replay Protected Memory Blocchi (RPMB). Poiché il numero di chiavi che possono essere create è essenzialmente illimitato e lo spazio di archiviazione affidabile utilizzato per la resistenza al rollback potrebbe essere limitato di dimensioni, questo metodo deve avere successo anche in caso di resistenza al rollback non può essere fornito per la nuova chiave. In questo caso, Tag::ROLLBACK_RESISTANT alle caratteristiche principali.
getKeyCharacteristics
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come
get_key_characteristics
e rinominata in Keymaster 3.
Restituisce i parametri e le autorizzazioni associati alla chiave fornita, suddivisi in due insiemi: basata sull'hardware e basata sul software. La descrizione qui si applica anche agli elenchi di caratteristiche chiave restituiti da generateKey e importKey.
Se durante la generazione della chiave è stato fornito Tag::APPLICATION_ID
o importare, lo stesso valore viene fornito
questo metodo nell'argomento clientId
. In caso contrario,
restituisce ErrorCode::INVALID_KEY_BLOB
. Analogamente,
se Tag::APPLICATION_DATA
è stato fornito durante la generazione
o importare, lo stesso valore viene fornito
questo metodo nell'argomento appData
.
Le caratteristiche restituite da questo metodo descrivono completamente il tipo e dell'utilizzo della chiave specificata.
La regola generale per decidere se un determinato tag appartiene al con forzatamente hardware o software si intende che se il significato del tag è completamente garantito da un hardware sicuro. Altrimenti, l'applicazione forzata del software. Di seguito è riportato un elenco di tag specifici la cui allocazione corretta potrebbero non essere chiare:
- Tag::ALGORITMO, Tag::KEY_SIZE, e Tag::RSA_PUBLIC_EXPONENT sono proprietà intrinseche della chiave. Per le chiavi protette dall'hardware, questi tag verranno inseriti nell'elenco delle applicazioni applicate all'hardware.
- Valori Tag::DIGEST supportate dall'hardware sicuro, dell'hardware. Le sintesi non supportate vengono inserite nell'elenco dei software supportati.
- Tag::PADDING valori vengono generalmente inseriti nell'elenco dei supporti hardware, a meno che non esista un possibilità che una specifica modalità di spaziatura interna debba essere eseguita da software. In questo caso, vengono inseriti nell'elenco delle applicazioni forzate dal software. Una tale possibilità riguarda le chiavi RSA che consentono il riempimento PSS o OAEP con algoritmi digest non supportate dall'hardware protetto.
- Tag::USER_SECURE_ID e Tag::USER_AUTH_TYPE vengono applicate tramite hardware solo se l'autenticazione utente è applicata in modo forzato. A ottenere questo risultato, il trustlet Keymaster e il modello di il trustlet deve essere sicuro e condividere una chiave HMAC segreta usata per firmare e convalidare i token di autenticazione. Consulta le Autenticazione per maggiori dettagli.
- Tag::ACTIVE_DATETIME, Tag::ORIGINATION_EXPIRE_DATETIME, e Tag::USAGE_EXPIRE_DATETIME richiedono l'accesso a un orologio da parete verificabile correttamente. Hardware più sicuro ha accesso solo alle informazioni sull'ora fornite dal sistema operativo non sicuro, che significa che i tag sono applicati a livello software.
- Tag::ORIGIN è sempre nell'elenco hardware per le chiavi associate all'hardware. La sua presenza in quel è il modo in cui i livelli più alti determinano che una chiave è supportata da hardware.
importKey
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come import_key
e rinominata in Keymaster 3.
Importa il materiale della chiave nell'hardware Keymaster. Parametri di definizione chiave e
le caratteristiche dell'output vengono gestite come per generateKey
,
con le seguenti eccezioni:
- Tag::KEY_SIZE e
Tag::RSA_PUBLIC_EXPONENT
(solo per le chiavi RSA) non sono necessarie nei parametri di input. Se non viene specificato,
il trustlet deduce i valori dal materiale della chiave fornito e aggiunge
i tag e i valori appropriati
alle caratteristiche principali. Se i parametri sono
fornito, il trustlet le convalida in base al materiale della chiave. Nella
in caso di mancata corrispondenza, il metodo restituisce
ErrorCode::IMPORT_PARAMETER_MISMATCH
. - Il valore Tag::ORIGIN restituito ha i valori
lo stesso valore di
KeyOrigin::IMPORTED
.
EsportazioneChiave
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come export_key
e rinominata in Keymaster 3.
Esporta una chiave pubblica da una coppia di chiavi Keymaster RSA o EC.
Se durante la generazione della chiave è stato fornito Tag::APPLICATION_ID
, lo stesso valore viene fornito a questo metodo nella
clientId
argomento. In caso contrario, il metodo restituisce
ErrorCode::INVALID_KEY_BLOB
. Analogamente, se
Tag::APPLICATION_DATA
durante la generazione o l'importazione, lo stesso valore viene fornito
questo metodo nell'argomento appData
.
deleteKey
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come delete_key
e rinominata in Keymaster 3.
Elimina la chiave fornita. Questo metodo è facoltativo ed è implementate da moduli Keymaster che offrono resistenza al rollback.
deleteAllKeys
Versione: 1, 2, 3
Questa funzione è stata introdotta in Keymaster 1 come delete_all_keys
e rinominata in Keymaster 3.
Elimina tutte le chiavi. Questo metodo è facoltativo ed è implementato solo da moduli Keymaster che offrono resistenza al rollback.
DELETEAttestationIds
Versione: 3
Il metodo destroyAttestationIds()
viene utilizzato per creare
disattiva il nuovo (facoltativo, ma vivamente consigliato)
Attestazione ID
funzionalità. Se il TEE non ha modo di garantire che l'attestazione dell'ID sia permanente
disattivata dopo la chiamata di questo metodo, l'attestazione dell'ID non deve essere
del tutto implementato, nel qual caso questo metodo non fa nulla e
restituisce ErrorCode::UNIMPLEMENTED
. Se l'attestazione dell'ID è
supportato, questo metodo deve essere implementato e deve essere disattivato definitivamente
per tutti i futuri tentativi di attestazione dell'ID. Il metodo può essere chiamato
volte. Se l'attestazione dell'ID è già disattivata definitivamente, il metodo
zero e restituisce ErrorCode::OK
.
Gli unici codici di errore che questo metodo può restituire sono
ErrorCode::UNIMPLEMENTED
(se l'attestazione dell'ID non è supportata),
ErrorCode:OK
, ErrorCode::KEYMASTER_NOT_CONFIGURED
o
uno dei codici di errore che indica la mancata comunicazione con il responsabile
hardware.
inizia
Versione: 1, 2, 3
Avvia un'operazione crittografica, utilizzando la chiave specificata, per l'oggetto
dello scopo, con i parametri specificati (a seconda dei casi), e restituisce un
handle dell'operazione utilizzato con update e finish per completare l'operazione. L'handle dell'operazione
utilizzata anche come "sfida" il token di sicurezza nelle operazioni autenticate e,
operazioni è incluso nel campo challenge
della
token di autenticazione.
Un'implementazione Keymaster supporta almeno 16 elementi simultanei
operazioni. L'archivio chiavi ne utilizza fino a 15, lasciandone uno per vold da usare per la password
la crittografia. Quando sono in corso 15 operazioni nell'archivio chiavi (begin
è
è stato chiamato, ma finish
o abort
non sono stati ancora
chiamato) e riceve una richiesta di inizio del sedicesimo, chiama
abort
sull'operazione utilizzata meno di recente per ridurre il numero di
operazioni attive alla 14 prima di chiamare begin
per avviare il
dell'operazione appena richiesta.
Se Tag::APPLICATION_ID
o Tag::APPLICATION_DATA sono stati specificati
durante la generazione o l'importazione della chiave, le chiamate a begin
includono quelle
tag con i valori originariamente specificati nell'argomento inParams
in questo metodo.
Applicazione dell'autorizzazione
Durante questo metodo, le seguenti autorizzazioni chiave vengono applicate
trustlet se l'implementazione li ha inseriti nella categoria
e se l'operazione non è di chiave pubblica. Chiave pubblica
operazioni, ovvero KeyPurpose::ENCRYPT
e KeyPurpose::VERIFY
,
con chiavi RSA o EC, possano avere esito positivo anche se i
non sono soddisfatti.
- Tag::SCOPO: lo scopo
specificato nella chiamata
begin()
deve corrispondere a uno degli scopi nelle autorizzazioni della chiave, a meno che l'operazione richiesta non sia una chiave pubblica operativa. Se lo scopo specificato non corrisponde e l'operazione non viene un'operazione con chiave pubblica,begin
restituiràErrorCode::UNSUPPORTED_PURPOSE
. Le operazioni con le chiavi pubbliche la crittografia asimmetrica o le operazioni di verifica. - Tag::ACTIVE_DATETIME
possono essere applicate in modo forzato solo se è disponibile un'origine ora UTC attendibile. Se
la data e l'ora correnti sono precedenti al valore del tag, il metodo restituisce
ErrorCode::KEY_NOT_YET_VALID
. - Tag::ORIGINATION_EXPIRE_DATETIME
possono essere applicate in modo forzato solo se è disponibile un'origine ora UTC attendibile. Se
la data e l'ora correnti sono successive al valore del tag e lo scopo è
KeyPurpose::ENCRYPT
oKeyPurpose::SIGN
, il metodo restituisceErrorCode::KEY_EXPIRED
. - Tag::USAGE_EXPIRE_DATETIME
possono essere applicate in modo forzato solo se è disponibile un'origine ora UTC attendibile. Se
la data e l'ora correnti sono successive al valore del tag e lo scopo è
KeyPurpose::DECRYPT
oKeyPurpose::VERIFY
, il metodo restituisceErrorCode::KEY_EXPIRED
. - Tag::MIN_SECONDS_BETWEEN_OPS
viene confrontato con un timer relativo attendibile che indica l'ultimo utilizzo
la chiave. Se l'ora dell'ultimo utilizzo più il valore del tag è inferiore all'ora corrente,
Il metodo restituisce
ErrorCode::KEY_RATE_LIMIT_EXCEEDED
. Consulta le descrizione del tag per importanti dettagli sull'implementazione. - Tag::MAX_USES_PER_BOOT
viene confrontato con un contatore sicuro che tiene traccia degli utilizzi della chiave
dal momento dell'avvio. Se il conteggio degli utilizzi precedenti supera il valore del tag, l'errore
restituisce
ErrorCode::KEY_MAX_OPS_EXCEEDED
. - Tag::USER_SECURE_ID
viene applicata con questo metodo solo se anche la chiave ha
Tag::AUTH_TIMEOUT.
Se nella chiave sono presenti entrambi, questo metodo deve ricevere una
Tag::AUTH_TOKEN in
inParams
. Affinché il token di autenticazione sia valido, tutti i seguenti elementi deve essere vero:- Il campo HMAC viene convalidato correttamente.
- Almeno uno dei Tag::USER_SECURE_ID della chiave corrisponda ad almeno uno dei valori ID sicuro nella di accesso.
- La chiave ha un valore Tag::USER_AUTH_TYPE che corrisponde al tipo di autenticazione nel token.
Se una di queste condizioni non è soddisfatta, il metodo restituisce
ErrorCode::KEY_USER_NOT_AUTHENTICATED
. - Tag::CALLER_NONCE
consente al chiamante di specificare un nonce o un vettore di inizializzazione (IV). Se la chiave
non ha questo tag, ma il chiamante ha fornito
Tag::NONCE per questo metodo,
Viene restituito
ErrorCode::CALLER_NONCE_PROHIBITED
. - Tag::BOOTLOADER_ONLY
specifica che solo il bootloader può utilizzare la chiave. Se questo metodo è
chiamata con una chiave solo bootloader al termine dell'esecuzione del bootloader,
restituisce
ErrorCode::INVALID_KEY_BLOB
.
Chiavi RSA
Tutte le operazioni relative alle chiavi RSA specificano esattamente una modalità di spaziatura interna in inParams
.
Se non specificato o specificato più di una volta, il metodo restituisce
ErrorCode::UNSUPPORTED_PADDING_MODE
.
Le operazioni di firma e verifica RSA richiedono una sintesi, così come la crittografia RSA
e le operazioni di decrittografia
con la modalità di spaziatura interna OAEP. In questi casi, il chiamante
specifica esattamente un digest in inParams
. Se non specificato o specificato
più di una volta, il metodo restituisce ErrorCode::UNSUPPORTED_DIGEST
.
Operazioni con le chiavi private (KeyPurpose::DECYPT
e KeyPurpose::SIGN
)
necessitano dell'autorizzazione di digest e padding, il che significa che le autorizzazioni chiave
devono contenere i valori specificati. In caso contrario, il metodo restituisce
ErrorCode::INCOMPATIBLE_DIGEST
o ErrorCode::INCOMPATIBLE_PADDING
, a seconda dei casi. Operazioni sulle chiavi pubbliche
(KeyPurpose::ENCRYPT
e KeyPurpose::VERIFY
) sono consentiti con
digest o spaziatura interna non autorizzati.
Ad eccezione di PaddingMode::NONE
, tutte le modalità di spaziatura interna RSA sono
applicabile solo a determinate finalità. In particolare,
PaddingMode::RSA_PKCS1_1_5_SIGN
e PaddingMode::RSA_PSS
supportano solo la firma e la verifica, mentre PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
e PaddingMode::RSA_OAEP
supportano solo la crittografia e la decriptazione.
Il metodo restituisce ErrorCode::UNSUPPORTED_PADDING_MODE
se il valore
la modalità specificata non supporta lo scopo specificato.
Esistono alcune interazioni importanti tra le modalità di spaziatura interna e le sintesi:
PaddingMode::NONE
indica che un valore "non elaborato" L'operazione RSA è in esecuzione. Se firmi o verifichi la verifica,Digest::NONE
specificato per il digest. Non è necessario un digest per la crittografia senza padding la decrittografia.- La spaziatura interna
PaddingMode::RSA_PKCS1_1_5_SIGN
richiede un digest. La digest può essereDigest::NONE
, nel qual caso Keymaster dell'implementazione non può creare una struttura di firma PKCS#1 v1.5 corretta, perché non può aggiungere la struttura DigestInfo. Invece, l'implementazione costruisce0x00 || 0x01 || PS || 0x00 || M
, dove M è fornito, mentre PS è la stringa di spaziatura interna. Le dimensioni della chiave RSA devono essere almeno 11 byte più grande del messaggio, altrimenti il metodo restituisceErrorCode::INVALID_INPUT_LENGTH
. - La spaziatura interna
PaddingMode::RSA_PKCS1_1_1_5_ENCRYPT
non richiede un digest. - La spaziatura interna
PaddingMode::RSA_PSS
richiede un digest, che potrebbe non essereDigest::NONE
. SeDigest::NONE
è specificato, il valore restituisceErrorCode::INCOMPATIBLE_DIGEST
. Inoltre, la dimensione della chiave RSA deve essere almeno 2 + D byte più grandi dell'output la dimensione del digest, dove D è la dimensione del digest, in byte. Altrimenti Il metodo restituisceErrorCode::INCOMPATIBLE_DIGEST
. Dimensione del sale è D. - La spaziatura interna
PaddingMode::RSA_OAEP
richiede un digest, che potrebbe non essereDigest::NONE
. SeDigest::NONE
è specificato, il valore restituisceErrorCode::INCOMPATIBLE_DIGEST
.
Chiavi EC
Le operazioni con i tasti EC specificano esattamente una modalità di spaziatura interna in inParams
.
Se non specificato o specificato più di una volta, il metodo
restituisce ErrorCode::UNSUPPORTED_PADDING_MODE
.
Le operazioni con le chiavi private (KeyPurpose::SIGN
) richiedono l'autorizzazione
di digest e spaziatura interna, il che significa che le autorizzazioni
devono contenere i valori specificati. In caso contrario, restituisci
ErrorCode::INCOMPATIBLE_DIGEST
. Operazioni sulle chiavi pubbliche
(KeyPurpose::VERIFY
) sono consentiti con digest o spaziatura interna non autorizzate.
Chiavi AES
Le operazioni con i tasti AES specificano esattamente una modalità di blocco e una modalità di spaziatura interna
a inParams
. Se uno dei due valori non è specificato o è specificato più
più di una volta, restituisci ErrorCode::UNSUPPORTED_BLOCK_MODE
oppure
ErrorCode::UNSUPPORTED_PADDING_MODE
. Le modalità specificate devono essere
autorizzato dalla chiave, altrimenti il metodo restituisce
ErrorCode::INCOMPATIBLE_BLOCK_MODE
o
ErrorCode::INCOMPATIBLE_PADDING_MODE
.
Se la modalità di blocco è BlockMode::GCM
, inParams
specifica Tag::MAC_LENGTH
,
il valore specificato è un multiplo di 8 non maggiore di 128
o inferiore al valore di Tag::MIN_MAC_LENGTH
nel
le autorizzazioni delle chiavi. Per lunghezze MAC superiori a 128 o non multipli di
8, restituisci ErrorCode::UNSUPPORTED_MAC_LENGTH
. Per valori inferiori
della lunghezza minima della chiave, restituisce ErrorCode::INVALID_MAC_LENGTH
.
Se la modalità di blocco è BlockMode::GCM
o BlockMode::CTR
,
la modalità di spaziatura interna specificata deve essere PaddingMode::NONE
.
Per BlockMode::ECB
o BlockMode::CBC
, la modalità potrebbe essere
PaddingMode::NONE
o PaddingMode::PKCS7
. Se la modalità di spaziatura interna
non soddisfa queste condizioni, restituisce ErrorCode::INCOMPATIBLE_PADDING_MODE
.
Se la modalità di blocco è BlockMode::CBC
, BlockMode::CTR
,
o BlockMode::GCM
, è necessario un nonce o un vettore di inizializzazione.
Nella maggior parte dei casi, i chiamanti non devono fornire un IV o un nonce. In questo caso,
L'implementazione Keymaster genera un IV o un nonce casuale e lo restituisce tramite
Tag::NONCE in outParams
.
Gli IV CBC e CTR sono 16 byte. I nonce GCM sono di 12 byte. Se la chiave
le autorizzazioni contengono
Tag::CALLER_NONCE,
il chiamante può fornire una IV/nonce con
Tag::NONCE
nel mese di inParams
. Se viene fornito un nonce quando
Tag::CALLER_NONCE
non è autorizzato, restituisci ErrorCode::CALLER_NONCE_PROHIBITED
.
Se non viene fornito un nonce quando
Tag::CALLER_NONCE
un IV/nonce casuale.
Chiavi HMAC
Le operazioni con le chiavi HMAC specificano Tag::MAC_LENGTH
in inParams
.
Il valore specificato deve essere un multiplo di 8 non maggiore del
lunghezza digest o inferiore al valore di Tag::MIN_MAC_LENGTH
nelle autorizzazioni della chiave. Per lunghezze MAC superiori alla lunghezza del digest o
non multipli di 8, restituisce ErrorCode::UNSUPPORTED_MAC_LENGTH
.
Per i valori inferiori alla lunghezza minima della chiave, restituisce
ErrorCode::INVALID_MAC_LENGTH
.
update
Versione: 1, 2, 3
Fornisce i dati da elaborare in un'operazione in corso avviata con begin.
L'operazione è specificata dal parametro operationHandle
.
Per offrire maggiore flessibilità nella gestione del buffer, le implementazioni di questo metodo
hanno la possibilità di consumare meno dati rispetto a quelli forniti. Il chiamante è
responsabile del loop per alimentare il resto dei dati nelle chiamate successive. La
la quantità di input consumata viene restituita nel parametro inputConsumed
.
Le implementazioni utilizzano sempre almeno un byte, a meno che il
l'operazione non può più accettare; se vengono forniti più di zero byte e
il consumo di byte, i chiamanti lo considerano un errore e interrompono l'operazione.
Le implementazioni possono anche scegliere la quantità di dati da restituire, come risultato aggiornamento. Ciò è pertinente solo per le operazioni di crittografia e decriptazione, le firme e la verifica non restituiscono dati fino al termine. Restituisci i dati il prima possibile, anziché memorizzarli nel buffer.
Gestione degli errori
Se questo metodo restituisce un codice di errore diverso da ErrorCode::OK
,
l'operazione viene interrotta e l'handle dell'operazione non è più valido. Qualsiasi
un uso futuro dell'handle, con questo metodo,
finire o interrompere,
restituisce ErrorCode::INVALID_OPERATION_HANDLE
.
Applicazione dell'autorizzazione
L'applicazione forzata dell'autorizzazione delle chiavi viene eseguita principalmente in begin. L'unica eccezione è il caso in cui la chiave abbia:
- Uno o più Tag::USER_SECURE_ID e
- Non ha un Tag::AUTH_TIMEOUT
In questo caso, la chiave richiede un'autorizzazione per ogni operazione e l'aggiornamento
riceve un Tag::AUTH_TOKEN
nell'argomento inParams
. HMAC verifica che il token sia valido e contenga
a un ID utente sicuro corrispondente, corrisponda a
Tag::USER_AUTH_TYPE,
e contiene l'handle dell'operazione corrente
campo della sfida. Se queste condizioni non sono soddisfatte, restituisci
ErrorCode::KEY_USER_NOT_AUTHENTICATED
.
Il chiamante fornisce il token di autenticazione a ogni chiamata per aggiornare finisci. L'implementazione deve convalidare il token solo una volta, se preferisci.
Chiavi RSA
Per le operazioni di firma e verifica con Digest::NONE
,
questo metodo accetta la firma o la verifica dell'intero blocco in un'unica
aggiornamento. Non può consumare solo una parte del blocco. Tuttavia, se il chiamante
sceglie di fornire i dati in più aggiornamenti, questo metodo li accetta.
Se il chiamante fornisce più dati da firmare di quanti ne è possibile utilizzare (lunghezza
superano le dimensioni della chiave RSA), restituiscono ErrorCode::INVALID_INPUT_LENGTH
.
Chiavi ECDSA
Per le operazioni di firma e verifica con Digest::NONE
,
questo metodo accetta la firma o la verifica dell'intero blocco in un'unica
aggiornamento. Questo metodo non può consumare solo una parte del blocco.
Tuttavia, se il chiamante sceglie di fornire i dati in più aggiornamenti, questo metodo lo accetta. Se il chiamante fornisce più dati per firmare di quello che è possibile utilizzare, i dati vengono troncati automaticamente. (Ciò differisce dal dei dati in eccesso forniti in operazioni RSA simili. Il motivo è la compatibilità con i client legacy).
Chiavi AES
La modalità AES-GCM supporta i "dati di autenticazione associati", forniti tramite
Tag::ASSOCIATED_DATA
nell'argomento inParams
.
I dati associati potrebbero essere forniti in chiamate ripetute (importante se
i dati sono troppo grandi per essere inviati in un solo blocco), ma sono sempre precedenti ai dati
essere criptati o decriptati. Una chiamata di aggiornamento può ricevere entrambi i dati associati
e i dati da criptare/decriptare, ma gli aggiornamenti successivi potrebbero non includere
e i dati di Google Cloud. Se il chiamante fornisce i dati associati a una chiamata di aggiornamento al termine di una chiamata
che include dati da criptare/decriptare, restituire ErrorCode::INVALID_TAG
.
Per la crittografia GCM, il tag viene aggiunto al testo crittografato da
finire. Durante la decrittografia, l'ultima
Tag::MAC_LENGTH
byte dei dati forniti all'ultimo
aggiornamento è il tag. Poiché una determinata chiamata
update non può sapere se si tratta dell'ultima chiamata,
elabora tutti i tag tranne la lunghezza e memorizza nel buffer i possibili dati di tag
alla fine.
fine
Versione: 1, 2, 3
Completa un'operazione in corso iniziata con begin di tutti i dati non ancora elaborati forniti aggiornamenti.
Questo metodo è l'ultimo chiamato in un'operazione, quindi vengono restituiti i dati elaborati.
Se viene completato correttamente o restituisce un errore, questo metodo finalizza
dell'operazione e, di conseguenza, invalida l'handle dell'operazione fornito. Qualsiasi
utilizzo futuro dell'handle, con questo metodo o update oppure
abort, restituisce ErrorCode::INVALID_OPERATION_HANDLE
.
Le operazioni di firma restituiscono la firma come output. Operazioni di verifica
accettano la firma nel parametro signature
e non restituiscono alcun output.
Applicazione dell'autorizzazione
L'applicazione forzata dell'autorizzazione delle chiavi viene eseguita principalmente inizia. L'unica eccezione è il caso in cui la chiave abbia:
- Uno o più Tag::USER_SECURE_ID e
- Non ha un Tag::AUTH_TIMEOUT
In questo caso, la chiave richiede un'autorizzazione per ogni operazione e l'aggiornamento
riceve un Tag::AUTH_TOKEN
nell'argomento inParams
. HMAC verifica che il token
sia valido e contenga un ID utente sicuro corrispondente, corrisponde a quello della chiave
Tag::USER_AUTH_TYPE e
contiene l'handle dell'operazione corrente
campo della sfida. Se queste condizioni non sono soddisfatte, restituisci
ErrorCode::KEY_USER_NOT_AUTHENTICATED
.
Il chiamante fornisce il token di autenticazione a ogni chiamata a update e finish. L'implementazione deve convalidare il token solo una volta, se preferisci.
Chiavi RSA
Di seguito sono riportati alcuni requisiti aggiuntivi, a seconda della modalità di spaziatura interna:
PaddingMode::NONE
. Per le operazioni di firma e crittografia senza padding, Se i dati forniti sono più corti della chiave, i dati hanno il riempimento pari a zero a sinistra prima di eseguire la firma/crittografia. Se i dati sono della stessa lunghezza della chiave, ma numericamente più grande, restituisceErrorCode::INVALID_ARGUMENT
. Per operazioni di verifica e decriptazione, i dati devono essere lunghi come chiave. Altrimenti, restituisciErrorCode::INVALID_INPUT_LENGTH.
PaddingMode::RSA_PSS
. Per le operazioni di firma con riempitivo PSS, il sale PSS è la dimensione del digest del messaggio e generato in modo casuale. Il digest specificato con Tag::DIGEST ininputParams
su begin viene utilizzato come digest PSS e l'algoritmo digest MGF1.PaddingMode::RSA_OAEP
. Il digest specificato con Tag::DIGEST ininputParams
di begin viene utilizzato come OAEP algoritmo digest e SHA1 è utilizzato come algoritmo digest MGF1.
Chiavi ECDSA
Se i dati forniti per la firma o la verifica senza padding sono troppo lunghi, troncali li annotino.
Chiavi AES
Alcune condizioni aggiuntive, a seconda della modalità di blocco:
BlockMode::ECB
oBlockMode::CBC
. Se la spaziatura interna èPaddingMode::NONE
e il valore la lunghezza dei dati non è un multiplo della dimensione del blocco AES,ErrorCode::INVALID_INPUT_LENGTH
. Se la spaziatura interna èPaddingMode::PKCS7
, inserisci i dati in base alla specifica PKCS#7. Tieni presente che PKCS#7 consiglia di aggiungere un ulteriore blocco di spaziatura interna se i dati sono un multiplo della lunghezza del blocco.BlockMode::GCM
. Durante la crittografia, dopo l'elaborazione testo non crittografato, calcola il tag (Tag::MAC_LENGTH byte) e la aggiungerai al testo crittografato restituito. Durante la decrittografia, elabora l'ultimo Tag::MAC_LENGTH byte come tag. Se la verifica del tag non va a buon fine, restituisciErrorCode::VERIFICATION_FAILED
.
interrompi
Versione: 1, 2, 3
Interrompe l'operazione in corso. Al termine della chiamata, torna indietro
ErrorCode::INVALID_OPERATION_HANDLE
per
qualsiasi utilizzo successivo dell'handle dell'operazione fornito con update,
terminare o interrompere.
algoritmi_supportati
Versione: 1
Restituisce l'elenco di algoritmi supportati dall'hardware Keymaster implementazione. Un'implementazione software restituisce un elenco vuoto; un ibrido di implementazione restituisce un elenco contenente solo gli algoritmi supportati dall'hardware.
Le implementazioni Keymaster 1 supportano RSA, EC, AES e HMAC.
modalità_di_blocco_supportate
Versione: 1
Restituisce l'elenco delle modalità di blocco AES supportate dall'hardware Keymaster per un algoritmo e uno scopo specifici.
Per RSA, EC e HMAC, che non sono crittografie a blocchi, il metodo restituisce un
vuoto per tutti gli scopi validi. Per motivi non validi, il metodo non dovrebbe
restituisce ErrorCode::INVALID_PURPOSE
.
Le implementazioni Keymaster 1 supportano ECB, CBC, CTR e GCM per AES la crittografia e la decrittografia.
modalità_porto_spaziatura_supportata
Versione: 1
Restituisce l'elenco delle modalità di spaziatura interna supportate dall'hardware Keymaster per un algoritmo e uno scopo specifici.
HMAC ed EC non hanno la nozione di spaziatura interna, quindi il metodo restituisce un elenco vuoto
per tutti gli scopi validi. Gli scopi non validi devono causare la restituzione del metodo
ErrorCode::INVALID_PURPOSE
.
Per gli RSA, le implementazioni Keymaster 1 supportano:
- Crittografia, decrittografia, firma e verifica senza riempimenti. Non imbottiti la crittografia e la firma, se il messaggio è più breve del modulo pubblico, le implementazioni devono contenere degli zeri. Per la decrittografia senza padding la lunghezza dell'input deve corrispondere alle dimensioni del modulo pubblico.
- Modalità di crittografia e spaziatura interna della firma PKCS#1 v1.5
- PSS con una lunghezza minima di sale di 20
- OAEP
Per AES in modalità ECB e CBC, le implementazioni Keymaster 1 non supportano e PKCS#7. Le modalità CTR e GCM non supportano solo la spaziatura interna.
digest_supportato
Versione: 1
Restituisce l'elenco delle modalità digest supportate dall'hardware Keymaster per un algoritmo e uno scopo specifici.
Nessuna modalità AES supporta o richiede la digestione, quindi il metodo restituisce un per scopi validi.
Le implementazioni Keymaster 1 possono implementare un sottoinsieme delle digest. Le implementazioni forniscono SHA-256 e possono fornire MD5, SHA1, SHA-224, SHA-256, SHA384 e SHA512 (l'insieme completo dei digest definiti).
formati_importazione_supportati
Versione: 1
Restituisce l'elenco dei formati di importazione supportati dall'hardware Keymaster di un determinato algoritmo.
Le implementazioni Keymaster 1 supportano il formato PKCS#8 (senza password (protezione) per l'importazione di coppie di chiavi RSA ed EC e supporta l'importazione RAW Materiale delle chiavi AES e HMAC.
formati_esportazione_supportati
Versione: 1
Restituisce l'elenco dei formati di esportazione supportati dall'hardware Keymaster di un determinato algoritmo.
Le implementazioni Keymaster1 supportano il formato X.509 per l'esportazione di RSA e Chiavi pubbliche EC. L'esportazione di chiavi private o asimmetriche non è supportata.
Funzioni storiche
Keymaster 0
Le seguenti funzioni appartengono alla definizione originale di Keymaster 0. Loro nello struct Keymaster 1 keymaster1_device_t. Tuttavia, in Keymaster 1.0 non erano implementati e i loro puntatori di funzione erano impostati su NULL.
generate_keypair
import_keypair
get_keypair_public
delete_keypair
delete_all
sign_data
Verify_data
Keymaster 1
Le seguenti funzioni appartengono alla definizione di Keymaster 1, ma erano rimosso in Keymaster 2, insieme alle funzioni Keymaster 0 elencate sopra.
get_supported_algorithms
get_supported_block_modes
get_supported_padding_modes
get_supported_digests
get_supported_import_formats
get_supported_export_formats
Keymaster 2
Le seguenti funzioni appartengono alla definizione di Keymaster 2, ma erano rimosso in Keymaster 3, insieme alle funzioni di Keymaster 1 elencate sopra.
configure