/rust/registry/src/index.crates.io-1949cf8c6b5b557f/snmp-parser-0.10.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 | 96.2k | fn parse_snmp_v1_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpMessage, SnmpError> { |
16 | 96.2k | let (i, community) = parse_ber_octetstring_as_str(i).map_err(Err::convert)?; |
17 | 95.5k | let (i, pdu) = parse_snmp_v1_pdu(i)?; |
18 | 94.6k | let msg = SnmpMessage { |
19 | 94.6k | version: 0, |
20 | 94.6k | community: community.to_string(), |
21 | 94.6k | pdu, |
22 | 94.6k | }; |
23 | 94.6k | Ok((i, msg)) |
24 | 96.2k | } |
25 | | |
26 | 33.7k | fn parse_snmp_v2c_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpMessage, SnmpError> { |
27 | 33.7k | let (i, community) = parse_ber_octetstring_as_str(i).map_err(Err::convert)?; |
28 | 29.7k | let (i, pdu) = parse_snmp_v2c_pdu(i)?; |
29 | 16.6k | let msg = SnmpMessage { |
30 | 16.6k | version: 1, |
31 | 16.6k | community: community.to_string(), |
32 | 16.6k | pdu, |
33 | 16.6k | }; |
34 | 16.6k | Ok((i, msg)) |
35 | 33.7k | } |
36 | | |
37 | 114k | fn parse_snmp_v3_pdu_content(i: &[u8]) -> IResult<&[u8], SnmpV3Message, SnmpError> { |
38 | 114k | let (i, hdr) = parse_snmp_v3_headerdata(i)?; |
39 | 103k | let (i, secp) = map_res(<&[u8]>::from_ber, |x| parse_secp(x, &hdr))(i).map_err(Err::convert)?; |
40 | 90.2k | let (i, data) = parse_snmp_v3_data(i, &hdr)?; |
41 | 75.3k | let msg = SnmpV3Message { |
42 | 75.3k | version: 3, |
43 | 75.3k | header_data: hdr, |
44 | 75.3k | security_params: secp, |
45 | 75.3k | data, |
46 | 75.3k | }; |
47 | 75.3k | Ok((i, msg)) |
48 | 114k | } |
49 | | |
50 | 253k | pub fn parse_snmp_generic_message(i: &[u8]) -> IResult<&[u8], SnmpGenericMessage, SnmpError> { |
51 | 253k | let (rem, any) = Any::from_ber(i).or(Err(Err::Error(SnmpError::InvalidMessage)))?; |
52 | 252k | if any.tag() != Tag::Sequence { |
53 | 4.94k | return Err(Err::Error(SnmpError::InvalidMessage)); |
54 | 247k | } |
55 | 247k | let (r, version) = u32::from_ber(any.data).map_err(Err::convert)?; |
56 | 244k | let (_, msg) = match version { |
57 | | 0 => { |
58 | 96.2k | let (rem, msg) = parse_snmp_v1_pdu_content(r)?; |
59 | 94.6k | (rem, SnmpGenericMessage::V1(msg)) |
60 | | } |
61 | | 1 => { |
62 | 33.7k | let (rem, msg) = parse_snmp_v2c_pdu_content(r)?; |
63 | 16.6k | (rem, SnmpGenericMessage::V2(msg)) |
64 | | } |
65 | | 3 => { |
66 | 114k | let (rem, msg) = parse_snmp_v3_pdu_content(r)?; |
67 | 75.3k | (rem, SnmpGenericMessage::V3(msg)) |
68 | | } |
69 | 194 | _ => return Err(Err::Error(SnmpError::InvalidVersion)), |
70 | | }; |
71 | 186k | Ok((rem, msg)) |
72 | 253k | } |