1 // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 // Copyright by contributors to this project.
3 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
4 
5 use crate::{
6     extension::ExtensionType,
7     group::{mls_rules::MlsRules, proposal::ProposalType},
8     identity::CredentialType,
9     protocol_version::ProtocolVersion,
10     tree_kem::{leaf_node::ConfigProperties, Capabilities, Lifetime},
11     ExtensionList,
12 };
13 use alloc::vec::Vec;
14 use mls_rs_core::{
15     crypto::CryptoProvider, group::GroupStateStorage, identity::IdentityProvider,
16     key_package::KeyPackageStorage, psk::PreSharedKeyStorage,
17 };
18 
19 pub trait ClientConfig: Send + Sync + Clone {
20     type KeyPackageRepository: KeyPackageStorage + Clone;
21     type PskStore: PreSharedKeyStorage + Clone;
22     type GroupStateStorage: GroupStateStorage + Clone;
23     type IdentityProvider: IdentityProvider + Clone;
24     type MlsRules: MlsRules + Clone;
25     type CryptoProvider: CryptoProvider + Clone;
26 
supported_extensions(&self) -> Vec<ExtensionType>27     fn supported_extensions(&self) -> Vec<ExtensionType>;
supported_custom_proposals(&self) -> Vec<ProposalType>28     fn supported_custom_proposals(&self) -> Vec<ProposalType>;
supported_protocol_versions(&self) -> Vec<ProtocolVersion>29     fn supported_protocol_versions(&self) -> Vec<ProtocolVersion>;
30 
key_package_repo(&self) -> Self::KeyPackageRepository31     fn key_package_repo(&self) -> Self::KeyPackageRepository;
32 
mls_rules(&self) -> Self::MlsRules33     fn mls_rules(&self) -> Self::MlsRules;
34 
secret_store(&self) -> Self::PskStore35     fn secret_store(&self) -> Self::PskStore;
group_state_storage(&self) -> Self::GroupStateStorage36     fn group_state_storage(&self) -> Self::GroupStateStorage;
identity_provider(&self) -> Self::IdentityProvider37     fn identity_provider(&self) -> Self::IdentityProvider;
crypto_provider(&self) -> Self::CryptoProvider38     fn crypto_provider(&self) -> Self::CryptoProvider;
39 
key_package_extensions(&self) -> ExtensionList40     fn key_package_extensions(&self) -> ExtensionList;
leaf_node_extensions(&self) -> ExtensionList41     fn leaf_node_extensions(&self) -> ExtensionList;
lifetime(&self) -> Lifetime42     fn lifetime(&self) -> Lifetime;
43 
capabilities(&self) -> Capabilities44     fn capabilities(&self) -> Capabilities {
45         Capabilities {
46             protocol_versions: self.supported_protocol_versions(),
47             cipher_suites: self.crypto_provider().supported_cipher_suites(),
48             extensions: self.supported_extensions(),
49             proposals: self.supported_custom_proposals(),
50             credentials: self.supported_credential_types(),
51         }
52     }
53 
version_supported(&self, version: ProtocolVersion) -> bool54     fn version_supported(&self, version: ProtocolVersion) -> bool {
55         self.supported_protocol_versions().contains(&version)
56     }
57 
supported_credential_types(&self) -> Vec<CredentialType>58     fn supported_credential_types(&self) -> Vec<CredentialType> {
59         self.identity_provider().supported_types()
60     }
61 
leaf_properties(&self) -> ConfigProperties62     fn leaf_properties(&self) -> ConfigProperties {
63         ConfigProperties {
64             capabilities: self.capabilities(),
65             extensions: self.leaf_node_extensions(),
66         }
67     }
68 }
69