13 个版本
0.0.14 | 2020年1月4日 |
---|---|
0.0.13 | 2019年7月26日 |
0.0.11 | 2018年12月9日 |
0.0.10 | 2017年9月5日 |
0.0.4 | 2017年7月5日 |
#1580 在 解析器实现
3,991 每月下载量
在 18 个 软件包中(直接使用4个)
28KB
507 代码行
derp
derp
是 DER Parser。
derp
不会 panic。 derp
是最小的。
示例
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);
}
致谢
derp
的很大一部分是由 @briansmith 从加密库 ring
中提取的。如果你喜欢这个库,请向他表示感谢。
许可证
本作品根据 ISC 许可证授权。请参阅 LICENSE。
依赖项
~29KB