pub trait FromDer<'a, E = Error>: Sized {
// Required method
fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Self), Err<E>>;
}mtls only.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§
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementors§
impl<'a> FromDer<'a> for Option<Any<'a>>
impl<'a> FromDer<'a> for Any<'a>
impl<'a> FromDer<'a> for Header<'a>
impl<'a> FromDer<'a, X509Error> for GeneralName<'a>
impl<'a> FromDer<'a, X509Error> for RSAPublicKey<'a>
impl<'a> FromDer<'a, X509Error> for ASN1Time
impl<'a> FromDer<'a, X509Error> for AttributeTypeAndValue<'a>
impl<'a> FromDer<'a, X509Error> for AuthorityInfoAccess<'a>
impl<'a> FromDer<'a, X509Error> for AuthorityKeyIdentifier<'a>
impl<'a> FromDer<'a, X509Error> for BasicConstraints
impl<'a> FromDer<'a, X509Error> for CRLDistributionPoints<'a>
impl<'a> FromDer<'a, X509Error> for CertificateRevocationList<'a>
CertificateList ::= SEQUENCE {
tbsCertList TBSCertList,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
impl<'a> FromDer<'a, X509Error> for ExtendedKeyUsage<'a>
impl<'a> FromDer<'a, X509Error> for ExtensionRequest<'a>
impl<'a> FromDer<'a, X509Error> for InhibitAnyPolicy
impl<'a> FromDer<'a, X509Error> for IssuerAlternativeName<'a>
impl<'a> FromDer<'a, X509Error> for KeyIdentifier<'a>
impl<'a> FromDer<'a, X509Error> for KeyUsage
impl<'a> FromDer<'a, X509Error> for NSCertType
impl<'a> FromDer<'a, X509Error> for NameConstraints<'a>
impl<'a> FromDer<'a, X509Error> for PolicyConstraints
impl<'a> FromDer<'a, X509Error> for PolicyMappings<'a>
impl<'a> FromDer<'a, X509Error> for RelativeDistinguishedName<'a>
impl<'a> FromDer<'a, X509Error> for RevokedCertificate<'a>
impl<'a> FromDer<'a, X509Error> for SubjectAlternativeName<'a>
impl<'a> FromDer<'a, X509Error> for SubjectPublicKeyInfo<'a>
impl<'a> FromDer<'a, X509Error> for TbsCertList<'a>
impl<'a> FromDer<'a, X509Error> for TbsCertificate<'a>
impl<'a> FromDer<'a, X509Error> for Validity
impl<'a> FromDer<'a, X509Error> for X509Certificate<'a>
impl<'a> FromDer<'a, X509Error> for X509CertificationRequest<'a>
CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
signature BIT STRING
}
impl<'a> FromDer<'a, X509Error> for X509CertificationRequestInfo<'a>
CertificationRequestInfo ::= SEQUENCE {
version INTEGER { v1(0) } (v1,...),
subject Name,
subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},
attributes [0] Attributes{{ CRIAttributes }}
}
impl<'a> FromDer<'a, X509Error> for X509CriAttribute<'a>
impl<'a> FromDer<'a, X509Error> for X509Extension<'a>
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
impl<'a> FromDer<'a, X509Error> for X509Name<'a>
impl<'a> FromDer<'a, X509Error> for X509Version
impl<'a, T> FromDer<'a> for Option<T>
impl<'a, T, E> FromDer<'a, E> for BTreeSet<T>
manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints
impl<'a, T, E> FromDer<'a, E> for HashSet<T>
manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints
impl<'a, T, E> FromDer<'a, E> for Vec<T>
manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints
impl<'a, T, E> FromDer<'a, E> for SequenceOf<T>
manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints
impl<'a, T, E> FromDer<'a, E> for SetOf<T>
manual impl of FromDer, so we do not need to require TryFrom<Any> + CheckDerConstraints