blob: c665eb3040bb5a3262abf6d96fbfaa01d6cf9f5d [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,
23 retry_bcc_main_flow, retry_dice_main_flow, Config, DiceArtifacts, DiceMode, InputValues,
24 OwnedDiceArtifacts, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
25};
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.
Alice Wangfa839222023-02-20 09:09:22 +0000109 let config_descriptor = retry_bcc_format_config_descriptor(
110 Some(CStr::from_bytes_with_nul(b"ABL\0").unwrap()),
111 Some(1), // version
112 true,
113 )?;
114 let input_values = InputValues::new(
115 CODE_HASH_ABL,
116 Config::Descriptor(config_descriptor.as_slice()),
117 AUTHORITY_HASH_ABL,
118 DiceMode::kDiceModeNormal,
119 HIDDEN_ABL,
120 );
Alice Wang8a9d1452023-03-01 12:47:31 +0000121 let (cdi_values, cert) = retry_dice_main_flow(UDS, UDS, &input_values)
Alice Wangfa839222023-02-20 09:09:22 +0000122 .context("In make_sample_bcc_and_cdis: Trying to run first main flow.")?;
Alice Wang8a9d1452023-03-01 12:47:31 +0000123 let bcc_value = Value::Array(vec![
124 ed25519_public_key_value,
125 de::from_reader(&cert[..]).context("Deserialize root DICE certificate failed")?,
126 ]);
127 let mut bcc: Vec<u8> = vec![];
128 ser::into_writer(&bcc_value, &mut bcc)?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700129
Alice Wangfa839222023-02-20 09:09:22 +0000130 // Appends AVB certificate to DICE chain.
131 let config_descriptor = retry_bcc_format_config_descriptor(
132 Some(CStr::from_bytes_with_nul(b"AVB\0").unwrap()),
133 Some(1), // version
134 true,
135 )?;
136 let input_values = InputValues::new(
137 CODE_HASH_AVB,
138 Config::Descriptor(config_descriptor.as_slice()),
139 AUTHORITY_HASH_AVB,
140 DiceMode::kDiceModeNormal,
141 HIDDEN_AVB,
142 );
143 let dice_artifacts =
144 retry_bcc_main_flow(&cdi_values.cdi_attest, &cdi_values.cdi_seal, &bcc, &input_values)
145 .context("In make_sample_bcc_and_cdis: Trying to run first bcc main flow.")?;
146
147 // Appends Android certificate to DICE chain.
148 let config_descriptor = retry_bcc_format_config_descriptor(
149 Some(CStr::from_bytes_with_nul(b"Android\0").unwrap()),
150 Some(12), // version
151 true,
152 )?;
153 let input_values = InputValues::new(
154 [0u8; HASH_SIZE], // code_hash
155 Config::Descriptor(config_descriptor.as_slice()),
156 AUTHORITY_HASH_ANDROID,
157 DiceMode::kDiceModeNormal,
158 [0u8; HIDDEN_SIZE], // hidden
159 );
160 retry_bcc_main_flow(
Alice Wang4d3059a2023-02-15 10:24:33 +0000161 dice_artifacts.cdi_attest(),
162 dice_artifacts.cdi_seal(),
163 dice_artifacts.bcc().ok_or_else(|| anyhow!("bcc is none"))?,
Alice Wangfa839222023-02-20 09:09:22 +0000164 &input_values,
Alice Wangf4bd1c62023-02-08 08:38:44 +0000165 )
166 .context("In make_sample_bcc_and_cdis: Trying to run second bcc main flow.")
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700167}