core_crypto/mls/conversation/
credential.rs

1use std::collections::HashMap;
2
3use openmls::prelude::{Credential as MlsCredential, CredentialWithKey, SignaturePublicKey};
4
5use super::{Error, Result};
6use crate::MlsConversation;
7
8impl MlsConversation {
9    /// Returns all members credentials from the group/conversation
10    pub fn members(&self) -> HashMap<Vec<u8>, MlsCredential> {
11        self.group.members().fold(HashMap::new(), |mut acc, kp| {
12            let credential = kp.credential;
13            let id = credential.identity().to_vec();
14            acc.entry(id).or_insert(credential);
15            acc
16        })
17    }
18
19    /// Returns all members credentials with their signature public key from the group/conversation
20    pub fn members_with_key(&self) -> HashMap<Vec<u8>, CredentialWithKey> {
21        self.group.members().fold(HashMap::new(), |mut acc, kp| {
22            let credential = kp.credential;
23            let id = credential.identity().to_vec();
24            let signature_key = SignaturePublicKey::from(kp.signature_key);
25            let credential = CredentialWithKey {
26                credential,
27                signature_key,
28            };
29            acc.entry(id).or_insert(credential);
30            acc
31        })
32    }
33
34    pub(crate) fn own_mls_credential(&self) -> Result<&MlsCredential> {
35        let credential = self
36            .group
37            .own_leaf_node()
38            .ok_or(Error::MlsGroupInvalidState("own_leaf_node not present in group"))?
39            .credential();
40        Ok(credential)
41    }
42}