Skip to main content

build_corim/
build_corim.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Example: build a CoRIM with reference values and encode to CBOR.
5
6use corim::builder::{ComidBuilder, CorimBuilder};
7use corim::types::common::{EntityMap, MeasuredElement, TagIdChoice};
8use corim::types::corim::{CorimId, ProfileChoice};
9use corim::types::environment::{ClassMap, EnvironmentMap};
10use corim::types::measurement::{Digest, MeasurementMap, MeasurementValuesMap};
11use corim::types::tags::COMID_ROLE_TAG_CREATOR;
12use corim::types::triples::ReferenceTriple;
13
14fn main() {
15    // Define the target environment
16    let env = EnvironmentMap {
17        class: Some(ClassMap {
18            class_id: None,
19            vendor: Some("ACME Corp".into()),
20            model: Some("Turbo Encabulator".into()),
21            layer: Some(0),
22            index: None,
23        }),
24        instance: None,
25        group: None,
26    };
27
28    // Create a measurement with a SHA-384 digest
29    let measurement = MeasurementMap {
30        mkey: Some(MeasuredElement::Text("firmware".into())),
31        mval: MeasurementValuesMap {
32            digests: Some(vec![Digest::new(7, vec![0xAA; 48])]),
33            ..MeasurementValuesMap::default()
34        },
35        authorized_by: None,
36    };
37
38    // Build a CoMID
39    let comid = ComidBuilder::new(TagIdChoice::Text(
40        "example.com/acme/turbo-encabulator".into(),
41    ))
42    .set_tag_version(0)
43    .add_entity(EntityMap {
44        entity_name: "ACME Corp".into(),
45        reg_id: Some("https://acme.example.com".into()),
46        role: vec![COMID_ROLE_TAG_CREATOR],
47    })
48    .add_reference_triple(ReferenceTriple::new(env, vec![measurement]))
49    .build()
50    .expect("failed to build CoMID");
51
52    // Wrap in a CoRIM and encode
53    let bytes = CorimBuilder::new(CorimId::Text("acme/corim/v1".into()))
54        .set_profile(ProfileChoice::Uri(
55            "https://example.com/acme-profile".into(),
56        ))
57        .set_validity(Some(1700000000), 1900000000)
58        .unwrap()
59        .add_comid_tag(comid)
60        .expect("failed to encode CoMID")
61        .build_bytes()
62        .expect("failed to build CoRIM");
63
64    println!("Encoded CoRIM: {} bytes", bytes.len());
65    println!(
66        "Hex: {}",
67        bytes
68            .iter()
69            .map(|b| format!("{:02x}", b))
70            .collect::<String>()
71    );
72}