14 releases
| 0.0.15 | Jan 20, 2025 |
|---|---|
| 0.0.14 | Jan 4, 2020 |
| 0.0.13 | Jul 26, 2019 |
| 0.0.11 | Dec 9, 2018 |
| 0.0.4 | Jul 5, 2017 |
#379 in Parser implementations
2,860 downloads per month
Used in 35 crates
(3 directly)
28KB
504 lines
derp
derp is DER Parser.
derp doesn't panic. derp is minimal.
Example
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| {
derp::read_null(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()))
})
}).unwrap();
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.null()?;
der.sequence(|der| {
der.integer(x)?;
der.integer(y)
})?;
der.bit_string(0, bits)
}).unwrap();
}
assert_eq!(buf.as_slice(), MY_DATA);
}
Credit
A significant portion of derp was pulled from the crypto library ring by @briansmith.
If you like this lib, thank him.
License
This work is licensed under the ISC license. See LICENSE.
Dependencies
~28KB