xref: /aosp_15_r20/external/open-dice/include/dice/android.h (revision 60b67249c2e226f42f35cc6cfe66c6048e0bae6b)
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