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 .unwrap()
104 }
105}