Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
matrix:
rust:
- stable
- 1.46.0
- 1.63.0
- nightly
steps:
- uses: actions/checkout@v2
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ authors = ["Pierre Chifflier <chifflier@wzdftpd.net>"]
categories = ["parser-implementations"]
readme = "README.md"
edition = "2018"
rust-version = "1.63"

include = [
"LICENSE-*",
Expand Down
4 changes: 2 additions & 2 deletions src/esp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub enum ESPData<'a> {
/// Any other value indicates an ESP header.
///
/// *Note: input is entirely consumed*
pub fn parse_esp_encapsulated(i: &[u8]) -> IResult<&[u8], ESPData> {
pub fn parse_esp_encapsulated(i: &[u8]) -> IResult<&[u8], ESPData<'_>> {
if be_u32(i)?.1 == 0 {
parse_ikev2_header(i).map(|x| (x.0, ESPData::IKE(x.1)))
} else {
Expand All @@ -48,7 +48,7 @@ pub fn parse_esp_encapsulated(i: &[u8]) -> IResult<&[u8], ESPData> {
/// - the payload data (which can be encrypted)
///
/// *Note: input is entirely consumed*
pub fn parse_esp_header(i: &[u8]) -> IResult<&[u8], ESPHeader> {
pub fn parse_esp_header(i: &[u8]) -> IResult<&[u8], ESPHeader<'_>> {
let (i, spi_index) = take(4usize)(i)?;
let (i, seq) = be_u32(i)?;
let (i, data) = rest(i)?;
Expand Down
74 changes: 47 additions & 27 deletions src/ikev2_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ fn bits_split_1(i: &[u8]) -> IResult<&[u8], (u8, u8)> {
Ok((i, (b1, b2_7)))
}

pub fn parse_ikev2_payload_generic(i: &[u8]) -> IResult<&[u8], IkeV2GenericPayload> {
pub fn parse_ikev2_payload_generic(i: &[u8]) -> IResult<&[u8], IkeV2GenericPayload<'_>> {
let (i, next_payload_type) = map(be_u8, IkePayloadType)(i)?;
let (i, b) = bits_split_1(i)?;
let (i, payload_length) = verify(be_u16, |&n| n >= 4)(i)?;
Expand All @@ -60,7 +60,7 @@ pub fn parse_ikev2_payload_generic(i: &[u8]) -> IResult<&[u8], IkeV2GenericPaylo
Ok((i, payload))
}

pub fn parse_ikev2_transform(i: &[u8]) -> IResult<&[u8], IkeV2RawTransform> {
pub fn parse_ikev2_transform(i: &[u8]) -> IResult<&[u8], IkeV2RawTransform<'_>> {
let (i, last) = be_u8(i)?;
let (i, reserved1) = be_u8(i)?;
let (i, transform_length) = be_u16(i)?;
Expand All @@ -82,7 +82,7 @@ pub fn parse_ikev2_transform(i: &[u8]) -> IResult<&[u8], IkeV2RawTransform> {
Ok((i, transform))
}

pub fn parse_ikev2_proposal(i: &[u8]) -> IResult<&[u8], IkeV2Proposal> {
pub fn parse_ikev2_proposal(i: &[u8]) -> IResult<&[u8], IkeV2Proposal<'_>> {
if i.len() < 8 {
return Err(Err::Incomplete(Needed::new(8)));
}
Expand Down Expand Up @@ -115,14 +115,14 @@ pub fn parse_ikev2_proposal(i: &[u8]) -> IResult<&[u8], IkeV2Proposal> {
Ok((i, proposal))
}

pub fn parse_ikev2_payload_sa(i: &[u8], _length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_sa(i: &[u8], _length: u16) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
map(
many1(complete(parse_ikev2_proposal)),
IkeV2PayloadContent::SA,
)(i)
}

pub fn parse_ikev2_payload_kex(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_kex(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -140,7 +140,7 @@ pub fn parse_ikev2_payload_kex(i: &[u8], length: u16) -> IResult<&[u8], IkeV2Pay
pub fn parse_ikev2_payload_ident_init(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -160,7 +160,7 @@ pub fn parse_ikev2_payload_ident_init(
pub fn parse_ikev2_payload_ident_resp(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -180,7 +180,7 @@ pub fn parse_ikev2_payload_ident_resp(
pub fn parse_ikev2_payload_certificate(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 1 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -196,7 +196,7 @@ pub fn parse_ikev2_payload_certificate(
pub fn parse_ikev2_payload_certificate_request(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 1 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -212,7 +212,7 @@ pub fn parse_ikev2_payload_certificate_request(
pub fn parse_ikev2_payload_authentication(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -229,12 +229,15 @@ pub fn parse_ikev2_payload_authentication(
Ok((i, IkeV2PayloadContent::Authentication(payload)))
}

pub fn parse_ikev2_payload_nonce(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_nonce(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
let (i, nonce_data) = take(length)(i)?;
Ok((i, IkeV2PayloadContent::Nonce(NoncePayload { nonce_data })))
}

pub fn parse_ikev2_payload_notify(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_notify(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
let (i, protocol_id) = map(be_u8, ProtocolID)(i)?;
let (i, spi_size) = be_u8(i)?;
let (i, notify_type) = map(be_u16, NotifyType)(i)?;
Expand All @@ -255,7 +258,10 @@ pub fn parse_ikev2_payload_notify(i: &[u8], length: u16) -> IResult<&[u8], IkeV2
Ok((i, IkeV2PayloadContent::Notify(payload)))
}

pub fn parse_ikev2_payload_vendor_id(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_vendor_id(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 1 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -266,7 +272,10 @@ pub fn parse_ikev2_payload_vendor_id(i: &[u8], length: u16) -> IResult<&[u8], Ik
))
}

pub fn parse_ikev2_payload_delete(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_delete(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -287,11 +296,11 @@ fn parse_ts_addr(i: &[u8], t: TSType) -> IResult<&[u8], &[u8]> {
match t {
TSType::IPv4AddrRange => take(4usize)(i),
TSType::IPv6AddrRange => take(16usize)(i),
_ => Err(nom::Err::Error(make_error(i, ErrorKind::Switch))),
_ => Err(Err::Error(make_error(i, ErrorKind::Switch))),
}
}

fn parse_ikev2_ts(i: &[u8]) -> IResult<&[u8], TrafficSelector> {
fn parse_ikev2_ts(i: &[u8]) -> IResult<&[u8], TrafficSelector<'_>> {
let (i, ts_type) = map(be_u8, TSType)(i)?;
let (i, ip_proto_id) = be_u8(i)?;
let (i, sel_length) = be_u16(i)?;
Expand All @@ -311,7 +320,7 @@ fn parse_ikev2_ts(i: &[u8]) -> IResult<&[u8], TrafficSelector> {
Ok((i, ts))
}

pub fn parse_ikev2_payload_ts(i: &[u8], length: u16) -> IResult<&[u8], TrafficSelectorPayload> {
pub fn parse_ikev2_payload_ts(i: &[u8], length: u16) -> IResult<&[u8], TrafficSelectorPayload<'_>> {
if length < 4 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
}
Expand All @@ -326,27 +335,39 @@ pub fn parse_ikev2_payload_ts(i: &[u8], length: u16) -> IResult<&[u8], TrafficSe
Ok((i, payload))
}

pub fn parse_ikev2_payload_ts_init(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_ts_init(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
map(
|d| parse_ikev2_payload_ts(d, length),
IkeV2PayloadContent::TSi,
)(i)
}

pub fn parse_ikev2_payload_ts_resp(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_ts_resp(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
map(
|d| parse_ikev2_payload_ts(d, length),
IkeV2PayloadContent::TSr,
)(i)
}

pub fn parse_ikev2_payload_encrypted(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_encrypted(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
map(take(length), |d| {
IkeV2PayloadContent::Encrypted(EncryptedPayload(d))
})(i)
}

pub fn parse_ikev2_payload_unknown(i: &[u8], length: u16) -> IResult<&[u8], IkeV2PayloadContent> {
pub fn parse_ikev2_payload_unknown(
i: &[u8],
length: u16,
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
map(take(length), IkeV2PayloadContent::Unknown)(i)
}

Expand All @@ -355,7 +376,7 @@ pub fn parse_ikev2_payload_with_type(
i: &[u8],
length: u16,
next_payload_type: IkePayloadType,
) -> IResult<&[u8], IkeV2PayloadContent> {
) -> IResult<&[u8], IkeV2PayloadContent<'_>> {
let f = match next_payload_type {
// IkePayloadType::NoNextPayload => parse_ikev2_payload_unknown, // XXX ?
IkePayloadType::SecurityAssociation => parse_ikev2_payload_sa,
Expand Down Expand Up @@ -406,15 +427,15 @@ fn parse_ikev2_payload_list_fold<'a>(
v.push(payload);
Ok(v)
}
Err(nom::Err::Error(e)) | Err(nom::Err::Failure(e)) => Err(IPsecError::NomError(e.code)),
Err(nom::Err::Incomplete(_)) => Err(IPsecError::NomError(ErrorKind::Complete)),
Err(Err::Error(e)) | Err(Err::Failure(e)) => Err(IPsecError::NomError(e.code)),
Err(Err::Incomplete(_)) => Err(IPsecError::NomError(ErrorKind::Complete)),
}
}

pub fn parse_ikev2_payload_list(
i: &[u8],
initial_type: IkePayloadType,
) -> IResult<&[u8], Result<Vec<IkeV2Payload>, IPsecError>> {
) -> IResult<&[u8], Result<Vec<IkeV2Payload<'_>>, IPsecError>> {
// XXX fold manually, because fold_many1 requires accumulator to have Clone, and we don't want
// XXX to implement that for IkeV2Payload
let mut acc = Ok(vec![IkeV2Payload {
Expand All @@ -426,7 +447,6 @@ pub fn parse_ikev2_payload_list(
},
content: IkeV2PayloadContent::Dummy,
}]);
#[allow(suspicious_double_ref_op)]
let mut i = i;
loop {
if i.is_empty() {
Expand All @@ -449,7 +469,7 @@ pub fn parse_ikev2_payload_list(
#[allow(clippy::type_complexity)]
pub fn parse_ikev2_message(
i: &[u8],
) -> IResult<&[u8], (IkeV2Header, Result<Vec<IkeV2Payload>, IPsecError>)> {
) -> IResult<&[u8], (IkeV2Header, Result<Vec<IkeV2Payload<'_>>, IPsecError>)> {
let (i, hdr) = parse_ikev2_header(i)?;
if hdr.length < 28 {
return Err(Err::Error(make_error(i, ErrorKind::Verify)));
Expand Down
1 change: 0 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ mod ikev2_transforms;
pub use error::*;
pub use esp::*;
pub use ikev2::*;
pub use ikev2_debug::*;
pub use ikev2_notify::*;
pub use ikev2_parser::*;
pub use ikev2_transforms::*;
Expand Down
Loading