snmp_parser/
usm.rs

1//! RFC2274 - User-based Security Model (USM) for version 3 of the Simple Network Management Protocol (SNMPv3)
2
3use crate::parse_ber_octetstring_as_str;
4use asn1_rs::{Error, FromBer, Sequence};
5use nom::IResult;
6
7#[derive(Debug, PartialEq)]
8pub struct UsmSecurityParameters<'a> {
9    pub msg_authoritative_engine_id: &'a [u8],
10    pub msg_authoritative_engine_boots: u32,
11    pub msg_authoritative_engine_time: u32,
12    pub msg_user_name: String,
13    pub msg_authentication_parameters: &'a [u8],
14    pub msg_privacy_parameters: &'a [u8],
15}
16
17pub fn parse_usm_security_parameters(bytes: &[u8]) -> IResult<&[u8], UsmSecurityParameters, Error> {
18    Sequence::from_der_and_then(bytes, |i| {
19        let (i, msg_authoritative_engine_id) = <&[u8]>::from_ber(i)?;
20        let (i, msg_authoritative_engine_boots) = u32::from_ber(i)?;
21        let (i, msg_authoritative_engine_time) = u32::from_ber(i)?;
22        let (i, msg_user_name) = parse_ber_octetstring_as_str(i)?;
23        let (i, msg_authentication_parameters) = <&[u8]>::from_ber(i)?;
24        let (i, msg_privacy_parameters) = <&[u8]>::from_ber(i)?;
25        let usm = UsmSecurityParameters {
26            msg_authoritative_engine_id,
27            msg_authoritative_engine_boots,
28            msg_authoritative_engine_time,
29            msg_user_name: msg_user_name.to_string(),
30            msg_authentication_parameters,
31            msg_privacy_parameters,
32        };
33        Ok((i, usm))
34    })
35}