use nom;
use nom::IResult;
use nom::error::{ErrorKind, ParseError};
-use nom::number::streaming::le_u16;
+use nom::number::complete::le_u16;
use der_parser;
use der_parser::error::BerError;
use der_parser::der::parse_der_oid;
pub enum SecBlobError {
NotSpNego,
KrbFmtError,
+ KrbReqError,
Ber(BerError),
NomError(ErrorKind),
}
let blob = b.as_slice().or(
Err(nom::Err::Error(SecBlobError::KrbFmtError))
)?;
- do_parse!(
- blob,
- _base_o: parse_der_oid >>
- _tok_id: le_u16 >>
- ap_req: parse_ap_req >>
- ({
- SCLogDebug!("parse_kerberos5_request: base_o {:?}", _base_o.as_oid());
- SCLogDebug!("parse_kerberos5_request: tok_id {}", _tok_id);
- ap_req
- })
- )
- .map_err(nom::Err::convert)
+ let (blob, _) = parse_der_oid(blob).map_err(nom::Err::convert)?;
+ let (blob, _) = le_u16(blob)?;
+ // Should be parse_ap_req(blob).map_err(nom::Err::convert)
+ // But upgraded kerberos parser uses a newer der_parser crate
+ // Hence the enum `der_parser::error::BerError` are different
+ // and we cannot convert to SecBlobError with the From impl
+ // Next is to upgrade the der_parser crate (and nom to nom7 by the way)
+ match parse_ap_req(blob) {
+ Ok((blob, ap_req)) => Ok((blob, ap_req)),
+ _ => Err(nom::Err::Error(SecBlobError::KrbReqError)),
+ }
}
pub fn parse_kerberos5_request(blob: &[u8]) -> IResult<&[u8], Kerberos5Ticket, SecBlobError>