blob: 202e2043e416c6d70201066848432904bd527582 [file] [log] [blame]
use ciborium::de::Error as CbError;
use coset::cbor;
use coset::CoseError;
use kmr_wire::read_to_value;
use crate::cwt::CwtClaims;
use crate::get_cbor_array_from_map;
use crate::get_cbor_bytes_from_map;
use crate::pub_key::SubjectPublicKey;
pub struct CdiCert {
pub cwt: CwtClaims,
pub signature: [u8; 64],
}
pub struct DiceHandover {
pub cdi_attest: [u8; 32],
pub cdi_seal: [u8; 32],
pub uds_pubkey: SubjectPublicKey,
pub cdi_cert: CdiCert,
}
impl coset::AsCborValue for DiceHandover {
fn from_cbor_value(value: cbor::value::Value) -> coset::Result<Self> {
if let Some(vals) = value.as_map() {
let arr = get_cbor_array_from_map(vals, 3)?;
let cwt_arr = arr[1].as_array().ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?;
let cwt = read_to_value(
cwt_arr[2].as_bytes().ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?,
)
.map_err(|_| CoseError::DecodeFailed(CbError::Syntax(0)))?;
let cwt = CwtClaims::from_cbor_value(cwt.clone())?;
let uds_pubkey = DiceHandover {
cdi_attest: *get_cbor_bytes_from_map(vals, 1)?
.first_chunk()
.ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?,
cdi_seal: *get_cbor_bytes_from_map(vals, 2)?
.first_chunk()
.ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?,
uds_pubkey: SubjectPublicKey::from_cbor_value(arr[0].clone())?,
cdi_cert: CdiCert {
cwt,
signature: *cwt_arr[3]
.as_bytes()
.ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?
.first_chunk()
.ok_or(CoseError::DecodeFailed(CbError::Syntax(0)))?,
},
};
Ok(uds_pubkey)
} else {
Err(CoseError::DecodeFailed(CbError::Syntax(0)))
}
}
fn to_cbor_value(self) -> coset::Result<cbor::value::Value> {
Err(CoseError::EncodeFailed)
}
}