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}