ruby_smb 0.0.21 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/examples/net_share_enum_all.rb +5 -2
  5. data/lib/ruby_smb.rb +1 -1
  6. data/lib/ruby_smb/client.rb +4 -35
  7. data/lib/ruby_smb/dcerpc.rb +7 -22
  8. data/lib/ruby_smb/dcerpc/bind.rb +30 -36
  9. data/lib/ruby_smb/dcerpc/bind_ack.rb +72 -0
  10. data/lib/ruby_smb/dcerpc/error.rb +15 -0
  11. data/lib/ruby_smb/dcerpc/ndr.rb +31 -30
  12. data/lib/ruby_smb/dcerpc/p_syntax_id_t.rb +11 -0
  13. data/lib/ruby_smb/dcerpc/pdu_header.rb +29 -0
  14. data/lib/ruby_smb/dcerpc/ptypes.rb +26 -0
  15. data/lib/ruby_smb/dcerpc/request.rb +17 -30
  16. data/lib/ruby_smb/dcerpc/response.rb +15 -34
  17. data/lib/ruby_smb/dcerpc/srvsvc.rb +5 -7
  18. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +8 -4
  19. data/lib/ruby_smb/dcerpc/uuid.rb +31 -13
  20. data/lib/ruby_smb/smb1/bit_field.rb +0 -1
  21. data/lib/ruby_smb/smb1/bit_field/trans_flags.rb +3 -2
  22. data/lib/ruby_smb/smb1/data_block.rb +5 -0
  23. data/lib/ruby_smb/smb1/dcerpc.rb +67 -0
  24. data/lib/ruby_smb/smb1/packet.rb +1 -0
  25. data/lib/ruby_smb/smb1/packet/trans.rb +7 -1
  26. data/lib/ruby_smb/smb1/packet/trans/data_block.rb +19 -7
  27. data/lib/ruby_smb/smb1/packet/trans/request.rb +36 -25
  28. data/lib/ruby_smb/smb1/packet/trans/response.rb +22 -21
  29. data/lib/ruby_smb/smb1/packet/trans/subcommands.rb +1 -0
  30. data/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_request.rb +61 -0
  31. data/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_response.rb +44 -0
  32. data/lib/ruby_smb/smb1/packet/trans2/request.rb +1 -1
  33. data/lib/ruby_smb/smb1/pipe.rb +3 -0
  34. data/lib/ruby_smb/smb2/dcerpc.rb +68 -0
  35. data/lib/ruby_smb/smb2/pipe.rb +3 -0
  36. data/lib/ruby_smb/version.rb +1 -1
  37. data/spec/lib/ruby_smb/client_spec.rb +53 -6
  38. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +224 -0
  39. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +255 -7
  40. data/spec/lib/ruby_smb/dcerpc/p_syntax_id_t_spec.rb +31 -0
  41. data/spec/lib/ruby_smb/dcerpc/pdu_header_spec.rb +84 -0
  42. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +106 -13
  43. data/spec/lib/ruby_smb/dcerpc/response_spec.rb +89 -8
  44. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +176 -0
  45. data/spec/lib/ruby_smb/dcerpc/uuid_spec.rb +97 -1
  46. data/spec/lib/ruby_smb/smb1/data_block_spec.rb +43 -3
  47. data/spec/lib/ruby_smb/smb1/packet/trans/data_block_spec.rb +137 -0
  48. data/spec/lib/ruby_smb/smb1/packet/trans/request_spec.rb +239 -13
  49. data/spec/lib/ruby_smb/smb1/packet/trans/response_spec.rb +122 -13
  50. data/spec/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_request_spec.rb +254 -0
  51. data/spec/lib/ruby_smb/smb1/packet/trans/transact_nmpipe_response_spec.rb +122 -0
  52. data/spec/lib/ruby_smb/smb1/packet/trans2/request_spec.rb +2 -2
  53. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +199 -1
  54. data/spec/lib/ruby_smb/smb2/file_spec.rb +2 -1
  55. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +196 -1
  56. metadata +25 -10
  57. metadata.gz.sig +0 -0
  58. data/lib/ruby_smb/dcerpc/handle.rb +0 -60
  59. data/lib/ruby_smb/smb1/bit_field/trans2_flags.rb +0 -15
  60. data/spec/lib/ruby_smb/dcerpc/handle_spec.rb +0 -31
  61. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +0 -13
  62. data/spec/lib/ruby_smb/smb1/bit_field/trans2_flags_spec.rb +0 -26
@@ -1,14 +1,262 @@
1
- require 'spec_helper'
2
-
3
1
  RSpec.describe RubySMB::Dcerpc::Bind do
2
+ let(:uuid) { '12345678-1234-4321-5678-123456789012' }
3
+ let(:ver_major) { 2 }
4
+ let(:ver_minor) { 8 }
5
+ let :endpoint do
6
+ endpoint = Module.new
7
+ endpoint.const_set('UUID', uuid)
8
+ endpoint.const_set('VER_MAJOR', ver_major)
9
+ endpoint.const_set('VER_MINOR', ver_minor)
10
+ endpoint
11
+ end
12
+
13
+ subject(:packet) { described_class.new }
14
+
15
+ it { is_expected.to respond_to :pdu_header }
16
+ it { is_expected.to respond_to :max_xmit_frag }
17
+ it { is_expected.to respond_to :max_recv_frag }
18
+ it { is_expected.to respond_to :assoc_group_id }
19
+ it { is_expected.to respond_to :p_context_list }
20
+ it { is_expected.to respond_to :auth_verifier }
21
+
22
+ it 'is little endian' do
23
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
24
+ end
25
+
26
+ describe '#pdu_header' do
27
+ subject(:header) { packet.pdu_header }
28
+
29
+ it 'is a standard PDU Header' do
30
+ expect(header).to be_a RubySMB::Dcerpc::PDUHeader
31
+ end
32
+
33
+ it 'should have the #ptype field set to PTypes::BIND' do
34
+ expect(header.ptype).to eq RubySMB::Dcerpc::PTypes::BIND
35
+ end
36
+ end
37
+
38
+ describe '#max_xmit_frag' do
39
+ it 'should be a 16-bit unsigned integer' do
40
+ expect(packet.max_xmit_frag).to be_a BinData::Uint16le
41
+ end
42
+
43
+ it 'should have a default value of 0xFFFF' do
44
+ expect(packet.max_xmit_frag).to eq 0xFFFF
45
+ end
46
+ end
47
+
48
+ describe '#max_recv_frag' do
49
+ it 'should be a 16-bit unsigned integer' do
50
+ expect(packet.max_recv_frag).to be_a BinData::Uint16le
51
+ end
52
+
53
+ it 'should have a default value of 0xFFFF' do
54
+ expect(packet.max_recv_frag).to eq 0xFFFF
55
+ end
56
+ end
57
+
58
+ describe '#assoc_group_id' do
59
+ it 'should be a 32-bit unsigned integer' do
60
+ expect(packet.assoc_group_id).to be_a BinData::Uint32le
61
+ end
62
+ end
63
+
64
+ describe '#p_context_list' do
65
+ it 'should be a PContListT structure' do
66
+ expect(packet.p_context_list).to be_a RubySMB::Dcerpc::PContListT
67
+ end
68
+
69
+ it 'should have an #endpoint parameter' do
70
+ expect(packet.p_context_list.has_parameter?(:endpoint)).to be true
71
+ end
72
+ end
73
+
74
+ describe '#auth_verifier' do
75
+ it 'should be a string' do
76
+ expect(packet.auth_verifier).to be_a BinData::String
77
+ end
78
+
79
+ it 'should not exist if the #auth_length PDU header field is 0' do
80
+ packet.pdu_header.auth_length = 0
81
+ expect(packet.auth_verifier?).to be false
82
+ end
83
+
84
+ it 'should exist only if the #auth_length PDU header field is greater than 0' do
85
+ packet.pdu_header.auth_length = 10
86
+ expect(packet.auth_verifier?).to be true
87
+ end
88
+
89
+ it 'reads #auth_length bytes' do
90
+ auth_verifier = '12345678'
91
+ packet.pdu_header.auth_length = 6
92
+ packet.auth_verifier.read(auth_verifier)
93
+ expect(packet.auth_verifier).to eq(auth_verifier[0,6])
94
+ end
95
+ end
96
+
97
+ it 'reads its own binary representation and output the same packet' do
98
+ packet = described_class.new(endpoint: endpoint)
99
+ packet.auth_verifier = '123456'
100
+ packet.pdu_header.auth_length = 6
101
+ binary = packet.to_binary_s
102
+ expect(described_class.read(binary)).to eq(packet)
103
+ end
104
+ end
105
+
106
+ RSpec.describe RubySMB::Dcerpc::PContListT do
107
+ let(:uuid) { '12345678-1234-4321-5678-123456789012' }
108
+ let(:ver_major) { 2 }
109
+ let(:ver_minor) { 8 }
110
+ let :endpoint do
111
+ endpoint = Module.new
112
+ endpoint.const_set('UUID', uuid)
113
+ endpoint.const_set('VER_MAJOR', ver_major)
114
+ endpoint.const_set('VER_MINOR', ver_minor)
115
+ endpoint
116
+ end
117
+
118
+ subject(:packet) { described_class.new }
119
+
120
+ it { is_expected.to respond_to :n_context_elem }
121
+ it { is_expected.to respond_to :p_cont_elem }
122
+
123
+ it 'is little endian' do
124
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
125
+ end
4
126
 
5
- describe '#initialize' do
127
+ describe '#n_context_elem' do
128
+ it 'should be a 8-bit unsigned integer' do
129
+ expect(packet.n_context_elem).to be_a BinData::Uint8
130
+ end
131
+
132
+ it 'should have the default value 1' do
133
+ expect(packet.n_context_elem).to eq 1
134
+ end
135
+ end
136
+
137
+ describe '#p_cont_elem' do
138
+ it 'should be an array of type PContElemT' do
139
+ expect(packet.p_cont_elem).to be_a BinData::Array
140
+ type = packet.p_cont_elem.get_parameter(:type)
141
+ expect(type.instantiate).to be_a RubySMB::Dcerpc::PContElemT
142
+ end
143
+
144
+ it 'should have #n_context_elem elements' do
145
+ n_elements = 4
146
+ packet.n_context_elem = n_elements
147
+ expect(packet.p_cont_elem.size).to eq n_elements
148
+ end
149
+
150
+ it 'should have an #endpoint parameter' do
151
+ expect(packet.p_cont_elem.has_parameter?(:endpoint)).to be true
152
+ end
153
+ end
154
+
155
+ it 'reads its own binary representation and output the same packet' do
156
+ packet = described_class.new(endpoint: endpoint)
157
+ binary = packet.to_binary_s
158
+ expect(described_class.read(binary)).to eq(packet)
159
+ end
160
+ end
161
+
162
+ RSpec.describe RubySMB::Dcerpc::PContElemT do
163
+ let(:uuid) { '12345678-1234-4321-5678-123456789012' }
164
+ let(:ver_major) { 2 }
165
+ let(:ver_minor) { 8 }
166
+ let :endpoint do
167
+ endpoint = Module.new
168
+ endpoint.const_set('UUID', uuid)
169
+ endpoint.const_set('VER_MAJOR', ver_major)
170
+ endpoint.const_set('VER_MINOR', ver_minor)
171
+ endpoint
172
+ end
173
+
174
+ subject(:packet) { described_class.new }
175
+
176
+ it { is_expected.to respond_to :p_cont_id }
177
+ it { is_expected.to respond_to :n_transfer_syn }
178
+ it { is_expected.to respond_to :abstract_syntax }
179
+ it { is_expected.to respond_to :transfer_syntaxes }
180
+
181
+ it 'is little endian' do
182
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
183
+ end
184
+
185
+ describe '#p_cont_id' do
186
+ it 'should be a 16-bit unsigned integer' do
187
+ expect(packet.p_cont_id).to be_a BinData::Uint16le
188
+ end
189
+ end
190
+
191
+ describe '#n_transfer_syn' do
192
+ it 'should be a 8-bit unsigned integer' do
193
+ expect(packet.n_transfer_syn).to be_a BinData::Uint8
194
+ end
195
+
196
+ it 'should have the default value 1' do
197
+ expect(packet.n_transfer_syn).to eq 1
198
+ end
199
+ end
200
+
201
+ describe '#abstract_syntax' do
202
+ it 'should be a PSyntaxIdT structure' do
203
+ expect(packet.abstract_syntax).to be_a RubySMB::Dcerpc::PSyntaxIdT
204
+ end
205
+
206
+ it 'should have an #uuid parameter' do
207
+ expect(packet.abstract_syntax.has_parameter?(:uuid)).to be true
208
+ end
209
+
210
+ it 'should have a #ver_major parameter' do
211
+ expect(packet.abstract_syntax.has_parameter?(:ver_major)).to be true
212
+ end
213
+
214
+ it 'should have a #ver_minor parameter' do
215
+ expect(packet.abstract_syntax.has_parameter?(:ver_minor)).to be true
216
+ end
6
217
 
7
- let(:bind){described_class.new(endpoint: RubySMB::Dcerpc::Srvsvc)}
8
- let(:abstract_syntax){bind.p_context_elem.p_cont_elem[0].abstract_syntax}
218
+ it 'should be initialized with the #endpoint constants' do
219
+ p_cont_elem_t = described_class.new(endpoint: endpoint)
9
220
 
10
- it 'should set the abstract syntax to SrvsvcSyntax' do
11
- expect(abstract_syntax).to eq RubySMB::Dcerpc::Srvsvc::SrvSvcSyntax.new
221
+ expect(p_cont_elem_t.abstract_syntax.if_uuid).to eq(uuid)
222
+ expect(p_cont_elem_t.abstract_syntax.if_ver_major).to eq(ver_major)
223
+ expect(p_cont_elem_t.abstract_syntax.if_ver_minor).to eq(ver_minor)
12
224
  end
225
+
226
+ it 'should be initialized with the #endpoint constants when passed as a parameter to Bind' do
227
+ bind = RubySMB::Dcerpc::Bind.new(endpoint: endpoint)
228
+ p_cont_elem_t = bind.p_context_list.p_cont_elem.first
229
+
230
+ expect(p_cont_elem_t.abstract_syntax.if_uuid).to eq(uuid)
231
+ expect(p_cont_elem_t.abstract_syntax.if_ver_major).to eq(ver_major)
232
+ expect(p_cont_elem_t.abstract_syntax.if_ver_minor).to eq(ver_minor)
233
+ end
234
+ end
235
+
236
+ describe '#transfer_syntaxes' do
237
+ it 'should be an array of type PSyntaxIdT' do
238
+ expect(packet.transfer_syntaxes).to be_a BinData::Array
239
+ type = packet.transfer_syntaxes.get_parameter(:type)
240
+ expect(type.instantiate).to be_a RubySMB::Dcerpc::PSyntaxIdT
241
+ end
242
+
243
+ it 'should have #n_transfer_syn elements' do
244
+ n_elements = 4
245
+ packet.n_transfer_syn = n_elements
246
+ expect(packet.transfer_syntaxes.size).to eq n_elements
247
+ end
248
+
249
+ it 'sets its elements to the NDR presentation syntax' do
250
+ expect(packet.transfer_syntaxes[0].if_uuid).to eq RubySMB::Dcerpc::Ndr::UUID
251
+ expect(packet.transfer_syntaxes[0].if_ver_major).to eq RubySMB::Dcerpc::Ndr::VER_MAJOR
252
+ expect(packet.transfer_syntaxes[0].if_ver_minor).to eq RubySMB::Dcerpc::Ndr::VER_MINOR
253
+ end
254
+ end
255
+
256
+ it 'reads its own binary representation and output the same packet' do
257
+ packet = described_class.new(endpoint: endpoint)
258
+ packet.n_transfer_syn = 2
259
+ binary = packet.to_binary_s
260
+ expect(described_class.read(binary)).to eq(packet)
13
261
  end
14
262
  end
@@ -0,0 +1,31 @@
1
+ RSpec.describe RubySMB::Dcerpc::PSyntaxIdT do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :if_uuid }
5
+ it { is_expected.to respond_to :if_ver_major }
6
+ it { is_expected.to respond_to :if_ver_minor }
7
+
8
+ it 'is little endian' do
9
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
10
+ end
11
+
12
+ describe '#if_uuid' do
13
+ it 'is a Uuid' do
14
+ expect(packet.if_uuid).to be_a RubySMB::Dcerpc::Uuid
15
+ end
16
+ end
17
+
18
+ describe '#if_ver_major' do
19
+ it 'should be a 16-bit unsigned integer' do
20
+ expect(packet.if_ver_major).to be_a BinData::Uint16le
21
+ end
22
+ end
23
+
24
+ describe '#if_ver_minor' do
25
+ it 'should be a 16-bit unsigned integer' do
26
+ expect(packet.if_ver_minor).to be_a BinData::Uint16le
27
+ end
28
+ end
29
+
30
+ end
31
+
@@ -0,0 +1,84 @@
1
+ RSpec.describe RubySMB::Dcerpc::PDUHeader do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :rpc_vers }
5
+ it { is_expected.to respond_to :rpc_vers_minor }
6
+ it { is_expected.to respond_to :ptype }
7
+ it { is_expected.to respond_to :pfc_flags }
8
+ it { is_expected.to respond_to :packed_drep }
9
+ it { is_expected.to respond_to :frag_length }
10
+ it { is_expected.to respond_to :auth_length }
11
+ it { is_expected.to respond_to :call_id }
12
+
13
+ it 'is little endian' do
14
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
15
+ end
16
+
17
+ describe '#rpc_vers' do
18
+ it 'should be a 8-bit unsigned integer' do
19
+ expect(packet.rpc_vers).to be_a BinData::Uint8
20
+ end
21
+
22
+ it 'should have a default value of 5' do
23
+ expect(packet.rpc_vers).to eq 5
24
+ end
25
+ end
26
+
27
+ describe '#rpc_vers_minor' do
28
+ it 'should be a 8-bit unsigned integer' do
29
+ expect(packet.rpc_vers_minor).to be_a BinData::Uint8
30
+ end
31
+ end
32
+
33
+ describe '#ptype' do
34
+ it 'should be a 8-bit unsigned integer' do
35
+ expect(packet.ptype).to be_a BinData::Uint8
36
+ end
37
+ end
38
+
39
+ describe '#pfc_flags' do
40
+ it 'should be a custom structure' do
41
+ expect(packet.pfc_flags).to be_a BinData::Struct
42
+ end
43
+ end
44
+
45
+ describe '#packed_drep' do
46
+ it 'should be a 32-bit unsigned integer' do
47
+ expect(packet.packed_drep).to be_a BinData::Uint32le
48
+ end
49
+
50
+ it 'should have a default value of 0x10' do
51
+ expect(packet.packed_drep).to eq 0x10
52
+ end
53
+ end
54
+
55
+ describe '#frag_length' do
56
+ it 'should be a 16-bit unsigned integer' do
57
+ expect(packet.frag_length).to be_a BinData::Uint16le
58
+ end
59
+
60
+ it 'should be the size of the full packet' do
61
+ bind_ack = RubySMB::Dcerpc::BindAck.new
62
+ expect(bind_ack.pdu_header.frag_length).to eq(bind_ack.do_num_bytes)
63
+ end
64
+ end
65
+
66
+ describe '#auth_length' do
67
+ it 'should be a 16-bit unsigned integer' do
68
+ expect(packet.auth_length).to be_a BinData::Uint16le
69
+ end
70
+ end
71
+
72
+ describe '#call_id' do
73
+ it 'should be a 32-bit unsigned integer' do
74
+ expect(packet.call_id).to be_a BinData::Uint32le
75
+ end
76
+
77
+ it 'should have a default value of 1' do
78
+ expect(packet.call_id).to eq 1
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+
@@ -1,21 +1,114 @@
1
- require 'spec_helper'
2
-
3
1
  RSpec.describe RubySMB::Dcerpc::Request do
2
+ subject(:packet) { described_class.new }
3
+
4
+ it { is_expected.to respond_to :pdu_header }
5
+ it { is_expected.to respond_to :alloc_hint }
6
+ it { is_expected.to respond_to :p_cont_id }
7
+ it { is_expected.to respond_to :opnum }
8
+ it { is_expected.to respond_to :object }
9
+ it { is_expected.to respond_to :stub }
10
+ it { is_expected.to respond_to :auth_verifier }
11
+
12
+ it 'is little endian' do
13
+ expect(described_class.fields.instance_variable_get(:@hints)[:endian]).to eq :little
14
+ end
15
+
16
+ describe '#pdu_header' do
17
+ subject(:header) { packet.pdu_header }
18
+
19
+ it 'is a standard PDU Header' do
20
+ expect(header).to be_a RubySMB::Dcerpc::PDUHeader
21
+ end
22
+
23
+ it 'should have the #ptype field set to PTypes::BIND_ACK' do
24
+ expect(header.ptype).to eq RubySMB::Dcerpc::PTypes::REQUEST
25
+ end
26
+ end
27
+
28
+ describe '#alloc_hint' do
29
+ it 'should be a 32-bit unsigned integer' do
30
+ expect(packet.alloc_hint).to be_a BinData::Uint32le
31
+ end
32
+
33
+ it 'should be the size of the #stub field' do
34
+ packet = described_class.new({ :opnum => RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL }, host: '1.2.3.4')
35
+ expect(packet.alloc_hint).to eq(packet.stub.do_num_bytes)
36
+ end
37
+ end
38
+
39
+ describe '#p_cont_id' do
40
+ it 'should be a 16-bit unsigned integer' do
41
+ expect(packet.p_cont_id).to be_a BinData::Uint16le
42
+ end
43
+ end
44
+
45
+ describe '#opnum' do
46
+ it 'should be a 16-bit unsigned integer' do
47
+ expect(packet.opnum).to be_a BinData::Uint16le
48
+ end
49
+ end
50
+
51
+ describe '#object' do
52
+ it 'is a Uuid' do
53
+ expect(packet.object).to be_a RubySMB::Dcerpc::Uuid
54
+ end
55
+
56
+ it 'only exists if #object_uuid header flag is set' do
57
+ packet.pdu_header.pfc_flags.object_uuid = 1
58
+ expect(packet.object?).to be true
59
+ end
60
+
61
+ it 'does not exist if #object_uuid header flag is not set' do
62
+ packet.pdu_header.pfc_flags.object_uuid = 0
63
+ expect(packet.object?).to be false
64
+ end
65
+ end
66
+
67
+ describe '#stub' do
68
+ it 'is a Bindata Choice' do
69
+ expect(packet.stub).to be_a BinData::Choice
70
+ end
4
71
 
5
- describe 'when making a NetShareEnumAll dcerpc request' do
6
- let(:request){
7
- described_class.new(
8
- opnum: RubySMB::Dcerpc::Srvsvc::NetShareEnumAll::Opnum,
9
- stub: RubySMB::Dcerpc::Srvsvc::NetShareEnumAll.new(host: '192.161.204.122').to_binary_s
10
- )
11
- }
72
+ context 'with a NetShareEnumAll stub' do
12
73
 
13
- it 'should create a Request struct with NetShareEnumAll as stub with size of 106' do
14
- expect(request.do_num_bytes).to eq 104
74
+ it 'uses opnum as a selector' do
75
+ packet = described_class.new({ :opnum => RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL }, host: '1.2.3.4')
76
+ expect(packet.stub.selection).to eq(packet.opnum)
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '#auth_verifier' do
82
+ it 'should be a string' do
83
+ expect(packet.auth_verifier).to be_a BinData::String
84
+ end
85
+
86
+ it 'should not exist if the #auth_length PDU header field is 0' do
87
+ packet.pdu_header.auth_length = 0
88
+ expect(packet.auth_verifier?).to be false
15
89
  end
16
90
 
17
- it 'should set the correct opnum' do
18
- expect(request.opnum).to eq 0xF
91
+ it 'should exist only if the #auth_length PDU header field is greater than 0' do
92
+ packet.pdu_header.auth_length = 10
93
+ expect(packet.auth_verifier?).to be true
94
+ end
95
+
96
+ it 'reads #auth_length bytes' do
97
+ auth_verifier = '12345678'
98
+ packet.pdu_header.auth_length = 6
99
+ packet.auth_verifier.read(auth_verifier)
100
+ expect(packet.auth_verifier).to eq(auth_verifier[0,6])
19
101
  end
20
102
  end
103
+
104
+ it 'reads its own binary representation and output the same packet' do
105
+ packet = described_class.new({ :opnum => RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL }, host: '1.2.3.4')
106
+ packet.pdu_header.pfc_flags.object_uuid = 1
107
+ packet.object = '8a885d04-1ceb-11c9-9fe8-08002b104860'
108
+ packet.auth_verifier = '123456'
109
+ packet.pdu_header.auth_length = 6
110
+ binary = packet.to_binary_s
111
+ expect(described_class.read(binary)).to eq(packet)
112
+ end
21
113
  end
114
+