Interfejs KeyMint (wcześniej Keymaster) korzysta z tagów autoryzacji, czyli par nazwa-wartość. Każdy możliwy tag ma:
- nazwa wyliczenia z powiązaną wartością,
- powiązany typ (np. liczba całkowita, bajty, data, enum), który zawiera wskazanie, czy dozwolone są liczne wartości;
Na przykład tag o nazwie Tag::BLOCK_MODE
ma wartość podstawowej wartości wyliczalniczej 4
i znacznik typu TagType::ENUM_REP
, który wskazuje, że powiązana wartość jest powtarzalnym typem wyliczalniczym (w tym przypadku BlockMode
).
Tagi pełnią 2 funkcje w interfejsie API:
- Jako parametry operacji wykonywanej w interfejsie API, np.
Tag::MAC_LENGTH
w operacji podpisywania HMAC, wskazuje żądaną długość HMAC. - Charakterystyki klucza to wartości, które są na stałe powiązane z danym kluczem (czyli są zawarte w pliku klucza). Na przykład
Tag::EC_CURVE
wskazuje, do której krzywej eliptycznej należy dany klucz. Każda kluczowa cecha jest powiązana z poziomem zabezpieczeń, który wskazuje, która część systemu kontroluje dany atrybut:- W sprzęcie zabezpieczonym jest wymuszana kluczowa cecha o poziomie zabezpieczeń
TRUSTED_ENVIRONMENT
lubSTRONGBOX
. - Kluczowa cecha o poziomie zabezpieczeń
SOFTWARE
lubKEYSTORE
jest egzekwowana tylko przez usługę systemowąkeystore2
(a więc nie jest odporna na kompromisy w systemie operacyjnym).
- W sprzęcie zabezpieczonym jest wymuszana kluczowa cecha o poziomie zabezpieczeń
Wiele tagów pełni funkcję zarówno kluczowych cech, jak i parametrów:
- Cechy klucza wskazują zestaw dozwolonych parametrów klucza,
na przykład:
Tag::PURPOSE
klucza ECDSA może zawierać zarównoSIGN
, jak iAGREE_KEY
.Tag::BLOCK_MODE
klucza AES może zawierać tryby ECB, CBC i CTR.
- Żądanie
begin()
zawiera wtedy określoną wartość parametru dla operacji, na przykład:begin()
ma parametr „explicit purpose”, który musi być zgodny z jedną z wartościTag::PURPOSE
kluczowych cech.begin()
w operacji AES musi zawierać w poluparams
jedną wartośćTag::BLOCK_MODE
, która musi być zgodna z jedną z wartości kluczowych cech.
Ta podwójna funkcja jest szczególnie przydatna w przypadku zbioru tagów przekazywanych jako keyParams
w ramach operacji generowania kluczy lub importu.
- Niektóre z nich pełnią funkcję parametrów operacji generowania klucza. Na przykład tag
Tag::CERTIFICATE_SUBJECT
wpływa tylko na proces (asymetrycznego) generowania klucza, kontrolując pole w zwróconym certyfikacie X.509. - Inne tagi są powiązane z nowo wygenerowanym kluczem jako jego cechy i są zaszyfrowane w zwracanym kluczu blob, dzięki czemu są na stałe powiązane z kluczem.
Szczegółowe informacje o wartościach tagów znajdziesz w tych specyfikacjach interfejsu HAL:
- KeyMint – wszystkie tagi są zdefiniowane w
Tag.aidl
w odpowiednim gałęzi wydania Androida. - Keymaster – tagi są definiowane w
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
dla każdego odpowiedniegokeymaster-version
, np.3.0/types.hal
w przypadku Keymastera 3 i4.0/types.hal
w przypadku Keymastera 4. W przypadku Keymaster 2 i starszych wersji tagi są definiowane wplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.