mls_spec/
credential.rs

1use crate::defs::CredentialType;
2
3#[derive(
4    Debug,
5    Clone,
6    PartialEq,
7    Eq,
8    tls_codec::TlsSerialize,
9    tls_codec::TlsDeserialize,
10    tls_codec::TlsSize,
11    Hash,
12)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct BasicCredential {
15    #[tls_codec(with = "crate::tlspl::bytes")]
16    pub identity: Vec<u8>,
17}
18
19#[derive(
20    Debug,
21    Clone,
22    PartialEq,
23    Eq,
24    Hash,
25    tls_codec::TlsSerialize,
26    tls_codec::TlsDeserialize,
27    tls_codec::TlsSize,
28)]
29#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
30pub struct Certificate {
31    #[tls_codec(with = "crate::tlspl::bytes")]
32    pub cert_data: Vec<u8>,
33}
34
35#[derive(
36    Debug,
37    Clone,
38    PartialEq,
39    Eq,
40    Hash,
41    tls_codec::TlsSerialize,
42    tls_codec::TlsDeserialize,
43    tls_codec::TlsSize,
44)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct X509Credential {
47    pub certificates: Vec<Certificate>,
48}
49
50#[derive(
51    Debug,
52    Clone,
53    PartialEq,
54    Eq,
55    Hash,
56    tls_codec::TlsSerialize,
57    tls_codec::TlsDeserialize,
58    tls_codec::TlsSize,
59)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
61#[repr(u16)]
62pub enum Credential {
63    #[tls_codec(discriminant = "CredentialType::BASIC")]
64    Basic(BasicCredential),
65    #[tls_codec(discriminant = "CredentialType::X509")]
66    X509(X509Credential),
67    #[cfg(feature = "draft-ietf-mls-extensions")]
68    #[tls_codec(discriminant = "CredentialType::MULTI_CREDENTIAL")]
69    MultiCredential(crate::drafts::mls_extensions::multi_credentials::MultiCredential),
70    #[cfg(feature = "draft-ietf-mls-extensions")]
71    #[tls_codec(discriminant = "CredentialType::WEAK_MULTI_CREDENTIAL")]
72    WeakMultiCredential(crate::drafts::mls_extensions::multi_credentials::WeakMultiCredential),
73    #[cfg(feature = "draft-mahy-mls-sd-cwt-credential")]
74    #[tls_codec(discriminant = "CredentialType::SD_CWT_CREDENTIAL")]
75    SdCwtCredential(crate::drafts::sd_cwt_credential::SdCwtCredential),
76    #[cfg(feature = "draft-mahy-mls-sd-cwt-credential")]
77    #[tls_codec(discriminant = "CredentialType::SD_JWT_CREDENTIAL")]
78    SdJwtCredential(crate::drafts::sd_cwt_credential::SdJwtCredential),
79}
80
81impl Credential {
82    pub fn basic(identity: Vec<u8>) -> Self {
83        Self::Basic(BasicCredential { identity })
84    }
85}
86
87impl From<&Credential> for CredentialType {
88    fn from(value: &Credential) -> Self {
89        match value {
90            Credential::Basic(_) => CredentialType::BASIC,
91            Credential::X509(_) => CredentialType::X509,
92            #[cfg(feature = "draft-ietf-mls-extensions")]
93            Credential::MultiCredential(_) => CredentialType::MULTI_CREDENTIAL,
94            #[cfg(feature = "draft-ietf-mls-extensions")]
95            Credential::WeakMultiCredential(_) => CredentialType::WEAK_MULTI_CREDENTIAL,
96            #[cfg(feature = "draft-mahy-mls-sd-cwt-credential")]
97            Credential::SdCwtCredential(_) => CredentialType::SD_CWT_CREDENTIAL,
98            #[cfg(feature = "draft-mahy-mls-sd-cwt-credential")]
99            Credential::SdJwtCredential(_) => CredentialType::SD_JWT_CREDENTIAL,
100        }
101        .try_into()
102        // SAFETY: We only handle known, safe values so this cannot fail
103        .unwrap()
104    }
105}