From 87512d363fec0005705534dea78579aa16c22906 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Tue, 20 Feb 2024 13:28:14 +0100 Subject: openpgp: Test ECC key creation and operations. --- openpgp/src/packet/key.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'openpgp/src') diff --git a/openpgp/src/packet/key.rs b/openpgp/src/packet/key.rs index 626239fb..286d4834 100644 --- a/openpgp/src/packet/key.rs +++ b/openpgp/src/packet/key.rs @@ -2668,4 +2668,40 @@ FwPoSAbbsLkNS/iNN2MDGAVYvezYn2QZ } assert_ne!(fpr1, key.fingerprint()); } + + /// Smoke test for ECC key creation, signing and verification, and + /// encryption and decryption. + #[test] + fn ecc_support() -> Result<()> { + for for_signing in [true, false] { + for curve in Curve::variants() + .filter(Curve::is_supported) + { + match curve { + Curve::Cv25519 if for_signing => continue, + Curve::Ed25519 if ! for_signing => continue, + _ => (), + } + + eprintln!("curve {}, for signing {:?}", curve, for_signing); + let key: Key = + Key4::generate_ecc(for_signing, curve.clone())?.into(); + let mut pair = key.into_keypair()?; + + if for_signing { + use crate::crypto::Signer; + let hash = HashAlgorithm::default(); + let digest = hash.context()?.into_digest()?; + let sig = pair.sign(hash, &digest)?; + pair.public().verify(&sig, hash, &digest)?; + } else { + use crate::crypto::{SessionKey, Decryptor}; + let sk = SessionKey::new(32); + let ciphertext = pair.public().encrypt(&sk)?; + assert_eq!(pair.decrypt(&ciphertext, Some(sk.len()))?, sk); + } + } + } + Ok(()) + } } -- cgit v1.2.3