Skip to main content

xmtp_cryptography/
post_quantum.rs

1use 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/// Error type for generating a post quantum key pair
9#[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
17/// Generate a new key pair using our post quantum ciphersuite
18pub 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}