openmls/extensions/
external_sender_extension.rs1use serde::{Deserialize, Serialize};
2use tls_codec::{TlsDeserialize, TlsDeserializeBytes, TlsSerialize, TlsSize};
3
4use crate::{ciphersuite::SignaturePublicKey, credentials::Credential};
5
6#[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 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
50pub type ExternalSendersExtension = Vec<ExternalSender>;
57#[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 pub fn new(index: u32) -> Self {
76 Self(index)
77 }
78
79 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}