vvmconfig e vvmtruststore

L'agente di rilevamento dei servizi SDV ha bisogno di due set di informazioni di configurazione:

  1. La configurazione della macchina virtuale del veicolo (VVM Config), che contiene informazioni comuni a tutti i veicoli dello stesso modello o della stessa piattaforma.
  2. L'archivio attendibile della macchina virtuale del veicolo (VVM Trust Store), che contiene informazioni univoche per quel particolare veicolo.
Contenuti di vvmtruststore e vvmconfig
Figura 1: contenuti di vvmtruststore e vvmconfig.

Configurazione della VM del veicolo

La configurazione della VM del veicolo è un file denominato vvmconfig[.SUFFIX] che si trova nella directory /etc della partizione product. Il suffisso del file vvmconfig è facoltativo e non ha alcun significato per Android SDV. I partner possono aggiungere al suffisso vvmconfig tutte le informazioni che ritengono utili, ad esempio il nome della piattaforma del veicolo o il nome del prodotto.

Se il sistema ha più file di configurazione della VM del veicolo, il bootloader deve specificare il file scelto utilizzando il parametro del kernel androidboot.sdv.vvmconfig. Questo parametro deve contenere solo il nome del file (ad es. vvmconfig.example), senza alcun componente del percorso. Ad esempio, /etc/vvmconfig.example sarebbe un valore non valido.

Il file di configurazione della VM del veicolo viene fornito in formato CBOR definito nel seguente CDDL frammento:

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 è definito in RFC 8152, CBOR Object Signing and Encryption (COSE).

ipv4-address e ipv6-address sono definiti nella RFC 9164, Concise Binary Object Representation (CBOR) Tags for IPv4 and IPv6 Addresses and Prefixes.

Norme DICE

L'OEM fornisce ad Android SDV una raccolta di norme DICE che definiscono i vincoli che le catene DICE valide (e attendibili) devono rispettare. Questa raccolta di norme deve coprire tutte le catene DICE correlate a tutte le VM SDV del veicolo.

Tutte le catene DICE di Secure World devono non superare una norma DICE di Android SDV. Al contrario, tutte le catene DICE di Android SDV devono non superare una norma DICE di Secure World. Ciò significa che non deve essere possibile superare correttamente una catena DICE di Android SDV come catena DICE di Secure World e viceversa.

Archivio attendibile della VM del veicolo

L'archivio attendibile della VM del veicolo contiene le chiavi pubbliche UDS di tutti i partecipanti alla mesh sicura SDV. È una partizione non firmata denominata vvmtruststore con un file system ext4 e montata sulla directory /vvmtruststore. Queste chiavi pubbliche possono essere facoltativamente certificate dall'autorità radice specificata nella configurazione della VM del veicolo.

Questa partizione viene montata come lettura e scrittura quando l'HLOS Android viene avviato con la modalità di avvio SDV unlocked o come sola lettura quando la modalità di avvio SDV è locked. Può contenere fino a due file: uds_pubs e uds_certs.

uds_pubs è un file CBOR che contiene tutte le chiavi pubbliche UDS di tutte le ECU che ospitano VM SDV nella mesh SDV corrente. Queste chiavi pubbliche UDS vengono raccolte dalle catene DICE fornite dalle VM SDV peer durante il provisioning. Questo file viene creato da sdv_provisioning_tool durante il flusso di provisioning.

uds_certs è un file CBOR definito nel seguente frammento CDDL:

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 contiene solo i certificati UDS firmati dalla CA delle chiavi pubbliche UDS del dispositivo locale (a differenza di tutte le chiavi elencate in uds_pubs). Questo file deve essere fornito dall'OEM ed è obbligatorio solo per il flusso di provisioning di sostituzione delle parti.

I certificati UDS in uds_certs devono seguire le specifiche definite nell'HAL di provisioning remoto. Inoltre, le firme digitali dei certificati di firma devono essere Ed25519 o ECDSA con curve P-256 o P-384. Seguire l'HAL di provisioning remoto significa, in particolare, che il certificato foglia della catena di certificati UDS deve avere BasicConstraints e KeyUsage come specificato per il certificato UDS, mentre tutti i certificati intermedi e radice devono seguire le regole per i certificati CA.