1515 * 02110-1301, USA.
1616 */
1717
18- use crate :: common :: nom7 :: bits;
18+ use nom8 :: bits :: bits;
1919use 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 ) ]
3029pub struct DceRpcResponseRecord < ' a > {
@@ -36,11 +35,12 @@ pub struct DceRpcResponseRecord<'a> {
3635pub 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> {
5757pub 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
7980pub 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
9597pub 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
117120pub 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
131135pub 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
153158pub 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
173179pub 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
209216fn 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
217226fn 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
225236pub 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,
0 commit comments