xmtp_cryptography/
post_quantum.rs1use crate::configuration::POST_QUANTUM_CIPHERSUITE;
2use openmls::prelude::HpkeKeyPair;
3use openmls_libcrux_crypto::Provider as LibcruxProvider;
4use openmls_traits::{OpenMlsProvider, crypto::OpenMlsCrypto, random::OpenMlsRand};
5use thiserror::Error;
6use tls_codec::SecretVLBytes;
7
8#[derive(Debug, Error)]
10pub enum GeneratePostQuantumKeyError {
11 #[error(transparent)]
12 Crypto(#[from] openmls_traits::types::CryptoError),
13 #[error(transparent)]
14 Rand(#[from] openmls_libcrux_crypto::RandError),
15}
16
17pub fn generate_post_quantum_key() -> Result<HpkeKeyPair, GeneratePostQuantumKeyError> {
19 let provider = LibcruxProvider::default();
20 let rand = provider.rand();
21
22 let ikm: SecretVLBytes = rand
23 .random_vec(POST_QUANTUM_CIPHERSUITE.hash_length())?
24 .into();
25
26 Ok(provider
27 .crypto()
28 .derive_hpke_keypair(POST_QUANTUM_CIPHERSUITE.hpke_config(), ikm.as_slice())?)
29}