vvmconfig e vvmtruststore

O agente de descoberta de serviços do SDV precisa de dois conjuntos de informações de configuração:

  1. A configuração da máquina virtual do veículo (VVM Config), que contém informações comuns a todos os veículos do mesmo modelo ou plataforma.
  2. O repositório de confiança da máquina virtual do veículo (VVM Trust Store), que contém informações exclusivas desse veículo específico.
Conteúdo de vvmtruststore e vvmconfig
Figura 1:conteúdo de vvmtruststore e vvmconfig.

Configuração da VM do veículo

A configuração da VM do veículo é um arquivo chamado vvmconfig[.SUFFIX] localizado no diretório /etc da partição product. O sufixo vvmconfig é opcional e não tem significado para o SDV do Android. Os parceiros podem adicionar qualquer informação útil no sufixo vvmconfig, como o nome da plataforma do veículo ou do produto.

Se o sistema tiver vários arquivos de configuração da VM do veículo, o carregador de inicialização vai especificar o arquivo escolhido usando o parâmetro do kernel androidboot.sdv.vvmconfig. Esse parâmetro deve conter apenas o nome do arquivo (por exemplo, vvmconfig.example), sem nenhum componente de caminho. Por exemplo, /etc/vvmconfig.example seria um valor inválido.

O arquivo de configuração da VM do veículo é fornecido em um formato CBOR definido no seguinte fragmento CDDL:

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 é definido na RFC 8152, assinatura e criptografia de objetos CBOR (COSE).

ipv4-address e ipv6-address são definidos na RFC 9164, Tags de representação de objeto binário conciso (CBOR) para endereços e prefixos IPv4 e IPv6.

Políticas do DICE

O OEM fornece o SDV do Android com uma coleção de políticas de DICE que definem as restrições que as cadeias de DICE válidas (e confiáveis) precisam obedecer. Essa coleção de políticas precisa abranger todas as cadeias do DICE relacionadas a todas as VMs de SDV no veículo.

Todas as cadeias DICE do Secure World precisam falhar em uma política DICE de SDV do Android. Por outro lado, todas as cadeias DICE de SDV do Android precisam falhar em uma política DICE do Secure World. Isso significa que não pode ser possível transmitir uma cadeia DICE SDV do Android como uma cadeia DICE do Secure World e vice-versa.

Repositório de confiança de VM de veículo

O repositório de confiança da VM do veículo contém as chaves públicas do UDS de todos os participantes da malha segura de SDV. É uma partição não assinada chamada vvmtruststore com um sistema de arquivos ext4 e montada no diretório /vvmtruststore. Essas chaves públicas podem ser certificadas pela autoridade raiz especificada na configuração do VVM.

Essa partição é montada como leitura e gravação quando o HLOS do Android é inicializado com o modo de inicialização do SDV unlocked ou como somente leitura quando o modo de inicialização do SDV é locked. Ele pode ter até dois arquivos: uds_pubs e uds_certs.

uds_pubs é um arquivo CBOR que contém todas as chaves públicas do UDS de todas as ECUs que hospedam VMs do SDV na malha do SDV atual. Essas chaves públicas do UDS são coletadas das cadeias DICE fornecidas pelas VMs SDV do mesmo nível durante o provisionamento. Esse arquivo é criado pelo sdv_provisioning_tool durante o fluxo de provisionamento.

uds_certs é um arquivo CBOR definido no seguinte fragmento 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 contém apenas os certificados UDS assinados pela CA das chaves públicas UDS do dispositivo local (em vez de todas as chaves listadas em uds_pubs). Esse arquivo precisa ser fornecido pelo OEM e é obrigatório apenas para o fluxo de provisionamento de substituição de peças.

Os certificados UDS no uds_certs precisam seguir as especificações definidas na HAL de provisionamento remoto. Além disso, os certificados de assinatura digital precisam ser Ed25519 ou ECDSA com curvas P-256 ou P-384. Seguir a HAL de provisionamento remoto significa, em particular, que o certificado folha da cadeia de certificados do UDS precisa ter BasicConstraints e KeyUsage, conforme especificado para o certificado do UDS, enquanto todos os certificados intermediários e raiz precisam seguir as regras para certificados de CA.