1*60b67249SAndroid Build Coastguard Worker // Copyright 2021 Google LLC 2*60b67249SAndroid Build Coastguard Worker // 3*60b67249SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*60b67249SAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*60b67249SAndroid Build Coastguard Worker // the License at 6*60b67249SAndroid Build Coastguard Worker // 7*60b67249SAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*60b67249SAndroid Build Coastguard Worker // 9*60b67249SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*60b67249SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*60b67249SAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*60b67249SAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*60b67249SAndroid Build Coastguard Worker // the License. 14*60b67249SAndroid Build Coastguard Worker 15*60b67249SAndroid Build Coastguard Worker #ifndef DICE_ANDROID_H_ 16*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_H_ 17*60b67249SAndroid Build Coastguard Worker 18*60b67249SAndroid Build Coastguard Worker #include <stdbool.h> 19*60b67249SAndroid Build Coastguard Worker 20*60b67249SAndroid Build Coastguard Worker #include "dice/dice.h" 21*60b67249SAndroid Build Coastguard Worker 22*60b67249SAndroid Build Coastguard Worker #ifdef __cplusplus 23*60b67249SAndroid Build Coastguard Worker extern "C" { 24*60b67249SAndroid Build Coastguard Worker #endif 25*60b67249SAndroid Build Coastguard Worker 26*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_CONFIG_COMPONENT_NAME (1 << 0) 27*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_CONFIG_COMPONENT_VERSION (1 << 1) 28*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_CONFIG_RESETTABLE (1 << 2) 29*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_CONFIG_SECURITY_VERSION (1 << 3) 30*60b67249SAndroid Build Coastguard Worker #define DICE_ANDROID_CONFIG_RKP_VM_MARKER (1 << 4) 31*60b67249SAndroid Build Coastguard Worker 32*60b67249SAndroid Build Coastguard Worker // Contains the input values used to construct the Android Profile for DICE 33*60b67249SAndroid Build Coastguard Worker // configuration descriptor. The fields to include in the configuration 34*60b67249SAndroid Build Coastguard Worker // descriptor are selected in the |configs| bitfield. 35*60b67249SAndroid Build Coastguard Worker // 36*60b67249SAndroid Build Coastguard Worker // Fields: 37*60b67249SAndroid Build Coastguard Worker // configs: A bitfield selecting the config fields to include. 38*60b67249SAndroid Build Coastguard Worker // component_name: Name of the component. 39*60b67249SAndroid Build Coastguard Worker // component_version: Version of the component. 40*60b67249SAndroid Build Coastguard Worker // security_version: Monotonically increasing version of the component. 41*60b67249SAndroid Build Coastguard Worker typedef struct DiceAndroidConfigValues_ { 42*60b67249SAndroid Build Coastguard Worker uint32_t configs; 43*60b67249SAndroid Build Coastguard Worker const char* component_name; 44*60b67249SAndroid Build Coastguard Worker uint64_t component_version; 45*60b67249SAndroid Build Coastguard Worker uint64_t security_version; 46*60b67249SAndroid Build Coastguard Worker } DiceAndroidConfigValues; 47*60b67249SAndroid Build Coastguard Worker 48*60b67249SAndroid Build Coastguard Worker // Formats a configuration descriptor following the Android Profile for DICE 49*60b67249SAndroid Build Coastguard Worker // specification. On success, |actual_size| is set to the number of bytes used. 50*60b67249SAndroid Build Coastguard Worker // If kDiceResultBufferTooSmall is returned |actual_size| will be set to the 51*60b67249SAndroid Build Coastguard Worker // required size of the buffer. 52*60b67249SAndroid Build Coastguard Worker DiceResult DiceAndroidFormatConfigDescriptor( 53*60b67249SAndroid Build Coastguard Worker const DiceAndroidConfigValues* config_values, size_t buffer_size, 54*60b67249SAndroid Build Coastguard Worker uint8_t* buffer, size_t* actual_size); 55*60b67249SAndroid Build Coastguard Worker 56*60b67249SAndroid Build Coastguard Worker // Executes the main Android DICE flow. 57*60b67249SAndroid Build Coastguard Worker // 58*60b67249SAndroid Build Coastguard Worker // Call this instead of DiceMainFlow when the next certificate should be 59*60b67249SAndroid Build Coastguard Worker // appended to an existing Android DICE chain. However, when using 60*60b67249SAndroid Build Coastguard Worker // the Android DICE handover format, use DiceAndroidHandoverMainFlow instead. 61*60b67249SAndroid Build Coastguard Worker // 62*60b67249SAndroid Build Coastguard Worker // Given the current CDIs, a full set of input values, and the current Android 63*60b67249SAndroid Build Coastguard Worker // DICE chain, computes the next CDIs and the extended DICE chain. On success, 64*60b67249SAndroid Build Coastguard Worker // |actual_size| is set to the number of bytes used. If 65*60b67249SAndroid Build Coastguard Worker // kDiceResultBufferTooSmall is returned |actual_size| will be set to the 66*60b67249SAndroid Build Coastguard Worker // required size of the buffer. 67*60b67249SAndroid Build Coastguard Worker DiceResult DiceAndroidMainFlow(void* context, 68*60b67249SAndroid Build Coastguard Worker const uint8_t current_cdi_attest[DICE_CDI_SIZE], 69*60b67249SAndroid Build Coastguard Worker const uint8_t current_cdi_seal[DICE_CDI_SIZE], 70*60b67249SAndroid Build Coastguard Worker const uint8_t* chain, size_t chain_size, 71*60b67249SAndroid Build Coastguard Worker const DiceInputValues* input_values, 72*60b67249SAndroid Build Coastguard Worker size_t buffer_size, uint8_t* buffer, 73*60b67249SAndroid Build Coastguard Worker size_t* actual_size, 74*60b67249SAndroid Build Coastguard Worker uint8_t next_cdi_attest[DICE_CDI_SIZE], 75*60b67249SAndroid Build Coastguard Worker uint8_t next_cdi_seal[DICE_CDI_SIZE]); 76*60b67249SAndroid Build Coastguard Worker 77*60b67249SAndroid Build Coastguard Worker // Executes the main Android DICE handover flow. 78*60b67249SAndroid Build Coastguard Worker // 79*60b67249SAndroid Build Coastguard Worker // Call this instead of DiceAndroidMainFlow when using the Android DICE handover 80*60b67249SAndroid Build Coastguard Worker // format to combine the Android DICE chain and CDIs in a single CBOR object. 81*60b67249SAndroid Build Coastguard Worker // 82*60b67249SAndroid Build Coastguard Worker // Given a full set of input values and the current Android DICE handover 83*60b67249SAndroid Build Coastguard Worker // object, computes the handover data for the next stage. On success, 84*60b67249SAndroid Build Coastguard Worker // |actual_size| is set to the number of bytes used. If 85*60b67249SAndroid Build Coastguard Worker // kDiceResultBufferTooSmall is returned |actual_size| will be set to the 86*60b67249SAndroid Build Coastguard Worker // required size of the buffer. 87*60b67249SAndroid Build Coastguard Worker // 88*60b67249SAndroid Build Coastguard Worker // Using the Android DICE handover object is one option for passing the values 89*60b67249SAndroid Build Coastguard Worker // between boot stages. Passing the bytes between stages is a problem left to 90*60b67249SAndroid Build Coastguard Worker // the caller. 91*60b67249SAndroid Build Coastguard Worker DiceResult DiceAndroidHandoverMainFlow(void* context, const uint8_t* handover, 92*60b67249SAndroid Build Coastguard Worker size_t handover_size, 93*60b67249SAndroid Build Coastguard Worker const DiceInputValues* input_values, 94*60b67249SAndroid Build Coastguard Worker size_t buffer_size, uint8_t* buffer, 95*60b67249SAndroid Build Coastguard Worker size_t* actual_size); 96*60b67249SAndroid Build Coastguard Worker 97*60b67249SAndroid Build Coastguard Worker // Parses an Android DICE handover object to extract the fields. 98*60b67249SAndroid Build Coastguard Worker // 99*60b67249SAndroid Build Coastguard Worker // Given a pointer to an Android DICE handover object, returns pointers to the 100*60b67249SAndroid Build Coastguard Worker // CDIs and DICE chain. If the DICE chain is not included in the handover 101*60b67249SAndroid Build Coastguard Worker // object, the pointer is NULL and the size is 0. 102*60b67249SAndroid Build Coastguard Worker DiceResult DiceAndroidHandoverParse(const uint8_t* handover, 103*60b67249SAndroid Build Coastguard Worker size_t handover_size, 104*60b67249SAndroid Build Coastguard Worker const uint8_t** cdi_attest, 105*60b67249SAndroid Build Coastguard Worker const uint8_t** cdi_seal, 106*60b67249SAndroid Build Coastguard Worker const uint8_t** chain, size_t* chain_size); 107*60b67249SAndroid Build Coastguard Worker 108*60b67249SAndroid Build Coastguard Worker #ifdef __cplusplus 109*60b67249SAndroid Build Coastguard Worker } // extern "C" 110*60b67249SAndroid Build Coastguard Worker #endif 111*60b67249SAndroid Build Coastguard Worker 112*60b67249SAndroid Build Coastguard Worker #endif // DICE_ANDROID_H_ 113