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