Expand description
This implementation is generic and can be used with different KEM, AEAD and hash crates.
We propose the following dependencies:
aes-gcm-siv = "0.12.0-rc.3"
ed25519-dalek = { version = "3.0.0-pre.6", features = ["rand_core"] }
ml-kem = "0.3.0-rc.0"
rand = "0.10.0"
sha2 = "0.11.0-rc.5"Example: Bob publishes a key bundle so Alice can use it to send Bob a message.
use ml_kem::Kem;
use pqxdh_zoa::{PQXDH, ParamString, PrekeyBundle, traits::PQXDH as _};
use rand::{Rng, RngExt, rngs::ThreadRng};
type MyPQXDH = PQXDH<
aes_gcm_siv::Aes256GcmSiv,
ml_kem::MlKem1024,
sha2::Sha512,
MyPQXDHParamString,
std::vec::Vec<u8>,
>;
struct MyPQXDHParamString;
impl ParamString for MyPQXDHParamString {
fn param_string<'a>() -> &'a [u8] {
b"TestPQXDH_CURVE25519_SHA-512_ML-KEM-1024"
}
}
let mut rng = rand::rng();
// Alice
let alice_id = ed25519_dalek::SigningKey::generate(&mut rng);
// Bob
let bob_id = ed25519_dalek::SigningKey::generate(&mut rng);
let curve_prekey = ed25519_dalek::SigningKey::generate(&mut rng);
let curve_ot_prekey = ed25519_dalek::SigningKey::generate(&mut rng);
let (pqsk, pqpk) = ml_kem::MlKem1024::generate_keypair_from_rng(&mut rng);
let prekey_bundle = PrekeyBundle {
curve_prekey: curve_prekey.verifying_key(),
curve_ot_prekey: Some(curve_ot_prekey.verifying_key()),
identity_key: bob_id.verifying_key(),
pq_prekey: pqpk,
pq_prekey_id: 42,
};
let mut cleartext = b"Regardez les canards attendre au quai de la gare.";
let (sk, ad, mut ciphertext) =
MyPQXDH::send::<ThreadRng>(&alice_id, &prekey_bundle, cleartext.to_vec(), &mut rng)
.unwrap();
let (rec_sk, rec_ad) = MyPQXDH::receive(
&bob_id,
&curve_prekey,
Some(&curve_ot_prekey),
&mut ciphertext,
&pqsk,
)
.unwrap();
assert_eq!(cleartext.as_slice(), ciphertext.message.as_slice());
assert_eq!(sk, rec_sk);
assert_eq!(ad, rec_ad);Re-exports§
pub use traits::ParamString;pub use traits::ReceiveError;pub use traits::SendError;
Modules§
- traits
- Generic traits for PQXDH
Structs§
- Message
- Encapsulated message containing an encrypted payload
- PQXDH
- Implementation of PQXDH using the algorithms proposed in the original specs
- Prekey
Bundle - Prekey bundle that can be posted on a public server