blob: b3228500f1bd47754b2b18c5c273c444fe79aeaa [file] [log] [blame]
// Copyright 2022, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! Support for DICE derivation and BCC generation.
use core::ffi::CStr;
use dice::bcc::format_config_descriptor;
use dice::bcc::Handover;
use dice::hash;
use dice::ConfigType;
use dice::InputValues;
/// Derive the VM-specific secrets and certificate through DICE.
pub fn derive_next_bcc(
bcc: &Handover,
next_bcc: &mut [u8],
code: &[u8],
debug_mode: bool,
authority: &[u8],
) -> dice::Result<usize> {
let code_hash = hash(code)?;
let auth_hash = hash(authority)?;
let mode = if debug_mode { dice::Mode::Debug } else { dice::Mode::Normal };
let component_name = CStr::from_bytes_with_nul(b"vm_entry\0").unwrap();
let mut config_descriptor_buffer = [0; 128];
let config_descriptor_size = format_config_descriptor(
&mut config_descriptor_buffer,
Some(component_name),
None, // component_version
false, // resettable
)?;
let config = &config_descriptor_buffer[..config_descriptor_size];
let config = ConfigType::Descriptor(config);
let input_values = InputValues::new(
&code_hash,
None, // code_descriptor
&config,
Some(&auth_hash),
None, // auth_descriptor
mode,
None, // TODO(b/249723852): Get salt from instance.img (virtio-blk) and/or TRNG.
);
bcc.main_flow(&input_values, next_bcc)
}