xmtp_common/test/
openmls.rs

1//! generate implementations for fake messages that include fake data but compatible with openmls types
2use super::Generate;
3use xmtp_cryptography::{
4    openmls::{
5        prelude::{
6            MlsMessageIn, MlsMessageOut, ProtocolMessage, PublicMessage, tls_codec::Serialize,
7        },
8        test_utils::frankenstein::{
9            FrankenCommit, FrankenContentType, FrankenFramedContent, FrankenFramedContentAuthData,
10            FrankenFramedContentBody, FrankenMlsMessage, FrankenMlsMessageBody,
11            FrankenPrivateMessage, FrankenPublicMessage, FrankenSender,
12        },
13    },
14    rand::rand_vec,
15};
16
17pub struct FakeMlsApplicationMessage {
18    pub inner: FrankenMlsMessage,
19}
20
21impl Generate for FakeMlsApplicationMessage {
22    fn generate() -> Self {
23        let mut msg = FrankenPublicMessage::generate();
24        msg.content.body = FrankenFramedContentBody::Application(rand_vec::<16>().into());
25        Self {
26            inner: FrankenMlsMessage {
27                version: 1,
28                body: FrankenMlsMessageBody::PublicMessage(msg),
29            },
30        }
31    }
32}
33
34impl From<FakeMlsApplicationMessage> for MlsMessageOut {
35    fn from(value: FakeMlsApplicationMessage) -> Self {
36        value.inner.into()
37    }
38}
39
40/// a fake mls commit message populated with garbage data
41/// can be transformed into MlsMessageOut/ProtocolMessage
42pub struct FakeMlsCommitMessage {
43    pub inner: FrankenMlsMessage,
44}
45
46impl Generate for FakeMlsCommitMessage {
47    fn generate() -> Self {
48        let mut msg = FrankenPrivateMessage::generate();
49        msg.content_type = FrankenContentType::Commit;
50        Self {
51            inner: FrankenMlsMessage {
52                version: 1,
53                body: FrankenMlsMessageBody::PrivateMessage(msg),
54            },
55        }
56    }
57}
58
59impl From<FakeMlsCommitMessage> for MlsMessageOut {
60    fn from(value: FakeMlsCommitMessage) -> Self {
61        value.inner.into()
62    }
63}
64
65impl From<FakeMlsCommitMessage> for ProtocolMessage {
66    fn from(value: FakeMlsCommitMessage) -> Self {
67        ProtocolMessage::try_from(MlsMessageIn::from(MlsMessageOut::from(value))).unwrap()
68    }
69}
70
71impl Generate for FrankenPrivateMessage {
72    fn generate() -> Self {
73        FrankenPrivateMessage {
74            group_id: rand_vec::<16>().into(),
75            epoch: rand_vec::<4>().into(),
76            content_type: FrankenContentType::Application,
77            authenticated_data: rand_vec::<16>().into(),
78            encrypted_sender_data: rand_vec::<16>().into(),
79            ciphertext: rand_vec::<16>().into(),
80        }
81    }
82}
83
84impl Generate for FrankenCommit {
85    fn generate() -> Self {
86        todo!()
87    }
88}
89
90impl Generate for PublicMessage {
91    fn generate() -> Self {
92        FrankenPublicMessage::generate().into()
93    }
94}
95
96impl Generate for FrankenPublicMessage {
97    fn generate() -> Self {
98        FrankenPublicMessage {
99            content: FrankenFramedContent::generate(),
100            auth: FrankenFramedContentAuthData::generate(),
101            membership_tag: None,
102        }
103    }
104}
105
106impl Generate for FrankenFramedContent {
107    fn generate() -> Self {
108        FrankenFramedContent {
109            group_id: rand_vec::<16>().into(),
110            epoch: crate::rand_u64(),
111            sender: FrankenSender::Member(0),
112            authenticated_data: FrankenFramedContentAuthData::generate()
113                .tls_serialize_detached()
114                .unwrap()
115                .into(),
116            body: FrankenFramedContentBody::Application(rand_vec::<16>().into()),
117        }
118    }
119}
120
121impl Generate for FrankenFramedContentAuthData {
122    fn generate() -> Self {
123        FrankenFramedContentAuthData {
124            signature: vec![].into(),
125            // not specifying this (leaving as `None`) causes conversion/serialization to fail.
126            confirmation_tag: Some(rand_vec::<8>().into()),
127        }
128    }
129}