Ta strona zawiera szczegółowe informacje pomocne osobom wdrażającym warstwy Keymaster HAL. Obejmuje każdy tag w HAL, w której wersji Keymaster ten tag jest dostępny i czy tag jest powtarzalny. Z wyjątkiem przypadków opisanych w opisach tagów, wszystkie poniższe tagi są używane podczas generowania klucza do określenia kluczowych cech.
W przypadku Keymaster 4 tagi są zdefiniowane w platform/hardware/interfaces/keymaster/ keymaster-version /types.hal
, na przykład 3.0/types.hal dla Keymaster 3 i 4.0/types.hal dla Keymaster 4. Dla Keymaster 2 i starszych, znaczniki są zdefiniowane w platform/hardware/libhardware/include/hardware/keymaster_defs.h
.
Aby zapoznać się z funkcjami, zobacz stronę Funkcje klawiatury .
Tag::ACTIVE_DATETIME
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa datę i godzinę, w której klucz staje się aktywny. Przed tym czasem każda próba użycia klucza kończy się niepowodzeniem z ErrorCode::KEY_NOT_YET_VALID
.
Wartość jest 64-bitową liczbą całkowitą reprezentującą milisekundy od 1 stycznia 1970 r.
Tag::ALGORYTM
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa algorytm kryptograficzny, z którym używany jest klucz.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class Algorithm : uint32_t { RSA = 1, EC = 3, AES = 32, HMAC = 128, };Keymaster 2 i wcześniejsze
typedef enum { KM_ALGORITHM_RSA = 1, KM_ALGORITHM_EC = 3, KM_ALGORITHM_AES = 32, KM_ALGORITHM_HMAC = 128, } keymaster_algorithm_t;
Tag::ALL_APPLICATIONS
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Zarezerwowane do wykorzystania w przyszłości.
Tag::ALLOW_WHILE_ON_BODY
Wersja : 2, 3, 4
powtarzalne ? NIE
Ten tag ma zastosowanie tylko do urządzeń Android Wear z czujnikami na ciele. W tym momencie nie oczekuje się, że jakikolwiek TEE będzie w stanie zapewnić bezpieczny dostęp do czujnika na ciele lub że czujniki na ciele są bardzo bezpieczne, więc oczekuje się, że będzie to funkcja wymuszona wyłącznie przez oprogramowanie.
Tag::ALL_USERS
Wersja : 3, 4
powtarzalne ? NIE
Zarezerwowane do wykorzystania w przyszłości.
Tag::APPLICATION_DATA
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
W przypadku podania do generateKey lub importKey ten tag określa dane, które są niezbędne podczas wszystkich zastosowań klucza. W szczególności wywołania exportKey i getKeyCharacteristics muszą zapewnić taką samą wartość parametrowi clientId
, a wywołania begin muszą podać ten znacznik i te same powiązane dane jako część zestawu inParams
. Jeśli nie podano poprawnych danych, funkcja zwraca ErrorCode::INVALID_KEY_BLOB
.
Zawartość tego znacznika jest kryptograficznie powiązana z kluczem, co oznacza, że przeciwnik, który ma dostęp do wszystkich chronionych tajemnic światowych, ale nie ma dostępu do zawartości znacznika, nie może mieć możliwości odszyfrowania klucza bez brutalnego użycia znacznika zawartość, której aplikacje mogą zapobiec, określając zawartość o wystarczająco wysokiej entropii.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::APPLICATION_ID
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
W przypadku podania do generateKey lub importKey ten tag określa dane, które są niezbędne podczas wszystkich zastosowań klucza. W szczególności wywołania exportKey i getKeyCharacteristics muszą zawierać tę samą wartość w parametrze clientId
, a wywołania begin muszą podać ten znacznik i te same powiązane dane jako część zestawu inParams
. Jeśli nie podano poprawnych danych, funkcja zwraca ErrorCode::INVALID_KEY_BLOB
.
Zawartość tego znacznika jest powiązana z kluczem kryptograficznie , co oznacza, że przeciwnik, który ma dostęp do wszystkich chronionych tajemnic światowych — ale nie ma dostępu do treści znacznika — nie może odszyfrować klucza (bez brutalnego wymuszenia zawartości znacznika ).
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ASSOCIATED_DATA
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Zapewnia „powiązane dane” do szyfrowania lub deszyfrowania AES-GCM. Ten znacznik służy do aktualizowania i określania danych, które nie są szyfrowane/odszyfrowywane, ale są używane do obliczania znacznika GCM.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_APPLICATION_ID
Wersja : 3, 4
powtarzalne ? NIE
Służy do identyfikacji zestawu możliwych aplikacji, z których jedna zainicjowała kluczową atestację.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_CHALLENGE
Wersja : 3, 4
powtarzalne ? NIE
Używane do rzucania wyzwania w zaświadczeniu.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_BRAND
Wersja : 3, 4
powtarzalne ? NIE
Zawiera markę urządzenia zwróconą przez Build.BRAND
w systemie Android. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_DEVICE
Wersja : 3, 4
powtarzalne ? NIE
Zawiera nazwę urządzenia zwróconą przez Build.DEVICE
w systemie Android. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_IMEI
Wersja : 3, 4
powtarzalne ? Tak
Zapewnia numery IMEI dla wszystkich radiotelefonów w urządzeniu. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_MANUFACTURER
Wersja : 3, 4
powtarzalne ? NIE
Zawiera nazwę producenta urządzenia zwróconą przez Build.MANUFACTURER
w systemie Android. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_MEID
Wersja : 3, 4
powtarzalne ? Tak
Zapewnia identyfikatory MEID dla wszystkich radiotelefonów w urządzeniu. To pole zostanie ustawione tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_MODEL
Wersja : 3, 4
powtarzalne ? NIE
Zawiera nazwę modelu urządzenia zwróconą przez Build.MODEL
w systemie Android. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_PRODUCT
Wersja : 3, 4
powtarzalne ? NIE
Zawiera nazwę produktu urządzenia zwróconą przez Build.PRODUCT
w systemie Android. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::ATTESTATION_ID_SERIAL
Wersja : 3, 4
powtarzalne ? NIE
Podaje numer seryjny urządzenia. To pole jest ustawiane tylko w przypadku żądania poświadczenia identyfikatorów urządzenia.
Jeśli urządzenie nie obsługuje poświadczania identyfikatorów (lub wcześniej wywołano destroyAttestationIds()
i urządzenie nie może już poświadczać swoich identyfikatorów), każde żądanie poświadczenia klucza, które zawiera ten znacznik, zakończy się niepowodzeniem z błędem ErrorCode::CANNOT_ATTEST_IDS
.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::AUTH_TIMEOUT
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa czas w sekundach, przez jaki klucz jest autoryzowany do użycia, po uwierzytelnieniu. Jeśli Tag::USER_SECURE_ID jest obecny, a tego tagu nie ma, klucz wymaga uwierzytelnienia przy każdym użyciu (szczegółowe informacje na temat przepływu uwierzytelniania na operację można znaleźć na początku ).
Wartość jest 32-bitową liczbą całkowitą określającą czas w sekundach po pomyślnym uwierzytelnieniu użytkownika określonego przez Tag::USER_SECURE_ID za pomocą metody uwierzytelnienia określonej przez Tag::USER_AUTH_TYPE , kiedy klucz może być użyty.
Tag::AUTH_TOKEN
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Zapewnia token uwierzytelniania , aby rozpocząć , zaktualizować lub zakończyć , aby udowodnić uwierzytelnienie użytkownika dla operacji klucza, która tego wymaga (klucz ma Tag::USER_SECURE_ID ).
Wartość jest obiektem blob, który zawiera strukturę hw_auth_token_t
.
Tag::BLOB_USAGE_REQUIREMENTS
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa warunki środowiska systemowego niezbędne do użycia wygenerowanego klucza.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class KeyBlobUsageRequirements : uint32_t { STANDALONE = 0, REQUIRES_FILE_SYSTEM = 1, };Keymaster 2 i wcześniejsze
typedef enum { KM_BLOB_STANDALONE = 0, KM_BLOB_REQUIRES_FILE_SYSTEM = 1, } keymaster_key_blob_usage_requirements_t;
Ten znacznik można określić podczas generowania klucza, aby wymagał, aby klucz nadawał się do użytku w określonych warunkach. Musi zostać zwrócony z kluczowymi cechami z generateKey i getKeyCharacteristics . Jeśli wywołujący określi Tag::BLOB_USAGE_REQUIREMENTS
z wartością KeyBlobUsageRequirements::STANDALONE
trustlet zwróci kluczowy obiekt blob, którego można używać bez obsługi systemu plików. Ma to krytyczne znaczenie w przypadku urządzeń z zaszyfrowanymi dyskami, w przypadku których system plików może być niedostępny dopiero po użyciu klucza Keymaster do odszyfrowania dysku.
Tag::BLOCK_MODE
Wersja : 1, 2, 3, 4
powtarzalne ? Tak
Określa tryby szyfrowania blokowego, z którymi może być używany klucz. Ten tag dotyczy tylko kluczy AES.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class BlockMode : uint32_t { ECB = 1, CBC = 2, CTR = 3, GCM = 32, };Keymaster 2 i wcześniejsze
typedef enum { KM_MODE_ECB = 1, KM_MODE_CBC = 2, KM_MODE_CTR = 3, KM_MODE_GCM = 32, } keymaster_block_mode_t;
Ten znacznik jest powtarzalny, a dla operacji na klawiszach AES określ tryb w argumencie additionalParams
metody begin . Jeśli określony tryb nie znajduje się w trybach skojarzonych z kluczem, operacja kończy się niepowodzeniem z ErrorCode::INCOMPATIBLE_BLOCK_MODE
.
Tag::BOOT_PATCHLEVEL
Wersja : 4
Tag::BOOT_PATCHLEVEL określa poziom poprawki bezpieczeństwa obrazu rozruchowego (jądra), z którym można użyć klucza. Ten znacznik nigdy nie jest wysyłany do głównego TA, ale jest dodawany do listy autoryzacji wymuszonych sprzętowo przez TA. Każda próba użycia klucza z wartością Tag::BOOT_PATCHLEVEL
inną niż bieżący poziom poprawki systemowej powoduje, że metody begin()
, getKeyCharacteristics()
lub exportKey()
zwracają ErrorCode::KEY_REQUIRES_UPGRADE
. Zobacz upgradeKey()
po szczegóły.
Wartością znacznika jest liczba całkowita w postaci RRRRMMDD, gdzie RRRR to czterocyfrowy rok ostatniej aktualizacji, MM to dwucyfrowy miesiąc, a DD to dwucyfrowy dzień ostatniej aktualizacji. Na przykład dla klucza wygenerowanego na urządzeniu z systemem Android, którego ostatnia aktualizacja miała miejsce 5 czerwca 2018 r., wartością będzie 20180605. Jeśli dzień nie jest znany, można wstawić 00.
Podczas każdego rozruchu program ładujący musi zapewnić poziom poprawki obrazu rozruchowego w bezpiecznym środowisku (mechanizm jest zdefiniowany przez implementację).
Musi być wymuszany sprzętowo.
Tag::BOOTLOADER_ONLY
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa, że tylko program ładujący może używać klucza.
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Każda próba użycia klucza z Tag::BOOTLOADER_ONLY
z systemu Android kończy się niepowodzeniem z ErrorCode::INVALID_KEY_BLOB
.
Tag::CALLER_NONCE
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa, że obiekt wywołujący może podać wartość jednorazową dla operacji niewymagających.
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Ten tag jest używany tylko dla kluczy AES i ma znaczenie tylko dla trybów bloków CBC, CTR i GCM. Jeśli tag nie jest obecny, implementacje powinny odrzucać wszelkie operacje, które dostarczają Tag::NONCE rozpoczynające się od ErrorCode::CALLER_NONCE_PROHIBITED
.
Tag::CREATION_DATETIME
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa datę i godzinę utworzenia klucza, w milisekundach od 1 stycznia 1970 r. Ten znacznik jest opcjonalny i służy wyłącznie do celów informacyjnych.
Tag::SPIS
Wersja : 1, 2, 3, 4
powtarzalne ? Tak
Określa algorytmy skrótu, które mogą być używane z kluczem do wykonywania operacji podpisywania i weryfikacji. Ten znacznik dotyczy kluczy RSA, ECDSA i HMAC.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class Digest : uint32_t { NONE = 0, MD5 = 1, SHA1 = 2, SHA_2_224 = 3, SHA_2_256 = 4, SHA_2_384 = 5, SHA_2_512 = 6, };Keymaster 2 i wcześniejsze
typedef enum { KM_DIGEST_NONE = 0, KM_DIGEST_MD5 = 1, KM_DIGEST_SHA1 = 2, KM_DIGEST_SHA_2_224 = 3, KM_DIGEST_SHA_2_256 = 4, KM_DIGEST_SHA_2_384 = 5, KM_DIGEST_SHA_2_512 = 6, } keymaster_digest_t;
Ten tag jest powtarzalny. W przypadku operacji podpisywania i weryfikacji podaj skrót w argumencie additionalParams
metody begin . Jeśli określonego skrótu nie ma w skrótach skojarzonych z kluczem, operacja kończy się niepowodzeniem z ErrorCode::INCOMPATIBLE_DIGEST
.
Tag::EC_CURVE
Wersja : 2, 3, 4
powtarzalne ? NIE
W Keymaster 1 krzywa używana dla kluczy EC została odgadnięta na podstawie określonego rozmiaru klucza. Aby poprawić elastyczność, w Keymaster 2 wprowadzono wyraźny sposób określania krzywych. Żądania generowania klucza EC mogą mieć Tag::EC_CURVE
, Tag::KEY_SIZE
lub oba.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };Keymaster 2 i wcześniejsze
enum class EcCurve : uint32_t { P_224 = 0, P_256 = 1, P_384 = 2, P_521 = 3, };
Jeśli żądanie generowania zawiera tylko Tag::KEY_SIZE
, powróć do logiki Keymaster 1, wybierając odpowiednią krzywą NIST.
Jeśli żądanie zawiera tylko Tag::EC_CURVE
, użyj określonej krzywej. W Keymaster 3 i późniejszych krzywe są definiowane w EcCurve
. Dla Keymaster 2 i wcześniejszych krzywe są zdefiniowane w keymaster_ec_curve_t
.
Jeśli żądanie zawiera oba elementy, użyj krzywej określonej przez Tag::EC_CURVE
i sprawdź, czy określony rozmiar klucza jest odpowiedni dla tej krzywej. Jeśli nie, zwróć ErrorCode::INVALID_ARGUMENT
.
Tag::INCLUDE_UNIQUE_ID
Wersja : 2, 3, 4
powtarzalne ? NIE
Ten tag jest określany podczas generowania klucza, aby wskazać, że certyfikat zaświadczający dla wygenerowanego klucza powinien zawierać identyfikator unikatowy dla urządzenia w zakresie aplikacji i ograniczony czasowo, zgodnie z parametrem Tag::UNIQUE_ID .
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Tag::KEY_SIZE
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa rozmiar klucza w bitach, mierzony w normalny sposób dla algorytmu klucza. Na przykład dla kluczy RSA Tag::KEY_SIZE
określa rozmiar modułu publicznego. W przypadku kluczy AES określa długość materiału tajnego klucza.
Tag::MAC_LENGTH
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Podaje żądaną długość znacznika uwierzytelniania MAC lub GCM w bitach.
Wartość to długość MAC w bitach. Jest to wielokrotność 8 i co najmniej tak duża, jak wartość Tag::MIN_MAC_LENGTH powiązana z kluczem.
Tag::MAX_USES_PER_BOOT
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa maksymalną liczbę przypadków użycia klucza między ponownymi uruchomieniami systemu. Jest to kolejny mechanizm ograniczania szybkości użycia klucza.
Wartość jest 32-bitową liczbą całkowitą reprezentującą użycie na rozruch.
Gdy klucz z tym znacznikiem jest używany w operacji, licznik związany z kluczem powinien zostać zwiększony podczas wywołania begin . Gdy licznik klucza przekroczy tę wartość, wszystkie kolejne próby użycia klucza kończą się niepowodzeniem z ErrorCode::MAX_OPS_EXCEEDED
do momentu ponownego uruchomienia urządzenia. Oznacza to, że trustlet przechowuje tabelę liczników użycia dla kluczy z tym znacznikiem. Ponieważ pamięć Keymaster jest często ograniczona, ta tabela może mieć ustalony maksymalny rozmiar, a Keymaster może zakończyć się niepowodzeniem operacji, które próbują użyć kluczy z tym znacznikiem, gdy tabela jest pełna. Stół musi pomieścić co najmniej 16 kluczy. Jeśli operacja nie powiedzie się, ponieważ tabela jest pełna, Keymaster zwraca ErrorCode::TOO_MANY_OPERATIONS
.
Tag::MIN_MAC_LENGTH
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Ten znacznik określa minimalną długość adresu MAC, którego można zażądać lub zweryfikować za pomocą tego klucza dla kluczy HMAC i kluczy AES obsługujących tryb GCM.
Ta wartość to minimalna długość adresu MAC w bitach. Jest to wielokrotność 8. W przypadku kluczy HMAC wartość wynosi co najmniej 64. W przypadku kluczy GCM wartość wynosi co najmniej 96 i nie więcej niż 128.
Tag::MIN_SECONDS_BETWEEN_OPS
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa minimalny czas, jaki upływa między dozwolonymi operacjami przy użyciu klucza. Można to wykorzystać do ograniczenia szybkości użycia kluczy w kontekstach, w których nieograniczone użycie może umożliwić ataki siłowe.
Wartość jest 32-bitową liczbą całkowitą reprezentującą sekundy między dozwolonymi operacjami.
Gdy klawisz z tym znacznikiem jest używany w operacji, uruchom stoper podczas zakończenia lub przerwania połączenia. Każde wywołanie rozpoczęcia , które zostanie odebrane przed licznikiem czasu, wskazuje, że interwał określony przez Tag::MIN_SECONDS_BETWEEN_OPS
upłynął, kończy się niepowodzeniem z ErrorCode::KEY_RATE_LIMIT_EXCEEDED
. Oznacza to, że trustlet przechowuje tabelę liczników użycia dla kluczy z tym znacznikiem. Ponieważ pamięć Keymaster jest często ograniczona, ta tabela może mieć ustalony maksymalny rozmiar, a Keymaster może zakończyć się niepowodzeniem operacji, które próbują użyć kluczy z tym znacznikiem, gdy tabela jest pełna. Stół musi pomieścić co najmniej 32 używane klucze i agresywnie ponownie wykorzystywać miejsca na stole, gdy wygasną minimalne interwały użycia klucza. Jeśli operacja nie powiedzie się, ponieważ tabela jest pełna, Keymaster zwraca ErrorCode::TOO_MANY_OPERATIONS
.
Tag::NO_AUTH_REQUIRED
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa, że do użycia tego klucza nie jest wymagane uwierzytelnianie. Ten tag wyklucza się wzajemnie z Tag::USER_SECURE_ID .
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Tag::NIE
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Dostarcza lub zwraca wartość nonce lub wektor inicjujący (IV) dla szyfrowania lub odszyfrowywania AES GCM, CBC lub CTR. Ten tag jest dostarczany, aby rozpocząć się podczas operacji szyfrowania i deszyfrowania. Jest dostarczany tylko na początek , jeśli klucz ma Tag::CALLER_NONCE . Jeśli nie zostanie podany, odpowiedni identyfikator jednorazowy lub IV zostanie losowo wygenerowany przez Keymaster i zwrócony od początku.
Wartość to blob, tablica bajtów o dowolnej długości. Dozwolone długości zależą od trybu: Jednostki GCM mają długość 12 bajtów; CBC i CTR IV mają długość 16 bajtów.
Tag::POCHODZENIE
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa miejsce utworzenia klucza, jeśli jest znane. Ten znacznik nie może być określony podczas generowania lub importowania klucza i musi zostać dodany do charakterystyki klucza przez trustlet.
Klucznik 3 Możliwe wartości są zdefiniowane w android::hardware::keymaster::v3_0::KeyOrigin
:
enum class KeyOrigin : uint32_t { GENERATED = 0, DERIVED = 1, IMPORTED = 2, UNKNOWN = 3, };Keymaster 2 i starsze
Możliwe wartości są zdefiniowane w keymaster_origin_t
:
typedef enum { KM_ORIGIN_GENERATED = 0, KM_ORIGIN_IMPORTED = 2, KM_ORIGIN_UNKNOWN = 3, } keymaster_key_origin_t
Pełne znaczenie wartości zależy nie tylko od wartości, ale także od tego, czy znajduje się na liście cech wymuszanych sprzętowo, czy programowo.
GENERATED
wskazuje, że Keymaster wygenerował klucz. Jeśli znajduje się na liście wymuszanej sprzętowo, klucz został wygenerowany w bezpiecznym sprzęcie i jest trwale powiązany sprzętowo. Jeśli na liście wymuszanej programowo, klucz został wygenerowany w SoftKeymaster i nie jest powiązany sprzętowo.
DERIVED
wskazuje, że klucz został wyprowadzony wewnątrz Keymaster. Prawdopodobnie istnieje poza urządzeniem.
IMPORTED
wskazuje, że klucz został wygenerowany poza Keymaster i zaimportowany do Keymaster. Jeśli znajduje się na liście wymuszanej sprzętowo, jest trwale związany ze sprzętem, chociaż mogą istnieć kopie poza bezpiecznym sprzętem. Jeśli na liście wymusza oprogramowanie, klucz został zaimportowany do SoftKeymaster i nie jest związany ze sprzętem.
UNKNOWN
powinien pojawić się tylko na liście wymuszonej sprzętowo. Wskazuje, że klucz jest powiązany sprzętowo, ale nie wiadomo, czy klucz został pierwotnie wygenerowany w bezpiecznym sprzęcie, czy też został zaimportowany. Dzieje się tak tylko wtedy, gdy sprzęt keymaster0 jest używany do emulacji usług keymaster1.
Tag::ORIGINATION_EXPIRE_DATETIME
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa datę i godzinę wygaśnięcia klucza do celów podpisywania i szyfrowania. Po tym czasie każda próba użycia klucza z KeyPurpose::SIGN lub KeyPurpose::ENCRYPT podana do rozpoczęcia kończy się niepowodzeniem z ErrorCode::KEY_EXPIRED
.
Wartość jest 64-bitową liczbą całkowitą reprezentującą milisekundy od 1 stycznia 1970 r.
Tag::OS_PATCHLEVEL
Wersja : 2, 3, 4
powtarzalne ? NIE
Ten znacznik nigdy nie jest wysyłany do głównego TA, ale jest dodawany do listy autoryzacji wymuszonych sprzętowo przez TA.
Wartością znacznika jest liczba całkowita w postaci RRRRMM, gdzie RRRR to czterocyfrowy rok ostatniej aktualizacji, a MM to dwucyfrowy miesiąc ostatniej aktualizacji. Na przykład dla klucza wygenerowanego na urządzeniu z Androidem ostatnio zaktualizowanym w grudniu 2015 r. wartość wyniosłaby 201512.
Klawisze, które mają inny poziom patcha niż aktualny poziom patcha, nie są użyteczne. Próba użycia takiego klucza powoduje, że metody begin , getKeyCharacteristics lub exportKey zwracają błąd ErrorCode::KEY_REQUIRES_UPGRADE
. Zobacz Powiązanie wersji , aby uzyskać więcej informacji.
Tag::OS_VERSION
Wersja : 2, 3, 4
powtarzalne ? NIE
Ten znacznik nigdy nie jest wysyłany do głównego TA, ale jest dodawany do listy autoryzacji wymuszonych sprzętowo przez TA.
Wartością znacznika jest liczba całkowita w postaci MMmmss, gdzie MM to numer wersji głównej, mm to numer wersji pomocniczej, a ss to numer wersji podrzędnej. Na przykład dla klucza wygenerowanego w systemie Android w wersji 4.0.3 wartość to 040003.
Tag::PADDING
Wersja : 1, 2, 3, 4
powtarzalne ? Tak
Określa tryby dopełnienia, które mogą być używane z klawiszem. Ten znacznik dotyczy kluczy RSA i AES.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class PaddingMode : uint32_t { NONE = 1, RSA_OAEP = 2, RSA_PSS = 3, RSA_PKCS1_1_5_ENCRYPT = 4, RSA_PKCS1_1_5_SIGN = 5, PKCS7 = 64, };Keymaster 2 i wcześniejsze
typedef enum { KM_PAD_NONE = 1, KM_PAD_RSA_OAEP = 2, KM_PAD_RSA_PSS = 3, KM_PAD_RSA_PKCS1_1_5_ENCRYPT = 4, KM_PAD_RSA_PKCS1_1_5_SIGN = 5, KM_PAD_PKCS7 = 64, } keymaster_padding_t;
PaddingMode::RSA_OAEP
i PaddingMode::RSA_PKCS1_1_5_ENCRYPT
są używane tylko dla kluczy szyfrowania/odszyfrowywania RSA i określają odpowiednio dopełnienie RSA PKCS#1v2 OAEP i losowe dopełnienie RSA PKCS#1 v1.5. PaddingMode::RSA_PSS
i PaddingMode::RSA_PKCS1_1_5_SIGN
są używane tylko do kluczy podpisywania/weryfikacji RSA i określają odpowiednio dopełnienie RSA PKCS#1v2 PSS i dopełnienie deterministyczne RSA PKCS#1 v1.5.
PaddingMode::NONE
może być używany z kluczami RSA lub AES. W przypadku kluczy AES, jeśli PaddingMode::NONE
jest używany z trybem blokowym ECB lub CBC, a dane do zaszyfrowania lub odszyfrowania nie są wielokrotnością rozmiaru bloku AES, wywołanie zakończenia kończy się niepowodzeniem z ErrorCode::INVALID_INPUT_LENGTH
.
PaddingMode::PKCS7
może być używany tylko z kluczami AES i tylko z trybami EBC i CBC.
Ten tag jest powtarzalny. Aby rozpocząć , w wywołaniu należy określić tryb uzupełniania. Jeśli określony tryb nie jest autoryzowany dla klucza, operacja kończy się niepowodzeniem z ErrorCode::INCOMPATIBLE_BLOCK_MODE
.
Tag::CEL
Wersja : 1, 2, 3, 4
powtarzalne ? Tak
Określa zestaw celów, do których może być używany klucz.
Możliwe wartości są zdefiniowane przez następujące wyliczenie:
Keymaster 3enum class KeyPurpose : uint32_t { ENCRYPT = 0, DECRYPT = 1, SIGN = 2, VERIFY = 3, DERIVE_KEY = 4, // since 3.0 WRAP_KEY = 5, // since 3.0 };Keymaster 2 i wcześniejsze
typedef enum { KM_PURPOSE_ENCRYPT = 0, KM_PURPOSE_DECRYPT = 1, KM_PURPOSE_SIGN = 2, KM_PURPOSE_VERIFY = 3, } keymaster_purpose_t;
Ten tag jest powtarzalny; klucze mogą być generowane z wieloma wartościami, chociaż operacja ma jeden cel. Gdy funkcja begin jest wywoływana w celu rozpoczęcia operacji, określany jest cel operacji. Jeśli cel określony dla operacji nie jest autoryzowany przez klucz, operacja kończy się niepowodzeniem z ErrorCode::INCOMPATIBLE_PURPOSE
.
Znacznik::RESET_SINCE_ID_ROTATION
Wersja : 3, 4
powtarzalne ? NIE
Określa, czy urządzenie zostało zresetowane do ustawień fabrycznych od czasu ostatniej rotacji unikalnego identyfikatora. Używany do atestacji klucza.
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Tag::ROLLBACK_RESISTANT
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Wskazuje, że klucz jest odporny na wycofywanie, co oznacza, że po usunięciu przez deleteKey lub deleteAllKeys klucz jest gwarantowany jako trwale usunięty i bezużyteczny. Możliwe, że klucze bez tego znacznika mogą zostać usunięte, a następnie przywrócone z kopii zapasowej.
Ten znacznik jest logiczny, więc możliwe wartości to prawda (jeśli znacznik jest obecny) i fałsz (jeśli znacznik nie jest obecny).
Tag::ROOT_OF_TRUST
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa root of trust , klucz używany przez zweryfikowany rozruch do sprawdzania poprawności uruchomionego systemu operacyjnego (jeśli istnieje). Ten znacznik nigdy nie jest dostarczany ani zwracany przez firmę Keymaster w kluczowych cechach.
Tag::RSA_PUBLIC_EXPONENT
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa wartość publicznego wykładnika dla pary kluczy RSA. Ten znacznik dotyczy tylko kluczy RSA i jest niezbędny dla wszystkich kluczy RSA.
Wartość jest 64-bitową liczbą całkowitą bez znaku, która spełnia wymagania publicznego wykładnika RSA. Ta wartość musi być liczbą pierwszą. Trustlets obsługują wartość 2^16+1 i mogą obsługiwać inne rozsądne wartości, w szczególności wartość 3. Jeśli żaden wykładnik nie zostanie określony lub jeśli określony wykładnik nie jest obsługiwany, generowanie klucza kończy się niepowodzeniem z ErrorCode::INVALID_ARGUMENT
.
Tag::UNIQUE_ID
Wersja : 3, 4
powtarzalne ? NIE
Służy do podania unikalnego identyfikatora w poświadczeniu.
Wartość to blob, tablica bajtów o dowolnej długości.
Tag::USAGE_EXPIRE_DATETIME
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa datę i godzinę wygaśnięcia klucza w celu weryfikacji i odszyfrowania. Po tym czasie każda próba użycia klucza z KeyPurpose::VERIFY lub KeyPurpose::DECRYPT podana do rozpoczęcia kończy się niepowodzeniem z ErrorCode::KEY_EXPIRED
.
Wartość jest 64-bitową liczbą całkowitą reprezentującą milisekundy od 1 stycznia 1970 r.
Tag::USER_AUTH_TYPE
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa typy uwierzytelniaczy użytkowników, których można użyć do autoryzacji tego klucza. Kiedy Keymaster jest proszony o wykonanie operacji na kluczu z tym znacznikiem, otrzymuje token uwierzytelniania, a pole authenticator_type
tokena musi być zgodne z wartością w znaczniku. Na przykład (ntoh(token.authenticator_type) & auth_type_tag_value) != 0
, gdzie ntoh
jest funkcją, która konwertuje liczby całkowite uporządkowane w sieci na liczby całkowite uporządkowane przez hosta, a auth_type_tag_value
jest wartością tego znacznika.
Wartość to 32-bitowa maska bitowa liczb całkowitych wartości z wyliczenia:
Keymaster 3enum class HardwareAuthenticatorType : uint32_t { NONE = 0u, // 0 PASSWORD = 1 << 0, FINGERPRINT = 1 << 1, ANY = UINT32_MAX, };Keymaster 2 i wcześniejsze
typedef enum { HW_AUTH_NONE = 0, HW_AUTH_PASSWORD = 1 << 0, HW_AUTH_FINGERPRINT = 1 << 1, // Additional entries should be powers of 2. HW_AUTH_ANY = UINT32_MAX, } hw_authenticator_type_t;
Tag::USER_SECURE_ID
Wersja : 1, 2, 3, 4
powtarzalne ? NIE
Określa, że klucz może być używany tylko w określonym bezpiecznym stanie uwierzytelniania użytkownika. Ten tag wyklucza się wzajemnie z Tag::NO_AUTH_REQUIRED .
Wartość to 64-bitowa liczba całkowita określająca wartość stanu zasad uwierzytelniania, która musi być obecna w tokenie uwierzytelniania (podany na początku Tag::AUTH_TOKEN ), aby autoryzować użycie klucza. Każde wywołanie rozpoczynające się od klucza z tym tagiem, które nie dostarcza tokenu uwierzytelniania lub dostarcza token uwierzytelniania bez pasującej wartości stanu zasad, kończy się niepowodzeniem.
Ten tag jest powtarzalny. Jeśli dowolna z podanych wartości pasuje do dowolnej wartości stanu zasad w tokenie uwierzytelniania, klucz jest autoryzowany do użycia. W przeciwnym razie operacja zakończy się niepowodzeniem z ErrorCode::KEY_USER_NOT_AUTHENTICATED
.
Tag::VENDOR_PATCHLEVEL
Wersja : 4
Ten znacznik określa poziom poprawki zabezpieczeń obrazu dostawcy, z którym może być używany klucz. Ten znacznik nigdy nie jest wysyłany do głównego TA, ale jest dodawany do listy autoryzacji wymuszonych sprzętowo przez TA. Każda próba użycia klucza z wartością Tag::VENDOR_PATCHLEVEL
inną niż aktualnie działający poziom poprawki systemowej musi spowodować, że metody begin()
, getKeyCharacteristics()
lub exportKey()
zwrócą ErrorCode::KEY_REQUIRES_UPGRADE
. Zobacz upgradeKey()
po szczegóły.
Wartością znacznika jest liczba całkowita w postaci RRRRMMDD, gdzie RRRR to czterocyfrowy rok ostatniej aktualizacji, MM to dwucyfrowy miesiąc, a DD to dwucyfrowy dzień ostatniej aktualizacji. Na przykład dla klucza wygenerowanego na urządzeniu z systemem Android, którego ostatnia aktualizacja miała miejsce 5 czerwca 2018 r., wartością będzie 20180605.
IKeymasterDevice HAL musi odczytać aktualny poziom poprawek dostawcy z właściwości systemowej ro.vendor.build.security_patch
i dostarczyć go do bezpiecznego środowiska podczas pierwszego ładowania warstwy HAL (mechanizm jest zdefiniowany w implementacji). Bezpieczne środowisko nie może akceptować kolejnego poziomu poprawek aż do następnego rozruchu.
Musi być wymuszany sprzętowo.