blob: 54f551b71467425f01346713081213ec12021fa8 [file] [log] [blame]
Janis Danisevskisc51dff82021-10-20 09:51:16 -07001// Copyright 2021, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! This module provides a set of sample input values for a DICE chain, a sample UDS,
16//! as well as tuple of CDIs and BCC derived thereof.
17
Alice Wangdb748d22023-09-19 11:18:29 +000018use alloc::vec;
19use alloc::vec::Vec;
Alice Wang8a9d1452023-03-01 12:47:31 +000020use ciborium::{de, ser, value::Value};
Alice Wangdb748d22023-09-19 11:18:29 +000021use core::ffi::CStr;
Alice Wang8a9d1452023-03-01 12:47:31 +000022use coset::{iana, Algorithm, AsCborValue, CoseKey, KeyOperation, KeyType, Label};
Alice Wangfa839222023-02-20 09:09:22 +000023use diced_open_dice::{
24 derive_cdi_private_key_seed, keypair_from_seed, retry_bcc_format_config_descriptor,
Alice Wangdb748d22023-09-19 11:18:29 +000025 retry_bcc_main_flow, retry_dice_main_flow, Config, DiceArtifacts, DiceConfigValues, DiceError,
26 DiceMode, InputValues, OwnedDiceArtifacts, Result, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
Alice Wangfa839222023-02-20 09:09:22 +000027};
Alice Wangdb748d22023-09-19 11:18:29 +000028use log::error;
Janis Danisevskisc51dff82021-10-20 09:51:16 -070029
30/// Sample UDS used to perform the root dice flow by `make_sample_bcc_and_cdis`.
Alice Wang4a3c97c2023-03-03 08:40:54 +000031const UDS: &[u8; CDI_SIZE] = &[
Janis Danisevskisc51dff82021-10-20 09:51:16 -070032 0x65, 0x4f, 0xab, 0xa9, 0xa5, 0xad, 0x0f, 0x5e, 0x15, 0xc3, 0x12, 0xf7, 0x77, 0x45, 0xfa, 0x55,
33 0x18, 0x6a, 0xa6, 0x34, 0xb6, 0x7c, 0x82, 0x7b, 0x89, 0x4c, 0xc5, 0x52, 0xd3, 0x27, 0x35, 0x8e,
34];
35
Alice Wangfa839222023-02-20 09:09:22 +000036const CODE_HASH_ABL: [u8; HASH_SIZE] = [
37 0x16, 0x48, 0xf2, 0x55, 0x53, 0x23, 0xdd, 0x15, 0x2e, 0x83, 0x38, 0xc3, 0x64, 0x38, 0x63, 0x26,
38 0x0f, 0xcf, 0x5b, 0xd1, 0x3a, 0xd3, 0x40, 0x3e, 0x23, 0xf8, 0x34, 0x4c, 0x6d, 0xa2, 0xbe, 0x25,
39 0x1c, 0xb0, 0x29, 0xe8, 0xc3, 0xfb, 0xb8, 0x80, 0xdc, 0xb1, 0xd2, 0xb3, 0x91, 0x4d, 0xd3, 0xfb,
40 0x01, 0x0f, 0xe4, 0xe9, 0x46, 0xa2, 0xc0, 0x26, 0x57, 0x5a, 0xba, 0x30, 0xf7, 0x15, 0x98, 0x14,
41];
42const AUTHORITY_HASH_ABL: [u8; HASH_SIZE] = [
43 0xf9, 0x00, 0x9d, 0xc2, 0x59, 0x09, 0xe0, 0xb6, 0x98, 0xbd, 0xe3, 0x97, 0x4a, 0xcb, 0x3c, 0xe7,
44 0x6b, 0x24, 0xc3, 0xe4, 0x98, 0xdd, 0xa9, 0x6a, 0x41, 0x59, 0x15, 0xb1, 0x23, 0xe6, 0xc8, 0xdf,
45 0xfb, 0x52, 0xb4, 0x52, 0xc1, 0xb9, 0x61, 0xdd, 0xbc, 0x5b, 0x37, 0x0e, 0x12, 0x12, 0xb2, 0xfd,
46 0xc1, 0x09, 0xb0, 0xcf, 0x33, 0x81, 0x4c, 0xc6, 0x29, 0x1b, 0x99, 0xea, 0xae, 0xfd, 0xaa, 0x0d,
47];
48const HIDDEN_ABL: [u8; HIDDEN_SIZE] = [
49 0xa2, 0x01, 0xd0, 0xc0, 0xaa, 0x75, 0x3c, 0x06, 0x43, 0x98, 0x6c, 0xc3, 0x5a, 0xb5, 0x5f, 0x1f,
50 0x0f, 0x92, 0x44, 0x3b, 0x0e, 0xd4, 0x29, 0x75, 0xe3, 0xdb, 0x36, 0xda, 0xc8, 0x07, 0x97, 0x4d,
51 0xff, 0xbc, 0x6a, 0xa4, 0x8a, 0xef, 0xc4, 0x7f, 0xf8, 0x61, 0x7d, 0x51, 0x4d, 0x2f, 0xdf, 0x7e,
52 0x8c, 0x3d, 0xa3, 0xfc, 0x63, 0xd4, 0xd4, 0x74, 0x8a, 0xc4, 0x14, 0x45, 0x83, 0x6b, 0x12, 0x7e,
53];
54const CODE_HASH_AVB: [u8; HASH_SIZE] = [
55 0xa4, 0x0c, 0xcb, 0xc1, 0xbf, 0xfa, 0xcc, 0xfd, 0xeb, 0xf4, 0xfc, 0x43, 0x83, 0x7f, 0x46, 0x8d,
56 0xd8, 0xd8, 0x14, 0xc1, 0x96, 0x14, 0x1f, 0x6e, 0xb3, 0xa0, 0xd9, 0x56, 0xb3, 0xbf, 0x2f, 0xfa,
57 0x88, 0x70, 0x11, 0x07, 0x39, 0xa4, 0xd2, 0xa9, 0x6b, 0x18, 0x28, 0xe8, 0x29, 0x20, 0x49, 0x0f,
58 0xbb, 0x8d, 0x08, 0x8c, 0xc6, 0x54, 0xe9, 0x71, 0xd2, 0x7e, 0xa4, 0xfe, 0x58, 0x7f, 0xd3, 0xc7,
59];
60const AUTHORITY_HASH_AVB: [u8; HASH_SIZE] = [
61 0xb2, 0x69, 0x05, 0x48, 0x56, 0xb5, 0xfa, 0x55, 0x6f, 0xac, 0x56, 0xd9, 0x02, 0x35, 0x2b, 0xaa,
62 0x4c, 0xba, 0x28, 0xdd, 0x82, 0x3a, 0x86, 0xf5, 0xd4, 0xc2, 0xf1, 0xf9, 0x35, 0x7d, 0xe4, 0x43,
63 0x13, 0xbf, 0xfe, 0xd3, 0x36, 0xd8, 0x1c, 0x12, 0x78, 0x5c, 0x9c, 0x3e, 0xf6, 0x66, 0xef, 0xab,
64 0x3d, 0x0f, 0x89, 0xa4, 0x6f, 0xc9, 0x72, 0xee, 0x73, 0x43, 0x02, 0x8a, 0xef, 0xbc, 0x05, 0x98,
65];
66const HIDDEN_AVB: [u8; HIDDEN_SIZE] = [
67 0x5b, 0x3f, 0xc9, 0x6b, 0xe3, 0x95, 0x59, 0x40, 0x5e, 0x64, 0xe5, 0x64, 0x3f, 0xfd, 0x21, 0x09,
68 0x9d, 0xf3, 0xcd, 0xc7, 0xa4, 0x2a, 0xe2, 0x97, 0xdd, 0xe2, 0x4f, 0xb0, 0x7d, 0x7e, 0xf5, 0x8e,
69 0xd6, 0x4d, 0x84, 0x25, 0x54, 0x41, 0x3f, 0x8f, 0x78, 0x64, 0x1a, 0x51, 0x27, 0x9d, 0x55, 0x8a,
70 0xe9, 0x90, 0x35, 0xab, 0x39, 0x80, 0x4b, 0x94, 0x40, 0x84, 0xa2, 0xfd, 0x73, 0xeb, 0x35, 0x7a,
71];
72const AUTHORITY_HASH_ANDROID: [u8; HASH_SIZE] = [
73 0x04, 0x25, 0x5d, 0x60, 0x5f, 0x5c, 0x45, 0x0d, 0xf2, 0x9a, 0x6e, 0x99, 0x30, 0x03, 0xb8, 0xd6,
74 0xe1, 0x99, 0x71, 0x1b, 0xf8, 0x44, 0xfa, 0xb5, 0x31, 0x79, 0x1c, 0x37, 0x68, 0x4e, 0x1d, 0xc0,
75 0x24, 0x74, 0x68, 0xf8, 0x80, 0x20, 0x3e, 0x44, 0xb1, 0x43, 0xd2, 0x9c, 0xfc, 0x12, 0x9e, 0x77,
76 0x0a, 0xde, 0x29, 0x24, 0xff, 0x2e, 0xfa, 0xc7, 0x10, 0xd5, 0x73, 0xd4, 0xc6, 0xdf, 0x62, 0x9f,
77];
78
Alice Wang8a9d1452023-03-01 12:47:31 +000079fn ed25519_public_key_to_cbor_value(public_key: &[u8]) -> Result<Value> {
Alice Wang84dcbe12023-02-28 13:50:47 +000080 let key = CoseKey {
81 kty: KeyType::Assigned(iana::KeyType::OKP),
82 alg: Some(Algorithm::Assigned(iana::Algorithm::EdDSA)),
83 key_ops: vec![KeyOperation::Assigned(iana::KeyOperation::Verify)].into_iter().collect(),
84 params: vec![
85 (
86 Label::Int(iana::Ec2KeyParameter::Crv as i64),
87 Value::from(iana::EllipticCurve::Ed25519 as u64),
88 ),
89 (Label::Int(iana::Ec2KeyParameter::X as i64), Value::Bytes(public_key.to_vec())),
90 ],
91 ..Default::default()
92 };
Alice Wangdb748d22023-09-19 11:18:29 +000093 key.to_cbor_value().map_err(|e| {
94 error!("Failed to serialize the key to CBOR data: {e}");
95 DiceError::InvalidInput
96 })
Janis Danisevskisc51dff82021-10-20 09:51:16 -070097}
98
Alice Wangfa839222023-02-20 09:09:22 +000099/// Makes a DICE chain (BCC) from the sample input.
100///
101/// The DICE chain is of the following format:
102/// public key derived from UDS -> ABL certificate -> AVB certificate -> Android certificate
103pub fn make_sample_bcc_and_cdis() -> Result<OwnedDiceArtifacts> {
Alice Wangdb748d22023-09-19 11:18:29 +0000104 let private_key_seed = derive_cdi_private_key_seed(UDS).map_err(|e| {
105 error!("In make_sample_bcc_and_cdis: Trying to derive private key seed. Error: {e}");
106 e
107 })?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700108
Alice Wang8a9d1452023-03-01 12:47:31 +0000109 // Gets the root public key in DICE chain (BCC).
Alice Wangdb748d22023-09-19 11:18:29 +0000110 let (public_key, _) = keypair_from_seed(private_key_seed.as_array()).map_err(|e| {
111 error!("In make_sample_bcc_and_cids: Failed to generate key pair. Error: {e}");
112 e
113 })?;
Alice Wang8a9d1452023-03-01 12:47:31 +0000114 let ed25519_public_key_value = ed25519_public_key_to_cbor_value(&public_key)?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700115
Alice Wang8a9d1452023-03-01 12:47:31 +0000116 // Gets the ABL certificate to as the root certificate of DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100117 let config_values = DiceConfigValues {
118 component_name: Some(CStr::from_bytes_with_nul(b"ABL\0").unwrap()),
119 component_version: Some(1),
120 resettable: true,
121 ..Default::default()
122 };
123 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000124 let input_values = InputValues::new(
125 CODE_HASH_ABL,
126 Config::Descriptor(config_descriptor.as_slice()),
127 AUTHORITY_HASH_ABL,
128 DiceMode::kDiceModeNormal,
129 HIDDEN_ABL,
130 );
Alice Wangdb748d22023-09-19 11:18:29 +0000131 let (cdi_values, cert) = retry_dice_main_flow(UDS, UDS, &input_values).map_err(|e| {
132 error!("In make_sample_bcc_and_cdis: Trying to run first main flow. Error: {e}");
133 e
134 })?;
Alice Wang8a9d1452023-03-01 12:47:31 +0000135 let bcc_value = Value::Array(vec![
136 ed25519_public_key_value,
Alice Wangdb748d22023-09-19 11:18:29 +0000137 de::from_reader(&cert[..]).map_err(|e| {
138 error!("Deserialize root DICE certificate failed: {e}");
139 DiceError::InvalidInput
140 })?,
Alice Wang8a9d1452023-03-01 12:47:31 +0000141 ]);
142 let mut bcc: Vec<u8> = vec![];
Alice Wangdb748d22023-09-19 11:18:29 +0000143 ser::into_writer(&bcc_value, &mut bcc).map_err(|e| {
144 error!("Serialize BCC failed: {e}");
145 DiceError::InvalidInput
146 })?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700147
Alice Wangfa839222023-02-20 09:09:22 +0000148 // Appends AVB certificate to DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100149 let config_values = DiceConfigValues {
150 component_name: Some(CStr::from_bytes_with_nul(b"AVB\0").unwrap()),
151 component_version: Some(1),
152 resettable: true,
153 ..Default::default()
154 };
155 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000156 let input_values = InputValues::new(
157 CODE_HASH_AVB,
158 Config::Descriptor(config_descriptor.as_slice()),
159 AUTHORITY_HASH_AVB,
160 DiceMode::kDiceModeNormal,
161 HIDDEN_AVB,
162 );
163 let dice_artifacts =
164 retry_bcc_main_flow(&cdi_values.cdi_attest, &cdi_values.cdi_seal, &bcc, &input_values)
Alice Wangdb748d22023-09-19 11:18:29 +0000165 .map_err(|e| {
166 error!(
167 "In make_sample_bcc_and_cdis: Trying to run first bcc main flow. Error: {e}"
168 );
169 e
170 })?;
Alice Wangfa839222023-02-20 09:09:22 +0000171
172 // Appends Android certificate to DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100173 let config_values = DiceConfigValues {
174 component_name: Some(CStr::from_bytes_with_nul(b"Android\0").unwrap()),
175 component_version: Some(12),
176 resettable: true,
177 ..Default::default()
178 };
179 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000180 let input_values = InputValues::new(
181 [0u8; HASH_SIZE], // code_hash
182 Config::Descriptor(config_descriptor.as_slice()),
183 AUTHORITY_HASH_ANDROID,
184 DiceMode::kDiceModeNormal,
185 [0u8; HIDDEN_SIZE], // hidden
186 );
187 retry_bcc_main_flow(
Alice Wang4d3059a2023-02-15 10:24:33 +0000188 dice_artifacts.cdi_attest(),
189 dice_artifacts.cdi_seal(),
Alice Wangdb748d22023-09-19 11:18:29 +0000190 dice_artifacts.bcc().ok_or_else(|| {
191 error!("bcc is none");
192 DiceError::InvalidInput
193 })?,
Alice Wangfa839222023-02-20 09:09:22 +0000194 &input_values,
Alice Wangf4bd1c62023-02-08 08:38:44 +0000195 )
Alice Wangdb748d22023-09-19 11:18:29 +0000196 .map_err(|e| {
197 error!("In make_sample_bcc_and_cdis: Trying to run second bcc main flow. Error: {e}");
198 e
199 })
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700200}