Macro der_parser::parse_der_optional
source · macro_rules! parse_der_optional {
($i:expr, $f:ident) => { ... };
}
Expand description
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), Ok((empty, expected1)));
assert_eq!(parser(&bytes2), Ok((empty, expected2)));