Interfejs KeyMint (wcześniej Keymaster) w dużym stopniu korzysta z tagów autoryzacji, które są parami nazwa-wartość. Każdy możliwy tag ma:
- Nazwa wyliczenia z powiązaną wartością
- Typ powiązany (np. liczba całkowita, bajty, data, wyliczenie), który zawiera informację o tym, czy dozwolonych jest wiele wartości.
Na przykład tag o nazwie Tag::BLOCK_MODE
ma podstawową wartość wyliczenia 4
i znacznik typu TagType::ENUM_REP
, który wskazuje, że powiązana wartość jest powtarzalnym wyliczeniem (w tym przypadku BlockMode
).
Tagi pełnią w interfejsie API podwójną funkcję:
- Jako parametry operacji wykonywanej w interfejsie API, np.
Tag::MAC_LENGTH
w operacji podpisywania HMAC, wskazuje żądaną długość HMAC. - Jako kluczowe cechy wartości, które są na stałe powiązane z określonym kluczem (czyli są zawarte w obiekcie binarnym klucza), np.
Tag::EC_CURVE
wskazuje, dla której krzywej eliptycznej jest przeznaczony klucz. Każda kluczowa cecha jest powiązana z poziomem bezpieczeństwa, który wskazuje, która część systemu kontroluje atrybut:- Kluczowa cecha z poziomem bezpieczeństwa
TRUSTED_ENVIRONMENT
lubSTRONGBOX
jest wymuszana w bezpiecznym sprzęcie. - Kluczowa cecha o poziomie bezpieczeństwa
SOFTWARE
lubKEYSTORE
jest wymuszana tylko przez usługę systemowąkeystore2
(dlatego taka cecha nie jest odporna na naruszenie bezpieczeństwa systemu operacyjnego).
- Kluczowa cecha z poziomem bezpieczeństwa
Wiele tagów pełni funkcję zarówno kluczowych cech , jak i parametrów:
- Kluczowe cechy wskazują zestaw dozwolonych parametrów klucza, np.:
Tag::PURPOSE
klucza ECDSA może zawierać zarównoSIGN
, jak iAGREE_KEY
.Tag::BLOCK_MODE
klucza AES może obejmować tryby ECB, CBC i CTR.
- Żądanie
begin()
zawiera wtedy konkretną wartość parametru operacji, np.:begin()
ma parametr wyraźnego celu, który musi pasować do jednej z wartościTag::PURPOSE
kluczowych cech.begin()
w przypadku operacji AES musi zawierać pojedynczą wartośćTag::BLOCK_MODE
w poluparams
, która musi być zgodna z jedną z wartości w charakterystyce klucza.
Ta podwójna funkcja jest szczególnie istotna w przypadku zbierania tagów przekazywanych jako keyParams
podczas operacji generowania lub importowania klucza.
- Niektóre tagi działają jako parametry samej operacji generowania klucza. Na przykład tag
Tag::CERTIFICATE_SUBJECT
wpływa tylko na proces generowania klucza (asymetrycznego), kontrolując pole w zwróconym certyfikacie X.509. - Pozostałe tagi są powiązane z nowo wygenerowanym kluczem jako jego cechy i są hermetyzowane w zwracanym obiekcie klucza, dzięki czemu są trwale 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 odpowiedniej gałęzi wersji Androida. - Keymaster – tagi są zdefiniowane w
platform/hardware/interfaces/keymaster/keymaster-version/types.hal
dla każdego odpowiedniegokeymaster-version
, np.3.0/types.hal
dla Keymastera 3 i4.0/types.hal
dla Keymastera 4. W przypadku Keymastera 2 i starszych wersji tagi są zdefiniowane wplatform/hardware/libhardware/include/hardware/keymaster_defs.h
.