snmp_mp 0.1.0

SNMPv3 Message Processing
Documentation
use snmp_mp::{MsgProcessingResult, ObjectIdent, SnmpMsg, VarBind, VarValue};

#[test]
fn it_encodes_snmp_msg() {
    let security_params = [
        0x30, 0x3a, 0x04, 0x11, 0x80, 0x00, 0x1f, 0x88, 0x80, 0xfa, 0xa8, 0x11, 0x60, 0x0f, 0xa2,
        0xc5, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x04, 0x02, 0x03, 0x01, 0x1f, 0x27, 0x04,
        0x0d, 0x64, 0x61, 0x76, 0x69, 0x64, 0x64, 0x75, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x04,
        0x0c, 0x14, 0xdb, 0x5e, 0xec, 0xdd, 0x43, 0xb1, 0xc5, 0x1f, 0x7c, 0x42, 0xdf, 0x04, 0x00,
    ];

    let mut msg = SnmpMsg::new(837040343);
    msg.set_reportable_flag()
        .set_auth_flag()
        .set_security_params(&security_params);

    if let Some(scoped_pdu) = msg.scoped_pdu_data.plaintext_mut() {
        let oid = ObjectIdent::from_slice(&[0x01, 0x03, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00]);
        let var_bind = VarBind::with_value(oid, VarValue::Unspecified);
        let var_binds = vec![var_bind];

        let engine_id = [
            0x80, 0x00, 0x1F, 0x88, 0x80, 0xFA, 0xA8, 0x11, 0x60, 0x0F, 0xA2, 0xc5, 0x5E, 0x00,
            0x00, 0x00, 0x00,
        ];

        scoped_pdu
            .set_request_id(1918134953)
            .set_engine_id(&engine_id)
            .set_var_binds(var_binds);
    }

    let encoded_msg = msg.encode();
    let expected = vec![
        0x30, 0x81, 0x89, 0x02, 0x01, 0x03, 0x30, 0x11, 0x02, 0x04, 0x31, 0xE4, 0x38, 0xD7, 0x02,
        0x03, 0x00, 0xFF, 0xE3, 0x04, 0x01, 0x05, 0x02, 0x01, 0x03, 0x04, 0x3C, 0x30, 0x3A, 0x04,
        0x11, 0x80, 0x00, 0x1F, 0x88, 0x80, 0xFA, 0xA8, 0x11, 0x60, 0x0F, 0xA2, 0xC5, 0x5E, 0x00,
        0x00, 0x00, 0x00, 0x02, 0x01, 0x04, 0x02, 0x03, 0x01, 0x1F, 0x27, 0x04, 0x0D, 0x64, 0x61,
        0x76, 0x69, 0x64, 0x64, 0x75, 0x66, 0x72, 0x65, 0x73, 0x6E, 0x65, 0x04, 0x0C, 0x14, 0xDB,
        0x5E, 0xEC, 0xDD, 0x43, 0xB1, 0xC5, 0x1F, 0x7C, 0x42, 0xDF, 0x04, 0x00, 0x30, 0x33, 0x04,
        0x11, 0x80, 0x00, 0x1F, 0x88, 0x80, 0xFA, 0xA8, 0x11, 0x60, 0x0F, 0xA2, 0xC5, 0x5E, 0x00,
        0x00, 0x00, 0x00, 0x04, 0x00, 0xA0, 0x1C, 0x02, 0x04, 0x72, 0x54, 0x6A, 0xA9, 0x02, 0x01,
        0x00, 0x02, 0x01, 0x00, 0x30, 0x0E, 0x30, 0x0C, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x02, 0x01,
        0x01, 0x01, 0x00, 0x05, 0x00,
    ];

    assert_eq!(encoded_msg, expected);
}

#[test]
fn it_decodes_snmp_msg() -> MsgProcessingResult<()> {
    let encoded_msg = vec![
        0x30, 0x81, 0x89, 0x02, 0x01, 0x03, 0x30, 0x11, 0x02, 0x04, 0x31, 0xE4, 0x38, 0xD7, 0x02,
        0x03, 0x00, 0xFF, 0xE3, 0x04, 0x01, 0x05, 0x02, 0x01, 0x03, 0x04, 0x3C, 0x30, 0x3A, 0x04,
        0x11, 0x80, 0x00, 0x1F, 0x88, 0x80, 0xFA, 0xA8, 0x11, 0x60, 0x0F, 0xA2, 0xC5, 0x5E, 0x00,
        0x00, 0x00, 0x00, 0x02, 0x01, 0x04, 0x02, 0x03, 0x01, 0x1F, 0x27, 0x04, 0x0D, 0x64, 0x61,
        0x76, 0x69, 0x64, 0x64, 0x75, 0x66, 0x72, 0x65, 0x73, 0x6E, 0x65, 0x04, 0x0C, 0x14, 0xDB,
        0x5E, 0xEC, 0xDD, 0x43, 0xB1, 0xC5, 0x1F, 0x7C, 0x42, 0xDF, 0x04, 0x00, 0x30, 0x33, 0x04,
        0x11, 0x80, 0x00, 0x1F, 0x88, 0x80, 0xFA, 0xA8, 0x11, 0x60, 0x0F, 0xA2, 0xC5, 0x5E, 0x00,
        0x00, 0x00, 0x00, 0x04, 0x00, 0xA0, 0x1C, 0x02, 0x04, 0x72, 0x54, 0x6A, 0xA9, 0x02, 0x01,
        0x00, 0x02, 0x01, 0x00, 0x30, 0x0E, 0x30, 0x0C, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x02, 0x01,
        0x01, 0x01, 0x00, 0x05, 0x00,
    ];
    let msg = SnmpMsg::decode(&encoded_msg)?;

    assert_eq!(msg.id(), 837040343);
    assert!(msg.is_reportable());
    assert!(msg.is_auth());

    let security_params = [
        0x30, 0x3a, 0x04, 0x11, 0x80, 0x00, 0x1f, 0x88, 0x80, 0xfa, 0xa8, 0x11, 0x60, 0x0f, 0xa2,
        0xc5, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x04, 0x02, 0x03, 0x01, 0x1f, 0x27, 0x04,
        0x0d, 0x64, 0x61, 0x76, 0x69, 0x64, 0x64, 0x75, 0x66, 0x72, 0x65, 0x73, 0x6e, 0x65, 0x04,
        0x0c, 0x14, 0xdb, 0x5e, 0xec, 0xdd, 0x43, 0xb1, 0xc5, 0x1f, 0x7c, 0x42, 0xdf, 0x04, 0x00,
    ];
    assert_eq!(msg.security_params(), &security_params[..]);

    Ok(())
}