#![cfg(all(feature = "hpke", wolfssl_hpke, feature = "rand"))]
use wolfcrypt::hpke::{Hpke, HpkeSuite};
use wolfcrypt::rand::WolfRng;
#[test]
fn seal_then_open_roundtrip() {
let suite = HpkeSuite::X25519_SHA256_AES128;
let mut hpke = Hpke::new(suite).expect("Hpke::new");
let mut rng = WolfRng::new().expect("WolfRng::new");
let mut receiver_kp = hpke.generate_keypair(&mut rng).expect("receiver keypair");
let mut ephemeral_kp = hpke.generate_keypair(&mut rng).expect("ephemeral keypair");
let info = b"test-info";
let aad = b"test-aad";
let plaintext = b"hello HPKE world";
let (enc, ciphertext) = hpke
.seal_base(&mut ephemeral_kp, &mut receiver_kp, info, aad, plaintext)
.expect("seal_base");
assert!(!enc.is_empty(), "enc must not be empty");
assert_eq!(
enc.len(),
suite.enc_len(),
"enc length must match suite.enc_len()"
);
assert_eq!(
ciphertext.len(),
plaintext.len() + suite.tag_len(),
"ciphertext length must be plaintext + tag"
);
let recovered = hpke
.open_base(&mut receiver_kp, &enc, info, aad, &ciphertext)
.expect("open_base");
assert_eq!(recovered.as_slice(), plaintext, "plaintext must round-trip");
}
#[test]
fn wrong_receiver_fails() {
let suite = HpkeSuite::X25519_SHA256_AES128;
let mut hpke = Hpke::new(suite).expect("Hpke::new");
let mut rng = WolfRng::new().expect("WolfRng::new");
let mut receiver_a = hpke.generate_keypair(&mut rng).expect("receiver A");
let mut receiver_b = hpke.generate_keypair(&mut rng).expect("receiver B");
let mut ephemeral = hpke.generate_keypair(&mut rng).expect("ephemeral");
let info = b"info";
let aad = b"aad";
let plaintext = b"secret message";
let (enc, ciphertext) = hpke
.seal_base(&mut ephemeral, &mut receiver_a, info, aad, plaintext)
.expect("seal_base");
let result = hpke.open_base(&mut receiver_b, &enc, info, aad, &ciphertext);
assert!(result.is_err(), "opening with wrong receiver key must fail");
}
#[test]
fn wrong_aad_fails() {
let suite = HpkeSuite::X25519_SHA256_AES128;
let mut hpke = Hpke::new(suite).expect("Hpke::new");
let mut rng = WolfRng::new().expect("WolfRng::new");
let mut receiver = hpke.generate_keypair(&mut rng).expect("receiver");
let mut ephemeral = hpke.generate_keypair(&mut rng).expect("ephemeral");
let info = b"info";
let plaintext = b"some data";
let (enc, ciphertext) = hpke
.seal_base(&mut ephemeral, &mut receiver, info, b"correct", plaintext)
.expect("seal_base");
let result = hpke.open_base(&mut receiver, &enc, info, b"wrong", &ciphertext);
assert!(result.is_err(), "opening with wrong AAD must fail");
}
#[test]
fn empty_plaintext() {
let suite = HpkeSuite::X25519_SHA256_AES128;
let mut hpke = Hpke::new(suite).expect("Hpke::new");
let mut rng = WolfRng::new().expect("WolfRng::new");
let mut receiver = hpke.generate_keypair(&mut rng).expect("receiver");
let mut ephemeral = hpke.generate_keypair(&mut rng).expect("ephemeral");
let (enc, ciphertext) = hpke
.seal_base(&mut ephemeral, &mut receiver, b"", b"", b"")
.expect("seal_base with empty plaintext");
assert_eq!(ciphertext.len(), suite.tag_len());
let recovered = hpke
.open_base(&mut receiver, &enc, b"", b"", &ciphertext)
.expect("open_base with empty plaintext");
assert!(recovered.is_empty(), "recovered plaintext must be empty");
}
#[test]
fn suite_presets() {
assert_eq!(HpkeSuite::P256_SHA256_AES128.kem, 0x0010);
assert_eq!(HpkeSuite::P256_SHA256_AES128.kdf, 0x0001);
assert_eq!(HpkeSuite::P256_SHA256_AES128.aead, 0x0001);
assert_eq!(HpkeSuite::X25519_SHA256_AES128.kem, 0x0020);
assert_eq!(HpkeSuite::X25519_SHA256_AES128.kdf, 0x0001);
assert_eq!(HpkeSuite::X25519_SHA256_AES128.aead, 0x0001);
assert_eq!(HpkeSuite::P256_SHA256_AES256.aead, 0x0002);
assert_eq!(HpkeSuite::X25519_SHA256_AES256.aead, 0x0002);
assert_eq!(HpkeSuite::P384_SHA384_AES256.kem, 0x0011);
assert_eq!(HpkeSuite::P384_SHA384_AES256.kdf, 0x0002);
assert_eq!(HpkeSuite::P521_SHA512_AES256.kem, 0x0012);
assert_eq!(HpkeSuite::P521_SHA512_AES256.kdf, 0x0003);
assert_eq!(HpkeSuite::X448_SHA512_AES256.kem, 0x0021);
assert_eq!(HpkeSuite::P256_SHA256_AES128.enc_len(), 65);
assert_eq!(HpkeSuite::X25519_SHA256_AES128.enc_len(), 32);
assert_eq!(HpkeSuite::P384_SHA384_AES256.enc_len(), 97);
assert_eq!(HpkeSuite::P521_SHA512_AES256.enc_len(), 133);
assert_eq!(HpkeSuite::X448_SHA512_AES256.enc_len(), 56);
assert_eq!(HpkeSuite::P256_SHA256_AES128.tag_len(), 16);
assert_eq!(HpkeSuite::X25519_SHA256_AES256.tag_len(), 16);
}