From 913904754ddd585d93522bc45e8d9e830d278f9a Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Wed, 1 Mar 2023 16:25:59 +0100 Subject: openpgp: Add support for brainpoolP384r1. - One of the brainpool curves was not included in our enum Curve, because at the time we implemented ECC support, it wasn't part of the RFC4880bis document. - Unfortunately, we failed to mark enum Curve as non-exhaustive, so we cannot add a variant without breaking the API. - We can, however, support the curve by matching on its OID. --- openpgp/src/types/mod.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'openpgp/src/types/mod.rs') diff --git a/openpgp/src/types/mod.rs b/openpgp/src/types/mod.rs index 863880e5..698b65d1 100644 --- a/openpgp/src/types/mod.rs +++ b/openpgp/src/types/mod.rs @@ -365,6 +365,13 @@ pub enum Curve { /// Unknown curve. Unknown(Box<[u8]>), } +impl Curve { + /// Hack! Curve is not non-exhaustive, so we cannot easily add + /// a variant. + pub(crate) fn is_brainpoolp384(&self) -> bool { + self.oid() == BRAINPOOL_P384_OID + } +} assert_send_and_sync!(Curve); impl Curve { @@ -398,6 +405,7 @@ impl Curve { NistP384 => Some(384), NistP521 => Some(521), BrainpoolP256 => Some(256), + Unknown(_) if self.is_brainpoolp384() => Some(384), BrainpoolP512 => Some(512), Ed25519 => Some(256), Cv25519 => Some(256), @@ -455,6 +463,8 @@ impl fmt::Display for Curve { NistP384 => f.write_str("NIST curve P-384"), NistP521 => f.write_str("NIST curve P-521"), BrainpoolP256 => f.write_str("brainpoolP256r1"), + Unknown(_) if self.is_brainpoolp384() => + f.write_str("brainpoolP384r1"), BrainpoolP512 => f.write_str("brainpoolP512r1"), Ed25519 => f.write_str("D.J. Bernstein's \"Twisted\" Edwards curve Ed25519"), @@ -469,6 +479,8 @@ impl fmt::Display for Curve { NistP384 => f.write_str("NIST P-384"), NistP521 => f.write_str("NIST P-521"), BrainpoolP256 => f.write_str("brainpoolP256r1"), + Unknown(_) if self.is_brainpoolp384() => + f.write_str("brainpoolP384r1"), BrainpoolP512 => f.write_str("brainpoolP512r1"), Ed25519 => f.write_str("Ed25519"), @@ -486,6 +498,8 @@ const NIST_P384_OID: &[u8] = &[0x2B, 0x81, 0x04, 0x00, 0x22]; const NIST_P521_OID: &[u8] = &[0x2B, 0x81, 0x04, 0x00, 0x23]; const BRAINPOOL_P256_OID: &[u8] = &[0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07]; +const BRAINPOOL_P384_OID: &[u8] = + &[0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B]; const BRAINPOOL_P512_OID: &[u8] = &[0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D]; const ED25519_OID: &[u8] = @@ -513,6 +527,7 @@ impl Curve { NIST_P384_OID => Curve::NistP384, NIST_P521_OID => Curve::NistP521, BRAINPOOL_P256_OID => Curve::BrainpoolP256, + BRAINPOOL_P384_OID => Curve::Unknown(BRAINPOOL_P384_OID.into()), BRAINPOOL_P512_OID => Curve::BrainpoolP512, ED25519_OID => Curve::Ed25519, CV25519_OID => Curve::Cv25519, @@ -568,6 +583,7 @@ impl Curve { Curve::NistP384 => Ok(384), Curve::NistP521 => Ok(521), Curve::BrainpoolP256 => Ok(256), + Curve::Unknown(_) if self.is_brainpoolp384() => Ok(384), Curve::BrainpoolP512 => Ok(512), Curve::Ed25519 => Ok(256), Curve::Cv25519 => Ok(256), @@ -596,15 +612,16 @@ impl Curve { #[cfg(test)] impl Arbitrary for Curve { fn arbitrary(g: &mut Gen) -> Self { - match u8::arbitrary(g) % 8 { + match u8::arbitrary(g) % 9 { 0 => Curve::NistP256, 1 => Curve::NistP384, 2 => Curve::NistP521, 3 => Curve::BrainpoolP256, - 4 => Curve::BrainpoolP512, - 5 => Curve::Ed25519, - 6 => Curve::Cv25519, - 7 => Curve::Unknown({ + 4 => Curve::Unknown(BRAINPOOL_P384_OID.into()), + 5 => Curve::BrainpoolP512, + 6 => Curve::Ed25519, + 7 => Curve::Cv25519, + 8 => Curve::Unknown({ let mut k = >::arbitrary(g); k.truncate(255); k.into_boxed_slice() -- cgit v1.2.3