blob: 19200a552e2cdcba93fa572b961b226f116a73f8 [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 Wangfa839222023-02-20 09:09:22 +000019use diced_open_dice::{
20 derive_cdi_private_key_seed, keypair_from_seed, retry_bcc_format_config_descriptor,
21 retry_bcc_main_flow, retry_dice_main_flow, Config, DiceArtifacts, DiceMode, InputValues,
22 OwnedDiceArtifacts, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
23};
24use diced_utils::cbor;
Alice Wang9c40eca2023-02-03 13:10:24 +000025use std::ffi::CStr;
Janis Danisevskisc51dff82021-10-20 09:51:16 -070026use std::io::Write;
27
28/// Sample UDS used to perform the root dice flow by `make_sample_bcc_and_cdis`.
Alice Wangfa839222023-02-20 09:09:22 +000029pub const 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
Janis Danisevskisc51dff82021-10-20 09:51:16 -070077fn encode_pub_key_ed25519(pub_key: &[u8], stream: &mut dyn Write) -> Result<()> {
78 cbor::encode_header(5 /* CBOR MAP */, 5, stream)
79 .context("In encode_pub_key_ed25519: Trying to encode map header.")?;
80 cbor::encode_number(1, stream)
81 .context("In encode_pub_key_ed25519: Trying to encode Key type tag.")?;
82 cbor::encode_number(1, stream)
83 .context("In encode_pub_key_ed25519: Trying to encode Key type.")?;
84 cbor::encode_number(3, stream)
85 .context("In encode_pub_key_ed25519: Trying to encode algorithm tag.")?;
86 // Encoding a -8 for AlgorithmEdDSA. The encoded number is -1 - <header argument>,
87 // the an argument of 7 below.
88 cbor::encode_header(1 /* CBOR NEGATIVE INT */, 7 /* -1 -7 = -8*/, stream)
89 .context("In encode_pub_key_ed25519: Trying to encode algorithm.")?;
90 cbor::encode_number(4, stream)
91 .context("In encode_pub_key_ed25519: Trying to encode ops tag.")?;
Alan Stokes7cdcf992022-05-24 07:42:24 +000092 // Encoding a single-element array for key ops
93 cbor::encode_header(4 /* CBOR ARRAY */, 1, stream)
94 .context("In encode_pub_key_ed25519: Trying to encode ops array header.")?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -070095 // Ops 2 for verify.
96 cbor::encode_number(2, stream).context("In encode_pub_key_ed25519: Trying to encode ops.")?;
97 cbor::encode_header(1 /* CBOR NEGATIVE INT */, 0 /* -1 -0 = -1*/, stream)
98 .context("In encode_pub_key_ed25519: Trying to encode curve tag.")?;
99 // Curve 6 for Ed25519
100 cbor::encode_number(6, stream).context("In encode_pub_key_ed25519: Trying to encode curve.")?;
101 cbor::encode_header(1 /* CBOR NEGATIVE INT */, 1 /* -1 -1 = -2*/, stream)
102 .context("In encode_pub_key_ed25519: Trying to encode X coordinate tag.")?;
103 cbor::encode_bstr(pub_key, stream)
104 .context("In encode_pub_key_ed25519: Trying to encode X coordinate.")?;
105 Ok(())
106}
107
Alice Wangfa839222023-02-20 09:09:22 +0000108/// Makes a DICE chain (BCC) from the sample input.
109///
110/// The DICE chain is of the following format:
111/// public key derived from UDS -> ABL certificate -> AVB certificate -> Android certificate
112pub fn make_sample_bcc_and_cdis() -> Result<OwnedDiceArtifacts> {
113 let private_key_seed = derive_cdi_private_key_seed(UDS)
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700114 .context("In make_sample_bcc_and_cdis: Trying to derive private key seed.")?;
115
Alice Wangfa839222023-02-20 09:09:22 +0000116 // Sets the root public key in DICE chain (BCC).
117 let (public_key, _) = keypair_from_seed(private_key_seed.as_array())
Alice Wangf59662d2023-02-10 16:07:56 +0000118 .context("In make_sample_bcc_and_cids: Failed to generate key pair.")?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700119 let mut bcc: Vec<u8> = vec![];
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700120 cbor::encode_header(4 /* CBOR ARRAY */, 2, &mut bcc)
121 .context("In make_sample_bcc_and_cdis: Trying to encode array header.")?;
122 encode_pub_key_ed25519(&public_key, &mut bcc)
123 .context("In make_sample_bcc_and_cdis: Trying encode pub_key.")?;
124
Alice Wangfa839222023-02-20 09:09:22 +0000125 // Appends ABL certificate to DICE chain.
126 let config_descriptor = retry_bcc_format_config_descriptor(
127 Some(CStr::from_bytes_with_nul(b"ABL\0").unwrap()),
128 Some(1), // version
129 true,
130 )?;
131 let input_values = InputValues::new(
132 CODE_HASH_ABL,
133 Config::Descriptor(config_descriptor.as_slice()),
134 AUTHORITY_HASH_ABL,
135 DiceMode::kDiceModeNormal,
136 HIDDEN_ABL,
137 );
138 let (cdi_values, mut cert) = retry_dice_main_flow(UDS, UDS, &input_values)
139 .context("In make_sample_bcc_and_cdis: Trying to run first main flow.")?;
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700140 bcc.append(&mut cert);
141
Alice Wangfa839222023-02-20 09:09:22 +0000142 // Appends AVB certificate to DICE chain.
143 let config_descriptor = retry_bcc_format_config_descriptor(
144 Some(CStr::from_bytes_with_nul(b"AVB\0").unwrap()),
145 Some(1), // version
146 true,
147 )?;
148 let input_values = InputValues::new(
149 CODE_HASH_AVB,
150 Config::Descriptor(config_descriptor.as_slice()),
151 AUTHORITY_HASH_AVB,
152 DiceMode::kDiceModeNormal,
153 HIDDEN_AVB,
154 );
155 let dice_artifacts =
156 retry_bcc_main_flow(&cdi_values.cdi_attest, &cdi_values.cdi_seal, &bcc, &input_values)
157 .context("In make_sample_bcc_and_cdis: Trying to run first bcc main flow.")?;
158
159 // Appends Android certificate to DICE chain.
160 let config_descriptor = retry_bcc_format_config_descriptor(
161 Some(CStr::from_bytes_with_nul(b"Android\0").unwrap()),
162 Some(12), // version
163 true,
164 )?;
165 let input_values = InputValues::new(
166 [0u8; HASH_SIZE], // code_hash
167 Config::Descriptor(config_descriptor.as_slice()),
168 AUTHORITY_HASH_ANDROID,
169 DiceMode::kDiceModeNormal,
170 [0u8; HIDDEN_SIZE], // hidden
171 );
172 retry_bcc_main_flow(
Alice Wang4d3059a2023-02-15 10:24:33 +0000173 dice_artifacts.cdi_attest(),
174 dice_artifacts.cdi_seal(),
175 dice_artifacts.bcc().ok_or_else(|| anyhow!("bcc is none"))?,
Alice Wangfa839222023-02-20 09:09:22 +0000176 &input_values,
Alice Wangf4bd1c62023-02-08 08:38:44 +0000177 )
178 .context("In make_sample_bcc_and_cdis: Trying to run second bcc main flow.")
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700179}
180
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700181#[cfg(test)]
182mod test {
183 use super::*;
184
185 // This simple test checks if the invocation succeeds, essentially it tests
Alice Wangfa839222023-02-20 09:09:22 +0000186 // if the initial bcc is accepted by `diced_open_dice::retry_bcc_main_flow`.
Janis Danisevskisc51dff82021-10-20 09:51:16 -0700187 #[test]
188 fn make_sample_bcc_and_cdis_test() {
189 make_sample_bcc_and_cdis().unwrap();
190 }
191}