Android HLOS CDI 핸드오버

Android HLOS가 이전 단계에서 CDI 값과 DICE 체인을 수신하면 이를 읽은 후 SDV 서비스 검색에 필요한 비밀(예: 공개 및 비공개 키 쌍, 추가 CDI 단계)을 파생시키고 삭제합니다.

이 프로세스는 2단계 init에서 early-init 중에 부팅 흐름에서 최대한 빨리 발생합니다. 이렇게 하면 서드 파티 코드가 실행되기 전에 Android HLOS가 CDI 값을 소비하고 삭제합니다.

Android 부트로더 (또는 Android 부트로더가 없는 경우 하이퍼바이저의 게스트 로더)는 SDV의 Linux 커널을 통해 다음 값을 Android 사용자 공간의 second stage init에 전달합니다.

  • Android HLOS 레이어의 증명 CDI 값입니다.
  • Android HLOS 레이어의 CDI 값을 봉인합니다.
  • Android HLOS 레이어까지의 CBOR 인코딩 DICE 체인

이러한 값은 SdvDiceHandover 형식을 사용합니다. SdvDiceHandover는 이 CDDL 조각으로 설명되는 CBOR 인코딩 맵입니다.

SdvDiceHandover = {
   1 : bstr .size 32, ; CDI_Attest
   2 : bstr .size 32, ; CDI_Seal
   3 : DiceCertChain, ; Android SDV DICE chain
}

IRemotelyProvisionedComponent HAL DiceCertChainDiceCertChain의 형식을 지정합니다. SdvDiceHandover에는 결정적으로 인코딩된 CBOR이 필요하지 않지만, 더 광범위한 DICE 정책을 지원하므로 사용하는 것이 좋습니다.

SdvDiceHandover 형식은 다음과 매우 유사합니다.

  • Open Profile for DICE 참조 구현에서 정의하는 AndroidDiceHandover 형식

  • pvmfw가 DICE 체인을 pVM에 전달하는 데 사용하는 PvmfwDiceHandover 형식입니다(예: Microdroid).

AndroidDiceHandover와 달리 PvmfwDiceHandover 형식과 유사하게 DiceCertChain는 필수이며 선택사항이 아닙니다.

DICE 커널 드라이버의 프로필 열기

Android 부트로더 (또는 부트로더가 없는 경우 하이퍼바이저의 게스트 로더)에서 Android HLOS CDI의 DICE 핸드오버는 DICE 커널 드라이버용 공개 프로필을 사용합니다. Android 부트로더는 기기 트리 (DT)가 지정해야 하는 게스트 메모리의 리전에 DICE 체인 항목을 씁니다.

드라이버는 DT가 지정한 이 메모리 영역을 읽고 이를 사용자 공간에 /dev/open-dice0 기기로 노출합니다. 드라이버는 이 메모리 영역의 읽기와 삭제를 허용합니다. DICE 드라이버용 공개 프로필은 기기 트리가 arm64 전용 개념이므로 arm64 아키텍처에만 있습니다.

compatible 속성에서 "google,open-dice"를 지정하여 드라이버용으로 태그하는 DT에서 reserved-memory 노드를 사용하여 DICE 드라이버용 공개 프로필이 노출하는 메모리 영역을 지정합니다. 예를 들면 다음과 같습니다.

reserved-memory {
  // The number of u32 cells to represent the address of a memory region
  #address-cells = <2>;
  // The number of u32 cells to represent the size of a memory region
  #size-cells = <2>;
  ranges;
  // The unit address (after the @) must match the address in the reg property
  dice@D1C30000 {
    compatible = "google,open-dice";
    no-map;
    // The address and the size of the memory region that is passed to the Open
    // Profile for DICE driver. The address must be page-aligned, and the size a
    // multiple of the page size. The first two hex numbers (cells) represent
    // the address of the memory region, the last two represent its size.
    reg = <0x0 0xD1C30000 0x0 0x1000>;
  };
};