rocket::mtls::oid::asn1_rs

Trait FromDer

Source
pub trait FromDer<'a>: Sized {
    // Required method
    fn from_der(bytes: &'a [u8]) -> Result<(&'a [u8], Self), Err<Error>>;
}
Available on crate feature 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> + CheckDerConstraint 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> to get the FromBer implementation, then you only have to add a CheckDerConstraint implementation.

§Examples

use asn1_rs::{Any, CheckDerConstraints, 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(())
    }
}

// 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<Error>>

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

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§

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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