blob: 6ad15cd79f85834bba92a2a2e0166d62f02c6c1c [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 Wang4d3059a2023-02-15 10:24:33 +000018use anyhow::{anyhow, Context, Result};
Alice Wang8a9d1452023-03-01 12:47:31 +000019use ciborium::{de, ser, value::Value};
20use coset::{iana, Algorithm, AsCborValue, CoseKey, KeyOperation, KeyType, Label};
Alice Wangfa839222023-02-20 09:09:22 +000021use diced_open_dice::{
22 derive_cdi_private_key_seed, keypair_from_seed, retry_bcc_format_config_descriptor,
Alan Stokes82b12392023-08-22 14:39:29 +010023 retry_bcc_main_flow, retry_dice_main_flow, Config, DiceArtifacts, DiceConfigValues, DiceMode,
24 InputValues, OwnedDiceArtifacts, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
Alice Wangfa839222023-02-20 09:09:22 +000025};
Alice Wang9c40eca2023-02-03 13:10:24 +000026use std::ffi::CStr;
Janis Danisevskisc51dff82021-10-20 09:51:16 -070027
28/// Sample UDS used to perform the root dice flow by `make_sample_bcc_and_cdis`.
Alice Wang4a3c97c2023-03-03 08:40:54 +000029const UDS: &[u8; CDI_SIZE] = &[
Janis Danisevskisc51dff82021-10-20 09:51:16 -070030 0x65, 0x4f, 0xab, 0xa9, 0xa5, 0xad, 0x0f, 0x5e, 0x15, 0xc3, 0x12, 0xf7, 0x77, 0x45, 0xfa, 0x55,
31 0x18, 0x6a, 0xa6, 0x34, 0xb6, 0x7c, 0x82, 0x7b, 0x89, 0x4c, 0xc5, 0x52, 0xd3, 0x27, 0x35, 0x8e,
32];
33
Alice Wangfa839222023-02-20 09:09:22 +000034const CODE_HASH_ABL: [u8; HASH_SIZE] = [
35 0x16, 0x48, 0xf2, 0x55, 0x53, 0x23, 0xdd, 0x15, 0x2e, 0x83, 0x38, 0xc3, 0x64, 0x38, 0x63, 0x26,
36 0x0f, 0xcf, 0x5b, 0xd1, 0x3a, 0xd3, 0x40, 0x3e, 0x23, 0xf8, 0x34, 0x4c, 0x6d, 0xa2, 0xbe, 0x25,
37 0x1c, 0xb0, 0x29, 0xe8, 0xc3, 0xfb, 0xb8, 0x80, 0xdc, 0xb1, 0xd2, 0xb3, 0x91, 0x4d, 0xd3, 0xfb,
38 0x01, 0x0f, 0xe4, 0xe9, 0x46, 0xa2, 0xc0, 0x26, 0x57, 0x5a, 0xba, 0x30, 0xf7, 0x15, 0x98, 0x14,
39];
40const AUTHORITY_HASH_ABL: [u8; HASH_SIZE] = [
41 0xf9, 0x00, 0x9d, 0xc2, 0x59, 0x09, 0xe0, 0xb6, 0x98, 0xbd, 0xe3, 0x97, 0x4a, 0xcb, 0x3c, 0xe7,
42 0x6b, 0x24, 0xc3, 0xe4, 0x98, 0xdd, 0xa9, 0x6a, 0x41, 0x59, 0x15, 0xb1, 0x23, 0xe6, 0xc8, 0xdf,
43 0xfb, 0x52, 0xb4, 0x52, 0xc1, 0xb9, 0x61, 0xdd, 0xbc, 0x5b, 0x37, 0x0e, 0x12, 0x12, 0xb2, 0xfd,
44 0xc1, 0x09, 0xb0, 0xcf, 0x33, 0x81, 0x4c, 0xc6, 0x29, 0x1b, 0x99, 0xea, 0xae, 0xfd, 0xaa, 0x0d,
45];
46const HIDDEN_ABL: [u8; HIDDEN_SIZE] = [
47 0xa2, 0x01, 0xd0, 0xc0, 0xaa, 0x75, 0x3c, 0x06, 0x43, 0x98, 0x6c, 0xc3, 0x5a, 0xb5, 0x5f, 0x1f,
48 0x0f, 0x92, 0x44, 0x3b, 0x0e, 0xd4, 0x29, 0x75, 0xe3, 0xdb, 0x36, 0xda, 0xc8, 0x07, 0x97, 0x4d,
49 0xff, 0xbc, 0x6a, 0xa4, 0x8a, 0xef, 0xc4, 0x7f, 0xf8, 0x61, 0x7d, 0x51, 0x4d, 0x2f, 0xdf, 0x7e,
50 0x8c, 0x3d, 0xa3, 0xfc, 0x63, 0xd4, 0xd4, 0x74, 0x8a, 0xc4, 0x14, 0x45, 0x83, 0x6b, 0x12, 0x7e,
51];
52const CODE_HASH_AVB: [u8; HASH_SIZE] = [
53 0xa4, 0x0c, 0xcb, 0xc1, 0xbf, 0xfa, 0xcc, 0xfd, 0xeb, 0xf4, 0xfc, 0x43, 0x83, 0x7f, 0x46, 0x8d,
54 0xd8, 0xd8, 0x14, 0xc1, 0x96, 0x14, 0x1f, 0x6e, 0xb3, 0xa0, 0xd9, 0x56, 0xb3, 0xbf, 0x2f, 0xfa,
55 0x88, 0x70, 0x11, 0x07, 0x39, 0xa4, 0xd2, 0xa9, 0x6b, 0x18, 0x28, 0xe8, 0x29, 0x20, 0x49, 0x0f,
56 0xbb, 0x8d, 0x08, 0x8c, 0xc6, 0x54, 0xe9, 0x71, 0xd2, 0x7e, 0xa4, 0xfe, 0x58, 0x7f, 0xd3, 0xc7,
57];
58const AUTHORITY_HASH_AVB: [u8; HASH_SIZE] = [
59 0xb2, 0x69, 0x05, 0x48, 0x56, 0xb5, 0xfa, 0x55, 0x6f, 0xac, 0x56, 0xd9, 0x02, 0x35, 0x2b, 0xaa,
60 0x4c, 0xba, 0x28, 0xdd, 0x82, 0x3a, 0x86, 0xf5, 0xd4, 0xc2, 0xf1, 0xf9, 0x35, 0x7d, 0xe4, 0x43,
61 0x13, 0xbf, 0xfe, 0xd3, 0x36, 0xd8, 0x1c, 0x12, 0x78, 0x5c, 0x9c, 0x3e, 0xf6, 0x66, 0xef, 0xab,
62 0x3d, 0x0f, 0x89, 0xa4, 0x6f, 0xc9, 0x72, 0xee, 0x73, 0x43, 0x02, 0x8a, 0xef, 0xbc, 0x05, 0x98,
63];
64const HIDDEN_AVB: [u8; HIDDEN_SIZE] = [
65 0x5b, 0x3f, 0xc9, 0x6b, 0xe3, 0x95, 0x59, 0x40, 0x5e, 0x64, 0xe5, 0x64, 0x3f, 0xfd, 0x21, 0x09,
66 0x9d, 0xf3, 0xcd, 0xc7, 0xa4, 0x2a, 0xe2, 0x97, 0xdd, 0xe2, 0x4f, 0xb0, 0x7d, 0x7e, 0xf5, 0x8e,
67 0xd6, 0x4d, 0x84, 0x25, 0x54, 0x41, 0x3f, 0x8f, 0x78, 0x64, 0x1a, 0x51, 0x27, 0x9d, 0x55, 0x8a,
68 0xe9, 0x90, 0x35, 0xab, 0x39, 0x80, 0x4b, 0x94, 0x40, 0x84, 0xa2, 0xfd, 0x73, 0xeb, 0x35, 0x7a,
69];
70const AUTHORITY_HASH_ANDROID: [u8; HASH_SIZE] = [
71 0x04, 0x25, 0x5d, 0x60, 0x5f, 0x5c, 0x45, 0x0d, 0xf2, 0x9a, 0x6e, 0x99, 0x30, 0x03, 0xb8, 0xd6,
72 0xe1, 0x99, 0x71, 0x1b, 0xf8, 0x44, 0xfa, 0xb5, 0x31, 0x79, 0x1c, 0x37, 0x68, 0x4e, 0x1d, 0xc0,
73 0x24, 0x74, 0x68, 0xf8, 0x80, 0x20, 0x3e, 0x44, 0xb1, 0x43, 0xd2, 0x9c, 0xfc, 0x12, 0x9e, 0x77,
74 0x0a, 0xde, 0x29, 0x24, 0xff, 0x2e, 0xfa, 0xc7, 0x10, 0xd5, 0x73, 0xd4, 0xc6, 0xdf, 0x62, 0x9f,
75];
76
Alice Wang8a9d1452023-03-01 12:47:31 +000077fn ed25519_public_key_to_cbor_value(public_key: &[u8]) -> Result<Value> {
Alice Wang84dcbe12023-02-28 13:50:47 +000078 let key = CoseKey {
79 kty: KeyType::Assigned(iana::KeyType::OKP),
80 alg: Some(Algorithm::Assigned(iana::Algorithm::EdDSA)),
81 key_ops: vec![KeyOperation::Assigned(iana::KeyOperation::Verify)].into_iter().collect(),
82 params: vec![
83 (
84 Label::Int(iana::Ec2KeyParameter::Crv as i64),
85 Value::from(iana::EllipticCurve::Ed25519 as u64),
86 ),
87 (Label::Int(iana::Ec2KeyParameter::X as i64), Value::Bytes(public_key.to_vec())),
88 ],
89 ..Default::default()
90 };
Alice Wang8a9d1452023-03-01 12:47:31 +000091 key.to_cbor_value()
Alice Wang84dcbe12023-02-28 13:50:47 +000092 .map_err(|e| anyhow!(format!("Failed to serialize the key to CBOR data. Error: {e}")))
Janis Danisevskisc51dff82021-10-20 09:51:16 -070093}
94
Alice Wangfa839222023-02-20 09:09:22 +000095/// Makes a DICE chain (BCC) from the sample input.
96///
97/// The DICE chain is of the following format:
98/// public key derived from UDS -> ABL certificate -> AVB certificate -> Android certificate
99pub fn make_sample_bcc_and_cdis() -> Result<OwnedDiceArtifacts> {
100 let private_key_seed = derive_cdi_private_key_seed(UDS)
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700101 .context("In make_sample_bcc_and_cdis: Trying to derive private key seed.")?;
102
Alice Wang8a9d1452023-03-01 12:47:31 +0000103 // Gets the root public key in DICE chain (BCC).
Alice Wangfa839222023-02-20 09:09:22 +0000104 let (public_key, _) = keypair_from_seed(private_key_seed.as_array())
Alice Wangf59662d2023-02-10 16:07:56 +0000105 .context("In make_sample_bcc_and_cids: Failed to generate key pair.")?;
Alice Wang8a9d1452023-03-01 12:47:31 +0000106 let ed25519_public_key_value = ed25519_public_key_to_cbor_value(&public_key)?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700107
Alice Wang8a9d1452023-03-01 12:47:31 +0000108 // Gets the ABL certificate to as the root certificate of DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100109 let config_values = DiceConfigValues {
110 component_name: Some(CStr::from_bytes_with_nul(b"ABL\0").unwrap()),
111 component_version: Some(1),
112 resettable: true,
113 ..Default::default()
114 };
115 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000116 let input_values = InputValues::new(
117 CODE_HASH_ABL,
118 Config::Descriptor(config_descriptor.as_slice()),
119 AUTHORITY_HASH_ABL,
120 DiceMode::kDiceModeNormal,
121 HIDDEN_ABL,
122 );
Alice Wang8a9d1452023-03-01 12:47:31 +0000123 let (cdi_values, cert) = retry_dice_main_flow(UDS, UDS, &input_values)
Alice Wangfa839222023-02-20 09:09:22 +0000124 .context("In make_sample_bcc_and_cdis: Trying to run first main flow.")?;
Alice Wang8a9d1452023-03-01 12:47:31 +0000125 let bcc_value = Value::Array(vec![
126 ed25519_public_key_value,
127 de::from_reader(&cert[..]).context("Deserialize root DICE certificate failed")?,
128 ]);
129 let mut bcc: Vec<u8> = vec![];
130 ser::into_writer(&bcc_value, &mut bcc)?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700131
Alice Wangfa839222023-02-20 09:09:22 +0000132 // Appends AVB certificate to DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100133 let config_values = DiceConfigValues {
134 component_name: Some(CStr::from_bytes_with_nul(b"AVB\0").unwrap()),
135 component_version: Some(1),
136 resettable: true,
137 ..Default::default()
138 };
139 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000140 let input_values = InputValues::new(
141 CODE_HASH_AVB,
142 Config::Descriptor(config_descriptor.as_slice()),
143 AUTHORITY_HASH_AVB,
144 DiceMode::kDiceModeNormal,
145 HIDDEN_AVB,
146 );
147 let dice_artifacts =
148 retry_bcc_main_flow(&cdi_values.cdi_attest, &cdi_values.cdi_seal, &bcc, &input_values)
149 .context("In make_sample_bcc_and_cdis: Trying to run first bcc main flow.")?;
150
151 // Appends Android certificate to DICE chain.
Alan Stokes82b12392023-08-22 14:39:29 +0100152 let config_values = DiceConfigValues {
153 component_name: Some(CStr::from_bytes_with_nul(b"Android\0").unwrap()),
154 component_version: Some(12),
155 resettable: true,
156 ..Default::default()
157 };
158 let config_descriptor = retry_bcc_format_config_descriptor(&config_values)?;
Alice Wangfa839222023-02-20 09:09:22 +0000159 let input_values = InputValues::new(
160 [0u8; HASH_SIZE], // code_hash
161 Config::Descriptor(config_descriptor.as_slice()),
162 AUTHORITY_HASH_ANDROID,
163 DiceMode::kDiceModeNormal,
164 [0u8; HIDDEN_SIZE], // hidden
165 );
166 retry_bcc_main_flow(
Alice Wang4d3059a2023-02-15 10:24:33 +0000167 dice_artifacts.cdi_attest(),
168 dice_artifacts.cdi_seal(),
169 dice_artifacts.bcc().ok_or_else(|| anyhow!("bcc is none"))?,
Alice Wangfa839222023-02-20 09:09:22 +0000170 &input_values,
Alice Wangf4bd1c62023-02-08 08:38:44 +0000171 )
172 .context("In make_sample_bcc_and_cdis: Trying to run second bcc main flow.")
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700173}