1 use der::{ 2 asn1::{AnyRef, ObjectIdentifier}, 3 DecodeValue, EncodeValue, FixedTag, Header, Length, Reader, Tag, Writer, 4 }; 5 6 /// Elliptic curve parameters as described in 7 /// [RFC5480 Section 2.1.1](https://datatracker.ietf.org/doc/html/rfc5480#section-2.1.1): 8 /// 9 /// ```text 10 /// ECParameters ::= CHOICE { 11 /// namedCurve OBJECT IDENTIFIER 12 /// -- implicitCurve NULL 13 /// -- specifiedCurve SpecifiedECDomain 14 /// } 15 /// -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. 16 /// -- Details for SpecifiedECDomain can be found in [X9.62]. 17 /// -- Any future additions to this CHOICE should be coordinated 18 /// -- with ANSI X9. 19 /// ``` 20 #[derive(Copy, Clone, Debug, Eq, PartialEq)] 21 pub enum EcParameters { 22 /// Elliptic curve named by a particular OID. 23 /// 24 /// > namedCurve identifies all the required values for a particular 25 /// > set of elliptic curve domain parameters to be represented by an 26 /// > object identifier. 27 NamedCurve(ObjectIdentifier), 28 } 29 30 impl<'a> DecodeValue<'a> for EcParameters { decode_value<R: Reader<'a>>(decoder: &mut R, header: Header) -> der::Result<Self>31 fn decode_value<R: Reader<'a>>(decoder: &mut R, header: Header) -> der::Result<Self> { 32 ObjectIdentifier::decode_value(decoder, header).map(Self::NamedCurve) 33 } 34 } 35 36 impl EncodeValue for EcParameters { value_len(&self) -> der::Result<Length>37 fn value_len(&self) -> der::Result<Length> { 38 match self { 39 Self::NamedCurve(oid) => oid.value_len(), 40 } 41 } 42 encode_value(&self, writer: &mut impl Writer) -> der::Result<()>43 fn encode_value(&self, writer: &mut impl Writer) -> der::Result<()> { 44 match self { 45 Self::NamedCurve(oid) => oid.encode_value(writer), 46 } 47 } 48 } 49 50 impl EcParameters { 51 /// Obtain the `namedCurve` OID. named_curve(self) -> Option<ObjectIdentifier>52 pub fn named_curve(self) -> Option<ObjectIdentifier> { 53 match self { 54 Self::NamedCurve(oid) => Some(oid), 55 } 56 } 57 } 58 59 impl<'a> From<&'a EcParameters> for AnyRef<'a> { from(params: &'a EcParameters) -> AnyRef<'a>60 fn from(params: &'a EcParameters) -> AnyRef<'a> { 61 match params { 62 EcParameters::NamedCurve(oid) => oid.into(), 63 } 64 } 65 } 66 67 impl From<ObjectIdentifier> for EcParameters { from(oid: ObjectIdentifier) -> EcParameters68 fn from(oid: ObjectIdentifier) -> EcParameters { 69 EcParameters::NamedCurve(oid) 70 } 71 } 72 73 impl FixedTag for EcParameters { 74 const TAG: Tag = Tag::ObjectIdentifier; 75 } 76