summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2024-02-20 13:28:14 +0100
committerJustus Winter <justus@sequoia-pgp.org>2024-02-20 14:43:02 +0100
commit87512d363fec0005705534dea78579aa16c22906 (patch)
treec3e0bceeca26b06241b6cf09fc20a159aed9ce50
parent5ebcd83992195de2bcb961fa5b359260f0b92a7e (diff)
openpgp: Test ECC key creation and operations.
-rw-r--r--openpgp/src/packet/key.rs36
1 files changed, 36 insertions, 0 deletions
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<SecretParts, UnspecifiedRole> =
+ 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(())
+ }
}