Skip to content

Commit 6a03974

Browse files
committed
rust/smb: convert to nom 8
1 parent 54de6e4 commit 6a03974

12 files changed

Lines changed: 617 additions & 539 deletions

File tree

rust/src/smb/auth.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ use crate::kerberos::*;
2020
use crate::smb::ntlmssp_records::*;
2121
use crate::smb::smb::*;
2222

23-
use nom7::{Err, IResult};
23+
use nom8::{Err, IResult};
2424
use der_parser::ber::BerObjectContent;
2525
use der_parser::der::{parse_der_oid, parse_der_sequence};
2626

2727
fn parse_secblob_get_spnego(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError>
2828
{
29-
let (rem, base_o) = der_parser::parse_der(blob).map_err(Err::convert)?;
29+
let (rem, base_o) = der_parser::parse_der(blob).map_err(|_| Err::Error(SecBlobError::NotSpNego))?;
3030
SCLogDebug!("parse_secblob_get_spnego: base_o {:?}", base_o);
3131
let d = match base_o.content.as_slice() {
3232
Err(_) => { return Err(Err::Error(SecBlobError::NotSpNego)); },
3333
Ok(d) => d,
3434
};
35-
let (next, o) = parse_der_oid(d).map_err(Err::convert)?;
35+
let (next, o) = parse_der_oid(d).map_err(|_| Err::Error(SecBlobError::NotSpNego))?;
3636
SCLogDebug!("parse_secblob_get_spnego: sub_o {:?}", o);
3737

3838
let oid = match o.content.as_oid() {
@@ -59,7 +59,7 @@ fn parse_secblob_get_spnego(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError>
5959

6060
fn parse_secblob_spnego_start(blob: &[u8]) -> IResult<&[u8], &[u8], SecBlobError>
6161
{
62-
let (rem, o) = der_parser::parse_der(blob).map_err(Err::convert)?;
62+
let (rem, o) = der_parser::parse_der(blob).map_err(|_| Err::Error(SecBlobError::NotSpNego))?;
6363
let d = match o.content.as_slice() {
6464
Ok(d) => {
6565
SCLogDebug!("d: next data len {}",d.len());

rust/src/smb/dcerpc_records.rs

Lines changed: 77 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@
1515
* 02110-1301, USA.
1616
*/
1717

18-
use crate::common::nom7::bits;
18+
use nom8::bits::bits;
1919
use crate::smb::error::SmbError;
20-
use nom7::bits::streaming::take as take_bits;
21-
use nom7::bytes::streaming::take;
22-
use nom7::combinator::{cond, rest};
23-
use nom7::multi::count;
24-
use nom7::number::Endianness;
25-
use nom7::number::streaming::{be_u16, le_u8, le_u16, le_u32, u16, u32};
26-
use nom7::sequence::tuple;
27-
use nom7::{Err, IResult};
20+
use nom8::bits::streaming::take as take_bits;
21+
use nom8::bytes::streaming::take;
22+
use nom8::combinator::{cond, rest};
23+
use nom8::multi::count;
24+
use nom8::number::Endianness;
25+
use nom8::number::streaming::{be_u16, le_u8, le_u16, le_u32, u16, u32};
26+
use nom8::{Err, IResult};
2827

2928
#[derive(Debug,PartialEq, Eq)]
3029
pub struct DceRpcResponseRecord<'a> {
@@ -36,11 +35,12 @@ pub struct DceRpcResponseRecord<'a> {
3635
pub fn parse_dcerpc_response_record(i:&[u8], frag_len: u16 )
3736
-> IResult<&[u8], DceRpcResponseRecord<'_>, SmbError>
3837
{
38+
use nom8::Parser;
3939
if frag_len < 24 {
4040
return Err(Err::Error(SmbError::RecordTooSmall));
4141
}
42-
let (i, _) = take(8_usize)(i)?;
43-
let (i, data) = take(frag_len - 24)(i)?;
42+
let (i, _) = take(8_usize).parse(i)?;
43+
let (i, data) = take(frag_len - 24).parse(i)?;
4444
let record = DceRpcResponseRecord { data };
4545
Ok((i, record))
4646
}
@@ -57,14 +57,15 @@ pub struct DceRpcRequestRecord<'a> {
5757
pub fn parse_dcerpc_request_record(i:&[u8], frag_len: u16, little: bool)
5858
-> IResult<&[u8], DceRpcRequestRecord<'_>, SmbError>
5959
{
60+
use nom8::Parser;
6061
if frag_len < 24 {
6162
return Err(Err::Error(SmbError::RecordTooSmall));
6263
}
63-
let (i, _) = take(4_usize)(i)?;
64+
let (i, _) = take(4_usize).parse(i)?;
6465
let endian = if little { Endianness::Little } else { Endianness::Big };
65-
let (i, context_id) = u16(endian)(i)?;
66-
let (i, opnum) = u16(endian)(i)?;
67-
let (i, data) = take(frag_len - 24)(i)?;
66+
let (i, context_id) = u16(endian).parse(i)?;
67+
let (i, opnum) = u16(endian).parse(i)?;
68+
let (i, data) = take(frag_len - 24).parse(i)?;
6869
let record = DceRpcRequestRecord { opnum, context_id, data };
6970
Ok((i, record))
7071
}
@@ -77,13 +78,14 @@ pub struct DceRpcBindIface<'a> {
7778
}
7879

7980
pub fn parse_dcerpc_bind_iface(i: &[u8]) -> IResult<&[u8], DceRpcBindIface<'_>> {
80-
let (i, _ctx_id) = le_u16(i)?;
81-
let (i, _num_trans_items) = le_u8(i)?;
82-
let (i, _) = take(1_usize)(i)?; // reserved
83-
let (i, interface) = take(16_usize)(i)?;
84-
let (i, ver) = le_u16(i)?;
85-
let (i, ver_min) = le_u16(i)?;
86-
let (i, _) = take(20_usize)(i)?;
81+
use nom8::Parser;
82+
let (i, _ctx_id) = le_u16.parse(i)?;
83+
let (i, _num_trans_items) = le_u8.parse(i)?;
84+
let (i, _) = take(1_usize).parse(i)?; // reserved
85+
let (i, interface) = take(16_usize).parse(i)?;
86+
let (i, ver) = le_u16.parse(i)?;
87+
let (i, ver_min) = le_u16.parse(i)?;
88+
let (i, _) = take(20_usize).parse(i)?;
8789
let res = DceRpcBindIface {
8890
iface:interface,
8991
ver,
@@ -93,13 +95,14 @@ pub fn parse_dcerpc_bind_iface(i: &[u8]) -> IResult<&[u8], DceRpcBindIface<'_>>
9395
}
9496

9597
pub fn parse_dcerpc_bind_iface_big(i: &[u8]) -> IResult<&[u8], DceRpcBindIface<'_>> {
96-
let (i, _ctx_id) = le_u16(i)?;
97-
let (i, _num_trans_items) = le_u8(i)?;
98-
let (i, _) = take(1_usize)(i)?; // reserved
99-
let (i, interface) = take(16_usize)(i)?;
100-
let (i, ver_min) = be_u16(i)?;
101-
let (i, ver) = be_u16(i)?;
102-
let (i, _) = take(20_usize)(i)?;
98+
use nom8::Parser;
99+
let (i, _ctx_id) = le_u16.parse(i)?;
100+
let (i, _num_trans_items) = le_u8.parse(i)?;
101+
let (i, _) = take(1_usize).parse(i)?; // reserved
102+
let (i, interface) = take(16_usize).parse(i)?;
103+
let (i, ver_min) = be_u16.parse(i)?;
104+
let (i, ver) = be_u16.parse(i)?;
105+
let (i, _) = take(20_usize).parse(i)?;
103106
let res = DceRpcBindIface {
104107
iface:interface,
105108
ver,
@@ -115,12 +118,13 @@ pub struct DceRpcBindRecord<'a> {
115118
}
116119

117120
pub fn parse_dcerpc_bind_record(i: &[u8]) -> IResult<&[u8], DceRpcBindRecord<'_>> {
118-
let (i, _max_xmit_frag) = le_u16(i)?;
119-
let (i, _max_recv_frag) = le_u16(i)?;
120-
let (i, _assoc_group) = take(4_usize)(i)?;
121-
let (i, num_ctx_items) = le_u8(i)?;
122-
let (i, _) = take(3_usize)(i)?; // reserved
123-
let (i, ifaces) = count(parse_dcerpc_bind_iface, num_ctx_items as usize)(i)?;
121+
use nom8::Parser;
122+
let (i, _max_xmit_frag) = le_u16.parse(i)?;
123+
let (i, _max_recv_frag) = le_u16.parse(i)?;
124+
let (i, _assoc_group) = take(4_usize).parse(i)?;
125+
let (i, num_ctx_items) = le_u8.parse(i)?;
126+
let (i, _) = take(3_usize).parse(i)?; // reserved
127+
let (i, ifaces) = count(parse_dcerpc_bind_iface, num_ctx_items as usize).parse(i)?;
124128
let record = DceRpcBindRecord {
125129
num_ctx_items,
126130
ifaces,
@@ -129,12 +133,13 @@ pub fn parse_dcerpc_bind_record(i: &[u8]) -> IResult<&[u8], DceRpcBindRecord<'_>
129133
}
130134

131135
pub fn parse_dcerpc_bind_record_big(i: &[u8]) -> IResult<&[u8], DceRpcBindRecord<'_>> {
132-
let (i, _max_xmit_frag) = be_u16(i)?;
133-
let (i, _max_recv_frag) = be_u16(i)?;
134-
let (i, _assoc_group) = take(4_usize)(i)?;
135-
let (i, num_ctx_items) = le_u8(i)?;
136-
let (i, _) = take(3_usize)(i)?; // reserved
137-
let (i, ifaces) = count(parse_dcerpc_bind_iface_big, num_ctx_items as usize)(i)?;
136+
use nom8::Parser;
137+
let (i, _max_xmit_frag) = be_u16.parse(i)?;
138+
let (i, _max_recv_frag) = be_u16.parse(i)?;
139+
let (i, _assoc_group) = take(4_usize).parse(i)?;
140+
let (i, num_ctx_items) = le_u8.parse(i)?;
141+
let (i, _) = take(3_usize).parse(i)?; // reserved
142+
let (i, ifaces) = count(parse_dcerpc_bind_iface_big, num_ctx_items as usize).parse(i)?;
138143
let record = DceRpcBindRecord {
139144
num_ctx_items,
140145
ifaces,
@@ -151,10 +156,11 @@ pub struct DceRpcBindAckResult<'a> {
151156
}
152157

153158
pub fn parse_dcerpc_bindack_result(i: &[u8]) -> IResult<&[u8], DceRpcBindAckResult<'_>> {
154-
let (i, ack_result) = le_u16(i)?;
155-
let (i, ack_reason) = le_u16(i)?;
156-
let (i, transfer_syntax) = take(16_usize)(i)?;
157-
let (i, syntax_version) = le_u32(i)?;
159+
use nom8::Parser;
160+
let (i, ack_result) = le_u16.parse(i)?;
161+
let (i, ack_reason) = le_u16.parse(i)?;
162+
let (i, transfer_syntax) = take(16_usize).parse(i)?;
163+
let (i, syntax_version) = le_u32.parse(i)?;
158164
let res = DceRpcBindAckResult {
159165
ack_result,
160166
ack_reason,
@@ -171,16 +177,17 @@ pub struct DceRpcBindAckRecord<'a> {
171177
}
172178

173179
pub fn parse_dcerpc_bindack_record(i: &[u8]) -> IResult<&[u8], DceRpcBindAckRecord<'_>> {
174-
let (i, _max_xmit_frag) = le_u16(i)?;
175-
let (i, _max_recv_frag) = le_u16(i)?;
176-
let (i, _assoc_group) = take(4_usize)(i)?;
177-
let (i, sec_addr_len) = le_u16(i)?;
178-
let (i, _) = take(sec_addr_len)(i)?;
180+
use nom8::Parser;
181+
let (i, _max_xmit_frag) = le_u16.parse(i)?;
182+
let (i, _max_recv_frag) = le_u16.parse(i)?;
183+
let (i, _assoc_group) = take(4_usize).parse(i)?;
184+
let (i, sec_addr_len) = le_u16.parse(i)?;
185+
let (i, _) = take(sec_addr_len).parse(i)?;
179186
let topad = sec_addr_len.wrapping_add(2) % 4;
180-
let (i, _) = cond(topad != 0, take(4 - topad))(i)?;
181-
let (i, num_results) = le_u8(i)?;
182-
let (i, _) = take(3_usize)(i)?; // padding
183-
let (i, results) = count(parse_dcerpc_bindack_result, num_results as usize)(i)?;
187+
let (i, _) = cond(topad != 0, take(4 - topad)).parse(i)?;
188+
let (i, num_results) = le_u8.parse(i)?;
189+
let (i, _) = take(3_usize).parse(i)?; // padding
190+
let (i, results) = count(parse_dcerpc_bindack_result, num_results as usize).parse(i)?;
184191
let record = DceRpcBindAckRecord {
185192
num_results,
186193
results,
@@ -207,32 +214,37 @@ pub struct DceRpcRecord<'a> {
207214
}
208215

209216
fn parse_dcerpc_flags1(i:&[u8]) -> IResult<&[u8],(u8,u8,u8)> {
210-
bits(tuple((
217+
use nom8::Parser;
218+
use nom8::error::Error;
219+
bits::<_, _, Error<_>, _, _>((
211220
take_bits(6u8),
212221
take_bits(1u8), // last (1)
213222
take_bits(1u8),
214-
)))(i)
223+
)).parse(i)
215224
}
216225

217226
fn parse_dcerpc_flags2(i:&[u8]) -> IResult<&[u8],(u32,u32,u32)> {
218-
bits(tuple((
227+
use nom8::Parser;
228+
use nom8::error::Error;
229+
bits::<_, _, Error<_>, _, _>((
219230
take_bits(3u32),
220231
take_bits(1u32), // endianness
221232
take_bits(28u32),
222-
)))(i)
233+
)).parse(i)
223234
}
224235

225236
pub fn parse_dcerpc_record(i: &[u8]) -> IResult<&[u8], DceRpcRecord<'_>> {
226-
let (i, version_major) = le_u8(i)?;
227-
let (i, version_minor) = le_u8(i)?;
228-
let (i, packet_type) = le_u8(i)?;
237+
use nom8::Parser;
238+
let (i, version_major) = le_u8.parse(i)?;
239+
let (i, version_minor) = le_u8.parse(i)?;
240+
let (i, packet_type) = le_u8.parse(i)?;
229241
let (i, packet_flags) = parse_dcerpc_flags1(i)?;
230242
let (i, data_rep) = parse_dcerpc_flags2(i)?;
231243
let endian = if data_rep.1 == 0 { Endianness::Big } else { Endianness::Little };
232-
let (i, frag_len) = u16(endian)(i)?;
233-
let (i, _auth) = u16(endian)(i)?;
234-
let (i, call_id) = u32(endian)(i)?;
235-
let (i, data) = rest(i)?;
244+
let (i, frag_len) = u16(endian).parse(i)?;
245+
let (i, _auth) = u16(endian).parse(i)?;
246+
let (i, call_id) = u32(endian).parse(i)?;
247+
let (i, data) = rest.parse(i)?;
236248
let record = DceRpcRecord {
237249
version_major,
238250
version_minor,

rust/src/smb/error.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
// Author: Pierre Chifflier <chifflier@wzdftpd.net>
19-
use nom7::error::{ErrorKind, ParseError};
19+
use nom8::error::{ErrorKind, ParseError};
2020

2121
#[derive(Debug)]
2222
pub enum SmbError {

rust/src/smb/nbss_records.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
* 02110-1301, USA.
1616
*/
1717

18-
use nom7::bytes::streaming::take;
19-
use nom7::combinator::rest;
20-
use nom7::number::streaming::be_u32;
21-
use nom7::IResult;
18+
use nom8::bytes::streaming::take;
19+
use nom8::combinator::rest;
20+
use nom8::number::streaming::be_u32;
21+
use nom8::IResult;
2222

2323
pub const NBSS_MSGTYPE_SESSION_MESSAGE: u8 = 0x00;
2424
pub const NBSS_MSGTYPE_SESSION_REQUEST: u8 = 0x81;
@@ -60,10 +60,11 @@ impl NbssRecord<'_> {
6060
}
6161

6262
pub fn parse_nbss_record(i: &[u8]) -> IResult<&[u8], NbssRecord<'_>> {
63-
let (i, buf) = be_u32(i)?;
63+
use nom8::Parser;
64+
let (i, buf) = be_u32.parse(i)?;
6465
let message_type = (buf >> 24) as u8;
6566
let length = buf & 0xff_ffff;
66-
let (i, data) = take(length as usize)(i)?;
67+
let (i, data) = take(length as usize).parse(i)?;
6768
let record = NbssRecord {
6869
message_type,
6970
length,
@@ -73,10 +74,11 @@ pub fn parse_nbss_record(i: &[u8]) -> IResult<&[u8], NbssRecord<'_>> {
7374
}
7475

7576
pub fn parse_nbss_record_partial(i: &[u8]) -> IResult<&[u8], NbssRecord<'_>> {
76-
let (i, buf) = be_u32(i)?;
77+
use nom8::Parser;
78+
let (i, buf) = be_u32.parse(i)?;
7779
let message_type = (buf >> 24) as u8;
7880
let length = buf & 0xff_ffff;
79-
let (i, data) = rest(i)?;
81+
let (i, data) = rest.parse(i)?;
8082
let record = NbssRecord {
8183
message_type,
8284
length,
@@ -89,7 +91,7 @@ pub fn parse_nbss_record_partial(i: &[u8]) -> IResult<&[u8], NbssRecord<'_>> {
8991
mod tests {
9092

9193
use super::*;
92-
use nom7::Err;
94+
use nom8::Err;
9395

9496
#[test]
9597
fn test_parse_nbss_record() {

0 commit comments

Comments
 (0)