1use crate::ikev2::IkeV2Header;
2use crate::ikev2_parser::parse_ikev2_header;
3use nom::bytes::streaming::take;
4use nom::combinator::rest;
5use nom::number::streaming::be_u32;
6use nom::IResult;
7
8#[derive(Debug)]
12pub struct ESPHeader<'a> {
13 pub spi_index: &'a [u8],
14 pub seq: u32,
15 pub data: &'a [u8],
16}
17
18#[derive(Debug)]
22pub enum ESPData<'a> {
23 ESP(ESPHeader<'a>),
24 IKE(IkeV2Header),
25}
26
27pub fn parse_esp_encapsulated(i: &[u8]) -> IResult<&[u8], ESPData> {
35 if be_u32(i)?.1 == 0 {
36 parse_ikev2_header(i).map(|x| (x.0, ESPData::IKE(x.1)))
37 } else {
38 parse_esp_header(i).map(|x| (x.0, ESPData::ESP(x.1)))
39 }
40}
41
42pub fn parse_esp_header(i: &[u8]) -> IResult<&[u8], ESPHeader> {
52 let (i, spi_index) = take(4usize)(i)?;
53 let (i, seq) = be_u32(i)?;
54 let (i, data) = rest(i)?;
55 let hdr = ESPHeader {
56 spi_index,
57 seq,
58 data,
59 };
60 Ok((i, hdr))
61}