use cbor2::Cbor;
#[derive(Debug, PartialEq, Cbor)]
struct Protected {
#[cbor(key = 1)]
alg: i8,
}
#[derive(Debug, PartialEq, Cbor)]
struct Unprotected {
#[cbor(key = 5)]
#[serde(with = "serde_bytes")]
iv: Vec<u8>,
}
#[derive(Debug, PartialEq, Cbor)]
#[cbor(tag = 16)]
struct CoseEncrypt0(
#[serde(with = "serde_bytes")] Vec<u8>, Unprotected,
#[serde(with = "serde_bytes")] Vec<u8>, );
fn main() -> Result<(), Box<dyn std::error::Error>> {
let protected = cbor2::to_canonical_vec(&Protected { alg: 10 })?;
assert_eq!(hex::encode(&protected), "a1010a");
let msg = CoseEncrypt0(
protected,
Unprotected {
iv: hex::decode("89f52f65a1c580933b5261a78c")?,
},
hex::decode("5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce460ffb569")?,
);
let bytes = cbor2::to_canonical_vec(&msg)?;
assert_eq!(bytes.len(), 52);
assert_eq!(
hex::encode(&bytes),
"d08343a1010aa1054d89f52f65a1c580933b5261a78c581c\
5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce460ffb569"
);
println!("{}", cbor2::diagnostic(&bytes[..])?);
println!("{}", cbor2::cbor!(&msg)?);
println!("{:?}", cbor2::cbor!(&msg)?);
let back: CoseEncrypt0 = cbor2::from_slice(&bytes)?;
assert_eq!(back, msg);
let header: Protected = cbor2::from_slice(&back.0)?;
assert_eq!(header, Protected { alg: 10 });
let json = serde_json::to_string(&header)?;
assert_eq!(json, r#"{"alg":10}"#);
println!("{}", json);
Ok(())
}