Skip to main content

xmtp_proto/
convert.rs

1use crate::ConversionError;
2use crate::xmtp::identity::MlsCredential;
3use openmls::{
4    credentials::{BasicCredential, errors::BasicCredentialError},
5    prelude::Credential as OpenMlsCredential,
6};
7use prost::Message;
8
9impl From<crate::xmtp::mls::message_contents::ContentTypeId> for xmtp_common::types::ContentTypeId {
10    fn from(value: crate::xmtp::mls::message_contents::ContentTypeId) -> Self {
11        Self {
12            authority_id: value.authority_id,
13            type_id: value.type_id,
14            version_major: value.version_major,
15        }
16    }
17}
18
19impl TryFrom<MlsCredential> for OpenMlsCredential {
20    type Error = BasicCredentialError;
21
22    fn try_from(proto: MlsCredential) -> Result<OpenMlsCredential, Self::Error> {
23        let bytes = proto.encode_to_vec();
24        Ok(BasicCredential::new(bytes).into())
25    }
26}
27
28impl TryFrom<openmls::prelude::AeadType>
29    for crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType
30{
31    type Error = ConversionError;
32
33    fn try_from(aead_type: openmls::prelude::AeadType) -> Result<Self, Self::Error> {
34        match aead_type {
35            openmls::prelude::AeadType::ChaCha20Poly1305 => {
36                Ok(crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType::Chacha20Poly1305)
37            }
38            openmls::prelude::AeadType::Aes128Gcm | openmls::prelude::AeadType::Aes256Gcm => Err(ConversionError::InvalidValue {
39                item: "AeadType",
40                expected: "ChaCha20Poly1305",
41                got: format!("{:?}", aead_type),
42            }),
43        }
44    }
45}
46
47impl TryFrom<crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType>
48    for openmls::prelude::AeadType
49{
50    type Error = ConversionError;
51
52    fn try_from(
53        aead_type: crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType,
54    ) -> Result<Self, Self::Error> {
55        match aead_type {
56            crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType::Chacha20Poly1305 => {
57                Ok(openmls::prelude::AeadType::ChaCha20Poly1305)
58            }
59            crate::xmtp::mls::message_contents::WelcomePointeeEncryptionAeadType::Unspecified => {
60                Err(ConversionError::InvalidValue {
61                    item: "AeadType",
62                    expected: "ChaCha20Poly1305",
63                    got: format!("{:?}", aead_type),
64                })
65            }
66        }
67    }
68}
69
70#[cfg(test)]
71mod content_type_tests {
72    #[xmtp_common::test]
73    fn proto_minor_version_does_not_change_codec_id() {
74        let proto = crate::xmtp::mls::message_contents::ContentTypeId {
75            authority_id: "xmtp.org".into(),
76            type_id: "text".into(),
77            version_major: 1,
78            version_minor: 4,
79        };
80        let id = xmtp_common::types::ContentTypeId::from(proto.clone());
81        assert_eq!(
82            id,
83            xmtp_common::types::ContentTypeId::from(
84                crate::xmtp::mls::message_contents::ContentTypeId {
85                    version_minor: 9,
86                    ..proto
87                }
88            )
89        );
90    }
91}