pub trait FromDer<'a, E = Error>: Sized {
    // Required method
    fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Self), Err<E>>;
}
Expand description

Base trait for DER object parsers

Library authors should usually not directly implement this trait, but should prefer implementing the TryFrom<Any> + CheckDerConstraints traits, which offers greater flexibility and provides an equivalent FromDer implementation for free (in fact, it provides both FromBer and FromDer).

Note: if you already implemented TryFrom<Any> and CheckDerConstraints, you can get a free FromDer implementation by implementing the DerAutoDerive trait. This is not automatic, so it is also possible to manually implement FromDer if preferred.

§Examples

use asn1_rs::{Any, CheckDerConstraints, DerAutoDerive, Result, Tag};
use std::convert::TryFrom;

// The type to be decoded
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MyType(pub u32);

impl<'a> TryFrom<Any<'a>> for MyType {
    type Error = asn1_rs::Error;

    fn try_from(any: Any<'a>) -> Result<MyType> {
        any.tag().assert_eq(Tag::Integer)?;
        // for this fictive example, the type contains the number of characters
        let n = any.data.len() as u32;
        Ok(MyType(n))
    }
}

impl CheckDerConstraints for MyType {
    fn check_constraints(any: &Any) -> Result<()> {
        any.header.assert_primitive()?;
        Ok(())
    }
}

impl DerAutoDerive for MyType {}

// The above code provides a `FromDer` implementation for free.

// Example of parsing code:
use asn1_rs::FromDer;

let input = &[2, 1, 2];
// Objects can be parsed using `from_der`, which returns the remaining bytes
// and the parsed object:
let (rem, my_type) = MyType::from_der(input).expect("parsing failed");

Required Methods§

source

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Self), Err<E>>

Attempt to parse input bytes into a DER object (enforcing constraints)

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl<'a> FromDer<'a> for Option<Any<'a>>

source§

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Option<Any<'a>>), Err<Error>>

source§

impl<'a, T> FromDer<'a> for Option<T>
where T: FromDer<'a> + Tagged,

source§

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Option<T>), Err<Error>>

source§

impl<'a, T, E> FromDer<'a, E> for BTreeSet<T>
where T: FromDer<'a, E> + Ord, E: From<Error>,

manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints

source§

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], BTreeSet<T>), Err<E>>

source§

impl<'a, T, E> FromDer<'a, E> for Vec<T>
where T: FromDer<'a, E>, E: From<Error>,

manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints

source§

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Vec<T>), Err<E>>

source§

impl<'a, T, E> FromDer<'a, E> for HashSet<T>
where T: FromDer<'a, E> + Hash + Eq, E: From<Error>,

manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints

source§

fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], HashSet<T>), Err<E>>

Implementors§

source§

impl<'a> FromDer<'a> for Any<'a>

source§

impl<'a> FromDer<'a> for Header<'a>

source§

impl<'a> FromDer<'a, X509Error> for GeneralName<'a>

source§

impl<'a> FromDer<'a, X509Error> for TbsCertificate<'a>

source§

impl<'a> FromDer<'a, X509Error> for Validity

source§

impl<'a> FromDer<'a, X509Error> for X509Certificate<'a>

source§

impl<'a> FromDer<'a, X509Error> for X509CertificationRequest<'a>

CertificationRequest ::= SEQUENCE {
    certificationRequestInfo CertificationRequestInfo,
    signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
    signature          BIT STRING
}
source§

impl<'a> FromDer<'a, X509Error> for X509CertificationRequestInfo<'a>

CertificationRequestInfo ::= SEQUENCE {
     version       INTEGER { v1(0) } (v1,...),
     subject       Name,
     subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
     attributes    [0] Attributes{{ CRIAttributes }}
}
source§

impl<'a> FromDer<'a, X509Error> for ExtensionRequest<'a>

source§

impl<'a> FromDer<'a, X509Error> for X509CriAttribute<'a>

source§

impl<'a> FromDer<'a, X509Error> for AuthorityInfoAccess<'a>

source§

impl<'a> FromDer<'a, X509Error> for AuthorityKeyIdentifier<'a>

source§

impl<'a> FromDer<'a, X509Error> for BasicConstraints

source§

impl<'a> FromDer<'a, X509Error> for CRLDistributionPoints<'a>

source§

impl<'a> FromDer<'a, X509Error> for ExtendedKeyUsage<'a>

source§

impl<'a> FromDer<'a, X509Error> for InhibitAnyPolicy

source§

impl<'a> FromDer<'a, X509Error> for IssuerAlternativeName<'a>

source§

impl<'a> FromDer<'a, X509Error> for KeyIdentifier<'a>

source§

impl<'a> FromDer<'a, X509Error> for KeyUsage

source§

impl<'a> FromDer<'a, X509Error> for NSCertType

source§

impl<'a> FromDer<'a, X509Error> for NameConstraints<'a>

source§

impl<'a> FromDer<'a, X509Error> for PolicyConstraints

source§

impl<'a> FromDer<'a, X509Error> for PolicyMappings<'a>

source§

impl<'a> FromDer<'a, X509Error> for SubjectAlternativeName<'a>

source§

impl<'a> FromDer<'a, X509Error> for X509Extension<'a>

Extension  ::=  SEQUENCE  {
    extnID      OBJECT IDENTIFIER,
    critical    BOOLEAN DEFAULT FALSE,
    extnValue   OCTET STRING  }
source§

impl<'a> FromDer<'a, X509Error> for RSAPublicKey<'a>

source§

impl<'a> FromDer<'a, X509Error> for CertificateRevocationList<'a>

CertificateList  ::=  SEQUENCE  {
     tbsCertList          TBSCertList,
     signatureAlgorithm   AlgorithmIdentifier,
     signatureValue       BIT STRING  }
source§

impl<'a> FromDer<'a, X509Error> for RevokedCertificate<'a>

source§

impl<'a> FromDer<'a, X509Error> for TbsCertList<'a>

source§

impl<'a> FromDer<'a, X509Error> for ASN1Time

source§

impl<'a> FromDer<'a, X509Error> for AttributeTypeAndValue<'a>

source§

impl<'a> FromDer<'a, X509Error> for RelativeDistinguishedName<'a>

source§

impl<'a> FromDer<'a, X509Error> for SubjectPublicKeyInfo<'a>

source§

impl<'a> FromDer<'a, X509Error> for X509Name<'a>

source§

impl<'a> FromDer<'a, X509Error> for X509Version

source§

impl<'a, T, E> FromDer<'a, E> for TaggedParser<'a, Explicit, T, E>
where T: FromDer<'a, E>, E: From<Error>,

source§

impl<'a, T, E> FromDer<'a, E> for TaggedParser<'a, Implicit, T, E>
where T: TryFrom<Any<'a>, Error = E> + CheckDerConstraints + Tagged, E: From<Error>,

source§

impl<'a, T, E> FromDer<'a, E> for T
where T: TryFrom<Any<'a>, Error = E> + CheckDerConstraints + DerAutoDerive, E: From<Error>,

source§

impl<'a, T, E, const CLASS: u8, const TAG: u32> FromDer<'a, E> for TaggedValue<T, E, Explicit, CLASS, TAG>
where T: FromDer<'a, E>, E: From<Error>,

source§

impl<'a, T, E, const CLASS: u8, const TAG: u32> FromDer<'a, E> for TaggedValue<T, E, Implicit, CLASS, TAG>
where T: TryFrom<Any<'a>, Error = E> + Tagged, E: From<Error>,

source§

impl<'ber, 'a> FromDer<'ber> for PolicyMapping<'a>
where 'ber: 'a,

source§

impl<'ber, 'a> FromDer<'ber> for EcdsaSigValue<'a>
where 'ber: 'a,

source§

impl<'ber, 'a> FromDer<'ber, X509Error> for AlgorithmIdentifier<'a>
where 'ber: 'a,