use corim::cbor;
use corim::cbor::value::Value;
use corim::types::measurement::{MeasurementValuesMap, SvnChoice};
use corim::Validate;
use std::collections::BTreeMap;
#[test]
fn extras_only_mval_round_trips() {
let mut extras = BTreeMap::new();
extras.insert(
-83,
Value::Array(vec![Value::Integer(7), Value::Bytes(vec![0xAA; 48])]),
);
let mval = MeasurementValuesMap {
extra_entries: extras,
..MeasurementValuesMap::default()
};
mval.valid().expect("extras-only mval should be valid");
let bytes = cbor::encode(&mval).expect("encode failed");
let decoded: MeasurementValuesMap = cbor::decode(&bytes).expect("decode failed");
assert_eq!(mval, decoded);
assert_eq!(decoded.extra_entries.len(), 1);
assert!(decoded.extra_entries.contains_key(&-83));
}
#[test]
fn mixed_standard_and_extras_round_trip() {
let mut extras = BTreeMap::new();
extras.insert(-85, Value::Integer(42));
extras.insert(
-89,
Value::Array(vec![
Value::Text("INTEL-SA-00001".into()),
Value::Text("INTEL-SA-00002".into()),
]),
);
let mval = MeasurementValuesMap {
svn: Some(SvnChoice::ExactValue(7)),
name: Some("intel-tdx-module".into()),
extra_entries: extras,
..MeasurementValuesMap::default()
};
let bytes = cbor::encode(&mval).expect("encode failed");
let decoded: MeasurementValuesMap = cbor::decode(&bytes).expect("decode failed");
assert_eq!(mval, decoded);
assert_eq!(decoded.svn, Some(SvnChoice::ExactValue(7)));
assert_eq!(decoded.name.as_deref(), Some("intel-tdx-module"));
assert_eq!(decoded.extra_entries.len(), 2);
assert_eq!(decoded.extra_entries.get(&-85), Some(&Value::Integer(42)));
}
#[test]
fn empty_mval_rejected_by_non_empty() {
let mval = MeasurementValuesMap::default();
assert!(mval.valid().is_err());
let result = cbor::encode(&mval);
assert!(
result.is_err(),
"encoding an empty mval must fail the non-empty constraint"
);
}
#[test]
fn negative_keys_in_wire_bytes_decode_into_extras() {
let entries = vec![
(Value::Integer(-70), Value::Text("Intel".into())),
(Value::Integer(-71), Value::Text("TDX".into())),
];
let map_value = Value::Map(entries);
let bytes = cbor::encode(&map_value).expect("encode raw map failed");
let decoded: MeasurementValuesMap =
cbor::decode(&bytes).expect("decode of negative-keyed map failed");
assert!(decoded.svn.is_none());
assert!(decoded.name.is_none());
assert_eq!(decoded.extra_entries.len(), 2);
assert_eq!(
decoded.extra_entries.get(&-70),
Some(&Value::Text("Intel".into()))
);
assert_eq!(
decoded.extra_entries.get(&-71),
Some(&Value::Text("TDX".into()))
);
}
#[test]
fn extras_preserve_nested_tagged_values() {
const TAG_INTEL_EXPRESSION: u64 = 60010;
let inner = Value::Array(vec![Value::Integer(2), Value::Integer(14)]);
let expression = Value::Tag(TAG_INTEL_EXPRESSION, Box::new(inner));
let mut extras = BTreeMap::new();
extras.insert(-73, expression.clone());
let mval = MeasurementValuesMap {
extra_entries: extras,
..MeasurementValuesMap::default()
};
let bytes = cbor::encode(&mval).expect("encode failed");
let decoded: MeasurementValuesMap = cbor::decode(&bytes).expect("decode failed");
assert_eq!(decoded.extra_entries.get(&-73), Some(&expression));
}