2 # Unix SMB/CIFS implementation.
3 # Copyright (C) Stefan Metzmacher 2014,2015
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
23 sys.path.insert(0, "bin/python")
24 os.environ["PYTHONUNBUFFERED"] = "1"
26 import samba.dcerpc.dcerpc as dcerpc
27 import samba.dcerpc.base as base
28 import samba.dcerpc.misc as misc
29 import samba.dcerpc.epmapper
30 import samba.dcerpc.mgmt
31 import samba.dcerpc.netlogon
33 from samba import gensec
34 from samba.tests.dcerpc.raw_testcase import RawDCERPCTest
35 from samba.compat import binary_type
37 global_ndr_print = False
38 global_hexdump = False
41 class TestDCERPC_BIND(RawDCERPCTest):
44 super(TestDCERPC_BIND, self).setUp()
45 self.do_ndr_print = global_ndr_print
46 self.do_hexdump = global_hexdump
48 def _test_no_auth_request_bind_pfc_flags(self, req_pfc_flags, rep_pfc_flags):
49 ndr32 = base.transfer_syntax_ndr()
52 ctx1 = dcerpc.ctx_list()
54 ctx1.num_transfer_syntaxes = len(tsf1_list)
55 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
56 ctx1.transfer_syntaxes = tsf1_list
58 req = self.generate_bind(call_id=0, pfc_flags=req_pfc_flags, ctx_list=[ctx1])
61 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
62 pfc_flags=rep_pfc_flags, auth_length=0)
63 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
64 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
65 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
66 self.assertEquals(rep.u.secondary_address_size, 4)
67 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
68 self.assertEquals(len(rep.u._pad1), 2)
69 # sometimes windows sends random bytes
70 # self.assertEquals(rep.u._pad1, '\0' * 2)
71 self.assertEquals(rep.u.num_results, 1)
72 self.assertEquals(rep.u.ctx_list[0].result,
73 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
74 self.assertEquals(rep.u.ctx_list[0].reason,
75 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
76 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
77 self.assertEquals(rep.u.auth_info, b'\0' * 0)
79 # And now try a request
80 req = self.generate_request(call_id=1,
81 context_id=ctx1.context_id,
86 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
88 self.assertNotEquals(rep.u.alloc_hint, 0)
89 self.assertEquals(rep.u.context_id, req.u.context_id)
90 self.assertEquals(rep.u.cancel_count, 0)
91 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
93 def _test_no_auth_request_alter_pfc_flags(self, req_pfc_flags, rep_pfc_flags):
94 ndr32 = base.transfer_syntax_ndr()
97 ctx1 = dcerpc.ctx_list()
99 ctx1.num_transfer_syntaxes = len(tsf1_list)
100 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
101 ctx1.transfer_syntaxes = tsf1_list
103 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
105 rep = self.recv_pdu()
106 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
108 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
109 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
110 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
111 self.assertEquals(rep.u.secondary_address_size, 4)
112 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
113 self.assertEquals(len(rep.u._pad1), 2)
114 # sometimes windows sends random bytes
115 # self.assertEquals(rep.u._pad1, '\0' * 2)
116 self.assertEquals(rep.u.num_results, 1)
117 self.assertEquals(rep.u.ctx_list[0].result,
118 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
119 self.assertEquals(rep.u.ctx_list[0].reason,
120 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
121 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
122 self.assertEquals(rep.u.auth_info, b'\0' * 0)
124 # And now try a alter context
125 req = self.generate_alter(call_id=0, pfc_flags=req_pfc_flags, ctx_list=[ctx1])
127 rep = self.recv_pdu()
128 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
129 pfc_flags=rep_pfc_flags, auth_length=0)
130 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
131 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
132 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
133 self.assertEquals(rep.u.secondary_address_size, 0)
134 self.assertEquals(rep.u.secondary_address, "")
135 self.assertEquals(len(rep.u._pad1), 2)
136 # sometimes windows sends random bytes
137 # self.assertEquals(rep.u._pad1, '\0' * 2)
138 self.assertEquals(rep.u.num_results, 1)
139 self.assertEquals(rep.u.ctx_list[0].result,
140 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
141 self.assertEquals(rep.u.ctx_list[0].reason,
142 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
143 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
144 self.assertEquals(rep.u.auth_info, b'\0' * 0)
146 # And now try a request
147 req = self.generate_request(call_id=1,
148 context_id=ctx1.context_id,
152 rep = self.recv_pdu()
153 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
155 self.assertNotEquals(rep.u.alloc_hint, 0)
156 self.assertEquals(rep.u.context_id, req.u.context_id)
157 self.assertEquals(rep.u.cancel_count, 0)
158 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
160 def test_no_auth_request(self):
161 return self._test_no_auth_request_bind_pfc_flags(
163 dcerpc.DCERPC_PFC_FLAG_FIRST |
164 dcerpc.DCERPC_PFC_FLAG_LAST,
166 dcerpc.DCERPC_PFC_FLAG_FIRST |
167 dcerpc.DCERPC_PFC_FLAG_LAST)
169 def test_no_auth_request_bind_pfc_00(self):
170 return self._test_no_auth_request_bind_pfc_flags(
174 dcerpc.DCERPC_PFC_FLAG_FIRST |
175 dcerpc.DCERPC_PFC_FLAG_LAST)
177 def test_no_auth_request_bind_pfc_FIRST(self):
178 return self._test_no_auth_request_bind_pfc_flags(
180 dcerpc.DCERPC_PFC_FLAG_FIRST |
183 dcerpc.DCERPC_PFC_FLAG_FIRST |
184 dcerpc.DCERPC_PFC_FLAG_LAST)
186 def test_no_auth_request_bind_pfc_LAST(self):
187 return self._test_no_auth_request_bind_pfc_flags(
189 dcerpc.DCERPC_PFC_FLAG_LAST |
192 dcerpc.DCERPC_PFC_FLAG_FIRST |
193 dcerpc.DCERPC_PFC_FLAG_LAST)
195 # TODO: doesn't announce DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN
196 # without authentication
197 def _test_no_auth_request_bind_pfc_HDR_SIGNING(self):
198 return self._test_no_auth_request_bind_pfc_flags(
200 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
203 dcerpc.DCERPC_PFC_FLAG_FIRST |
204 dcerpc.DCERPC_PFC_FLAG_LAST |
205 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN)
207 def test_no_auth_request_bind_pfc_08(self):
208 return self._test_no_auth_request_bind_pfc_flags(
213 dcerpc.DCERPC_PFC_FLAG_FIRST |
214 dcerpc.DCERPC_PFC_FLAG_LAST)
216 def test_no_auth_request_bind_pfc_CONC_MPX(self):
217 return self._test_no_auth_request_bind_pfc_flags(
219 dcerpc.DCERPC_PFC_FLAG_CONC_MPX |
222 dcerpc.DCERPC_PFC_FLAG_FIRST |
223 dcerpc.DCERPC_PFC_FLAG_LAST |
224 dcerpc.DCERPC_PFC_FLAG_CONC_MPX)
226 def test_no_auth_request_bind_pfc_DID_NOT_EXECUTE(self):
227 return self._test_no_auth_request_bind_pfc_flags(
229 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
232 dcerpc.DCERPC_PFC_FLAG_FIRST |
233 dcerpc.DCERPC_PFC_FLAG_LAST)
235 def test_no_auth_request_bind_pfc_MAYBE(self):
236 return self._test_no_auth_request_bind_pfc_flags(
238 dcerpc.DCERPC_PFC_FLAG_MAYBE |
241 dcerpc.DCERPC_PFC_FLAG_FIRST |
242 dcerpc.DCERPC_PFC_FLAG_LAST)
244 def test_no_auth_request_bind_pfc_OBJECT_UUID(self):
245 return self._test_no_auth_request_bind_pfc_flags(
247 dcerpc.DCERPC_PFC_FLAG_OBJECT_UUID |
250 dcerpc.DCERPC_PFC_FLAG_FIRST |
251 dcerpc.DCERPC_PFC_FLAG_LAST)
253 # TODO: doesn't announce DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN
254 # without authentication
255 # TODO: doesn't announce DCERPC_PFC_FLAG_CONC_MPX
257 def _test_no_auth_request_bind_pfc_ff(self):
258 return self._test_no_auth_request_bind_pfc_flags(
263 dcerpc.DCERPC_PFC_FLAG_FIRST |
264 dcerpc.DCERPC_PFC_FLAG_LAST |
265 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
266 dcerpc.DCERPC_PFC_FLAG_CONC_MPX)
268 def test_no_auth_request_alter_pfc_00(self):
269 return self._test_no_auth_request_alter_pfc_flags(
273 dcerpc.DCERPC_PFC_FLAG_FIRST |
274 dcerpc.DCERPC_PFC_FLAG_LAST)
276 def test_no_auth_request_alter_pfc_FIRST(self):
277 return self._test_no_auth_request_alter_pfc_flags(
279 dcerpc.DCERPC_PFC_FLAG_FIRST |
282 dcerpc.DCERPC_PFC_FLAG_FIRST |
283 dcerpc.DCERPC_PFC_FLAG_LAST)
285 def test_no_auth_request_alter_pfc_LAST(self):
286 return self._test_no_auth_request_alter_pfc_flags(
288 dcerpc.DCERPC_PFC_FLAG_LAST |
291 dcerpc.DCERPC_PFC_FLAG_FIRST |
292 dcerpc.DCERPC_PFC_FLAG_LAST)
294 # TODO: doesn't announce DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN
295 # without authentication
296 def _test_no_auth_request_alter_pfc_HDR_SIGNING(self):
297 return self._test_no_auth_request_alter_pfc_flags(
299 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN |
302 dcerpc.DCERPC_PFC_FLAG_FIRST |
303 dcerpc.DCERPC_PFC_FLAG_LAST |
304 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN)
306 def test_no_auth_request_alter_pfc_08(self):
307 return self._test_no_auth_request_alter_pfc_flags(
312 dcerpc.DCERPC_PFC_FLAG_FIRST |
313 dcerpc.DCERPC_PFC_FLAG_LAST)
315 def test_no_auth_request_alter_pfc_CONC_MPX(self):
316 return self._test_no_auth_request_alter_pfc_flags(
318 dcerpc.DCERPC_PFC_FLAG_CONC_MPX |
321 dcerpc.DCERPC_PFC_FLAG_FIRST |
322 dcerpc.DCERPC_PFC_FLAG_LAST)
324 def test_no_auth_request_alter_pfc_DID_NOT_EXECUTE(self):
325 return self._test_no_auth_request_alter_pfc_flags(
327 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE |
330 dcerpc.DCERPC_PFC_FLAG_FIRST |
331 dcerpc.DCERPC_PFC_FLAG_LAST)
333 def test_no_auth_request_alter_pfc_MAYBE(self):
334 return self._test_no_auth_request_alter_pfc_flags(
336 dcerpc.DCERPC_PFC_FLAG_MAYBE |
339 dcerpc.DCERPC_PFC_FLAG_FIRST |
340 dcerpc.DCERPC_PFC_FLAG_LAST)
342 def test_no_auth_request_alter_pfc_OBJECT_UUID(self):
343 return self._test_no_auth_request_alter_pfc_flags(
345 dcerpc.DCERPC_PFC_FLAG_OBJECT_UUID |
348 dcerpc.DCERPC_PFC_FLAG_FIRST |
349 dcerpc.DCERPC_PFC_FLAG_LAST)
351 # TODO: doesn't announce DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN
352 # without authentication
353 def _test_no_auth_request_alter_pfc_ff(self):
354 return self._test_no_auth_request_alter_pfc_flags(
359 dcerpc.DCERPC_PFC_FLAG_FIRST |
360 dcerpc.DCERPC_PFC_FLAG_LAST |
361 dcerpc.DCERPC_PFC_FLAG_SUPPORT_HEADER_SIGN)
363 def test_no_auth_no_ctx(self):
364 # send an useless bind
365 req = self.generate_bind(call_id=0)
367 rep = self.recv_pdu()
368 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
370 self.assertEquals(rep.u.reject_reason,
371 dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
372 self.assertEquals(rep.u.num_versions, 1)
373 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
374 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
375 self.assertEquals(len(rep.u._pad), 3)
376 self.assertEquals(rep.u._pad, b'\0' * 3)
378 def test_invalid_auth_noctx(self):
379 req = self.generate_bind(call_id=0)
380 req.auth_length = dcerpc.DCERPC_AUTH_TRAILER_LENGTH
382 rep = self.recv_pdu()
383 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
385 self.assertEquals(rep.u.reject_reason,
386 dcerpc.DCERPC_BIND_NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED)
387 self.assertEquals(rep.u.num_versions, 1)
388 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
389 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
390 self.assertEquals(len(rep.u._pad), 3)
391 self.assertEquals(rep.u._pad, b'\0' * 3)
393 def test_no_auth_valid_valid_request(self):
394 ndr32 = base.transfer_syntax_ndr()
397 ctx1 = dcerpc.ctx_list()
399 ctx1.num_transfer_syntaxes = len(tsf1_list)
400 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
401 ctx1.transfer_syntaxes = tsf1_list
403 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
405 rep = self.recv_pdu()
406 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
408 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
409 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
410 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
411 self.assertEquals(rep.u.secondary_address_size, 4)
412 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
413 self.assertEquals(len(rep.u._pad1), 2)
414 self.assertEquals(rep.u._pad1, b'\0' * 2)
415 self.assertEquals(rep.u.num_results, 1)
416 self.assertEquals(rep.u.ctx_list[0].result,
417 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
418 self.assertEquals(rep.u.ctx_list[0].reason,
419 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
420 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
421 self.assertEquals(rep.u.auth_info, b'\0' * 0)
425 ctx2 = dcerpc.ctx_list()
427 ctx2.num_transfer_syntaxes = len(tsf2_list)
428 ctx2.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
429 ctx2.transfer_syntaxes = tsf2_list
431 req = self.generate_bind(call_id=1, ctx_list=[ctx2])
433 rep = self.recv_pdu()
434 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
436 self.assertEquals(rep.u.reject_reason,
437 dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
438 self.assertEquals(rep.u.num_versions, 1)
439 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
440 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
441 self.assertEquals(len(rep.u._pad), 3)
442 self.assertEquals(rep.u._pad, b'\0' * 3)
444 # wait for a disconnect
445 rep = self.recv_pdu()
446 self.assertIsNone(rep)
447 self.assertNotConnected()
449 def test_no_auth_invalid_valid_request(self):
450 # send an useless bind
451 req = self.generate_bind(call_id=0)
453 rep = self.recv_pdu()
454 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
456 self.assertEquals(rep.u.reject_reason,
457 dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
458 self.assertEquals(rep.u.num_versions, 1)
459 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
460 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
461 self.assertEquals(len(rep.u._pad), 3)
462 self.assertEquals(rep.u._pad, b'\0' * 3)
464 # wait for a disconnect
465 rep = self.recv_pdu()
466 self.assertIsNone(rep)
467 self.assertNotConnected()
469 def test_alter_no_auth_no_ctx(self):
470 ndr32 = base.transfer_syntax_ndr()
473 ctx1 = dcerpc.ctx_list()
475 ctx1.num_transfer_syntaxes = len(tsf1_list)
476 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
477 ctx1.transfer_syntaxes = tsf1_list
479 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
481 rep = self.recv_pdu()
482 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
484 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
485 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
486 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
487 self.assertEquals(rep.u.secondary_address_size, 4)
488 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
489 self.assertEquals(len(rep.u._pad1), 2)
490 self.assertEquals(rep.u._pad1, b'\0' * 2)
491 self.assertEquals(rep.u.num_results, 1)
492 self.assertEquals(rep.u.ctx_list[0].result,
493 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
494 self.assertEquals(rep.u.ctx_list[0].reason,
495 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
496 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
497 self.assertEquals(rep.u.auth_info, b'\0' * 0)
500 req = self.generate_alter(call_id=1, ctx_list=[])
502 rep = self.recv_pdu()
503 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
504 pfc_flags=req.pfc_flags |
505 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
507 self.assertNotEquals(rep.u.alloc_hint, 0)
508 self.assertEquals(rep.u.context_id, 0)
509 self.assertEquals(rep.u.cancel_count, 0)
510 self.assertEquals(rep.u.flags, 0)
511 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
512 self.assertEquals(rep.u.reserved, 0)
513 self.assertEquals(len(rep.u.error_and_verifier), 0)
515 # wait for a disconnect
516 rep = self.recv_pdu()
517 self.assertIsNone(rep)
518 self.assertNotConnected()
520 def test_no_auth_presentation_ctx_valid1(self):
521 ndr32 = base.transfer_syntax_ndr()
523 zero_syntax = misc.ndr_syntax_id()
525 tsf1_list = [zero_syntax, ndr32]
526 ctx1 = dcerpc.ctx_list()
528 ctx1.num_transfer_syntaxes = len(tsf1_list)
529 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
530 ctx1.transfer_syntaxes = tsf1_list
532 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
534 rep = self.recv_pdu()
535 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
537 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
538 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
539 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
540 self.assertEquals(rep.u.secondary_address_size, 4)
541 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
542 self.assertEquals(len(rep.u._pad1), 2)
543 self.assertEquals(rep.u._pad1, b'\0' * 2)
544 self.assertEquals(rep.u.num_results, 1)
545 self.assertEquals(rep.u.ctx_list[0].result,
546 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
547 self.assertEquals(rep.u.ctx_list[0].reason,
548 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
549 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
550 self.assertEquals(rep.u.auth_info, b'\0' * 0)
553 req = self.generate_alter(call_id=1, ctx_list=[ctx1])
555 rep = self.recv_pdu()
556 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
558 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
559 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
560 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
561 self.assertEquals(rep.u.secondary_address_size, 0)
562 self.assertEquals(len(rep.u._pad1), 2)
563 #self.assertEquals(rep.u._pad1, '\0' * 2)
564 self.assertEquals(rep.u.num_results, 1)
565 self.assertEquals(rep.u.ctx_list[0].result,
566 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
567 self.assertEquals(rep.u.ctx_list[0].reason,
568 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
569 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
570 self.assertEquals(rep.u.auth_info, b'\0' * 0)
572 req = self.generate_request(call_id=2,
573 context_id=ctx1.context_id,
577 rep = self.recv_pdu()
578 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
579 pfc_flags=req.pfc_flags |
580 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
582 self.assertNotEquals(rep.u.alloc_hint, 0)
583 self.assertEquals(rep.u.context_id, ctx1.context_id)
584 self.assertEquals(rep.u.cancel_count, 0)
585 self.assertEquals(rep.u.flags, 0)
586 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_OP_RNG_ERROR)
587 self.assertEquals(rep.u.reserved, 0)
588 self.assertEquals(len(rep.u.error_and_verifier), 0)
590 def test_no_auth_presentation_ctx_invalid1(self):
591 ndr32 = base.transfer_syntax_ndr()
593 zero_syntax = misc.ndr_syntax_id()
596 ctx1 = dcerpc.ctx_list()
598 ctx1.num_transfer_syntaxes = len(tsf1_list)
599 ctx1.abstract_syntax = ndr32
600 ctx1.transfer_syntaxes = tsf1_list
602 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
604 rep = self.recv_pdu()
605 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
607 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
608 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
609 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
610 self.assertEquals(rep.u.secondary_address_size, 4)
611 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
612 self.assertEquals(len(rep.u._pad1), 2)
613 self.assertEquals(rep.u._pad1, b'\0' * 2)
614 self.assertEquals(rep.u.num_results, 1)
615 self.assertEquals(rep.u.ctx_list[0].result,
616 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
617 self.assertEquals(rep.u.ctx_list[0].reason,
618 dcerpc.DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED)
619 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
620 self.assertEquals(rep.u.auth_info, b'\0' * 0)
623 req = self.generate_alter(call_id=1, ctx_list=[ctx1])
625 rep = self.recv_pdu()
626 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
628 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
629 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
630 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
631 self.assertEquals(rep.u.secondary_address_size, 0)
632 self.assertEquals(len(rep.u._pad1), 2)
633 #self.assertEquals(rep.u._pad1, '\0' * 2)
634 self.assertEquals(rep.u.num_results, 1)
635 self.assertEquals(rep.u.ctx_list[0].result,
636 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
637 self.assertEquals(rep.u.ctx_list[0].reason,
638 dcerpc.DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED)
639 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
640 self.assertEquals(rep.u.auth_info, b'\0' * 0)
642 req = self.generate_request(call_id=2,
647 rep = self.recv_pdu()
648 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
649 pfc_flags=req.pfc_flags |
650 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
652 self.assertNotEquals(rep.u.alloc_hint, 0)
653 self.assertEquals(rep.u.context_id, 0)
654 self.assertEquals(rep.u.cancel_count, 0)
655 self.assertEquals(rep.u.flags, 0)
656 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_UNKNOWN_IF)
657 self.assertEquals(rep.u.reserved, 0)
658 self.assertEquals(len(rep.u.error_and_verifier), 0)
660 # Send a alter again to prove the connection is still alive
661 req = self.generate_alter(call_id=3, ctx_list=[ctx1])
663 rep = self.recv_pdu()
664 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
666 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
667 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
668 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
669 self.assertEquals(rep.u.secondary_address_size, 0)
670 self.assertEquals(len(rep.u._pad1), 2)
671 #self.assertEquals(rep.u._pad1, '\0' * 2)
672 self.assertEquals(rep.u.num_results, 1)
673 self.assertEquals(rep.u.ctx_list[0].result,
674 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
675 self.assertEquals(rep.u.ctx_list[0].reason,
676 dcerpc.DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED)
677 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
678 self.assertEquals(rep.u.auth_info, b'\0' * 0)
680 def test_no_auth_presentation_ctx_invalid2(self):
681 ndr32 = base.transfer_syntax_ndr()
683 zero_syntax = misc.ndr_syntax_id()
686 ctx1a = dcerpc.ctx_list()
688 ctx1a.num_transfer_syntaxes = len(tsf1a_list)
689 ctx1a.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
690 ctx1a.transfer_syntaxes = tsf1a_list
692 req = self.generate_bind(call_id=0, ctx_list=[ctx1a])
694 rep = self.recv_pdu()
695 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
697 self.assertEquals(rep.u.reject_reason,
698 dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
699 self.assertEquals(rep.u.num_versions, 1)
700 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
701 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
702 self.assertEquals(len(rep.u._pad), 3)
703 self.assertEquals(rep.u._pad, b'\0' * 3)
705 # wait for a disconnect
706 rep = self.recv_pdu()
707 self.assertIsNone(rep)
708 self.assertNotConnected()
710 def test_no_auth_presentation_ctx_invalid3(self):
711 ndr32 = base.transfer_syntax_ndr()
713 zero_syntax = misc.ndr_syntax_id()
715 tsf1a_list = [zero_syntax, ndr32, ndr32, ndr32]
716 ctx1a = dcerpc.ctx_list()
718 ctx1a.num_transfer_syntaxes = len(tsf1a_list)
719 ctx1a.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
720 ctx1a.transfer_syntaxes = tsf1a_list
722 req = self.generate_bind(call_id=0, ctx_list=[ctx1a])
724 rep = self.recv_pdu()
725 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
727 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
728 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
729 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
730 self.assertEquals(rep.u.secondary_address_size, 4)
731 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
732 self.assertEquals(len(rep.u._pad1), 2)
733 self.assertEquals(rep.u._pad1, b'\0' * 2)
734 self.assertEquals(rep.u.num_results, 1)
735 self.assertEquals(rep.u.ctx_list[0].result,
736 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
737 self.assertEquals(rep.u.ctx_list[0].reason,
738 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
739 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
740 self.assertEquals(rep.u.auth_info, b'\0' * 0)
743 ctx1b = dcerpc.ctx_list()
745 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
746 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
747 ctx1b.transfer_syntaxes = tsf1b_list
750 req = self.generate_alter(call_id=1, ctx_list=[ctx1b])
752 rep = self.recv_pdu()
753 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
754 pfc_flags=req.pfc_flags |
755 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
757 self.assertNotEquals(rep.u.alloc_hint, 0)
758 self.assertEquals(rep.u.context_id, 0)
759 self.assertEquals(rep.u.cancel_count, 0)
760 self.assertEquals(rep.u.flags, 0)
761 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
762 self.assertEquals(rep.u.reserved, 0)
763 self.assertEquals(len(rep.u.error_and_verifier), 0)
765 # wait for a disconnect
766 rep = self.recv_pdu()
767 self.assertIsNone(rep)
768 self.assertNotConnected()
770 def test_no_auth_presentation_ctx_invalid4(self):
771 ndr32 = base.transfer_syntax_ndr()
772 ndr64 = base.transfer_syntax_ndr64()
774 zero_syntax = misc.ndr_syntax_id()
776 tsf1a_list = [zero_syntax, ndr32, ndr32, ndr32]
777 ctx1a = dcerpc.ctx_list()
779 ctx1a.num_transfer_syntaxes = len(tsf1a_list)
780 ctx1a.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
781 ctx1a.transfer_syntaxes = tsf1a_list
783 req = self.generate_bind(call_id=0, ctx_list=[ctx1a])
785 rep = self.recv_pdu()
786 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
788 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
789 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
790 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
791 self.assertEquals(rep.u.secondary_address_size, 4)
792 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
793 self.assertEquals(len(rep.u._pad1), 2)
794 self.assertEquals(rep.u._pad1, b'\0' * 2)
795 self.assertEquals(rep.u.num_results, 1)
796 self.assertEquals(rep.u.ctx_list[0].result,
797 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
798 self.assertEquals(rep.u.ctx_list[0].reason,
799 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
800 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
801 self.assertEquals(rep.u.auth_info, b'\0' * 0)
803 # With a known but wrong syntax we get a protocol error
804 # see test_no_auth_presentation_ctx_valid2
805 tsf1b_list = [zero_syntax, samba.dcerpc.epmapper.abstract_syntax(), ndr64]
806 ctx1b = dcerpc.ctx_list()
808 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
809 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
810 ctx1b.transfer_syntaxes = tsf1b_list
813 req = self.generate_alter(call_id=1, ctx_list=[ctx1b])
815 rep = self.recv_pdu()
816 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
817 pfc_flags=req.pfc_flags |
818 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
820 self.assertNotEquals(rep.u.alloc_hint, 0)
821 self.assertEquals(rep.u.context_id, 0)
822 self.assertEquals(rep.u.cancel_count, 0)
823 self.assertEquals(rep.u.flags, 0)
824 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
825 self.assertEquals(rep.u.reserved, 0)
826 self.assertEquals(len(rep.u.error_and_verifier), 0)
828 # wait for a disconnect
829 rep = self.recv_pdu()
830 self.assertIsNone(rep)
831 self.assertNotConnected()
833 def test_no_auth_presentation_ctx_valid2(self):
834 ndr32 = base.transfer_syntax_ndr()
836 zero_syntax = misc.ndr_syntax_id()
838 tsf1a_list = [zero_syntax, ndr32, ndr32, ndr32]
839 ctx1a = dcerpc.ctx_list()
841 ctx1a.num_transfer_syntaxes = len(tsf1a_list)
842 ctx1a.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
843 ctx1a.transfer_syntaxes = tsf1a_list
845 req = self.generate_bind(call_id=0, ctx_list=[ctx1a])
847 rep = self.recv_pdu()
848 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
850 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
851 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
852 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
853 self.assertEquals(rep.u.secondary_address_size, 4)
854 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
855 self.assertEquals(len(rep.u._pad1), 2)
856 self.assertEquals(rep.u._pad1, b'\0' * 2)
857 self.assertEquals(rep.u.num_results, 1)
858 self.assertEquals(rep.u.ctx_list[0].result,
859 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
860 self.assertEquals(rep.u.ctx_list[0].reason,
861 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
862 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
863 self.assertEquals(rep.u.auth_info, b'\0' * 0)
865 # With a unknown but wrong syntaxes we get NO protocol error
866 # see test_no_auth_presentation_ctx_invalid4
867 tsf1b_list = [zero_syntax, samba.dcerpc.epmapper.abstract_syntax()]
868 ctx1b = dcerpc.ctx_list()
870 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
871 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
872 ctx1b.transfer_syntaxes = tsf1b_list
875 req = self.generate_alter(call_id=1, ctx_list=[ctx1b])
877 rep = self.recv_pdu()
878 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
880 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
881 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
882 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
883 self.assertEquals(rep.u.secondary_address_size, 0)
884 self.assertEquals(len(rep.u._pad1), 2)
885 #self.assertEquals(rep.u._pad1, '\0' * 2)
886 self.assertEquals(rep.u.num_results, 1)
887 self.assertEquals(rep.u.ctx_list[0].result,
888 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
889 self.assertEquals(rep.u.ctx_list[0].reason,
890 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
891 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
892 self.assertEquals(rep.u.auth_info, b'\0' * 0)
894 req = self.generate_request(call_id=2,
895 context_id=ctx1a.context_id,
899 rep = self.recv_pdu()
900 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
901 pfc_flags=req.pfc_flags |
902 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
904 self.assertNotEquals(rep.u.alloc_hint, 0)
905 self.assertEquals(rep.u.context_id, ctx1a.context_id)
906 self.assertEquals(rep.u.cancel_count, 0)
907 self.assertEquals(rep.u.flags, 0)
908 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_OP_RNG_ERROR)
909 self.assertEquals(rep.u.reserved, 0)
910 self.assertEquals(len(rep.u.error_and_verifier), 0)
912 def test_no_auth_presentation_ctx_no_ndr64(self):
913 ndr32 = base.transfer_syntax_ndr()
914 zero_syntax = misc.ndr_syntax_id()
916 tsfZ_list = [zero_syntax]
917 ctxZ = dcerpc.ctx_list()
918 ctxZ.context_id = 54321
919 ctxZ.num_transfer_syntaxes = len(tsfZ_list)
920 ctxZ.abstract_syntax = zero_syntax
921 ctxZ.transfer_syntaxes = tsfZ_list
923 req = self.generate_bind(call_id=0, ctx_list=[ctxZ])
925 rep = self.recv_pdu()
926 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
928 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
929 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
930 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
931 self.assertEquals(rep.u.secondary_address_size, 4)
932 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
933 self.assertEquals(len(rep.u._pad1), 2)
934 self.assertEquals(rep.u._pad1, b'\0' * 2)
935 self.assertEquals(rep.u.num_results, 1)
936 self.assertEquals(rep.u.ctx_list[0].result,
937 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
938 self.assertEquals(rep.u.ctx_list[0].reason,
939 dcerpc.DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED)
940 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
941 self.assertEquals(rep.u.auth_info, b'\0' * 0)
944 ctx0 = dcerpc.ctx_list()
946 ctx0.num_transfer_syntaxes = len(tsf0_list)
947 ctx0.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
948 ctx0.transfer_syntaxes = tsf0_list
950 req = self.generate_alter(call_id=0, ctx_list=[ctx0])
952 rep = self.recv_pdu()
953 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
955 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
956 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
957 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
958 self.assertEquals(rep.u.secondary_address_size, 0)
959 self.assertEquals(len(rep.u._pad1), 2)
960 #self.assertEquals(rep.u._pad1, '\0' * 2)
961 self.assertEquals(rep.u.num_results, 1)
962 self.assertEquals(rep.u.ctx_list[0].result,
963 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
964 self.assertEquals(rep.u.ctx_list[0].reason,
965 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
966 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
967 self.assertEquals(rep.u.auth_info, b'\0' * 0)
969 req = self.generate_request(call_id=1,
970 context_id=ctx0.context_id,
974 rep = self.recv_pdu()
975 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
977 self.assertNotEquals(rep.u.alloc_hint, 0)
978 self.assertEquals(rep.u.context_id, req.u.context_id)
979 self.assertEquals(rep.u.cancel_count, 0)
980 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
982 tsf1_list = [zero_syntax, ndr32]
983 ctx1 = dcerpc.ctx_list()
985 ctx1.num_transfer_syntaxes = len(tsf1_list)
986 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
987 ctx1.transfer_syntaxes = tsf1_list
989 req = self.generate_alter(call_id=1, ctx_list=[ctx1])
991 rep = self.recv_pdu()
992 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
994 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
995 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
996 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
997 self.assertEquals(rep.u.secondary_address_size, 0)
998 self.assertEquals(len(rep.u._pad1), 2)
999 #self.assertEquals(rep.u._pad1, '\0' * 2)
1000 self.assertEquals(rep.u.num_results, 1)
1001 self.assertEquals(rep.u.ctx_list[0].result,
1002 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1003 self.assertEquals(rep.u.ctx_list[0].reason,
1004 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1005 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1006 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1008 req = self.generate_request(call_id=1,
1009 context_id=ctx1.context_id,
1013 rep = self.recv_pdu()
1014 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1016 self.assertNotEquals(rep.u.alloc_hint, 0)
1017 self.assertEquals(rep.u.context_id, req.u.context_id)
1018 self.assertEquals(rep.u.cancel_count, 0)
1019 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1021 tsf2_list = [ndr32, ndr32]
1022 ctx2 = dcerpc.ctx_list()
1024 ctx2.num_transfer_syntaxes = len(tsf2_list)
1025 ctx2.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1026 ctx2.transfer_syntaxes = tsf2_list
1028 req = self.generate_alter(call_id=2, ctx_list=[ctx2])
1030 rep = self.recv_pdu()
1031 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1033 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1034 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1035 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1036 self.assertEquals(rep.u.secondary_address_size, 0)
1037 self.assertEquals(len(rep.u._pad1), 2)
1038 #self.assertEquals(rep.u._pad1, '\0' * 2)
1039 self.assertEquals(rep.u.num_results, 1)
1040 self.assertEquals(rep.u.ctx_list[0].result,
1041 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1042 self.assertEquals(rep.u.ctx_list[0].reason,
1043 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1044 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1045 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1047 req = self.generate_request(call_id=1,
1048 context_id=ctx2.context_id,
1052 rep = self.recv_pdu()
1053 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1055 self.assertNotEquals(rep.u.alloc_hint, 0)
1056 self.assertEquals(rep.u.context_id, req.u.context_id)
1057 self.assertEquals(rep.u.cancel_count, 0)
1058 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1061 ctx3 = dcerpc.ctx_list()
1063 ctx3.num_transfer_syntaxes = len(tsf3_list)
1064 ctx3.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1065 ctx3.transfer_syntaxes = tsf3_list
1068 ctx4 = dcerpc.ctx_list()
1070 ctx4.num_transfer_syntaxes = len(tsf4_list)
1071 ctx4.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1072 ctx4.transfer_syntaxes = tsf4_list
1074 req = self.generate_alter(call_id=34, ctx_list=[ctx3, ctx4])
1076 rep = self.recv_pdu()
1077 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1079 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1080 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1081 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1082 self.assertEquals(rep.u.secondary_address_size, 0)
1083 self.assertEquals(len(rep.u._pad1), 2)
1084 #self.assertEquals(rep.u._pad1, '\0' * 2)
1085 self.assertEquals(rep.u.num_results, 2)
1086 self.assertEquals(rep.u.ctx_list[0].result,
1087 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1088 self.assertEquals(rep.u.ctx_list[0].reason,
1089 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1090 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1091 self.assertEquals(rep.u.ctx_list[1].result,
1092 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1093 self.assertEquals(rep.u.ctx_list[1].reason,
1094 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
1095 self.assertNDRSyntaxEquals(rep.u.ctx_list[1].syntax, zero_syntax)
1096 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1098 req = self.generate_request(call_id=1,
1099 context_id=ctx3.context_id,
1103 rep = self.recv_pdu()
1104 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1106 self.assertNotEquals(rep.u.alloc_hint, 0)
1107 self.assertEquals(rep.u.context_id, req.u.context_id)
1108 self.assertEquals(rep.u.cancel_count, 0)
1109 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1111 req = self.generate_alter(call_id=43, ctx_list=[ctx4, ctx3])
1113 rep = self.recv_pdu()
1114 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1116 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1117 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1118 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1119 self.assertEquals(rep.u.secondary_address_size, 0)
1120 self.assertEquals(len(rep.u._pad1), 2)
1121 #self.assertEquals(rep.u._pad1, '\0' * 2)
1122 self.assertEquals(rep.u.num_results, 2)
1123 self.assertEquals(rep.u.ctx_list[0].result,
1124 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1125 self.assertEquals(rep.u.ctx_list[0].reason,
1126 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1127 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1128 self.assertEquals(rep.u.ctx_list[1].result,
1129 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1130 self.assertEquals(rep.u.ctx_list[1].reason,
1131 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
1132 self.assertNDRSyntaxEquals(rep.u.ctx_list[1].syntax, zero_syntax)
1133 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1135 req = self.generate_request(call_id=1,
1136 context_id=ctx4.context_id,
1140 rep = self.recv_pdu()
1141 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1143 self.assertNotEquals(rep.u.alloc_hint, 0)
1144 self.assertEquals(rep.u.context_id, req.u.context_id)
1145 self.assertEquals(rep.u.cancel_count, 0)
1146 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1148 req = self.generate_request(call_id=1,
1149 context_id=ctx3.context_id,
1153 rep = self.recv_pdu()
1154 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1156 self.assertNotEquals(rep.u.alloc_hint, 0)
1157 self.assertEquals(rep.u.context_id, req.u.context_id)
1158 self.assertEquals(rep.u.cancel_count, 0)
1159 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1161 req = self.generate_alter(call_id=44, ctx_list=[ctx4, ctx4])
1163 rep = self.recv_pdu()
1164 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1166 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1167 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1168 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1169 self.assertEquals(rep.u.secondary_address_size, 0)
1170 self.assertEquals(len(rep.u._pad1), 2)
1171 #self.assertEquals(rep.u._pad1, '\0' * 2)
1172 self.assertEquals(rep.u.num_results, 2)
1173 self.assertEquals(rep.u.ctx_list[0].result,
1174 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1175 self.assertEquals(rep.u.ctx_list[0].reason,
1176 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1177 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1178 self.assertEquals(rep.u.ctx_list[1].result,
1179 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1180 self.assertEquals(rep.u.ctx_list[1].reason,
1181 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
1182 self.assertNDRSyntaxEquals(rep.u.ctx_list[1].syntax, zero_syntax)
1183 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1185 req = self.generate_request(call_id=1,
1186 context_id=ctx4.context_id,
1190 rep = self.recv_pdu()
1191 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1193 self.assertNotEquals(rep.u.alloc_hint, 0)
1194 self.assertEquals(rep.u.context_id, req.u.context_id)
1195 self.assertEquals(rep.u.cancel_count, 0)
1196 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1198 req = self.generate_request(call_id=1,
1199 context_id=ctx3.context_id,
1203 rep = self.recv_pdu()
1204 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1206 self.assertNotEquals(rep.u.alloc_hint, 0)
1207 self.assertEquals(rep.u.context_id, req.u.context_id)
1208 self.assertEquals(rep.u.cancel_count, 0)
1209 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1211 tsf5mgmt_list = [ndr32]
1212 ctx5mgmt = dcerpc.ctx_list()
1213 ctx5mgmt.context_id = 5
1214 ctx5mgmt.num_transfer_syntaxes = len(tsf5mgmt_list)
1215 ctx5mgmt.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1216 ctx5mgmt.transfer_syntaxes = tsf5mgmt_list
1218 tsf5epm_list = [ndr32]
1219 ctx5epm = dcerpc.ctx_list()
1220 ctx5epm.context_id = 5
1221 ctx5epm.num_transfer_syntaxes = len(tsf5epm_list)
1222 ctx5epm.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1223 ctx5epm.transfer_syntaxes = tsf5epm_list
1225 req = self.generate_alter(call_id=55, ctx_list=[ctx5mgmt, ctx5epm])
1227 rep = self.recv_pdu()
1228 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1230 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1231 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1232 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1233 self.assertEquals(rep.u.secondary_address_size, 0)
1234 self.assertEquals(len(rep.u._pad1), 2)
1235 #self.assertEquals(rep.u._pad1, '\0' * 2)
1236 self.assertEquals(rep.u.num_results, 2)
1237 self.assertEquals(rep.u.ctx_list[0].result,
1238 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1239 self.assertEquals(rep.u.ctx_list[0].reason,
1240 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1241 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1242 self.assertEquals(rep.u.ctx_list[1].result,
1243 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1244 self.assertEquals(rep.u.ctx_list[1].reason,
1245 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
1246 self.assertNDRSyntaxEquals(rep.u.ctx_list[1].syntax, zero_syntax)
1247 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1249 req = self.generate_request(call_id=1,
1250 context_id=ctx5mgmt.context_id,
1254 rep = self.recv_pdu()
1255 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1257 self.assertNotEquals(rep.u.alloc_hint, 0)
1258 self.assertEquals(rep.u.context_id, req.u.context_id)
1259 self.assertEquals(rep.u.cancel_count, 0)
1260 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1262 req = self.generate_alter(call_id=55, ctx_list=[ctx5mgmt, ctx5epm])
1264 rep = self.recv_pdu()
1265 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1267 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1268 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1269 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1270 self.assertEquals(rep.u.secondary_address_size, 0)
1271 self.assertEquals(len(rep.u._pad1), 2)
1272 #self.assertEquals(rep.u._pad1, '\0' * 2)
1273 self.assertEquals(rep.u.num_results, 2)
1274 self.assertEquals(rep.u.ctx_list[0].result,
1275 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1276 self.assertEquals(rep.u.ctx_list[0].reason,
1277 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1278 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1279 self.assertEquals(rep.u.ctx_list[1].result,
1280 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1281 self.assertEquals(rep.u.ctx_list[1].reason,
1282 dcerpc.DCERPC_BIND_ACK_REASON_TRANSFER_SYNTAXES_NOT_SUPPORTED)
1283 self.assertNDRSyntaxEquals(rep.u.ctx_list[1].syntax, zero_syntax)
1284 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1286 req = self.generate_request(call_id=1,
1287 context_id=ctx5mgmt.context_id,
1291 rep = self.recv_pdu()
1292 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1294 self.assertNotEquals(rep.u.alloc_hint, 0)
1295 self.assertEquals(rep.u.context_id, req.u.context_id)
1296 self.assertEquals(rep.u.cancel_count, 0)
1297 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1299 def test_no_auth_bind_time_none_simple(self):
1301 btf = base.bind_time_features_syntax(features)
1303 zero_syntax = misc.ndr_syntax_id()
1306 ctx1 = dcerpc.ctx_list()
1308 ctx1.num_transfer_syntaxes = len(tsf1_list)
1309 ctx1.abstract_syntax = zero_syntax
1310 ctx1.transfer_syntaxes = tsf1_list
1312 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
1314 rep = self.recv_pdu()
1315 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1317 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1318 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1319 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1320 self.assertEquals(rep.u.secondary_address_size, 4)
1321 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1322 self.assertEquals(len(rep.u._pad1), 2)
1323 self.assertEquals(rep.u._pad1, b'\0' * 2)
1324 self.assertEquals(rep.u.num_results, 1)
1325 self.assertEquals(rep.u.ctx_list[0].result,
1326 dcerpc.DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK)
1327 self.assertEquals(rep.u.ctx_list[0].reason, features)
1328 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
1329 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1331 def test_no_auth_bind_time_none_ignore_additional(self):
1333 btf1 = base.bind_time_features_syntax(features1)
1335 features2 = dcerpc.DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN
1336 features2 |= dcerpc.DCERPC_BIND_TIME_SECURITY_CONTEXT_MULTIPLEXING
1337 btf2 = base.bind_time_features_syntax(features2)
1339 zero_syntax = misc.ndr_syntax_id()
1340 ndr64 = base.transfer_syntax_ndr64()
1342 tsf1_list = [btf1, btf2, zero_syntax]
1343 ctx1 = dcerpc.ctx_list()
1345 ctx1.num_transfer_syntaxes = len(tsf1_list)
1346 ctx1.abstract_syntax = ndr64
1347 ctx1.transfer_syntaxes = tsf1_list
1349 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
1351 rep = self.recv_pdu()
1352 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1354 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1355 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1356 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1357 self.assertEquals(rep.u.secondary_address_size, 4)
1358 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1359 self.assertEquals(len(rep.u._pad1), 2)
1360 self.assertEquals(rep.u._pad1, b'\0' * 2)
1361 self.assertEquals(rep.u.num_results, 1)
1362 self.assertEquals(rep.u.ctx_list[0].result,
1363 dcerpc.DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK)
1364 self.assertEquals(rep.u.ctx_list[0].reason, features1)
1365 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
1366 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1368 def test_no_auth_bind_time_only_first(self):
1369 features1 = dcerpc.DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN
1370 btf1 = base.bind_time_features_syntax(features1)
1372 features2 = dcerpc.DCERPC_BIND_TIME_SECURITY_CONTEXT_MULTIPLEXING
1373 btf2 = base.bind_time_features_syntax(features2)
1375 zero_syntax = misc.ndr_syntax_id()
1377 tsf1_list = [zero_syntax, btf1, btf2, zero_syntax]
1378 ctx1 = dcerpc.ctx_list()
1380 ctx1.num_transfer_syntaxes = len(tsf1_list)
1381 ctx1.abstract_syntax = zero_syntax
1382 ctx1.transfer_syntaxes = tsf1_list
1384 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
1386 rep = self.recv_pdu()
1387 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1389 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1390 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1391 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1392 self.assertEquals(rep.u.secondary_address_size, 4)
1393 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1394 self.assertEquals(len(rep.u._pad1), 2)
1395 self.assertEquals(rep.u._pad1, b'\0' * 2)
1396 self.assertEquals(rep.u.num_results, 1)
1397 self.assertEquals(rep.u.ctx_list[0].result,
1398 dcerpc.DCERPC_BIND_ACK_RESULT_PROVIDER_REJECTION)
1399 self.assertEquals(rep.u.ctx_list[0].reason,
1400 dcerpc.DCERPC_BIND_ACK_REASON_ABSTRACT_SYNTAX_NOT_SUPPORTED)
1401 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
1402 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1404 def test_no_auth_bind_time_twice(self):
1405 features1 = dcerpc.DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN
1406 btf1 = base.bind_time_features_syntax(features1)
1408 features2 = dcerpc.DCERPC_BIND_TIME_SECURITY_CONTEXT_MULTIPLEXING
1409 btf2 = base.bind_time_features_syntax(features2)
1411 zero_syntax = misc.ndr_syntax_id()
1414 ctx1 = dcerpc.ctx_list()
1416 ctx1.num_transfer_syntaxes = len(tsf1_list)
1417 ctx1.abstract_syntax = zero_syntax
1418 ctx1.transfer_syntaxes = tsf1_list
1421 ctx2 = dcerpc.ctx_list()
1423 ctx2.num_transfer_syntaxes = len(tsf2_list)
1424 ctx2.abstract_syntax = zero_syntax
1425 ctx2.transfer_syntaxes = tsf2_list
1427 req = self.generate_bind(call_id=0, ctx_list=[ctx1, ctx2])
1429 rep = self.recv_pdu()
1430 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
1432 self.assertEquals(rep.u.reject_reason,
1433 dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
1434 self.assertEquals(rep.u.num_versions, 1)
1435 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
1436 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
1437 self.assertEquals(len(rep.u._pad), 3)
1438 self.assertEquals(rep.u._pad, b'\0' * 3)
1440 # wait for a disconnect
1441 rep = self.recv_pdu()
1442 self.assertIsNone(rep)
1443 self.assertNotConnected()
1445 def test_no_auth_bind_time_keep_on_orphan_simple(self):
1446 features = dcerpc.DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN
1447 btf = base.bind_time_features_syntax(features)
1449 zero_syntax = misc.ndr_syntax_id()
1452 ctx1 = dcerpc.ctx_list()
1454 ctx1.num_transfer_syntaxes = len(tsf1_list)
1455 ctx1.abstract_syntax = zero_syntax
1456 ctx1.transfer_syntaxes = tsf1_list
1458 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
1460 rep = self.recv_pdu()
1461 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1463 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1464 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1465 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1466 self.assertEquals(rep.u.secondary_address_size, 4)
1467 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1468 self.assertEquals(len(rep.u._pad1), 2)
1469 self.assertEquals(rep.u._pad1, b'\0' * 2)
1470 self.assertEquals(rep.u.num_results, 1)
1471 self.assertEquals(rep.u.ctx_list[0].result,
1472 dcerpc.DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK)
1473 self.assertEquals(rep.u.ctx_list[0].reason, features)
1474 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
1475 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1477 def test_no_auth_bind_time_keep_on_orphan_ignore_additional(self):
1478 features1 = dcerpc.DCERPC_BIND_TIME_KEEP_CONNECTION_ON_ORPHAN
1479 btf1 = base.bind_time_features_syntax(features1)
1481 features2 = dcerpc.DCERPC_BIND_TIME_SECURITY_CONTEXT_MULTIPLEXING
1482 btf2 = base.bind_time_features_syntax(features2)
1484 zero_syntax = misc.ndr_syntax_id()
1485 ndr64 = base.transfer_syntax_ndr64()
1487 tsf1_list = [btf1, btf2, zero_syntax]
1488 ctx1 = dcerpc.ctx_list()
1490 ctx1.num_transfer_syntaxes = len(tsf1_list)
1491 ctx1.abstract_syntax = ndr64
1492 ctx1.transfer_syntaxes = tsf1_list
1494 req = self.generate_bind(call_id=0, ctx_list=[ctx1])
1496 rep = self.recv_pdu()
1497 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1499 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1500 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1501 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1502 self.assertEquals(rep.u.secondary_address_size, 4)
1503 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1504 self.assertEquals(len(rep.u._pad1), 2)
1505 self.assertEquals(rep.u._pad1, b'\0' * 2)
1506 self.assertEquals(rep.u.num_results, 1)
1507 self.assertEquals(rep.u.ctx_list[0].result,
1508 dcerpc.DCERPC_BIND_ACK_RESULT_NEGOTIATE_ACK)
1509 self.assertEquals(rep.u.ctx_list[0].reason, features1)
1510 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, zero_syntax)
1511 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1513 def _test_auth_type_level_bind_nak(self, auth_type, auth_level, creds=None,
1514 reason=dcerpc.DCERPC_BIND_NAK_REASON_INVALID_AUTH_TYPE):
1515 ndr32 = base.transfer_syntax_ndr()
1518 ctx1 = dcerpc.ctx_list()
1520 ctx1.num_transfer_syntaxes = len(tsf1_list)
1521 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1522 ctx1.transfer_syntaxes = tsf1_list
1527 if creds is not None:
1528 # We always start with DCERPC_AUTH_LEVEL_INTEGRITY
1529 auth_context = self.get_auth_context_creds(creds,
1530 auth_type=auth_type,
1531 auth_level=auth_level,
1532 auth_context_id=auth_context_id,
1533 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY)
1535 (finished, to_server) = auth_context["gensec"].update(from_server)
1536 self.assertFalse(finished)
1538 auth_info = self.generate_auth(auth_type=auth_context["auth_type"],
1539 auth_level=auth_context["auth_level"],
1540 auth_context_id=auth_context["auth_context_id"],
1541 auth_blob=to_server)
1544 auth_info = self.generate_auth(auth_type=auth_type,
1545 auth_level=auth_level,
1546 auth_context_id=auth_context_id,
1547 auth_blob=to_server)
1549 req = self.generate_bind(call_id=0,
1551 auth_info=auth_info)
1553 rep = self.recv_pdu()
1554 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
1556 self.assertEquals(rep.u.reject_reason, reason)
1557 self.assertEquals(rep.u.num_versions, 1)
1558 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
1559 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
1560 self.assertEquals(len(rep.u._pad), 3)
1561 self.assertEquals(rep.u._pad, b'\0' * 3)
1563 # wait for a disconnect
1564 rep = self.recv_pdu()
1565 self.assertIsNone(rep)
1566 self.assertNotConnected()
1568 def _test_auth_none_level_bind(self, auth_level,
1569 reason=dcerpc.DCERPC_BIND_NAK_REASON_INVALID_AUTH_TYPE):
1570 return self._test_auth_type_level_bind_nak(auth_type=dcerpc.DCERPC_AUTH_LEVEL_NONE,
1571 auth_level=auth_level, reason=reason)
1573 def test_auth_none_none_bind(self):
1574 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_NONE,
1575 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
1577 def test_auth_none_connect_bind(self):
1578 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_CONNECT)
1580 def test_auth_none_call_bind(self):
1581 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_CALL)
1583 def test_auth_none_packet_bind(self):
1584 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_PACKET)
1586 def test_auth_none_integrity_bind(self):
1587 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY)
1589 def test_auth_none_privacy_bind(self):
1590 return self._test_auth_none_level_bind(dcerpc.DCERPC_AUTH_LEVEL_PRIVACY)
1592 def test_auth_none_0_bind(self):
1593 return self._test_auth_none_level_bind(0,
1594 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
1596 def test_auth_none_7_bind(self):
1597 return self._test_auth_none_level_bind(7,
1598 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
1600 def test_auth_none_255_bind(self):
1601 return self._test_auth_none_level_bind(255,
1602 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
1604 def _test_auth_none_level_request(self, auth_level):
1605 ndr32 = base.transfer_syntax_ndr()
1608 ctx1 = dcerpc.ctx_list()
1610 ctx1.num_transfer_syntaxes = len(tsf1_list)
1611 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1612 ctx1.transfer_syntaxes = tsf1_list
1615 auth_type = dcerpc.DCERPC_AUTH_TYPE_NONE
1618 req = self.generate_bind(call_id=0,
1622 rep = self.recv_pdu()
1623 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
1624 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1625 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1626 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1627 self.assertEquals(rep.u.secondary_address_size, 4)
1628 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1629 self.assertEquals(len(rep.u._pad1), 2)
1630 self.assertEquals(rep.u._pad1, b'\0' * 2)
1631 self.assertEquals(rep.u.num_results, 1)
1632 self.assertEquals(rep.u.ctx_list[0].result,
1633 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1634 self.assertEquals(rep.u.ctx_list[0].reason,
1635 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1636 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1637 self.assertEquals(len(rep.u.auth_info), 0)
1639 # And now try a request without auth_info
1640 req = self.generate_request(call_id=2,
1641 context_id=ctx1.context_id,
1645 rep = self.recv_pdu()
1646 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1648 self.assertNotEquals(rep.u.alloc_hint, 0)
1649 self.assertEquals(rep.u.context_id, req.u.context_id)
1650 self.assertEquals(rep.u.cancel_count, 0)
1651 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1653 auth_info = self.generate_auth(auth_type=auth_type,
1654 auth_level=auth_level,
1655 auth_context_id=auth_context_id,
1658 req = self.generate_request(call_id=3,
1659 context_id=ctx1.context_id,
1662 auth_info=auth_info)
1664 rep = self.recv_pdu()
1665 # We get a fault back
1666 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
1668 self.assertNotEquals(rep.u.alloc_hint, 0)
1669 self.assertEquals(rep.u.context_id, req.u.context_id)
1670 self.assertEquals(rep.u.cancel_count, 0)
1671 self.assertEquals(rep.u.flags, 0)
1672 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
1673 self.assertEquals(rep.u.reserved, 0)
1674 self.assertEquals(len(rep.u.error_and_verifier), 0)
1676 # wait for a disconnect
1677 rep = self.recv_pdu()
1678 self.assertIsNone(rep)
1679 self.assertNotConnected()
1681 def test_auth_none_none_request(self):
1682 return self._test_auth_none_level_request(dcerpc.DCERPC_AUTH_LEVEL_NONE)
1684 def test_auth_none_connect_request(self):
1685 return self._test_auth_none_level_request(dcerpc.DCERPC_AUTH_LEVEL_CONNECT)
1687 def test_auth_none_call_request(self):
1688 return self._test_auth_none_level_request(dcerpc.DCERPC_AUTH_LEVEL_CALL)
1690 def _test_neg_xmit_check_values(self,
1696 ndr32 = base.transfer_syntax_ndr()
1699 ctx1 = dcerpc.ctx_list()
1701 ctx1.num_transfer_syntaxes = len(tsf1_list)
1702 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1703 ctx1.transfer_syntaxes = tsf1_list
1705 req = self.generate_bind(call_id=0,
1706 max_xmit_frag=req_xmit,
1707 max_recv_frag=req_recv,
1710 rep = self.recv_pdu()
1711 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1713 self.assertEquals(rep.u.max_xmit_frag, rep_both)
1714 self.assertEquals(rep.u.max_recv_frag, rep_both)
1715 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1716 self.assertEquals(rep.u.secondary_address_size, 4)
1717 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1718 self.assertEquals(len(rep.u._pad1), 2)
1719 self.assertEquals(rep.u._pad1, b'\0' * 2)
1720 self.assertEquals(rep.u.num_results, 1)
1721 self.assertEquals(rep.u.ctx_list[0].result,
1722 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1723 self.assertEquals(rep.u.ctx_list[0].reason,
1724 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1725 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1726 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1728 assoc_group_id = rep.u.assoc_group_id
1729 if alter_xmit is None:
1730 alter_xmit = rep_both - 8
1731 if alter_recv is None:
1732 alter_recv = rep_both - 8
1734 # max_{xmit,recv}_frag and assoc_group_id are completely
1735 # ignored in alter_context requests
1736 req = self.generate_alter(call_id=1,
1737 max_xmit_frag=alter_xmit,
1738 max_recv_frag=alter_recv,
1739 assoc_group_id=0xffffffff - rep.u.assoc_group_id,
1742 rep = self.recv_pdu()
1743 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id,
1745 self.assertEquals(rep.u.max_xmit_frag, rep_both)
1746 self.assertEquals(rep.u.max_recv_frag, rep_both)
1747 self.assertEquals(rep.u.assoc_group_id, rep.u.assoc_group_id)
1748 self.assertEquals(rep.u.secondary_address_size, 0)
1749 self.assertEquals(len(rep.u._pad1), 2)
1750 #self.assertEquals(rep.u._pad1, '\0' * 2)
1751 self.assertEquals(rep.u.num_results, 1)
1752 self.assertEquals(rep.u.ctx_list[0].result,
1753 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1754 self.assertEquals(rep.u.ctx_list[0].reason,
1755 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1756 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1757 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1759 chunk_size = rep_both - dcerpc.DCERPC_REQUEST_LENGTH
1760 req = self.generate_request(call_id=2,
1761 context_id=ctx1.context_id,
1763 alloc_hint=0xffffffff,
1764 stub=b"\00" * chunk_size)
1765 self.send_pdu(req, ndr_print=True, hexdump=True)
1766 rep = self.recv_pdu(ndr_print=True, hexdump=True)
1767 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1769 self.assertNotEquals(rep.u.alloc_hint, 0)
1770 self.assertEquals(rep.u.context_id, req.u.context_id)
1771 self.assertEquals(rep.u.cancel_count, 0)
1772 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1774 chunk_size = 5840 - dcerpc.DCERPC_REQUEST_LENGTH
1775 req = self.generate_request(call_id=2,
1776 context_id=ctx1.context_id,
1778 alloc_hint=0xffffffff,
1779 stub=b"\00" * chunk_size)
1781 rep = self.recv_pdu()
1782 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1784 self.assertNotEquals(rep.u.alloc_hint, 0)
1785 self.assertEquals(rep.u.context_id, req.u.context_id)
1786 self.assertEquals(rep.u.cancel_count, 0)
1787 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1790 req = self.generate_request(call_id=3,
1791 context_id=ctx1.context_id,
1793 alloc_hint=0xffffffff,
1794 stub=b"\00" * chunk_size)
1796 rep = self.recv_pdu()
1798 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
1800 self.assertNotEquals(rep.u.alloc_hint, 0)
1801 self.assertEquals(rep.u.context_id, 0)
1802 self.assertEquals(rep.u.cancel_count, 0)
1803 self.assertEquals(rep.u.flags, 0)
1804 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
1805 self.assertEquals(rep.u.reserved, 0)
1806 self.assertEquals(len(rep.u.error_and_verifier), 0)
1808 # wait for a disconnect
1809 rep = self.recv_pdu()
1810 self.assertIsNone(rep)
1811 self.assertNotConnected()
1813 def test_neg_xmit_ffff_ffff(self):
1814 return self._test_neg_xmit_check_values(req_xmit=0xffff,
1818 def test_neg_xmit_0_ffff(self):
1819 return self._test_neg_xmit_check_values(req_xmit=0,
1825 def test_neg_xmit_ffff_0(self):
1826 return self._test_neg_xmit_check_values(req_xmit=0xffff,
1830 def test_neg_xmit_0_0(self):
1831 return self._test_neg_xmit_check_values(req_xmit=0,
1837 def test_neg_xmit_3199_0(self):
1838 return self._test_neg_xmit_check_values(req_xmit=3199,
1842 def test_neg_xmit_0_3199(self):
1843 return self._test_neg_xmit_check_values(req_xmit=0,
1847 def test_neg_xmit_3199_ffff(self):
1848 return self._test_neg_xmit_check_values(req_xmit=3199,
1852 def test_neg_xmit_ffff_3199(self):
1853 return self._test_neg_xmit_check_values(req_xmit=0xffff,
1857 def test_alloc_hint(self):
1858 ndr32 = base.transfer_syntax_ndr()
1861 ctx = dcerpc.ctx_list()
1863 ctx.num_transfer_syntaxes = len(tsf1_list)
1864 ctx.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
1865 ctx.transfer_syntaxes = tsf1_list
1867 req = self.generate_bind(call_id=0,
1870 rep = self.recv_pdu()
1871 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id,
1873 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
1874 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
1875 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
1876 self.assertEquals(rep.u.secondary_address_size, 4)
1877 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
1878 self.assertEquals(len(rep.u._pad1), 2)
1879 self.assertEquals(rep.u._pad1, b'\0' * 2)
1880 self.assertEquals(rep.u.num_results, 1)
1881 self.assertEquals(rep.u.ctx_list[0].result,
1882 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
1883 self.assertEquals(rep.u.ctx_list[0].reason,
1884 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
1885 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
1886 self.assertEquals(rep.u.auth_info, b'\0' * 0)
1888 # And now try a request without auth_info
1889 req = self.generate_request(call_id=2,
1890 context_id=ctx.context_id,
1892 alloc_hint=0xffffffff,
1895 rep = self.recv_pdu()
1896 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1898 self.assertNotEquals(rep.u.alloc_hint, 0)
1899 self.assertEquals(rep.u.context_id, req.u.context_id)
1900 self.assertEquals(rep.u.cancel_count, 0)
1901 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1903 req = self.generate_request(call_id=3,
1904 context_id=ctx.context_id,
1906 alloc_hint=0xffffffff,
1907 stub=b"\04\00\00\00\00\00\00\00")
1909 rep = self.recv_pdu()
1910 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1912 self.assertNotEquals(rep.u.alloc_hint, 0)
1913 self.assertEquals(rep.u.context_id, req.u.context_id)
1914 self.assertEquals(rep.u.cancel_count, 0)
1915 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1917 req = self.generate_request(call_id=4,
1918 context_id=ctx.context_id,
1921 stub=b"\04\00\00\00\00\00\00\00")
1923 rep = self.recv_pdu()
1924 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
1926 self.assertNotEquals(rep.u.alloc_hint, 0)
1927 self.assertEquals(rep.u.context_id, req.u.context_id)
1928 self.assertEquals(rep.u.cancel_count, 0)
1929 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
1931 def _get_netlogon_ctx(self):
1932 abstract = samba.dcerpc.netlogon.abstract_syntax()
1933 ndr32 = base.transfer_syntax_ndr()
1935 (ctx, ack) = self.prepare_presentation(abstract, ndr32, context_id=0,
1936 epmap=True, return_ack=True)
1938 server = '\\\\' + self.target_hostname
1939 if isinstance(server, binary_type):
1940 server_utf16 = server.decode('utf-8').encode('utf-16-le')
1942 server_utf16 = server.encode('utf-16-le')
1943 computer = 'UNKNOWNCOMPUTER'
1944 if isinstance(server, binary_type):
1945 computer_utf16 = computer.decode('utf-8').encode('utf-16-le')
1947 computer_utf16 = computer.encode('utf-16-le')
1949 real_stub = struct.pack('<IIII', 0x00200000,
1950 len(server) + 1, 0, len(server) + 1)
1951 real_stub += server_utf16 + b'\x00\x00'
1952 mod_len = len(real_stub) % 4
1954 real_stub += b'\x00' * (4 - mod_len)
1955 real_stub += struct.pack('<III',
1956 len(computer) + 1, 0, len(computer) + 1)
1957 real_stub += computer_utf16 + b'\x00\x00'
1958 real_stub += b'\x11\x22\x33\x44\x55\x66\x77\x88'
1960 return (ctx, ack, real_stub)
1962 def _test_fragmented_requests(self, remaining=None, alloc_hint=None,
1963 fault_first=None, fault_last=None):
1964 (ctx, rep, real_stub) = self._get_netlogon_ctx()
1966 chunk = rep.u.max_recv_frag - dcerpc.DCERPC_REQUEST_LENGTH
1970 while remaining > 0:
1971 thistime = min(remaining, chunk)
1972 remaining -= thistime
1977 pfc_flags |= dcerpc.DCERPC_PFC_FLAG_FIRST
1979 stub = real_stub + b'\x00' * (thistime - len(real_stub))
1981 stub = b"\x00" * thistime
1984 pfc_flags |= dcerpc.DCERPC_PFC_FLAG_LAST
1986 # And now try a request without auth_info
1987 # netr_ServerReqChallenge()
1988 req = self.generate_request(call_id=0x21234,
1989 pfc_flags=pfc_flags,
1990 context_id=ctx.context_id,
1992 alloc_hint=alloc_hint,
1994 if alloc_hint >= thistime:
1995 alloc_hint -= thistime
1998 self.send_pdu(req, hexdump=False)
1999 if fault_first is not None:
2000 rep = self.recv_pdu()
2001 # We get a fault back
2002 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2004 self.assertNotEquals(rep.u.alloc_hint, 0)
2005 self.assertEquals(rep.u.context_id, req.u.context_id)
2006 self.assertEquals(rep.u.cancel_count, 0)
2007 self.assertEquals(rep.u.flags, 0)
2008 self.assertEquals(rep.u.status, fault_first)
2009 self.assertEquals(rep.u.reserved, 0)
2010 self.assertEquals(len(rep.u.error_and_verifier), 0)
2012 # wait for a disconnect
2013 rep = self.recv_pdu()
2014 self.assertIsNone(rep)
2015 self.assertNotConnected()
2019 if total >= 0x400000 and fault_last is not None:
2020 rep = self.recv_pdu()
2021 # We get a fault back
2022 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2024 self.assertNotEquals(rep.u.alloc_hint, 0)
2025 self.assertEquals(rep.u.context_id, req.u.context_id)
2026 self.assertEquals(rep.u.cancel_count, 0)
2027 self.assertEquals(rep.u.flags, 0)
2028 self.assertEquals(rep.u.status, fault_last)
2029 self.assertEquals(rep.u.reserved, 0)
2030 self.assertEquals(len(rep.u.error_and_verifier), 0)
2032 # wait for a disconnect
2033 rep = self.recv_pdu()
2034 self.assertIsNone(rep)
2035 self.assertNotConnected()
2037 rep = self.recv_pdu(timeout=0.01)
2038 self.assertIsNone(rep)
2039 self.assertIsConnected()
2041 if total >= 0x400000 and fault_last is not None:
2042 rep = self.recv_pdu()
2043 # We get a fault back
2044 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2046 self.assertNotEquals(rep.u.alloc_hint, 0)
2047 self.assertEquals(rep.u.context_id, req.u.context_id)
2048 self.assertEquals(rep.u.cancel_count, 0)
2049 self.assertEquals(rep.u.flags, 0)
2050 self.assertEquals(rep.u.status, fault_last)
2051 self.assertEquals(rep.u.reserved, 0)
2052 self.assertEquals(len(rep.u.error_and_verifier), 0)
2054 # wait for a disconnect
2055 rep = self.recv_pdu()
2056 self.assertIsNone(rep)
2057 self.assertNotConnected()
2059 rep = self.recv_pdu()
2060 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2062 self.assertNotEquals(rep.u.alloc_hint, 0)
2063 self.assertEquals(rep.u.context_id, req.u.context_id)
2064 self.assertEquals(rep.u.cancel_count, 0)
2065 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2067 self.assertEquals(len(rep.u.stub_and_verifier), 12)
2068 status = struct.unpack_from("<I", rep.u.stub_and_verifier, len(rep.u.stub_and_verifier) - 4)
2069 self.assertEquals(status[0], 0)
2071 def test_fragmented_requests01(self):
2072 return self._test_fragmented_requests(remaining=0x400000,
2073 alloc_hint=0x400000)
2075 def test_fragmented_requests02(self):
2076 return self._test_fragmented_requests(remaining=0x400000,
2077 alloc_hint=0x100000)
2079 def test_fragmented_requests03(self):
2080 return self._test_fragmented_requests(remaining=0x400000,
2083 def test_fragmented_requests04(self):
2084 return self._test_fragmented_requests(remaining=0x400000,
2085 alloc_hint=0x400001,
2086 fault_first=dcerpc.DCERPC_FAULT_ACCESS_DENIED)
2088 def test_fragmented_requests05(self):
2089 return self._test_fragmented_requests(remaining=0x500001,
2091 fault_last=dcerpc.DCERPC_FAULT_ACCESS_DENIED)
2093 def _test_same_requests(self, pfc_flags, fault_1st=False, fault_2nd=False):
2094 (ctx, rep, real_stub) = self._get_netlogon_ctx()
2096 # netr_ServerReqChallenge with given flags
2097 req = self.generate_request(call_id=2,
2098 pfc_flags=pfc_flags,
2099 context_id=ctx.context_id,
2104 rep = self.recv_pdu()
2105 # We get a fault back
2106 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2108 self.assertNotEquals(rep.u.alloc_hint, 0)
2109 self.assertEquals(rep.u.context_id, 0)
2110 self.assertEquals(rep.u.cancel_count, 0)
2111 self.assertEquals(rep.u.flags, 0)
2112 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2113 self.assertEquals(rep.u.reserved, 0)
2114 self.assertEquals(len(rep.u.error_and_verifier), 0)
2116 # wait for a disconnect
2117 rep = self.recv_pdu()
2118 self.assertIsNone(rep)
2119 self.assertNotConnected()
2121 rep = self.recv_pdu(timeout=0.1)
2122 self.assertIsNone(rep)
2123 self.assertIsConnected()
2125 # netr_ServerReqChallenge without DCERPC_PFC_FLAG_LAST
2126 # with the same call_id
2127 req = self.generate_request(call_id=2,
2128 pfc_flags=pfc_flags,
2129 context_id=ctx.context_id,
2134 rep = self.recv_pdu()
2135 # We get a fault back
2136 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2138 self.assertNotEquals(rep.u.alloc_hint, 0)
2139 self.assertEquals(rep.u.context_id, req.u.context_id)
2140 self.assertEquals(rep.u.cancel_count, 0)
2141 self.assertEquals(rep.u.flags, 0)
2142 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2143 self.assertEquals(rep.u.reserved, 0)
2144 self.assertEquals(len(rep.u.error_and_verifier), 0)
2146 # wait for a disconnect
2147 rep = self.recv_pdu()
2148 self.assertIsNone(rep)
2149 self.assertNotConnected()
2152 rep = self.recv_pdu(timeout=0.1)
2153 self.assertIsNone(rep)
2154 self.assertIsConnected()
2156 def test_first_only_requests(self):
2157 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2160 def test_none_only_requests(self):
2161 return self._test_same_requests(pfc_flags=0, fault_1st=True)
2163 def test_last_only_requests(self):
2164 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST,
2167 def test_first_maybe_requests(self):
2168 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2169 dcerpc.DCERPC_PFC_FLAG_MAYBE,
2172 def test_first_didnot_requests(self):
2173 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2174 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
2177 def test_first_cmpx_requests(self):
2178 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2179 dcerpc.DCERPC_PFC_FLAG_CONC_MPX,
2182 def test_first_08_requests(self):
2183 return self._test_same_requests(pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2187 def test_first_cancel_requests(self):
2188 (ctx, rep, real_stub) = self._get_netlogon_ctx()
2190 # netr_ServerReqChallenge with given flags
2191 req = self.generate_request(call_id=2,
2192 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2193 dcerpc.DCERPC_PFC_FLAG_PENDING_CANCEL,
2194 context_id=ctx.context_id,
2198 rep = self.recv_pdu()
2199 # We get a fault back
2200 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2201 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2202 dcerpc.DCERPC_PFC_FLAG_LAST |
2203 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
2205 self.assertNotEquals(rep.u.alloc_hint, 0)
2206 self.assertEquals(rep.u.context_id, 0)
2207 self.assertEquals(rep.u.cancel_count, 0)
2208 self.assertEquals(rep.u.flags, 0)
2209 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_NO_CALL_ACTIVE)
2210 self.assertEquals(rep.u.reserved, 0)
2211 self.assertEquals(len(rep.u.error_and_verifier), 0)
2213 # wait for a disconnect
2214 rep = self.recv_pdu()
2215 self.assertIsNone(rep)
2216 self.assertNotConnected()
2218 def test_2nd_cancel_requests(self):
2219 (ctx, rep, real_stub) = self._get_netlogon_ctx()
2221 # netr_ServerReqChallenge with given flags
2222 req = self.generate_request(call_id=2,
2223 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2224 context_id=ctx.context_id,
2228 rep = self.recv_pdu(timeout=0.1)
2229 self.assertIsNone(rep)
2230 self.assertIsConnected()
2232 # netr_ServerReqChallenge with given flags
2233 req = self.generate_request(call_id=2,
2234 pfc_flags=dcerpc.DCERPC_PFC_FLAG_PENDING_CANCEL,
2235 context_id=ctx.context_id,
2239 rep = self.recv_pdu(timeout=0.1)
2240 self.assertIsNone(rep)
2241 self.assertIsConnected()
2243 # netr_ServerReqChallenge with given flags
2244 req = self.generate_request(call_id=2,
2245 pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST,
2246 context_id=ctx.context_id,
2250 rep = self.recv_pdu()
2251 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2253 self.assertNotEquals(rep.u.alloc_hint, 0)
2254 self.assertEquals(rep.u.context_id, req.u.context_id)
2255 self.assertEquals(rep.u.cancel_count, 0)
2256 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2258 self.assertEquals(len(rep.u.stub_and_verifier), 12)
2259 status = struct.unpack_from("<I", rep.u.stub_and_verifier, len(rep.u.stub_and_verifier) - 4)
2260 self.assertEquals(status[0], 0)
2262 def test_last_cancel_requests(self):
2263 (ctx, rep, real_stub) = self._get_netlogon_ctx()
2265 # netr_ServerReqChallenge with given flags
2266 req = self.generate_request(call_id=2,
2267 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2268 context_id=ctx.context_id,
2272 rep = self.recv_pdu(timeout=0.1)
2273 self.assertIsNone(rep)
2274 self.assertIsConnected()
2276 # netr_ServerReqChallenge with given flags
2277 req = self.generate_request(call_id=2,
2278 pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST |
2279 dcerpc.DCERPC_PFC_FLAG_PENDING_CANCEL,
2280 context_id=ctx.context_id,
2284 rep = self.recv_pdu()
2285 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2287 self.assertNotEquals(rep.u.alloc_hint, 0)
2288 self.assertEquals(rep.u.context_id, req.u.context_id)
2289 self.assertEquals(rep.u.cancel_count, 0)
2290 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2292 self.assertEquals(len(rep.u.stub_and_verifier), 12)
2293 status = struct.unpack_from("<I", rep.u.stub_and_verifier, len(rep.u.stub_and_verifier) - 4)
2294 self.assertEquals(status[0], 0)
2296 def test_mix_requests(self):
2297 (ctx, rep, real_stub) = self._get_netlogon_ctx()
2299 # netr_ServerReqChallenge with given flags
2300 req = self.generate_request(call_id=50,
2301 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2302 context_id=ctx.context_id,
2306 rep = self.recv_pdu(timeout=0.1)
2307 self.assertIsNone(rep)
2308 self.assertIsConnected()
2310 # netr_ServerReqChallenge with given flags
2311 req = self.generate_request(call_id=51,
2312 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2313 context_id=ctx.context_id,
2317 rep = self.recv_pdu()
2318 # We get a fault back
2319 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, 50,
2320 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST |
2321 dcerpc.DCERPC_PFC_FLAG_LAST,
2323 self.assertNotEquals(rep.u.alloc_hint, 0)
2324 self.assertEquals(rep.u.context_id, req.u.context_id)
2325 self.assertEquals(rep.u.cancel_count, 0)
2326 self.assertEquals(rep.u.flags, 0)
2327 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2328 self.assertEquals(rep.u.reserved, 0)
2329 self.assertEquals(len(rep.u.error_and_verifier), 0)
2331 def test_co_cancel_no_request(self):
2332 ndr32 = base.transfer_syntax_ndr()
2333 abstract = samba.dcerpc.mgmt.abstract_syntax()
2334 ctx = self.prepare_presentation(abstract, ndr32, context_id=0xff)
2336 req = self.generate_co_cancel(call_id=3)
2338 rep = self.recv_pdu(timeout=0.01)
2339 self.assertIsNone(rep)
2340 self.assertIsConnected()
2342 # And now try a request
2343 req = self.generate_request(call_id=1,
2344 context_id=ctx.context_id,
2348 rep = self.recv_pdu()
2349 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2351 self.assertNotEquals(rep.u.alloc_hint, 0)
2352 self.assertEquals(rep.u.context_id, req.u.context_id)
2353 self.assertEquals(rep.u.cancel_count, 0)
2354 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2356 def test_co_cancel_request_after_first(self):
2357 ndr32 = base.transfer_syntax_ndr()
2358 abstract = samba.dcerpc.mgmt.abstract_syntax()
2359 ctx = self.prepare_presentation(abstract, ndr32, context_id=0xff)
2361 req = self.generate_request(call_id=1,
2362 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2363 context_id=ctx.context_id,
2367 rep = self.recv_pdu(timeout=0.01)
2368 self.assertIsNone(rep)
2369 self.assertIsConnected()
2371 req = self.generate_co_cancel(call_id=1)
2373 rep = self.recv_pdu(timeout=0.01)
2374 self.assertIsNone(rep)
2375 self.assertIsConnected()
2377 req = self.generate_request(call_id=1,
2378 pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST,
2379 context_id=ctx.context_id,
2383 rep = self.recv_pdu()
2384 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2386 self.assertNotEquals(rep.u.alloc_hint, 0)
2387 self.assertEquals(rep.u.context_id, req.u.context_id)
2388 self.assertEquals(rep.u.cancel_count, 0)
2389 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2391 # And now try a request
2392 req = self.generate_request(call_id=2,
2393 context_id=ctx.context_id,
2397 rep = self.recv_pdu()
2398 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2400 self.assertNotEquals(rep.u.alloc_hint, 0)
2401 self.assertEquals(rep.u.context_id, req.u.context_id)
2402 self.assertEquals(rep.u.cancel_count, 0)
2403 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2405 def test_orphaned_no_request(self):
2406 ndr32 = base.transfer_syntax_ndr()
2407 abstract = samba.dcerpc.mgmt.abstract_syntax()
2408 ctx = self.prepare_presentation(abstract, ndr32)
2410 req = self.generate_orphaned(call_id=3)
2412 rep = self.recv_pdu(timeout=0.01)
2413 self.assertIsNone(rep)
2414 self.assertIsConnected()
2416 # And now try a request
2417 req = self.generate_request(call_id=1,
2418 context_id=ctx.context_id,
2422 rep = self.recv_pdu()
2423 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2425 self.assertNotEquals(rep.u.alloc_hint, 0)
2426 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2427 self.assertEquals(rep.u.cancel_count, 0)
2428 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2430 def test_orphaned_request_after_first_last(self):
2431 ndr32 = base.transfer_syntax_ndr()
2432 abstract = samba.dcerpc.mgmt.abstract_syntax()
2433 ctx = self.prepare_presentation(abstract, ndr32)
2435 req = self.generate_request(call_id=1,
2436 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2437 context_id=ctx.context_id,
2441 rep = self.recv_pdu(timeout=0.1)
2442 self.assertIsNone(rep)
2443 self.assertIsConnected()
2445 req = self.generate_orphaned(call_id=1)
2447 rep = self.recv_pdu(timeout=0.1)
2448 self.assertIsNone(rep)
2449 self.assertIsConnected()
2451 req = self.generate_request(call_id=1,
2452 pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST,
2453 context_id=ctx.context_id,
2457 rep = self.recv_pdu()
2458 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2460 self.assertNotEquals(rep.u.alloc_hint, 0)
2461 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2462 self.assertEquals(rep.u.cancel_count, 0)
2463 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2465 # And now try a request
2466 req = self.generate_request(call_id=2,
2467 context_id=ctx.context_id,
2471 rep = self.recv_pdu()
2472 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2474 self.assertNotEquals(rep.u.alloc_hint, 0)
2475 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2476 self.assertEquals(rep.u.cancel_count, 0)
2477 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2479 def test_orphaned_request_after_first_mpx_last(self):
2480 ndr32 = base.transfer_syntax_ndr()
2481 abstract = samba.dcerpc.mgmt.abstract_syntax()
2483 pfc_flags = samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_FIRST
2484 pfc_flags |= samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_LAST
2485 pfc_flags |= samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_CONC_MPX
2486 ctx = self.prepare_presentation(abstract, ndr32, pfc_flags=pfc_flags)
2488 req = self.generate_request(call_id=1,
2489 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2490 context_id=ctx.context_id,
2494 rep = self.recv_pdu(timeout=0.1)
2495 self.assertIsNone(rep)
2496 self.assertIsConnected()
2498 req = self.generate_orphaned(call_id=1)
2500 rep = self.recv_pdu(timeout=0.1)
2501 self.assertIsNone(rep)
2502 self.assertIsConnected()
2504 req = self.generate_request(call_id=1,
2505 pfc_flags=dcerpc.DCERPC_PFC_FLAG_LAST,
2506 context_id=ctx.context_id,
2510 rep = self.recv_pdu()
2511 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2513 self.assertNotEquals(rep.u.alloc_hint, 0)
2514 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2515 self.assertEquals(rep.u.cancel_count, 0)
2516 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2518 # And now try a request
2519 req = self.generate_request(call_id=2,
2520 context_id=ctx.context_id,
2524 rep = self.recv_pdu()
2525 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2527 self.assertNotEquals(rep.u.alloc_hint, 0)
2528 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2529 self.assertEquals(rep.u.cancel_count, 0)
2530 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2532 def test_orphaned_request_after_first_no_last(self):
2533 ndr32 = base.transfer_syntax_ndr()
2534 abstract = samba.dcerpc.mgmt.abstract_syntax()
2535 ctx = self.prepare_presentation(abstract, ndr32)
2537 req1 = self.generate_request(call_id=1,
2538 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2539 context_id=ctx.context_id,
2543 rep = self.recv_pdu(timeout=0.1)
2544 self.assertIsNone(rep)
2545 self.assertIsConnected()
2547 req = self.generate_orphaned(call_id=1)
2549 rep = self.recv_pdu(timeout=0.1)
2550 self.assertIsNone(rep)
2551 self.assertIsConnected()
2553 # And now try a new request
2554 req2 = self.generate_request(call_id=2,
2555 context_id=ctx.context_id,
2559 rep = self.recv_pdu()
2560 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req1.call_id,
2562 self.assertNotEquals(rep.u.alloc_hint, 0)
2563 self.assertEquals(rep.u.context_id, req1.u.context_id)
2564 self.assertEquals(rep.u.cancel_count, 0)
2565 self.assertEquals(rep.u.flags, 0)
2566 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2567 self.assertEquals(rep.u.reserved, 0)
2568 self.assertEquals(len(rep.u.error_and_verifier), 0)
2570 # wait for a disconnect
2571 rep = self.recv_pdu()
2572 self.assertIsNone(rep)
2573 self.assertNotConnected()
2575 def test_orphaned_request_after_first_mpx_no_last(self):
2576 ndr32 = base.transfer_syntax_ndr()
2577 abstract = samba.dcerpc.mgmt.abstract_syntax()
2579 pfc_flags = samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_FIRST
2580 pfc_flags |= samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_LAST
2581 pfc_flags |= samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_CONC_MPX
2582 ctx = self.prepare_presentation(abstract, ndr32,
2583 pfc_flags=pfc_flags)
2585 req1 = self.generate_request(call_id=1,
2586 pfc_flags=dcerpc.DCERPC_PFC_FLAG_FIRST,
2587 context_id=ctx.context_id,
2591 rep = self.recv_pdu(timeout=0.1)
2592 self.assertIsNone(rep)
2593 self.assertIsConnected()
2595 req = self.generate_orphaned(call_id=1)
2597 rep = self.recv_pdu(timeout=0.1)
2598 self.assertIsNone(rep)
2599 self.assertIsConnected()
2601 # And now try a new request
2602 req2 = self.generate_request(call_id=2,
2603 context_id=ctx.context_id - 1,
2607 rep = self.recv_pdu()
2608 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req2.call_id,
2610 self.assertNotEquals(rep.u.alloc_hint, 0)
2611 self.assertEquals(rep.u.context_id, 0)
2612 self.assertEquals(rep.u.cancel_count, 0)
2613 self.assertEquals(rep.u.flags, 0)
2614 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2615 self.assertEquals(rep.u.reserved, 0)
2616 self.assertEquals(len(rep.u.error_and_verifier), 0)
2618 # wait for a disconnect
2619 rep = self.recv_pdu()
2620 self.assertIsNone(rep)
2621 self.assertNotConnected()
2623 def test_spnego_connect_request(self):
2624 ndr32 = base.transfer_syntax_ndr()
2627 ctx1 = dcerpc.ctx_list()
2629 ctx1.num_transfer_syntaxes = len(tsf1_list)
2630 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
2631 ctx1.transfer_syntaxes = tsf1_list
2634 c = self.get_anon_creds()
2635 g = gensec.Security.start_client(self.settings)
2636 g.set_credentials(c)
2637 g.want_feature(gensec.FEATURE_DCE_STYLE)
2638 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
2639 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
2641 g.start_mech_by_authtype(auth_type, auth_level)
2643 (finished, to_server) = g.update(from_server)
2644 self.assertFalse(finished)
2646 auth_info = self.generate_auth(auth_type=auth_type,
2647 auth_level=auth_level,
2648 auth_context_id=auth_context_id,
2649 auth_blob=to_server)
2651 req = self.generate_bind(call_id=0,
2653 auth_info=auth_info)
2656 rep = self.recv_pdu()
2657 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
2658 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
2659 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
2660 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
2661 self.assertEquals(rep.u.secondary_address_size, 4)
2662 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
2663 self.assertEquals(len(rep.u._pad1), 2)
2664 self.assertEquals(rep.u._pad1, b'\0' * 2)
2665 self.assertEquals(rep.u.num_results, 1)
2666 self.assertEquals(rep.u.ctx_list[0].result,
2667 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
2668 self.assertEquals(rep.u.ctx_list[0].reason,
2669 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
2670 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
2671 self.assertNotEquals(len(rep.u.auth_info), 0)
2672 a = self.parse_auth(rep.u.auth_info)
2674 from_server = a.credentials
2675 (finished, to_server) = g.update(from_server)
2676 self.assertFalse(finished)
2678 auth_info = self.generate_auth(auth_type=auth_type,
2679 auth_level=auth_level,
2680 auth_context_id=auth_context_id,
2681 auth_blob=to_server)
2683 req = self.generate_alter(call_id=0,
2685 assoc_group_id=rep.u.assoc_group_id,
2686 auth_info=auth_info)
2689 rep = self.recv_pdu()
2690 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id)
2691 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
2692 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
2693 self.assertEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
2694 self.assertEquals(rep.u.secondary_address_size, 0)
2695 self.assertEquals(len(rep.u._pad1), 2)
2696 # Windows sends garbage
2697 #self.assertEquals(rep.u._pad1, '\0' * 2)
2698 self.assertEquals(rep.u.num_results, 1)
2699 self.assertEquals(rep.u.ctx_list[0].result,
2700 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
2701 self.assertEquals(rep.u.ctx_list[0].reason,
2702 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
2703 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
2704 self.assertNotEquals(len(rep.u.auth_info), 0)
2705 a = self.parse_auth(rep.u.auth_info)
2707 from_server = a.credentials
2708 (finished, to_server) = g.update(from_server)
2709 self.assertTrue(finished)
2711 # And now try a request without auth_info
2712 req = self.generate_request(call_id=2,
2713 context_id=ctx1.context_id,
2717 rep = self.recv_pdu()
2718 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2720 self.assertNotEquals(rep.u.alloc_hint, 0)
2721 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2722 self.assertEquals(rep.u.cancel_count, 0)
2723 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2725 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
2726 auth_info = self.generate_auth(auth_type=auth_type,
2727 auth_level=auth_level,
2728 auth_context_id=auth_context_id,
2729 auth_blob=b"\x01" +b"\x00" *15)
2730 req = self.generate_request(call_id=3,
2731 context_id=ctx1.context_id,
2734 auth_info=auth_info)
2736 rep = self.recv_pdu()
2737 # We don't get an auth_info back
2738 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
2740 self.assertNotEquals(rep.u.alloc_hint, 0)
2741 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
2742 self.assertEquals(rep.u.cancel_count, 0)
2743 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
2745 # Now a request with auth_info DCERPC_AUTH_LEVEL_INTEGRITY
2746 auth_info = self.generate_auth(auth_type=auth_type,
2747 auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
2748 auth_context_id=auth_context_id,
2749 auth_blob=b"\x01" + b"\x00" * 15)
2750 req = self.generate_request(call_id=4,
2751 context_id=ctx1.context_id,
2754 auth_info=auth_info)
2756 rep = self.recv_pdu()
2757 # We get a fault back
2758 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2760 self.assertNotEquals(rep.u.alloc_hint, 0)
2761 self.assertEquals(rep.u.context_id, req.u.context_id)
2762 self.assertEquals(rep.u.cancel_count, 0)
2763 self.assertEquals(rep.u.flags, 0)
2764 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
2765 self.assertEquals(rep.u.reserved, 0)
2766 self.assertEquals(len(rep.u.error_and_verifier), 0)
2768 # wait for a disconnect
2769 rep = self.recv_pdu()
2770 self.assertIsNone(rep)
2771 self.assertNotConnected()
2773 def test_spnego_integrity_request(self):
2774 ndr32 = base.transfer_syntax_ndr()
2777 ctx1 = dcerpc.ctx_list()
2779 ctx1.num_transfer_syntaxes = len(tsf1_list)
2780 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
2781 ctx1.transfer_syntaxes = tsf1_list
2784 c = self.get_anon_creds()
2785 g = gensec.Security.start_client(self.settings)
2786 g.set_credentials(c)
2787 g.want_feature(gensec.FEATURE_DCE_STYLE)
2788 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
2789 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
2791 g.start_mech_by_authtype(auth_type, auth_level)
2793 (finished, to_server) = g.update(from_server)
2794 self.assertFalse(finished)
2796 auth_info = self.generate_auth(auth_type=auth_type,
2797 auth_level=auth_level,
2798 auth_context_id=auth_context_id,
2799 auth_blob=to_server)
2801 req = self.generate_bind(call_id=0,
2803 auth_info=auth_info)
2806 rep = self.recv_pdu()
2807 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
2808 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
2809 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
2810 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
2811 self.assertEquals(rep.u.secondary_address_size, 4)
2812 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
2813 self.assertEquals(len(rep.u._pad1), 2)
2814 self.assertEquals(rep.u._pad1, b'\0' * 2)
2815 self.assertEquals(rep.u.num_results, 1)
2816 self.assertEquals(rep.u.ctx_list[0].result,
2817 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
2818 self.assertEquals(rep.u.ctx_list[0].reason,
2819 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
2820 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
2821 self.assertNotEquals(len(rep.u.auth_info), 0)
2822 a = self.parse_auth(rep.u.auth_info)
2824 from_server = a.credentials
2825 (finished, to_server) = g.update(from_server)
2826 self.assertFalse(finished)
2828 auth_info = self.generate_auth(auth_type=auth_type,
2829 auth_level=auth_level,
2830 auth_context_id=auth_context_id,
2831 auth_blob=to_server)
2833 req = self.generate_alter(call_id=0,
2835 assoc_group_id=rep.u.assoc_group_id,
2836 auth_info=auth_info)
2839 rep = self.recv_pdu()
2840 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id)
2841 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
2842 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
2843 self.assertEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
2844 self.assertEquals(rep.u.secondary_address_size, 0)
2845 self.assertEquals(len(rep.u._pad1), 2)
2846 # Windows sends garbage
2847 #self.assertEquals(rep.u._pad1, '\0' * 2)
2848 self.assertEquals(rep.u.num_results, 1)
2849 self.assertEquals(rep.u.ctx_list[0].result,
2850 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
2851 self.assertEquals(rep.u.ctx_list[0].reason,
2852 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
2853 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
2854 self.assertNotEquals(len(rep.u.auth_info), 0)
2855 a = self.parse_auth(rep.u.auth_info)
2857 from_server = a.credentials
2858 (finished, to_server) = g.update(from_server)
2859 self.assertTrue(finished)
2861 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
2862 auth_info = self.generate_auth(auth_type=auth_type,
2863 auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
2864 auth_context_id=auth_context_id,
2865 auth_blob=b"\x01" + b"\x00" * 15)
2866 req = self.generate_request(call_id=3,
2867 context_id=ctx1.context_id,
2870 auth_info=auth_info)
2872 rep = self.recv_pdu()
2873 # We get a fault back
2874 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2876 self.assertNotEquals(rep.u.alloc_hint, 0)
2877 self.assertEquals(rep.u.context_id, req.u.context_id)
2878 self.assertEquals(rep.u.cancel_count, 0)
2879 self.assertEquals(rep.u.flags, 0)
2880 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
2881 self.assertEquals(rep.u.reserved, 0)
2882 self.assertEquals(len(rep.u.error_and_verifier), 0)
2884 # wait for a disconnect
2885 rep = self.recv_pdu()
2886 self.assertIsNone(rep)
2887 self.assertNotConnected()
2889 def test_spnego_unfinished_request(self):
2890 ndr32 = base.transfer_syntax_ndr()
2893 ctx1 = dcerpc.ctx_list()
2895 ctx1.num_transfer_syntaxes = len(tsf1_list)
2896 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
2897 ctx1.transfer_syntaxes = tsf1_list
2900 c = self.get_anon_creds()
2901 g = gensec.Security.start_client(self.settings)
2902 g.set_credentials(c)
2903 g.want_feature(gensec.FEATURE_DCE_STYLE)
2904 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
2905 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
2907 g.start_mech_by_authtype(auth_type, auth_level)
2909 (finished, to_server) = g.update(from_server)
2910 self.assertFalse(finished)
2912 auth_info = self.generate_auth(auth_type=auth_type,
2913 auth_level=auth_level,
2914 auth_context_id=auth_context_id,
2915 auth_blob=to_server)
2917 req = self.generate_bind(call_id=0,
2919 auth_info=auth_info)
2922 rep = self.recv_pdu()
2923 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
2924 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
2925 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
2926 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
2927 assoc_group_id = rep.u.assoc_group_id
2928 self.assertEquals(rep.u.secondary_address_size, 4)
2929 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
2930 self.assertEquals(len(rep.u._pad1), 2)
2931 self.assertEquals(rep.u._pad1, b'\0' * 2)
2932 self.assertEquals(rep.u.num_results, 1)
2933 self.assertEquals(rep.u.ctx_list[0].result,
2934 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
2935 self.assertEquals(rep.u.ctx_list[0].reason,
2936 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
2937 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
2938 self.assertNotEquals(len(rep.u.auth_info), 0)
2939 a = self.parse_auth(rep.u.auth_info)
2941 from_server = a.credentials
2942 (finished, to_server) = g.update(from_server)
2943 self.assertFalse(finished)
2945 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
2946 auth_info = self.generate_auth(auth_type=auth_type,
2947 auth_level=auth_level,
2948 auth_context_id=auth_context_id,
2949 auth_blob=b"\x01" + b"\x00" * 15)
2950 req = self.generate_request(call_id=1,
2951 context_id=ctx1.context_id,
2954 auth_info=auth_info)
2956 rep = self.recv_pdu()
2958 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
2959 pfc_flags=req.pfc_flags |
2960 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
2962 self.assertNotEquals(rep.u.alloc_hint, 0)
2963 self.assertEquals(rep.u.context_id, 0)
2964 self.assertEquals(rep.u.cancel_count, 0)
2965 self.assertEquals(rep.u.flags, 0)
2966 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
2967 self.assertEquals(rep.u.reserved, 0)
2968 self.assertEquals(len(rep.u.error_and_verifier), 0)
2970 # wait for a disconnect
2971 rep = self.recv_pdu()
2972 self.assertIsNone(rep)
2973 self.assertNotConnected()
2975 def test_spnego_auth3(self):
2976 ndr32 = base.transfer_syntax_ndr()
2979 ctx1 = dcerpc.ctx_list()
2981 ctx1.num_transfer_syntaxes = len(tsf1_list)
2982 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
2983 ctx1.transfer_syntaxes = tsf1_list
2986 c = self.get_anon_creds()
2987 g = gensec.Security.start_client(self.settings)
2988 g.set_credentials(c)
2989 g.want_feature(gensec.FEATURE_DCE_STYLE)
2990 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
2991 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
2993 g.start_mech_by_authtype(auth_type, auth_level)
2995 (finished, to_server) = g.update(from_server)
2996 self.assertFalse(finished)
2998 auth_info = self.generate_auth(auth_type=auth_type,
2999 auth_level=auth_level,
3000 auth_context_id=auth_context_id,
3001 auth_blob=to_server)
3002 req = self.generate_bind(call_id=0,
3004 auth_info=auth_info)
3006 rep = self.recv_pdu()
3007 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3008 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3009 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3010 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3011 self.assertEquals(rep.u.secondary_address_size, 4)
3012 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3013 self.assertEquals(len(rep.u._pad1), 2)
3014 #self.assertEquals(rep.u._pad1, '\0' * 2)
3015 self.assertEquals(rep.u.num_results, 1)
3016 self.assertEquals(rep.u.ctx_list[0].result,
3017 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3018 self.assertEquals(rep.u.ctx_list[0].reason,
3019 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3020 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3021 self.assertNotEquals(len(rep.u.auth_info), 0)
3022 a = self.parse_auth(rep.u.auth_info)
3024 from_server = a.credentials
3025 (finished, to_server) = g.update(from_server)
3026 self.assertFalse(finished)
3028 auth_info = self.generate_auth(auth_type=auth_type,
3029 auth_level=auth_level,
3030 auth_context_id=auth_context_id,
3031 auth_blob=to_server)
3032 req = self.generate_auth3(call_id=0,
3033 auth_info=auth_info)
3035 rep = self.recv_pdu()
3036 self.assertIsNone(rep)
3037 self.assertIsConnected()
3039 # And now try a request without auth_info
3040 req = self.generate_request(call_id=2,
3041 context_id=ctx1.context_id,
3045 rep = self.recv_pdu()
3046 # We get a fault back
3047 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3049 self.assertNotEquals(rep.u.alloc_hint, 0)
3050 self.assertEquals(rep.u.context_id, req.u.context_id)
3051 self.assertEquals(rep.u.cancel_count, 0)
3052 self.assertEquals(rep.u.flags, 0)
3053 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
3054 self.assertEquals(rep.u.reserved, 0)
3055 self.assertEquals(len(rep.u.error_and_verifier), 0)
3057 # wait for a disconnect
3058 rep = self.recv_pdu()
3059 self.assertIsNone(rep)
3060 self.assertNotConnected()
3062 def test_spnego_connect_reauth_alter(self):
3063 ndr32 = base.transfer_syntax_ndr()
3064 ndr64 = base.transfer_syntax_ndr64()
3067 ctx1 = dcerpc.ctx_list()
3069 ctx1.num_transfer_syntaxes = len(tsf1_list)
3070 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3071 ctx1.transfer_syntaxes = tsf1_list
3074 c = self.get_anon_creds()
3075 g = gensec.Security.start_client(self.settings)
3076 g.set_credentials(c)
3077 g.want_feature(gensec.FEATURE_DCE_STYLE)
3078 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3079 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
3081 g.start_mech_by_authtype(auth_type, auth_level)
3083 (finished, to_server) = g.update(from_server)
3084 self.assertFalse(finished)
3086 auth_info = self.generate_auth(auth_type=auth_type,
3087 auth_level=auth_level,
3088 auth_context_id=auth_context_id,
3089 auth_blob=to_server)
3091 req = self.generate_bind(call_id=0,
3093 auth_info=auth_info)
3096 rep = self.recv_pdu()
3097 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3098 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3099 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3100 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3101 self.assertEquals(rep.u.secondary_address_size, 4)
3102 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3103 self.assertEquals(len(rep.u._pad1), 2)
3104 self.assertEquals(rep.u._pad1, b'\0' * 2)
3105 self.assertEquals(rep.u.num_results, 1)
3106 self.assertEquals(rep.u.ctx_list[0].result,
3107 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3108 self.assertEquals(rep.u.ctx_list[0].reason,
3109 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3110 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3111 self.assertNotEquals(len(rep.u.auth_info), 0)
3112 a = self.parse_auth(rep.u.auth_info)
3114 from_server = a.credentials
3115 (finished, to_server) = g.update(from_server)
3116 self.assertFalse(finished)
3118 auth_info = self.generate_auth(auth_type=auth_type,
3119 auth_level=auth_level,
3120 auth_context_id=auth_context_id,
3121 auth_blob=to_server)
3122 req = self.generate_alter(call_id=0,
3124 assoc_group_id=rep.u.assoc_group_id,
3125 auth_info=auth_info)
3127 rep = self.recv_pdu()
3128 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id)
3129 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3130 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3131 self.assertEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3132 self.assertEquals(rep.u.secondary_address_size, 0)
3133 self.assertEquals(len(rep.u._pad1), 2)
3134 # Windows sends garbage
3135 #self.assertEquals(rep.u._pad1, '\0' * 2)
3136 self.assertEquals(rep.u.num_results, 1)
3137 self.assertEquals(rep.u.ctx_list[0].result,
3138 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3139 self.assertEquals(rep.u.ctx_list[0].reason,
3140 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3141 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3142 self.assertNotEquals(len(rep.u.auth_info), 0)
3143 a = self.parse_auth(rep.u.auth_info)
3145 from_server = a.credentials
3146 (finished, to_server) = g.update(from_server)
3147 self.assertTrue(finished)
3149 # And now try a request without auth_info
3150 req = self.generate_request(call_id=2,
3151 context_id=ctx1.context_id,
3155 rep = self.recv_pdu()
3156 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
3158 self.assertNotEquals(rep.u.alloc_hint, 0)
3159 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
3160 self.assertEquals(rep.u.cancel_count, 0)
3161 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
3163 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
3164 auth_info = self.generate_auth(auth_type=auth_type,
3165 auth_level=auth_level,
3166 auth_context_id=auth_context_id,
3167 auth_blob=b"\x01" + b"\x00" * 15)
3168 req = self.generate_request(call_id=3,
3169 context_id=ctx1.context_id,
3172 auth_info=auth_info)
3174 rep = self.recv_pdu()
3175 # We don't get an auth_info back
3176 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
3178 self.assertNotEquals(rep.u.alloc_hint, 0)
3179 self.assertEquals(rep.u.context_id, req.u.context_id)
3180 self.assertEquals(rep.u.cancel_count, 0)
3181 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
3185 g = gensec.Security.start_client(self.settings)
3186 g.set_credentials(c)
3187 g.want_feature(gensec.FEATURE_DCE_STYLE)
3188 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3189 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
3191 g.start_mech_by_authtype(auth_type, auth_level)
3193 (finished, to_server) = g.update(from_server)
3194 self.assertFalse(finished)
3196 auth_info = self.generate_auth(auth_type=auth_type,
3197 auth_level=auth_level,
3198 auth_context_id=auth_context_id,
3199 auth_blob=to_server)
3200 req = self.generate_alter(call_id=0,
3202 auth_info=auth_info)
3204 rep = self.recv_pdu()
3206 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3207 pfc_flags=req.pfc_flags |
3208 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3210 self.assertNotEquals(rep.u.alloc_hint, 0)
3211 self.assertEquals(rep.u.context_id, 0)
3212 self.assertEquals(rep.u.cancel_count, 0)
3213 self.assertEquals(rep.u.flags, 0)
3214 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
3215 self.assertEquals(rep.u.reserved, 0)
3216 self.assertEquals(len(rep.u.error_and_verifier), 0)
3218 # wait for a disconnect
3219 rep = self.recv_pdu()
3220 self.assertIsNone(rep)
3221 self.assertNotConnected()
3223 def test_spnego_connect_reauth_auth3(self):
3224 ndr32 = base.transfer_syntax_ndr()
3225 ndr64 = base.transfer_syntax_ndr64()
3228 ctx1 = dcerpc.ctx_list()
3230 ctx1.num_transfer_syntaxes = len(tsf1_list)
3231 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3232 ctx1.transfer_syntaxes = tsf1_list
3235 c = self.get_anon_creds()
3236 g = gensec.Security.start_client(self.settings)
3237 g.set_credentials(c)
3238 g.want_feature(gensec.FEATURE_DCE_STYLE)
3239 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3240 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
3242 g.start_mech_by_authtype(auth_type, auth_level)
3244 (finished, to_server) = g.update(from_server)
3245 self.assertFalse(finished)
3247 auth_info = self.generate_auth(auth_type=auth_type,
3248 auth_level=auth_level,
3249 auth_context_id=auth_context_id,
3250 auth_blob=to_server)
3252 req = self.generate_bind(call_id=0,
3254 auth_info=auth_info)
3257 rep = self.recv_pdu()
3258 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3259 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3260 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3261 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3262 self.assertEquals(rep.u.secondary_address_size, 4)
3263 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3264 self.assertEquals(len(rep.u._pad1), 2)
3265 self.assertEquals(rep.u._pad1, b'\0' * 2)
3266 self.assertEquals(rep.u.num_results, 1)
3267 self.assertEquals(rep.u.ctx_list[0].result,
3268 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3269 self.assertEquals(rep.u.ctx_list[0].reason,
3270 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3271 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3272 self.assertNotEquals(len(rep.u.auth_info), 0)
3273 a = self.parse_auth(rep.u.auth_info)
3275 from_server = a.credentials
3276 (finished, to_server) = g.update(from_server)
3277 self.assertFalse(finished)
3279 auth_info = self.generate_auth(auth_type=auth_type,
3280 auth_level=auth_level,
3281 auth_context_id=auth_context_id,
3282 auth_blob=to_server)
3283 req = self.generate_alter(call_id=0,
3285 assoc_group_id=rep.u.assoc_group_id,
3286 auth_info=auth_info)
3288 rep = self.recv_pdu()
3289 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id)
3290 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3291 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3292 self.assertEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3293 self.assertEquals(rep.u.secondary_address_size, 0)
3294 self.assertEquals(len(rep.u._pad1), 2)
3295 # Windows sends garbage
3296 #self.assertEquals(rep.u._pad1, '\0' * 2)
3297 self.assertEquals(rep.u.num_results, 1)
3298 self.assertEquals(rep.u.ctx_list[0].result,
3299 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3300 self.assertEquals(rep.u.ctx_list[0].reason,
3301 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3302 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3303 self.assertNotEquals(len(rep.u.auth_info), 0)
3304 a = self.parse_auth(rep.u.auth_info)
3306 from_server = a.credentials
3307 (finished, to_server) = g.update(from_server)
3308 self.assertTrue(finished)
3310 # And now try a request without auth_info
3311 req = self.generate_request(call_id=2,
3312 context_id=ctx1.context_id,
3316 rep = self.recv_pdu()
3317 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
3319 self.assertNotEquals(rep.u.alloc_hint, 0)
3320 self.assertEquals(rep.u.context_id, req.u.context_id)
3321 self.assertEquals(rep.u.cancel_count, 0)
3322 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
3324 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
3325 auth_info = self.generate_auth(auth_type=auth_type,
3326 auth_level=auth_level,
3327 auth_context_id=auth_context_id,
3328 auth_blob=b"\x01" + b"\x00" * 15)
3329 req = self.generate_request(call_id=3,
3330 context_id=ctx1.context_id,
3333 auth_info=auth_info)
3335 rep = self.recv_pdu()
3336 # We don't get an auth_info back
3337 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
3339 self.assertNotEquals(rep.u.alloc_hint, 0)
3340 self.assertEquals(rep.u.context_id, req.u.context_id)
3341 self.assertEquals(rep.u.cancel_count, 0)
3342 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
3346 g = gensec.Security.start_client(self.settings)
3347 g.set_credentials(c)
3348 g.want_feature(gensec.FEATURE_DCE_STYLE)
3349 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3350 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
3352 g.start_mech_by_authtype(auth_type, auth_level)
3354 (finished, to_server) = g.update(from_server)
3355 self.assertFalse(finished)
3357 auth_info = self.generate_auth(auth_type=auth_type,
3358 auth_level=auth_level,
3359 auth_context_id=auth_context_id,
3360 auth_blob=to_server)
3361 req = self.generate_auth3(call_id=0,
3362 auth_info=auth_info)
3364 rep = self.recv_pdu()
3366 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3367 pfc_flags=req.pfc_flags |
3368 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3370 self.assertNotEquals(rep.u.alloc_hint, 0)
3371 self.assertEquals(rep.u.context_id, 0)
3372 self.assertEquals(rep.u.cancel_count, 0)
3373 self.assertEquals(rep.u.flags, 0)
3374 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
3375 self.assertEquals(rep.u.reserved, 0)
3376 self.assertEquals(len(rep.u.error_and_verifier), 0)
3378 # wait for a disconnect
3379 rep = self.recv_pdu()
3380 self.assertIsNone(rep)
3381 self.assertNotConnected()
3383 def test_spnego_change_auth_level(self):
3384 ndr32 = base.transfer_syntax_ndr()
3387 ctx1 = dcerpc.ctx_list()
3389 ctx1.num_transfer_syntaxes = len(tsf1_list)
3390 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3391 ctx1.transfer_syntaxes = tsf1_list
3393 c = self.get_anon_creds()
3394 g = gensec.Security.start_client(self.settings)
3395 g.set_credentials(c)
3396 g.want_feature(gensec.FEATURE_DCE_STYLE)
3397 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3398 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3400 g.start_mech_by_authtype(auth_type, auth_level)
3402 (finished, to_server) = g.update(from_server)
3403 self.assertFalse(finished)
3405 auth_info = self.generate_auth(auth_type=auth_type,
3406 auth_level=auth_level,
3407 auth_context_id=auth_context_id,
3408 auth_blob=to_server)
3409 req = self.generate_bind(call_id=0,
3411 auth_info=auth_info)
3413 rep = self.recv_pdu()
3414 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3415 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3416 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3417 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3418 self.assertEquals(rep.u.secondary_address_size, 4)
3419 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3420 self.assertEquals(len(rep.u._pad1), 2)
3421 self.assertEquals(rep.u._pad1, b'\0' * 2)
3422 self.assertEquals(rep.u.num_results, 1)
3423 self.assertEquals(rep.u.ctx_list[0].result,
3424 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3425 self.assertEquals(rep.u.ctx_list[0].reason,
3426 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3427 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3428 self.assertNotEquals(len(rep.u.auth_info), 0)
3429 a = self.parse_auth(rep.u.auth_info)
3431 from_server = a.credentials
3432 (finished, to_server) = g.update(from_server)
3433 self.assertFalse(finished)
3435 auth_info = self.generate_auth(auth_type=auth_type,
3436 auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
3437 auth_context_id=auth_context_id,
3438 auth_blob=to_server)
3439 req = self.generate_alter(call_id=0,
3441 assoc_group_id=rep.u.assoc_group_id,
3442 auth_info=auth_info)
3444 rep = self.recv_pdu()
3445 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3446 pfc_flags=req.pfc_flags |
3447 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3449 self.assertNotEquals(rep.u.alloc_hint, 0)
3450 self.assertEquals(rep.u.context_id, 0)
3451 self.assertEquals(rep.u.cancel_count, 0)
3452 self.assertEquals(rep.u.flags, 0)
3453 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
3454 self.assertEquals(rep.u.reserved, 0)
3455 self.assertEquals(len(rep.u.error_and_verifier), 0)
3457 # wait for a disconnect
3458 rep = self.recv_pdu()
3459 self.assertIsNone(rep)
3460 self.assertNotConnected()
3462 def test_spnego_change_abstract(self):
3463 ndr32 = base.transfer_syntax_ndr()
3466 ctx1 = dcerpc.ctx_list()
3468 ctx1.num_transfer_syntaxes = len(tsf1_list)
3469 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3470 ctx1.transfer_syntaxes = tsf1_list
3472 ctx1b = dcerpc.ctx_list()
3473 ctx1b.context_id = 1
3474 ctx1b.num_transfer_syntaxes = len(tsf1_list)
3475 ctx1b.abstract_syntax = samba.dcerpc.epmapper.abstract_syntax()
3476 ctx1b.transfer_syntaxes = tsf1_list
3478 c = self.get_anon_creds()
3479 g = gensec.Security.start_client(self.settings)
3480 g.set_credentials(c)
3481 g.want_feature(gensec.FEATURE_DCE_STYLE)
3482 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3483 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3485 g.start_mech_by_authtype(auth_type, auth_level)
3487 (finished, to_server) = g.update(from_server)
3488 self.assertFalse(finished)
3490 auth_info = self.generate_auth(auth_type=auth_type,
3491 auth_level=auth_level,
3492 auth_context_id=auth_context_id,
3493 auth_blob=to_server)
3494 req = self.generate_bind(call_id=0,
3496 auth_info=auth_info)
3498 rep = self.recv_pdu()
3499 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3500 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3501 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3502 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3503 self.assertEquals(rep.u.secondary_address_size, 4)
3504 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3505 self.assertEquals(len(rep.u._pad1), 2)
3506 #self.assertEquals(rep.u._pad1, '\0' * 2)
3507 self.assertEquals(rep.u.num_results, 1)
3508 self.assertEquals(rep.u.ctx_list[0].result,
3509 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3510 self.assertEquals(rep.u.ctx_list[0].reason,
3511 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3512 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3513 self.assertNotEquals(len(rep.u.auth_info), 0)
3514 a = self.parse_auth(rep.u.auth_info)
3516 from_server = a.credentials
3517 (finished, to_server) = g.update(from_server)
3518 self.assertFalse(finished)
3520 auth_info = self.generate_auth(auth_type=auth_type,
3521 auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
3522 auth_context_id=auth_context_id,
3523 auth_blob=to_server)
3524 req = self.generate_alter(call_id=0,
3526 assoc_group_id=rep.u.assoc_group_id,
3527 auth_info=auth_info)
3529 rep = self.recv_pdu()
3530 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3531 pfc_flags=req.pfc_flags |
3532 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3534 self.assertNotEquals(rep.u.alloc_hint, 0)
3535 self.assertEquals(rep.u.context_id, 0)
3536 self.assertEquals(rep.u.cancel_count, 0)
3537 self.assertEquals(rep.u.flags, 0)
3538 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
3539 self.assertEquals(rep.u.reserved, 0)
3540 self.assertEquals(len(rep.u.error_and_verifier), 0)
3542 # wait for a disconnect
3543 rep = self.recv_pdu()
3544 self.assertIsNone(rep)
3545 self.assertNotConnected()
3547 def test_spnego_change_transfer(self):
3548 ndr32 = base.transfer_syntax_ndr()
3549 ndr64 = base.transfer_syntax_ndr64()
3552 ctx1 = dcerpc.ctx_list()
3554 ctx1.num_transfer_syntaxes = len(tsf1_list)
3555 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3556 ctx1.transfer_syntaxes = tsf1_list
3558 tsf1b_list = [ndr32, ndr64]
3559 ctx1b = dcerpc.ctx_list()
3560 ctx1b.context_id = 1
3561 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
3562 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3563 ctx1b.transfer_syntaxes = tsf1b_list
3565 c = self.get_anon_creds()
3566 g = gensec.Security.start_client(self.settings)
3567 g.set_credentials(c)
3568 g.want_feature(gensec.FEATURE_DCE_STYLE)
3569 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3570 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3572 g.start_mech_by_authtype(auth_type, auth_level)
3574 (finished, to_server) = g.update(from_server)
3575 self.assertFalse(finished)
3577 auth_info = self.generate_auth(auth_type=auth_type,
3578 auth_level=auth_level,
3579 auth_context_id=auth_context_id,
3580 auth_blob=to_server)
3581 req = self.generate_bind(call_id=0,
3583 auth_info=auth_info)
3585 rep = self.recv_pdu()
3586 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3587 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3588 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3589 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3590 self.assertEquals(rep.u.secondary_address_size, 4)
3591 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3592 self.assertEquals(len(rep.u._pad1), 2)
3593 #self.assertEquals(rep.u._pad1, '\0' * 2)
3594 self.assertEquals(rep.u.num_results, 1)
3595 self.assertEquals(rep.u.ctx_list[0].result,
3596 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3597 self.assertEquals(rep.u.ctx_list[0].reason,
3598 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3599 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3600 self.assertNotEquals(len(rep.u.auth_info), 0)
3601 a = self.parse_auth(rep.u.auth_info)
3603 from_server = a.credentials
3604 (finished, to_server) = g.update(from_server)
3605 self.assertFalse(finished)
3607 # We change ctx_list and auth_level
3608 auth_info = self.generate_auth(auth_type=auth_type,
3609 auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
3610 auth_context_id=auth_context_id,
3611 auth_blob=to_server)
3612 req = self.generate_alter(call_id=0,
3614 assoc_group_id=rep.u.assoc_group_id,
3615 auth_info=auth_info)
3617 rep = self.recv_pdu()
3618 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3619 pfc_flags=req.pfc_flags |
3620 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3622 self.assertNotEquals(rep.u.alloc_hint, 0)
3623 self.assertEquals(rep.u.context_id, 0)
3624 self.assertEquals(rep.u.cancel_count, 0)
3625 self.assertEquals(rep.u.flags, 0)
3626 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
3627 self.assertEquals(rep.u.reserved, 0)
3628 self.assertEquals(len(rep.u.error_and_verifier), 0)
3630 # wait for a disconnect
3631 rep = self.recv_pdu()
3632 self.assertIsNone(rep)
3633 self.assertNotConnected()
3635 def test_spnego_change_auth_type1(self):
3636 ndr32 = base.transfer_syntax_ndr()
3637 ndr64 = base.transfer_syntax_ndr64()
3640 ctx1 = dcerpc.ctx_list()
3642 ctx1.num_transfer_syntaxes = len(tsf1_list)
3643 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3644 ctx1.transfer_syntaxes = tsf1_list
3646 c = self.get_anon_creds()
3647 g = gensec.Security.start_client(self.settings)
3648 g.set_credentials(c)
3649 g.want_feature(gensec.FEATURE_DCE_STYLE)
3650 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3651 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3653 g.start_mech_by_authtype(auth_type, auth_level)
3655 (finished, to_server) = g.update(from_server)
3656 self.assertFalse(finished)
3658 auth_info = self.generate_auth(auth_type=auth_type,
3659 auth_level=auth_level,
3660 auth_context_id=auth_context_id,
3661 auth_blob=to_server)
3662 req = self.generate_bind(call_id=0,
3664 auth_info=auth_info)
3666 rep = self.recv_pdu()
3667 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3668 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3669 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3670 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3671 self.assertEquals(rep.u.secondary_address_size, 4)
3672 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3673 self.assertEquals(len(rep.u._pad1), 2)
3674 #self.assertEquals(rep.u._pad1, '\0' * 2)
3675 self.assertEquals(rep.u.num_results, 1)
3676 self.assertEquals(rep.u.ctx_list[0].result,
3677 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3678 self.assertEquals(rep.u.ctx_list[0].reason,
3679 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3680 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3681 self.assertNotEquals(len(rep.u.auth_info), 0)
3682 a = self.parse_auth(rep.u.auth_info)
3684 from_server = a.credentials
3685 (finished, to_server) = g.update(from_server)
3686 self.assertFalse(finished)
3688 # We change ctx_list and auth_level
3689 auth_info = self.generate_auth(auth_type=dcerpc.DCERPC_AUTH_TYPE_KRB5,
3690 auth_level=auth_level,
3691 auth_context_id=auth_context_id,
3692 auth_blob=to_server)
3693 req = self.generate_alter(call_id=0,
3695 assoc_group_id=rep.u.assoc_group_id,
3696 auth_info=auth_info)
3698 rep = self.recv_pdu()
3699 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3700 pfc_flags=req.pfc_flags |
3701 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3703 self.assertNotEquals(rep.u.alloc_hint, 0)
3704 self.assertEquals(rep.u.context_id, 0)
3705 self.assertEquals(rep.u.cancel_count, 0)
3706 self.assertEquals(rep.u.flags, 0)
3707 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_SEC_PKG_ERROR)
3708 self.assertEquals(rep.u.reserved, 0)
3709 self.assertEquals(len(rep.u.error_and_verifier), 0)
3711 # wait for a disconnect
3712 rep = self.recv_pdu()
3713 self.assertIsNone(rep)
3714 self.assertNotConnected()
3716 def test_spnego_change_auth_type2(self):
3717 ndr32 = base.transfer_syntax_ndr()
3718 ndr64 = base.transfer_syntax_ndr64()
3721 ctx1 = dcerpc.ctx_list()
3723 ctx1.num_transfer_syntaxes = len(tsf1_list)
3724 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3725 ctx1.transfer_syntaxes = tsf1_list
3727 tsf1b_list = [ndr32, ndr64]
3728 ctx1b = dcerpc.ctx_list()
3729 ctx1b.context_id = 1
3730 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
3731 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3732 ctx1b.transfer_syntaxes = tsf1b_list
3734 c = self.get_anon_creds()
3735 g = gensec.Security.start_client(self.settings)
3736 g.set_credentials(c)
3737 g.want_feature(gensec.FEATURE_DCE_STYLE)
3738 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3739 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3741 g.start_mech_by_authtype(auth_type, auth_level)
3743 (finished, to_server) = g.update(from_server)
3744 self.assertFalse(finished)
3746 auth_info = self.generate_auth(auth_type=auth_type,
3747 auth_level=auth_level,
3748 auth_context_id=auth_context_id,
3749 auth_blob=to_server)
3750 req = self.generate_bind(call_id=0,
3752 auth_info=auth_info)
3754 rep = self.recv_pdu()
3755 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3756 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3757 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3758 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3759 self.assertEquals(rep.u.secondary_address_size, 4)
3760 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3761 self.assertEquals(len(rep.u._pad1), 2)
3762 #self.assertEquals(rep.u._pad1, '\0' * 2)
3763 self.assertEquals(rep.u.num_results, 1)
3764 self.assertEquals(rep.u.ctx_list[0].result,
3765 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3766 self.assertEquals(rep.u.ctx_list[0].reason,
3767 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3768 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3769 self.assertNotEquals(len(rep.u.auth_info), 0)
3770 a = self.parse_auth(rep.u.auth_info)
3772 from_server = a.credentials
3773 (finished, to_server) = g.update(from_server)
3774 self.assertFalse(finished)
3776 # We change ctx_list and auth_level
3777 auth_info = self.generate_auth(auth_type=dcerpc.DCERPC_AUTH_TYPE_KRB5,
3778 auth_level=auth_level,
3779 auth_context_id=auth_context_id,
3780 auth_blob=to_server)
3781 req = self.generate_alter(call_id=0,
3783 assoc_group_id=rep.u.assoc_group_id,
3784 auth_info=auth_info)
3786 rep = self.recv_pdu()
3787 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3788 pfc_flags=req.pfc_flags |
3789 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3791 self.assertNotEquals(rep.u.alloc_hint, 0)
3792 self.assertEquals(rep.u.context_id, 0)
3793 self.assertEquals(rep.u.cancel_count, 0)
3794 self.assertEquals(rep.u.flags, 0)
3795 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
3796 self.assertEquals(rep.u.reserved, 0)
3797 self.assertEquals(len(rep.u.error_and_verifier), 0)
3799 # wait for a disconnect
3800 rep = self.recv_pdu()
3801 self.assertIsNone(rep)
3802 self.assertNotConnected()
3804 def test_spnego_change_auth_type3(self):
3805 ndr32 = base.transfer_syntax_ndr()
3806 ndr64 = base.transfer_syntax_ndr64()
3809 ctx1 = dcerpc.ctx_list()
3811 ctx1.num_transfer_syntaxes = len(tsf1_list)
3812 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3813 ctx1.transfer_syntaxes = tsf1_list
3815 tsf1b_list = [ndr32, ndr64]
3816 ctx1b = dcerpc.ctx_list()
3817 ctx1b.context_id = 1
3818 ctx1b.num_transfer_syntaxes = len(tsf1b_list)
3819 ctx1b.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3820 ctx1b.transfer_syntaxes = tsf1b_list
3822 c = self.get_anon_creds()
3823 g = gensec.Security.start_client(self.settings)
3824 g.set_credentials(c)
3825 g.want_feature(gensec.FEATURE_DCE_STYLE)
3826 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3827 auth_level = dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY
3829 g.start_mech_by_authtype(auth_type, auth_level)
3831 (finished, to_server) = g.update(from_server)
3832 self.assertFalse(finished)
3834 auth_info = self.generate_auth(auth_type=auth_type,
3835 auth_level=auth_level,
3836 auth_context_id=auth_context_id,
3837 auth_blob=to_server)
3838 req = self.generate_bind(call_id=0,
3840 auth_info=auth_info)
3842 rep = self.recv_pdu()
3843 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3844 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3845 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3846 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3847 self.assertEquals(rep.u.secondary_address_size, 4)
3848 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3849 self.assertEquals(len(rep.u._pad1), 2)
3850 #self.assertEquals(rep.u._pad1, '\0' * 2)
3851 self.assertEquals(rep.u.num_results, 1)
3852 self.assertEquals(rep.u.ctx_list[0].result,
3853 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3854 self.assertEquals(rep.u.ctx_list[0].reason,
3855 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3856 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3857 self.assertNotEquals(len(rep.u.auth_info), 0)
3858 a = self.parse_auth(rep.u.auth_info)
3860 from_server = a.credentials
3861 (finished, to_server) = g.update(from_server)
3862 self.assertFalse(finished)
3864 # We change ctx_list and auth_level
3865 auth_info = self.generate_auth(auth_type=dcerpc.DCERPC_AUTH_TYPE_NONE,
3866 auth_level=auth_level,
3867 auth_context_id=auth_context_id,
3868 auth_blob=to_server)
3869 req = self.generate_alter(call_id=0,
3871 assoc_group_id=rep.u.assoc_group_id,
3872 auth_info=auth_info)
3874 rep = self.recv_pdu()
3875 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
3876 pfc_flags=req.pfc_flags |
3877 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
3879 self.assertNotEquals(rep.u.alloc_hint, 0)
3880 self.assertEquals(rep.u.context_id, 0)
3881 self.assertEquals(rep.u.cancel_count, 0)
3882 self.assertEquals(rep.u.flags, 0)
3883 self.assertEquals(rep.u.status, dcerpc.DCERPC_FAULT_ACCESS_DENIED)
3884 self.assertEquals(rep.u.reserved, 0)
3885 self.assertEquals(len(rep.u.error_and_verifier), 0)
3887 # wait for a disconnect
3888 rep = self.recv_pdu()
3889 self.assertIsNone(rep)
3890 self.assertNotConnected()
3892 def test_spnego_auth_pad_ok(self):
3893 ndr32 = base.transfer_syntax_ndr()
3896 ctx1 = dcerpc.ctx_list()
3898 ctx1.num_transfer_syntaxes = len(tsf1_list)
3899 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
3900 ctx1.transfer_syntaxes = tsf1_list
3903 c = self.get_anon_creds()
3904 g = gensec.Security.start_client(self.settings)
3905 g.set_credentials(c)
3906 g.want_feature(gensec.FEATURE_DCE_STYLE)
3907 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
3908 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
3910 g.start_mech_by_authtype(auth_type, auth_level)
3912 (finished, to_server) = g.update(from_server)
3913 self.assertFalse(finished)
3915 auth_info = self.generate_auth(auth_type=auth_type,
3916 auth_level=auth_level,
3917 auth_context_id=auth_context_id,
3918 auth_blob=to_server)
3920 req = self.generate_bind(call_id=0,
3922 auth_info=auth_info)
3923 req_pdu = samba.ndr.ndr_pack(req)
3925 auth_pad_ok = len(req_pdu)
3926 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
3927 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
3928 auth_pad_ok -= len(to_server)
3930 auth_info = self.generate_auth(auth_type=auth_type,
3931 auth_level=auth_level,
3932 auth_context_id=auth_context_id,
3933 auth_pad_length=auth_pad_ok,
3934 auth_blob=to_server)
3936 req = self.generate_bind(call_id=0,
3938 auth_info=auth_info)
3940 rep = self.recv_pdu()
3941 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
3942 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3943 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3944 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3945 self.assertEquals(rep.u.secondary_address_size, 4)
3946 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
3947 self.assertEquals(len(rep.u._pad1), 2)
3948 #self.assertEquals(rep.u._pad1, '\0' * 2)
3949 self.assertEquals(rep.u.num_results, 1)
3950 self.assertEquals(rep.u.ctx_list[0].result,
3951 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3952 self.assertEquals(rep.u.ctx_list[0].reason,
3953 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
3954 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
3955 self.assertNotEquals(len(rep.u.auth_info), 0)
3956 a = self.parse_auth(rep.u.auth_info)
3958 from_server = a.credentials
3959 (finished, to_server) = g.update(from_server)
3960 self.assertFalse(finished)
3962 auth_info = self.generate_auth(auth_type=auth_type,
3963 auth_level=auth_level,
3964 auth_context_id=auth_context_id,
3965 auth_blob=to_server)
3966 req = self.generate_alter(call_id=0,
3968 assoc_group_id=rep.u.assoc_group_id,
3969 auth_info=auth_info)
3970 req_pdu = samba.ndr.ndr_pack(req)
3972 auth_pad_ok = len(req_pdu)
3973 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
3974 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
3975 auth_pad_ok -= len(to_server)
3976 auth_info = self.generate_auth(auth_type=auth_type,
3977 auth_level=auth_level,
3978 auth_context_id=auth_context_id,
3979 auth_pad_length=auth_pad_ok,
3980 auth_blob=to_server)
3981 req = self.generate_alter(call_id=0,
3983 assoc_group_id=rep.u.assoc_group_id,
3984 auth_info=auth_info)
3986 rep = self.recv_pdu()
3987 self.verify_pdu(rep, dcerpc.DCERPC_PKT_ALTER_RESP, req.call_id)
3988 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
3989 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
3990 self.assertEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
3991 self.assertEquals(rep.u.secondary_address_size, 0)
3992 self.assertEquals(len(rep.u._pad1), 2)
3993 # Windows sends garbage
3994 #self.assertEquals(rep.u._pad1, '\0' * 2)
3995 self.assertEquals(rep.u.num_results, 1)
3996 self.assertEquals(rep.u.ctx_list[0].result,
3997 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
3998 self.assertEquals(rep.u.ctx_list[0].reason,
3999 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
4000 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
4001 self.assertNotEquals(len(rep.u.auth_info), 0)
4002 a = self.parse_auth(rep.u.auth_info)
4004 from_server = a.credentials
4005 (finished, to_server) = g.update(from_server)
4006 self.assertTrue(finished)
4008 # And now try a request without auth_info
4009 req = self.generate_request(call_id=2,
4010 context_id=ctx1.context_id,
4014 rep = self.recv_pdu()
4015 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4017 self.assertNotEquals(rep.u.alloc_hint, 0)
4018 self.assertEquals(rep.u.context_id, req.u.context_id)
4019 self.assertEquals(rep.u.cancel_count, 0)
4020 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4022 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
4023 auth_info = self.generate_auth(auth_type=auth_type,
4024 auth_level=auth_level,
4025 auth_context_id=auth_context_id,
4026 auth_blob=b"\x01" + b"\x00" * 15)
4027 req = self.generate_request(call_id=3,
4028 context_id=ctx1.context_id,
4031 auth_info=auth_info)
4033 rep = self.recv_pdu()
4034 # We don't get an auth_info back
4035 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4037 self.assertNotEquals(rep.u.alloc_hint, 0)
4038 self.assertEquals(rep.u.context_id, req.u.context_id)
4039 self.assertEquals(rep.u.cancel_count, 0)
4040 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4042 self._disconnect("disconnect")
4043 self.assertNotConnected()
4045 def test_spnego_auth_pad_fail_bind(self):
4046 ndr32 = base.transfer_syntax_ndr()
4049 ctx1 = dcerpc.ctx_list()
4051 ctx1.num_transfer_syntaxes = len(tsf1_list)
4052 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4053 ctx1.transfer_syntaxes = tsf1_list
4056 c = self.get_anon_creds()
4057 g = gensec.Security.start_client(self.settings)
4058 g.set_credentials(c)
4059 g.want_feature(gensec.FEATURE_DCE_STYLE)
4060 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
4061 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
4063 g.start_mech_by_authtype(auth_type, auth_level)
4065 (finished, to_server) = g.update(from_server)
4066 self.assertFalse(finished)
4068 auth_info = self.generate_auth(auth_type=auth_type,
4069 auth_level=auth_level,
4070 auth_context_id=auth_context_id,
4071 auth_blob=to_server)
4073 req = self.generate_bind(call_id=0,
4075 auth_info=auth_info)
4076 req_pdu = samba.ndr.ndr_pack(req)
4078 auth_pad_ok = len(req_pdu)
4079 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
4080 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4081 auth_pad_ok -= len(to_server)
4082 auth_pad_bad = auth_pad_ok + 1
4083 auth_info = self.generate_auth(auth_type=auth_type,
4084 auth_level=auth_level,
4085 auth_context_id=auth_context_id,
4086 auth_pad_length=auth_pad_bad,
4087 auth_blob=to_server)
4089 req = self.generate_bind(call_id=0,
4091 auth_info=auth_info)
4093 rep = self.recv_pdu()
4094 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_NAK, req.call_id,
4096 self.assertEquals(rep.u.reject_reason,
4097 dcerpc.DCERPC_BIND_NAK_REASON_PROTOCOL_VERSION_NOT_SUPPORTED)
4098 self.assertEquals(rep.u.num_versions, 1)
4099 self.assertEquals(rep.u.versions[0].rpc_vers, req.rpc_vers)
4100 self.assertEquals(rep.u.versions[0].rpc_vers_minor, req.rpc_vers_minor)
4101 self.assertEquals(len(rep.u._pad), 3)
4102 self.assertEquals(rep.u._pad, b'\0' * 3)
4104 # wait for a disconnect
4105 rep = self.recv_pdu()
4106 self.assertIsNone(rep)
4107 self.assertNotConnected()
4109 def test_spnego_auth_pad_fail_alter(self):
4110 ndr32 = base.transfer_syntax_ndr()
4113 ctx1 = dcerpc.ctx_list()
4115 ctx1.num_transfer_syntaxes = len(tsf1_list)
4116 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4117 ctx1.transfer_syntaxes = tsf1_list
4120 c = self.get_anon_creds()
4121 g = gensec.Security.start_client(self.settings)
4122 g.set_credentials(c)
4123 g.want_feature(gensec.FEATURE_DCE_STYLE)
4124 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
4125 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
4127 g.start_mech_by_authtype(auth_type, auth_level)
4129 (finished, to_server) = g.update(from_server)
4130 self.assertFalse(finished)
4132 auth_info = self.generate_auth(auth_type=auth_type,
4133 auth_level=auth_level,
4134 auth_context_id=auth_context_id,
4135 auth_blob=to_server)
4137 req = self.generate_bind(call_id=0,
4139 auth_info=auth_info)
4140 req_pdu = samba.ndr.ndr_pack(req)
4142 auth_pad_ok = len(req_pdu)
4143 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
4144 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4145 auth_pad_ok -= len(to_server)
4147 auth_info = self.generate_auth(auth_type=auth_type,
4148 auth_level=auth_level,
4149 auth_context_id=auth_context_id,
4150 auth_pad_length=auth_pad_ok,
4151 auth_blob=to_server)
4153 req = self.generate_bind(call_id=0,
4155 auth_info=auth_info)
4157 rep = self.recv_pdu()
4158 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
4159 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
4160 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
4161 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
4162 self.assertEquals(rep.u.secondary_address_size, 4)
4163 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
4164 self.assertEquals(len(rep.u._pad1), 2)
4165 #self.assertEquals(rep.u._pad1, '\0' * 2)
4166 self.assertEquals(rep.u.num_results, 1)
4167 self.assertEquals(rep.u.ctx_list[0].result,
4168 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
4169 self.assertEquals(rep.u.ctx_list[0].reason,
4170 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
4171 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
4172 self.assertNotEquals(len(rep.u.auth_info), 0)
4173 a = self.parse_auth(rep.u.auth_info)
4175 from_server = a.credentials
4176 (finished, to_server) = g.update(from_server)
4177 self.assertFalse(finished)
4179 auth_info = self.generate_auth(auth_type=auth_type,
4180 auth_level=auth_level,
4181 auth_context_id=auth_context_id,
4182 auth_blob=to_server)
4183 req = self.generate_alter(call_id=0,
4185 assoc_group_id=rep.u.assoc_group_id,
4186 auth_info=auth_info)
4187 req_pdu = samba.ndr.ndr_pack(req)
4189 auth_pad_ok = len(req_pdu)
4190 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
4191 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4192 auth_pad_ok -= len(to_server)
4193 auth_pad_bad = auth_pad_ok + 1
4194 auth_info = self.generate_auth(auth_type=auth_type,
4195 auth_level=auth_level,
4196 auth_context_id=auth_context_id,
4197 auth_pad_length=auth_pad_bad,
4198 auth_blob=to_server)
4199 req = self.generate_alter(call_id=0,
4201 assoc_group_id=rep.u.assoc_group_id,
4202 auth_info=auth_info)
4204 rep = self.recv_pdu()
4205 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
4206 pfc_flags=req.pfc_flags |
4207 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
4209 self.assertNotEquals(rep.u.alloc_hint, 0)
4210 self.assertEquals(rep.u.context_id, 0)
4211 self.assertEquals(rep.u.cancel_count, 0)
4212 self.assertEquals(rep.u.flags, 0)
4213 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_PROTO_ERROR)
4214 self.assertEquals(rep.u.reserved, 0)
4215 self.assertEquals(len(rep.u.error_and_verifier), 0)
4217 # wait for a disconnect
4218 rep = self.recv_pdu()
4219 self.assertIsNone(rep)
4220 self.assertNotConnected()
4222 def test_ntlmssp_auth_pad_ok(self):
4223 ndr32 = base.transfer_syntax_ndr()
4226 ctx1 = dcerpc.ctx_list()
4228 ctx1.num_transfer_syntaxes = len(tsf1_list)
4229 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4230 ctx1.transfer_syntaxes = tsf1_list
4233 c = self.get_anon_creds()
4234 g = gensec.Security.start_client(self.settings)
4235 g.set_credentials(c)
4236 g.want_feature(gensec.FEATURE_DCE_STYLE)
4237 auth_type = dcerpc.DCERPC_AUTH_TYPE_NTLMSSP
4238 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
4240 g.start_mech_by_authtype(auth_type, auth_level)
4242 (finished, to_server) = g.update(from_server)
4243 self.assertFalse(finished)
4245 auth_info = self.generate_auth(auth_type=auth_type,
4246 auth_level=auth_level,
4247 auth_context_id=auth_context_id,
4248 auth_blob=to_server)
4250 req = self.generate_bind(call_id=0,
4252 auth_info=auth_info)
4253 req_pdu = samba.ndr.ndr_pack(req)
4255 auth_pad_ok = len(req_pdu)
4256 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
4257 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4258 auth_pad_ok -= len(to_server)
4260 auth_info = self.generate_auth(auth_type=auth_type,
4261 auth_level=auth_level,
4262 auth_context_id=auth_context_id,
4263 auth_pad_length=auth_pad_ok,
4264 auth_blob=to_server)
4266 req = self.generate_bind(call_id=0,
4268 auth_info=auth_info)
4270 rep = self.recv_pdu()
4271 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
4272 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
4273 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
4274 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
4275 self.assertEquals(rep.u.secondary_address_size, 4)
4276 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
4277 self.assertEquals(len(rep.u._pad1), 2)
4278 #self.assertEquals(rep.u._pad1, '\0' * 2)
4279 self.assertEquals(rep.u.num_results, 1)
4280 self.assertEquals(rep.u.ctx_list[0].result,
4281 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
4282 self.assertEquals(rep.u.ctx_list[0].reason,
4283 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
4284 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
4285 self.assertNotEquals(len(rep.u.auth_info), 0)
4286 a = self.parse_auth(rep.u.auth_info)
4288 from_server = a.credentials
4289 (finished, to_server) = g.update(from_server)
4290 self.assertTrue(finished)
4293 auth_info = self.generate_auth(auth_type=auth_type,
4294 auth_level=auth_level,
4295 auth_context_id=auth_context_id,
4296 auth_pad_length=auth_pad_ok,
4297 auth_blob=to_server)
4298 req = self.generate_auth3(call_id=0,
4299 auth_info=auth_info)
4301 self.assertIsConnected()
4303 # And now try a request without auth_info
4304 req = self.generate_request(call_id=2,
4305 context_id=ctx1.context_id,
4309 rep = self.recv_pdu()
4310 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4312 self.assertNotEquals(rep.u.alloc_hint, 0)
4313 self.assertEquals(rep.u.context_id, req.u.context_id)
4314 self.assertEquals(rep.u.cancel_count, 0)
4315 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4317 # Now a request with auth_info DCERPC_AUTH_LEVEL_CONNECT
4318 auth_info = self.generate_auth(auth_type=auth_type,
4319 auth_level=auth_level,
4320 auth_context_id=auth_context_id,
4321 auth_blob=b"\x01" + b"\x00" * 15)
4322 req = self.generate_request(call_id=3,
4323 context_id=ctx1.context_id,
4326 auth_info=auth_info)
4328 rep = self.recv_pdu()
4329 # We don't get an auth_info back
4330 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4332 self.assertNotEquals(rep.u.alloc_hint, 0)
4333 self.assertEquals(rep.u.context_id, req.u.context_id)
4334 self.assertEquals(rep.u.cancel_count, 0)
4335 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4337 self._disconnect("disconnect")
4338 self.assertNotConnected()
4340 def test_ntlmssp_auth_pad_fail_auth3(self):
4341 ndr32 = base.transfer_syntax_ndr()
4344 ctx1 = dcerpc.ctx_list()
4346 ctx1.num_transfer_syntaxes = len(tsf1_list)
4347 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4348 ctx1.transfer_syntaxes = tsf1_list
4351 c = self.get_anon_creds()
4352 g = gensec.Security.start_client(self.settings)
4353 g.set_credentials(c)
4354 g.want_feature(gensec.FEATURE_DCE_STYLE)
4355 auth_type = dcerpc.DCERPC_AUTH_TYPE_NTLMSSP
4356 auth_level = dcerpc.DCERPC_AUTH_LEVEL_CONNECT
4358 g.start_mech_by_authtype(auth_type, auth_level)
4360 (finished, to_server) = g.update(from_server)
4361 self.assertFalse(finished)
4363 auth_info = self.generate_auth(auth_type=auth_type,
4364 auth_level=auth_level,
4365 auth_context_id=auth_context_id,
4366 auth_blob=to_server)
4368 req = self.generate_bind(call_id=0,
4370 auth_info=auth_info)
4371 req_pdu = samba.ndr.ndr_pack(req)
4373 auth_pad_ok = len(req_pdu)
4374 auth_pad_ok -= dcerpc.DCERPC_REQUEST_LENGTH
4375 auth_pad_ok -= dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4376 auth_pad_ok -= len(to_server)
4378 auth_info = self.generate_auth(auth_type=auth_type,
4379 auth_level=auth_level,
4380 auth_context_id=auth_context_id,
4381 auth_pad_length=auth_pad_ok,
4382 auth_blob=to_server)
4384 req = self.generate_bind(call_id=0,
4386 auth_info=auth_info)
4388 rep = self.recv_pdu()
4389 self.verify_pdu(rep, dcerpc.DCERPC_PKT_BIND_ACK, req.call_id)
4390 self.assertEquals(rep.u.max_xmit_frag, req.u.max_xmit_frag)
4391 self.assertEquals(rep.u.max_recv_frag, req.u.max_recv_frag)
4392 self.assertNotEquals(rep.u.assoc_group_id, req.u.assoc_group_id)
4393 self.assertEquals(rep.u.secondary_address_size, 4)
4394 self.assertEquals(rep.u.secondary_address, "%d" % self.tcp_port)
4395 self.assertEquals(len(rep.u._pad1), 2)
4396 #self.assertEquals(rep.u._pad1, '\0' * 2)
4397 self.assertEquals(rep.u.num_results, 1)
4398 self.assertEquals(rep.u.ctx_list[0].result,
4399 dcerpc.DCERPC_BIND_ACK_RESULT_ACCEPTANCE)
4400 self.assertEquals(rep.u.ctx_list[0].reason,
4401 dcerpc.DCERPC_BIND_ACK_REASON_NOT_SPECIFIED)
4402 self.assertNDRSyntaxEquals(rep.u.ctx_list[0].syntax, ndr32)
4403 self.assertNotEquals(len(rep.u.auth_info), 0)
4404 a = self.parse_auth(rep.u.auth_info)
4406 from_server = a.credentials
4407 (finished, to_server) = g.update(from_server)
4408 self.assertTrue(finished)
4411 auth_info = self.generate_auth(auth_type=auth_type,
4412 auth_level=auth_level,
4413 auth_context_id=auth_context_id,
4414 auth_pad_length=auth_pad_bad,
4415 auth_blob=to_server)
4416 req = self.generate_auth3(call_id=0,
4417 auth_info=auth_info)
4419 rep = self.recv_pdu()
4420 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
4421 pfc_flags=req.pfc_flags |
4422 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
4424 self.assertNotEquals(rep.u.alloc_hint, 0)
4425 self.assertEquals(rep.u.context_id, 0)
4426 self.assertEquals(rep.u.cancel_count, 0)
4427 self.assertEquals(rep.u.flags, 0)
4428 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_FAULT_REMOTE_NO_MEMORY)
4429 self.assertEquals(rep.u.reserved, 0)
4430 self.assertEquals(len(rep.u.error_and_verifier), 0)
4432 # wait for a disconnect
4433 rep = self.recv_pdu()
4434 self.assertIsNone(rep)
4435 self.assertNotConnected()
4437 def _test_spnego_bind_auth_level(self, auth_level, auth_context_id, ctx,
4438 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4440 creds = self.get_user_creds()
4441 auth_context = self.get_auth_context_creds(creds=creds,
4442 auth_type=dcerpc.DCERPC_AUTH_TYPE_SPNEGO,
4443 auth_level=auth_level,
4444 auth_context_id=auth_context_id,
4445 g_auth_level=g_auth_level)
4446 if auth_context is None:
4448 ack = self.do_generic_bind(ctx=ctx,
4449 auth_context=auth_context,
4450 alter_fault=alter_fault)
4453 return auth_context["gensec"]
4455 def _test_spnego_level_bind_nak(self, auth_level,
4456 reason=dcerpc.DCERPC_BIND_NAK_REASON_INVALID_CHECKSUM):
4457 c = self.get_user_creds()
4458 return self._test_auth_type_level_bind_nak(auth_type=dcerpc.DCERPC_AUTH_TYPE_SPNEGO,
4459 auth_level=auth_level, creds=c, reason=reason)
4461 def _test_spnego_level_bind(self, auth_level,
4462 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4465 response_fault_flags=0):
4466 ndr32 = base.transfer_syntax_ndr()
4469 ctx1 = dcerpc.ctx_list()
4470 ctx1.context_id = 0x1001
4471 ctx1.num_transfer_syntaxes = len(tsf1_list)
4472 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4473 ctx1.transfer_syntaxes = tsf1_list
4475 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
4478 g = self._test_spnego_bind_auth_level(auth_level=auth_level,
4479 auth_context_id=auth_context_id,
4481 g_auth_level=g_auth_level,
4482 alter_fault=alter_fault)
4484 if request_fault is None:
4487 self.assertIsNotNone(g)
4489 stub_bin = b'\x00' * 17
4490 mod_len = len(stub_bin) % dcerpc.DCERPC_AUTH_PAD_ALIGNMENT
4493 auth_pad_length = dcerpc.DCERPC_AUTH_PAD_ALIGNMENT - mod_len
4494 stub_bin += b'\x00' * auth_pad_length
4496 if g_auth_level >= dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY:
4497 sig_size = g.sig_size(len(stub_bin))
4500 zero_sig = b"\x00" * sig_size
4502 auth_info = self.generate_auth(auth_type=auth_type,
4503 auth_level=auth_level,
4504 auth_pad_length=auth_pad_length,
4505 auth_context_id=auth_context_id,
4507 req = self.generate_request(call_id=4,
4508 context_id=ctx1.context_id,
4511 auth_info=auth_info)
4512 if g_auth_level >= dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY:
4513 req_blob = samba.ndr.ndr_pack(req)
4514 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4515 ofs_sig = len(req_blob) - req.auth_length
4516 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4517 req_data = req_blob[ofs_stub:ofs_trailer]
4518 req_whole = req_blob[0:ofs_sig]
4519 sig = g.sign_packet(req_data, req_whole)
4520 auth_info = self.generate_auth(auth_type=auth_type,
4521 auth_level=auth_level,
4522 auth_pad_length=auth_pad_length,
4523 auth_context_id=auth_context_id,
4525 req = self.generate_request(call_id=4,
4526 context_id=ctx1.context_id,
4529 auth_info=auth_info)
4531 rep = self.recv_pdu()
4532 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
4533 pfc_flags=req.pfc_flags | response_fault_flags,
4535 self.assertNotEquals(rep.u.alloc_hint, 0)
4536 self.assertEquals(rep.u.context_id, ctx1.context_id)
4537 self.assertEquals(rep.u.cancel_count, 0)
4538 self.assertEquals(rep.u.flags, 0)
4539 self.assertEquals(rep.u.status, request_fault)
4540 self.assertEquals(rep.u.reserved, 0)
4541 self.assertEquals(len(rep.u.error_and_verifier), 0)
4543 if response_fault_flags & dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE:
4546 # wait for a disconnect
4547 rep = self.recv_pdu()
4548 self.assertIsNone(rep)
4549 self.assertNotConnected()
4551 def test_spnego_none_bind(self):
4552 return self._test_spnego_level_bind_nak(dcerpc.DCERPC_AUTH_LEVEL_NONE,
4553 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4555 def test_spnego_call_bind(self):
4556 return self._test_spnego_level_bind_nak(dcerpc.DCERPC_AUTH_LEVEL_CALL,
4557 reason=dcerpc.DCERPC_BIND_NAK_REASON_INVALID_CHECKSUM)
4559 def test_spnego_0_bind(self):
4560 return self._test_spnego_level_bind_nak(0,
4561 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4563 def test_spnego_7_bind(self):
4564 return self._test_spnego_level_bind_nak(7,
4565 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4567 def test_spnego_255_bind(self):
4568 return self._test_spnego_level_bind_nak(255,
4569 reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4571 def test_spnego_connect_bind_none(self):
4572 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4573 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT)
4575 def test_spnego_connect_bind_sign(self):
4576 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4577 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY)
4579 def test_spnego_connect_bind_seal(self):
4580 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4581 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY)
4583 def test_spnego_packet_bind_none(self):
4584 # DCERPC_AUTH_LEVEL_PACKET is handled as alias of
4585 # DCERPC_AUTH_LEVEL_INTEGRITY
4586 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PACKET,
4587 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4588 request_fault=dcerpc.DCERPC_FAULT_SEC_PKG_ERROR)
4590 def test_spnego_packet_bind_sign(self):
4591 # DCERPC_AUTH_LEVEL_PACKET is handled as alias of
4592 # DCERPC_AUTH_LEVEL_INTEGRITY
4593 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PACKET,
4594 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4595 request_fault=dcerpc.DCERPC_NCA_S_OP_RNG_ERROR,
4596 response_fault_flags=dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE)
4598 def test_spnego_packet_bind_sign_privacy(self):
4599 # DCERPC_AUTH_LEVEL_PACKET is handled as alias of
4600 # DCERPC_AUTH_LEVEL_INTEGRITY
4601 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PACKET,
4602 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
4603 request_fault=dcerpc.DCERPC_NCA_S_OP_RNG_ERROR,
4604 response_fault_flags=dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE)
4606 def test_spnego_integrity_bind_none(self):
4607 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4608 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4609 request_fault=dcerpc.DCERPC_FAULT_SEC_PKG_ERROR)
4611 def test_spnego_integrity_bind_sign(self):
4612 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4613 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4614 request_fault=dcerpc.DCERPC_NCA_S_OP_RNG_ERROR,
4615 response_fault_flags=dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE)
4617 def test_spnego_integrity_bind_seal(self):
4618 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4619 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
4620 request_fault=dcerpc.DCERPC_NCA_S_OP_RNG_ERROR,
4621 response_fault_flags=dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE)
4623 def test_spnego_privacy_bind_none(self):
4625 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
4626 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_CONNECT,
4627 alter_fault=dcerpc.DCERPC_FAULT_SEC_PKG_ERROR)
4629 def test_spnego_privacy_bind_sign(self):
4631 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
4632 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY,
4633 alter_fault=dcerpc.DCERPC_FAULT_SEC_PKG_ERROR)
4635 def test_spnego_privacy_bind_seal(self):
4636 return self._test_spnego_level_bind(auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY,
4637 g_auth_level=dcerpc.DCERPC_AUTH_LEVEL_PRIVACY)
4639 def _test_spnego_signing_auth_level_request(self, auth_level):
4640 ndr32 = base.transfer_syntax_ndr()
4643 ctx1 = dcerpc.ctx_list()
4644 ctx1.context_id = 0x1001
4645 ctx1.num_transfer_syntaxes = len(tsf1_list)
4646 ctx1.abstract_syntax = samba.dcerpc.mgmt.abstract_syntax()
4647 ctx1.transfer_syntaxes = tsf1_list
4650 auth_type = dcerpc.DCERPC_AUTH_TYPE_SPNEGO
4653 g = self._test_spnego_bind_auth_level(auth_level=auth_level,
4654 auth_context_id=auth_context_id,
4657 stub_bin = b'\x00' * 0
4658 mod_len = len(stub_bin) % dcerpc.DCERPC_AUTH_PAD_ALIGNMENT
4661 auth_pad_length = dcerpc.DCERPC_AUTH_PAD_ALIGNMENT - mod_len
4662 stub_bin += b'\x00' * auth_pad_length
4664 sig_size = g.sig_size(len(stub_bin))
4665 zero_sig = b"\x00" * sig_size
4667 auth_info = self.generate_auth(auth_type=auth_type,
4668 auth_level=auth_level,
4669 auth_pad_length=auth_pad_length,
4670 auth_context_id=auth_context_id,
4672 req = self.generate_request(call_id=3,
4673 context_id=ctx1.context_id,
4676 auth_info=auth_info)
4677 req_blob = samba.ndr.ndr_pack(req)
4678 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4679 ofs_sig = len(req_blob) - req.auth_length
4680 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4681 req_data = req_blob[ofs_stub:ofs_trailer]
4682 req_whole = req_blob[0:ofs_sig]
4683 sig = g.sign_packet(req_data, req_whole)
4684 auth_info = self.generate_auth(auth_type=auth_type,
4685 auth_level=auth_level,
4686 auth_pad_length=auth_pad_length,
4687 auth_context_id=auth_context_id,
4689 req = self.generate_request(call_id=3,
4690 context_id=ctx1.context_id,
4693 auth_info=auth_info)
4695 (rep, rep_blob) = self.recv_pdu_raw()
4696 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4697 auth_length=sig_size)
4698 self.assertNotEquals(rep.u.alloc_hint, 0)
4699 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
4700 self.assertEquals(rep.u.cancel_count, 0)
4701 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4702 self.assertEquals(rep.auth_length, sig_size)
4704 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4705 ofs_sig = rep.frag_length - rep.auth_length
4706 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4707 rep_data = rep_blob[ofs_stub:ofs_trailer]
4708 rep_whole = rep_blob[0:ofs_sig]
4709 rep_sig = rep_blob[ofs_sig:]
4710 rep_auth_info_blob = rep_blob[ofs_trailer:]
4712 rep_auth_info = self.parse_auth(rep_auth_info_blob)
4713 self.assertEquals(rep_auth_info.auth_type, auth_type)
4714 self.assertEquals(rep_auth_info.auth_level, auth_level)
4715 # mgmt_inq_if_ids() returns no fixed size results
4716 #self.assertEquals(rep_auth_info.auth_pad_length, 0)
4717 self.assertEquals(rep_auth_info.auth_reserved, 0)
4718 self.assertEquals(rep_auth_info.auth_context_id, auth_context_id)
4719 self.assertEquals(rep_auth_info.credentials, rep_sig)
4721 g.check_packet(rep_data, rep_whole, rep_sig)
4723 stub_bin = b'\x00' * 17
4724 mod_len = len(stub_bin) % dcerpc.DCERPC_AUTH_PAD_ALIGNMENT
4727 auth_pad_length = dcerpc.DCERPC_AUTH_PAD_ALIGNMENT - mod_len
4728 stub_bin += b'\x00' * auth_pad_length
4730 sig_size = g.sig_size(len(stub_bin))
4731 zero_sig = b"\x00" * sig_size
4733 auth_info = self.generate_auth(auth_type=auth_type,
4734 auth_level=auth_level,
4735 auth_pad_length=auth_pad_length,
4736 auth_context_id=auth_context_id,
4738 req = self.generate_request(call_id=4,
4739 context_id=ctx1.context_id,
4742 auth_info=auth_info)
4743 req_blob = samba.ndr.ndr_pack(req)
4744 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4745 ofs_sig = len(req_blob) - req.auth_length
4746 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4747 req_data = req_blob[ofs_stub:ofs_trailer]
4748 req_whole = req_blob[0:ofs_sig]
4749 sig = g.sign_packet(req_data, req_whole)
4750 auth_info = self.generate_auth(auth_type=auth_type,
4751 auth_level=auth_level,
4752 auth_pad_length=auth_pad_length,
4753 auth_context_id=auth_context_id,
4755 req = self.generate_request(call_id=4,
4756 context_id=ctx1.context_id,
4759 auth_info=auth_info)
4761 rep = self.recv_pdu()
4762 self.verify_pdu(rep, dcerpc.DCERPC_PKT_FAULT, req.call_id,
4763 pfc_flags=req.pfc_flags |
4764 dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
4766 self.assertNotEquals(rep.u.alloc_hint, 0)
4767 self.assertEquals(rep.u.context_id, ctx1.context_id)
4768 self.assertEquals(rep.u.cancel_count, 0)
4769 self.assertEquals(rep.u.flags, 0)
4770 self.assertEquals(rep.u.status, dcerpc.DCERPC_NCA_S_OP_RNG_ERROR)
4771 self.assertEquals(rep.u.reserved, 0)
4772 self.assertEquals(len(rep.u.error_and_verifier), 0)
4774 stub_bin = b'\x00' * 8
4775 mod_len = len(stub_bin) % dcerpc.DCERPC_AUTH_PAD_ALIGNMENT
4778 auth_pad_length = dcerpc.DCERPC_AUTH_PAD_ALIGNMENT - mod_len
4779 stub_bin += b'\x00' * auth_pad_length
4781 sig_size = g.sig_size(len(stub_bin))
4782 zero_sig = b"\x00" * sig_size
4784 auth_info = self.generate_auth(auth_type=auth_type,
4785 auth_level=auth_level,
4786 auth_pad_length=auth_pad_length,
4787 auth_context_id=auth_context_id,
4789 req = self.generate_request(call_id=5,
4790 context_id=ctx1.context_id,
4793 auth_info=auth_info)
4794 req_blob = samba.ndr.ndr_pack(req)
4795 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4796 ofs_sig = len(req_blob) - req.auth_length
4797 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4798 req_data = req_blob[ofs_stub:ofs_trailer]
4799 req_whole = req_blob[0:ofs_sig]
4800 sig = g.sign_packet(req_data, req_whole)
4801 auth_info = self.generate_auth(auth_type=auth_type,
4802 auth_level=auth_level,
4803 auth_pad_length=auth_pad_length,
4804 auth_context_id=auth_context_id,
4806 req = self.generate_request(call_id=5,
4807 context_id=ctx1.context_id,
4810 auth_info=auth_info)
4812 (rep, rep_blob) = self.recv_pdu_raw()
4813 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4814 auth_length=sig_size)
4815 self.assertNotEquals(rep.u.alloc_hint, 0)
4816 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
4817 self.assertEquals(rep.u.cancel_count, 0)
4818 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4819 self.assertEquals(rep.auth_length, sig_size)
4821 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4822 ofs_sig = rep.frag_length - rep.auth_length
4823 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4824 rep_data = rep_blob[ofs_stub:ofs_trailer]
4825 rep_whole = rep_blob[0:ofs_sig]
4826 rep_sig = rep_blob[ofs_sig:]
4827 rep_auth_info_blob = rep_blob[ofs_trailer:]
4829 rep_auth_info = self.parse_auth(rep_auth_info_blob)
4830 self.assertEquals(rep_auth_info.auth_type, auth_type)
4831 self.assertEquals(rep_auth_info.auth_level, auth_level)
4832 self.assertEquals(rep_auth_info.auth_pad_length, 4)
4833 self.assertEquals(rep_auth_info.auth_reserved, 0)
4834 self.assertEquals(rep_auth_info.auth_context_id, auth_context_id)
4835 self.assertEquals(rep_auth_info.credentials, rep_sig)
4837 g.check_packet(rep_data, rep_whole, rep_sig)
4839 stub_bin = b'\x00' * 8
4840 mod_len = len(stub_bin) % dcerpc.DCERPC_AUTH_PAD_ALIGNMENT
4843 auth_pad_length = dcerpc.DCERPC_AUTH_PAD_ALIGNMENT - mod_len
4844 stub_bin += b'\x00' * auth_pad_length
4846 sig_size = g.sig_size(len(stub_bin))
4847 zero_sig = b"\x00" * sig_size
4849 auth_info = self.generate_auth(auth_type=auth_type,
4850 auth_level=auth_level,
4851 auth_pad_length=auth_pad_length,
4852 auth_context_id=auth_context_id,
4854 req = self.generate_request(call_id=6,
4855 context_id=ctx1.context_id,
4858 auth_info=auth_info)
4859 req_blob = samba.ndr.ndr_pack(req)
4860 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4861 ofs_sig = len(req_blob) - req.auth_length
4862 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4863 req_data = req_blob[ofs_stub:ofs_trailer]
4864 req_whole = req_blob[0:ofs_sig]
4865 sig = g.sign_packet(req_data, req_whole)
4866 auth_info = self.generate_auth(auth_type=auth_type,
4867 auth_level=auth_level,
4868 auth_pad_length=auth_pad_length,
4869 auth_context_id=auth_context_id,
4871 req = self.generate_request(call_id=6,
4872 context_id=ctx1.context_id,
4875 auth_info=auth_info)
4877 (rep, rep_blob) = self.recv_pdu_raw()
4878 self.verify_pdu(rep, dcerpc.DCERPC_PKT_RESPONSE, req.call_id,
4879 auth_length=sig_size)
4880 self.assertNotEquals(rep.u.alloc_hint, 0)
4881 self.assertEquals(rep.u.context_id, req.u.context_id & 0xff)
4882 self.assertEquals(rep.u.cancel_count, 0)
4883 self.assertGreaterEqual(len(rep.u.stub_and_verifier), rep.u.alloc_hint)
4884 self.assertEquals(rep.auth_length, sig_size)
4886 ofs_stub = dcerpc.DCERPC_REQUEST_LENGTH
4887 ofs_sig = rep.frag_length - rep.auth_length
4888 ofs_trailer = ofs_sig - dcerpc.DCERPC_AUTH_TRAILER_LENGTH
4889 rep_data = rep_blob[ofs_stub:ofs_trailer]
4890 rep_whole = rep_blob[0:ofs_sig]
4891 rep_sig = rep_blob[ofs_sig:]
4892 rep_auth_info_blob = rep_blob[ofs_trailer:]
4894 rep_auth_info = self.parse_auth(rep_auth_info_blob)
4895 self.assertEquals(rep_auth_info.auth_type, auth_type)
4896 self.assertEquals(rep_auth_info.auth_level, auth_level)
4897 self.assertEquals(rep_auth_info.auth_pad_length, 12)
4898 self.assertEquals(rep_auth_info.auth_reserved, 0)
4899 self.assertEquals(rep_auth_info.auth_context_id, auth_context_id)
4900 self.assertEquals(rep_auth_info.credentials, rep_sig)
4902 g.check_packet(rep_data, rep_whole, rep_sig)
4904 def test_spnego_signing_packet(self):
4905 # DCERPC_AUTH_LEVEL_PACKET is handled as alias of
4906 # DCERPC_AUTH_LEVEL_INTEGRITY
4907 return self._test_spnego_signing_auth_level_request(dcerpc.DCERPC_AUTH_LEVEL_PACKET)
4909 def test_spnego_signing_integrity(self):
4910 return self._test_spnego_signing_auth_level_request(dcerpc.DCERPC_AUTH_LEVEL_INTEGRITY)
4912 def test_assoc_group_fail1(self):
4913 abstract = samba.dcerpc.mgmt.abstract_syntax()
4914 transfer = base.transfer_syntax_ndr()
4916 tsf1_list = [transfer]
4917 ctx = samba.dcerpc.dcerpc.ctx_list()
4919 ctx.num_transfer_syntaxes = len(tsf1_list)
4920 ctx.abstract_syntax = abstract
4921 ctx.transfer_syntaxes = tsf1_list
4923 ack = self.do_generic_bind(ctx=ctx, assoc_group_id=1,
4924 nak_reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4927 def test_assoc_group_fail2(self):
4928 abstract = samba.dcerpc.mgmt.abstract_syntax()
4929 transfer = base.transfer_syntax_ndr()
4931 tsf1_list = [transfer]
4932 ctx = samba.dcerpc.dcerpc.ctx_list()
4934 ctx.num_transfer_syntaxes = len(tsf1_list)
4935 ctx.abstract_syntax = abstract
4936 ctx.transfer_syntaxes = tsf1_list
4938 ack = self.do_generic_bind(ctx=ctx)
4940 self._disconnect("test_assoc_group_fail2")
4941 self.assertNotConnected()
4945 ack2 = self.do_generic_bind(ctx=ctx, assoc_group_id=ack.u.assoc_group_id,
4946 nak_reason=dcerpc.DCERPC_BIND_NAK_REASON_NOT_SPECIFIED)
4949 def test_assoc_group_diff1(self):
4950 abstract = samba.dcerpc.mgmt.abstract_syntax()
4951 transfer = base.transfer_syntax_ndr()
4953 (ctx1, ack1) = self.prepare_presentation(abstract, transfer,
4954 context_id=1, return_ack=True)
4956 conn2 = self.second_connection()
4957 (ctx2, ack2) = conn2.prepare_presentation(abstract, transfer,
4958 context_id=2, return_ack=True)
4959 self.assertNotEqual(ack2.u.assoc_group_id, ack1.u.assoc_group_id)
4963 def test_assoc_group_ok1(self):
4964 abstract = samba.dcerpc.mgmt.abstract_syntax()
4965 transfer = base.transfer_syntax_ndr()
4967 (ctx1, ack1) = self.prepare_presentation(abstract, transfer,
4968 context_id=1, return_ack=True)
4970 conn2 = self.second_connection()
4971 (ctx2, ack2) = conn2.prepare_presentation(abstract, transfer,
4972 assoc_group_id=ack1.u.assoc_group_id,
4973 context_id=2, return_ack=True)
4975 inq_if_ids = samba.dcerpc.mgmt.inq_if_ids()
4976 self.do_single_request(call_id=1, ctx=ctx1, io=inq_if_ids)
4977 conn2.do_single_request(call_id=1, ctx=ctx2, io=inq_if_ids)
4979 conn2.do_single_request(call_id=1, ctx=ctx1, io=inq_if_ids,
4981 samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_FIRST |
4982 samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_LAST |
4983 samba.dcerpc.dcerpc.DCERPC_PFC_FLAG_DID_NOT_EXECUTE),
4984 fault_status=dcerpc.DCERPC_NCA_S_UNKNOWN_IF,
4987 self.do_single_request(call_id=1, ctx=ctx1, io=inq_if_ids)
4988 conn2.do_single_request(call_id=1, ctx=ctx2, io=inq_if_ids)
4992 if __name__ == "__main__":
4993 global_ndr_print = True
4994 global_hexdump = True