Wszystkie klucze KeyMint muszą być powiązane ze źródłem zaufania na urządzeniu. Źródło zaufania to ciąg bitów pochodzący z klucza publicznego używanego do weryfikacji podpisu obrazu rozruchowego wraz ze stanem blokady programu ładującego.
Klucze KeyMint muszą być również powiązane z wersją systemu operacyjnego i poziomem poprawek na urządzeniu. Aby obsługiwać strukturę modułową Treble, to wiązanie wersji zawiera oddzielne poziomy poprawek dla każdej partycji (boot
, system
i vendor
). Dzięki temu każda partycja może być aktualizowana niezależnie, a jednocześnie zapewniana jest ochrona przed cofnięciem zmian.
Aby wdrożyć to powiązanie wersji, zaufana aplikacja KeyMint (TA) musi mieć możliwość bezpiecznego otrzymywania bieżącej wersji systemu operacyjnego i poziomów poprawek oraz mieć pewność, że otrzymane informacje są zgodne ze wszystkimi informacjami o uruchomionym systemie.
- Urządzenia z weryfikacją podczas uruchamiania w Androidzie (AVB):
- Poziomy poprawek i wersja systemu operacyjnego
mogą być uwzględnione w
vbmeta.img
, aby bootloader mógł przekazać je KeyMint. - W przypadku połączonych partycji informacje o wersji partycji znajdują się w połączonym pliku VBMeta.
- Ogólnie informacje o wersji powinny znajdować się w pliku
VBMeta struct
, który zawiera dane weryfikacyjne (skrót lub hashtree) dla danej partycji.
- Poziomy poprawek i wersja systemu operacyjnego
mogą być uwzględnione w
- Urządzenia bez AVB:
- Implementacje zweryfikowanego rozruchu muszą przekazywać programowi rozruchowemu skrót wersji metadanych, aby program mógł przekazać skrót do KeyMint.
boot.img
może nadal przechowywać poziomy poprawek w nagłówku.system.img
może nadal przechowywać poziomy poprawek i wersję systemu operacyjnego w usługach tylko do odczytu.- Usługa
vendor.img
przechowuje poziom poprawki w usługi tylko do odczyturo.vendor.build.version.security_patch
. - Bootloader może przekazać do KeyMint hasz wszystkich danych zweryfikowanych przez funkcję Verified Boot.
Tagi te zawierają informacje o wersji odpowiednich partycji:
Tag::VENDOR_PATCHLEVEL
:vendor
partycjaTag::BOOT_PATCHLEVEL
: partycjaboot
Tag::OS_PATCHLEVEL
iOS_VERSION
:system
partycja. (elementOS_VERSION
został usunięty z nagłówkaboot.img
).
Implementacje KeyMint powinny traktować wszystkie poziomy poprawek niezależnie. Klucze są dostępne, jeśli wszystkie informacje o wersji są zgodne z wartościami powiązanymi z kluczem. Jeśli bieżąca wersja urządzenia jest nowsza niż dowolna wartość powiązana z kluczem, KeyMint zwraca błąd KEY_REQUIRES_UPGRADE
przy każdej próbie użycia klucza. Następnie Keystore wykonuje wywołanie IKeyMintDevice::upgradeKey()
, aby wygenerować nowy kluczblob, który jest powiązany z bieżącymi poziomami poprawek (a Keystore następnie usuwa poprzedni kluczblob za pomocą wywołania IKeyMintDevice::deleteKey()
).