Skip to main content

mls_spec/drafts/
sd_cwt_credential.rs

1pub const CREDENTIAL_SD_CWT: u16 = 0x0005;
2pub const CREDENTIAL_SD_JWT: u16 = 0x0006;
3
4#[derive(
5    Clone,
6    PartialEq,
7    Eq,
8    Hash,
9    tls_codec::TlsSize,
10    tls_codec::TlsSerialize,
11    tls_codec::TlsDeserialize,
12)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct SdCwtCredential {
15    #[tls_codec(with = "crate::tlspl::bytes")]
16    pub sd_kbt: Vec<u8>,
17}
18
19impl std::fmt::Debug for SdCwtCredential {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        f.debug_struct("SdCwtCredential")
22            .field("sd_kbt", &hex::encode(&self.sd_kbt))
23            .finish()
24    }
25}
26
27#[derive(
28    Debug,
29    Clone,
30    PartialEq,
31    Eq,
32    Hash,
33    tls_codec::TlsSize,
34    tls_codec::TlsSerialize,
35    tls_codec::TlsDeserialize,
36)]
37#[cfg_attr(
38    feature = "serde",
39    derive(serde_repr::Serialize_repr, serde_repr::Deserialize_repr)
40)]
41#[repr(u8)]
42pub enum SdJwtCredentialCompacted {
43    Uncompacted = 0x00,
44    Compacted = 0x01,
45}
46
47#[derive(
48    Debug,
49    Clone,
50    PartialEq,
51    Eq,
52    Hash,
53    tls_codec::TlsSize,
54    tls_codec::TlsSerialize,
55    tls_codec::TlsDeserialize,
56)]
57#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
58pub struct SdJwtDisclosure {
59    #[tls_codec(with = "crate::tlspl::bytes")]
60    pub disclosure: Vec<u8>,
61}
62
63#[derive(
64    Debug,
65    Clone,
66    PartialEq,
67    Eq,
68    Hash,
69    tls_codec::TlsSize,
70    tls_codec::TlsSerialize,
71    tls_codec::TlsDeserialize,
72)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74#[repr(u8)]
75pub enum SdJwtCredential {
76    #[tls_codec(discriminant = "SdJwtCredentialCompacted::Uncompacted")]
77    Uncompacted {
78        #[tls_codec(with = "crate::tlspl::bytes")]
79        sd_jwt_kb: Vec<u8>,
80    },
81    #[tls_codec(discriminant = "SdJwtCredentialCompacted::Compacted")]
82    Compacted {
83        #[tls_codec(with = "crate::tlspl::bytes")]
84        protected: Vec<u8>,
85        #[tls_codec(with = "crate::tlspl::bytes")]
86        payload: Vec<u8>,
87        #[tls_codec(with = "crate::tlspl::bytes")]
88        signature: Vec<u8>,
89        disclosures: Vec<SdJwtDisclosure>,
90        #[tls_codec(with = "crate::tlspl::bytes")]
91        sd_jwt_key_binding: Vec<u8>,
92    },
93}