/rust/registry/src/index.crates.io-1949cf8c6b5b557f/snmp-parser-0.9.0/src/generic.rs
Line | Count | Source |
1 | | use crate::error::SnmpError; |
2 | | use crate::snmp::*; |
3 | | use crate::snmpv3::*; |
4 | | use asn1_rs::{Any, FromBer, Tag}; |
5 | | use nom::combinator::map_res; |
6 | | use nom::{Err, IResult}; |
7 | | |
8 | | #[derive(Debug, PartialEq)] |
9 | | pub enum SnmpGenericMessage<'a> { |
10 | | V1(SnmpMessage<'a>), |
11 | | V2(SnmpMessage<'a>), |
12 | | V3(SnmpV3Message<'a>), |
13 | | } |
14 | | |
15 | 163k | fn parse_snmp_v1_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpMessage, SnmpError> { |
16 | 163k | let (i, community) = parse_ber_octetstring_as_str(i).map_err(Err::convert)?; |
17 | 163k | let (i, pdu) = parse_snmp_v1_pdu(i)?; |
18 | 162k | let msg = SnmpMessage { |
19 | 162k | version: 0, |
20 | 162k | community: community.to_string(), |
21 | 162k | pdu, |
22 | 162k | }; |
23 | 162k | Ok((i, msg)) |
24 | 163k | } |
25 | | |
26 | 21.7k | fn parse_snmp_v2c_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpMessage, SnmpError> { |
27 | 21.7k | let (i, community) = parse_ber_octetstring_as_str(i).map_err(Err::convert)?; |
28 | 21.1k | let (i, pdu) = parse_snmp_v2c_pdu(i)?; |
29 | 19.5k | let msg = SnmpMessage { |
30 | 19.5k | version: 1, |
31 | 19.5k | community: community.to_string(), |
32 | 19.5k | pdu, |
33 | 19.5k | }; |
34 | 19.5k | Ok((i, msg)) |
35 | 21.7k | } |
36 | | |
37 | 20.9k | fn parse_snmp_v3_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpV3Message, SnmpError> { |
38 | 20.9k | let (i, hdr) = parse_snmp_v3_headerdata(i)?; |
39 | 18.3k | let (i, secp) = map_res(<&[u8]>::from_ber, |x| parse_secp(x, &hdr))(i).map_err(Err::convert)?; |
40 | 15.2k | let (i, data) = parse_snmp_v3_data(i, &hdr)?; |
41 | 12.0k | let msg = SnmpV3Message { |
42 | 12.0k | version: 3, |
43 | 12.0k | header_data: hdr, |
44 | 12.0k | security_params: secp, |
45 | 12.0k | data, |
46 | 12.0k | }; |
47 | 12.0k | Ok((i, msg)) |
48 | 20.9k | } |
49 | | |
50 | 211k | pub fn parse_snmp_generic_message(i: &[u8]) -> IResult<&[u8], SnmpGenericMessage, SnmpError> { |
51 | 211k | let (rem, any) = Any::from_ber(i).or(Err(Err::Error(SnmpError::InvalidMessage)))?; |
52 | 210k | if any.tag() != Tag::Sequence { |
53 | 1.22k | return Err(Err::Error(SnmpError::InvalidMessage)); |
54 | 209k | } |
55 | 209k | let (r, version) = u32::from_ber(any.data).map_err(Err::convert)?; |
56 | 206k | let (_, msg) = match version { |
57 | | 0 => { |
58 | 163k | let (rem, msg) = parse_snmp_v1_pdu_content(r)?; |
59 | 162k | (rem, SnmpGenericMessage::V1(msg)) |
60 | | } |
61 | | 1 => { |
62 | 21.7k | let (rem, msg) = parse_snmp_v2c_pdu_content(r)?; |
63 | 19.5k | (rem, SnmpGenericMessage::V2(msg)) |
64 | | } |
65 | | 3 => { |
66 | 20.9k | let (rem, msg) = parse_snmp_v3_pdu_content(r)?; |
67 | 12.0k | (rem, SnmpGenericMessage::V3(msg)) |
68 | | } |
69 | 115 | _ => return Err(Err::Error(SnmpError::InvalidVersion)), |
70 | | }; |
71 | 194k | Ok((rem, msg)) |
72 | 211k | } |