mls-spec 2.0.0

This crate is a repository of MLS / RFC9420-related data structures.
Documentation
pub const CREDENTIAL_SD_CWT: u16 = 0x0005;
pub const CREDENTIAL_SD_JWT: u16 = 0x0006;

#[derive(
    Clone,
    PartialEq,
    Eq,
    Hash,
    tls_codec::TlsSize,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SdCwtCredential {
    #[tls_codec(with = "crate::tlspl::bytes")]
    pub sd_kbt: Vec<u8>,
}

impl std::fmt::Debug for SdCwtCredential {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("SdCwtCredential")
            .field("sd_kbt", &hex::encode(&self.sd_kbt))
            .finish()
    }
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    Hash,
    tls_codec::TlsSize,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
)]
#[cfg_attr(
    feature = "serde",
    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
)]
#[repr(u8)]
pub enum SdJwtCredentialCompacted {
    Uncompacted = 0x00,
    Compacted = 0x01,
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    Hash,
    tls_codec::TlsSize,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SdJwtDisclosure {
    #[tls_codec(with = "crate::tlspl::bytes")]
    pub disclosure: Vec<u8>,
}

#[derive(
    Debug,
    Clone,
    PartialEq,
    Eq,
    Hash,
    tls_codec::TlsSize,
    tls_codec::TlsSerialize,
    tls_codec::TlsDeserialize,
)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u8)]
pub enum SdJwtCredential {
    #[tls_codec(discriminant = "SdJwtCredentialCompacted::Uncompacted")]
    Uncompacted {
        #[tls_codec(with = "crate::tlspl::bytes")]
        sd_jwt_kb: Vec<u8>,
    },
    #[tls_codec(discriminant = "SdJwtCredentialCompacted::Compacted")]
    Compacted {
        #[tls_codec(with = "crate::tlspl::bytes")]
        protected: Vec<u8>,
        #[tls_codec(with = "crate::tlspl::bytes")]
        payload: Vec<u8>,
        #[tls_codec(with = "crate::tlspl::bytes")]
        signature: Vec<u8>,
        disclosures: Vec<SdJwtDisclosure>,
        #[tls_codec(with = "crate::tlspl::bytes")]
        sd_jwt_key_binding: Vec<u8>,
    },
}