Crate derp

source ·
Expand description

DER Parser (and Writer)

extern crate derp;
extern crate untrusted;

use derp::{Tag, Der};
use untrusted::Input;

const MY_DATA: &'static [u8] = &[
    0x30, 0x18,                                             // sequence
        0x05, 0x00,                                         // null
        0x30, 0x0e,                                         // sequence
            0x02, 0x06, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // x
            0x02, 0x04, 0x0a, 0x0b, 0x0c, 0x0d,             // y
        0x03, 0x04, 0x00, 0xff, 0xff, 0xff,                 // bits

fn main() {
    let input = Input::from(MY_DATA);
    let (x, y, bits) = input.read_all(derp::Error::Read, |input| {
        derp::nested(input, Tag::Sequence, |input| {
            let (x, y) = derp::nested(input, Tag::Sequence, |input| {
                let x = derp::positive_integer(input)?;
                let y = derp::positive_integer(input)?;
                Ok((x.as_slice_less_safe(), y.as_slice_less_safe()))
            let bits = derp::bit_string_with_no_unused_bits(input)?;
            Ok((x, y, bits.as_slice_less_safe()))

    assert_eq!(x, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
    assert_eq!(y, &[0x0a, 0x0b, 0x0c, 0x0d]);
    assert_eq!(bits, &[0xff, 0xff, 0xff]);

    let mut buf = Vec::new();
        let mut der = Der::new(&mut buf);
        der.sequence(|der| {
            der.sequence(|der| {
            der.bit_string(0, bits)

    assert_eq!(buf.as_slice(), MY_DATA);


Helper for writing DER that automattically encoes tags and content lengths.


ASN.1 Tags


Read a BIT STRING with leading byte 0x00 signifying no unused bits.
Parse a boolean value.
Read a tag and return it’s value. Errors when the expect and actual tag do not match.
For a given length, how many bytes are required to represent it in DER form.
Return the value of the given tag and apply a decoding function to it.
Return a non-negative integer.
Parses a positive DER integer, returning the big-endian-encoded value, sans any leading zero byte.
Read the next tag, and return it and its value.
Parse as integer with a value in the in the range [0, 255], returning its numeric value. This is typically used for parsing version numbers.

Type Definitions

Alias for Result<T, Error>