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
96
97
98
99
use super::{Explicit, Implicit, TaggedParser};
use crate::{Any, Error, FromDer, Header, ParseResult, Tag, Tagged};
use nom::error::ParseError;
use nom::IResult;
pub fn parse_der_tagged_explicit<'a, IntoTag, T>(
tag: IntoTag,
) -> impl FnMut(&'a [u8]) -> ParseResult<TaggedParser<'a, Explicit, T>>
where
IntoTag: Into<Tag>,
TaggedParser<'a, Explicit, T>: FromDer<'a>,
{
let tag = tag.into();
move |i| {
let (rem, tagged) = TaggedParser::from_der(i)?;
tagged.assert_tag(tag)?;
Ok((rem, tagged))
}
}
pub fn parse_der_tagged_explicit_g<'a, IntoTag, T, F, E>(
tag: IntoTag,
f: F,
) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], T, E>
where
F: Fn(&'a [u8], Header<'a>) -> IResult<&'a [u8], T, E>,
E: ParseError<&'a [u8]> + From<Error>,
IntoTag: Into<Tag>,
{
let tag = tag.into();
parse_der_container(tag, move |any: Any<'a>| {
any.header
.assert_tag(tag)
.map_err(|e| nom::Err::convert(e.into()))?;
f(any.data, any.header)
})
}
pub fn parse_der_tagged_implicit<'a, IntoTag, T>(
tag: IntoTag,
) -> impl FnMut(&'a [u8]) -> ParseResult<TaggedParser<'a, Implicit, T>>
where
IntoTag: Into<Tag>,
TaggedParser<'a, Implicit, T>: FromDer<'a>,
{
let tag = tag.into();
move |i| {
let (rem, tagged) = TaggedParser::from_der(i)?;
tagged.assert_tag(tag)?;
Ok((rem, tagged))
}
}
pub fn parse_der_tagged_implicit_g<'a, IntoTag, T, F, E>(
tag: IntoTag,
f: F,
) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], T, E>
where
F: Fn(&'a [u8], Tag, Header<'a>) -> IResult<&'a [u8], T, E>,
E: ParseError<&'a [u8]> + From<Error>,
IntoTag: Into<Tag>,
T: Tagged,
{
let tag = tag.into();
parse_der_container(tag, move |any: Any<'a>| {
any.header
.assert_tag(tag)
.map_err(|e| nom::Err::convert(e.into()))?;
let Any { header, data } = any;
let header = Header {
tag: T::TAG,
..header.clone()
};
f(data, tag, header)
})
}
fn parse_der_container<'a, T, F, E>(
tag: Tag,
f: F,
) -> impl FnMut(&'a [u8]) -> IResult<&'a [u8], T, E>
where
F: Fn(Any<'a>) -> IResult<&'a [u8], T, E>,
E: ParseError<&'a [u8]> + From<Error>,
{
move |i: &[u8]| {
let (rem, any) = Any::from_der(i).map_err(nom::Err::convert)?;
any.header
.assert_tag(tag)
.map_err(|e| nom::Err::convert(e.into()))?;
let (_, output) = f(any)?;
Ok((rem, output))
}
}