1use 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}