diff options
Diffstat (limited to 'rust/vendor/snmp-parser/src/usm.rs')
-rw-r--r-- | rust/vendor/snmp-parser/src/usm.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/rust/vendor/snmp-parser/src/usm.rs b/rust/vendor/snmp-parser/src/usm.rs new file mode 100644 index 0000000..ecdbcad --- /dev/null +++ b/rust/vendor/snmp-parser/src/usm.rs @@ -0,0 +1,35 @@ +//! RFC2274 - User-based Security Model (USM) for version 3 of the Simple Network Management Protocol (SNMPv3) + +use crate::parse_ber_octetstring_as_str; +use asn1_rs::{Error, FromBer, Sequence}; +use nom::IResult; + +#[derive(Debug, PartialEq)] +pub struct UsmSecurityParameters<'a> { + pub msg_authoritative_engine_id: &'a [u8], + pub msg_authoritative_engine_boots: u32, + pub msg_authoritative_engine_time: u32, + pub msg_user_name: String, + pub msg_authentication_parameters: &'a [u8], + pub msg_privacy_parameters: &'a [u8], +} + +pub fn parse_usm_security_parameters(bytes: &[u8]) -> IResult<&[u8], UsmSecurityParameters, Error> { + Sequence::from_der_and_then(bytes, |i| { + let (i, msg_authoritative_engine_id) = <&[u8]>::from_ber(i)?; + let (i, msg_authoritative_engine_boots) = u32::from_ber(i)?; + let (i, msg_authoritative_engine_time) = u32::from_ber(i)?; + let (i, msg_user_name) = parse_ber_octetstring_as_str(i)?; + let (i, msg_authentication_parameters) = <&[u8]>::from_ber(i)?; + let (i, msg_privacy_parameters) = <&[u8]>::from_ber(i)?; + let usm = UsmSecurityParameters { + msg_authoritative_engine_id, + msg_authoritative_engine_boots, + msg_authoritative_engine_time, + msg_user_name: msg_user_name.to_string(), + msg_authentication_parameters, + msg_privacy_parameters, + }; + Ok((i, usm)) + }) +} |