vvmconfig und vvmtruststore

Der SDV-Dienst-Discovery-Agent benötigt zwei Arten von Konfigurationsinformationen:

  1. Die Konfiguration der virtuellen Maschine des Fahrzeugs (Vehicle Virtual Machine Configuration, VVM Config) enthält Informationen, die für alle Fahrzeuge desselben Modells oder derselben Plattform gleich sind.
  2. Der Trust Store der virtuellen Maschine des Fahrzeugs (Vehicle Virtual Machine Trust Store, VVM Trust Store) enthält Informationen, die für das jeweilige Fahrzeug eindeutig sind.
Inhalte von „vvmtruststore“ und „vvmconfig“
Abbildung 1: Inhalte von vvmtruststore und vvmconfig.

Konfiguration der virtuellen Maschine des Fahrzeugs

Die Konfiguration der virtuellen Maschine des Fahrzeugs ist eine Datei mit dem Namen vvmconfig[.SUFFIX] im Verzeichnis /etc der product-Partition. Das Suffix der vvmconfig-Datei ist optional und hat für Android SDV keine Bedeutung. Partner können dem Suffix vvmconfig beliebige Informationen hinzufügen, z. B. den Namen der Fahrzeugplattform oder den Produktnamen.

Wenn das System mehrere Konfigurationsdateien für die virtuelle Maschine des Fahrzeugs hat, sollte der Bootloader die ausgewählte Datei mit dem Kernelparameter androidboot.sdv.vvmconfig angeben. Dieser Parameter sollte nur den Dateinamen enthalten (z.B. vvmconfig.example) und keine Pfadkomponente. /etc/vvmconfig.example wäre beispielsweise ein ungültiger Wert.

Die Konfigurationsdatei der virtuellen Maschine des Fahrzeugs wird im CBOR-Format bereitgestellt, das im folgenden CDDL-Fragment definiert ist:

VvmConfig = [
  version: 1,
  ; Public key of the UDS root provisioning authority
  udsCaPub: COSE_Key,
  ; Revocation list of intermediate CAs of UDS certificates
  udsCaRevList: KeyList,
  policies: DicePolicies,
  vmConfigs: VmConfigMap,
]

DicePolicies = [+ DicePolicy]

KeyList = [* COSE_Key]

; Maps a VM instance name to its configuration
VmConfigMap = {
  VmInstanceName => VmConfig
}

VmConfig = [
  ; IP addresses of this virtual machine.
  ips: [+ IpAndPort],
  ; Index of the DICE policy for the Android SDV VM DICE chain.
  android: PolicyIndex,
  ; Index of the DICE policy for the Secure World DICE chain used by the Android SDV VM.
  secureWorld: PolicyIndex,
]

IpAndPort = [
    ip: IpAddress,
    ; If not specified, the default Service Discovery agent port will be used.
    ? port: uint
]

IpAddress = ipv4-address / ipv6-address

; Index of a DicePolicy in the DicePolicies array.
PolicyIndex = uint

; The VM Name (as defind in the VVM Config). This must comply with VM Name identifier
; definition in Service Identity docs.
VmInstanceName = tstr

; INCLUDE /hardware/interfaces/security/authgraph/aidl/android/hardware/security/authgraph/DicePolicy.cddl for: DicePolicy

COSE_Key ist in RFC 8152, CBOR Object Signing and Encryption (COSE) definiert.

ipv4-address und ipv6-address sind in RFC 9164, Concise Binary Object Representation (CBOR) Tags for IPv4 and IPv6 Addresses and Prefixes definiert.

DICE-Richtlinien

Der OEM stellt Android SDV eine Sammlung von DICE-Richtlinien zur Verfügung, in denen die Einschränkungen definiert sind, die für gültige (und vertrauenswürdige) DICE-Ketten gelten. Diese Richtliniensammlung muss alle DICE-Ketten für alle SDV-VMs im Fahrzeug abdecken.

Alle DICE-Ketten der sicheren Welt müssen eine Android SDV-DICE-Richtlinie verletzen. Umgekehrt müssen alle Android SDV-DICE-Ketten eine DICE-Richtlinie der sicheren Welt verletzen. Das bedeutet, dass es nicht möglich sein darf, eine Android SDV-DICE-Kette erfolgreich als DICE-Kette der sicheren Welt zu übergeben und umgekehrt.

Trust Store der virtuellen Maschine des Fahrzeugs

Der Trust Store der virtuellen Maschine des Fahrzeugs enthält die öffentlichen UDS-Schlüssel aller Teilnehmer des sicheren SDV-Mesh. Es handelt sich um eine nicht signierte Partition mit dem Namen vvmtruststore mit einem ext4-Dateisystem, die im Verzeichnis /vvmtruststore bereitgestellt wird. Diese öffentlichen Schlüssel können optional von der in der VVM-Konfiguration angegebenen Stammzertifizierungsstelle zertifiziert werden.

Diese Partition wird entweder als Lese- und Schreibpartition bereitgestellt, wenn das Android HLOS mit dem SDV-Bootmodus unlocked gestartet wird, oder als schreibgeschützte Partition, wenn der SDV-Bootmodus locked ist. Sie kann bis zu zwei Dateien enthalten: uds_pubs und uds_certs.

uds_pubs ist eine CBOR-Datei, die alle öffentlichen UDS-Schlüssel aller Steuergeräte enthält, auf denen SDV-VMs im aktuellen SDV-Mesh gehostet werden. Diese öffentlichen UDS-Schlüssel werden aus den DICE-Ketten erfasst, die von den Peer-SDV-VMs während der Bereitstellung bereitgestellt werden. Diese Datei wird während des Bereitstellungsvorgangs vom sdv_provisioning_tool erstellt.

uds_certs ist eine CBOR-Datei, die im folgenden CDDL-Fragment definiert ist:

UdsCertificates = [
  1, ; version
  *   UdsCertChain
]

UdsCertChain = [
  2* X509Certificate ; Root -> ... -> Leaf. "Root" is the vendor self-signed
                     ; cert, "Leaf" contains UDS_Public. There may also be
                     ; intermediate certificates between Root and Leaf.
]

; A bstr containing a DER-encoded X.509 certificate.
X509Certificate = bstr

uds_certs enthält nur die von der Zertifizierungsstelle signierten UDS-Zertifikate der öffentlichen UDS-Schlüssel des lokalen Geräts (im Gegensatz zu allen in uds_pubs aufgeführten Schlüsseln). Diese Datei muss vom OEM bereitgestellt werden und ist nur für den Bereitstellungsvorgang für den Austausch von Teilen obligatorisch.

Die UDS-Zertifikate in der uds_certs müssen den Spezifikationen entsprechen, die in der Remote Provisioning HAL definiert sind. Außerdem müssen die digitalen Signaturen, die Zertifikate signieren, Ed25519 oder ECDSA mit den Kurven P-256 oder P-384 sein. Die Remote Provisioning HAL bedeutet insbesondere, dass das Blattzertifikat der UDS-Zertifikatskette BasicConstraints und KeyUsage wie für das UDS-Zertifikat angegeben haben sollte, während alle Zwischen- und Stammzertifikate den Regeln für CA-Zertifikate folgen sollten.