debug_validate_bug_on!(value == std::ptr::null_mut());
let mut ret_val = 0;
let mut ret_code = 0;
- let sa_type_s: Result<_,_>;
+ let sa_type_s: Result<_, _>;
- unsafe {
- sa_type_s = CStr::from_ptr(sa_type).to_str()
- }
+ unsafe { sa_type_s = CStr::from_ptr(sa_type).to_str() }
SCLogInfo!("{:#?}", sa_type_s);
if let Ok(sa) = sa_type_s {
if let Some(numeric_value) = attr.numeric_value {
ret_val = numeric_value;
ret_code = 1;
- break
+ break;
}
}
}
#[no_mangle]
pub unsafe extern "C" fn rs_ike_parse_request(
_flow: *const Flow, state: *mut std::os::raw::c_void, _pstate: *mut std::os::raw::c_void,
- stream_slice: StreamSlice,
- _data: *const std::os::raw::c_void,
+ stream_slice: StreamSlice, _data: *const std::os::raw::c_void,
) -> AppLayerResult {
let state = cast_pointer!(state, IKEState);
return state.handle_input(stream_slice.as_slice(), Direction::ToServer);
#[no_mangle]
pub unsafe extern "C" fn rs_ike_parse_response(
_flow: *const Flow, state: *mut std::os::raw::c_void, _pstate: *mut std::os::raw::c_void,
- stream_slice: StreamSlice,
- _data: *const std::os::raw::c_void,
+ stream_slice: StreamSlice, _data: *const std::os::raw::c_void,
) -> AppLayerResult {
let state = cast_pointer!(state, IKEState);
return state.handle_input(stream_slice.as_slice(), Direction::ToClient);
tx.logged.set(logged);
}
-static mut ALPROTO_IKE : AppProto = ALPROTO_UNKNOWN;
+static mut ALPROTO_IKE: AppProto = ALPROTO_UNKNOWN;
// Parser name as a C style string.
const PARSER_NAME: &'static [u8] = b"ike\0";
pub unsafe extern "C" fn rs_ike_register_parser() {
let default_port = CString::new("500").unwrap();
let parser = RustParser {
- name : PARSER_NAME.as_ptr() as *const std::os::raw::c_char,
- default_port : default_port.as_ptr(),
- ipproto : core::IPPROTO_UDP,
- probe_ts : Some(rs_ike_probing_parser),
- probe_tc : Some(rs_ike_probing_parser),
- min_depth : 0,
- max_depth : 16,
- state_new : rs_ike_state_new,
- state_free : rs_ike_state_free,
- tx_free : rs_ike_state_tx_free,
- parse_ts : rs_ike_parse_request,
- parse_tc : rs_ike_parse_response,
- get_tx_count : rs_ike_state_get_tx_count,
- get_tx : rs_ike_state_get_tx,
- tx_comp_st_ts : 1,
- tx_comp_st_tc : 1,
- tx_get_progress : rs_ike_tx_get_alstate_progress,
- get_eventinfo : Some(IkeEvent::get_event_info),
- get_eventinfo_byid : Some(IkeEvent::get_event_info_by_id),
- localstorage_new : None,
- localstorage_free : None,
- get_files : None,
- get_tx_iterator : Some(applayer::state_get_tx_iterator::<IKEState, IKETransaction>),
- get_tx_data : rs_ike_get_tx_data,
- apply_tx_config : None,
- flags : APP_LAYER_PARSER_OPT_UNIDIR_TXS,
- truncate : None,
+ name: PARSER_NAME.as_ptr() as *const std::os::raw::c_char,
+ default_port: default_port.as_ptr(),
+ ipproto: core::IPPROTO_UDP,
+ probe_ts: Some(rs_ike_probing_parser),
+ probe_tc: Some(rs_ike_probing_parser),
+ min_depth: 0,
+ max_depth: 16,
+ state_new: rs_ike_state_new,
+ state_free: rs_ike_state_free,
+ tx_free: rs_ike_state_tx_free,
+ parse_ts: rs_ike_parse_request,
+ parse_tc: rs_ike_parse_response,
+ get_tx_count: rs_ike_state_get_tx_count,
+ get_tx: rs_ike_state_get_tx,
+ tx_comp_st_ts: 1,
+ tx_comp_st_tc: 1,
+ tx_get_progress: rs_ike_tx_get_alstate_progress,
+ get_eventinfo: Some(IkeEvent::get_event_info),
+ get_eventinfo_byid: Some(IkeEvent::get_event_info_by_id),
+ localstorage_new: None,
+ localstorage_free: None,
+ get_files: None,
+ get_tx_iterator: Some(applayer::state_get_tx_iterator::<IKEState, IKETransaction>),
+ get_tx_data: rs_ike_get_tx_data,
+ apply_tx_config: None,
+ flags: APP_LAYER_PARSER_OPT_UNIDIR_TXS,
+ truncate: None,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
};
use super::ipsec_parser::IKEV2_FLAG_INITIATOR;
use crate::ike::parser::{ExchangeType, IsakmpPayloadType, SaAttribute};
use crate::jsonbuilder::{JsonBuilder, JsonError};
+use num_traits::FromPrimitive;
use std;
use std::convert::TryFrom;
-use num_traits::FromPrimitive;
const LOG_EXTENDED: u32 = 0x01;
let (i, flags) = be_u8(i)?;
let (i, msg_id) = be_u32(i)?;
let (i, length) = be_u32(i)?;
- let hdr =
- IsakmpHeader {
- init_spi,
- resp_spi,
- next_payload,
- maj_ver: vers.0,
- min_ver: vers.1,
- exch_type,
- flags,
- msg_id,
- length,
- };
+ let hdr = IsakmpHeader {
+ init_spi,
+ resp_spi,
+ next_payload,
+ maj_ver: vers.0,
+ min_ver: vers.1,
+ exch_type,
+ flags,
+ msg_id,
+ length,
+ };
Ok((i, hdr))
}
let start_i = i;
let (i, domain_of_interpretation) = be_u32(i)?;
let (i, situation) = cond(domain_of_interpretation == 1, take(4_usize))(i)?;
- let (i, data) = cond(
- domain_of_interpretation == 1 && start_i.len() >= 8,
- |b| take(start_i.len() - 8)(b)
- )(i)?;
- Ok((i, SecurityAssociationPayload {
- domain_of_interpretation,
- situation,
- data
- }))
+ let (i, data) = cond(domain_of_interpretation == 1 && start_i.len() >= 8, |b| {
+ take(start_i.len() - 8)(b)
+ })(i)?;
+ Ok((
+ i,
+ SecurityAssociationPayload {
+ domain_of_interpretation,
+ situation,
+ data,
+ },
+ ))
}
pub fn parse_key_exchange(i: &[u8], length: u16) -> IResult<&[u8], KeyExchangePayload> {
let (i, spi_size) = be_u8(i)?;
let (i, number_transforms) = be_u8(i)?;
let (i, spi) = take(spi_size as usize)(i)?;
- let (i, payload_data) = cond(
- (start_i.len() - 4) >= spi_size.into(),
- |b| take((start_i.len() - 4) - spi_size as usize)(b)
- )(i)?;
+ let (i, payload_data) = cond((start_i.len() - 4) >= spi_size.into(), |b| {
+ take((start_i.len() - 4) - spi_size as usize)(b)
+ })(i)?;
let payload = ProposalPayload {
proposal_number,
proposal_type,
let (i, transform_type) = be_u8(i)?;
let (i, _) = be_u16(i)?;
let (i, payload_data) = cond(length >= 4, |b| take(length - 4)(b))(i)?;
- Ok((i, TransformPayload {
- transform_number,
- transform_type,
- sa_attributes: payload_data.unwrap_or_default(),
- }))
+ Ok((
+ i,
+ TransformPayload {
+ transform_number,
+ transform_type,
+ sa_attributes: payload_data.unwrap_or_default(),
+ },
+ ))
}
pub fn parse_vendor_id(i: &[u8], length: u16) -> IResult<&[u8], VendorPayload> {
pub fn parse_sa_attribute(i: &[u8]) -> IResult<&[u8], Vec<SaAttribute>> {
fn parse_attribute(i: &[u8]) -> IResult<&[u8], SaAttribute> {
let (i, b) = be_u16(i)?;
- let format = (
- (b >> 15) as u8,
- b & 0x7f_ff
- );
+ let format = ((b >> 15) as u8, b & 0x7f_ff);
let (i, attribute_length_or_value) = be_u16(i)?; // depends on format bit) = 1 -> value | 0 -> number of following bytes
- let (i, numeric_variable_value) = cond(format.0 == 0 && attribute_length_or_value == 4, be_u32) (i)?; // interpret as number
- let (i, variable_attribute_value) = cond(format.0 == 0 && attribute_length_or_value != 4, take(attribute_length_or_value))(i)?;
+ let (i, numeric_variable_value) =
+ cond(format.0 == 0 && attribute_length_or_value == 4, be_u32)(i)?; // interpret as number
+ let (i, variable_attribute_value) = cond(
+ format.0 == 0 && attribute_length_or_value != 4,
+ take(attribute_length_or_value),
+ )(i)?;
let attr = SaAttribute {
attribute_format: format.0,
attribute_type: get_attribute_type(format.1),
- attribute_value : match format.1 {
+ attribute_value: match format.1 {
1 => get_encryption_algorithm(attribute_length_or_value),
2 => get_hash_algorithm(attribute_length_or_value),
3 => get_authentication_method(attribute_length_or_value),
11 => match attribute_length_or_value {
1 => AttributeValue::LifeTypeSeconds,
2 => AttributeValue::LifeTypeKilobytes,
- _ => AttributeValue::Unknown
- }
- _ => AttributeValue::Unknown
+ _ => AttributeValue::Unknown,
+ },
+ _ => AttributeValue::Unknown,
},
numeric_value: match format.0 {
1 => Some(attribute_length_or_value as u32),
- 0 => {
- numeric_variable_value
- },
+ 0 => numeric_variable_value,
_ => None,
},
hex_value: match format.0 {
- 0 => {
- variable_attribute_value.map(|_variable_attribute_value| to_hex(_variable_attribute_value))
- }
+ 0 => variable_attribute_value
+ .map(|_variable_attribute_value| to_hex(_variable_attribute_value)),
_ => None,
- }
+ },
};
Ok((i, attr))
}
let (i, reserved) = be_u8(i)?;
let (i, payload_length) = be_u16(i)?;
let (i, payload_data) = cond(payload_length >= 4, |b| take(payload_length - 4)(b))(i)?;
- Ok((i, IsakmpPayload {
- payload_header: IsakmpPayloadHeader {
- next_payload,
- reserved,
- payload_length
+ Ok((
+ i,
+ IsakmpPayload {
+ payload_header: IsakmpPayloadHeader {
+ next_payload,
+ reserved,
+ payload_length,
+ },
+ data: payload_data.unwrap_or_default(),
},
- data: payload_data.unwrap_or_default(),
- }))
+ ))
}
many0(complete(parse_payload))(i)
}