openmls/extensions/
external_sender_extension.rs

1use serde::{Deserialize, Serialize};
2use tls_codec::{TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize};
3
4use crate::{ciphersuite::SignaturePublicKey, credentials::Credential};
5
6/// ExternalSender
7///
8/// ```c
9/// // draft-ietf-mls-protocol-16
10/// struct {
11///   SignaturePublicKey signature_key;
12///   Credential credential;
13/// } ExternalSender;
14/// ```
15#[derive(
16    Clone,
17    PartialEq,
18    Eq,
19    Debug,
20    Serialize,
21    Deserialize,
22    TlsSerialize,
23    TlsDeserialize,
24    TlsDeserializeBytes,
25    TlsSize,
26)]
27pub struct ExternalSender {
28    signature_key: SignaturePublicKey,
29    credential: Credential,
30}
31
32impl ExternalSender {
33    /// Creates a new `ExternalSender` instance.
34    pub fn new(signature_key: SignaturePublicKey, credential: Credential) -> Self {
35        Self {
36            signature_key,
37            credential,
38        }
39    }
40
41    pub(crate) fn credential(&self) -> &Credential {
42        &self.credential
43    }
44
45    pub(crate) fn signature_key(&self) -> &SignaturePublicKey {
46        &self.signature_key
47    }
48}
49
50/// ExternalSender (extension data)
51///
52/// ```c
53/// // draft-ietf-mls-protocol-16
54/// ExternalSender external_senders<V>;
55/// ```
56pub type ExternalSendersExtension = Vec<ExternalSender>;
57/// Identifies an external sender in the `ExternalSendersExtension`.
58#[derive(
59    Debug,
60    PartialEq,
61    Eq,
62    Copy,
63    Clone,
64    Serialize,
65    Deserialize,
66    TlsSerialize,
67    TlsDeserialize,
68    TlsDeserializeBytes,
69    TlsSize,
70)]
71pub struct SenderExtensionIndex(u32);
72
73impl SenderExtensionIndex {
74    /// Creates a new `SenderExtensionIndex` instance.
75    pub fn new(index: u32) -> Self {
76        Self(index)
77    }
78
79    /// Returns the internal index as usize
80    pub(crate) fn index(&self) -> usize {
81        self.0 as usize
82    }
83}
84
85#[cfg(test)]
86mod test {
87    use openmls_basic_credential::SignatureKeyPair;
88    use tls_codec::{Deserialize, Serialize};
89
90    use super::*;
91    use crate::credentials::BasicCredential;
92
93    #[openmls_test::openmls_test]
94    fn test_serialize_deserialize() {
95        let tests = {
96            let mut external_sender_extensions = Vec::new();
97
98            for _ in 0..8 {
99                let credential = BasicCredential::new(b"Alice".to_vec());
100                let signature_keys =
101                    SignatureKeyPair::new(ciphersuite.signature_algorithm()).unwrap();
102
103                external_sender_extensions.push(ExternalSender {
104                    signature_key: signature_keys.to_public_vec().into(),
105                    credential: credential.into(),
106                });
107            }
108
109            external_sender_extensions
110        };
111
112        for expected in tests {
113            let serialized = expected.tls_serialize_detached().unwrap();
114            let got = ExternalSender::tls_deserialize_exact(serialized).unwrap();
115            assert_eq!(expected, got);
116        }
117    }
118}