use crate::cose::MaybeTagged;
use crate::definitions::{
helpers::{ByteStr, NonEmptyMap, NonEmptyVec, Tag24},
DigestId,
};
use coset::CoseSign1;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IssuerSigned {
#[serde(skip_serializing_if = "Option::is_none", rename = "nameSpaces")]
pub namespaces: Option<IssuerNamespaces>,
pub issuer_auth: MaybeTagged<CoseSign1>,
}
pub type IssuerNamespaces = NonEmptyMap<String, NonEmptyVec<IssuerSignedItemBytes>>;
pub type IssuerSignedItemBytes = Tag24<IssuerSignedItem>;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IssuerSignedItem {
#[serde(rename = "digestID")]
pub digest_id: DigestId,
pub random: ByteStr,
pub element_identifier: String,
pub element_value: ciborium::Value,
}
#[cfg(test)]
mod test {
use super::IssuerSigned;
use crate::cbor;
use hex::FromHex;
static ISSUER_SIGNED_CBOR: &str = include_str!("../../test/definitions/issuer_signed.cbor");
#[test]
fn serde_issuer_signed() {
let cbor_bytes =
<Vec<u8>>::from_hex(ISSUER_SIGNED_CBOR).expect("unable to convert cbor hex to bytes");
let signed: IssuerSigned =
cbor::from_slice(&cbor_bytes).expect("unable to decode cbor as an IssuerSigned");
let roundtripped_bytes =
cbor::to_vec(&signed).expect("unable to encode IssuerSigned as cbor bytes");
assert_eq!(
cbor_bytes, roundtripped_bytes,
"original cbor and re-serialized IssuerSigned do not match"
);
}
}