Alle KeyMint-Schlüssel müssen an einen Root of Trust für das Gerät gebunden sein. Die Root of Trust ist ein Bitstring, der aus dem öffentlichen Schlüssel abgeleitet wird, der zum Verifizieren der Signatur des Boot-Images verwendet wird, zusammen mit dem Sperrstatus des Bootloaders.
KeyMint-Schlüssel müssen außerdem an die Betriebssystemversion und die Patchebene des Geräts gebunden sein. Zur Unterstützung der modularen Struktur von Treble enthält diese Versionsbindung separate Patchebenen für jede Partition (boot
, system
und vendor
). So kann jede Partition unabhängig aktualisiert werden und es wird gleichzeitig ein Rollback-Schutz bereitgestellt.
Um diese Versionsbindung zu implementieren, benötigt die KeyMint-Vertrauenswürdige Anwendung (TA) eine Möglichkeit, die aktuelle Betriebssystemversion und die Patchebenen sicher zu empfangen und dafür zu sorgen, dass die empfangenen Informationen mit allen Informationen zum laufenden System übereinstimmen.
- Geräte mit Android Verified Boot (AVB):
- Die Patch-Level und die Betriebssystemversion können in
vbmeta.img
enthalten sein, damit der Bootloader sie an KeyMint weitergeben kann. - Bei verketteten Partitionen befinden sich die Versionsinformationen für die Partition in der verketteten VBMeta.
- Im Allgemeinen sollten sich Versionsinformationen in der
VBMeta struct
befinden, die die Bestätigungsdaten (Hash oder Hashbaum) für eine bestimmte Partition enthält.
- Die Patch-Level und die Betriebssystemversion können in
- Geräte ohne AVB:
- Implementierungen des Bootmodus mit Verifikation müssen dem Bootloader einen Hash der Versionsmetadaten zur Verfügung stellen, damit der Bootloader den Hash an KeyMint weitergeben kann.
boot.img
kann weiterhin Patchebenen im Header speichern.system.img
kann Patchebenen und die Betriebssystemversion weiterhin in Lesezugriffseigenschaften speichern.vendor.img
speichert die Patchebene in der nur lesbaren Eigenschaftro.vendor.build.version.security_patch
.- Der Bootloader kann KeyMint einen Hash aller Daten zur Verfügung stellen, die durch Verified Boot validiert wurden.
Die folgenden Tags beschreiben Versionsinformationen für die entsprechenden Partitionen:
Tag::VENDOR_PATCHLEVEL
:vendor
PartitionTag::BOOT_PATCHLEVEL
:boot
-PartitionTag::OS_PATCHLEVEL
undOS_VERSION
:system
-Partition. (OS_VERSION
wird aus der Kopfzeile vonboot.img
entfernt.)
Bei KeyMint-Implementierungen sollten alle Patchebenen unabhängig voneinander behandelt werden. Schlüssel können verwendet werden, wenn alle Versionsinformationen mit den mit einem Schlüssel verknüpften Werten übereinstimmen. Wenn die aktuelle Geräteversion neuer ist als alle mit einem Schlüssel verknüpften Werte, gibt KeyMint bei jedem Versuch, den Schlüssel zu verwenden, den Fehler KEY_REQUIRES_UPGRADE
zurück. Der Keystore führt dann IKeyMintDevice::upgradeKey()
aus, um einen neuen Keyblob zu generieren, der an die aktuellen Patchebenen gebunden ist. Anschließend löscht der Keystore den vorherigen Keyblob mit einem Aufruf von IKeyMintDevice::deleteKey()
.