Skip to main content

Crate pqxdh_zoa

Crate pqxdh_zoa 

Source
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
PrekeyBundle
Prekey bundle that can be posted on a public server