blob: a5eb41cc4963a864d44e9c193ddac8ee6df2220b [file] [log] [blame]
Janis Danisevskis13356b22021-10-20 09:44:12 -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//! Implements safe wrappers around the public API of libopen-dice.
16//! ## Example:
17//! ```
18//! use diced_open_dice_cbor as dice;
19//!
20//! let context = dice::dice::OpenDiceCborContext::new()
21//! let parent_cdi_attest = [1u8, dice::CDI_SIZE];
22//! let parent_cdi_seal = [2u8, dice::CDI_SIZE];
Alice Wangb68814b2023-02-02 13:15:32 +000023//! let input_values = dice::InputValues::new(
24//! [3u8, dice::HASH_SIZE], // code_hash
25//! dice::Config::Descriptor(&"My descriptor".as_bytes().to_vec()),
26//! [0u8, dice::HASH_SIZE], // authority_hash
27//! dice::DiceMode::kDiceModeNormal,
28//! [0u8, dice::HIDDEN_SIZE], // hidden
Janis Danisevskis13356b22021-10-20 09:44:12 -070029//! };
30//! let (cdi_attest, cdi_seal, cert_chain) = context
31//! .main_flow(&parent_cdi_attest, &parent_cdi_seal, &input_values)?;
32//! ```
33
Alice Wang856d6562023-02-03 13:51:08 +000034pub use diced_open_dice::{
Alice Wang24954b42023-02-06 10:03:45 +000035 check_result, hash, retry_bcc_format_config_descriptor, Config, DiceError, Hash, Hidden,
36 InputValues, Result, CDI_SIZE, HASH_SIZE, HIDDEN_SIZE,
Alice Wang856d6562023-02-03 13:51:08 +000037};
38use keystore2_crypto::ZVec;
Janis Danisevskis2cef73f2021-11-03 15:02:48 -070039use open_dice_bcc_bindgen::BccMainFlow;
Alice Wang97d47a72023-01-31 12:48:02 +000040pub use open_dice_cbor_bindgen::DiceMode;
Janis Danisevskis13356b22021-10-20 09:44:12 -070041use open_dice_cbor_bindgen::{
Alice Wang24954b42023-02-06 10:03:45 +000042 DiceDeriveCdiCertificateId, DiceDeriveCdiPrivateKeySeed, DiceGenerateCertificate, DiceKdf,
43 DiceKeypairFromSeed, DiceMainFlow, DiceSign, DiceVerify, DICE_ID_SIZE,
Alice Wangb68814b2023-02-02 13:15:32 +000044 DICE_PRIVATE_KEY_SEED_SIZE, DICE_PRIVATE_KEY_SIZE, DICE_PUBLIC_KEY_SIZE, DICE_SIGNATURE_SIZE,
Janis Danisevskis13356b22021-10-20 09:44:12 -070045};
Alice Wang856d6562023-02-03 13:51:08 +000046use std::ffi::c_void;
Janis Danisevskis13356b22021-10-20 09:44:12 -070047
Janis Danisevskis13356b22021-10-20 09:44:12 -070048/// The size of a private key seed.
49pub const PRIVATE_KEY_SEED_SIZE: usize = DICE_PRIVATE_KEY_SEED_SIZE as usize;
Janis Danisevskis13356b22021-10-20 09:44:12 -070050/// The size of an ID.
51pub const ID_SIZE: usize = DICE_ID_SIZE as usize;
52/// The size of a private key.
53pub const PRIVATE_KEY_SIZE: usize = DICE_PRIVATE_KEY_SIZE as usize;
54/// The size of a public key.
55pub const PUBLIC_KEY_SIZE: usize = DICE_PUBLIC_KEY_SIZE as usize;
56/// The size of a signature.
57pub const SIGNATURE_SIZE: usize = DICE_SIGNATURE_SIZE as usize;
58
Janis Danisevskis13356b22021-10-20 09:44:12 -070059/// Multiple of the open dice function required preallocated output buffer
60/// which may be too small, this function implements the retry logic to handle
61/// too small buffer allocations.
62/// The callback `F` must expect a mutable reference to a buffer and a size hint
63/// field. The callback is called repeatedly as long as it returns
64/// `Err(Error::BufferTooSmall)`. If the size hint remains 0, the buffer size is
65/// doubled with each iteration. If the size hint is set by the callback, the buffer
66/// will be set to accommodate at least this many bytes.
67/// If the callback returns `Ok(())`, the buffer is truncated to the size hint
68/// exactly.
69/// The function panics if the callback returns `Ok(())` and the size hint is
70/// larger than the buffer size.
Alice Wang9c40eca2023-02-03 13:10:24 +000071/// TODO(b/267575445): Remove this method once we migrate all its callers to
72/// `retry_with_bigger_buffer` in `diced_open_dice`.
Janis Danisevskis13356b22021-10-20 09:44:12 -070073fn retry_while_adjusting_output_buffer<F>(mut f: F) -> Result<Vec<u8>>
74where
75 F: FnMut(&mut Vec<u8>, &mut usize) -> Result<()>,
76{
77 let mut buffer = vec![0; INITIAL_OUT_BUFFER_SIZE];
78 let mut actual_size: usize = 0;
79 loop {
80 match f(&mut buffer, &mut actual_size) {
81 // If Error::BufferTooSmall was returned, the allocated certificate
82 // buffer was to small for the output. So the buffer is resized to the actual
83 // size, and a second attempt is made with the new buffer.
Alice Wang856d6562023-02-03 13:51:08 +000084 Err(DiceError::BufferTooSmall) => {
Janis Danisevskis13356b22021-10-20 09:44:12 -070085 let new_size = if actual_size == 0 {
86 // Due to an off spec implementation of open dice cbor, actual size
87 // does not return the required size if the buffer was too small. So
88 // we have to try and approach it gradually.
89 buffer.len() * 2
90 } else {
91 actual_size
92 };
93 buffer.resize(new_size, 0);
94 continue;
95 }
96 Err(e) => return Err(e),
97 Ok(()) => {
98 if actual_size > buffer.len() {
99 panic!(
100 "actual_size larger than buffer size: open-dice function
101 may have written past the end of the buffer."
102 );
103 }
104 // Truncate the certificate buffer to the actual size because it may be
105 // smaller than the original allocation.
106 buffer.truncate(actual_size);
107 return Ok(buffer);
108 }
109 }
110 }
111}
112
113/// Some libopen-dice variants use a context. Developers that want to customize these
114/// bindings may want to implement their own Context factory that creates a context
115/// useable by their preferred backend.
116pub trait Context {
117 /// # Safety
118 /// The return value of get_context is passed to any open dice function.
119 /// Implementations must explain why the context pointer returned is safe
120 /// to be used by the open dice library.
121 unsafe fn get_context(&mut self) -> *mut c_void;
122}
123
124impl<T: Context + Send> ContextImpl for T {}
125
126/// This represents a context for the open dice library. The wrapped open dice instance, which
127/// is based on boringssl and cbor, does not use a context, so that this type is empty.
128#[derive(Default)]
129pub struct OpenDiceCborContext();
130
131impl OpenDiceCborContext {
132 /// Construct a new instance of OpenDiceCborContext.
133 pub fn new() -> Self {
134 Default::default()
135 }
136}
137
138impl Context for OpenDiceCborContext {
139 unsafe fn get_context(&mut self) -> *mut c_void {
140 // # Safety
141 // The open dice cbor implementation does not use a context. It is safe
142 // to return NULL.
143 std::ptr::null_mut()
144 }
145}
146
147/// Type alias for ZVec indicating that it holds a CDI_ATTEST secret.
148pub type CdiAttest = ZVec;
149
150/// Type alias for ZVec indicating that it holds a CDI_SEAL secret.
151pub type CdiSeal = ZVec;
152
153/// Type alias for Vec<u8> indicating that it hold a DICE certificate.
154pub type Cert = Vec<u8>;
155
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700156/// Type alias for Vec<u8> indicating that it holds a BCC certificate chain.
157pub type Bcc = Vec<u8>;
158
Janis Danisevskis13356b22021-10-20 09:44:12 -0700159const INITIAL_OUT_BUFFER_SIZE: usize = 1024;
160
161/// ContextImpl is a mixin trait that implements the safe wrappers around the open dice
162/// library calls. Implementations must implement Context::get_context(). As of
163/// this writing, the only implementation is OpenDiceCborContext, which returns NULL.
164pub trait ContextImpl: Context + Send {
165 /// Safe wrapper around open-dice DiceDeriveCdiPrivateKeySeed, see open dice
166 /// documentation for details.
167 fn derive_cdi_private_key_seed(&mut self, cdi_attest: &[u8; CDI_SIZE]) -> Result<ZVec> {
168 let mut seed = ZVec::new(PRIVATE_KEY_SEED_SIZE)?;
169 // SAFETY:
170 // * The first context argument may be NULL and is unused by the wrapped
171 // implementation.
172 // * The second argument is expected to be a const array of size CDI_SIZE.
173 // * The third argument is expected to be a non const array of size
174 // PRIVATE_KEY_SEED_SIZE which is fulfilled if the call to ZVec::new above
175 // succeeds.
176 // * No pointers are expected to be valid beyond the scope of the function
177 // call.
178 check_result(unsafe {
179 DiceDeriveCdiPrivateKeySeed(self.get_context(), cdi_attest.as_ptr(), seed.as_mut_ptr())
180 })?;
181 Ok(seed)
182 }
183
184 /// Safe wrapper around open-dice DiceDeriveCdiCertificateId, see open dice
185 /// documentation for details.
186 fn derive_cdi_certificate_id(&mut self, cdi_public_key: &[u8]) -> Result<ZVec> {
187 let mut id = ZVec::new(ID_SIZE)?;
188 // SAFETY:
189 // * The first context argument may be NULL and is unused by the wrapped
190 // implementation.
191 // * The second argument is expected to be a const array with a size given by the
192 // third argument.
193 // * The fourth argument is expected to be a non const array of size
194 // ID_SIZE which is fulfilled if the call to ZVec::new above succeeds.
195 // * No pointers are expected to be valid beyond the scope of the function
196 // call.
197 check_result(unsafe {
198 DiceDeriveCdiCertificateId(
199 self.get_context(),
200 cdi_public_key.as_ptr(),
201 cdi_public_key.len(),
202 id.as_mut_ptr(),
203 )
204 })?;
205 Ok(id)
206 }
207
208 /// Safe wrapper around open-dice DiceMainFlow, see open dice
209 /// documentation for details.
210 /// Returns a tuple of:
211 /// * The next attestation CDI,
212 /// * the next seal CDI, and
213 /// * the next attestation certificate.
214 /// `(next_attest_cdi, next_seal_cdi, next_attestation_cert)`
Alice Wangb68814b2023-02-02 13:15:32 +0000215 fn main_flow(
Janis Danisevskis13356b22021-10-20 09:44:12 -0700216 &mut self,
217 current_cdi_attest: &[u8; CDI_SIZE],
218 current_cdi_seal: &[u8; CDI_SIZE],
Alice Wangb68814b2023-02-02 13:15:32 +0000219 input_values: &InputValues,
Janis Danisevskis13356b22021-10-20 09:44:12 -0700220 ) -> Result<(CdiAttest, CdiSeal, Cert)> {
221 let mut next_attest = CdiAttest::new(CDI_SIZE)?;
222 let mut next_seal = CdiSeal::new(CDI_SIZE)?;
223
224 // SAFETY (DiceMainFlow):
225 // * The first context argument may be NULL and is unused by the wrapped
226 // implementation.
227 // * The second argument and the third argument are const arrays of size CDI_SIZE.
228 // This is fulfilled as per the definition of the arguments `current_cdi_attest`
229 // and `current_cdi_seal.
230 // * The fourth argument is a pointer to `DiceInputValues`. It, and its indirect
Alice Wangb68814b2023-02-02 13:15:32 +0000231 // references must be valid for the duration of the function call.
Janis Danisevskis13356b22021-10-20 09:44:12 -0700232 // * The fifth and sixth argument are the length of and the pointer to the
233 // allocated certificate buffer respectively. They are used to return
234 // the generated certificate.
235 // * The seventh argument is a pointer to a mutable usize object. It is
236 // used to return the actual size of the output certificate.
237 // * The eighth argument and the ninth argument are pointers to mutable buffers of size
238 // CDI_SIZE. This is fulfilled if the allocation above succeeded.
239 // * No pointers are expected to be valid beyond the scope of the function
240 // call.
Alice Wangb68814b2023-02-02 13:15:32 +0000241 let cert = retry_while_adjusting_output_buffer(|cert, actual_size| {
242 check_result(unsafe {
243 DiceMainFlow(
244 self.get_context(),
245 current_cdi_attest.as_ptr(),
246 current_cdi_seal.as_ptr(),
247 input_values.as_ptr(),
248 cert.len(),
249 cert.as_mut_ptr(),
250 actual_size as *mut _,
251 next_attest.as_mut_ptr(),
252 next_seal.as_mut_ptr(),
253 )
254 })
255 })?;
256 Ok((next_attest, next_seal, cert))
Janis Danisevskis13356b22021-10-20 09:44:12 -0700257 }
258
Janis Danisevskis13356b22021-10-20 09:44:12 -0700259 /// Safe wrapper around open-dice DiceKdf, see open dice
260 /// documentation for details.
261 fn kdf(&mut self, length: usize, input_key: &[u8], salt: &[u8], info: &[u8]) -> Result<ZVec> {
262 let mut output = ZVec::new(length)?;
263
264 // SAFETY:
265 // * The first context argument may be NULL and is unused by the wrapped
266 // implementation.
267 // * The second argument is primitive.
268 // * The third argument and the fourth argument are the pointer to and length of the given
269 // input key.
270 // * The fifth argument and the sixth argument are the pointer to and length of the given
271 // salt.
272 // * The seventh argument and the eighth argument are the pointer to and length of the
273 // given info field.
274 // * The ninth argument is a pointer to the output buffer which must have the
275 // length given by the `length` argument (see second argument). This is
276 // fulfilled if the allocation of `output` succeeds.
277 // * All pointers must be valid for the duration of the function call, but not
278 // longer.
279 check_result(unsafe {
280 DiceKdf(
281 self.get_context(),
282 length,
283 input_key.as_ptr(),
284 input_key.len(),
285 salt.as_ptr(),
286 salt.len(),
287 info.as_ptr(),
288 info.len(),
289 output.as_mut_ptr(),
290 )
291 })?;
292 Ok(output)
293 }
294
295 /// Safe wrapper around open-dice DiceKeyPairFromSeed, see open dice
296 /// documentation for details.
297 fn keypair_from_seed(&mut self, seed: &[u8; PRIVATE_KEY_SEED_SIZE]) -> Result<(Vec<u8>, ZVec)> {
298 let mut private_key = ZVec::new(PRIVATE_KEY_SIZE)?;
299 let mut public_key = vec![0u8; PUBLIC_KEY_SIZE];
300
301 // SAFETY:
302 // * The first context argument may be NULL and is unused by the wrapped
303 // implementation.
304 // * The second argument is a pointer to a const buffer of size `PRIVATE_KEY_SEED_SIZE`
305 // fulfilled by the definition of the argument.
306 // * The third argument and the fourth argument are mutable buffers of size
307 // `PRIVATE_KEY_SIZE` and `PUBLIC_KEY_SIZE` respectively. This is fulfilled by the
308 // allocations above.
309 // * All pointers must be valid for the duration of the function call but not beyond.
310 check_result(unsafe {
311 DiceKeypairFromSeed(
312 self.get_context(),
313 seed.as_ptr(),
314 public_key.as_mut_ptr(),
315 private_key.as_mut_ptr(),
316 )
317 })?;
318 Ok((public_key, private_key))
319 }
320
321 /// Safe wrapper around open-dice DiceSign, see open dice
322 /// documentation for details.
323 fn sign(&mut self, message: &[u8], private_key: &[u8; PRIVATE_KEY_SIZE]) -> Result<Vec<u8>> {
324 let mut signature = vec![0u8; SIGNATURE_SIZE];
325
326 // SAFETY:
327 // * The first context argument may be NULL and is unused by the wrapped
328 // implementation.
329 // * The second argument and the third argument are the pointer to and length of the given
330 // message buffer.
331 // * The fourth argument is a const buffer of size `PRIVATE_KEY_SIZE`. This is fulfilled
332 // by the definition of `private key`.
333 // * The fifth argument is mutable buffer of size `SIGNATURE_SIZE`. This is fulfilled
334 // by the allocation above.
335 // * All pointers must be valid for the duration of the function call but not beyond.
336 check_result(unsafe {
337 DiceSign(
338 self.get_context(),
339 message.as_ptr(),
340 message.len(),
341 private_key.as_ptr(),
342 signature.as_mut_ptr(),
343 )
344 })?;
345 Ok(signature)
346 }
347
348 /// Safe wrapper around open-dice DiceVerify, see open dice
349 /// documentation for details.
350 fn verify(
351 &mut self,
352 message: &[u8],
353 signature: &[u8; SIGNATURE_SIZE],
354 public_key: &[u8; PUBLIC_KEY_SIZE],
355 ) -> Result<()> {
356 // SAFETY:
357 // * The first context argument may be NULL and is unused by the wrapped
358 // implementation.
359 // * The second argument and the third argument are the pointer to and length of the given
360 // message buffer.
361 // * The fourth argument is a const buffer of size `SIGNATURE_SIZE`. This is fulfilled
362 // by the definition of `signature`.
363 // * The fifth argument is a const buffer of size `PUBLIC_KEY_SIZE`. This is fulfilled
364 // by the definition of `public_key`.
365 // * All pointers must be valid for the duration of the function call but not beyond.
366 check_result(unsafe {
367 DiceVerify(
368 self.get_context(),
369 message.as_ptr(),
370 message.len(),
371 signature.as_ptr(),
372 public_key.as_ptr(),
373 )
374 })
375 }
376
377 /// Safe wrapper around open-dice DiceGenerateCertificate, see open dice
378 /// documentation for details.
Alice Wangb68814b2023-02-02 13:15:32 +0000379 fn generate_certificate(
Janis Danisevskis13356b22021-10-20 09:44:12 -0700380 &mut self,
381 subject_private_key_seed: &[u8; PRIVATE_KEY_SEED_SIZE],
382 authority_private_key_seed: &[u8; PRIVATE_KEY_SEED_SIZE],
Alice Wangb68814b2023-02-02 13:15:32 +0000383 input_values: &InputValues,
Janis Danisevskis13356b22021-10-20 09:44:12 -0700384 ) -> Result<Vec<u8>> {
Alice Wangb68814b2023-02-02 13:15:32 +0000385 // SAFETY (DiceGenerateCertificate):
Janis Danisevskis13356b22021-10-20 09:44:12 -0700386 // * The first context argument may be NULL and is unused by the wrapped
387 // implementation.
388 // * The second argument and the third argument are const arrays of size
389 // `PRIVATE_KEY_SEED_SIZE`. This is fulfilled as per the definition of the arguments.
390 // * The fourth argument is a pointer to `DiceInputValues` it, and its indirect
Alice Wangb68814b2023-02-02 13:15:32 +0000391 // references must be valid for the duration of the function call.
Janis Danisevskis13356b22021-10-20 09:44:12 -0700392 // * The fifth argument and the sixth argument are the length of and the pointer to the
393 // allocated certificate buffer respectively. They are used to return
394 // the generated certificate.
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700395 // * The seventh argument is a pointer to a mutable usize object. It is
Janis Danisevskis13356b22021-10-20 09:44:12 -0700396 // used to return the actual size of the output certificate.
397 // * All pointers must be valid for the duration of the function call but not beyond.
Alice Wangb68814b2023-02-02 13:15:32 +0000398 let cert = retry_while_adjusting_output_buffer(|cert, actual_size| {
399 check_result(unsafe {
400 DiceGenerateCertificate(
401 self.get_context(),
402 subject_private_key_seed.as_ptr(),
403 authority_private_key_seed.as_ptr(),
404 input_values.as_ptr(),
405 cert.len(),
406 cert.as_mut_ptr(),
407 actual_size as *mut _,
408 )
409 })
410 })?;
411 Ok(cert)
Janis Danisevskis13356b22021-10-20 09:44:12 -0700412 }
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700413
414 /// Safe wrapper around open-dice BccDiceMainFlow, see open dice
415 /// documentation for details.
416 /// Returns a tuple of:
417 /// * The next attestation CDI,
418 /// * the next seal CDI, and
419 /// * the next bcc adding the new certificate to the given bcc.
420 /// `(next_attest_cdi, next_seal_cdi, next_bcc)`
Alice Wangb68814b2023-02-02 13:15:32 +0000421 fn bcc_main_flow(
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700422 &mut self,
423 current_cdi_attest: &[u8; CDI_SIZE],
424 current_cdi_seal: &[u8; CDI_SIZE],
425 bcc: &[u8],
Alice Wangb68814b2023-02-02 13:15:32 +0000426 input_values: &InputValues,
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700427 ) -> Result<(CdiAttest, CdiSeal, Bcc)> {
428 let mut next_attest = CdiAttest::new(CDI_SIZE)?;
429 let mut next_seal = CdiSeal::new(CDI_SIZE)?;
430
431 // SAFETY (BccMainFlow):
432 // * The first context argument may be NULL and is unused by the wrapped
433 // implementation.
434 // * The second argument and the third argument are const arrays of size CDI_SIZE.
435 // This is fulfilled as per the definition of the arguments `current_cdi_attest`
436 // and `current_cdi_seal`.
437 // * The fourth argument and the fifth argument are the pointer to and size of the buffer
438 // holding the current bcc.
439 // * The sixth argument is a pointer to `DiceInputValues` it, and its indirect
Alice Wangb68814b2023-02-02 13:15:32 +0000440 // references must be valid for the duration of the function call.
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700441 // * The seventh argument and the eighth argument are the length of and the pointer to the
442 // allocated certificate buffer respectively. They are used to return the generated
443 // certificate.
444 // * The ninth argument is a pointer to a mutable usize object. It is
445 // used to return the actual size of the output certificate.
446 // * The tenth argument and the eleventh argument are pointers to mutable buffers of
447 // size CDI_SIZE. This is fulfilled if the allocation above succeeded.
448 // * No pointers are expected to be valid beyond the scope of the function
449 // call.
Alice Wangb68814b2023-02-02 13:15:32 +0000450 let next_bcc = retry_while_adjusting_output_buffer(|next_bcc, actual_size| {
451 check_result(unsafe {
452 BccMainFlow(
453 self.get_context(),
454 current_cdi_attest.as_ptr(),
455 current_cdi_seal.as_ptr(),
456 bcc.as_ptr(),
457 bcc.len(),
458 input_values.as_ptr(),
459 next_bcc.len(),
460 next_bcc.as_mut_ptr(),
461 actual_size as *mut _,
462 next_attest.as_mut_ptr(),
463 next_seal.as_mut_ptr(),
464 )
465 })
466 })?;
467 Ok((next_attest, next_seal, next_bcc))
Janis Danisevskis2cef73f2021-11-03 15:02:48 -0700468 }
469}
470
Janis Danisevskisdb78b772021-11-29 17:59:50 -0800471#[cfg(test)]
472mod test {
473 use super::*;
474 use diced_sample_inputs::make_sample_bcc_and_cdis;
475 use std::convert::TryInto;
476
477 static SEED_TEST_VECTOR: &[u8] = &[
478 0xfa, 0x3c, 0x2f, 0x58, 0x37, 0xf5, 0x8e, 0x96, 0x16, 0x09, 0xf5, 0x22, 0xa1, 0xf1, 0xba,
479 0xaa, 0x19, 0x95, 0x01, 0x79, 0x2e, 0x60, 0x56, 0xaf, 0xf6, 0x41, 0xe7, 0xff, 0x48, 0xf5,
480 0x3a, 0x08, 0x84, 0x8a, 0x98, 0x85, 0x6d, 0xf5, 0x69, 0x21, 0x03, 0xcd, 0x09, 0xc3, 0x28,
481 0xd6, 0x06, 0xa7, 0x57, 0xbd, 0x48, 0x4b, 0x0f, 0x79, 0x0f, 0xf8, 0x2f, 0xf0, 0x0a, 0x41,
482 0x94, 0xd8, 0x8c, 0xa8,
483 ];
484
485 static CDI_ATTEST_TEST_VECTOR: &[u8] = &[
486 0xfa, 0x3c, 0x2f, 0x58, 0x37, 0xf5, 0x8e, 0x96, 0x16, 0x09, 0xf5, 0x22, 0xa1, 0xf1, 0xba,
487 0xaa, 0x19, 0x95, 0x01, 0x79, 0x2e, 0x60, 0x56, 0xaf, 0xf6, 0x41, 0xe7, 0xff, 0x48, 0xf5,
488 0x3a, 0x08,
489 ];
490 static CDI_PRIVATE_KEY_SEED_TEST_VECTOR: &[u8] = &[
491 0x5f, 0xcc, 0x8e, 0x1a, 0xd1, 0xc2, 0xb3, 0xe9, 0xfb, 0xe1, 0x68, 0xf0, 0xf6, 0x98, 0xfe,
492 0x0d, 0xee, 0xd4, 0xb5, 0x18, 0xcb, 0x59, 0x70, 0x2d, 0xee, 0x06, 0xe5, 0x70, 0xf1, 0x72,
493 0x02, 0x6e,
494 ];
495
496 static PUB_KEY_TEST_VECTOR: &[u8] = &[
497 0x47, 0x42, 0x4b, 0xbd, 0xd7, 0x23, 0xb4, 0xcd, 0xca, 0xe2, 0x8e, 0xdc, 0x6b, 0xfc, 0x23,
498 0xc9, 0x21, 0x5c, 0x48, 0x21, 0x47, 0xee, 0x5b, 0xfa, 0xaf, 0x88, 0x9a, 0x52, 0xf1, 0x61,
499 0x06, 0x37,
500 ];
501 static PRIV_KEY_TEST_VECTOR: &[u8] = &[
502 0x5f, 0xcc, 0x8e, 0x1a, 0xd1, 0xc2, 0xb3, 0xe9, 0xfb, 0xe1, 0x68, 0xf0, 0xf6, 0x98, 0xfe,
503 0x0d, 0xee, 0xd4, 0xb5, 0x18, 0xcb, 0x59, 0x70, 0x2d, 0xee, 0x06, 0xe5, 0x70, 0xf1, 0x72,
504 0x02, 0x6e, 0x47, 0x42, 0x4b, 0xbd, 0xd7, 0x23, 0xb4, 0xcd, 0xca, 0xe2, 0x8e, 0xdc, 0x6b,
505 0xfc, 0x23, 0xc9, 0x21, 0x5c, 0x48, 0x21, 0x47, 0xee, 0x5b, 0xfa, 0xaf, 0x88, 0x9a, 0x52,
506 0xf1, 0x61, 0x06, 0x37,
507 ];
508
509 static SIGNATURE_TEST_VECTOR: &[u8] = &[
510 0x44, 0xae, 0xcc, 0xe2, 0xb9, 0x96, 0x18, 0x39, 0x0e, 0x61, 0x0f, 0x53, 0x07, 0xbf, 0xf2,
511 0x32, 0x3d, 0x44, 0xd4, 0xf2, 0x07, 0x23, 0x30, 0x85, 0x32, 0x18, 0xd2, 0x69, 0xb8, 0x29,
512 0x3c, 0x26, 0xe6, 0x0d, 0x9c, 0xa5, 0xc2, 0x73, 0xcd, 0x8c, 0xb8, 0x3c, 0x3e, 0x5b, 0xfd,
513 0x62, 0x8d, 0xf6, 0xc4, 0x27, 0xa6, 0xe9, 0x11, 0x06, 0x5a, 0xb2, 0x2b, 0x64, 0xf7, 0xfc,
514 0xbb, 0xab, 0x4a, 0x0e,
515 ];
516
517 #[test]
518 fn hash_derive_sign_verify() {
519 let mut ctx = OpenDiceCborContext::new();
Alice Wang24954b42023-02-06 10:03:45 +0000520 let seed = diced_open_dice::hash("MySeedString".as_bytes()).unwrap();
Janis Danisevskisdb78b772021-11-29 17:59:50 -0800521 assert_eq!(seed, SEED_TEST_VECTOR);
522 let cdi_attest = &seed[..CDI_SIZE];
523 assert_eq!(cdi_attest, CDI_ATTEST_TEST_VECTOR);
524 let cdi_private_key_seed =
525 ctx.derive_cdi_private_key_seed(cdi_attest.try_into().unwrap()).unwrap();
526 assert_eq!(&cdi_private_key_seed[..], CDI_PRIVATE_KEY_SEED_TEST_VECTOR);
527 let (pub_key, priv_key) =
528 ctx.keypair_from_seed(cdi_private_key_seed[..].try_into().unwrap()).unwrap();
529 assert_eq!(&pub_key, PUB_KEY_TEST_VECTOR);
530 assert_eq!(&priv_key[..], PRIV_KEY_TEST_VECTOR);
531 let mut signature =
532 ctx.sign("MyMessage".as_bytes(), priv_key[..].try_into().unwrap()).unwrap();
533 assert_eq!(&signature, SIGNATURE_TEST_VECTOR);
534 assert!(ctx
535 .verify(
536 "MyMessage".as_bytes(),
537 signature[..].try_into().unwrap(),
538 pub_key[..].try_into().unwrap()
539 )
540 .is_ok());
541 assert!(ctx
542 .verify(
543 "MyMessage_fail".as_bytes(),
544 signature[..].try_into().unwrap(),
545 pub_key[..].try_into().unwrap()
546 )
547 .is_err());
548 signature[0] += 1;
549 assert!(ctx
550 .verify(
551 "MyMessage".as_bytes(),
552 signature[..].try_into().unwrap(),
553 pub_key[..].try_into().unwrap()
554 )
555 .is_err());
556 }
557
558 static SAMPLE_CDI_ATTEST_TEST_VECTOR: &[u8] = &[
559 0x3e, 0x57, 0x65, 0x5d, 0x48, 0x02, 0xbd, 0x5c, 0x66, 0xcc, 0x1f, 0x0f, 0xbe, 0x5e, 0x32,
560 0xb6, 0x9e, 0x3d, 0x04, 0xaf, 0x00, 0x15, 0xbc, 0xdd, 0x1f, 0xbc, 0x59, 0xe4, 0xc3, 0x87,
561 0x95, 0x5e,
562 ];
563
564 static SAMPLE_CDI_SEAL_TEST_VECTOR: &[u8] = &[
565 0x36, 0x1b, 0xd2, 0xb3, 0xc4, 0xda, 0x77, 0xb2, 0x9c, 0xba, 0x39, 0x53, 0x82, 0x93, 0xd9,
566 0xb8, 0x9f, 0x73, 0x2d, 0x27, 0x06, 0x15, 0xa8, 0xcb, 0x6d, 0x1d, 0xf2, 0xb1, 0x54, 0xbb,
567 0x62, 0xf1,
568 ];
569
570 static SAMPLE_BCC_TEST_VECTOR: &[u8] = &[
Alan Stokes7cdcf992022-05-24 07:42:24 +0000571 0x84, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02, 0x20, 0x06, 0x21, 0x58, 0x20, 0x3e,
572 0x85, 0xe5, 0x72, 0x75, 0x55, 0xe5, 0x1e, 0xe7, 0xf3, 0x35, 0x94, 0x8e, 0xbb, 0xbd, 0x74,
573 0x1e, 0x1d, 0xca, 0x49, 0x9c, 0x97, 0x39, 0x77, 0x06, 0xd3, 0xc8, 0x6e, 0x8b, 0xd7, 0x33,
574 0xf9, 0x84, 0x43, 0xa1, 0x01, 0x27, 0xa0, 0x59, 0x01, 0x8a, 0xa9, 0x01, 0x78, 0x28, 0x34,
575 0x32, 0x64, 0x38, 0x38, 0x36, 0x34, 0x66, 0x39, 0x37, 0x62, 0x36, 0x35, 0x34, 0x37, 0x61,
576 0x35, 0x30, 0x63, 0x31, 0x65, 0x30, 0x61, 0x37, 0x34, 0x39, 0x66, 0x38, 0x65, 0x66, 0x38,
577 0x62, 0x38, 0x31, 0x65, 0x63, 0x36, 0x32, 0x61, 0x66, 0x02, 0x78, 0x28, 0x31, 0x66, 0x36,
578 0x39, 0x36, 0x66, 0x30, 0x37, 0x32, 0x35, 0x32, 0x66, 0x32, 0x39, 0x65, 0x39, 0x33, 0x66,
579 0x65, 0x34, 0x64, 0x65, 0x31, 0x39, 0x65, 0x65, 0x33, 0x32, 0x63, 0x64, 0x38, 0x31, 0x64,
580 0x63, 0x34, 0x30, 0x34, 0x65, 0x37, 0x36, 0x3a, 0x00, 0x47, 0x44, 0x50, 0x58, 0x40, 0x16,
581 0x48, 0xf2, 0x55, 0x53, 0x23, 0xdd, 0x15, 0x2e, 0x83, 0x38, 0xc3, 0x64, 0x38, 0x63, 0x26,
582 0x0f, 0xcf, 0x5b, 0xd1, 0x3a, 0xd3, 0x40, 0x3e, 0x23, 0xf8, 0x34, 0x4c, 0x6d, 0xa2, 0xbe,
583 0x25, 0x1c, 0xb0, 0x29, 0xe8, 0xc3, 0xfb, 0xb8, 0x80, 0xdc, 0xb1, 0xd2, 0xb3, 0x91, 0x4d,
584 0xd3, 0xfb, 0x01, 0x0f, 0xe4, 0xe9, 0x46, 0xa2, 0xc0, 0x26, 0x57, 0x5a, 0xba, 0x30, 0xf7,
585 0x15, 0x98, 0x14, 0x3a, 0x00, 0x47, 0x44, 0x53, 0x56, 0xa3, 0x3a, 0x00, 0x01, 0x11, 0x71,
586 0x63, 0x41, 0x42, 0x4c, 0x3a, 0x00, 0x01, 0x11, 0x72, 0x01, 0x3a, 0x00, 0x01, 0x11, 0x73,
587 0xf6, 0x3a, 0x00, 0x47, 0x44, 0x52, 0x58, 0x40, 0x47, 0xae, 0x42, 0x27, 0x4c, 0xcb, 0x65,
588 0x4d, 0xee, 0x74, 0x2d, 0x05, 0x78, 0x2a, 0x08, 0x2a, 0xa5, 0xf0, 0xcf, 0xea, 0x3e, 0x60,
589 0xee, 0x97, 0x11, 0x4b, 0x5b, 0xe6, 0x05, 0x0c, 0xe8, 0x90, 0xf5, 0x22, 0xc4, 0xc6, 0x67,
590 0x7a, 0x22, 0x27, 0x17, 0xb3, 0x79, 0xcc, 0x37, 0x64, 0x5e, 0x19, 0x4f, 0x96, 0x37, 0x67,
591 0x3c, 0xd0, 0xc5, 0xed, 0x0f, 0xdd, 0xe7, 0x2e, 0x4f, 0x70, 0x97, 0x30, 0x3a, 0x00, 0x47,
592 0x44, 0x54, 0x58, 0x40, 0xf9, 0x00, 0x9d, 0xc2, 0x59, 0x09, 0xe0, 0xb6, 0x98, 0xbd, 0xe3,
593 0x97, 0x4a, 0xcb, 0x3c, 0xe7, 0x6b, 0x24, 0xc3, 0xe4, 0x98, 0xdd, 0xa9, 0x6a, 0x41, 0x59,
594 0x15, 0xb1, 0x23, 0xe6, 0xc8, 0xdf, 0xfb, 0x52, 0xb4, 0x52, 0xc1, 0xb9, 0x61, 0xdd, 0xbc,
595 0x5b, 0x37, 0x0e, 0x12, 0x12, 0xb2, 0xfd, 0xc1, 0x09, 0xb0, 0xcf, 0x33, 0x81, 0x4c, 0xc6,
596 0x29, 0x1b, 0x99, 0xea, 0xae, 0xfd, 0xaa, 0x0d, 0x3a, 0x00, 0x47, 0x44, 0x56, 0x41, 0x01,
597 0x3a, 0x00, 0x47, 0x44, 0x57, 0x58, 0x2d, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02,
598 0x20, 0x06, 0x21, 0x58, 0x20, 0xb1, 0x02, 0xcc, 0x2c, 0xb2, 0x6a, 0x3b, 0xe9, 0xc1, 0xd3,
599 0x95, 0x10, 0xa0, 0xe1, 0xff, 0x51, 0xde, 0x57, 0xd5, 0x65, 0x28, 0xfd, 0x7f, 0xeb, 0xd4,
600 0xca, 0x15, 0xf3, 0xca, 0xdf, 0x37, 0x88, 0x3a, 0x00, 0x47, 0x44, 0x58, 0x41, 0x20, 0x58,
601 0x40, 0x58, 0xd8, 0x03, 0x24, 0x53, 0x60, 0x57, 0xa9, 0x09, 0xfa, 0xab, 0xdc, 0x57, 0x1e,
602 0xf0, 0xe5, 0x1e, 0x51, 0x6f, 0x9e, 0xa3, 0x42, 0xe6, 0x6a, 0x8c, 0xaa, 0xad, 0x08, 0x48,
603 0xde, 0x7f, 0x4f, 0x6e, 0x2f, 0x7f, 0x39, 0x6c, 0xa1, 0xf8, 0x42, 0x71, 0xfe, 0x17, 0x3d,
604 0xca, 0x31, 0x83, 0x92, 0xed, 0xbb, 0x40, 0xb8, 0x10, 0xe0, 0xf2, 0x5a, 0x99, 0x53, 0x38,
605 0x46, 0x33, 0x97, 0x78, 0x05, 0x84, 0x43, 0xa1, 0x01, 0x27, 0xa0, 0x59, 0x01, 0x8a, 0xa9,
606 0x01, 0x78, 0x28, 0x31, 0x66, 0x36, 0x39, 0x36, 0x66, 0x30, 0x37, 0x32, 0x35, 0x32, 0x66,
607 0x32, 0x39, 0x65, 0x39, 0x33, 0x66, 0x65, 0x34, 0x64, 0x65, 0x31, 0x39, 0x65, 0x65, 0x33,
608 0x32, 0x63, 0x64, 0x38, 0x31, 0x64, 0x63, 0x34, 0x30, 0x34, 0x65, 0x37, 0x36, 0x02, 0x78,
609 0x28, 0x32, 0x35, 0x39, 0x34, 0x38, 0x39, 0x65, 0x36, 0x39, 0x37, 0x34, 0x38, 0x37, 0x30,
610 0x35, 0x64, 0x65, 0x33, 0x65, 0x32, 0x66, 0x34, 0x34, 0x32, 0x36, 0x37, 0x65, 0x61, 0x34,
611 0x39, 0x33, 0x38, 0x66, 0x66, 0x36, 0x61, 0x35, 0x37, 0x32, 0x35, 0x3a, 0x00, 0x47, 0x44,
612 0x50, 0x58, 0x40, 0xa4, 0x0c, 0xcb, 0xc1, 0xbf, 0xfa, 0xcc, 0xfd, 0xeb, 0xf4, 0xfc, 0x43,
613 0x83, 0x7f, 0x46, 0x8d, 0xd8, 0xd8, 0x14, 0xc1, 0x96, 0x14, 0x1f, 0x6e, 0xb3, 0xa0, 0xd9,
614 0x56, 0xb3, 0xbf, 0x2f, 0xfa, 0x88, 0x70, 0x11, 0x07, 0x39, 0xa4, 0xd2, 0xa9, 0x6b, 0x18,
615 0x28, 0xe8, 0x29, 0x20, 0x49, 0x0f, 0xbb, 0x8d, 0x08, 0x8c, 0xc6, 0x54, 0xe9, 0x71, 0xd2,
616 0x7e, 0xa4, 0xfe, 0x58, 0x7f, 0xd3, 0xc7, 0x3a, 0x00, 0x47, 0x44, 0x53, 0x56, 0xa3, 0x3a,
617 0x00, 0x01, 0x11, 0x71, 0x63, 0x41, 0x56, 0x42, 0x3a, 0x00, 0x01, 0x11, 0x72, 0x01, 0x3a,
618 0x00, 0x01, 0x11, 0x73, 0xf6, 0x3a, 0x00, 0x47, 0x44, 0x52, 0x58, 0x40, 0x93, 0x17, 0xe1,
619 0x11, 0x27, 0x59, 0xd0, 0xef, 0x75, 0x0b, 0x2b, 0x1c, 0x0f, 0x5f, 0x52, 0xc3, 0x29, 0x23,
620 0xb5, 0x2a, 0xe6, 0x12, 0x72, 0x6f, 0x39, 0x86, 0x65, 0x2d, 0xf2, 0xe4, 0xe7, 0xd0, 0xaf,
621 0x0e, 0xa7, 0x99, 0x16, 0x89, 0x97, 0x21, 0xf7, 0xdc, 0x89, 0xdc, 0xde, 0xbb, 0x94, 0x88,
622 0x1f, 0xda, 0xe2, 0xf3, 0xe0, 0x54, 0xf9, 0x0e, 0x29, 0xb1, 0xbd, 0xe1, 0x0c, 0x0b, 0xd7,
623 0xf6, 0x3a, 0x00, 0x47, 0x44, 0x54, 0x58, 0x40, 0xb2, 0x69, 0x05, 0x48, 0x56, 0xb5, 0xfa,
624 0x55, 0x6f, 0xac, 0x56, 0xd9, 0x02, 0x35, 0x2b, 0xaa, 0x4c, 0xba, 0x28, 0xdd, 0x82, 0x3a,
625 0x86, 0xf5, 0xd4, 0xc2, 0xf1, 0xf9, 0x35, 0x7d, 0xe4, 0x43, 0x13, 0xbf, 0xfe, 0xd3, 0x36,
626 0xd8, 0x1c, 0x12, 0x78, 0x5c, 0x9c, 0x3e, 0xf6, 0x66, 0xef, 0xab, 0x3d, 0x0f, 0x89, 0xa4,
627 0x6f, 0xc9, 0x72, 0xee, 0x73, 0x43, 0x02, 0x8a, 0xef, 0xbc, 0x05, 0x98, 0x3a, 0x00, 0x47,
628 0x44, 0x56, 0x41, 0x01, 0x3a, 0x00, 0x47, 0x44, 0x57, 0x58, 0x2d, 0xa5, 0x01, 0x01, 0x03,
629 0x27, 0x04, 0x81, 0x02, 0x20, 0x06, 0x21, 0x58, 0x20, 0x96, 0x6d, 0x96, 0x42, 0xda, 0x64,
630 0x51, 0xad, 0xfa, 0x00, 0xbc, 0xbc, 0x95, 0x8a, 0xb0, 0xb9, 0x76, 0x01, 0xe6, 0xbd, 0xc0,
631 0x26, 0x79, 0x26, 0xfc, 0x0f, 0x1d, 0x87, 0x65, 0xf1, 0xf3, 0x99, 0x3a, 0x00, 0x47, 0x44,
632 0x58, 0x41, 0x20, 0x58, 0x40, 0x10, 0x7f, 0x77, 0xad, 0x70, 0xbd, 0x52, 0x81, 0x28, 0x8d,
633 0x24, 0x81, 0xb4, 0x3f, 0x21, 0x68, 0x9f, 0xc3, 0x80, 0x68, 0x86, 0x55, 0xfb, 0x2e, 0x6d,
634 0x96, 0xe1, 0xe1, 0xb7, 0x28, 0x8d, 0x63, 0x85, 0xba, 0x2a, 0x01, 0x33, 0x87, 0x60, 0x63,
635 0xbb, 0x16, 0x3f, 0x2f, 0x3d, 0xf4, 0x2d, 0x48, 0x5b, 0x87, 0xed, 0xda, 0x34, 0xeb, 0x9c,
636 0x4d, 0x14, 0xac, 0x65, 0xf4, 0xfa, 0xef, 0x45, 0x0b, 0x84, 0x43, 0xa1, 0x01, 0x27, 0xa0,
637 0x59, 0x01, 0x8f, 0xa9, 0x01, 0x78, 0x28, 0x32, 0x35, 0x39, 0x34, 0x38, 0x39, 0x65, 0x36,
638 0x39, 0x37, 0x34, 0x38, 0x37, 0x30, 0x35, 0x64, 0x65, 0x33, 0x65, 0x32, 0x66, 0x34, 0x34,
639 0x32, 0x36, 0x37, 0x65, 0x61, 0x34, 0x39, 0x33, 0x38, 0x66, 0x66, 0x36, 0x61, 0x35, 0x37,
640 0x32, 0x35, 0x02, 0x78, 0x28, 0x35, 0x64, 0x34, 0x65, 0x64, 0x37, 0x66, 0x34, 0x31, 0x37,
641 0x61, 0x39, 0x35, 0x34, 0x61, 0x31, 0x38, 0x31, 0x34, 0x30, 0x37, 0x62, 0x35, 0x38, 0x38,
642 0x35, 0x61, 0x66, 0x64, 0x37, 0x32, 0x61, 0x35, 0x62, 0x66, 0x34, 0x30, 0x64, 0x61, 0x36,
643 0x3a, 0x00, 0x47, 0x44, 0x50, 0x58, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Janis Danisevskisdb78b772021-11-29 17:59:50 -0800644 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Alan Stokes7cdcf992022-05-24 07:42:24 +0000647 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x47, 0x44,
648 0x53, 0x58, 0x1a, 0xa3, 0x3a, 0x00, 0x01, 0x11, 0x71, 0x67, 0x41, 0x6e, 0x64, 0x72, 0x6f,
649 0x69, 0x64, 0x3a, 0x00, 0x01, 0x11, 0x72, 0x0c, 0x3a, 0x00, 0x01, 0x11, 0x73, 0xf6, 0x3a,
650 0x00, 0x47, 0x44, 0x52, 0x58, 0x40, 0x26, 0x1a, 0xbd, 0x26, 0xd8, 0x37, 0x8f, 0x4a, 0xf2,
651 0x9e, 0x49, 0x4d, 0x93, 0x23, 0xc4, 0x6e, 0x02, 0xda, 0xe0, 0x00, 0x02, 0xe7, 0xed, 0x29,
652 0xdf, 0x2b, 0xb3, 0x69, 0xf3, 0x55, 0x0e, 0x4c, 0x22, 0xdc, 0xcf, 0xf5, 0x92, 0xc9, 0xfa,
653 0x78, 0x98, 0xf1, 0x0e, 0x55, 0x5f, 0xf4, 0x45, 0xed, 0xc0, 0x0a, 0x72, 0x2a, 0x7a, 0x3a,
654 0xd2, 0xb1, 0xf7, 0x76, 0xfe, 0x2a, 0x6b, 0x7b, 0x2a, 0x53, 0x3a, 0x00, 0x47, 0x44, 0x54,
655 0x58, 0x40, 0x04, 0x25, 0x5d, 0x60, 0x5f, 0x5c, 0x45, 0x0d, 0xf2, 0x9a, 0x6e, 0x99, 0x30,
656 0x03, 0xb8, 0xd6, 0xe1, 0x99, 0x71, 0x1b, 0xf8, 0x44, 0xfa, 0xb5, 0x31, 0x79, 0x1c, 0x37,
657 0x68, 0x4e, 0x1d, 0xc0, 0x24, 0x74, 0x68, 0xf8, 0x80, 0x20, 0x3e, 0x44, 0xb1, 0x43, 0xd2,
658 0x9c, 0xfc, 0x12, 0x9e, 0x77, 0x0a, 0xde, 0x29, 0x24, 0xff, 0x2e, 0xfa, 0xc7, 0x10, 0xd5,
659 0x73, 0xd4, 0xc6, 0xdf, 0x62, 0x9f, 0x3a, 0x00, 0x47, 0x44, 0x56, 0x41, 0x01, 0x3a, 0x00,
660 0x47, 0x44, 0x57, 0x58, 0x2d, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02, 0x20, 0x06,
661 0x21, 0x58, 0x20, 0xdb, 0xe7, 0x5b, 0x3f, 0xa3, 0x42, 0xb0, 0x9c, 0xf8, 0x40, 0x8c, 0xb0,
662 0x9c, 0xf0, 0x0a, 0xaf, 0xdf, 0x6f, 0xe5, 0x09, 0x21, 0x11, 0x92, 0xe1, 0xf8, 0xc5, 0x09,
663 0x02, 0x3d, 0x1f, 0xb7, 0xc5, 0x3a, 0x00, 0x47, 0x44, 0x58, 0x41, 0x20, 0x58, 0x40, 0xc4,
664 0xc1, 0xd7, 0x1c, 0x2d, 0x26, 0x89, 0x22, 0xcf, 0xa6, 0x99, 0x77, 0x30, 0x84, 0x86, 0x27,
665 0x59, 0x8f, 0xd8, 0x08, 0x75, 0xe0, 0xb2, 0xef, 0xf9, 0xfa, 0xa5, 0x40, 0x8c, 0xd3, 0xeb,
666 0xbb, 0xda, 0xf2, 0xc8, 0xae, 0x41, 0x22, 0x50, 0x9c, 0xe8, 0xb2, 0x9c, 0x9b, 0x3f, 0x8a,
667 0x78, 0x76, 0xab, 0xd0, 0xbe, 0xfc, 0xe4, 0x79, 0xcb, 0x1b, 0x2b, 0xaa, 0x4d, 0xdd, 0x15,
668 0x61, 0x42, 0x06,
Janis Danisevskisdb78b772021-11-29 17:59:50 -0800669 ];
670
671 // This test invokes make_sample_bcc_and_cdis and compares the result bitwise to the target
672 // vectors. The function uses main_flow, bcc_main_flow, format_config_descriptor,
673 // derive_cdi_private_key_seed, and keypair_from_seed. This test is sensitive to errors
674 // and changes in any of those functions.
675 #[test]
676 fn main_flow_and_bcc_main_flow() {
677 let (cdi_attest, cdi_seal, bcc) = make_sample_bcc_and_cdis().unwrap();
678 assert_eq!(&cdi_attest[..], SAMPLE_CDI_ATTEST_TEST_VECTOR);
679 assert_eq!(&cdi_seal[..], SAMPLE_CDI_SEAL_TEST_VECTOR);
680 assert_eq!(&bcc[..], SAMPLE_BCC_TEST_VECTOR);
681 }
682
683 static DERIVED_KEY_TEST_VECTOR: &[u8] = &[
684 0x0e, 0xd6, 0x07, 0x0e, 0x1c, 0x38, 0x2c, 0x76, 0x13, 0xc6, 0x76, 0x25, 0x7e, 0x07, 0x6f,
685 0xdb, 0x1d, 0xb1, 0x0f, 0x3f, 0xed, 0xc5, 0x2b, 0x95, 0xd1, 0x32, 0xf1, 0x63, 0x2f, 0x2a,
686 0x01, 0x5e,
687 ];
688
689 #[test]
690 fn kdf() {
691 let mut ctx = OpenDiceCborContext::new();
692 let derived_key = ctx
693 .kdf(
694 PRIVATE_KEY_SEED_SIZE,
695 "myKey".as_bytes(),
696 "mySalt".as_bytes(),
697 "myInfo".as_bytes(),
698 )
699 .unwrap();
700 assert_eq!(&derived_key[..], DERIVED_KEY_TEST_VECTOR);
701 }
702
703 static CERT_ID_TEST_VECTOR: &[u8] = &[
704 0x7a, 0x36, 0x45, 0x2c, 0x02, 0xf6, 0x2b, 0xec, 0xf9, 0x80, 0x06, 0x75, 0x87, 0xa5, 0xc1,
705 0x44, 0x0c, 0xd3, 0xc0, 0x6d,
706 ];
707
708 #[test]
709 fn derive_cdi_certificate_id() {
710 let mut ctx = OpenDiceCborContext::new();
711 let cert_id = ctx.derive_cdi_certificate_id("MyPubKey".as_bytes()).unwrap();
712 assert_eq!(&cert_id[..], CERT_ID_TEST_VECTOR);
713 }
714}