#![cfg(feature = "std")]
use std::sync::Arc;
use lib_q_core::{
Algorithm,
KemContext,
};
use lib_q_hpke::hpke_core::{
setup_receiver_with_mode,
setup_sender_with_mode,
};
use lib_q_hpke::providers::post_quantum::PostQuantumProvider;
use lib_q_hpke::providers::traits::HpkeCryptoProvider;
use lib_q_hpke::types::{
HpkeAead,
HpkeCipherSuite,
HpkeKdf,
HpkeKem,
HpkeMode,
HpkePskWireFormat,
};
use lib_q_kem::LibQKemProvider;
#[test]
fn debug_auth_mode() {
let provider = Box::new(LibQKemProvider::new().expect("Failed to create KEM provider"));
let mut kem_ctx = KemContext::with_provider(provider);
let hpke_crypto: Arc<dyn HpkeCryptoProvider + Send + Sync> =
Arc::new(PostQuantumProvider::new());
let cipher_suite = HpkeCipherSuite::new(
HpkeKem::MlKem512,
HpkeKdf::HkdfShake256,
HpkeAead::Saturnin256,
);
let recipient_keypair = kem_ctx
.generate_keypair(Algorithm::MlKem512, None)
.expect("Recipient key generation should work");
let sender_keypair = kem_ctx
.generate_keypair(Algorithm::MlKem512, None)
.expect("Sender key generation should work");
println!(
"Recipient PK size: {}",
recipient_keypair.public_key().as_bytes().len()
);
println!(
"Recipient SK size: {}",
recipient_keypair.secret_key().as_bytes().len()
);
println!(
"Sender PK size: {}",
sender_keypair.public_key().as_bytes().len()
);
println!(
"Sender SK size: {}",
sender_keypair.secret_key().as_bytes().len()
);
let mut rng = lib_q_hpke::security::prng::SimpleRng::new();
let sender_ctx = setup_sender_with_mode(
&mut kem_ctx,
recipient_keypair.public_key(),
b"test-info",
&cipher_suite,
hpke_crypto.as_ref(),
&mut rng,
HpkeMode::Auth,
None,
None,
Some(sender_keypair.secret_key()),
Some(sender_keypair.public_key()),
HpkePskWireFormat::default(),
hpke_crypto.clone(),
)
.expect("Auth mode sender setup should work");
println!(
"Sender encapsulated key size: {}",
sender_ctx.encapsulated_key.len()
);
println!(
"Sender shared secret size: {}",
sender_ctx.shared_secret.len()
);
println!("Sender key size: {}", sender_ctx.key.len());
println!("Sender nonce size: {}", sender_ctx.nonce.len());
let receiver_ctx = setup_receiver_with_mode(
&mut kem_ctx,
&sender_ctx.encapsulated_key,
recipient_keypair.secret_key(),
b"test-info",
&cipher_suite,
hpke_crypto.as_ref(),
HpkeMode::Auth,
None,
None,
Some(sender_keypair.public_key()),
HpkePskWireFormat::default(),
hpke_crypto.clone(),
)
.expect("Auth mode receiver setup should work");
println!(
"Receiver shared secret size: {}",
receiver_ctx.shared_secret.len()
);
println!("Receiver key size: {}", receiver_ctx.key.len());
println!("Receiver nonce size: {}", receiver_ctx.nonce.len());
println!("Keys match: {}", sender_ctx.key == receiver_ctx.key);
println!("Nonces match: {}", sender_ctx.nonce == receiver_ctx.nonce);
println!(
"Shared secrets match: {}",
sender_ctx.shared_secret == receiver_ctx.shared_secret
);
if sender_ctx.key != receiver_ctx.key {
println!("Sender key: {:?}", &sender_ctx.key[..8]);
println!("Receiver key: {:?}", &receiver_ctx.key[..8]);
}
if sender_ctx.shared_secret != receiver_ctx.shared_secret {
println!("Sender shared secret: {:?}", &sender_ctx.shared_secret[..8]);
println!(
"Receiver shared secret: {:?}",
&receiver_ctx.shared_secret[..8]
);
}
assert_eq!(sender_ctx.key, receiver_ctx.key);
assert_eq!(sender_ctx.nonce, receiver_ctx.nonce);
assert_eq!(sender_ctx.shared_secret, receiver_ctx.shared_secret);
}