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 mls_rs_core::identity::IdentityProvider;
6 
7 use crate::{
8     crypto::SignaturePublicKey,
9     extension::ExtensionType,
10     group::{mls_rules::MlsRules, proposal::ProposalType},
11     identity::CredentialType,
12     protocol_version::ProtocolVersion,
13     tree_kem::Capabilities,
14     CryptoProvider,
15 };
16 
17 pub trait ExternalClientConfig: Send + Sync + Clone {
18     type IdentityProvider: IdentityProvider + Clone;
19     type MlsRules: MlsRules + Clone;
20     type CryptoProvider: CryptoProvider;
21 
supported_extensions(&self) -> Vec<ExtensionType>22     fn supported_extensions(&self) -> Vec<ExtensionType>;
supported_custom_proposals(&self) -> Vec<ProposalType>23     fn supported_custom_proposals(&self) -> Vec<ProposalType>;
supported_protocol_versions(&self) -> Vec<ProtocolVersion>24     fn supported_protocol_versions(&self) -> Vec<ProtocolVersion>;
identity_provider(&self) -> Self::IdentityProvider25     fn identity_provider(&self) -> Self::IdentityProvider;
crypto_provider(&self) -> Self::CryptoProvider26     fn crypto_provider(&self) -> Self::CryptoProvider;
external_signing_key(&self, external_key_id: &[u8]) -> Option<SignaturePublicKey>27     fn external_signing_key(&self, external_key_id: &[u8]) -> Option<SignaturePublicKey>;
28 
mls_rules(&self) -> Self::MlsRules29     fn mls_rules(&self) -> Self::MlsRules;
30 
cache_proposals(&self) -> bool31     fn cache_proposals(&self) -> bool;
32 
max_epoch_jitter(&self) -> Option<u64>33     fn max_epoch_jitter(&self) -> Option<u64> {
34         None
35     }
36 
capabilities(&self) -> Capabilities37     fn capabilities(&self) -> Capabilities {
38         Capabilities {
39             protocol_versions: self.supported_protocol_versions(),
40             cipher_suites: self.crypto_provider().supported_cipher_suites(),
41             extensions: self.supported_extensions(),
42             proposals: self.supported_custom_proposals(),
43             credentials: self.supported_credentials(),
44         }
45     }
46 
version_supported(&self, version: ProtocolVersion) -> bool47     fn version_supported(&self, version: ProtocolVersion) -> bool {
48         self.supported_protocol_versions().contains(&version)
49     }
50 
supported_credentials(&self) -> Vec<CredentialType>51     fn supported_credentials(&self) -> Vec<CredentialType> {
52         self.identity_provider().supported_types()
53     }
54 }
55