जब Android HLOS को पिछली स्टेज से, Android HLOS CDI की वैल्यू और सर्टिफ़िकेट मिलते हैं, तो वह उन्हें पढ़ता है. इसके बाद, SDV सर्विस डिस्कवरी के लिए ज़रूरी सीक्रेट जनरेट करता है और उन्हें मिटा देता है. जैसे, सार्वजनिक और निजी कुंजी के जोड़े और CDI की अगली स्टेज.
यह प्रोसेस, दूसरे स्टेज के 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 एक
CBOR में एन्कोड किया गया मैप है. इसके बारे में, इस CDDL फ़्रैगमेंट में बताया गया है:
SdvDiceHandover = {
1 : bstr .size 32, ; CDI_Attest
2 : bstr .size 32, ; CDI_Seal
3 : DiceCertChain, ; Android SDV DICE chain
}
IRemotelyProvisionedComponent HAL DiceCertChain, DiceCertChain के फ़ॉर्मैट के बारे में बताता है. SdvDiceHandover के लिए, आपको
तय तरीके से एन्कोड किए गए CBOR की ज़रूरत नहीं होती. हालांकि, हमारा सुझाव है कि आप इसका इस्तेमाल करें, क्योंकि यह DICE की ज़्यादा नीतियों के साथ काम करता है.
SdvDiceHandover फ़ॉर्मैट, इन फ़ॉर्मैट से मिलता-जुलता है:
AndroidDiceHandoverफ़ॉर्मैट, जिसे DICE के रेफ़रंस के तौर पर लागू करने के लिए, Open Profile तय करता है,PvmfwDiceHandoverफ़ॉर्मैट, जिसका इस्तेमालpvmfwDICE चेन को pVM को सौंपने के लिए करता है. उदाहरण के लिए, Microdroid.
AndroidDiceHandover के उलट और PvmfwDiceHandover फ़ॉर्मैट की तरह, DiceCertChain ज़रूरी है. यह वैकल्पिक नहीं है.
DICE के कर्नल ड्राइवर के लिए, Open Profile
Android HLOS CDI को Android बूटलोडर (या हाइपरवाइज़र में गेस्ट लोडर, अगर बूटलोडर मौजूद नहीं है) से Android HLOS को सौंपने के लिए, DICE के कर्नल ड्राइवर के लिए Open Profile का इस्तेमाल किया जाता है. Android बूटलोडर, DICE चेन की एंट्री को गेस्ट की मेमोरी के किसी ऐसे हिस्से में लिखता है जिसे डिवाइस ट्री (डीटी) को तय करना होता है.
ड्राइवर, मेमोरी के उस हिस्से को पढ़ता है जिसे डीटी तय करता है. साथ ही, इसे उपयोगकर्ता स्पेस में /dev/open-dice0 डिवाइस के तौर पर दिखाता है. ड्राइवर, मेमोरी के इस हिस्से को पढ़ने और मिटाने की अनुमति देता है. DICE के ड्राइवर के लिए, Open Profile सिर्फ़ arm64 आर्किटेक्चर पर मौजूद होता है, क्योंकि डिवाइस ट्री सिर्फ़ arm64 के लिए एक कॉन्सेप्ट है.
मेमोरी के उस हिस्से के बारे में बताएं जिसे DICE के ड्राइवर के लिए, Open Profile दिखाता है. इसके लिए, डीटी में
reserved-memory नोड का इस्तेमाल करें. इस नोड को ड्राइवर के लिए टैग करने के लिए,
"google,open-dice" को compatible प्रॉपर्टी में तय करें. उदाहरण के लिए:
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>;
};
};