Macro der_parser::parse_der_optional
[−]
[src]
macro_rules! parse_der_optional { ($i:expr, $f:ident) => { ... }; }
Parse an optional DER element
Try to parse an optional DER element, and return it as a ContextSpecific
item with tag 0.
If the parsing failed, the ContextSpecific
object has value None
.
use der_parser::*; use nom::{IResult,Err,ErrorKind}; let empty = &b""[..]; let bytes1 = [ 0x30, 0x0a, 0x0a, 0x03, 0x00, 0x00, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01]; let bytes2 = [ 0x30, 0x05, 0x02, 0x03, 0x01, 0x00, 0x01]; let expected1 = DerObject::from_obj(DerObjectContent::Sequence(vec![ DerObject::from_obj( DerObjectContent::ContextSpecific(0, Some(Box::new(DerObject::from_obj(DerObjectContent::Enum(1))))) ), DerObject::from_int_slice(b"\x01\x00\x01"), ])); let expected2 = DerObject::from_obj(DerObjectContent::Sequence(vec![ DerObject::from_obj( DerObjectContent::ContextSpecific(0, None), ), DerObject::from_int_slice(b"\x01\x00\x01"), ])); fn parse_optional_enum(i:&[u8]) -> IResult<&[u8],DerObject> { parse_der_optional!(i, parse_der_enum) } fn parser(i:&[u8]) -> IResult<&[u8],DerObject> { parse_der_sequence_defined!(i, parse_optional_enum, parse_der_integer ) }; assert_eq!(parser(&bytes1), IResult::Done(empty, expected1)); assert_eq!(parser(&bytes2), IResult::Done(empty, expected2));