1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
//! 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| { //! 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, y)) //! })?; //! let bits = derp::bit_string_with_no_unused_bits(input)?; //! Ok((x, y, bits)) //! }) //! }).unwrap(); //! //! assert_eq!(x, Input::from(&[0x01, 0x02, 0x03, 0x04, 0x05, 0x06])); //! assert_eq!(y, Input::from(&[0x0a, 0x0b, 0x0c, 0x0d])); //! assert_eq!(bits, Input::from(&[0xff, 0xff, 0xff])); //! //! let mut buf = Vec::new(); //! { //! let mut der = Der::new(&mut buf); //! der.write_sequence(|der| { //! der.write_null()?; //! der.write_sequence(|der| { //! der.write_integer(x)?; //! der.write_integer(y) //! })?; //! der.write_bit_string(0, |der| { //! der.write_raw(bits) //! }) //! }).unwrap(); //! } //! //! assert_eq!(buf.as_slice(), MY_DATA); //! } //! ``` extern crate untrusted; mod der; mod writer; pub use der::*; pub use writer::*; #[derive(Debug, PartialEq, Clone, Copy)] pub enum Error { BadBooleanValue, LeadingZero, LessThanMinimum, LongLengthNotSupported, HighTagNumberForm, Io, NegativeValue, NonCanonical, NonZeroUnusedBits, Read, UnexpectedEnd, UnknownTag, WrongTag, WrongValue, } impl From<untrusted::EndOfInput> for Error { fn from(_: untrusted::EndOfInput) -> Error { Error::UnexpectedEnd } } impl From<::std::io::Error> for Error { fn from(_: ::std::io::Error) -> Error { Error::Io } } /// Alias for `Result<T, Error>` pub type Result<T> = ::std::result::Result<T, Error>;