Wiązanie z wersją

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, systemvendor). 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ędnionevbmeta.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.
  • 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 odczytu ro.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:

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()).