use der::{ asn1::{AnyRef, ObjectIdentifier}, DecodeValue, EncodeValue, FixedTag, Header, Length, Reader, Tag, Writer, }; /// Elliptic curve parameters as described in /// [RFC5480 Section 2.1.1](https://datatracker.ietf.org/doc/html/rfc5480#section-2.1.1): /// /// ```text /// ECParameters ::= CHOICE { /// namedCurve OBJECT IDENTIFIER /// -- implicitCurve NULL /// -- specifiedCurve SpecifiedECDomain /// } /// -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. /// -- Details for SpecifiedECDomain can be found in [X9.62]. /// -- Any future additions to this CHOICE should be coordinated /// -- with ANSI X9. /// ``` #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum EcParameters { /// Elliptic curve named by a particular OID. /// /// > namedCurve identifies all the required values for a particular /// > set of elliptic curve domain parameters to be represented by an /// > object identifier. NamedCurve(ObjectIdentifier), } impl<'a> DecodeValue<'a> for EcParameters { fn decode_value>(decoder: &mut R, header: Header) -> der::Result { ObjectIdentifier::decode_value(decoder, header).map(Self::NamedCurve) } } impl EncodeValue for EcParameters { fn value_len(&self) -> der::Result { match self { Self::NamedCurve(oid) => oid.value_len(), } } fn encode_value(&self, writer: &mut impl Writer) -> der::Result<()> { match self { Self::NamedCurve(oid) => oid.encode_value(writer), } } } impl EcParameters { /// Obtain the `namedCurve` OID. pub fn named_curve(self) -> Option { match self { Self::NamedCurve(oid) => Some(oid), } } } impl<'a> From<&'a EcParameters> for AnyRef<'a> { fn from(params: &'a EcParameters) -> AnyRef<'a> { match params { EcParameters::NamedCurve(oid) => oid.into(), } } } impl From for EcParameters { fn from(oid: ObjectIdentifier) -> EcParameters { EcParameters::NamedCurve(oid) } } impl FixedTag for EcParameters { const TAG: Tag = Tag::ObjectIdentifier; }