1 % Regression tests for Scapy 2 3 # More informations at http://www.secdev.org/projects/UTscapy/ 4 5 ############ 6 ############ 7 + Informations on Scapy 8 9 = Get conf 10 ~ conf command 11 * Dump the current configuration 12 conf 13 14 IP().src 15 scapy.consts.LOOPBACK_INTERFACE 16 17 = List layers 18 ~ conf command 19 ls() 20 21 = List commands 22 ~ conf command 23 lsc() 24 25 = List contribs 26 def test_list_contrib(): 27 with ContextManagerCaptureOutput() as cmco: 28 list_contrib() 29 result_list_contrib = cmco.get_output() 30 assert("http2 : HTTP/2 (RFC 7540, RFC 7541) status=loads" in result_list_contrib) 31 assert(len(result_list_contrib.split('\n')) > 40) 32 33 test_list_contrib() 34 35 = Configuration 36 ~ conf 37 conf.debug_dissector = True 38 39 40 ########### 41 ########### 42 = UTscapy route check 43 * Check that UTscapy has correctly replaced the routes. Many tests won't work otherwise 44 45 if WINDOWS: 46 route_add_loopback() 47 48 IP().src 49 assert _ == "127.0.0.1" 50 51 ############ 52 ############ 53 + Scapy functions tests 54 55 = Interface related functions 56 57 get_if_raw_hwaddr(conf.iface) 58 59 bytes_hex(get_if_raw_addr(conf.iface)) 60 61 def get_dummy_interface(): 62 """Returns a dummy network interface""" 63 if WINDOWS: 64 data = {} 65 data["name"] = "dummy0" 66 data["description"] = "Does not exist" 67 data["win_index"] = -1 68 data["guid"] = "{1XX00000-X000-0X0X-X00X-00XXXX000XXX}" 69 data["invalid"] = True 70 dummy_int = NetworkInterface(data) 71 dummy_int.pcap_name = "\\Device\\NPF_" + data["guid"] 72 conf.cache_ipaddrs[dummy_int.pcap_name] = b'\x7f\x00\x00\x01' 73 return dummy_int 74 else: 75 return "dummy0" 76 77 get_if_raw_addr(get_dummy_interface()) 78 79 get_if_list() 80 81 get_if_raw_addr6(conf.iface6) 82 83 = Test read_routes6() - default output 84 85 routes6 = read_routes6() 86 if WINDOWS: 87 route_add_loopback(routes6, True) 88 89 routes6 90 91 # Expected results: 92 # - one route if there is only the loopback interface 93 # - three routes if there is a network interface 94 95 if routes6: 96 iflist = get_if_list() 97 if WINDOWS: 98 route_add_loopback(ipv6=True, iflist=iflist) 99 if iflist == [LOOPBACK_NAME]: 100 len(routes6) == 1 101 elif len(iflist) >= 2: 102 len(routes6) >= 3 103 else: 104 False 105 else: 106 # IPv6 seems disabled. Force a route to ::1 107 conf.route6.routes.append(("::1", 128, "::", LOOPBACK_NAME, ["::1"], 1)) 108 True 109 110 = Test read_routes6() - check mandatory routes 111 112 if len(routes6): 113 assert(len([r for r in routes6 if r[0] == "::1" and r[4] == ["::1"]]) >= 1) 114 if len(iflist) >= 2: 115 assert(len([r for r in routes6 if r[0] == "fe80::" and r[1] == 64]) >= 1) 116 len([r for r in routes6 if in6_islladdr(r[0]) and r[1] == 128 and r[4] == ["::1"]]) >= 1 117 else: 118 True 119 120 = Test ifchange() 121 conf.route6.ifchange(LOOPBACK_NAME, "::1/128") 122 True 123 124 125 ############ 126 ############ 127 + Main.py tests 128 129 = Pickle and unpickle a packet 130 131 import scapy.modules.six as six 132 133 a = IP(dst="192.168.0.1")/UDP() 134 135 b = six.moves.cPickle.dumps(a) 136 c = six.moves.cPickle.loads(b) 137 138 assert c[IP].dst == "192.168.0.1" 139 assert raw(c) == raw(a) 140 141 = Usage test 142 143 from scapy.main import _usage 144 try: 145 _usage() 146 assert False 147 except SystemExit: 148 assert True 149 150 = Session test 151 152 # This is automatic when using the console 153 def get_var(var): 154 return six.moves.builtins.__dict__["scapy_session"][var] 155 156 def set_var(var, value): 157 six.moves.builtins.__dict__["scapy_session"][var] = value 158 159 def del_var(var): 160 del(six.moves.builtins.__dict__["scapy_session"][var]) 161 162 init_session(None, {"init_value": 123}) 163 set_var("test_value", "8.8.8.8") # test_value = "8.8.8.8" 164 save_session() 165 del_var("test_value") 166 load_session() 167 update_session() 168 assert get_var("test_value") == "8.8.8.8" #test_value == "8.8.8.8" 169 assert get_var("init_value") == 123 170 171 = Session test with fname 172 173 init_session("scapySession2") 174 set_var("test_value", IP(dst="192.168.0.1")) # test_value = IP(dst="192.168.0.1") 175 save_session(fname="scapySession1.dat") 176 del_var("test_value") 177 178 set_var("z", True) #z = True 179 load_session(fname="scapySession1.dat") 180 try: 181 get_var("z") 182 assert False 183 except: 184 pass 185 186 set_var("z", False) #z = False 187 update_session(fname="scapySession1.dat") 188 assert get_var("test_value").dst == "192.168.0.1" #test_value.dst == "192.168.0.1" 189 assert not get_var("z") 190 191 = Clear session files 192 193 os.remove("scapySession1.dat") 194 195 = Test temporary file creation 196 ~ appveyor_only 197 198 scapy_delete_temp_files() 199 200 tmpfile = get_temp_file(autoext=".ut") 201 tmpfile 202 if WINDOWS: 203 assert("scapy" in tmpfile and tmpfile.lower().startswith('c:\\users\\appveyor\\appdata\\local\\temp')) 204 else: 205 import platform 206 BYPASS_TMP = platform.python_implementation().lower() == "pypy" or DARWIN 207 assert("scapy" in tmpfile and (BYPASS_TMP == True or "/tmp/" in tmpfile)) 208 209 assert(conf.temp_files[0].endswith(".ut")) 210 scapy_delete_temp_files() 211 assert(len(conf.temp_files) == 0) 212 213 = Emulate interact() 214 215 import mock, sys 216 from scapy.main import interact 217 # Detect IPython 218 try: 219 import IPython 220 except: 221 code_interact_import = "scapy.main.code.interact" 222 else: 223 code_interact_import = "IPython.terminal.embed.InteractiveShellEmbed" 224 225 @mock.patch(code_interact_import) 226 def interact_emulator(code_int, extra_args=[]): 227 try: 228 code_int.side_effect = lambda *args, **kwargs: lambda *args, **kwargs: None 229 interact(argv=["-s scapy1"] + extra_args, mybanner="What a test") 230 return True 231 except: 232 raise 233 return False 234 finally: 235 sys.ps1 = ">>> " 236 237 assert interact_emulator() # Default 238 assert not interact_emulator(extra_args=["-?"]) # Failing 239 assert interact_emulator(extra_args=["-d"]) # Extended 240 241 = Test sane function 242 sane("A\x00\xFFB") == "A..B" 243 244 = Test lhex function 245 assert(lhex(42) == "0x2a") 246 assert(lhex((28,7)) == "(0x1c, 0x7)") 247 assert(lhex([28,7]) == "[0x1c, 0x7]") 248 249 = Test restart function 250 import mock 251 conf.interactive = True 252 253 try: 254 from scapy.utils import restart 255 import os 256 @mock.patch("os.execv") 257 @mock.patch("subprocess.call") 258 @mock.patch("os._exit") 259 def _test(e, m, m2): 260 def check(x, y=[]): 261 z = [x] + y if not isinstance(x, list) else x + y 262 assert os.path.isfile(z[0]) 263 assert os.path.isfile(z[1]) 264 return 0 265 m2.side_effect = check 266 m.side_effect = check 267 e.side_effect = lambda x: None 268 restart() 269 _test() 270 finally: 271 conf.interactive = False 272 273 = Test linehexdump function 274 conf_color_theme = conf.color_theme 275 conf.color_theme = BlackAndWhite() 276 assert(linehexdump(Ether(src="00:01:02:03:04:05"), dump=True) == "FFFFFFFFFFFF0001020304059000 ..............") 277 conf.color_theme = conf_color_theme 278 279 = Test chexdump function 280 chexdump(Ether(src="00:01:02:02:04:05"), dump=True) == "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x02, 0x04, 0x05, 0x90, 0x00" 281 282 = Test repr_hex function 283 repr_hex("scapy") == "7363617079" 284 285 = Test hexstr function 286 hexstr(b"A\x00\xFFB") == "41 00 ff 42 A..B" 287 288 = Test fletcher16 functions 289 assert(fletcher16_checksum(b"\x28\x07") == 22319) 290 assert(fletcher16_checkbytes(b"\x28\x07", 1) == b"\xaf(") 291 292 = Test hexdiff function 293 ~ not_pypy 294 def test_hexdiff(): 295 conf_color_theme = conf.color_theme 296 conf.color_theme = BlackAndWhite() 297 with ContextManagerCaptureOutput() as cmco: 298 hexdiff("abcde", "abCde") 299 result_hexdiff = cmco.get_output() 300 conf.interactive = True 301 conf.color_theme = conf_color_theme 302 expected = "0000 61 62 63 64 65 abcde\n" 303 expected += " 0000 61 62 43 64 65 abCde\n" 304 assert(result_hexdiff == expected) 305 306 test_hexdiff() 307 308 = Test mysummary functions - Ether 309 310 Ether(dst="ff:ff:ff:ff:ff:ff", src="ff:ff:ff:ff:ff:ff", type=0x9000) 311 assert _.mysummary() in ['ff:ff:ff:ff:ff:ff > ff:ff:ff:ff:ff:ff (%s)' % loop 312 for loop in ['0x9000', 'LOOP']] 313 314 = Test zerofree_randstring function 315 random.seed(0x2807) 316 zerofree_randstring(4) in [b"\xd2\x12\xe4\x5b", b'\xd3\x8b\x13\x12'] 317 318 = Test export_object and import_object functions 319 import mock 320 def test_export_import_object(): 321 with ContextManagerCaptureOutput() as cmco: 322 export_object(2807) 323 result_export_object = cmco.get_output(eval_bytes=True) 324 assert(result_export_object.startswith("eNprYPL9zqUHAAdrAf8=")) 325 assert(import_object(result_export_object) == 2807) 326 327 test_export_import_object() 328 329 = Test tex_escape function 330 tex_escape("$#_") == "\\$\\#\\_" 331 332 = Test colgen function 333 f = colgen(range(3)) 334 assert(len([next(f) for i in range(2)]) == 2) 335 336 = Test incremental_label function 337 f = incremental_label() 338 assert([next(f) for i in range(2)] == ["tag00000", "tag00001"]) 339 340 = Test corrupt_* functions 341 import random 342 random.seed(0x2807) 343 assert(corrupt_bytes("ABCDE") in [b"ABCDW", b"ABCDX"]) 344 assert(sane(corrupt_bytes("ABCDE", n=3)) in ["A.8D4", ".2.DE"]) 345 346 assert(corrupt_bits("ABCDE") in [b"EBCDE", b"ABCDG"]) 347 assert(sane(corrupt_bits("ABCDE", n=3)) in ["AF.EE", "QB.TE"]) 348 349 = Test save_object and load_object functions 350 import tempfile 351 fd, fname = tempfile.mkstemp() 352 save_object(fname, 2807) 353 assert(load_object(fname) == 2807) 354 355 = Test whois function 356 if not WINDOWS: 357 result = whois("193.0.6.139") 358 assert(b"inetnum" in result and b"Amsterdam" in result) 359 360 = Test manuf DB methods 361 ~ manufdb 362 assert(conf.manufdb._resolve_MAC("00:00:0F:01:02:03") == "Next:01:02:03") 363 assert(conf.manufdb._get_short_manuf("00:00:0F:01:02:03") == "Next") 364 assert(in6_addrtovendor("fe80::0200:0fff:fe01:0203").lower().startswith("next")) 365 366 = Test utility functions - network related 367 ~ netaccess 368 369 atol("www.secdev.org") == 3642339845 370 371 = Test autorun functions 372 373 ret = autorun_get_text_interactive_session("IP().src") 374 assert(ret == (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1')) 375 376 ret = autorun_get_html_interactive_session("IP().src") 377 assert(ret == ("<span class=prompt>>>> </span>IP().src\n'127.0.0.1'\n", '127.0.0.1')) 378 379 ret = autorun_get_latex_interactive_session("IP().src") 380 assert(ret == ("\\textcolor{blue}{{\\tt\\char62}{\\tt\\char62}{\\tt\\char62} }IP().src\n'127.0.0.1'\n", '127.0.0.1')) 381 382 = Test utility TEX functions 383 384 assert tex_escape("{scapy}\\^$~#_&%|><") == "{\\tt\\char123}scapy{\\tt\\char125}{\\tt\\char92}\\^{}\\${\\tt\\char126}\\#\\_\\&\\%{\\tt\\char124}{\\tt\\char62}{\\tt\\char60}" 385 386 a = colgen(1, 2, 3) 387 assert next(a) == (1, 2, 2) 388 assert next(a) == (1, 3, 3) 389 assert next(a) == (2, 2, 1) 390 assert next(a) == (2, 3, 2) 391 assert next(a) == (2, 1, 3) 392 assert next(a) == (3, 3, 1) 393 assert next(a) == (3, 1, 2) 394 assert next(a) == (3, 2, 3) 395 396 = Test config file functions 397 398 saved_conf_verb = conf.verb 399 fd, fname = tempfile.mkstemp() 400 os.write(fd, b"conf.verb = 42\n") 401 os.close(fd) 402 from scapy.main import _read_config_file 403 _read_config_file(fname, globals(), locals()) 404 assert(conf.verb == 42) 405 conf.verb = saved_conf_verb 406 407 = Test CacheInstance repr 408 409 conf.netcache 410 411 412 ############ 413 ############ 414 + Basic tests 415 416 * Those test are here mainly to check nothing has been broken 417 * and to catch Exceptions 418 419 = Packet class methods 420 p = IP()/ICMP() 421 ret = p.do_build_ps() 422 assert(ret[0] == b"@\x00\x00\x00\x00\x01\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00") 423 assert(len(ret[1]) == 2) 424 425 assert(p[ICMP].firstlayer() == p) 426 427 assert(p.command() == "IP()/ICMP()") 428 429 p.decode_payload_as(UDP) 430 assert(p.sport == 2048 and p.dport == 63487) 431 432 = hide_defaults 433 conf_color_theme = conf.color_theme 434 conf.color_theme = BlackAndWhite() 435 p = IP(ttl=64)/ICMP() 436 assert(repr(p) in ["<IP frag=0 ttl=64 proto=icmp |<ICMP |>>", "<IP frag=0 ttl=64 proto=1 |<ICMP |>>"]) 437 p.hide_defaults() 438 assert(repr(p) in ["<IP frag=0 proto=icmp |<ICMP |>>", "<IP frag=0 proto=1 |<ICMP |>>"]) 439 conf.color_theme = conf_color_theme 440 441 = split_layers 442 p = IP()/ICMP() 443 s = raw(p) 444 split_layers(IP, ICMP, proto=1) 445 assert(Raw in IP(s)) 446 bind_layers(IP, ICMP, frag=0, proto=1) 447 448 = fuzz 449 ~ not_pypy random_weird_py3 450 random.seed(0x2807) 451 raw(fuzz(IP()/ICMP())) 452 assert _ in [ 453 b'u\x14\x00\x1c\xc2\xf6\x80\x00\xde\x01k\xd3\x7f\x00\x00\x01\x7f\x00\x00\x01y\xc9>\xa6\x84\xd8\xc2\xb7', 454 b'E\xa7\x00\x1c\xb0c\xc0\x00\xf6\x01U\xd3\x7f\x00\x00\x01\x7f\x00\x00\x01\xfex\xb3\x92B<\x0b\xb8', 455 ] 456 457 = Building some packets 458 ~ basic IP TCP UDP NTP LLC SNAP Dot11 459 IP()/TCP() 460 Ether()/IP()/UDP()/NTP() 461 Dot11()/LLC()/SNAP()/IP()/TCP()/"XXX" 462 IP(ttl=25)/TCP(sport=12, dport=42) 463 IP().summary() 464 465 = Manipulating some packets 466 ~ basic IP TCP 467 a=IP(ttl=4)/TCP() 468 a.ttl 469 a.ttl=10 470 del(a.ttl) 471 a.ttl 472 TCP in a 473 a[TCP] 474 a[TCP].dport=[80,443] 475 a 476 assert(a.copy().time == a.time) 477 a=3 478 479 480 = Checking overloads 481 ~ basic IP TCP Ether 482 a=Ether()/IP()/TCP() 483 a.proto 484 _ == 6 485 486 487 = sprintf() function 488 ~ basic sprintf Ether IP UDP NTP 489 a=Ether()/IP()/IP(ttl=4)/UDP()/NTP() 490 a.sprintf("%type% %IP.ttl% %#05xr,UDP.sport% %IP:2.ttl%") 491 _ in [ '0x800 64 0x07b 4', 'IPv4 64 0x07b 4'] 492 493 494 = sprintf() function 495 ~ basic sprintf IP TCP SNAP LLC Dot11 496 * This test is on the conditionnal substring feature of <tt>sprintf()</tt> 497 a=Dot11()/LLC()/SNAP()/IP()/TCP() 498 a.sprintf("{IP:{TCP:flags=%TCP.flags%}{UDP:port=%UDP.ports%} %IP.src%}") 499 _ == 'flags=S 127.0.0.1' 500 501 502 = haslayer function 503 ~ basic haslayer IP TCP ICMP ISAKMP 504 x=IP(id=1)/ISAKMP_payload_SA(prop=ISAKMP_payload_SA(prop=IP()/ICMP()))/TCP() 505 TCP in x, ICMP in x, IP in x, UDP in x 506 _ == (True,True,True,False) 507 508 = getlayer function 509 ~ basic getlayer IP ISAKMP UDP 510 x=IP(id=1)/ISAKMP_payload_SA(prop=IP(id=2)/UDP(dport=1))/IP(id=3)/UDP(dport=2) 511 x[IP] 512 x[IP:2] 513 x[IP:3] 514 x.getlayer(IP,3) 515 x.getlayer(IP,4) 516 x[UDP] 517 x[UDP:1] 518 x[UDP:2] 519 assert(x[IP].id == 1 and x[IP:2].id == 2 and x[IP:3].id == 3 and 520 x.getlayer(IP).id == 1 and x.getlayer(IP,3).id == 3 and 521 x.getlayer(IP,4) == None and 522 x[UDP].dport == 1 and x[UDP:2].dport == 2) 523 try: 524 x[IP:4] 525 except IndexError: 526 True 527 else: 528 False 529 530 = getlayer with a filter 531 ~ getlayer IP 532 pkt = IP() / IP(ttl=3) / IP() 533 assert pkt[IP::{"ttl":3}].ttl == 3 534 assert pkt.getlayer(IP, ttl=3).ttl == 3 535 536 = specific haslayer and getlayer implementations for NTP 537 ~ haslayer getlayer NTP 538 pkt = IP() / UDP() / NTPHeader() 539 assert NTP in pkt 540 assert pkt.haslayer(NTP) 541 assert isinstance(pkt[NTP], NTPHeader) 542 assert isinstance(pkt.getlayer(NTP), NTPHeader) 543 544 = specific haslayer and getlayer implementations for EAP 545 ~ haslayer getlayer EAP 546 pkt = Ether() / EAPOL() / EAP_MD5() 547 assert EAP in pkt 548 assert pkt.haslayer(EAP) 549 assert isinstance(pkt[EAP], EAP_MD5) 550 assert isinstance(pkt.getlayer(EAP), EAP_MD5) 551 552 = specific haslayer and getlayer implementations for RadiusAttribute 553 ~ haslayer getlayer RadiusAttribute 554 pkt = RadiusAttr_EAP_Message() 555 assert RadiusAttribute in pkt 556 assert pkt.haslayer(RadiusAttribute) 557 assert isinstance(pkt[RadiusAttribute], RadiusAttr_EAP_Message) 558 assert isinstance(pkt.getlayer(RadiusAttribute), RadiusAttr_EAP_Message) 559 560 561 = equality 562 ~ basic 563 w=Ether()/IP()/UDP(dport=53) 564 x=Ether()/IP(version=4)/UDP() 565 y=Ether()/IP()/UDP(dport=4) 566 z=Ether()/IP()/UDP()/NTP() 567 t=Ether()/IP()/TCP() 568 x==y, x==z, x==t, y==z, y==t, z==t, w==x 569 _ == (False, False, False, False, False, False, True) 570 571 = answers 572 ~ basic 573 a1, a2 = "1.2.3.4", "5.6.7.8" 574 p1 = IP(src=a1, dst=a2)/ICMP(type=8) 575 p2 = IP(src=a2, dst=a1)/ICMP(type=0) 576 assert p1.hashret() == p2.hashret() 577 assert not p1.answers(p2) 578 assert p2.answers(p1) 579 assert p1 > p2 580 assert p2 < p1 581 assert p1 == p1 582 conf_back = conf.checkIPinIP 583 conf.checkIPinIP = True 584 px = [IP()/p1, IPv6()/p1] 585 assert not any(p.hashret() == p2.hashret() for p in px) 586 assert not any(p.answers(p2) for p in px) 587 assert not any(p2.answers(p) for p in px) 588 conf.checkIPinIP = False 589 assert all(p.hashret() == p2.hashret() for p in px) 590 assert not any(p.answers(p2) for p in px) 591 assert all(p2.answers(p) for p in px) 592 conf.checkIPinIP = conf_back 593 594 a1, a2 = Net("www.google.com"), Net("www.secdev.org") 595 prt1, prt2 = 12345, 54321 596 s1, s2 = 2767216324, 3845532842 597 p1 = IP(src=a1, dst=a2)/TCP(flags='SA', seq=s1, ack=s2, sport=prt1, dport=prt2) 598 p2 = IP(src=a2, dst=a1)/TCP(flags='R', seq=s2, ack=0, sport=prt2, dport=prt1) 599 assert p2.answers(p1) 600 assert not p1.answers(p2) 601 # Not available yet because of IPv6 602 # a1, a2 = Net6("www.google.com"), Net6("www.secdev.org") 603 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) 604 p2 = IP(src=a2, dst=a1)/TCP(flags='RA', seq=0, ack=s1+1, sport=prt2, dport=prt1) 605 assert p2.answers(p1) 606 assert not p1.answers(p2) 607 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) 608 p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+1, sport=prt2, dport=prt1) 609 assert p2.answers(p1) 610 assert not p1.answers(p2) 611 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2) 612 assert not p2.answers(p1) 613 assert p1.answers(p2) 614 p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) 615 p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+10, sport=prt2, dport=prt1) 616 assert not p2.answers(p1) 617 assert not p1.answers(p2) 618 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2) 619 assert not p2.answers(p1) 620 assert not p1.answers(p2) 621 p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1+9, ack=s2+10, sport=prt1, dport=prt2) 622 assert not p2.answers(p1) 623 assert not p1.answers(p2) 624 625 626 ############ 627 ############ 628 + Tests on padding 629 630 = Padding assembly 631 raw(Padding("abc")) 632 assert( _ == b"abc" ) 633 raw(Padding("abc")/Padding("def")) 634 assert( _ == b"abcdef" ) 635 raw(Raw("ABC")/Padding("abc")/Padding("def")) 636 assert( _ == b"ABCabcdef" ) 637 raw(Raw("ABC")/Padding("abc")/Raw("DEF")/Padding("def")) 638 assert( _ == b"ABCDEFabcdef" ) 639 640 = Padding and length computation 641 IP(raw(IP()/Padding("abc"))) 642 assert( _.len == 20 and len(_) == 23 ) 643 IP(raw(IP()/Raw("ABC")/Padding("abc"))) 644 assert( _.len == 23 and len(_) == 26 ) 645 IP(raw(IP()/Raw("ABC")/Padding("abc")/Padding("def"))) 646 assert( _.len == 23 and len(_) == 29 ) 647 648 = PadField test 649 ~ PadField padding 650 651 class TestPad(Packet): 652 fields_desc = [ PadField(StrNullField("st", b""),4), StrField("id", b"")] 653 654 TestPad() == TestPad(raw(TestPad())) 655 656 657 ############ 658 ############ 659 + Tests on default value changes mechanism 660 661 = Creation of an IPv3 class from IP class with different default values 662 class IPv3(IP): 663 version = 3 664 ttl = 32 665 666 = Test of IPv3 class 667 a = IPv3() 668 a.version, a.ttl 669 assert(_ == (3,32)) 670 raw(a) 671 assert(_ == b'5\x00\x00\x14\x00\x01\x00\x00 \x00\xac\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01') 672 673 674 ############ 675 ############ 676 + ISAKMP transforms test 677 678 = ISAKMP creation 679 ~ IP UDP ISAKMP 680 p=IP(src='192.168.8.14',dst='10.0.0.1')/UDP()/ISAKMP()/ISAKMP_payload_SA(prop=ISAKMP_payload_Proposal(trans=ISAKMP_payload_Transform(transforms=[('Encryption', 'AES-CBC'), ('Hash', 'MD5'), ('Authentication', 'PSK'), ('GroupDesc', '1536MODPgr'), ('KeyLength', 256), ('LifeType', 'Seconds'), ('LifeDuration', 86400)])/ISAKMP_payload_Transform(res2=12345,transforms=[('Encryption', '3DES-CBC'), ('Hash', 'SHA'), ('Authentication', 'PSK'), ('GroupDesc', '1024MODPgr'), ('LifeType', 'Seconds'), ('LifeDuration', 86400)]))) 681 p.show() 682 p 683 684 685 = ISAKMP manipulation 686 ~ ISAKMP 687 p[ISAKMP_payload_Transform:2] 688 _.res2 == 12345 689 690 = ISAKMP assembly 691 ~ ISAKMP 692 hexdump(p) 693 raw(p) == b"E\x00\x00\x96\x00\x01\x00\x00@\x11\xa7\x9f\xc0\xa8\x08\x0e\n\x00\x00\x01\x01\xf4\x01\xf4\x00\x82\xbf\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00\x00\x00^\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00R\x01\x01\x00\x00\x03\x00\x00'\x00\x01\x00\x00\x80\x01\x00\x07\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x05\x80\x0e\x01\x00\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80\x00\x00\x00#\x00\x0109\x80\x01\x00\x05\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80" 694 695 696 = ISAKMP disassembly 697 ~ ISAKMP 698 q=IP(raw(p)) 699 q.show() 700 q[ISAKMP_payload_Transform:2] 701 _.res2 == 12345 702 703 704 ############ 705 ############ 706 + TFTP tests 707 708 = TFTP Options 709 x=IP()/UDP(sport=12345)/TFTP()/TFTP_RRQ(filename="fname")/TFTP_Options(options=[TFTP_Option(oname="blksize", value="8192"),TFTP_Option(oname="other", value="othervalue")]) 710 assert( raw(x) == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x0109\x00E\x004B6\x00\x01fname\x00octet\x00blksize\x008192\x00other\x00othervalue\x00' ) 711 y=IP(raw(x)) 712 y[TFTP_Option].oname 713 y[TFTP_Option:2].oname 714 assert(len(y[TFTP_Options].options) == 2 and y[TFTP_Option].oname == b"blksize") 715 716 717 ############ 718 ############ 719 + Dot11 tests 720 721 722 = WEP tests 723 ~ wifi crypto Dot11 LLC SNAP IP TCP 724 conf.wepkey = "Fobar" 725 raw(Dot11WEP()/LLC()/SNAP()/IP()/TCP(seq=12345678)) 726 assert(_ == b'\x00\x00\x00\x00\xe3OjYLw\xc3x_%\xd0\xcf\xdeu-\xc3pH#\x1eK\xae\xf5\xde\xe7\xb8\x1d,\xa1\xfe\xe83\xca\xe1\xfe\xbd\xfe\xec\x00)T`\xde.\x93Td\x95C\x0f\x07\xdd') 727 Dot11WEP(_) 728 assert(TCP in _ and _[TCP].seq == 12345678) 729 730 = RadioTap Big-Small endian dissection 731 data = b'\x00\x00\x1a\x00/H\x00\x00\xe1\xd3\xcb\x05\x00\x00\x00\x00@0x\x14@\x01\xac\x00\x00\x00' 732 r = RadioTap(data) 733 r.show() 734 assert r.present == 18479 735 736 737 ############ 738 ############ 739 + SNMP tests 740 741 = SNMP assembling 742 ~ SNMP ASN1 743 raw(SNMP()) 744 assert(_ == b'0\x18\x02\x01\x01\x04\x06public\xa0\x0b\x02\x01\x00\x02\x01\x00\x02\x01\x000\x00') 745 SNMP(version="v2c", community="ABC", PDU=SNMPbulk(id=4,varbindlist=[SNMPvarbind(oid="1.2.3.4",value=ASN1_INTEGER(7)),SNMPvarbind(oid="4.3.2.1.2.3",value=ASN1_IA5_STRING("testing123"))])) 746 raw(_) 747 assert(_ == b'05\x02\x01\x01\x04\x03ABC\xa5+\x02\x01\x04\x02\x01\x00\x02\x01\x000 0\x08\x06\x03*\x03\x04\x02\x01\x070\x14\x06\x06\x81#\x02\x01\x02\x03\x16\ntesting123') 748 749 = SNMP disassembling 750 ~ SNMP ASN1 751 x=SNMP(b'0y\x02\x01\x00\x04\x06public\xa2l\x02\x01)\x02\x01\x00\x02\x01\x000a0!\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb78\x04\x0b172.31.19.20#\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb76\x04\r255.255.255.00\x17\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x05\n\x86\xde\xb9`\x02\x01\x01') 752 x.show() 753 assert(x.community==b"public" and x.version == 0) 754 assert(x.PDU.id == 41 and len(x.PDU.varbindlist) == 3) 755 assert(x.PDU.varbindlist[0].oid == "1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104") 756 assert(x.PDU.varbindlist[0].value == b"172.31.19.2") 757 assert(x.PDU.varbindlist[2].oid == "1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400") 758 assert(x.PDU.varbindlist[2].value == 1) 759 760 = ASN1 - ASN1_Object 761 assert ASN1_Object(1) == ASN1_Object(1) 762 assert ASN1_Object(1) > ASN1_Object(0) 763 assert ASN1_Object(1) >= ASN1_Object(1) 764 assert ASN1_Object(0) < ASN1_Object(1) 765 assert ASN1_Object(1) <= ASN1_Object(2) 766 assert ASN1_Object(1) != ASN1_Object(2) 767 ASN1_Object(2).show() 768 769 = ASN1 - RandASN1Object 770 ~ random_weird_py3 771 a = RandASN1Object() 772 random.seed(0x2807) 773 assert raw(a) in [b'A\x02\x07q', b'C\x02\xfe\x92', b'\x1e\x023V'] 774 775 = ASN1 - ASN1_BIT_STRING 776 a = ASN1_BIT_STRING("test", "value") 777 a 778 assert raw(a) == b'test' 779 780 a = ASN1_BIT_STRING(b"\xff"*16, "value") 781 a 782 assert raw(a) == b'\xff'*16 783 784 = ASN1 - ASN1_SEQUENCE 785 a = ASN1_SEQUENCE([ASN1_Object(1), ASN1_Object(0)]) 786 assert a.strshow() == '# ASN1_SEQUENCE:\n <ASN1_Object[1]>\n <ASN1_Object[0]>\n' 787 788 = ASN1 - ASN1_DECODING_ERROR 789 a = ASN1_DECODING_ERROR("error", exc=OSError(1)) 790 assert repr(a) == "<ASN1_DECODING_ERROR['error']{{1}}>" 791 b = ASN1_DECODING_ERROR("error", exc=OSError(ASN1_BIT_STRING("0"))) 792 assert repr(b) == "<ASN1_DECODING_ERROR['error']{{<ASN1_BIT_STRING[0] (7 unused bits)>}}>" 793 794 = ASN1 - ASN1_INTEGER 795 a = ASN1_INTEGER(int("1"*23)) 796 assert repr(a) in ["0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...1111111111]>", 797 "0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...111111111L]>"] 798 799 = RandASN1Object(), specific crashes 800 801 import random 802 803 # ASN1F_NUMERIC_STRING 804 random.seed(1514315682) 805 raw(RandASN1Object()) 806 807 # ASN1F_VIDEOTEX_STRING 808 random.seed(1240186058) 809 raw(RandASN1Object()) 810 811 # ASN1F_UTC_TIME & ASN1F_GENERALIZED_TIME 812 random.seed(1873503288) 813 raw(RandASN1Object()) 814 815 816 ############ 817 ############ 818 + Network tests 819 820 * Those tests need network access 821 822 = Sending and receiving an ICMP 823 ~ netaccess IP ICMP 824 old_debug_dissector = conf.debug_dissector 825 conf.debug_dissector = False 826 x = sr1(IP(dst="www.google.com")/ICMP(),timeout=3) 827 conf.debug_dissector = old_debug_dissector 828 x 829 assert x[IP].ottl() in [32, 64, 128, 255] 830 assert 0 <= x[IP].hops() <= 126 831 x is not None and ICMP in x and x[ICMP].type == 0 832 833 = Sending an ICMP message at layer 2 and layer 3 834 ~ netaccess IP ICMP 835 tmp = send(IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True) 836 assert(len(tmp) == 1) 837 838 tmp = sendp(Ether()/IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True) 839 assert(len(tmp) == 1) 840 841 = Sending an ICMP message 'forever' at layer 2 and layer 3 842 ~ netaccess IP ICMP 843 tmp = srloop(IP(dst="8.8.8.8")/ICMP(), count=1) 844 assert(type(tmp) == tuple and len(tmp[0]) == 1) 845 846 tmp = srploop(Ether()/IP(dst="8.8.8.8")/ICMP(), count=1) 847 assert(type(tmp) == tuple and len(tmp[0]) == 1) 848 849 = Sending and receiving an ICMP with flooding methods 850 ~ netaccess IP ICMP 851 from functools import partial 852 # flooding methods do not support timeout. Packing the test for security 853 def _test_flood(flood_function, add_ether=False): 854 old_debug_dissector = conf.debug_dissector 855 conf.debug_dissector = False 856 p = IP(dst="www.google.com")/ICMP() 857 if add_ether: 858 p = Ether()/p 859 x = flood_function(p) 860 conf.debug_dissector = old_debug_dissector 861 if type(x) == tuple: 862 x = x[0][0][1] 863 x 864 assert x[IP].ottl() in [32, 64, 128, 255] 865 assert 0 <= x[IP].hops() <= 126 866 x is not None and ICMP in x and x[ICMP].type == 0 867 868 _test_srflood = partial(_test_flood, srflood) 869 t = Thread(target=_test_srflood) 870 t.start() 871 t.join(3) 872 assert not t.is_alive() 873 874 _test_sr1flood = partial(_test_flood, sr1flood) 875 t = Thread(target=_test_sr1flood) 876 t.start() 877 t.join(3) 878 assert not t.is_alive() 879 880 _test_srpflood = partial(_test_flood, srpflood, True) 881 t = Thread(target=_test_sr1flood) 882 t.start() 883 t.join(3) 884 assert not t.is_alive() 885 886 _test_srp1flood = partial(_test_flood, srp1flood, True) 887 t = Thread(target=_test_sr1flood) 888 t.start() 889 t.join(3) 890 assert not t.is_alive() 891 892 = Sending and receiving an ICMPv6EchoRequest 893 ~ netaccess ipv6 894 old_debug_dissector = conf.debug_dissector 895 conf.debug_dissector = False 896 x = sr1(IPv6(dst="www.google.com")/ICMPv6EchoRequest(),timeout=3) 897 conf.debug_dissector = old_debug_dissector 898 x 899 assert x[IPv6].ottl() in [32, 64, 128, 255] 900 assert 0 <= x[IPv6].hops() <= 126 901 x is not None and ICMPv6EchoReply in x and x[ICMPv6EchoReply].type == 129 902 903 = DNS request 904 ~ netaccess IP UDP DNS 905 * A possible cause of failure could be that the open DNS (resolver1.opendns.com) 906 * is not reachable or down. 907 old_debug_dissector = conf.debug_dissector 908 conf.debug_dissector = False 909 dns_ans = sr1(IP(dst="resolver1.opendns.com")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.com")),timeout=5) 910 conf.debug_dissector = old_debug_dissector 911 DNS in dns_ans 912 913 = Whois request 914 ~ netaccess IP 915 * This test retries on failure because it often fails 916 import time 917 import socket 918 success = False 919 for i in six.moves.range(5): 920 try: 921 IP(src="8.8.8.8").whois() 922 except socket.error: 923 time.sleep(2) 924 else: 925 success = True 926 break 927 928 assert success 929 930 = AS resolvers 931 ~ netaccess IP 932 * This test retries on failure because it often fails 933 934 ret = list() 935 success = False 936 for i in six.moves.range(5): 937 try: 938 ret = conf.AS_resolver.resolve("8.8.8.8", "8.8.4.4") 939 except RuntimeError: 940 time.sleep(2) 941 else: 942 success = True 943 break 944 945 assert (len(ret) == 2) 946 all(x[1] == "AS15169" for x in ret) 947 948 ret = list() 949 success = False 950 for i in six.moves.range(5): 951 try: 952 ret = AS_resolver_riswhois().resolve("8.8.8.8") 953 except socket.error: 954 time.sleep(2) 955 else: 956 success = True 957 break 958 959 assert (len(ret) == 1) 960 assert all(x[1] == "AS15169" for x in ret) 961 962 # This test is too buggy, and is simulated below 963 #ret = list() 964 #success = False 965 #for i in six.moves.range(5): 966 # try: 967 # ret = AS_resolver_cymru().resolve("8.8.8.8") 968 # except socket.error: 969 # time.sleep(2) 970 # else: 971 # success = True 972 # break 973 # 974 #assert (len(ret) == 1) 975 # 976 #all(x[1] == "AS15169" for x in ret) 977 978 cymru_bulk_data = """ 979 Bulk mode; whois.cymru.com [2017-10-03 08:38:08 +0000] 980 24776 | 217.25.178.5 | INFOCLIP-AS, FR 981 36459 | 192.30.253.112 | GITHUB - GitHub, Inc., US 982 26496 | 68.178.213.61 | AS-26496-GO-DADDY-COM-LLC - GoDaddy.com, LLC, US 983 """ 984 tmp = AS_resolver_cymru().parse(cymru_bulk_data) 985 assert(len(tmp) == 3) 986 assert([l[1] for l in tmp] == ['AS24776', 'AS36459', 'AS26496']) 987 988 = AS resolver - IPv6 989 ~ netaccess IP 990 * This test retries on failure because it often fails 991 992 ret = list() 993 success = False 994 as_resolver6 = AS_resolver6() 995 for i in six.moves.range(5): 996 try: 997 ret = as_resolver6.resolve("2001:4860:4860::8888", "2001:4860:4860::4444") 998 except socket.error: 999 time.sleep(2) 1000 else: 1001 success = True 1002 break 1003 1004 assert (len(ret) == 2) 1005 assert all(x[1] == 15169 for x in ret) 1006 1007 = sendpfast 1008 1009 old_interactive = conf.interactive 1010 conf.interactive = False 1011 try: 1012 sendpfast([]) 1013 assert False 1014 except Exception: 1015 assert True 1016 1017 conf.interactive = old_interactive 1018 assert True 1019 1020 ############ 1021 ############ 1022 + More complex tests 1023 1024 = Implicit logic 1025 ~ IP TCP 1026 a = Ether() / IP(ttl=(5, 10)) / TCP(dport=[80, 443]) 1027 ls(a) 1028 ls(a, verbose=True) 1029 [p for p in a] 1030 len(_) == 12 1031 1032 1033 ############ 1034 ############ 1035 + Real usages 1036 1037 = Port scan 1038 ~ netaccess IP TCP 1039 old_debug_dissector = conf.debug_dissector 1040 conf.debug_dissector = False 1041 ans,unans=sr(IP(dst="www.google.com/30")/TCP(dport=[80,443]),timeout=2) 1042 conf.debug_dissector = old_debug_dissector 1043 ans.make_table(lambda s_r: (s_r[0].dst, s_r[0].dport, s_r[1].sprintf("{TCP:%TCP.flags%}{ICMP:%ICMP.code%}"))) 1044 1045 = Send & receive with retry 1046 ~ netaccess IP ICMP 1047 old_debug_dissector = conf.debug_dissector 1048 conf.debug_dissector = False 1049 ans, unans = sr(IP(dst=["8.8.8.8", "1.2.3.4"]) / ICMP(), timeout=2, retry=1) 1050 conf.debug_dissector = old_debug_dissector 1051 len(ans) == 1 and len(unans) == 1 1052 1053 = Traceroute function 1054 ~ netaccess 1055 * Let's test traceroute 1056 traceroute("www.slashdot.org") 1057 ans,unans=_ 1058 1059 = Result manipulation 1060 ~ netaccess 1061 ans.nsummary() 1062 s,r=ans[0] 1063 s.show() 1064 s.show(2) 1065 1066 = DNS packet manipulation 1067 ~ netaccess IP UDP DNS 1068 dns_ans.show() 1069 dns_ans.show2() 1070 dns_ans[DNS].an.show() 1071 dns_ans2 = IP(raw(dns_ans)) 1072 DNS in dns_ans2 1073 assert(raw(dns_ans2) == raw(dns_ans)) 1074 dns_ans2.qd.qname = "www.secdev.org." 1075 * We need to recalculate these values 1076 del(dns_ans2[IP].len) 1077 del(dns_ans2[IP].chksum) 1078 del(dns_ans2[UDP].len) 1079 del(dns_ans2[UDP].chksum) 1080 assert(b"\x03www\x06secdev\x03org\x00" in raw(dns_ans2)) 1081 assert(DNS in IP(raw(dns_ans2))) 1082 1083 = Arping 1084 ~ netaccess 1085 * This test assumes the local network is a /24. This is bad. 1086 conf.route.route("0.0.0.0")[2] 1087 arping(_+"/24") 1088 1089 = send() and sniff() 1090 ~ netaccess 1091 import time 1092 import os 1093 1094 from scapy.modules.six.moves.queue import Queue 1095 1096 def _send_or_sniff(pkt, timeout, flt, pid, fork, t_other=None, opened_socket=None): 1097 assert pid != -1 1098 if pid == 0: 1099 time.sleep(1) 1100 (sendp if isinstance(pkt, (Ether, Dot3)) else send)(pkt) 1101 if fork: 1102 os._exit(0) 1103 else: 1104 return 1105 else: 1106 spkt = raw(pkt) 1107 # We do not want to crash when a packet cannot be parsed 1108 old_debug_dissector = conf.debug_dissector 1109 conf.debug_dissector = False 1110 pkts = sniff( 1111 timeout=timeout, filter=flt, opened_socket=opened_socket, 1112 stop_filter=lambda p: pkt.__class__ in p and raw(p[pkt.__class__]) == spkt 1113 ) 1114 conf.debug_dissector = old_debug_dissector 1115 if fork: 1116 os.waitpid(pid, 0) 1117 else: 1118 t_other.join() 1119 assert raw(pkt) in (raw(p[pkt.__class__]) for p in pkts if pkt.__class__ in p) 1120 1121 def send_and_sniff(pkt, timeout=2, flt=None, opened_socket=None): 1122 """Send a packet, sniff, and check the packet has been seen""" 1123 if hasattr(os, "fork"): 1124 _send_or_sniff(pkt, timeout, flt, os.fork(), True) 1125 else: 1126 from threading import Thread 1127 def run_function(pkt, timeout, flt, pid, thread, results, opened_socket): 1128 _send_or_sniff(pkt, timeout, flt, pid, False, t_other=thread, opened_socket=opened_socket) 1129 results.put(True) 1130 results = Queue() 1131 t_parent = Thread(target=run_function, args=(pkt, timeout, flt, 0, None, results, None)) 1132 t_child = Thread(target=run_function, args=(pkt, timeout, flt, 1, t_parent, results, opened_socket)) 1133 t_parent.start() 1134 t_child.start() 1135 t_parent.join() 1136 t_child.join() 1137 assert results.qsize() >= 2 1138 while not results.empty(): 1139 assert results.get() 1140 1141 send_and_sniff(IP(dst="secdev.org")/ICMP()) 1142 send_and_sniff(IP(dst="secdev.org")/ICMP(), flt="icmp") 1143 send_and_sniff(Ether()/IP(dst="secdev.org")/ICMP()) 1144 1145 = Test L2ListenTcpdump socket 1146 ~ netaccess FIXME_py3 1147 1148 # Often (but not always) fails with Python 3 1149 import time 1150 for i in range(10): 1151 read_s = L2ListenTcpdump(iface=conf.iface) 1152 out_s = conf.L2socket(iface=conf.iface) 1153 time.sleep(5) # wait for read_s to be ready 1154 icmp_r = Ether()/IP(dst="secdev.org")/ICMP() 1155 res = sndrcv(out_s, icmp_r, timeout=5, rcv_pks=read_s)[0] 1156 read_s.close() 1157 out_s.close() 1158 time.sleep(5) 1159 if res: 1160 break 1161 1162 response = res[0][1] 1163 assert response[ICMP].type == 0 1164 1165 ############ 1166 ############ 1167 + ManuFDB tests 1168 1169 = __repr__ 1170 1171 if conf.manufdb: 1172 len(conf.manufdb) 1173 else: 1174 True 1175 1176 = check _resolve_MAC 1177 1178 if conf.manufdb: 1179 assert conf.manufdb._resolve_MAC("00:00:63") == "HP" 1180 else: 1181 True 1182 1183 ############ 1184 ############ 1185 + Automaton tests 1186 1187 = Simple automaton 1188 ~ automaton 1189 class ATMT1(Automaton): 1190 def parse_args(self, init, *args, **kargs): 1191 Automaton.parse_args(self, *args, **kargs) 1192 self.init = init 1193 @ATMT.state(initial=1) 1194 def BEGIN(self): 1195 raise self.MAIN(self.init) 1196 @ATMT.state() 1197 def MAIN(self, s): 1198 return s 1199 @ATMT.condition(MAIN, prio=-1) 1200 def go_to_END(self, s): 1201 if len(s) > 20: 1202 raise self.END(s).action_parameters(s) 1203 @ATMT.condition(MAIN) 1204 def trA(self, s): 1205 if s.endswith("b"): 1206 raise self.MAIN(s+"a") 1207 @ATMT.condition(MAIN) 1208 def trB(self, s): 1209 if s.endswith("a"): 1210 raise self.MAIN(s*2+"b") 1211 @ATMT.state(final=1) 1212 def END(self, s): 1213 return s 1214 @ATMT.action(go_to_END) 1215 def action_test(self, s): 1216 self.result = s 1217 1218 = Simple automaton Tests 1219 ~ automaton 1220 1221 a=ATMT1(init="a", ll=lambda: None, recvsock=lambda: None) 1222 a.run() 1223 assert( _ == 'aabaaababaaabaaababab' ) 1224 a.result 1225 assert( _ == 'aabaaababaaabaaababab' ) 1226 a=ATMT1(init="b", ll=lambda: None, recvsock=lambda: None) 1227 a.run() 1228 assert( _ == 'babababababababababababababab' ) 1229 a.result 1230 assert( _ == 'babababababababababababababab' ) 1231 1232 = Simple automaton stuck test 1233 ~ automaton 1234 1235 try: 1236 ATMT1(init="", ll=lambda: None, recvsock=lambda: None).run() 1237 except Automaton.Stuck: 1238 True 1239 else: 1240 False 1241 1242 1243 = Automaton state overloading 1244 ~ automaton 1245 class ATMT2(ATMT1): 1246 @ATMT.state() 1247 def MAIN(self, s): 1248 return "c"+ATMT1.MAIN(self, s).run() 1249 1250 a=ATMT2(init="a", ll=lambda: None, recvsock=lambda: None) 1251 a.run() 1252 assert( _ == 'ccccccacabacccacababacccccacabacccacababab' ) 1253 1254 1255 a.result 1256 assert( _ == 'ccccccacabacccacababacccccacabacccacababab' ) 1257 a=ATMT2(init="b", ll=lambda: None, recvsock=lambda: None) 1258 a.run() 1259 assert( _ == 'cccccbaccbabaccccbaccbabab') 1260 a.result 1261 assert( _ == 'cccccbaccbabaccccbaccbabab') 1262 1263 1264 = Automaton condition overloading 1265 ~ automaton 1266 class ATMT3(ATMT2): 1267 @ATMT.condition(ATMT1.MAIN) 1268 def trA(self, s): 1269 if s.endswith("b"): 1270 raise self.MAIN(s+"da") 1271 1272 1273 a=ATMT3(init="a", debug=2, ll=lambda: None, recvsock=lambda: None) 1274 a.run() 1275 assert( _ == 'cccccacabdacccacabdabda') 1276 a.result 1277 assert( _ == 'cccccacabdacccacabdabda') 1278 a=ATMT3(init="b", ll=lambda: None, recvsock=lambda: None) 1279 a.run() 1280 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' ) 1281 1282 a.result 1283 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' ) 1284 1285 1286 = Automaton action overloading 1287 ~ automaton 1288 class ATMT4(ATMT3): 1289 @ATMT.action(ATMT1.go_to_END) 1290 def action_test(self, s): 1291 self.result = "e"+s+"e" 1292 1293 a=ATMT4(init="a", ll=lambda: None, recvsock=lambda: None) 1294 a.run() 1295 assert( _ == 'cccccacabdacccacabdabda') 1296 a.result 1297 assert( _ == 'ecccccacabdacccacabdabdae') 1298 a=ATMT4(init="b", ll=lambda: None, recvsock=lambda: None) 1299 a.run() 1300 assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' ) 1301 a.result 1302 assert( _ == 'ecccccbdaccbdabdaccccbdaccbdabdabe' ) 1303 1304 1305 = Automaton priorities 1306 ~ automaton 1307 class ATMT5(Automaton): 1308 @ATMT.state(initial=1) 1309 def BEGIN(self): 1310 self.res = "J" 1311 @ATMT.condition(BEGIN, prio=1) 1312 def tr1(self): 1313 self.res += "i" 1314 raise self.END() 1315 @ATMT.condition(BEGIN) 1316 def tr2(self): 1317 self.res += "p" 1318 @ATMT.condition(BEGIN, prio=-1) 1319 def tr3(self): 1320 self.res += "u" 1321 1322 @ATMT.action(tr1) 1323 def ac1(self): 1324 self.res += "e" 1325 @ATMT.action(tr1, prio=-1) 1326 def ac2(self): 1327 self.res += "t" 1328 @ATMT.action(tr1, prio=1) 1329 def ac3(self): 1330 self.res += "r" 1331 1332 @ATMT.state(final=1) 1333 def END(self): 1334 return self.res 1335 1336 a=ATMT5(ll=lambda: None, recvsock=lambda: None) 1337 a.run() 1338 assert( _ == 'Jupiter' ) 1339 1340 = Automaton test same action for many conditions 1341 ~ automaton 1342 class ATMT6(Automaton): 1343 @ATMT.state(initial=1) 1344 def BEGIN(self): 1345 self.res="M" 1346 @ATMT.condition(BEGIN) 1347 def tr1(self): 1348 raise self.MIDDLE() 1349 @ATMT.action(tr1) # default prio=0 1350 def add_e(self): 1351 self.res += "e" 1352 @ATMT.action(tr1, prio=2) 1353 def add_c(self): 1354 self.res += "c" 1355 @ATMT.state() 1356 def MIDDLE(self): 1357 self.res += "u" 1358 @ATMT.condition(MIDDLE) 1359 def tr2(self): 1360 raise self.END() 1361 @ATMT.action(tr2, prio=2) 1362 def add_y(self): 1363 self.res += "y" 1364 @ATMT.action(tr1, prio=1) 1365 @ATMT.action(tr2) 1366 def add_r(self): 1367 self.res += "r" 1368 @ATMT.state(final=1) 1369 def END(self): 1370 return self.res 1371 1372 a=ATMT6(ll=lambda: None, recvsock=lambda: None) 1373 a.run() 1374 assert( _ == 'Mercury' ) 1375 1376 a.restart() 1377 a.run() 1378 assert( _ == 'Mercury' ) 1379 1380 = Automaton test io event 1381 ~ automaton 1382 1383 class ATMT7(Automaton): 1384 @ATMT.state(initial=1) 1385 def BEGIN(self): 1386 self.res = "S" 1387 @ATMT.ioevent(BEGIN, name="tst") 1388 def tr1(self, fd): 1389 self.res += fd.recv() 1390 raise self.NEXT_STATE() 1391 @ATMT.state() 1392 def NEXT_STATE(self): 1393 self.oi.tst.send("ur") 1394 @ATMT.ioevent(NEXT_STATE, name="tst") 1395 def tr2(self, fd): 1396 self.res += fd.recv() 1397 raise self.END() 1398 @ATMT.state(final=1) 1399 def END(self): 1400 self.res += "n" 1401 return self.res 1402 1403 a=ATMT7(ll=lambda: None, recvsock=lambda: None) 1404 a.run(wait=False) 1405 a.io.tst.send("at") 1406 a.io.tst.recv() 1407 a.io.tst.send(_) 1408 a.run() 1409 assert( _ == "Saturn" ) 1410 1411 a.restart() 1412 a.run(wait=False) 1413 a.io.tst.send("at") 1414 a.io.tst.recv() 1415 a.io.tst.send(_) 1416 a.run() 1417 assert( _ == "Saturn" ) 1418 1419 = Automaton test io event from external fd 1420 ~ automaton 1421 import os 1422 1423 class ATMT8(Automaton): 1424 @ATMT.state(initial=1) 1425 def BEGIN(self): 1426 self.res = b"U" 1427 @ATMT.ioevent(BEGIN, name="extfd") 1428 def tr1(self, fd): 1429 self.res += fd.read(2) 1430 raise self.NEXT_STATE() 1431 @ATMT.state() 1432 def NEXT_STATE(self): 1433 pass 1434 @ATMT.ioevent(NEXT_STATE, name="extfd") 1435 def tr2(self, fd): 1436 self.res += fd.read(2) 1437 raise self.END() 1438 @ATMT.state(final=1) 1439 def END(self): 1440 self.res += b"s" 1441 return self.res 1442 1443 if WINDOWS: 1444 r = w = ObjectPipe() 1445 else: 1446 r,w = os.pipe() 1447 1448 def writeOn(w, msg): 1449 if WINDOWS: 1450 w.write(msg) 1451 else: 1452 os.write(w, msg) 1453 1454 a=ATMT8(external_fd={"extfd":r}, ll=lambda: None, recvsock=lambda: None) 1455 a.run(wait=False) 1456 writeOn(w, b"ra") 1457 writeOn(w, b"nu") 1458 1459 a.run() 1460 assert( _ == b"Uranus" ) 1461 1462 a.restart() 1463 a.run(wait=False) 1464 writeOn(w, b"ra") 1465 writeOn(w, b"nu") 1466 a.run() 1467 assert( _ == b"Uranus" ) 1468 1469 = Automaton test interception_points, and restart 1470 ~ automaton 1471 class ATMT9(Automaton): 1472 def my_send(self, x): 1473 self.io.loop.send(x) 1474 @ATMT.state(initial=1) 1475 def BEGIN(self): 1476 self.res = "V" 1477 self.send(Raw("ENU")) 1478 @ATMT.ioevent(BEGIN, name="loop") 1479 def received_sth(self, fd): 1480 self.res += plain_str(fd.recv().load) 1481 raise self.END() 1482 @ATMT.state(final=1) 1483 def END(self): 1484 self.res += "s" 1485 return self.res 1486 1487 a=ATMT9(debug=5, ll=lambda: None, recvsock=lambda: None) 1488 a.run() 1489 assert( _ == "VENUs" ) 1490 1491 a.restart() 1492 a.run() 1493 assert( _ == "VENUs" ) 1494 1495 a.restart() 1496 a.BEGIN.intercepts() 1497 while True: 1498 try: 1499 x = a.run() 1500 except Automaton.InterceptionPoint as p: 1501 a.accept_packet(Raw(p.packet.load.lower()), wait=False) 1502 else: 1503 break 1504 1505 x 1506 assert( _ == "Venus" ) 1507 1508 1509 ############ 1510 ############ 1511 + Test IP options 1512 1513 = IP options individual assembly 1514 ~ IP options 1515 raw(IPOption()) 1516 assert(_ == b'\x00\x02') 1517 raw(IPOption_NOP()) 1518 assert(_ == b'\x01') 1519 raw(IPOption_EOL()) 1520 assert(_ == b'\x00') 1521 raw(IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"])) 1522 assert(_ == b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08') 1523 1524 = IP options individual dissection 1525 ~ IP options 1526 IPOption(b"\x00") 1527 assert(_.option == 0 and isinstance(_, IPOption_EOL)) 1528 IPOption(b"\x01") 1529 assert(_.option == 1 and isinstance(_, IPOption_NOP)) 1530 lsrr=b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08' 1531 p=IPOption_LSRR(lsrr) 1532 p 1533 q=IPOption(lsrr) 1534 q 1535 assert(p == q) 1536 1537 = IP assembly and dissection with options 1538 ~ IP options 1539 p = IP(src="9.10.11.12",dst="13.14.15.16",options=IPOption_SDBM(addresses=["1.2.3.4","5.6.7.8"]))/TCP() 1540 raw(p) 1541 assert(_ == b'H\x00\x004\x00\x01\x00\x00@\x06\xa2q\t\n\x0b\x0c\r\x0e\x0f\x10\x95\n\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00') 1542 q=IP(_) 1543 q 1544 assert( isinstance(q.options[0],IPOption_SDBM) ) 1545 assert( q[IPOption_SDBM].addresses[1] == "5.6.7.8" ) 1546 p.options[0].addresses[0] = '5.6.7.8' 1547 assert( IP(raw(p)).options[0].addresses[0] == '5.6.7.8' ) 1548 IP(src="9.10.11.12", dst="13.14.15.16", options=[IPOption_NOP(),IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"]),IPOption_Security(transmission_control_code="XYZ")])/TCP() 1549 raw(_) 1550 assert(_ == b'K\x00\x00@\x00\x01\x00\x00@\x06\xf3\x83\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08\x82\x0b\x00\x00\x00\x00\x00\x00XYZ\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00') 1551 IP(_) 1552 q=_ 1553 assert(q[IPOption_LSRR].get_current_router() == "1.2.3.4") 1554 assert(q[IPOption_Security].transmission_control_code == b"XYZ") 1555 assert(q[TCP].flags == 2) 1556 1557 1558 ############ 1559 ############ 1560 + Test PPP 1561 1562 = PPP/HDLC 1563 ~ ppp hdlc 1564 HDLC()/PPP()/PPP_IPCP() 1565 raw(_) 1566 s=_ 1567 assert(s == b'\xff\x03\x80!\x01\x00\x00\x04') 1568 PPP(s) 1569 p=_ 1570 assert(HDLC in p) 1571 assert(p[HDLC].control==3) 1572 assert(p[PPP].proto==0x8021) 1573 PPP(s[2:]) 1574 q=_ 1575 assert(HDLC not in q) 1576 assert(q[PPP].proto==0x8021) 1577 1578 1579 = PPP IPCP 1580 ~ ppp ipcp 1581 PPP(b'\x80!\x01\x01\x00\x10\x03\x06\xc0\xa8\x01\x01\x02\x06\x00-\x0f\x01') 1582 p=_ 1583 assert(p[PPP_IPCP].code == 1) 1584 assert(p[PPP_IPCP_Option_IPAddress].data=="192.168.1.1") 1585 assert(p[PPP_IPCP_Option].data == b'\x00-\x0f\x01') 1586 p=PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")]) 1587 raw(p) 1588 assert(_ == b'\x80!\x01\x00\x00\x16\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08\x84\x06\t\n\x0b\x0c') 1589 PPP(_) 1590 q=_ 1591 assert(raw(p) == raw(q)) 1592 assert(PPP(raw(q))==q) 1593 PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option(type=123,data="ABCDEFG"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")]) 1594 p=_ 1595 raw(p) 1596 assert(_ == b'\x80!\x01\x00\x00\x1f\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08{\tABCDEFG\x84\x06\t\n\x0b\x0c') 1597 PPP(_) 1598 q=_ 1599 assert( q[PPP_IPCP_Option].type == 123 ) 1600 assert( q[PPP_IPCP_Option].data == b"ABCDEFG" ) 1601 assert( q[PPP_IPCP_Option_NBNS2].data == '9.10.11.12' ) 1602 1603 1604 = PPP ECP 1605 ~ ppp ecp 1606 1607 PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ")]) 1608 p=_ 1609 raw(p) 1610 assert(_ == b'\x80S\x01\x00\x00\n\x00\x06XYZ\x00') 1611 PPP(_) 1612 q=_ 1613 assert( raw(p)==raw(q) ) 1614 PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ"),PPP_ECP_Option(type=1,data="ABCDEFG")]) 1615 p=_ 1616 raw(p) 1617 assert(_ == b'\x80S\x01\x00\x00\x13\x00\x06XYZ\x00\x01\tABCDEFG') 1618 PPP(_) 1619 q=_ 1620 assert( raw(p) == raw(q) ) 1621 assert( q[PPP_ECP_Option].data == b"ABCDEFG" ) 1622 1623 1624 # Scapy6 Regression Test Campaign 1625 1626 ############ 1627 ############ 1628 + Test IPv6 Class 1629 = IPv6 Class basic Instantiation 1630 a=IPv6() 1631 1632 = IPv6 Class basic build (default values) 1633 raw(IPv6()) == b'`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 1634 1635 = IPv6 Class basic dissection (default values) 1636 a=IPv6(raw(IPv6())) 1637 a.version == 6 and a.tc == 0 and a.fl == 0 and a.plen == 0 and a.nh == 59 and a.hlim ==64 and a.src == "::1" and a.dst == "::1" 1638 1639 = IPv6 Class with basic TCP stacked - build 1640 raw(IPv6()/TCP()) == b'`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00' 1641 1642 = IPv6 Class with basic TCP stacked - dissection 1643 a=IPv6(raw(IPv6()/TCP())) 1644 a.nh == 6 and a.plen == 20 and isinstance(a.payload, TCP) and a.payload.chksum == 0x8f7d 1645 1646 = IPv6 Class with TCP and TCP data - build 1647 raw(IPv6()/TCP()/Raw(load="somedata")) == b'`\x00\x00\x00\x00\x1c\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd5\xdd\x00\x00somedata' 1648 1649 = IPv6 Class with TCP and TCP data - dissection 1650 a=IPv6(raw(IPv6()/TCP()/Raw(load="somedata"))) 1651 a.nh == 6 and a.plen == 28 and isinstance(a.payload, TCP) and a.payload.chksum == 0xd5dd and isinstance(a.payload.payload, Raw) and a[Raw].load == b"somedata" 1652 1653 = IPv6 Class binding with Ethernet - build 1654 raw(Ether(src="00:00:00:00:00:00", dst="ff:ff:ff:ff:ff:ff")/IPv6()/TCP()) == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x86\xdd`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00' 1655 1656 = IPv6 Class binding with Ethernet - dissection 1657 a=Ether(raw(Ether()/IPv6()/TCP())) 1658 a.type == 0x86dd 1659 1660 = IPv6 Class binding with GRE - build 1661 s = raw(IP(src="127.0.0.1")/GRE()/Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:00:00:00:00")/IP()/GRE()/IPv6(src="::1")) 1662 s == b'E\x00\x00f\x00\x01\x00\x00@/|f\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00eX\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00@\x00\x01\x00\x00@/|\x8c\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x86\xdd`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 1663 1664 = IPv6 Class binding with GRE - dissection 1665 p = IP(s) 1666 GRE in p and p[GRE:1].proto == 0x6558 and p[GRE:2].proto == 0x86DD and IPv6 in p 1667 1668 1669 ########### IPv6ExtHdrRouting Class ########################### 1670 1671 = IPv6ExtHdrRouting Class - No address - build 1672 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=[])/TCP(dport=80)) ==b'`\x00\x00\x00\x00\x1c+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00' 1673 1674 = IPv6ExtHdrRouting Class - One address - build 1675 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2022::deca"])/TCP(dport=80)) == b'`\x00\x00\x00\x00,+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x02\x00\x01\x00\x00\x00\x00 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' 1676 1677 = IPv6ExtHdrRouting Class - Multiple Addresses - build 1678 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"])/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x02\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' 1679 1680 = IPv6ExtHdrRouting Class - Specific segleft (2->1) - build 1681 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=1)/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x01\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' 1682 1683 = IPv6ExtHdrRouting Class - Specific segleft (2->0) - build 1684 raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=0)/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00' 1685 1686 ########### IPv6ExtHdrSegmentRouting Class ########################### 1687 1688 = IPv6ExtHdrSegmentRouting Class - default - build & dissect 1689 s = raw(IPv6()/IPv6ExtHdrSegmentRouting()/UDP()) 1690 assert(s == b'`\x00\x00\x00\x00 +@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x02\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x005\x005\x00\x08\xffr') 1691 1692 p = IPv6(s) 1693 assert(UDP in p and IPv6ExtHdrSegmentRouting in p) 1694 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 1 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0) 1695 1696 = IPv6ExtHdrSegmentRouting Class - empty lists - build & dissect 1697 1698 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[])/UDP()) 1699 assert(s == b'`\x00\x00\x00\x00\x10+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x00\x04\x00\x00\x00\x00\x00\x005\x005\x00\x08\xffr') 1700 1701 p = IPv6(s) 1702 assert(UDP in p and IPv6ExtHdrSegmentRouting in p) 1703 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0) 1704 1705 = IPv6ExtHdrSegmentRouting Class - addresses list - build & dissect 1706 1707 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"])/UDP()) 1708 assert(s == b'`\x00\x00\x00\x00@+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x06\x04\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x005\x005\x00\x08\xffr') 1709 1710 p = IPv6(s) 1711 assert(UDP in p and IPv6ExtHdrSegmentRouting in p) 1712 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0) 1713 1714 = IPv6ExtHdrSegmentRouting Class - TLVs list - build & dissect 1715 1716 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[IPv6ExtHdrSegmentRoutingTLV()])/TCP()) 1717 assert(s == b'`\x00\x00\x00\x00$+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00') 1718 1719 p = IPv6(s) 1720 assert(TCP in p and IPv6ExtHdrSegmentRouting in p) 1721 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2) 1722 assert(isinstance(p[IPv6ExtHdrSegmentRouting].tlv_objects[1], IPv6ExtHdrSegmentRoutingTLVPadding)) 1723 1724 = IPv6ExtHdrSegmentRouting Class - both lists - build & dissect 1725 1726 s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"], tlv_objects=[IPv6ExtHdrSegmentRoutingTLVIngressNode(),IPv6ExtHdrSegmentRoutingTLVEgressNode()])/ICMPv6EchoRequest()) 1727 assert(s == b'`\x00\x00\x00\x00h+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x0b\x04\x02\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x7f\xbb\x00\x00\x00\x00') 1728 1729 p = IPv6(s) 1730 assert(ICMPv6EchoRequest in p and IPv6ExtHdrSegmentRouting in p) 1731 assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2) 1732 1733 = IPv6ExtHdrSegmentRouting Class - UDP pseudo-header checksum - build & dissect 1734 1735 s= raw(IPv6(src="fc00::1", dst="fd00::42")/IPv6ExtHdrSegmentRouting(addresses=["fd00::42", "fc13::1337"][::-1], segleft=1, lastentry=1) / UDP(sport=11000, dport=4242) / Raw('foobar')) 1736 assert(s == b'`\x00\x00\x00\x006+@\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x11\x04\x04\x01\x01\x00\x00\x00\xfc\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x137\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B*\xf8\x10\x92\x00\x0e\x81\xb7foobar') 1737 1738 1739 ############ 1740 ############ 1741 + Test in6_get6to4Prefix() 1742 1743 = Test in6_get6to4Prefix() - 0.0.0.0 address 1744 in6_get6to4Prefix("0.0.0.0") == "2002::" 1745 1746 = Test in6_get6to4Prefix() - 255.255.255.255 address 1747 in6_get6to4Prefix("255.255.255.255") == "2002:ffff:ffff::" 1748 1749 = Test in6_get6to4Prefix() - 1.1.1.1 address 1750 in6_get6to4Prefix("1.1.1.1") == "2002:101:101::" 1751 1752 = Test in6_get6to4Prefix() - invalid address 1753 in6_get6to4Prefix("somebadrawing") is None 1754 1755 1756 ############ 1757 ############ 1758 + Test in6_6to4ExtractAddr() 1759 1760 = Test in6_6to4ExtractAddr() - 2002:: address 1761 in6_6to4ExtractAddr("2002::") == "0.0.0.0" 1762 1763 = Test in6_6to4ExtractAddr() - 255.255.255.255 address 1764 in6_6to4ExtractAddr("2002:ffff:ffff::") == "255.255.255.255" 1765 1766 = Test in6_6to4ExtractAddr() - "2002:101:101::" address 1767 in6_6to4ExtractAddr("2002:101:101::") == "1.1.1.1" 1768 1769 = Test in6_6to4ExtractAddr() - invalid address 1770 in6_6to4ExtractAddr("somebadrawing") is None 1771 1772 1773 ########### RFC 4489 - Link-Scoped IPv6 Multicast address ########### 1774 1775 = in6_getLinkScopedMcastAddr() : default generation 1776 a = in6_getLinkScopedMcastAddr(addr="FE80::") 1777 a == 'ff32:ff::' 1778 1779 = in6_getLinkScopedMcastAddr() : different valid scope values 1780 a = in6_getLinkScopedMcastAddr(addr="FE80::", scope=0) 1781 b = in6_getLinkScopedMcastAddr(addr="FE80::", scope=1) 1782 c = in6_getLinkScopedMcastAddr(addr="FE80::", scope=2) 1783 d = in6_getLinkScopedMcastAddr(addr="FE80::", scope=3) 1784 a == 'ff30:ff::' and b == 'ff31:ff::' and c == 'ff32:ff::' and d is None 1785 1786 = in6_getLinkScopedMcastAddr() : grpid in different formats 1787 a = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=b"\x12\x34\x56\x78") 1788 b = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="12345678") 1789 c = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=305419896) 1790 a == b and b == c 1791 1792 1793 ########### ethernet address to iface ID conversion ################# 1794 1795 = in6_mactoifaceid() conversion function (test 1) 1796 in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000' 1797 1798 = in6_mactoifaceid() conversion function (test 2) 1799 in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000' 1800 1801 = in6_mactoifaceid() conversion function (test 3) 1802 in6_mactoifaceid("FD:00:00:00:00:00") == 'FF00:00FF:FE00:0000' 1803 1804 = in6_mactoifaceid() conversion function (test 4) 1805 in6_mactoifaceid("FF:00:00:00:00:00") == 'FD00:00FF:FE00:0000' 1806 1807 = in6_mactoifaceid() conversion function (test 5) 1808 in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000' 1809 1810 = in6_mactoifaceid() conversion function (test 6) 1811 in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000' 1812 1813 ########### iface ID conversion ################# 1814 1815 = in6_mactoifaceid() conversion function (test 1) 1816 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' 1817 1818 = in6_mactoifaceid() conversion function (test 2) 1819 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' 1820 1821 = in6_mactoifaceid() conversion function (test 3) 1822 in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00' 1823 1824 = in6_mactoifaceid() conversion function (test 4) 1825 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00' 1826 1827 = in6_mactoifaceid() conversion function (test 5) 1828 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' 1829 1830 = in6_mactoifaceid() conversion function (test 6) 1831 in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' 1832 1833 1834 = in6_addrtomac() conversion function (test 1) 1835 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' 1836 1837 = in6_addrtomac() conversion function (test 2) 1838 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' 1839 1840 = in6_addrtomac() conversion function (test 3) 1841 in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00' 1842 1843 = in6_addrtomac() conversion function (test 4) 1844 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00' 1845 1846 = in6_addrtomac() conversion function (test 5) 1847 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' 1848 1849 = in6_addrtomac() conversion function (test 6) 1850 in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' 1851 1852 ########### RFC 3041 related function ############################### 1853 = Test in6_getRandomizedIfaceId 1854 import socket 1855 1856 res=True 1857 for a in six.moves.range(10): 1858 s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3') 1859 inet_pton(socket.AF_INET6, '::'+s1) 1860 tmp2 = inet_pton(socket.AF_INET6, '::'+s2) 1861 res = res and ((orb(s1[0]) & 0x04) == 0x04) 1862 s1,s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', previous=tmp2) 1863 tmp = inet_pton(socket.AF_INET6, '::'+s1) 1864 inet_pton(socket.AF_INET6, '::'+s2) 1865 res = res and ((orb(s1[0]) & 0x04) == 0x04) 1866 1867 ########### RFC 1924 related function ############################### 1868 = Test RFC 1924 function - in6_ctop() basic test 1869 in6_ctop("4)+k&C#VzJ4br>0wv%Yp") == '1080::8:800:200c:417a' 1870 1871 = Test RFC 1924 function - in6_ctop() with character outside charset 1872 in6_ctop("4)+k&C#VzJ4br>0wv%Y'") == None 1873 1874 = Test RFC 1924 function - in6_ctop() with bad length address 1875 in6_ctop("4)+k&C#VzJ4br>0wv%Y") == None 1876 1877 = Test RFC 1924 function - in6_ptoc() basic test 1878 in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp' 1879 1880 = Test RFC 1924 function - in6_ptoc() basic test 1881 in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp' 1882 1883 = Test RFC 1924 function - in6_ptoc() with bad input 1884 in6_ptoc('1080:::8:800:200c:417a') == None 1885 1886 ########### in6_getAddrType ######################################### 1887 1888 = in6_getAddrType - 6to4 addresses 1889 in6_getAddrType("2002::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL | IPV6_ADDR_6TO4) 1890 1891 = in6_getAddrType - Assignable Unicast global address 1892 in6_getAddrType("2001:db8::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL) 1893 1894 = in6_getAddrType - Multicast global address 1895 in6_getAddrType("FF0E::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST) 1896 1897 = in6_getAddrType - Multicast local address 1898 in6_getAddrType("FF02::1") == (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST) 1899 1900 = in6_getAddrType - Unicast Link-Local address 1901 in6_getAddrType("FE80::") == (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL) 1902 1903 = in6_getAddrType - Loopback address 1904 in6_getAddrType("::1") == IPV6_ADDR_LOOPBACK 1905 1906 = in6_getAddrType - Unspecified address 1907 in6_getAddrType("::") == IPV6_ADDR_UNSPECIFIED 1908 1909 = in6_getAddrType - Unassigned Global Unicast address 1910 in6_getAddrType("4000::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) 1911 1912 = in6_getAddrType - Weird address (FE::1) 1913 in6_getAddrType("FE::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) 1914 1915 = in6_getAddrType - Weird address (FE8::1) 1916 in6_getAddrType("FE8::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) 1917 1918 = in6_getAddrType - Weird address (1::1) 1919 in6_getAddrType("1::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) 1920 1921 = in6_getAddrType - Weird address (1000::1) 1922 in6_getAddrType("1000::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) 1923 1924 ########### ICMPv6DestUnreach Class ################################# 1925 1926 = ICMPv6DestUnreach Class - Basic Build (no argument) 1927 raw(ICMPv6DestUnreach()) == b'\x01\x00\x00\x00\x00\x00\x00\x00' 1928 1929 = ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload) 1930 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()) == b'`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x14e\x00\x00\x00\x00' 1931 1932 = ICMPv6DestUnreach Class - Basic Build over IPv6 with some payload 1933 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x8e\xa3\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca' 1934 1935 = ICMPv6DestUnreach Class - Dissection with default values and some payload 1936 a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca"))) 1937 a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].code == 0 and a[ICMPv6DestUnreach].cksum == 0x8ea3 and a[ICMPv6DestUnreach].unused == 0 and IPerror6 in a 1938 1939 = ICMPv6DestUnreach Class - Dissection with specific values 1940 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca"))) 1941 a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].cksum == 0x6666 and a[ICMPv6DestUnreach].unused == 0x7777 and IPerror6 in a[ICMPv6DestUnreach] 1942 1943 = ICMPv6DestUnreach Class - checksum computation related stuff 1944 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP())) 1945 b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP())) 1946 a[ICMPv6DestUnreach][TCPerror].chksum == b.chksum 1947 1948 1949 ########### ICMPv6PacketTooBig Class ################################ 1950 1951 = ICMPv6PacketTooBig Class - Basic Build (no argument) 1952 raw(ICMPv6PacketTooBig()) == b'\x02\x00\x00\x00\x00\x00\x05\x00' 1953 1954 = ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload) 1955 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()) == b'`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x0ee\x00\x00\x05\x00' 1956 1957 = ICMPv6PacketTooBig Class - Basic Build over IPv6 with some payload 1958 raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x88\xa3\x00\x00\x05\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca' 1959 1960 = ICMPv6PacketTooBig Class - Dissection with default values and some payload 1961 a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca"))) 1962 a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 0 and a[ICMPv6PacketTooBig].cksum == 0x88a3 and a[ICMPv6PacketTooBig].mtu == 1280 and IPerror6 in a 1963 True 1964 1965 = ICMPv6PacketTooBig Class - Dissection with specific values 1966 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=2, cksum=0x6666, mtu=1460)/IPv6(src="2047::cafe", dst="2048::deca"))) 1967 a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 2 and a[ICMPv6PacketTooBig].cksum == 0x6666 and a[ICMPv6PacketTooBig].mtu == 1460 and IPerror6 in a 1968 1969 = ICMPv6PacketTooBig Class - checksum computation related stuff 1970 a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=1, cksum=0x6666, mtu=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP())) 1971 b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP())) 1972 a[ICMPv6PacketTooBig][TCPerror].chksum == b.chksum 1973 1974 1975 ########### ICMPv6TimeExceeded Class ################################ 1976 # To be done but not critical. Same mechanisms and format as 1977 # previous ones. 1978 1979 ########### ICMPv6ParamProblem Class ################################ 1980 # See previous note 1981 1982 ############ 1983 ############ 1984 + Test ICMPv6EchoRequest Class 1985 1986 = ICMPv6EchoRequest - Basic Instantiation 1987 raw(ICMPv6EchoRequest()) == b'\x80\x00\x00\x00\x00\x00\x00\x00' 1988 1989 = ICMPv6EchoRequest - Instantiation with specific values 1990 raw(ICMPv6EchoRequest(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x80\xff\x11\x11""33thisissomestring' 1991 1992 = ICMPv6EchoRequest - Basic dissection 1993 a=ICMPv6EchoRequest(b'\x80\x00\x00\x00\x00\x00\x00\x00') 1994 a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b"" 1995 1996 = ICMPv6EchoRequest - Dissection with specific values 1997 a=ICMPv6EchoRequest(b'\x80\xff\x11\x11""33thisissomerawing') 1998 a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing" 1999 2000 = ICMPv6EchoRequest - Automatic checksum computation and field overloading (build) 2001 raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoRequest()) == b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00' 2002 2003 = ICMPv6EchoRequest - Automatic checksum computation and field overloading (dissection) 2004 a=IPv6(b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00') 2005 isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1 2006 2007 2008 ############ 2009 ############ 2010 + Test ICMPv6EchoReply Class 2011 2012 = ICMPv6EchoReply - Basic Instantiation 2013 raw(ICMPv6EchoReply()) == b'\x81\x00\x00\x00\x00\x00\x00\x00' 2014 2015 = ICMPv6EchoReply - Instantiation with specific values 2016 raw(ICMPv6EchoReply(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x81\xff\x11\x11""33thisissomestring' 2017 2018 = ICMPv6EchoReply - Basic dissection 2019 a=ICMPv6EchoReply(b'\x80\x00\x00\x00\x00\x00\x00\x00') 2020 a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b"" 2021 2022 = ICMPv6EchoReply - Dissection with specific values 2023 a=ICMPv6EchoReply(b'\x80\xff\x11\x11""33thisissomerawing') 2024 a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing" 2025 2026 = ICMPv6EchoReply - Automatic checksum computation and field overloading (build) 2027 raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoReply()) == b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x81\x00\x94\xf1\x00\x00\x00\x00' 2028 2029 = ICMPv6EchoReply - Automatic checksum computation and field overloading (dissection) 2030 a=IPv6(b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00') 2031 isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1 2032 2033 ########### ICMPv6EchoReply/Request answers() and hashret() ######### 2034 2035 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 1 2036 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") 2037 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata") 2038 b.hashret() == a.hashret() 2039 2040 # data are not taken into account for hashret 2041 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2 2042 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") 2043 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="otherdata") 2044 b.hashret() == a.hashret() 2045 2046 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3 2047 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata") 2048 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x8888, data="somedata") 2049 b.hashret() != a.hashret() 2050 2051 = ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4 2052 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata") 2053 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x8888, seq=0x7777, data="somedata") 2054 b.hashret() != a.hashret() 2055 2056 = ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5 2057 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") 2058 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata") 2059 (a > b) == True 2060 2061 = ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6 2062 b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777, data="somedata") 2063 a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x7777, data="somedata") 2064 (a > b) == True 2065 2066 = ICMPv6EchoRequest and ICMPv6EchoReply - live answers() use Net6 2067 ~ netaccess ipv6 2068 2069 a = IPv6(dst="www.google.com")/ICMPv6EchoRequest() 2070 b = IPv6(src="www.google.com", dst=a.src)/ICMPv6EchoReply() 2071 assert b.answers(a) 2072 assert (a > b) 2073 2074 2075 ########### ICMPv6MRD* Classes ###################################### 2076 2077 = ICMPv6MRD_Advertisement - Basic instantiation 2078 raw(ICMPv6MRD_Advertisement()) == b'\x97\x14\x00\x00\x00\x00\x00\x00' 2079 2080 = ICMPv6MRD_Advertisement - Instantiation with specific values 2081 raw(ICMPv6MRD_Advertisement(advinter=0xdd, queryint=0xeeee, robustness=0xffff)) == b'\x97\xdd\x00\x00\xee\xee\xff\xff' 2082 2083 = ICMPv6MRD_Advertisement - Basic Dissection and overloading mechanisms 2084 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Advertisement())) 2085 a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 8 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Advertisement in a and a[ICMPv6MRD_Advertisement].type == 151 and a[ICMPv6MRD_Advertisement].advinter == 20 and a[ICMPv6MRD_Advertisement].queryint == 0 and a[ICMPv6MRD_Advertisement].robustness == 0 2086 2087 2088 = ICMPv6MRD_Solicitation - Basic dissection 2089 raw(ICMPv6MRD_Solicitation()) == b'\x98\x00\x00\x00' 2090 2091 = ICMPv6MRD_Solicitation - Instantiation with specific values 2092 raw(ICMPv6MRD_Solicitation(res=0xbb)) == b'\x98\xbb\x00\x00' 2093 2094 = ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms 2095 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Solicitation())) 2096 a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Solicitation in a and a[ICMPv6MRD_Solicitation].type == 152 and a[ICMPv6MRD_Solicitation].res == 0 2097 2098 2099 = ICMPv6MRD_Termination Basic instantiation 2100 raw(ICMPv6MRD_Termination()) == b'\x99\x00\x00\x00' 2101 2102 = ICMPv6MRD_Termination - Instantiation with specific values 2103 raw(ICMPv6MRD_Termination(res=0xbb)) == b'\x99\xbb\x00\x00' 2104 2105 = ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms 2106 a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Termination())) 2107 a.dst == "33:33:00:00:00:6a" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::6a" and ICMPv6MRD_Termination in a and a[ICMPv6MRD_Termination].type == 153 and a[ICMPv6MRD_Termination].res == 0 2108 2109 2110 ############ 2111 ############ 2112 + Test HBHOptUnknown Class 2113 2114 = HBHOptUnknown - Basic Instantiation 2115 raw(HBHOptUnknown()) == b'\x01\x00' 2116 2117 = HBHOptUnknown - Basic Dissection 2118 a=HBHOptUnknown(b'\x01\x00') 2119 a.otype == 0x01 and a.optlen == 0 and a.optdata == b"" 2120 2121 = HBHOptUnknown - Automatic optlen computation 2122 raw(HBHOptUnknown(optdata="B"*10)) == b'\x01\nBBBBBBBBBB' 2123 2124 = HBHOptUnknown - Instantiation with specific values 2125 raw(HBHOptUnknown(optlen=9, optdata="B"*10)) == b'\x01\tBBBBBBBBBB' 2126 2127 = HBHOptUnknown - Dissection with specific values 2128 a=HBHOptUnknown(b'\x01\tBBBBBBBBBB') 2129 a.otype == 0x01 and a.optlen == 9 and a.optdata == b"B"*9 and isinstance(a.payload, Raw) and a.payload.load == b"B" 2130 2131 2132 ############ 2133 ############ 2134 + Test Pad1 Class 2135 2136 = Pad1 - Basic Instantiation 2137 raw(Pad1()) == b'\x00' 2138 2139 = Pad1 - Basic Dissection 2140 raw(Pad1(b'\x00')) == b'\x00' 2141 2142 2143 ############ 2144 ############ 2145 + Test PadN Class 2146 2147 = PadN - Basic Instantiation 2148 raw(PadN()) == b'\x01\x00' 2149 2150 = PadN - Optlen Automatic computation 2151 raw(PadN(optdata="B"*10)) == b'\x01\nBBBBBBBBBB' 2152 2153 = PadN - Basic Dissection 2154 a=PadN(b'\x01\x00') 2155 a.otype == 1 and a.optlen == 0 and a.optdata == b"" 2156 2157 = PadN - Dissection with specific values 2158 a=PadN(b'\x01\x0cBBBBBBBBBB') 2159 a.otype == 1 and a.optlen == 12 and a.optdata == b'BBBBBBBBBB' 2160 2161 = PadN - Instantiation with forced optlen 2162 raw(PadN(optdata="B"*10, optlen=9)) == b'\x01\x09BBBBBBBBBB' 2163 2164 2165 ############ 2166 ############ 2167 + Test RouterAlert Class (RFC 2711) 2168 2169 = RouterAlert - Basic Instantiation 2170 raw(RouterAlert()) == b'\x05\x02\x00\x00' 2171 2172 = RouterAlert - Basic Dissection 2173 a=RouterAlert(b'\x05\x02\x00\x00') 2174 a.otype == 0x05 and a.optlen == 2 and a.value == 00 2175 2176 = RouterAlert - Instantiation with specific values 2177 raw(RouterAlert(optlen=3, value=0xffff)) == b'\x05\x03\xff\xff' 2178 2179 = RouterAlert - Instantiation with specific values 2180 a=RouterAlert(b'\x05\x03\xff\xff') 2181 a.otype == 0x05 and a.optlen == 3 and a.value == 0xffff 2182 2183 2184 ############ 2185 ############ 2186 + Test Jumbo Class (RFC 2675) 2187 2188 = Jumbo - Basic Instantiation 2189 raw(Jumbo()) == b'\xc2\x04\x00\x00\x00\x00' 2190 2191 = Jumbo - Basic Dissection 2192 a=Jumbo(b'\xc2\x04\x00\x00\x00\x00') 2193 a.otype == 0xC2 and a.optlen == 4 and a.jumboplen == 0 2194 2195 = Jumbo - Instantiation with specific values 2196 raw(Jumbo(optlen=6, jumboplen=0xffffffff)) == b'\xc2\x06\xff\xff\xff\xff' 2197 2198 = Jumbo - Dissection with specific values 2199 a=Jumbo(b'\xc2\x06\xff\xff\xff\xff') 2200 a.otype == 0xc2 and a.optlen == 6 and a.jumboplen == 0xffffffff 2201 2202 2203 ############ 2204 ############ 2205 + Test HAO Class (RFC 3775) 2206 2207 = HAO - Basic Instantiation 2208 raw(HAO()) == b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2209 2210 = HAO - Basic Dissection 2211 a=HAO(b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2212 a.otype == 0xC9 and a.optlen == 16 and a.hoa == "::" 2213 2214 = HAO - Instantiation with specific values 2215 raw(HAO(optlen=9, hoa="2001::ffff")) == b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff' 2216 2217 = HAO - Dissection with specific values 2218 a=HAO(b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff') 2219 a.otype == 0xC9 and a.optlen == 9 and a.hoa == "2001::ffff" 2220 2221 = HAO - hashret 2222 2223 p = IPv6()/IPv6ExtHdrDestOpt(options=HAO(hoa="2001:db8::1"))/ICMPv6EchoRequest() 2224 p.hashret() == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00" 2225 2226 2227 ############ 2228 ############ 2229 + Test IPv6ExtHdrHopByHop() 2230 2231 = IPv6ExtHdrHopByHop - Basic Instantiation 2232 raw(IPv6ExtHdrHopByHop()) == b';\x00\x01\x04\x00\x00\x00\x00' 2233 2234 = IPv6ExtHdrHopByHop - Instantiation with HAO option 2235 raw(IPv6ExtHdrHopByHop(options=[HAO()])) == b';\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2236 2237 = IPv6ExtHdrHopByHop - Instantiation with RouterAlert option 2238 raw(IPv6ExtHdrHopByHop(options=[RouterAlert()])) == b';\x00\x05\x02\x00\x00\x01\x00' 2239 2240 = IPv6ExtHdrHopByHop - Instantiation with Jumbo option 2241 raw(IPv6ExtHdrHopByHop(options=[Jumbo()])) == b';\x00\xc2\x04\x00\x00\x00\x00' 2242 2243 = IPv6ExtHdrHopByHop - Instantiation with Pad1 option 2244 raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00' 2245 2246 = IPv6ExtHdrHopByHop - Instantiation with PadN option 2247 raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00' 2248 2249 = IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO 2250 raw(IPv6ExtHdrHopByHop(options=[Jumbo(), RouterAlert(), HAO()])) == b';\x03\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2251 2252 = IPv6ExtHdrHopByHop - Instantiation with HAO, Jumbo, RouterAlert 2253 raw(IPv6ExtHdrHopByHop(options=[HAO(), Jumbo(), RouterAlert()])) == b';\x04\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x02\x00\x00' 2254 2255 = IPv6ExtHdrHopByHop - Instantiation with RouterAlert, HAO, Jumbo 2256 raw(IPv6ExtHdrHopByHop(options=[RouterAlert(), HAO(), Jumbo()])) == b';\x03\x05\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00' 2257 2258 = IPv6ExtHdrHopByHop - Basic Dissection 2259 a=IPv6ExtHdrHopByHop(b';\x00\x01\x04\x00\x00\x00\x00') 2260 a.nh == 59 and a.len == 0 and len(a.options) == 1 and isinstance(a.options[0], PadN) and a.options[0].otype == 1 and a.options[0].optlen == 4 and a.options[0].optdata == b'\x00'*4 2261 2262 #= IPv6ExtHdrHopByHop - Automatic length computation 2263 #raw(IPv6ExtHdrHopByHop(options=["toto"])) == b'\x00\x00toto' 2264 #= IPv6ExtHdrHopByHop - Automatic length computation 2265 #raw(IPv6ExtHdrHopByHop(options=["toto"])) == b'\x00\x00tototo' 2266 2267 2268 ############ 2269 ############ 2270 + Test ICMPv6ND_RS() class - ICMPv6 Type 133 Code 0 2271 2272 = ICMPv6ND_RS - Basic instantiation 2273 raw(ICMPv6ND_RS()) == b'\x85\x00\x00\x00\x00\x00\x00\x00' 2274 2275 = ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer 2276 raw(IPv6(src="2001:db8::1")/ICMPv6ND_RS()) == b'`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00' 2277 2278 = ICMPv6ND_RS - Basic dissection 2279 a=ICMPv6ND_RS(b'\x85\x00\x00\x00\x00\x00\x00\x00') 2280 a.type == 133 and a.code == 0 and a.cksum == 0 and a.res == 0 2281 2282 = ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer 2283 a=IPv6(b'`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00') 2284 isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RS) and a.payload.type == 133 and a.payload.code == 0 and a.payload.cksum == 0x4dfe and a.payload.res == 0 2285 2286 2287 ############ 2288 ############ 2289 + Test ICMPv6ND_RA() class - ICMPv6 Type 134 Code 0 2290 2291 = ICMPv6ND_RA - Basic Instantiation 2292 raw(ICMPv6ND_RA()) == b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00' 2293 2294 = ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer 2295 raw(IPv6(src="2001:db8::1")/ICMPv6ND_RA()) == b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00' 2296 2297 = ICMPv6ND_RA - Basic dissection 2298 a=ICMPv6ND_RA(b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') 2299 a.type == 134 and a.code == 0 and a.cksum == 0 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0 2300 2301 = ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer 2302 a=IPv6(b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') 2303 isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RA) and a.payload.type == 134 and a.code == 0 and a.cksum == 0x45e7 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0 2304 2305 = ICMPv6ND_RA - Answers 2306 assert ICMPv6ND_RA().answers(ICMPv6ND_RS()) 2307 a=IPv6(b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') 2308 b = IPv6(b"`\x00\x00\x00\x00\x10:\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x85\x00M\xff\x00\x00\x00\x00") 2309 assert a.answers(b) 2310 2311 ############ 2312 ############ 2313 + ICMPv6ND_NS Class Test 2314 2315 = ICMPv6ND_NS - Basic Instantiation 2316 raw(ICMPv6ND_NS()) == b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2317 2318 = ICMPv6ND_NS - Instantiation with specific values 2319 raw(ICMPv6ND_NS(code=0x11, res=3758096385, tgt="ffff::1111")) == b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2320 2321 = ICMPv6ND_NS - Basic Dissection 2322 a=ICMPv6ND_NS(b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2323 a.code==0 and a.res==0 and a.tgt=="::" 2324 2325 = ICMPv6ND_NS - Dissection with specific values 2326 a=ICMPv6ND_NS(b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2327 a.code==0x11 and a.res==3758096385 and a.tgt=="ffff::1111" 2328 2329 = ICMPv6ND_NS - IPv6 layer fields overloading 2330 a=IPv6(raw(IPv6()/ICMPv6ND_NS())) 2331 a.nh == 58 and a.dst=="ff02::1" and a.hlim==255 2332 2333 ############ 2334 ############ 2335 + ICMPv6ND_NA Class Test 2336 2337 = ICMPv6ND_NA - Basic Instantiation 2338 raw(ICMPv6ND_NA()) == b'\x88\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2339 2340 = ICMPv6ND_NA - Instantiation with specific values 2341 raw(ICMPv6ND_NA(code=0x11, R=0, S=1, O=0, res=1, tgt="ffff::1111")) == b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2342 2343 = ICMPv6ND_NA - Basic Dissection 2344 a=ICMPv6ND_NA(b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2345 a.code==0 and a.R==0 and a.S==0 and a.O==0 and a.res==0 and a.tgt=="::" 2346 2347 = ICMPv6ND_NA - Dissection with specific values 2348 a=ICMPv6ND_NA(b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2349 a.code==0x11 and a.R==0 and a.S==1 and a.O==0 and a.res==1 and a.tgt=="ffff::1111" 2350 assert a.hashret() == b'ffff::1111' 2351 2352 = ICMPv6ND_NS - IPv6 layer fields overloading 2353 a=IPv6(raw(IPv6()/ICMPv6ND_NS())) 2354 a.nh == 58 and a.dst=="ff02::1" and a.hlim==255 2355 2356 2357 ############ 2358 ############ 2359 + ICMPv6ND_ND/ICMPv6ND_ND matching test 2360 2361 = ICMPv6ND_ND/ICMPv6ND_ND matching - test 1 2362 # Sent NS 2363 a=IPv6(b'`\x00\x00\x00\x00\x18:\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x00UC\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1') 2364 # Received NA 2365 b=IPv6(b'n\x00\x00\x00\x00 :\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\x88\x00\xf3F\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\x02\x01\x00\x0f4\x8a\x8a\xa1') 2366 b.answers(a) 2367 2368 2369 ############ 2370 ############ 2371 + ICMPv6NDOptUnknown Class Test 2372 2373 = ICMPv6NDOptUnknown - Basic Instantiation 2374 raw(ICMPv6NDOptUnknown()) == b'\x00\x02' 2375 2376 = ICMPv6NDOptUnknown - Instantiation with specific values 2377 raw(ICMPv6NDOptUnknown(len=4, data="somestring")) == b'\x00\x04somestring' 2378 2379 = ICMPv6NDOptUnknown - Basic Dissection 2380 a=ICMPv6NDOptUnknown(b'\x00\x02') 2381 a.type == 0 and a.len == 2 2382 2383 = ICMPv6NDOptUnknown - Dissection with specific values 2384 a=ICMPv6NDOptUnknown(b'\x00\x04somerawing') 2385 a.type == 0 and a.len==4 and a.data == b"so" and isinstance(a.payload, Raw) and a.payload.load == b"merawing" 2386 2387 2388 ############ 2389 ############ 2390 + ICMPv6NDOptSrcLLAddr Class Test 2391 2392 = ICMPv6NDOptSrcLLAddr - Basic Instantiation 2393 raw(ICMPv6NDOptSrcLLAddr()) == b'\x01\x01\x00\x00\x00\x00\x00\x00' 2394 2395 = ICMPv6NDOptSrcLLAddr - Instantiation with specific values 2396 raw(ICMPv6NDOptSrcLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x01\x02\x11\x11\x11\x11\x11\x11' 2397 2398 = ICMPv6NDOptSrcLLAddr - Basic Dissection 2399 a=ICMPv6NDOptSrcLLAddr(b'\x01\x01\x00\x00\x00\x00\x00\x00') 2400 a.type == 1 and a.len == 1 and a.lladdr == "00:00:00:00:00:00" 2401 2402 = ICMPv6NDOptSrcLLAddr - Instantiation with specific values 2403 a=ICMPv6NDOptSrcLLAddr(b'\x01\x02\x11\x11\x11\x11\x11\x11') 2404 a.type == 1 and a.len == 2 and a.lladdr == "11:11:11:11:11:11" 2405 2406 2407 ############ 2408 ############ 2409 + ICMPv6NDOptDstLLAddr Class Test 2410 2411 = ICMPv6NDOptDstLLAddr - Basic Instantiation 2412 raw(ICMPv6NDOptDstLLAddr()) == b'\x02\x01\x00\x00\x00\x00\x00\x00' 2413 2414 = ICMPv6NDOptDstLLAddr - Instantiation with specific values 2415 raw(ICMPv6NDOptDstLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x02\x02\x11\x11\x11\x11\x11\x11' 2416 2417 = ICMPv6NDOptDstLLAddr - Basic Dissection 2418 a=ICMPv6NDOptDstLLAddr(b'\x02\x01\x00\x00\x00\x00\x00\x00') 2419 a.type == 2 and a.len == 1 and a.lladdr == "00:00:00:00:00:00" 2420 2421 = ICMPv6NDOptDstLLAddr - Instantiation with specific values 2422 a=ICMPv6NDOptDstLLAddr(b'\x02\x02\x11\x11\x11\x11\x11\x11') 2423 a.type == 2 and a.len == 2 and a.lladdr == "11:11:11:11:11:11" 2424 2425 2426 ############ 2427 ############ 2428 + ICMPv6NDOptPrefixInfo Class Test 2429 2430 = ICMPv6NDOptPrefixInfo - Basic Instantiation 2431 raw(ICMPv6NDOptPrefixInfo()) == b'\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2432 2433 = ICMPv6NDOptPrefixInfo - Instantiation with specific values 2434 raw(ICMPv6NDOptPrefixInfo(len=5, prefixlen=64, L=0, A=0, R=1, res1=1, validlifetime=0x11111111, preferredlifetime=0x22222222, res2=0x33333333, prefix="2001:db8::1")) == b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 2435 2436 = ICMPv6NDOptPrefixInfo - Basic Dissection 2437 a=ICMPv6NDOptPrefixInfo(b'\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2438 a.type == 3 and a.len == 4 and a.prefixlen == 0 and a.L == 1 and a.A == 1 and a.R == 0 and a.res1 == 0 and a.validlifetime == 0xffffffff and a.preferredlifetime == 0xffffffff and a.res2 == 0 and a.prefix == "::" 2439 2440 = ICMPv6NDOptPrefixInfo - Instantiation with specific values 2441 a=ICMPv6NDOptPrefixInfo(b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 2442 a.type == 3 and a.len == 5 and a.prefixlen == 64 and a.L == 0 and a.A == 0 and a.R == 1 and a.res1 == 1 and a.validlifetime == 0x11111111 and a.preferredlifetime == 0x22222222 and a.res2 == 0x33333333 and a.prefix == "2001:db8::1" 2443 2444 2445 ############ 2446 ############ 2447 + ICMPv6NDOptRedirectedHdr Class Test 2448 2449 = ICMPv6NDOptRedirectedHdr - Basic Instantiation 2450 ~ ICMPv6NDOptRedirectedHdr 2451 raw(ICMPv6NDOptRedirectedHdr()) == b'\x04\x01\x00\x00\x00\x00\x00\x00' 2452 2453 = ICMPv6NDOptRedirectedHdr - Instantiation with specific values 2454 ~ ICMPv6NDOptRedirectedHdr 2455 raw(ICMPv6NDOptRedirectedHdr(len=0xff, res="abcdef", pkt="somestringthatisnotanipv6packet")) == b'\x04\xffabcdefsomestringthatisnotanipv' 2456 2457 = ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer) 2458 ~ ICMPv6NDOptRedirectedHdr 2459 raw(ICMPv6NDOptRedirectedHdr(pkt=IPv6())) == b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 2460 2461 = ICMPv6NDOptRedirectedHdr - Basic Dissection 2462 ~ ICMPv6NDOptRedirectedHdr 2463 a=ICMPv6NDOptRedirectedHdr(b'\x04\x00\x00\x00') 2464 assert(a.type == 4) 2465 assert(a.len == 0) 2466 assert(a.res == b"\x00\x00") 2467 assert(a.pkt == b"") 2468 2469 = ICMPv6NDOptRedirectedHdr - Disssection with specific values 2470 ~ ICMPv6NDOptRedirectedHdr 2471 a=ICMPv6NDOptRedirectedHdr(b'\x04\xff\x11\x11\x00\x00\x00\x00somerawingthatisnotanipv6pac') 2472 a.type == 4 and a.len == 255 and a.res == b'\x11\x11\x00\x00\x00\x00' and isinstance(a.pkt, Raw) and a.pkt.load == b"somerawingthatisnotanipv6pac" 2473 2474 = ICMPv6NDOptRedirectedHdr - Dissection with cut IPv6 Header 2475 ~ ICMPv6NDOptRedirectedHdr 2476 a=ICMPv6NDOptRedirectedHdr(b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2477 a.type == 4 and a.len == 6 and a.res == b"\x00\x00\x00\x00\x00\x00" and isinstance(a.pkt, Raw) and a.pkt.load == b'`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2478 2479 = ICMPv6NDOptRedirectedHdr - Complete dissection 2480 ~ ICMPv6NDOptRedirectedHdr 2481 x=ICMPv6NDOptRedirectedHdr(b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 2482 y=x.copy() 2483 del(y.len) 2484 x == ICMPv6NDOptRedirectedHdr(raw(y)) 2485 2486 # Add more tests 2487 2488 2489 ############ 2490 ############ 2491 + ICMPv6NDOptMTU Class Test 2492 2493 = ICMPv6NDOptMTU - Basic Instantiation 2494 raw(ICMPv6NDOptMTU()) == b'\x05\x01\x00\x00\x00\x00\x05\x00' 2495 2496 = ICMPv6NDOptMTU - Instantiation with specific values 2497 raw(ICMPv6NDOptMTU(len=2, res=0x1111, mtu=1500)) == b'\x05\x02\x11\x11\x00\x00\x05\xdc' 2498 2499 = ICMPv6NDOptMTU - Basic dissection 2500 a=ICMPv6NDOptMTU(b'\x05\x01\x00\x00\x00\x00\x05\x00') 2501 a.type == 5 and a.len == 1 and a.res == 0 and a.mtu == 1280 2502 2503 = ICMPv6NDOptMTU - Dissection with specific values 2504 a=ICMPv6NDOptMTU(b'\x05\x02\x11\x11\x00\x00\x05\xdc') 2505 a.type == 5 and a.len == 2 and a.res == 0x1111 and a.mtu == 1500 2506 2507 2508 ############ 2509 ############ 2510 + ICMPv6NDOptShortcutLimit Class Test (RFC2491) 2511 2512 = ICMPv6NDOptShortcutLimit - Basic Instantiation 2513 raw(ICMPv6NDOptShortcutLimit()) == b'\x06\x01(\x00\x00\x00\x00\x00' 2514 2515 = ICMPv6NDOptShortcutLimit - Instantiation with specific values 2516 raw(ICMPv6NDOptShortcutLimit(len=2, shortcutlim=0x11, res1=0xee, res2=0xaaaaaaaa)) == b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa' 2517 2518 = ICMPv6NDOptShortcutLimit - Basic Dissection 2519 a=ICMPv6NDOptShortcutLimit(b'\x06\x01(\x00\x00\x00\x00\x00') 2520 a.type == 6 and a.len == 1 and a.shortcutlim == 40 and a.res1 == 0 and a.res2 == 0 2521 2522 = ICMPv6NDOptShortcutLimit - Dissection with specific values 2523 a=ICMPv6NDOptShortcutLimit(b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa') 2524 a.len==2 and a.shortcutlim==0x11 and a.res1==0xee and a.res2==0xaaaaaaaa 2525 2526 2527 ############ 2528 ############ 2529 + ICMPv6NDOptAdvInterval Class Test 2530 2531 = ICMPv6NDOptAdvInterval - Basic Instantiation 2532 raw(ICMPv6NDOptAdvInterval()) == b'\x07\x01\x00\x00\x00\x00\x00\x00' 2533 2534 = ICMPv6NDOptAdvInterval - Instantiation with specific values 2535 raw(ICMPv6NDOptAdvInterval(len=2, res=0x1111, advint=0xffffffff)) == b'\x07\x02\x11\x11\xff\xff\xff\xff' 2536 2537 = ICMPv6NDOptAdvInterval - Basic dissection 2538 a=ICMPv6NDOptAdvInterval(b'\x07\x01\x00\x00\x00\x00\x00\x00') 2539 a.type == 7 and a.len == 1 and a.res == 0 and a.advint == 0 2540 2541 = ICMPv6NDOptAdvInterval - Dissection with specific values 2542 a=ICMPv6NDOptAdvInterval(b'\x07\x02\x11\x11\xff\xff\xff\xff') 2543 a.type == 7 and a.len == 2 and a.res == 0x1111 and a.advint == 0xffffffff 2544 2545 2546 ############ 2547 ############ 2548 + ICMPv6NDOptHAInfo Class Test 2549 2550 = ICMPv6NDOptHAInfo - Basic Instantiation 2551 raw(ICMPv6NDOptHAInfo()) == b'\x08\x01\x00\x00\x00\x00\x00\x01' 2552 2553 = ICMPv6NDOptHAInfo - Instantiation with specific values 2554 raw(ICMPv6NDOptHAInfo(len=2, res=0x1111, pref=0x2222, lifetime=0x3333)) == b'\x08\x02\x11\x11""33' 2555 2556 = ICMPv6NDOptHAInfo - Basic dissection 2557 a=ICMPv6NDOptHAInfo(b'\x08\x01\x00\x00\x00\x00\x00\x01') 2558 a.type == 8 and a.len == 1 and a.res == 0 and a.pref == 0 and a.lifetime == 1 2559 2560 = ICMPv6NDOptHAInfo - Dissection with specific values 2561 a=ICMPv6NDOptHAInfo(b'\x08\x02\x11\x11""33') 2562 a.type == 8 and a.len == 2 and a.res == 0x1111 and a.pref == 0x2222 and a.lifetime == 0x3333 2563 2564 2565 ############ 2566 ############ 2567 + ICMPv6NDOptSrcAddrList Class Test 2568 2569 = ICMPv6NDOptSrcAddrList - Basic Instantiation 2570 raw(ICMPv6NDOptSrcAddrList()) == b'\t\x01\x00\x00\x00\x00\x00\x00' 2571 2572 = ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len) 2573 raw(ICMPv6NDOptSrcAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2574 2575 = ICMPv6NDOptSrcAddrList - Instantiation with specific values 2576 raw(ICMPv6NDOptSrcAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2577 2578 = ICMPv6NDOptSrcAddrList - Basic Dissection 2579 a=ICMPv6NDOptSrcAddrList(b'\t\x01\x00\x00\x00\x00\x00\x00') 2580 a.type == 9 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist 2581 2582 = ICMPv6NDOptSrcAddrList - Dissection with specific values (auto len) 2583 a=ICMPv6NDOptSrcAddrList(b'\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2584 a.type == 9 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111" 2585 2586 = ICMPv6NDOptSrcAddrList - Dissection with specific values 2587 conf.debug_dissector = False 2588 a=ICMPv6NDOptSrcAddrList(b'\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2589 conf.debug_dissector = True 2590 a.type == 9 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2591 2592 2593 ############ 2594 ############ 2595 + ICMPv6NDOptTgtAddrList Class Test 2596 2597 = ICMPv6NDOptTgtAddrList - Basic Instantiation 2598 raw(ICMPv6NDOptTgtAddrList()) == b'\n\x01\x00\x00\x00\x00\x00\x00' 2599 2600 = ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len) 2601 raw(ICMPv6NDOptTgtAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2602 2603 = ICMPv6NDOptTgtAddrList - Instantiation with specific values 2604 raw(ICMPv6NDOptTgtAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2605 2606 = ICMPv6NDOptTgtAddrList - Basic Dissection 2607 a=ICMPv6NDOptTgtAddrList(b'\n\x01\x00\x00\x00\x00\x00\x00') 2608 a.type == 10 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist 2609 2610 = ICMPv6NDOptTgtAddrList - Dissection with specific values (auto len) 2611 a=ICMPv6NDOptTgtAddrList(b'\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2612 a.type == 10 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111" 2613 2614 = ICMPv6NDOptTgtAddrList - Instantiation with specific values 2615 conf.debug_dissector = False 2616 a=ICMPv6NDOptTgtAddrList(b'\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2617 conf.debug_dissector = True 2618 a.type == 10 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2619 2620 2621 ############ 2622 ############ 2623 + ICMPv6NDOptIPAddr Class Test (RFC 4068) 2624 2625 = ICMPv6NDOptIPAddr - Basic Instantiation 2626 raw(ICMPv6NDOptIPAddr()) == b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2627 2628 = ICMPv6NDOptIPAddr - Instantiation with specific values 2629 raw(ICMPv6NDOptIPAddr(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, addr="ffff::1111")) == b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2630 2631 = ICMPv6NDOptIPAddr - Basic Dissection 2632 a=ICMPv6NDOptIPAddr(b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2633 a.type == 17 and a.len == 3 and a.optcode == 1 and a.plen == 64 and a.res == 0 and a.addr == "::" 2634 2635 = ICMPv6NDOptIPAddr - Dissection with specific values 2636 a=ICMPv6NDOptIPAddr(b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2637 a.type == 17 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.addr == "ffff::1111" 2638 2639 2640 ############ 2641 ############ 2642 + ICMPv6NDOptNewRtrPrefix Class Test (RFC 4068) 2643 2644 = ICMPv6NDOptNewRtrPrefix - Basic Instantiation 2645 raw(ICMPv6NDOptNewRtrPrefix()) == b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2646 2647 = ICMPv6NDOptNewRtrPrefix - Instantiation with specific values 2648 raw(ICMPv6NDOptNewRtrPrefix(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, prefix="ffff::1111")) == b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2649 2650 = ICMPv6NDOptNewRtrPrefix - Basic Dissection 2651 a=ICMPv6NDOptNewRtrPrefix(b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2652 a.type == 18 and a.len == 3 and a.optcode == 0 and a.plen == 64 and a.res == 0 and a.prefix == "::" 2653 2654 = ICMPv6NDOptNewRtrPrefix - Dissection with specific values 2655 a=ICMPv6NDOptNewRtrPrefix(b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2656 a.type == 18 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.prefix == "ffff::1111" 2657 2658 2659 ############ 2660 ############ 2661 + ICMPv6NDOptLLA Class Test (RFC 4068) 2662 2663 = ICMPv6NDOptLLA - Basic Instantiation 2664 raw(ICMPv6NDOptLLA()) == b'\x13\x01\x00\x00\x00\x00\x00\x00\x00' 2665 2666 = ICMPv6NDOptLLA - Instantiation with specific values 2667 raw(ICMPv6NDOptLLA(len=2, optcode=3, lla="ff:11:ff:11:ff:11")) == b'\x13\x02\x03\xff\x11\xff\x11\xff\x11' 2668 2669 = ICMPv6NDOptLLA - Basic Dissection 2670 a=ICMPv6NDOptLLA(b'\x13\x01\x00\x00\x00\x00\x00\x00\x00') 2671 a.type == 19 and a.len == 1 and a.optcode == 0 and a.lla == "00:00:00:00:00:00" 2672 2673 = ICMPv6NDOptLLA - Dissection with specific values 2674 a=ICMPv6NDOptLLA(b'\x13\x02\x03\xff\x11\xff\x11\xff\x11') 2675 a.type == 19 and a.len == 2 and a.optcode == 3 and a.lla == "ff:11:ff:11:ff:11" 2676 2677 2678 ############ 2679 ############ 2680 + ICMPv6NDOptRouteInfo Class Test 2681 2682 = ICMPv6NDOptRouteInfo - Basic Instantiation 2683 raw(ICMPv6NDOptRouteInfo()) == b'\x18\x01\x00\x00\xff\xff\xff\xff' 2684 2685 = ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length 2686 raw(ICMPv6NDOptRouteInfo(prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01' 2687 2688 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (1/4) 2689 raw(ICMPv6NDOptRouteInfo(len=1, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x01\x00\x00\xff\xff\xff\xff' 2690 2691 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (2/4) 2692 raw(ICMPv6NDOptRouteInfo(len=2, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x02\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01' 2693 2694 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (3/4) 2695 raw(ICMPv6NDOptRouteInfo(len=3, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01' 2696 2697 = ICMPv6NDOptRouteInfo - Instantiation with forced length values (4/4) 2698 raw(ICMPv6NDOptRouteInfo(len=4, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x04\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00' 2699 2700 = ICMPv6NDOptRouteInfo - Instantiation with specific values 2701 raw(ICMPv6NDOptRouteInfo(len=6, plen=0x11, res1=1, prf=3, res2=1, rtlifetime=0x22222222, prefix="2001:db8::1")) == b'\x18\x06\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2702 2703 = ICMPv6NDOptRouteInfo - Basic dissection 2704 a=ICMPv6NDOptRouteInfo(b'\x18\x03\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2705 a.type == 24 and a.len == 3 and a.plen == 0 and a.res1 == 0 and a.prf == 0 and a.res2 == 0 and a.rtlifetime == 0xffffffff and a. prefix == "::" 2706 2707 = ICMPv6NDOptRouteInfo - Dissection with specific values 2708 a=ICMPv6NDOptRouteInfo(b'\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 2709 a.plen == 0x11 and a.res1 == 1 and a.prf == 3 and a.res2 == 1 and a.rtlifetime == 0x22222222 and a.prefix == "2001:db8::1" 2710 2711 2712 ############ 2713 ############ 2714 + ICMPv6NDOptMAP Class Test 2715 2716 = ICMPv6NDOptMAP - Basic Instantiation 2717 raw(ICMPv6NDOptMAP()) == b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2718 2719 = ICMPv6NDOptMAP - Instantiation with specific values 2720 raw(ICMPv6NDOptMAP(len=5, dist=3, pref=10, R=0, res=1, validlifetime=0x11111111, addr="ffff::1111")) == b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' 2721 2722 = ICMPv6NDOptMAP - Basic Dissection 2723 a=ICMPv6NDOptMAP(b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2724 a.type==23 and a.len==3 and a.dist==1 and a.pref==15 and a.R==1 and a.res==0 and a.validlifetime==0xffffffff and a.addr=="::" 2725 2726 = ICMPv6NDOptMAP - Dissection with specific values 2727 a=ICMPv6NDOptMAP(b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') 2728 a.type==23 and a.len==5 and a.dist==3 and a.pref==10 and a.R==0 and a.res==1 and a.validlifetime==0x11111111 and a.addr=="ffff::1111" 2729 2730 2731 ############ 2732 ############ 2733 + ICMPv6NDOptRDNSS Class Test 2734 2735 = ICMPv6NDOptRDNSS - Basic Instantiation 2736 raw(ICMPv6NDOptRDNSS()) == b'\x19\x01\x00\x00\xff\xff\xff\xff' 2737 2738 = ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address 2739 raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1"])) == b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 2740 2741 = ICMPv6NDOptRDNSS - Basic instantiation with 2 DNS addresses 2742 raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1", "2001:db8::2"])) == b'\x19\x05\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 2743 2744 = ICMPv6NDOptRDNSS - Instantiation with specific values 2745 raw(ICMPv6NDOptRDNSS(len=43, res=0xaaee, lifetime=0x11111111, dns=["2001:db8::2"])) == b'\x19+\xaa\xee\x11\x11\x11\x11 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 2746 2747 = ICMPv6NDOptRDNSS - Basic Dissection 2748 a=ICMPv6NDOptRDNSS(b'\x19\x01\x00\x00\xff\xff\xff\xff') 2749 a.type==25 and a.len==1 and a.res == 0 and a.dns==[] 2750 2751 = ICMPv6NDOptRDNSS - Dissection (with 1 DNS address) 2752 a=ICMPv6NDOptRDNSS(b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 2753 a.type==25 and a.len==3 and a.res ==0 and len(a.dns) == 1 and a.dns[0] == "2001:db8::1" 2754 2755 = ICMPv6NDOptRDNSS - Dissection (with 2 DNS addresses) 2756 a=ICMPv6NDOptRDNSS(b'\x19\x05\xaa\xee\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 2757 a.type==25 and a.len==5 and a.res == 0xaaee and len(a.dns) == 2 and a.dns[0] == "2001:db8::1" and a.dns[1] == "2001:db8::2" 2758 2759 2760 ############ 2761 ############ 2762 + ICMPv6NDOptDNSSL Class Test 2763 2764 = ICMPv6NDOptDNSSL - Basic Instantiation 2765 raw(ICMPv6NDOptDNSSL()) == b'\x1f\x01\x00\x00\xff\xff\xff\xff' 2766 2767 = ICMPv6NDOptDNSSL - Instantiation with 1 search domain, as seen in the wild 2768 raw(ICMPv6NDOptDNSSL(lifetime=60, searchlist=["home."])) == b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00' 2769 2770 = ICMPv6NDOptDNSSL - Basic instantiation with 2 search domains 2771 raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office."])) == b'\x1f\x03\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x00\x00' 2772 2773 = ICMPv6NDOptDNSSL - Basic instantiation with 3 search domains 2774 raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office.", "here.there."])) == b'\x1f\x05\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x04here\x05there\x00\x00\x00\x00\x00\x00\x00' 2775 2776 = ICMPv6NDOptDNSSL - Basic Dissection 2777 p = ICMPv6NDOptDNSSL(b'\x1f\x01\x00\x00\xff\xff\xff\xff') 2778 p.type == 31 and p.len == 1 and p.res == 0 and p.searchlist == [] 2779 2780 = ICMPv6NDOptDNSSL - Basic Dissection with specific values 2781 p = ICMPv6NDOptDNSSL(b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00') 2782 p.type == 31 and p.len == 2 and p.res == 0 and p.lifetime == 60 and p.searchlist == ["home."] 2783 2784 2785 ############ 2786 ############ 2787 + ICMPv6NDOptEFA Class Test 2788 2789 = ICMPv6NDOptEFA - Basic Instantiation 2790 raw(ICMPv6NDOptEFA()) == b'\x1a\x01\x00\x00\x00\x00\x00\x00' 2791 2792 = ICMPv6NDOptEFA - Basic Dissection 2793 a=ICMPv6NDOptEFA(b'\x1a\x01\x00\x00\x00\x00\x00\x00') 2794 a.type==26 and a.len==1 and a.res == 0 2795 2796 2797 ############ 2798 ############ 2799 + Test Node Information Query - ICMPv6NIQueryNOOP 2800 2801 = ICMPv6NIQueryNOOP - Basic Instantiation 2802 raw(ICMPv6NIQueryNOOP(nonce=b"\x00"*8)) == b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2803 2804 = ICMPv6NIQueryNOOP - Basic Dissection 2805 a = ICMPv6NIQueryNOOP(b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 2806 a.type == 139 and a.code == 1 and a.cksum == 0 and a.qtype == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b"\x00"*8 and a.data == b"" 2807 2808 2809 ############ 2810 ############ 2811 + Test Node Information Query - ICMPv6NIQueryName 2812 2813 = ICMPv6NIQueryName - single label DNS name (internal) 2814 a=ICMPv6NIQueryName(data="abricot").getfieldval("data") 2815 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' 2816 2817 = ICMPv6NIQueryName - single label DNS name 2818 ICMPv6NIQueryName(data="abricot").data == b"abricot" 2819 2820 = ICMPv6NIQueryName - fqdn (internal) 2821 a=ICMPv6NIQueryName(data="n.d.org").getfieldval("data") 2822 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' 2823 2824 = ICMPv6NIQueryName - fqdn 2825 ICMPv6NIQueryName(data="n.d.org").data == b"n.d.org" 2826 2827 = ICMPv6NIQueryName - IPv6 address (internal) 2828 a=ICMPv6NIQueryName(data="2001:db8::1").getfieldval("data") 2829 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' 2830 2831 = ICMPv6NIQueryName - IPv6 address 2832 ICMPv6NIQueryName(data="2001:db8::1").data == "2001:db8::1" 2833 2834 = ICMPv6NIQueryName - IPv4 address (internal) 2835 a=ICMPv6NIQueryName(data="169.254.253.252").getfieldval("data") 2836 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' 2837 2838 = ICMPv6NIQueryName - IPv4 address 2839 ICMPv6NIQueryName(data="169.254.253.252").data == '169.254.253.252' 2840 2841 = ICMPv6NIQueryName - build & dissection 2842 s = raw(IPv6()/ICMPv6NIQueryName(data="n.d.org")) 2843 p = IPv6(s) 2844 ICMPv6NIQueryName in p and p[ICMPv6NIQueryName].data == b"n.d.org" 2845 2846 2847 ############ 2848 ############ 2849 + Test Node Information Query - ICMPv6NIQueryIPv6 2850 2851 = ICMPv6NIQueryIPv6 - single label DNS name (internal) 2852 a = ICMPv6NIQueryIPv6(data="abricot") 2853 ls(a) 2854 a = a.getfieldval("data") 2855 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' 2856 2857 = ICMPv6NIQueryIPv6 - single label DNS name 2858 ICMPv6NIQueryIPv6(data="abricot").data == b"abricot" 2859 2860 = ICMPv6NIQueryIPv6 - fqdn (internal) 2861 a=ICMPv6NIQueryIPv6(data="n.d.org").getfieldval("data") 2862 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' 2863 2864 = ICMPv6NIQueryIPv6 - fqdn 2865 ICMPv6NIQueryIPv6(data="n.d.org").data == b"n.d.org" 2866 2867 = ICMPv6NIQueryIPv6 - IPv6 address (internal) 2868 a=ICMPv6NIQueryIPv6(data="2001:db8::1").getfieldval("data") 2869 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' 2870 2871 = ICMPv6NIQueryIPv6 - IPv6 address 2872 ICMPv6NIQueryIPv6(data="2001:db8::1").data == "2001:db8::1" 2873 2874 = ICMPv6NIQueryIPv6 - IPv4 address (internal) 2875 a=ICMPv6NIQueryIPv6(data="169.254.253.252").getfieldval("data") 2876 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' 2877 2878 = ICMPv6NIQueryIPv6 - IPv4 address 2879 ICMPv6NIQueryIPv6(data="169.254.253.252").data == '169.254.253.252' 2880 2881 2882 ############ 2883 ############ 2884 + Test Node Information Query - ICMPv6NIQueryIPv4 2885 2886 = ICMPv6NIQueryIPv4 - single label DNS name (internal) 2887 a=ICMPv6NIQueryIPv4(data="abricot").getfieldval("data") 2888 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' 2889 2890 = ICMPv6NIQueryIPv4 - single label DNS name 2891 ICMPv6NIQueryIPv4(data="abricot").data == b"abricot" 2892 2893 = ICMPv6NIQueryIPv4 - fqdn (internal) 2894 a=ICMPv6NIQueryIPv4(data="n.d.org").getfieldval("data") 2895 type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' 2896 2897 = ICMPv6NIQueryIPv4 - fqdn 2898 ICMPv6NIQueryIPv4(data="n.d.org").data == b"n.d.org" 2899 2900 = ICMPv6NIQueryIPv4 - IPv6 address (internal) 2901 a=ICMPv6NIQueryIPv4(data="2001:db8::1").getfieldval("data") 2902 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' 2903 2904 = ICMPv6NIQueryIPv4 - IPv6 address 2905 ICMPv6NIQueryIPv4(data="2001:db8::1").data == "2001:db8::1" 2906 2907 = ICMPv6NIQueryIPv4 - IPv4 address (internal) 2908 a=ICMPv6NIQueryIPv4(data="169.254.253.252").getfieldval("data") 2909 type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' 2910 2911 = ICMPv6NIQueryIPv4 - IPv4 address 2912 ICMPv6NIQueryIPv4(data="169.254.253.252").data == '169.254.253.252' 2913 2914 2915 ############ 2916 ############ 2917 + Test Node Information Query - Flags tests 2918 2919 = ICMPv6NIQuery* - flags handling (Test 1) 2920 t = ICMPv6NIQueryIPv6(flags="T") 2921 a = ICMPv6NIQueryIPv6(flags="A") 2922 c = ICMPv6NIQueryIPv6(flags="C") 2923 l = ICMPv6NIQueryIPv6(flags="L") 2924 s = ICMPv6NIQueryIPv6(flags="S") 2925 g = ICMPv6NIQueryIPv6(flags="G") 2926 allflags = ICMPv6NIQueryIPv6(flags="TALCLSG") 2927 t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63 2928 2929 2930 = ICMPv6NIQuery* - flags handling (Test 2) 2931 t = raw(ICMPv6NIQueryNOOP(flags="T", nonce="A"*8))[6:8] 2932 a = raw(ICMPv6NIQueryNOOP(flags="A", nonce="A"*8))[6:8] 2933 c = raw(ICMPv6NIQueryNOOP(flags="C", nonce="A"*8))[6:8] 2934 l = raw(ICMPv6NIQueryNOOP(flags="L", nonce="A"*8))[6:8] 2935 s = raw(ICMPv6NIQueryNOOP(flags="S", nonce="A"*8))[6:8] 2936 g = raw(ICMPv6NIQueryNOOP(flags="G", nonce="A"*8))[6:8] 2937 allflags = raw(ICMPv6NIQueryNOOP(flags="TALCLSG", nonce="A"*8))[6:8] 2938 t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F' 2939 2940 2941 = ICMPv6NIReply* - flags handling (Test 1) 2942 t = ICMPv6NIReplyIPv6(flags="T") 2943 a = ICMPv6NIReplyIPv6(flags="A") 2944 c = ICMPv6NIReplyIPv6(flags="C") 2945 l = ICMPv6NIReplyIPv6(flags="L") 2946 s = ICMPv6NIReplyIPv6(flags="S") 2947 g = ICMPv6NIReplyIPv6(flags="G") 2948 allflags = ICMPv6NIReplyIPv6(flags="TALCLSG") 2949 t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63 2950 2951 2952 = ICMPv6NIReply* - flags handling (Test 2) 2953 t = raw(ICMPv6NIReplyNOOP(flags="T", nonce="A"*8))[6:8] 2954 a = raw(ICMPv6NIReplyNOOP(flags="A", nonce="A"*8))[6:8] 2955 c = raw(ICMPv6NIReplyNOOP(flags="C", nonce="A"*8))[6:8] 2956 l = raw(ICMPv6NIReplyNOOP(flags="L", nonce="A"*8))[6:8] 2957 s = raw(ICMPv6NIReplyNOOP(flags="S", nonce="A"*8))[6:8] 2958 g = raw(ICMPv6NIReplyNOOP(flags="G", nonce="A"*8))[6:8] 2959 allflags = raw(ICMPv6NIReplyNOOP(flags="TALCLSG", nonce="A"*8))[6:8] 2960 t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F' 2961 2962 2963 = ICMPv6NIQuery* - Flags Default values 2964 a = ICMPv6NIQueryNOOP() 2965 b = ICMPv6NIQueryName() 2966 c = ICMPv6NIQueryIPv4() 2967 d = ICMPv6NIQueryIPv6() 2968 a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 62 2969 2970 = ICMPv6NIReply* - Flags Default values 2971 a = ICMPv6NIReplyIPv6() 2972 b = ICMPv6NIReplyName() 2973 c = ICMPv6NIReplyIPv6() 2974 d = ICMPv6NIReplyIPv4() 2975 e = ICMPv6NIReplyRefuse() 2976 f = ICMPv6NIReplyUnknown() 2977 a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 0 and e.flags == 0 and f.flags == 0 2978 2979 2980 2981 # Nonces 2982 # hashret and answers 2983 # payload guess 2984 # automatic destination address computation when integrated in scapy6 2985 # at least computeNIGroupAddr 2986 2987 2988 ############ 2989 ############ 2990 + Test Node Information Query - Dispatching 2991 2992 = ICMPv6NIQueryIPv6 - dispatch with nothing in data 2993 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6()) 2994 p = IPv6(s) 2995 isinstance(p.payload, ICMPv6NIQueryIPv6) 2996 2997 = ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data 2998 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="2001::db8::1")) 2999 p = IPv6(s) 3000 isinstance(p.payload, ICMPv6NIQueryIPv6) 3001 3002 = ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data 3003 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="192.168.0.1")) 3004 p = IPv6(s) 3005 isinstance(p.payload, ICMPv6NIQueryIPv6) 3006 3007 = ICMPv6NIQueryIPv6 - dispatch with name in data 3008 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="alfred")) 3009 p = IPv6(s) 3010 isinstance(p.payload, ICMPv6NIQueryIPv6) 3011 3012 = ICMPv6NIQueryName - dispatch with nothing in data 3013 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName()) 3014 p = IPv6(s) 3015 isinstance(p.payload, ICMPv6NIQueryName) 3016 3017 = ICMPv6NIQueryName - dispatch with IPv6 address in data 3018 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="2001:db8::1")) 3019 p = IPv6(s) 3020 isinstance(p.payload, ICMPv6NIQueryName) 3021 3022 = ICMPv6NIQueryName - dispatch with IPv4 address in data 3023 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="192.168.0.1")) 3024 p = IPv6(s) 3025 isinstance(p.payload, ICMPv6NIQueryName) 3026 3027 = ICMPv6NIQueryName - dispatch with name in data 3028 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="alfred")) 3029 p = IPv6(s) 3030 isinstance(p.payload, ICMPv6NIQueryName) 3031 3032 = ICMPv6NIQueryIPv4 - dispatch with nothing in data 3033 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4()) 3034 p = IPv6(s) 3035 isinstance(p.payload, ICMPv6NIQueryIPv4) 3036 3037 = ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data 3038 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="2001:db8::1")) 3039 p = IPv6(s) 3040 isinstance(p.payload, ICMPv6NIQueryIPv4) 3041 3042 = ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data 3043 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="192.168.0.1")) 3044 p = IPv6(s) 3045 isinstance(p.payload, ICMPv6NIQueryIPv4) 3046 3047 = ICMPv6NIQueryIPv4 - dispatch with name in data 3048 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="alfred")) 3049 p = IPv6(s) 3050 isinstance(p.payload, ICMPv6NIQueryIPv4) 3051 3052 = ICMPv6NIReplyName - dispatch 3053 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyName()) 3054 p = IPv6(s) 3055 isinstance(p.payload, ICMPv6NIReplyName) 3056 3057 = ICMPv6NIReplyIPv6 - dispatch 3058 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv6()) 3059 p = IPv6(s) 3060 isinstance(p.payload, ICMPv6NIReplyIPv6) 3061 3062 = ICMPv6NIReplyIPv4 - dispatch 3063 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv4()) 3064 p = IPv6(s) 3065 isinstance(p.payload, ICMPv6NIReplyIPv4) 3066 3067 = ICMPv6NIReplyRefuse - dispatch 3068 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyRefuse()) 3069 p = IPv6(s) 3070 isinstance(p.payload, ICMPv6NIReplyRefuse) 3071 3072 = ICMPv6NIReplyUnknown - dispatch 3073 s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyUnknown()) 3074 p = IPv6(s) 3075 isinstance(p.payload, ICMPv6NIReplyUnknown) 3076 3077 3078 ############ 3079 ############ 3080 + Test Node Information Query - ICMPv6NIReplyNOOP 3081 3082 = ICMPv6NIReplyNOOP - single DNS name without hint => understood as string (internal) 3083 a=ICMPv6NIReplyNOOP(data="abricot").getfieldval("data") 3084 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"abricot" 3085 3086 = ICMPv6NIReplyNOOP - single DNS name without hint => understood as string 3087 ICMPv6NIReplyNOOP(data="abricot").data == b"abricot" 3088 3089 = ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal) 3090 a=ICMPv6NIReplyNOOP(data="n.d.tld").getfieldval("data") 3091 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"n.d.tld" 3092 3093 = ICMPv6NIReplyNOOP - fqdn without hint => understood as string 3094 ICMPv6NIReplyNOOP(data="n.d.tld").data == b"n.d.tld" 3095 3096 = ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal) 3097 a=ICMPv6NIReplyNOOP(data="2001:0db8::1").getfieldval("data") 3098 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"2001:0db8::1" 3099 3100 = ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string 3101 ICMPv6NIReplyNOOP(data="2001:0db8::1").data == b"2001:0db8::1" 3102 3103 = ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal) 3104 a=ICMPv6NIReplyNOOP(data="169.254.253.010").getfieldval("data") 3105 type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"169.254.253.010" 3106 3107 = ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string 3108 ICMPv6NIReplyNOOP(data="169.254.253.010").data == b"169.254.253.010" 3109 3110 3111 ############ 3112 ############ 3113 + Test Node Information Query - ICMPv6NIReplyName 3114 3115 = ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) (internal) 3116 a=ICMPv6NIReplyName(data="abricot").getfieldval("data") 3117 type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x07abricot\x00\x00' 3118 3119 = ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) 3120 ICMPv6NIReplyName(data="abricot").data == [0, b"abricot"] 3121 3122 = ICMPv6NIReplyName - fqdn name as a rawing (without ttl) (internal) 3123 a=ICMPv6NIReplyName(data="n.d.tld").getfieldval("data") 3124 type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x01n\x01d\x03tld\x00' 3125 3126 = ICMPv6NIReplyName - fqdn name as a rawing (without ttl) 3127 ICMPv6NIReplyName(data="n.d.tld").data == [0, b'n.d.tld'] 3128 3129 = ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal) 3130 a=ICMPv6NIReplyName(data=["abricot", "poire"]).getfieldval("data") 3131 type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x07abricot\x00\x00\x05poire\x00\x00' 3132 3133 = ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) 3134 ICMPv6NIReplyName(data=["abricot", "poire"]).data == [0, b"abricot", b"poire"] 3135 3136 = ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal) 3137 a=ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).getfieldval("data") 3138 type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 42 and a[1][1] == b'\x07abricot\x00\x00\x05poire\x00\x00\x01n\x01d\x03tld\x00' 3139 3140 = ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] 3141 ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).data == [42, b"abricot", b"poire", b"n.d.tld"] 3142 3143 3144 ############ 3145 ############ 3146 + Test Node Information Query - ICMPv6NIReplyIPv6 3147 3148 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (internal) 3149 a=ICMPv6NIReplyIPv6(data="2001:db8::1").getfieldval("data") 3150 type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" 3151 3152 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL 3153 ICMPv6NIReplyIPv6(data="2001:db8::1").data == [(0, '2001:db8::1')] 3154 3155 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) (internal) 3156 a=ICMPv6NIReplyIPv6(data=["2001:db8::1"]).getfieldval("data") 3157 type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" 3158 3159 = ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) 3160 ICMPv6NIReplyIPv6(data=["2001:db8::1"]).data == [(0, '2001:db8::1')] 3161 3162 = ICMPv6NIReplyIPv6 - one IPv6 address with TTL (internal) 3163 a=ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).getfieldval("data") 3164 type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" 3165 3166 = ICMPv6NIReplyIPv6 - one IPv6 address with TTL 3167 ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).data == [(0, '2001:db8::1')] 3168 3169 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) (internal) 3170 a=ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).getfieldval("data") 3171 type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2" 3172 3173 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) 3174 ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).data == [(0, '2001:db8::1'), (0, '2001:db8::2')] 3175 3176 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) (internal) 3177 a=ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).getfieldval("data") 3178 type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2" 3179 3180 = ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) 3181 ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).data == [(42, "2001:db8::1"), (0, "2001:db8::2")] 3182 3183 = ICMPv6NIReplyIPv6 - build & dissection 3184 3185 s = raw(IPv6()/ICMPv6NIReplyIPv6(data="2001:db8::1")) 3186 p = IPv6(s) 3187 ICMPv6NIReplyIPv6 in p and p.data == [(0, '2001:db8::1')] 3188 3189 ############ 3190 ############ 3191 + Test Node Information Query - ICMPv6NIReplyIPv4 3192 3193 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (internal) 3194 a=ICMPv6NIReplyIPv4(data="169.254.253.252").getfieldval("data") 3195 type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" 3196 3197 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL 3198 ICMPv6NIReplyIPv4(data="169.254.253.252").data == [(0, '169.254.253.252')] 3199 3200 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal) 3201 a=ICMPv6NIReplyIPv4(data=["169.254.253.252"]).getfieldval("data") 3202 type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" 3203 3204 = ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) 3205 ICMPv6NIReplyIPv4(data=["169.254.253.252"]).data == [(0, '169.254.253.252')] 3206 3207 = ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) 3208 a=ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).getfieldval("data") 3209 type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" 3210 3211 = ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) 3212 ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).data == [(0, '169.254.253.252')] 3213 3214 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) 3215 a=ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).getfieldval("data") 3216 type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253" 3217 3218 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) (internal) 3219 ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).data == [(0, '169.254.253.252'), (0, '169.254.253.253')] 3220 3221 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) 3222 a=ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).getfieldval("data") 3223 type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253" 3224 3225 = ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) (internal) 3226 ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).data == [(42, "169.254.253.252"), (0, "169.254.253.253")] 3227 3228 = ICMPv6NIReplyIPv4 - build & dissection 3229 3230 s = raw(IPv6()/ICMPv6NIReplyIPv4(data="192.168.0.1")) 3231 p = IPv6(s) 3232 ICMPv6NIReplyIPv4 in p and p.data == [(0, '192.168.0.1')] 3233 3234 s = raw(IPv6()/ICMPv6NIReplyIPv4(data=[(2807, "192.168.0.1")])) 3235 p = IPv6(s) 3236 ICMPv6NIReplyIPv4 in p and p.data == [(2807, "192.168.0.1")] 3237 3238 3239 ############ 3240 ############ 3241 + Test Node Information Query - ICMPv6NIReplyRefuse 3242 = ICMPv6NIReplyRefuse - basic instantiation 3243 raw(ICMPv6NIReplyRefuse())[:8] == b'\x8c\x01\x00\x00\x00\x00\x00\x00' 3244 3245 = ICMPv6NIReplyRefuse - basic dissection 3246 a=ICMPv6NIReplyRefuse(b'\x8c\x01\x00\x00\x00\x00\x00\x00\xf1\xe9\xab\xc9\x8c\x0by\x18') 3247 a.type == 140 and a.code == 1 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\xf1\xe9\xab\xc9\x8c\x0by\x18' and a.data == None 3248 3249 3250 ############ 3251 ############ 3252 + Test Node Information Query - ICMPv6NIReplyUnknown 3253 3254 = ICMPv6NIReplyUnknown - basic instantiation 3255 raw(ICMPv6NIReplyUnknown(nonce=b'\x00'*8)) == b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3256 3257 = ICMPv6NIReplyRefuse - basic dissection 3258 a=ICMPv6NIReplyRefuse(b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3259 a.type == 140 and a.code == 2 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\x00'*8 and a.data == None 3260 3261 3262 ############ 3263 ############ 3264 + Test Node Information Query - utilities 3265 3266 = computeNIGroupAddr 3267 computeNIGroupAddr("scapy") == "ff02::2:f886:2f66" 3268 3269 3270 ############ 3271 ############ 3272 + IPv6ExtHdrFragment Class Test 3273 3274 = IPv6ExtHdrFragment - Basic Instantiation 3275 raw(IPv6ExtHdrFragment()) == b';\x00\x00\x00\x00\x00\x00\x00' 3276 3277 = IPv6ExtHdrFragment - Instantiation with specific values 3278 raw(IPv6ExtHdrFragment(nh=0xff, res1=0xee, offset=0x1fff, res2=1, m=1, id=0x11111111)) == b'\xff\xee\xff\xfb\x11\x11\x11\x11' 3279 3280 = IPv6ExtHdrFragment - Basic Dissection 3281 a=IPv6ExtHdrFragment(b';\x00\x00\x00\x00\x00\x00\x00') 3282 a.nh == 59 and a.res1 == 0 and a.offset == 0 and a.res2 == 0 and a.m == 0 and a.id == 0 3283 3284 = IPv6ExtHdrFragment - Instantiation with specific values 3285 a=IPv6ExtHdrFragment(b'\xff\xee\xff\xfb\x11\x11\x11\x11') 3286 a.nh == 0xff and a.res1 == 0xee and a.offset==0x1fff and a.res2==1 and a.m == 1 and a.id == 0x11111111 3287 3288 3289 ############ 3290 ############ 3291 + Test fragment6 function 3292 3293 = fragment6 - test against a long TCP packet with a 1280 MTU 3294 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 3295 len(l) == 33 and len(raw(l[-1])) == 644 3296 3297 3298 ############ 3299 ############ 3300 + Test defragment6 function 3301 3302 = defragment6 - test against a long TCP packet fragmented with a 1280 MTU 3303 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 3304 raw(defragment6(l)) == (b'`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + b'A'*40000) 3305 3306 3307 = defragment6 - test against a large TCP packet fragmented with a 1280 bytes MTU and missing fragments 3308 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) 3309 del(l[2]) 3310 del(l[4]) 3311 del(l[12]) 3312 del(l[18]) 3313 raw(defragment6(l)) == (b'`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + 2444*b'A' + 1232*b'X' + 2464*b'A' + 1232*b'X' + 9856*b'A' + 1232*b'X' + 7392*b'A' + 1232*b'X' + 12916*b'A') 3314 3315 3316 = defragment6 - test against a TCP packet fragmented with a 800 bytes MTU and missing fragments 3317 l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*4000), 800) 3318 del(l[4]) 3319 del(l[2]) 3320 raw(defragment6(l)) == b'`\x00\x00\x00\x0f\xb4\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb2\x0f\x00\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' 3321 3322 3323 ############ 3324 ############ 3325 + Test Route6 class 3326 3327 = Route6 - Route6 flushing 3328 conf.route6.routes=[ 3329 ( '::1', 128, '::', 'lo', ['::1'], 1), 3330 ( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1)] 3331 conf.route6.flush() 3332 not conf.route6.routes 3333 3334 = Route6 - Route6.route 3335 conf.route6.flush() 3336 conf.route6.routes=[ 3337 ( '::1', 128, '::', 'lo', ['::1'], 1), 3338 ( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1), 3339 ( 'fe80::', 64, '::', 'eth0', ['fe80::20f:1fff:feca:4650'], 1), 3340 ('2001:db8:0:4444:20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1), 3341 ( '2001:db8:0:4444::', 64, '::', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650'], 1), 3342 ( '::', 0, 'fe80::20f:34ff:fe8a:8aa1', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650', '2002:db8:0:4444:20f:1fff:feca:4650'], 1) 3343 ] 3344 conf.route6.route("2002::1") == ('eth0', '2002:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') and conf.route6.route("2001::1") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') and conf.route6.route("fe80::20f:1fff:feab:4870") == ('eth0', 'fe80::20f:1fff:feca:4650', '::') and conf.route6.route("::1") == ('lo', '::1', '::') and conf.route6.route("::") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') and conf.route6.route('ff00::') == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') 3345 conf.route6.resync() 3346 if not len(conf.route6.routes): 3347 # IPv6 seems disabled. Force a route to ::1 3348 conf.route6.routes.append(("::1", 128, "::", LOOPBACK_NAME, ["::1"], 1)) 3349 True 3350 3351 = Route6 - Route6.make_route 3352 3353 r6 = Route6() 3354 r6.make_route("2001:db8::1", dev=LOOPBACK_NAME) == ("2001:db8::1", 128, "::", LOOPBACK_NAME, [], 1) 3355 len_r6 = len(r6.routes) 3356 3357 = Route6 - Route6.add & Route6.delt 3358 3359 r6.add(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1", dev="eth0") 3360 assert(len(r6.routes) == len_r6 + 1) 3361 r6.delt(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1") 3362 assert(len(r6.routes) == len_r6) 3363 3364 = Route6 - Route6.ifadd & Route6.ifdel 3365 r6.ifadd("scapy0", "2001:bd8:cafe:1::1/64") 3366 r6.ifdel("scapy0") 3367 3368 = IPv6 - utils 3369 3370 @mock.patch("scapy.layers.inet6.get_if_hwaddr") 3371 @mock.patch("scapy.layers.inet6.srp1") 3372 def test_neighsol(mock_srp1, mock_get_if_hwaddr): 3373 mock_srp1.return_value = Ether()/IPv6()/ICMPv6ND_NA()/ICMPv6NDOptDstLLAddr(lladdr="05:04:03:02:01:00") 3374 mock_get_if_hwaddr.return_value = "00:01:02:03:04:05" 3375 return neighsol("fe80::f6ce:46ff:fea9:e04b", "fe80::f6ce:46ff:fea9:e04b", "scapy0") 3376 3377 p = test_neighsol() 3378 ICMPv6NDOptDstLLAddr in p and p[ICMPv6NDOptDstLLAddr].lladdr == "05:04:03:02:01:00" 3379 3380 3381 @mock.patch("scapy.layers.inet6.neighsol") 3382 @mock.patch("scapy.layers.inet6.conf.route6.route") 3383 def test_getmacbyip6(mock_route6, mock_neighsol): 3384 mock_route6.return_value = ("scapy0", "fe80::baca:3aff:fe72:b08b", "::") 3385 mock_neighsol.return_value = test_neighsol() 3386 return getmacbyip6("fe80::704:3ff:fe2:100") 3387 3388 test_getmacbyip6() == "05:04:03:02:01:00" 3389 3390 = IPv6 - IPerror6 & UDPerror & _ICMPv6Error 3391 3392 query = IPv6(dst="2001:db8::1", src="2001:db8::2", hlim=1)/UDP()/DNS() 3393 answer = IPv6(dst="2001:db8::2", src="2001:db8::1", hlim=1)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::2", hlim=0)/UDPerror()/DNS() 3394 answer.answers(query) == True 3395 3396 # Test _ICMPv6Error 3397 from scapy.layers.inet6 import _ICMPv6Error 3398 assert _ICMPv6Error().guess_payload_class(None) == IPerror6 3399 3400 ############ 3401 ############ 3402 + ICMPv6ML 3403 3404 = ICMPv6MLQuery - build & dissection 3405 s = raw(IPv6()/ICMPv6MLQuery()) 3406 s == b"`\x00\x00\x00\x00\x18:\x01\xfe\x80\x00\x00\x00\x00\x00\x00\xba\xca:\xff\xfer\xb0\x8b\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x00\xb4O'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 3407 3408 p = IPv6(s) 3409 ICMPv6MLQuery in p and p[IPv6].dst == "ff02::1" 3410 3411 ############ 3412 ############ 3413 + Ether tests with IPv6 3414 3415 = Ether IPv6 checking for dst 3416 ~ netaccess ipv6 3417 3418 p = Ether()/IPv6(dst="www.google.com")/TCP() 3419 assert p.dst != p[IPv6].dst 3420 p.show() 3421 3422 ############ 3423 ############ 3424 + TracerouteResult6 3425 3426 = get_trace() 3427 ip6_hlim = [("2001:db8::%d" % i, i) for i in six.moves.range(1, 12)] 3428 3429 tr6_packets = [ (IPv6(dst="2001:db8::1", src="2001:db8::254", hlim=hlim)/UDP()/"scapy", 3430 IPv6(dst="2001:db8::254", src=ip)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::254", hlim=0)/UDPerror()/"scapy") 3431 for (ip, hlim) in ip6_hlim ] 3432 3433 tr6 = TracerouteResult6(tr6_packets) 3434 tr6.get_trace() == {'2001:db8::1': {1: ('2001:db8::1', False), 2: ('2001:db8::2', False), 3: ('2001:db8::3', False), 4: ('2001:db8::4', False), 5: ('2001:db8::5', False), 6: ('2001:db8::6', False), 7: ('2001:db8::7', False), 8: ('2001:db8::8', False), 9: ('2001:db8::9', False), 10: ('2001:db8::10', False), 11: ('2001:db8::11', False)}} 3435 3436 = show() 3437 def test_show(): 3438 with ContextManagerCaptureOutput() as cmco: 3439 tr6 = TracerouteResult6(tr6_packets) 3440 tr6.show() 3441 result = cmco.get_output() 3442 expected = " 2001:db8::1 :udpdomain \n" 3443 expected += "1 2001:db8::1 3 \n" 3444 expected += "2 2001:db8::2 3 \n" 3445 expected += "3 2001:db8::3 3 \n" 3446 expected += "4 2001:db8::4 3 \n" 3447 expected += "5 2001:db8::5 3 \n" 3448 expected += "6 2001:db8::6 3 \n" 3449 expected += "7 2001:db8::7 3 \n" 3450 expected += "8 2001:db8::8 3 \n" 3451 expected += "9 2001:db8::9 3 \n" 3452 expected += "10 2001:db8::10 3 \n" 3453 expected += "11 2001:db8::11 3 \n" 3454 index_result = result.index("\n1") 3455 index_expected = expected.index("\n1") 3456 assert(result[index_result:] == expected[index_expected:]) 3457 3458 test_show() 3459 3460 = graph() 3461 saved_AS_resolver = conf.AS_resolver 3462 conf.AS_resolver = None 3463 tr6.make_graph() 3464 len(tr6.graphdef) == 492 3465 tr6.graphdef.startswith("digraph trace {") == True 3466 '"2001:db8::1 53/udp";' in tr6.graphdef 3467 conf.AS_resolver = conf.AS_resolver 3468 3469 3470 # Below is our Homework : here is the mountain ... 3471 # 3472 3473 ########### ICMPv6MLReport Class #################################### 3474 ########### ICMPv6MLDone Class ###################################### 3475 ########### ICMPv6ND_Redirect Class ################################# 3476 ########### ICMPv6NDOptSrcAddrList Class ############################ 3477 ########### ICMPv6NDOptTgtAddrList Class ############################ 3478 ########### ICMPv6ND_INDSol Class ################################### 3479 ########### ICMPv6ND_INDAdv Class ################################### 3480 3481 3482 3483 3484 3485 ##################################################################### 3486 ##################################################################### 3487 ########################## DHCPv6 ########################## 3488 ##################################################################### 3489 ##################################################################### 3490 3491 3492 ############ 3493 ############ 3494 + Test DHCP6 DUID_LLT 3495 3496 = DUID_LLT basic instantiation 3497 a=DUID_LLT() 3498 3499 = DUID_LLT basic build 3500 raw(DUID_LLT()) == b'\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3501 3502 = DUID_LLT build with specific values 3503 raw(DUID_LLT(lladdr="ff:ff:ff:ff:ff:ff", timeval=0x11111111, hwtype=0x2222)) == b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff' 3504 3505 = DUID_LLT basic dissection 3506 a=DUID_LLT(raw(DUID_LLT())) 3507 a.type == 1 and a.hwtype == 1 and a.timeval == 0 and a.lladdr == "00:00:00:00:00:00" 3508 3509 = DUID_LLT dissection with specific values 3510 a=DUID_LLT(b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff') 3511 a.type == 1 and a.hwtype == 0x2222 and a.timeval == 0x11111111 and a.lladdr == "ff:ff:ff:ff:ff:ff" 3512 3513 3514 ############ 3515 ############ 3516 + Test DHCP6 DUID_EN 3517 3518 = DUID_EN basic instantiation 3519 a=DUID_EN() 3520 3521 = DUID_EN basic build 3522 raw(DUID_EN()) == b'\x00\x02\x00\x00\x017' 3523 3524 = DUID_EN build with specific values 3525 raw(DUID_EN(enterprisenum=0x11111111, id="iamastring")) == b'\x00\x02\x11\x11\x11\x11iamastring' 3526 3527 = DUID_EN basic dissection 3528 a=DUID_EN(b'\x00\x02\x00\x00\x017') 3529 a.type == 2 and a.enterprisenum == 311 3530 3531 = DUID_EN dissection with specific values 3532 a=DUID_EN(b'\x00\x02\x11\x11\x11\x11iamarawing') 3533 a.type == 2 and a.enterprisenum == 0x11111111 and a.id == b"iamarawing" 3534 3535 3536 ############ 3537 ############ 3538 + Test DHCP6 DUID_LL 3539 3540 = DUID_LL basic instantiation 3541 a=DUID_LL() 3542 3543 = DUID_LL basic build 3544 raw(DUID_LL()) == b'\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' 3545 3546 = DUID_LL build with specific values 3547 raw(DUID_LL(hwtype=1, lladdr="ff:ff:ff:ff:ff:ff")) == b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff' 3548 3549 = DUID_LL basic dissection 3550 a=DUID_LL(raw(DUID_LL())) 3551 a.type == 3 and a.hwtype == 1 and a.lladdr == "00:00:00:00:00:00" 3552 3553 = DUID_LL with specific values 3554 a=DUID_LL(b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff') 3555 a.hwtype == 1 and a.lladdr == "ff:ff:ff:ff:ff:ff" 3556 3557 3558 ############ 3559 ############ 3560 + Test DHCP6 Opt Unknown 3561 3562 = DHCP6 Opt Unknown basic instantiation 3563 a=DHCP6OptUnknown() 3564 3565 = DHCP6 Opt Unknown basic build (default values) 3566 raw(DHCP6OptUnknown()) == b'\x00\x00\x00\x00' 3567 3568 = DHCP6 Opt Unknown - len computation test 3569 raw(DHCP6OptUnknown(data="shouldbe9")) == b'\x00\x00\x00\tshouldbe9' 3570 3571 3572 ############ 3573 ############ 3574 + Test DHCP6 Client Identifier option 3575 3576 = DHCP6OptClientId basic instantiation 3577 a=DHCP6OptClientId() 3578 3579 = DHCP6OptClientId basic build 3580 raw(DHCP6OptClientId()) == b'\x00\x01\x00\x00' 3581 3582 = DHCP6OptClientId instantiation with specific values 3583 raw(DHCP6OptClientId(duid="toto")) == b'\x00\x01\x00\x04toto' 3584 3585 = DHCP6OptClientId instantiation with DUID_LL 3586 raw(DHCP6OptClientId(duid=DUID_LL())) == b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' 3587 3588 = DHCP6OptClientId instantiation with DUID_LLT 3589 raw(DHCP6OptClientId(duid=DUID_LLT())) == b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3590 3591 = DHCP6OptClientId instantiation with DUID_EN 3592 raw(DHCP6OptClientId(duid=DUID_EN())) == b'\x00\x01\x00\x06\x00\x02\x00\x00\x017' 3593 3594 = DHCP6OptClientId instantiation with specified length 3595 raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring' 3596 3597 = DHCP6OptClientId basic dissection 3598 a=DHCP6OptClientId(b'\x00\x01\x00\x00') 3599 a.optcode == 1 and a.optlen == 0 3600 3601 = DHCP6OptClientId instantiation with specified length 3602 raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring' 3603 3604 = DHCP6OptClientId basic dissection 3605 a=DHCP6OptClientId(b'\x00\x01\x00\x00') 3606 a.optcode == 1 and a.optlen == 0 3607 3608 = DHCP6OptClientId dissection with specific duid value 3609 a=DHCP6OptClientId(b'\x00\x01\x00\x04somerawing') 3610 a.optcode == 1 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown) 3611 3612 = DHCP6OptClientId dissection with specific DUID_LL as duid value 3613 a=DHCP6OptClientId(b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00') 3614 a.optcode == 1 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00" 3615 3616 = DHCP6OptClientId dissection with specific DUID_LLT as duid value 3617 a=DHCP6OptClientId(b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3618 a.optcode == 1 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00" 3619 3620 = DHCP6OptClientId dissection with specific DUID_EN as duid value 3621 a=DHCP6OptClientId(b'\x00\x01\x00\x06\x00\x02\x00\x00\x017') 3622 a.optcode == 1 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == b"" 3623 3624 3625 ############ 3626 ############ 3627 + Test DHCP6 Server Identifier option 3628 3629 = DHCP6OptServerId basic instantiation 3630 a=DHCP6OptServerId() 3631 3632 = DHCP6OptServerId basic build 3633 raw(DHCP6OptServerId()) == b'\x00\x02\x00\x00' 3634 3635 = DHCP6OptServerId basic build with specific values 3636 raw(DHCP6OptServerId(duid="toto")) == b'\x00\x02\x00\x04toto' 3637 3638 = DHCP6OptServerId instantiation with DUID_LL 3639 raw(DHCP6OptServerId(duid=DUID_LL())) == b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' 3640 3641 = DHCP6OptServerId instantiation with DUID_LLT 3642 raw(DHCP6OptServerId(duid=DUID_LLT())) == b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3643 3644 = DHCP6OptServerId instantiation with DUID_EN 3645 raw(DHCP6OptServerId(duid=DUID_EN())) == b'\x00\x02\x00\x06\x00\x02\x00\x00\x017' 3646 3647 = DHCP6OptServerId instantiation with specified length 3648 raw(DHCP6OptServerId(optlen=80, duid="somestring")) == b'\x00\x02\x00Psomestring' 3649 3650 = DHCP6OptServerId basic dissection 3651 a=DHCP6OptServerId(b'\x00\x02\x00\x00') 3652 a.optcode == 2 and a.optlen == 0 3653 3654 = DHCP6OptServerId dissection with specific duid value 3655 a=DHCP6OptServerId(b'\x00\x02\x00\x04somerawing') 3656 a.optcode == 2 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown) 3657 3658 = DHCP6OptServerId dissection with specific DUID_LL as duid value 3659 a=DHCP6OptServerId(b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00') 3660 a.optcode == 2 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00" 3661 3662 = DHCP6OptServerId dissection with specific DUID_LLT as duid value 3663 a=DHCP6OptServerId(b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3664 a.optcode == 2 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00" 3665 3666 = DHCP6OptServerId dissection with specific DUID_EN as duid value 3667 a=DHCP6OptServerId(b'\x00\x02\x00\x06\x00\x02\x00\x00\x017') 3668 a.optcode == 2 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == b"" 3669 3670 3671 ############ 3672 ############ 3673 + Test DHCP6 IA Address Option (IA_TA or IA_NA suboption) 3674 3675 = DHCP6OptIAAddress - Basic Instantiation 3676 raw(DHCP6OptIAAddress()) == b'\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3677 3678 = DHCP6OptIAAddress - Basic Dissection 3679 a = DHCP6OptIAAddress(b'\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3680 a.optcode == 5 and a.optlen == 24 and a.addr == "::" and a.preflft == 0 and a. validlft == 0 and a.iaaddropts == b"" 3681 3682 = DHCP6OptIAAddress - Instantiation with specific values 3683 raw(DHCP6OptIAAddress(optlen=0x1111, addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x11\x11""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring' 3684 3685 = DHCP6OptIAAddress - Instantiation with specific values (default optlen computation) 3686 raw(DHCP6OptIAAddress(addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring' 3687 3688 = DHCP6OptIAAddress - Dissection with specific values 3689 a = DHCP6OptIAAddress(b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomerawing') 3690 a.optcode == 5 and a.optlen == 34 and a.addr == "2222:3333::5555" and a.preflft == 0x66666666 and a. validlft == 0x77777777 and a.iaaddropts == b"somerawing" 3691 3692 3693 ############ 3694 ############ 3695 + Test DHCP6 Identity Association for Non-temporary Addresses Option 3696 3697 = DHCP6OptIA_NA - Basic Instantiation 3698 raw(DHCP6OptIA_NA()) == b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3699 3700 = DHCP6OptIA_NA - Basic Dissection 3701 a = DHCP6OptIA_NA(b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3702 a.optcode == 3 and a.optlen == 12 and a.iaid == 0 and a.T1 == 0 and a.T2==0 and a.ianaopts == [] 3703 3704 = DHCP6OptIA_NA - Instantiation with specific values (keep automatic length computation) 3705 raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x00\x0c""""3333DDDD' 3706 3707 = DHCP6OptIA_NA - Instantiation with specific values (forced optlen) 3708 raw(DHCP6OptIA_NA(optlen=0x1111, iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x11\x11""""3333DDDD' 3709 3710 = DHCP6OptIA_NA - Instantiation with a list of IA Addresses (optlen automatic computation) 3711 raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444, ianaopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\x00\x03\x00D""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3712 3713 = DHCP6OptIA_NA - Dissection with specific values 3714 a = DHCP6OptIA_NA(b'\x00\x03\x00L""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3715 a.optcode == 3 and a.optlen == 76 and a.iaid == 0x22222222 and a.T1 == 0x33333333 and a.T2==0x44444444 and len(a.ianaopts) == 2 and isinstance(a.ianaopts[0], DHCP6OptIAAddress) and isinstance(a.ianaopts[1], DHCP6OptIAAddress) 3716 3717 3718 ############ 3719 ############ 3720 + Test DHCP6 Identity Association for Temporary Addresses Option 3721 3722 = DHCP6OptIA_TA - Basic Instantiation 3723 raw(DHCP6OptIA_TA()) == b'\x00\x04\x00\x04\x00\x00\x00\x00' 3724 3725 = DHCP6OptIA_TA - Basic Dissection 3726 a = DHCP6OptIA_TA(b'\x00\x04\x00\x04\x00\x00\x00\x00') 3727 a.optcode == 4 and a.optlen == 4 and a.iaid == 0 and a.iataopts == [] 3728 3729 = DHCP6OptIA_TA - Instantiation with specific values 3730 raw(DHCP6OptIA_TA(optlen=0x1111, iaid=0x22222222, iataopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3731 3732 = DHCP6OptIA_TA - Dissection with specific values 3733 a = DHCP6OptIA_TA(b'\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3734 a.optcode == 4 and a.optlen == 0x1111 and a.iaid == 0x22222222 and len(a.iataopts) == 2 and isinstance(a.iataopts[0], DHCP6OptIAAddress) and isinstance(a.iataopts[1], DHCP6OptIAAddress) 3735 3736 3737 ############ 3738 ############ 3739 + Test DHCP6 Option Request Option 3740 3741 = DHCP6OptOptReq - Basic Instantiation 3742 raw(DHCP6OptOptReq()) == b'\x00\x06\x00\x04\x00\x17\x00\x18' 3743 3744 = DHCP6OptOptReq - optlen field computation 3745 raw(DHCP6OptOptReq(reqopts=[1,2,3,4])) == b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04' 3746 3747 = DHCP6OptOptReq - instantiation with empty list 3748 raw(DHCP6OptOptReq(reqopts=[])) == b'\x00\x06\x00\x00' 3749 3750 = DHCP6OptOptReq - Basic dissection 3751 a=DHCP6OptOptReq(b'\x00\x06\x00\x00') 3752 a.optcode == 6 and a.optlen == 0 and a.reqopts == [23,24] 3753 3754 = DHCP6OptOptReq - Dissection with specific value 3755 a=DHCP6OptOptReq(b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04') 3756 a.optcode == 6 and a.optlen == 8 and a.reqopts == [1,2,3,4] 3757 3758 = DHCP6OptOptReq - repr 3759 a.show() 3760 3761 3762 ############ 3763 ############ 3764 + Test DHCP6 Option - Preference option 3765 3766 = DHCP6OptPref - Basic instantiation 3767 raw(DHCP6OptPref()) == b'\x00\x07\x00\x01\xff' 3768 3769 = DHCP6OptPref - Instantiation with specific values 3770 raw(DHCP6OptPref(optlen=0xffff, prefval= 0x11)) == b'\x00\x07\xff\xff\x11' 3771 3772 = DHCP6OptPref - Basic Dissection 3773 a=DHCP6OptPref(b'\x00\x07\x00\x01\xff') 3774 a.optcode == 7 and a.optlen == 1 and a.prefval == 255 3775 3776 = DHCP6OptPref - Dissection with specific values 3777 a=DHCP6OptPref(b'\x00\x07\xff\xff\x11') 3778 a.optcode == 7 and a.optlen == 0xffff and a.prefval == 0x11 3779 3780 3781 ############ 3782 ############ 3783 + Test DHCP6 Option - Elapsed Time 3784 3785 = DHCP6OptElapsedTime - Basic Instantiation 3786 raw(DHCP6OptElapsedTime()) == b'\x00\x08\x00\x02\x00\x00' 3787 3788 = DHCP6OptElapsedTime - Instantiation with specific elapsedtime value 3789 raw(DHCP6OptElapsedTime(elapsedtime=421)) == b'\x00\x08\x00\x02\x01\xa5' 3790 3791 = DHCP6OptElapsedTime - Basic Dissection 3792 a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x00\x00') 3793 a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 0 3794 3795 = DHCP6OptElapsedTime - Dissection with specific values 3796 a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x01\xa5') 3797 a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 421 3798 3799 = DHCP6OptElapsedTime - Repr 3800 a.show() 3801 3802 3803 ############ 3804 ############ 3805 + Test DHCP6 Option - Server Unicast Address 3806 3807 = DHCP6OptServerUnicast - Basic Instantiation 3808 raw(DHCP6OptServerUnicast()) == b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 3809 3810 = DHCP6OptServerUnicast - Instantiation with specific values (test 1) 3811 raw(DHCP6OptServerUnicast(srvaddr="2001::1")) == b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 3812 3813 = DHCP6OptServerUnicast - Instantiation with specific values (test 2) 3814 raw(DHCP6OptServerUnicast(srvaddr="2001::1", optlen=42)) == b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 3815 3816 = DHCP6OptServerUnicast - Dissection with default values 3817 a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 3818 a.optcode == 12 and a.optlen == 16 and a.srvaddr == "::" 3819 3820 = DHCP6OptServerUnicast - Dissection with specific values (test 1) 3821 a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 3822 a.optcode == 12 and a.optlen == 16 and a.srvaddr == "2001::1" 3823 3824 = DHCP6OptServerUnicast - Dissection with specific values (test 2) 3825 a=DHCP6OptServerUnicast(b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 3826 a.optcode == 12 and a.optlen == 42 and a.srvaddr == "2001::1" 3827 3828 3829 ############ 3830 ############ 3831 + Test DHCP6 Option - Status Code 3832 3833 = DHCP6OptStatusCode - Basic Instantiation 3834 raw(DHCP6OptStatusCode()) == b'\x00\r\x00\x02\x00\x00' 3835 3836 = DHCP6OptStatusCode - Instantiation with specific values 3837 raw(DHCP6OptStatusCode(optlen=42, statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00*\x00\xffHello' 3838 3839 = DHCP6OptStatusCode - Automatic Length computation 3840 raw(DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00\x07\x00\xffHello' 3841 3842 # Add tests to verify Unicode behavior 3843 3844 3845 ############ 3846 ############ 3847 + Test DHCP6 Option - Rapid Commit 3848 3849 = DHCP6OptRapidCommit - Basic Instantiation 3850 raw(DHCP6OptRapidCommit()) == b'\x00\x0e\x00\x00' 3851 3852 = DHCP6OptRapidCommit - Basic Dissection 3853 a=DHCP6OptRapidCommit(b'\x00\x0e\x00\x00') 3854 a.optcode == 14 and a.optlen == 0 3855 3856 3857 ############ 3858 ############ 3859 + Test DHCP6 Option - User class 3860 3861 = DHCP6OptUserClass - Basic Instantiation 3862 raw(DHCP6OptUserClass()) == b'\x00\x0f\x00\x00' 3863 3864 = DHCP6OptUserClass - Basic Dissection 3865 a = DHCP6OptUserClass(b'\x00\x0f\x00\x00') 3866 a.optcode == 15 and a.optlen == 0 and a.userclassdata == [] 3867 3868 = DHCP6OptUserClass - Instantiation with one user class data rawucture 3869 raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something")])) == b'\x00\x0f\x00\x0b\x00\tsomething' 3870 3871 = DHCP6OptUserClass - Dissection with one user class data rawucture 3872 a = DHCP6OptUserClass(b'\x00\x0f\x00\x0b\x00\tsomething') 3873 a.optcode == 15 and a.optlen == 11 and len(a.userclassdata) == 1 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == b'something' 3874 3875 = DHCP6OptUserClass - Instantiation with two user class data rawuctures 3876 raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something"), USER_CLASS_DATA(data="somethingelse")])) == b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse' 3877 3878 = DHCP6OptUserClass - Dissection with two user class data rawuctures 3879 a = DHCP6OptUserClass(b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse') 3880 a.optcode == 15 and a.optlen == 26 and len(a.userclassdata) == 2 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and isinstance(a.userclassdata[1], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == b'something' and a.userclassdata[1].len == 13 and a.userclassdata[1].data == b'somethingelse' 3881 3882 3883 ############ 3884 ############ 3885 + Test DHCP6 Option - Vendor class 3886 3887 = DHCP6OptVendorClass - Basic Instantiation 3888 raw(DHCP6OptVendorClass()) == b'\x00\x10\x00\x04\x00\x00\x00\x00' 3889 3890 = DHCP6OptVendorClass - Basic Dissection 3891 a = DHCP6OptVendorClass(b'\x00\x10\x00\x04\x00\x00\x00\x00') 3892 a.optcode == 16 and a.optlen == 4 and a.enterprisenum == 0 and a.vcdata == [] 3893 3894 = DHCP6OptVendorClass - Instantiation with one vendor class data rawucture 3895 raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something")])) == b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething' 3896 3897 = DHCP6OptVendorClass - Dissection with one vendor class data rawucture 3898 a = DHCP6OptVendorClass(b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething') 3899 a.optcode == 16 and a.optlen == 15 and a.enterprisenum == 0 and len(a.vcdata) == 1 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == b'something' 3900 3901 = DHCP6OptVendorClass - Instantiation with two vendor class data rawuctures 3902 raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something"), VENDOR_CLASS_DATA(data="somethingelse")])) == b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse' 3903 3904 = DHCP6OptVendorClass - Dissection with two vendor class data rawuctures 3905 a = DHCP6OptVendorClass(b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse') 3906 a.optcode == 16 and a.optlen == 30 and a.enterprisenum == 0 and len(a.vcdata) == 2 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and isinstance(a.vcdata[1], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == b'something' and a.vcdata[1].len == 13 and a.vcdata[1].data == b'somethingelse' 3907 3908 3909 ############ 3910 ############ 3911 + Test DHCP6 Option - Vendor-specific information 3912 3913 = DHCP6OptVendorSpecificInfo - Basic Instantiation 3914 raw(DHCP6OptVendorSpecificInfo()) == b'\x00\x11\x00\x04\x00\x00\x00\x00' 3915 3916 = DHCP6OptVendorSpecificInfo - Basic Dissection 3917 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x04\x00\x00\x00\x00') 3918 a.optcode == 17 and a.optlen == 4 and a.enterprisenum == 0 3919 3920 = DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option) 3921 raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something")])) == b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething' 3922 3923 = DHCP6OptVendorSpecificInfo - Dissection with with specific values (one option) 3924 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething') 3925 a.optcode == 17 and a.optlen == 17 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 1 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == b'something' 3926 3927 = DHCP6OptVendorSpecificInfo - Instantiation with specific values (two options) 3928 raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something"), VENDOR_SPECIFIC_OPTION(optcode=42, optdata="somethingelse")])) == b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse' 3929 3930 = DHCP6OptVendorSpecificInfo - Dissection with with specific values (two options) 3931 a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse') 3932 a.optcode == 17 and a.optlen == 34 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 2 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and isinstance(a.vso[1], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == b'something' and a.vso[1].optlen == 13 and a.vso[1].optdata == b'somethingelse' 3933 3934 3935 ############ 3936 ############ 3937 + Test DHCP6 Option - Interface-Id 3938 3939 = DHCP6OptIfaceId - Basic Instantiation 3940 raw(DHCP6OptIfaceId()) == b'\x00\x12\x00\x00' 3941 3942 = DHCP6OptIfaceId - Basic Dissection 3943 a = DHCP6OptIfaceId(b'\x00\x12\x00\x00') 3944 a.optcode == 18 and a.optlen == 0 3945 3946 = DHCP6OptIfaceId - Instantiation with specific value 3947 raw(DHCP6OptIfaceId(ifaceid="something")) == b'\x00\x12\x00\x09something' 3948 3949 = DHCP6OptIfaceId - Dissection with specific value 3950 a = DHCP6OptIfaceId(b'\x00\x12\x00\x09something') 3951 a.optcode == 18 and a.optlen == 9 and a.ifaceid == b"something" 3952 3953 3954 ############ 3955 ############ 3956 + Test DHCP6 Option - Reconfigure Message 3957 3958 = DHCP6OptReconfMsg - Basic Instantiation 3959 raw(DHCP6OptReconfMsg()) == b'\x00\x13\x00\x01\x0b' 3960 3961 = DHCP6OptReconfMsg - Basic Dissection 3962 a = DHCP6OptReconfMsg(b'\x00\x13\x00\x01\x0b') 3963 a.optcode == 19 and a.optlen == 1 and a.msgtype == 11 3964 3965 = DHCP6OptReconfMsg - Instantiation with specific values 3966 raw(DHCP6OptReconfMsg(optlen=4, msgtype=5)) == b'\x00\x13\x00\x04\x05' 3967 3968 = DHCP6OptReconfMsg - Dissection with specific values 3969 a = DHCP6OptReconfMsg(b'\x00\x13\x00\x04\x05') 3970 a.optcode == 19 and a.optlen == 4 and a.msgtype == 5 3971 3972 3973 ############ 3974 ############ 3975 + Test DHCP6 Option - Reconfigure Accept 3976 3977 = DHCP6OptReconfAccept - Basic Instantiation 3978 raw(DHCP6OptReconfAccept()) == b'\x00\x14\x00\x00' 3979 3980 = DHCP6OptReconfAccept - Basic Dissection 3981 a = DHCP6OptReconfAccept(b'\x00\x14\x00\x00') 3982 a.optcode == 20 and a.optlen == 0 3983 3984 = DHCP6OptReconfAccept - Instantiation with specific values 3985 raw(DHCP6OptReconfAccept(optlen=23)) == b'\x00\x14\x00\x17' 3986 3987 = DHCP6OptReconfAccept - Dssection with specific values 3988 a = DHCP6OptReconfAccept(b'\x00\x14\x00\x17') 3989 a.optcode == 20 and a.optlen == 23 3990 3991 3992 ############ 3993 ############ 3994 + Test DHCP6 Option - SIP Servers Domain Name List 3995 3996 = DHCP6OptSIPDomains - Basic Instantiation 3997 raw(DHCP6OptSIPDomains()) == b'\x00\x15\x00\x00' 3998 3999 = DHCP6OptSIPDomains - Basic Dissection 4000 a = DHCP6OptSIPDomains(b'\x00\x15\x00\x00') 4001 a.optcode == 21 and a.optlen == 0 and a.sipdomains == [] 4002 4003 = DHCP6OptSIPDomains - Instantiation with one domain 4004 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org"])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00' 4005 4006 = DHCP6OptSIPDomains - Dissection with one domain 4007 a = DHCP6OptSIPDomains(b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00') 4008 a.optcode == 21 and a.optlen == 18 and len(a.sipdomains) == 1 and a.sipdomains[0] == "toto.example.org." 4009 4010 = DHCP6OptSIPDomains - Instantiation with two domains 4011 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org", "titi.example.org"])) == b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04titi\x07example\x03org\x00' 4012 4013 = DHCP6OptSIPDomains - Dissection with two domains 4014 a = DHCP6OptSIPDomains(b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04TITI\x07example\x03org\x00') 4015 a.optcode == 21 and a.optlen == 36 and len(a.sipdomains) == 2 and a.sipdomains[0] == "toto.example.org." and a.sipdomains[1] == "TITI.example.org." 4016 4017 = DHCP6OptSIPDomains - Enforcing only one dot at end of domain 4018 raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org."])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00' 4019 4020 4021 ############ 4022 ############ 4023 + Test DHCP6 Option - SIP Servers IPv6 Address List 4024 4025 = DHCP6OptSIPServers - Basic Instantiation 4026 raw(DHCP6OptSIPServers()) == b'\x00\x16\x00\x00' 4027 4028 = DHCP6OptSIPServers - Basic Dissection 4029 a = DHCP6OptSIPServers(b'\x00\x16\x00\x00') 4030 a.optcode == 22 and a. optlen == 0 and a.sipservers == [] 4031 4032 = DHCP6OptSIPServers - Instantiation with specific values (1 address) 4033 raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1"] )) == b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4034 4035 = DHCP6OptSIPServers - Dissection with specific values (1 address) 4036 a = DHCP6OptSIPServers(b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4037 a.optcode == 22 and a.optlen == 16 and len(a.sipservers) == 1 and a.sipservers[0] == "2001:db8::1" 4038 4039 = DHCP6OptSIPServers - Instantiation with specific values (2 addresses) 4040 raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4041 4042 = DHCP6OptSIPServers - Dissection with specific values (2 addresses) 4043 a = DHCP6OptSIPServers(b'\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4044 a.optcode == 22 and a.optlen == 32 and len(a.sipservers) == 2 and a.sipservers[0] == "2001:db8::1" and a.sipservers[1] == "2001:db8::2" 4045 4046 4047 ############ 4048 ############ 4049 + Test DHCP6 Option - DNS Recursive Name Server 4050 4051 = DHCP6OptDNSServers - Basic Instantiation 4052 raw(DHCP6OptDNSServers()) == b'\x00\x17\x00\x00' 4053 4054 = DHCP6OptDNSServers - Basic Dissection 4055 a = DHCP6OptDNSServers(b'\x00\x17\x00\x00') 4056 a.optcode == 23 and a. optlen == 0 and a.dnsservers == [] 4057 4058 = DHCP6OptDNSServers - Instantiation with specific values (1 address) 4059 raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1"] )) == b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4060 4061 = DHCP6OptDNSServers - Dissection with specific values (1 address) 4062 a = DHCP6OptDNSServers(b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4063 a.optcode == 23 and a.optlen == 16 and len(a.dnsservers) == 1 and a.dnsservers[0] == "2001:db8::1" 4064 4065 = DHCP6OptDNSServers - Instantiation with specific values (2 addresses) 4066 raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4067 4068 = DHCP6OptDNSServers - Dissection with specific values (2 addresses) 4069 a = DHCP6OptDNSServers(b'\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4070 a.optcode == 23 and a.optlen == 32 and len(a.dnsservers) == 2 and a.dnsservers[0] == "2001:db8::1" and a.dnsservers[1] == "2001:db8::2" 4071 4072 4073 ############ 4074 ############ 4075 + Test DHCP6 Option - DNS Domain Search List Option 4076 4077 = DHCP6OptDNSDomains - Basic Instantiation 4078 raw(DHCP6OptDNSDomains()) == b'\x00\x18\x00\x00' 4079 4080 = DHCP6OptDNSDomains - Basic Dissection 4081 a = DHCP6OptDNSDomains(b'\x00\x18\x00\x00') 4082 a.optcode == 24 and a.optlen == 0 and a.dnsdomains == [] 4083 4084 = DHCP6OptDNSDomains - Instantiation with specific values (1 domain) 4085 raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com."])) == b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00' 4086 4087 = DHCP6OptDNSDomains - Dissection with specific values (1 domain) 4088 a = DHCP6OptDNSDomains(b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00') 4089 a.optcode == 24 and a.optlen == 18 and len(a.dnsdomains) == 1 and a.dnsdomains[0] == "toto.example.com." 4090 4091 = DHCP6OptDNSDomains - Instantiation with specific values (2 domains) 4092 raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00' 4093 4094 = DHCP6OptDNSDomains - Dissection with specific values (2 domains) 4095 a = DHCP6OptDNSDomains(b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00') 4096 a.optcode == 24 and a.optlen == 36 and len(a.dnsdomains) == 2 and a.dnsdomains[0] == "toto.example.com." and a.dnsdomains[1] == "titi.example.com." 4097 4098 4099 ############ 4100 ############ 4101 + Test DHCP6 Option - IA_PD Prefix Option 4102 4103 = DHCP6OptIAPrefix - Basic Instantiation 4104 raw(DHCP6OptIAPrefix()) == b'\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4105 4106 #TODO : finish me 4107 4108 4109 ############ 4110 ############ 4111 + Test DHCP6 Option - Identity Association for Prefix Delegation 4112 4113 = DHCP6OptIA_PD - Basic Instantiation 4114 raw(DHCP6OptIA_PD()) == b'\x00\x19\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4115 4116 #TODO : finish me 4117 4118 4119 ############ 4120 ############ 4121 + Test DHCP6 Option - NIS Servers 4122 4123 = DHCP6OptNISServers - Basic Instantiation 4124 raw(DHCP6OptNISServers()) == b'\x00\x1b\x00\x00' 4125 4126 = DHCP6OptNISServers - Basic Dissection 4127 a = DHCP6OptNISServers(b'\x00\x1b\x00\x00') 4128 a.optcode == 27 and a. optlen == 0 and a.nisservers == [] 4129 4130 = DHCP6OptNISServers - Instantiation with specific values (1 address) 4131 raw(DHCP6OptNISServers(nisservers = ["2001:db8::1"] )) == b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4132 4133 = DHCP6OptNISServers - Dissection with specific values (1 address) 4134 a = DHCP6OptNISServers(b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4135 a.optcode == 27 and a.optlen == 16 and len(a.nisservers) == 1 and a.nisservers[0] == "2001:db8::1" 4136 4137 = DHCP6OptNISServers - Instantiation with specific values (2 addresses) 4138 raw(DHCP6OptNISServers(nisservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4139 4140 = DHCP6OptNISServers - Dissection with specific values (2 addresses) 4141 a = DHCP6OptNISServers(b'\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4142 a.optcode == 27 and a.optlen == 32 and len(a.nisservers) == 2 and a.nisservers[0] == "2001:db8::1" and a.nisservers[1] == "2001:db8::2" 4143 4144 4145 ############ 4146 ############ 4147 + Test DHCP6 Option - NIS+ Servers 4148 4149 = DHCP6OptNISPServers - Basic Instantiation 4150 raw(DHCP6OptNISPServers()) == b'\x00\x1c\x00\x00' 4151 4152 = DHCP6OptNISPServers - Basic Dissection 4153 a = DHCP6OptNISPServers(b'\x00\x1c\x00\x00') 4154 a.optcode == 28 and a. optlen == 0 and a.nispservers == [] 4155 4156 = DHCP6OptNISPServers - Instantiation with specific values (1 address) 4157 raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1"] )) == b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4158 4159 = DHCP6OptNISPServers - Dissection with specific values (1 address) 4160 a = DHCP6OptNISPServers(b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4161 a.optcode == 28 and a.optlen == 16 and len(a.nispservers) == 1 and a.nispservers[0] == "2001:db8::1" 4162 4163 = DHCP6OptNISPServers - Instantiation with specific values (2 addresses) 4164 raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4165 4166 = DHCP6OptNISPServers - Dissection with specific values (2 addresses) 4167 a = DHCP6OptNISPServers(b'\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4168 a.optcode == 28 and a.optlen == 32 and len(a.nispservers) == 2 and a.nispservers[0] == "2001:db8::1" and a.nispservers[1] == "2001:db8::2" 4169 4170 4171 ############ 4172 ############ 4173 + Test DHCP6 Option - NIS Domain Name 4174 4175 = DHCP6OptNISDomain - Basic Instantiation 4176 raw(DHCP6OptNISDomain()) == b'\x00\x1d\x00\x00' 4177 4178 = DHCP6OptNISDomain - Basic Dissection 4179 a = DHCP6OptNISDomain(b'\x00\x1d\x00\x00') 4180 a.optcode == 29 and a.optlen == 0 and a.nisdomain == b"" 4181 4182 = DHCP6OptNISDomain - Instantiation with one domain name 4183 raw(DHCP6OptNISDomain(nisdomain="toto.example.org")) == b'\x00\x1d\x00\x11\x04toto\x07example\x03org' 4184 4185 = DHCP6OptNISDomain - Dissection with one domain name 4186 a = DHCP6OptNISDomain(b'\x00\x1d\x00\x11\x04toto\x07example\x03org\x00') 4187 a.optcode == 29 and a.optlen == 17 and a.nisdomain == b"toto.example.org" 4188 4189 = DHCP6OptNISDomain - Instantiation with one domain with trailing dot 4190 raw(DHCP6OptNISDomain(nisdomain="toto.example.org.")) == b'\x00\x1d\x00\x12\x04toto\x07example\x03org\x00' 4191 4192 4193 ############ 4194 ############ 4195 + Test DHCP6 Option - NIS+ Domain Name 4196 4197 = DHCP6OptNISPDomain - Basic Instantiation 4198 raw(DHCP6OptNISPDomain()) == b'\x00\x1e\x00\x00' 4199 4200 = DHCP6OptNISPDomain - Basic Dissection 4201 a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x00') 4202 a.optcode == 30 and a.optlen == 0 and a.nispdomain == b"" 4203 4204 = DHCP6OptNISPDomain - Instantiation with one domain name 4205 raw(DHCP6OptNISPDomain(nispdomain="toto.example.org")) == b'\x00\x1e\x00\x11\x04toto\x07example\x03org' 4206 4207 = DHCP6OptNISPDomain - Dissection with one domain name 4208 a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x11\x04toto\x07example\x03org\x00') 4209 a.optcode == 30 and a.optlen == 17 and a.nispdomain == b"toto.example.org" 4210 4211 = DHCP6OptNISPDomain - Instantiation with one domain with trailing dot 4212 raw(DHCP6OptNISPDomain(nispdomain="toto.example.org.")) == b'\x00\x1e\x00\x12\x04toto\x07example\x03org\x00' 4213 4214 4215 ############ 4216 ############ 4217 + Test DHCP6 Option - SNTP Servers 4218 4219 = DHCP6OptSNTPServers - Basic Instantiation 4220 raw(DHCP6OptSNTPServers()) == b'\x00\x1f\x00\x00' 4221 4222 = DHCP6OptSNTPServers - Basic Dissection 4223 a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x00') 4224 a.optcode == 31 and a. optlen == 0 and a.sntpservers == [] 4225 4226 = DHCP6OptSNTPServers - Instantiation with specific values (1 address) 4227 raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1"] )) == b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4228 4229 = DHCP6OptSNTPServers - Dissection with specific values (1 address) 4230 a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4231 a.optcode == 31 and a.optlen == 16 and len(a.sntpservers) == 1 and a.sntpservers[0] == "2001:db8::1" 4232 4233 = DHCP6OptSNTPServers - Instantiation with specific values (2 addresses) 4234 raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4235 4236 = DHCP6OptSNTPServers - Dissection with specific values (2 addresses) 4237 a = DHCP6OptSNTPServers(b'\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4238 a.optcode == 31 and a.optlen == 32 and len(a.sntpservers) == 2 and a.sntpservers[0] == "2001:db8::1" and a.sntpservers[1] == "2001:db8::2" 4239 4240 ############ 4241 ############ 4242 + Test DHCP6 Option - Information Refresh Time 4243 4244 = DHCP6OptInfoRefreshTime - Basic Instantiation 4245 raw(DHCP6OptInfoRefreshTime()) == b'\x00 \x00\x04\x00\x01Q\x80' 4246 4247 = DHCP6OptInfoRefreshTime - Basic Dissction 4248 a = DHCP6OptInfoRefreshTime(b'\x00 \x00\x04\x00\x01Q\x80') 4249 a.optcode == 32 and a.optlen == 4 and a.reftime == 86400 4250 4251 = DHCP6OptInfoRefreshTime - Instantiation with specific values 4252 raw(DHCP6OptInfoRefreshTime(optlen=7, reftime=42)) == b'\x00 \x00\x07\x00\x00\x00*' 4253 4254 ############ 4255 ############ 4256 + Test DHCP6 Option - BCMCS Servers 4257 4258 = DHCP6OptBCMCSServers - Basic Instantiation 4259 raw(DHCP6OptBCMCSServers()) == b'\x00"\x00\x00' 4260 4261 = DHCP6OptBCMCSServers - Basic Dissection 4262 a = DHCP6OptBCMCSServers(b'\x00"\x00\x00') 4263 a.optcode == 34 and a. optlen == 0 and a.bcmcsservers == [] 4264 4265 = DHCP6OptBCMCSServers - Instantiation with specific values (1 address) 4266 raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1"] )) == b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4267 4268 = DHCP6OptBCMCSServers - Dissection with specific values (1 address) 4269 a = DHCP6OptBCMCSServers(b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') 4270 a.optcode == 34 and a.optlen == 16 and len(a.bcmcsservers) == 1 and a.bcmcsservers[0] == "2001:db8::1" 4271 4272 = DHCP6OptBCMCSServers - Instantiation with specific values (2 addresses) 4273 raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 4274 4275 = DHCP6OptBCMCSServers - Dissection with specific values (2 addresses) 4276 a = DHCP6OptBCMCSServers(b'\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') 4277 a.optcode == 34 and a.optlen == 32 and len(a.bcmcsservers) == 2 and a.bcmcsservers[0] == "2001:db8::1" and a.bcmcsservers[1] == "2001:db8::2" 4278 4279 4280 ############ 4281 ############ 4282 + Test DHCP6 Option - BCMCS Domains 4283 4284 = DHCP6OptBCMCSDomains - Basic Instantiation 4285 raw(DHCP6OptBCMCSDomains()) == b'\x00!\x00\x00' 4286 4287 = DHCP6OptBCMCSDomains - Basic Dissection 4288 a = DHCP6OptBCMCSDomains(b'\x00!\x00\x00') 4289 a.optcode == 33 and a.optlen == 0 and a.bcmcsdomains == [] 4290 4291 = DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain) 4292 raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com."])) == b'\x00!\x00\x12\x04toto\x07example\x03com\x00' 4293 4294 = DHCP6OptBCMCSDomains - Dissection with specific values (1 domain) 4295 a = DHCP6OptBCMCSDomains(b'\x00!\x00\x12\x04toto\x07example\x03com\x00') 4296 a.optcode == 33 and a.optlen == 18 and len(a.bcmcsdomains) == 1 and a.bcmcsdomains[0] == "toto.example.com." 4297 4298 = DHCP6OptBCMCSDomains - Instantiation with specific values (2 domains) 4299 raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00' 4300 4301 = DHCP6OptBCMCSDomains - Dissection with specific values (2 domains) 4302 a = DHCP6OptBCMCSDomains(b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00') 4303 a.optcode == 33 and a.optlen == 36 and len(a.bcmcsdomains) == 2 and a.bcmcsdomains[0] == "toto.example.com." and a.bcmcsdomains[1] == "titi.example.com." 4304 4305 4306 ############ 4307 ############ 4308 + Test DHCP6 Option - Relay Agent Remote-ID 4309 4310 = DHCP6OptRemoteID - Basic Instantiation 4311 raw(DHCP6OptRemoteID()) == b'\x00%\x00\x04\x00\x00\x00\x00' 4312 4313 = DHCP6OptRemoteID - Basic Dissection 4314 a = DHCP6OptRemoteID(b'\x00%\x00\x04\x00\x00\x00\x00') 4315 a.optcode == 37 and a.optlen == 4 and a.enterprisenum == 0 and a.remoteid == b"" 4316 4317 = DHCP6OptRemoteID - Instantiation with specific values 4318 raw(DHCP6OptRemoteID(enterprisenum=0xeeeeeeee, remoteid="someid")) == b'\x00%\x00\n\xee\xee\xee\xeesomeid' 4319 4320 = DHCP6OptRemoteID - Dissection with specific values 4321 a = DHCP6OptRemoteID(b'\x00%\x00\n\xee\xee\xee\xeesomeid') 4322 a.optcode == 37 and a.optlen == 10 and a.enterprisenum == 0xeeeeeeee and a.remoteid == b"someid" 4323 4324 4325 ############ 4326 ############ 4327 + Test DHCP6 Option - Subscriber ID 4328 4329 = DHCP6OptSubscriberID - Basic Instantiation 4330 raw(DHCP6OptSubscriberID()) == b'\x00&\x00\x00' 4331 4332 = DHCP6OptSubscriberID - Basic Dissection 4333 a = DHCP6OptSubscriberID(b'\x00&\x00\x00') 4334 a.optcode == 38 and a.optlen == 0 and a.subscriberid == b"" 4335 4336 = DHCP6OptSubscriberID - Instantiation with specific values 4337 raw(DHCP6OptSubscriberID(subscriberid="someid")) == b'\x00&\x00\x06someid' 4338 4339 = DHCP6OptSubscriberID - Dissection with specific values 4340 a = DHCP6OptSubscriberID(b'\x00&\x00\x06someid') 4341 a.optcode == 38 and a.optlen == 6 and a.subscriberid == b"someid" 4342 4343 4344 ############ 4345 ############ 4346 + Test DHCP6 Option - Client FQDN 4347 4348 = DHCP6OptClientFQDN - Basic Instantiation 4349 raw(DHCP6OptClientFQDN()) == b"\x00'\x00\x01\x00" 4350 4351 = DHCP6OptClientFQDN - Basic Dissection 4352 a = DHCP6OptClientFQDN(b"\x00'\x00\x01\x00") 4353 a.optcode == 39 and a.optlen == 1 and a.res == 0 and a.flags == 0 and a.fqdn == b"" 4354 4355 = DHCP6OptClientFQDN - Instantiation with various flags combinations 4356 raw(DHCP6OptClientFQDN(flags="S")) == b"\x00'\x00\x01\x01" and raw(DHCP6OptClientFQDN(flags="O")) == b"\x00'\x00\x01\x02" and raw(DHCP6OptClientFQDN(flags="N")) == b"\x00'\x00\x01\x04" and raw(DHCP6OptClientFQDN(flags="SON")) == b"\x00'\x00\x01\x07" and raw(DHCP6OptClientFQDN(flags="ON")) == b"\x00'\x00\x01\x06" 4357 4358 = DHCP6OptClientFQDN - Instantiation with one fqdn 4359 raw(DHCP6OptClientFQDN(fqdn="toto.example.org")) == b"\x00'\x00\x12\x00\x04toto\x07example\x03org" 4360 4361 = DHCP6OptClientFQDN - Dissection with one fqdn 4362 a = DHCP6OptClientFQDN(b"\x00'\x00\x12\x00\x04toto\x07example\x03org\x00") 4363 a.optcode == 39 and a.optlen == 18 and a.res == 0 and a.flags == 0 and a.fqdn == b"toto.example.org" 4364 4365 4366 ############ 4367 ############ 4368 + Test DHCP6 Option Relay Agent Echo Request Option 4369 4370 = DHCP6OptRelayAgentERO - Basic Instantiation 4371 raw(DHCP6OptRelayAgentERO()) == b'\x00+\x00\x04\x00\x17\x00\x18' 4372 4373 = DHCP6OptRelayAgentERO - optlen field computation 4374 raw(DHCP6OptRelayAgentERO(reqopts=[1,2,3,4])) == b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04' 4375 4376 = DHCP6OptRelayAgentERO - instantiation with empty list 4377 raw(DHCP6OptRelayAgentERO(reqopts=[])) == b'\x00+\x00\x00' 4378 4379 = DHCP6OptRelayAgentERO - Basic dissection 4380 a=DHCP6OptRelayAgentERO(b'\x00+\x00\x00') 4381 a.optcode == 43 and a.optlen == 0 and a.reqopts == [23,24] 4382 4383 = DHCP6OptRelayAgentERO - Dissection with specific value 4384 a=DHCP6OptRelayAgentERO(b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04') 4385 a.optcode == 43 and a.optlen == 8 and a.reqopts == [1,2,3,4] 4386 4387 4388 ############ 4389 ############ 4390 + Test DHCP6 Option Client Link Layer address 4391 4392 = Basic build & dissect 4393 s = raw(DHCP6OptClientLinkLayerAddr()) 4394 assert(s == b"\x00O\x00\x07\x00\x01\x00\x00\x00\x00\x00\x00") 4395 4396 p = DHCP6OptClientLinkLayerAddr(s) 4397 assert(p.clladdr == "00:00:00:00:00:00") 4398 4399 4400 ############ 4401 ############ 4402 + Test DHCP6 Option Virtual Subnet Selection 4403 4404 = Basic build & dissect 4405 s = raw(DHCP6OptVSS()) 4406 assert(s == b"\x00D\x00\x01\xff") 4407 4408 p = DHCP6OptVSS(s) 4409 assert(p.type == 255) 4410 4411 4412 ############ 4413 ############ 4414 + Test DHCP6 Messages - DHCP6_Solicit 4415 4416 = DHCP6_Solicit - Basic Instantiation 4417 raw(DHCP6_Solicit()) == b'\x01\x00\x00\x00' 4418 4419 = DHCP6_Solicit - Basic Dissection 4420 a = DHCP6_Solicit(b'\x01\x00\x00\x00') 4421 a.msgtype == 1 and a.trid == 0 4422 4423 = DHCP6_Solicit - Basic test of DHCP6_solicit.hashret() 4424 DHCP6_Solicit().hashret() == b'\x00\x00\x00' 4425 4426 = DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values 4427 DHCP6_Solicit(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd' 4428 4429 = DHCP6_Solicit - UDP ports overload 4430 a=UDP()/DHCP6_Solicit() 4431 a.sport == 546 and a.dport == 547 4432 4433 = DHCP6_Solicit - Dispatch based on UDP port 4434 a=UDP(raw(UDP()/DHCP6_Solicit())) 4435 isinstance(a.payload, DHCP6_Solicit) 4436 4437 4438 ############ 4439 ############ 4440 + Test DHCP6 Messages - DHCP6_Advertise 4441 4442 = DHCP6_Advertise - Basic Instantiation 4443 raw(DHCP6_Advertise()) == b'\x02\x00\x00\x00' 4444 4445 = DHCP6_Advertise - Basic test of DHCP6_solicit.hashret() 4446 DHCP6_Advertise().hashret() == b'\x00\x00\x00' 4447 4448 = DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values 4449 DHCP6_Advertise(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd' 4450 4451 = DHCP6_Advertise - Basic test of answers() with solicit message 4452 a = DHCP6_Solicit() 4453 b = DHCP6_Advertise() 4454 a > b 4455 4456 = DHCP6_Advertise - Test of answers() with solicit message 4457 a = DHCP6_Solicit(trid=0xbbccdd) 4458 b = DHCP6_Advertise(trid=0xbbccdd) 4459 a > b 4460 4461 = DHCP6_Advertise - UDP ports overload 4462 a=UDP()/DHCP6_Advertise() 4463 a.sport == 547 and a.dport == 546 4464 4465 4466 ############ 4467 ############ 4468 + Test DHCP6 Messages - DHCP6_Request 4469 4470 = DHCP6_Request - Basic Instantiation 4471 raw(DHCP6_Request()) == b'\x03\x00\x00\x00' 4472 4473 = DHCP6_Request - Basic Dissection 4474 a=DHCP6_Request(b'\x03\x00\x00\x00') 4475 a.msgtype == 3 and a.trid == 0 4476 4477 = DHCP6_Request - UDP ports overload 4478 a=UDP()/DHCP6_Request() 4479 a.sport == 546 and a.dport == 547 4480 4481 4482 ############ 4483 ############ 4484 + Test DHCP6 Messages - DHCP6_Confirm 4485 4486 = DHCP6_Confirm - Basic Instantiation 4487 raw(DHCP6_Confirm()) == b'\x04\x00\x00\x00' 4488 4489 = DHCP6_Confirm - Basic Dissection 4490 a=DHCP6_Confirm(b'\x04\x00\x00\x00') 4491 a.msgtype == 4 and a.trid == 0 4492 4493 = DHCP6_Confirm - UDP ports overload 4494 a=UDP()/DHCP6_Confirm() 4495 a.sport == 546 and a.dport == 547 4496 4497 4498 ############ 4499 ############ 4500 + Test DHCP6 Messages - DHCP6_Renew 4501 4502 = DHCP6_Renew - Basic Instantiation 4503 raw(DHCP6_Renew()) == b'\x05\x00\x00\x00' 4504 4505 = DHCP6_Renew - Basic Dissection 4506 a=DHCP6_Renew(b'\x05\x00\x00\x00') 4507 a.msgtype == 5 and a.trid == 0 4508 4509 = DHCP6_Renew - UDP ports overload 4510 a=UDP()/DHCP6_Renew() 4511 a.sport == 546 and a.dport == 547 4512 4513 4514 ############ 4515 ############ 4516 + Test DHCP6 Messages - DHCP6_Rebind 4517 4518 = DHCP6_Rebind - Basic Instantiation 4519 raw(DHCP6_Rebind()) == b'\x06\x00\x00\x00' 4520 4521 = DHCP6_Rebind - Basic Dissection 4522 a=DHCP6_Rebind(b'\x06\x00\x00\x00') 4523 a.msgtype == 6 and a.trid == 0 4524 4525 = DHCP6_Rebind - UDP ports overload 4526 a=UDP()/DHCP6_Rebind() 4527 a.sport == 546 and a.dport == 547 4528 4529 4530 ############ 4531 ############ 4532 + Test DHCP6 Messages - DHCP6_Reply 4533 4534 = DHCP6_Reply - Basic Instantiation 4535 raw(DHCP6_Reply()) == b'\x07\x00\x00\x00' 4536 4537 = DHCP6_Reply - Basic Dissection 4538 a=DHCP6_Reply(b'\x07\x00\x00\x00') 4539 a.msgtype == 7 and a.trid == 0 4540 4541 = DHCP6_Reply - UDP ports overload 4542 a=UDP()/DHCP6_Reply() 4543 a.sport == 547 and a.dport == 546 4544 4545 = DHCP6_Reply - Answers 4546 4547 assert not DHCP6_Reply(trid=0).answers(DHCP6_Request(trid=1)) 4548 assert DHCP6_Reply(trid=1).answers(DHCP6_Request(trid=1)) 4549 4550 4551 ############ 4552 ############ 4553 + Test DHCP6 Messages - DHCP6_Release 4554 4555 = DHCP6_Release - Basic Instantiation 4556 raw(DHCP6_Release()) == b'\x08\x00\x00\x00' 4557 4558 = DHCP6_Release - Basic Dissection 4559 a=DHCP6_Release(b'\x08\x00\x00\x00') 4560 a.msgtype == 8 and a.trid == 0 4561 4562 = DHCP6_Release - UDP ports overload 4563 a=UDP()/DHCP6_Release() 4564 a.sport == 546 and a.dport == 547 4565 4566 4567 ############ 4568 ############ 4569 + Test DHCP6 Messages - DHCP6_Decline 4570 4571 = DHCP6_Decline - Basic Instantiation 4572 raw(DHCP6_Decline()) == b'\x09\x00\x00\x00' 4573 4574 = DHCP6_Confirm - Basic Dissection 4575 a=DHCP6_Confirm(b'\x09\x00\x00\x00') 4576 a.msgtype == 9 and a.trid == 0 4577 4578 = DHCP6_Decline - UDP ports overload 4579 a=UDP()/DHCP6_Decline() 4580 a.sport == 546 and a.dport == 547 4581 4582 4583 ############ 4584 ############ 4585 + Test DHCP6 Messages - DHCP6_Reconf 4586 4587 = DHCP6_Reconf - Basic Instantiation 4588 raw(DHCP6_Reconf()) == b'\x0A\x00\x00\x00' 4589 4590 = DHCP6_Reconf - Basic Dissection 4591 a=DHCP6_Reconf(b'\x0A\x00\x00\x00') 4592 a.msgtype == 10 and a.trid == 0 4593 4594 = DHCP6_Reconf - UDP ports overload 4595 a=UDP()/DHCP6_Reconf() 4596 a.sport == 547 and a.dport == 546 4597 4598 4599 ############ 4600 ############ 4601 + Test DHCP6 Messages - DHCP6_InfoRequest 4602 4603 = DHCP6_InfoRequest - Basic Instantiation 4604 raw(DHCP6_InfoRequest()) == b'\x0B\x00\x00\x00' 4605 4606 = DHCP6_InfoRequest - Basic Dissection 4607 a=DHCP6_InfoRequest(b'\x0B\x00\x00\x00') 4608 a.msgtype == 11 and a.trid == 0 4609 4610 = DHCP6_InfoRequest - UDP ports overload 4611 a=UDP()/DHCP6_InfoRequest() 4612 a.sport == 546 and a.dport == 547 4613 4614 4615 ############ 4616 ############ 4617 + Test DHCP6 Messages - DHCP6_RelayForward 4618 4619 = DHCP6_RelayForward - Basic Instantiation 4620 raw(DHCP6_RelayForward()) == b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4621 4622 = DHCP6_RelayForward - Basic Dissection 4623 a=DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 4624 a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::" 4625 4626 = DHCP6_RelayForward - Dissection with options 4627 a = DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x00\x01\x00\x00') 4628 a.msgtype == 12 and DHCP6OptRelayMsg in a and isinstance(a.message, DHCP6) 4629 4630 4631 ############ 4632 ############ 4633 + Test DHCP6 Messages - DHCP6OptRelayMsg 4634 4635 = DHCP6OptRelayMsg - Basic Instantiation 4636 raw(DHCP6OptRelayMsg(optcode=37)) == b'\x00%\x00\x04\x00\x00\x00\x00' 4637 4638 = DHCP6OptRelayMsg - Basic Dissection 4639 a=DHCP6OptRelayMsg(b'\x00\r\x00\x00') 4640 assert a.optcode == 13 4641 4642 = DHCP6OptRelayMsg - Embedded DHCP6 packet 4643 p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x00\x00\x00\x00') 4644 isinstance(p.message, DHCP6) 4645 4646 ############ 4647 ############ 4648 + Test DHCP6 Messages - DHCP6_RelayReply 4649 4650 = DHCP6_RelayReply - Basic Instantiation 4651 raw(DHCP6_RelayReply()) == b'\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4652 4653 = DHCP6_RelayReply - Basic Dissection 4654 a=DHCP6_RelayReply(b'\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 4655 a.msgtype == 13 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::" 4656 4657 4658 ############ 4659 ############ 4660 + Home Agent Address Discovery 4661 4662 = in6_getha() 4663 in6_getha('2001:db8::') == '2001:db8::fdff:ffff:ffff:fffe' 4664 4665 = ICMPv6HAADRequest - build/dissection 4666 p = IPv6(raw(IPv6(dst=in6_getha('2001:db8::'), src='2001:db8::1')/ICMPv6HAADRequest(id=42))) 4667 p.cksum == 0x9620 and p.dst == '2001:db8::fdff:ffff:ffff:fffe' and p.R == 1 4668 4669 = ICMPv6HAADReply - build/dissection 4670 p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::42')/ICMPv6HAADReply(id=42, addresses=['2001:db8::2', '2001:db8::3']))) 4671 p.cksum = 0x3747 and p.addresses == [ '2001:db8::2', '2001:db8::3' ] 4672 4673 = ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection 4674 a=ICMPv6HAADRequest(id=42) 4675 b=ICMPv6HAADReply(id=42) 4676 not a < b and a > b 4677 4678 4679 ############ 4680 ############ 4681 + Mobile Prefix Solicitation/Advertisement 4682 4683 = ICMPv6MPSol - build (default values) 4684 4685 s = b'`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00m\xbb\x00\x00\x00\x00' 4686 raw(IPv6()/ICMPv6MPSol()) == s 4687 4688 = ICMPv6MPSol - dissection (default values) 4689 p = IPv6(s) 4690 p[ICMPv6MPSol].type == 146 and p[ICMPv6MPSol].cksum == 0x6dbb and p[ICMPv6MPSol].id == 0 4691 4692 = ICMPv6MPSol - build 4693 s = b'`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00(\x08\x00\x08\x00\x00' 4694 raw(IPv6()/ICMPv6MPSol(cksum=0x2808, id=8)) == s 4695 4696 = ICMPv6MPSol - dissection 4697 p = IPv6(s) 4698 p[ICMPv6MPSol].cksum == 0x2808 and p[ICMPv6MPSol].id == 8 4699 4700 = ICMPv6MPAdv - build (default values) 4701 s = b'`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00\xe8\xd6\x00\x00\x80\x00\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4702 raw(IPv6()/ICMPv6MPAdv()/ICMPv6NDOptPrefixInfo()) == s 4703 4704 = ICMPv6MPAdv - dissection (default values) 4705 p = IPv6(s) 4706 p[ICMPv6MPAdv].type == 147 and p[ICMPv6MPAdv].cksum == 0xe8d6 and p[ICMPv6NDOptPrefixInfo].prefix == '::' 4707 4708 = ICMPv6MPAdv - build 4709 s = b'`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00(\x07\x00*@\x00\x03\x04\x00@\xff\xff\xff\xff\x00\x00\x00\x0c\x00\x00\x00\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4710 raw(IPv6()/ICMPv6MPAdv(cksum=0x2807, flags=1, id=42)/ICMPv6NDOptPrefixInfo(prefix='2001:db8::1', L=0, preferredlifetime=12)) == s 4711 4712 = ICMPv6MPAdv - dissection 4713 p = IPv6(s) 4714 p[ICMPv6MPAdv].cksum == 0x2807 and p[ICMPv6MPAdv].flags == 1 and p[ICMPv6MPAdv].id == 42 and p[ICMPv6NDOptPrefixInfo].prefix == '2001:db8::1' and p[ICMPv6NDOptPrefixInfo].preferredlifetime == 12 4715 4716 4717 ############ 4718 ############ 4719 + Type 2 Routing Header 4720 4721 = IPv6ExtHdrRouting - type 2 - build/dissection 4722 p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::2')/IPv6ExtHdrRouting(type=2, addresses=['2001:db8::3'])/ICMPv6EchoRequest())) 4723 p.type == 2 and len(p.addresses) == 1 and p.cksum == 0x2446 4724 4725 = IPv6ExtHdrRouting - type 2 - hashret 4726 4727 p = IPv6()/IPv6ExtHdrRouting(addresses=["2001:db8::1", "2001:db8::2"])/ICMPv6EchoRequest() 4728 p.hashret() == b" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00" 4729 4730 4731 ############ 4732 ############ 4733 + Mobility Options - Binding Refresh Advice 4734 4735 = MIP6OptBRAdvice - build (default values) 4736 s = b'\x02\x02\x00\x00' 4737 raw(MIP6OptBRAdvice()) == s 4738 4739 = MIP6OptBRAdvice - dissection (default values) 4740 p = MIP6OptBRAdvice(s) 4741 p.otype == 2 and p.olen == 2 and p.rinter == 0 4742 4743 = MIP6OptBRAdvice - build 4744 s = b'\x03*\n\xf7' 4745 raw(MIP6OptBRAdvice(otype=3, olen=42, rinter=2807)) == s 4746 4747 = MIP6OptBRAdvice - dissection 4748 p = MIP6OptBRAdvice(s) 4749 p.otype == 3 and p.olen == 42 and p.rinter == 2807 4750 4751 4752 ############ 4753 ############ 4754 + Mobility Options - Alternate Care-of Address 4755 4756 = MIP6OptAltCoA - build (default values) 4757 s = b'\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4758 raw(MIP6OptAltCoA()) == s 4759 4760 = MIP6OptAltCoA - dissection (default values) 4761 p = MIP6OptAltCoA(s) 4762 p.otype == 3 and p.olen == 16 and p.acoa == '::' 4763 4764 = MIP6OptAltCoA - build 4765 s = b'*\x08 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' 4766 raw(MIP6OptAltCoA(otype=42, olen=8, acoa='2001:db8::1')) == s 4767 4768 = MIP6OptAltCoA - dissection 4769 p = MIP6OptAltCoA(s) 4770 p.otype == 42 and p.olen == 8 and p.acoa == '2001:db8::1' 4771 4772 4773 ############ 4774 ############ 4775 + Mobility Options - Nonce Indices 4776 4777 = MIP6OptNonceIndices - build (default values) 4778 s = b'\x04\x10\x00\x00\x00\x00' 4779 raw(MIP6OptNonceIndices()) == s 4780 4781 = MIP6OptNonceIndices - dissection (default values) 4782 p = MIP6OptNonceIndices(s) 4783 p.otype == 4 and p.olen == 16 and p.hni == 0 and p.coni == 0 4784 4785 = MIP6OptNonceIndices - build 4786 s = b'\x04\x12\x00\x13\x00\x14' 4787 raw(MIP6OptNonceIndices(olen=18, hni=19, coni=20)) == s 4788 4789 = MIP6OptNonceIndices - dissection 4790 p = MIP6OptNonceIndices(s) 4791 p.hni == 19 and p.coni == 20 4792 4793 4794 ############ 4795 ############ 4796 + Mobility Options - Binding Authentication Data 4797 4798 = MIP6OptBindingAuthData - build (default values) 4799 s = b'\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4800 raw(MIP6OptBindingAuthData()) == s 4801 4802 = MIP6OptBindingAuthData - dissection (default values) 4803 p = MIP6OptBindingAuthData(s) 4804 p.otype == 5 and p.olen == 16 and p.authenticator == 0 4805 4806 = MIP6OptBindingAuthData - build 4807 s = b'\x05*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf7' 4808 raw(MIP6OptBindingAuthData(olen=42, authenticator=2807)) == s 4809 4810 = MIP6OptBindingAuthData - dissection 4811 p = MIP6OptBindingAuthData(s) 4812 p.otype == 5 and p.olen == 42 and p.authenticator == 2807 4813 4814 4815 ############ 4816 ############ 4817 + Mobility Options - Mobile Network Prefix 4818 4819 = MIP6OptMobNetPrefix - build (default values) 4820 s = b'\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4821 raw(MIP6OptMobNetPrefix()) == s 4822 4823 = MIP6OptMobNetPrefix - dissection (default values) 4824 p = MIP6OptMobNetPrefix(s) 4825 p.otype == 6 and p.olen == 18 and p.plen == 64 and p.prefix == '::' 4826 4827 = MIP6OptMobNetPrefix - build 4828 s = b'\x06*\x02 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4829 raw(MIP6OptMobNetPrefix(olen=42, reserved=2, plen=32, prefix='2001:db8::')) == s 4830 4831 = MIP6OptMobNetPrefix - dissection 4832 p = MIP6OptMobNetPrefix(s) 4833 p.olen == 42 and p.reserved == 2 and p.plen == 32 and p.prefix == '2001:db8::' 4834 4835 4836 ############ 4837 ############ 4838 + Mobility Options - Link-Layer Address (MH-LLA) 4839 4840 = MIP6OptLLAddr - basic build 4841 raw(MIP6OptLLAddr()) == b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00' 4842 4843 = MIP6OptLLAddr - basic dissection 4844 p = MIP6OptLLAddr(b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00') 4845 p.otype == 7 and p.olen == 7 and p.ocode == 2 and p.pad == 0 and p.lla == "00:00:00:00:00:00" 4846 4847 = MIP6OptLLAddr - build with specific values 4848 raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) == b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee' 4849 4850 = MIP6OptLLAddr - dissection with specific values 4851 p = MIP6OptLLAddr(b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee') 4852 4853 raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) 4854 p.otype == 7 and p.olen == 42 and p.ocode == 4 and p.pad == 0xff and p.lla == "ee:ee:ee:ee:ee:ee" 4855 4856 4857 ############ 4858 ############ 4859 + Mobility Options - Mobile Node Identifier 4860 4861 = MIP6OptMNID - basic build 4862 raw(MIP6OptMNID()) == b'\x08\x01\x01' 4863 4864 = MIP6OptMNID - basic dissection 4865 p = MIP6OptMNID(b'\x08\x01\x01') 4866 p.otype == 8 and p.olen == 1 and p.subtype == 1 and p.id == b"" 4867 4868 = MIP6OptMNID - build with specific values 4869 raw(MIP6OptMNID(subtype=42, id="someid")) == b'\x08\x07*someid' 4870 4871 = MIP6OptMNID - dissection with specific values 4872 p = MIP6OptMNID(b'\x08\x07*someid') 4873 p.otype == 8 and p.olen == 7 and p.subtype == 42 and p.id == b"someid" 4874 4875 4876 4877 ############ 4878 ############ 4879 + Mobility Options - Message Authentication 4880 4881 = MIP6OptMsgAuth - basic build 4882 raw(MIP6OptMsgAuth()) == b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 4883 4884 = MIP6OptMsgAuth - basic dissection 4885 p = MIP6OptMsgAuth(b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA') 4886 p.otype == 9 and p.olen == 17 and p.subtype == 1 and p.mspi == 0 and p.authdata == b"A"*12 4887 4888 = MIP6OptMsgAuth - build with specific values 4889 raw(MIP6OptMsgAuth(authdata="B"*16, mspi=0xeeeeeeee, subtype=0xff)) == b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB' 4890 4891 = MIP6OptMsgAuth - dissection with specific values 4892 p = MIP6OptMsgAuth(b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB') 4893 p.otype == 9 and p.olen == 21 and p.subtype == 255 and p.mspi == 0xeeeeeeee and p.authdata == b"B"*16 4894 4895 4896 ############ 4897 ############ 4898 + Mobility Options - Replay Protection 4899 4900 = MIP6OptReplayProtection - basic build 4901 raw(MIP6OptReplayProtection()) == b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00' 4902 4903 = MIP6OptReplayProtection - basic dissection 4904 p = MIP6OptReplayProtection(b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00') 4905 p.otype == 10 and p.olen == 8 and p.timestamp == 0 4906 4907 = MIP6OptReplayProtection - build with specific values 4908 s = raw(MIP6OptReplayProtection(olen=42, timestamp=(72*31536000)<<32)) 4909 s == b'\n*\x87V|\x00\x00\x00\x00\x00' 4910 4911 = MIP6OptReplayProtection - dissection with specific values 4912 p = MIP6OptReplayProtection(s) 4913 p.otype == 10 and p.olen == 42 and p.timestamp == 9752118382559232000 4914 p.fields_desc[-1].i2repr("", p.timestamp) == 'Mon, 13 Dec 1971 23:50:39 +0000 (9752118382559232000)' 4915 4916 4917 ############ 4918 ############ 4919 + Mobility Options - CGA Parameters 4920 = MIP6OptCGAParams 4921 4922 4923 ############ 4924 ############ 4925 + Mobility Options - Signature 4926 = MIP6OptSignature 4927 4928 4929 ############ 4930 ############ 4931 + Mobility Options - Permanent Home Keygen Token 4932 = MIP6OptHomeKeygenToken 4933 4934 4935 ############ 4936 ############ 4937 + Mobility Options - Care-of Test Init 4938 = MIP6OptCareOfTestInit 4939 4940 4941 ############ 4942 ############ 4943 + Mobility Options - Care-of Test 4944 = MIP6OptCareOfTest 4945 4946 4947 ############ 4948 ############ 4949 + Mobility Options - Automatic Padding - MIP6OptBRAdvice 4950 = Mobility Options - Automatic Padding - MIP6OptBRAdvice 4951 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBRAdvice()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x02\x02\x00\x00' 4952 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00' 4953 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00' 4954 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00' 4955 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00' 4956 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00' 4957 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00' 4958 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00' 4959 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00' 4960 a and b and c and d and e and g and h and i and j 4961 4962 ############ 4963 ############ 4964 + Mobility Options - Automatic Padding - MIP6OptAltCoA 4965 = Mobility Options - Automatic Padding - MIP6OptAltCoA 4966 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4967 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4968 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4969 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x05\x00\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4970 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x04\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4971 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x03\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4972 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4973 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4974 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4975 a and b and c and d and e and g and h and i and j 4976 4977 4978 ############ 4979 ############ 4980 + Mobility Options - Automatic Padding - MIP6OptNonceIndices 4981 = Mobility Options - Automatic Padding - MIP6OptNonceIndices 4982 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' 4983 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00' 4984 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00' 4985 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00' 4986 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00' 4987 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00' 4988 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00' 4989 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptNonceIndices()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' 4990 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptNonceIndices()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' 4991 a and b and c and d and e and g and h and i and j 4992 4993 4994 ############ 4995 ############ 4996 + Mobility Options - Automatic Padding - MIP6OptBindingAuthData 4997 = Mobility Options - Automatic Padding - MIP6OptBindingAuthData 4998 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 4999 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5000 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5001 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5002 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5003 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5004 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5005 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBindingAuthData()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5006 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBindingAuthData()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5007 a and b and c and d and e and g and h and i and j 5008 5009 5010 ############ 5011 ############ 5012 + Mobility Options - Automatic Padding - MIP6OptMobNetPrefix 5013 = Mobility Options - Automatic Padding - MIP6OptMobNetPrefix 5014 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMobNetPrefix()])) == b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5015 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x05\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5016 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x04\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5017 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x03\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5018 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5019 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5020 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5021 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5022 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5023 a and b and c and d and e and g and h and i and j 5024 5025 5026 ############ 5027 ############ 5028 + Mobility Options - Automatic Padding - MIP6OptLLAddr 5029 = Mobility Options - Automatic Padding - MIP6OptLLAddr 5030 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00' 5031 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00' 5032 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00' 5033 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00' 5034 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' 5035 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00' 5036 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5037 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00' 5038 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00' 5039 a and b and c and d and e and g and h and i and j 5040 5041 5042 ############ 5043 ############ 5044 + Mobility Options - Automatic Padding - MIP6OptMNID 5045 = Mobility Options - Automatic Padding - MIP6OptMNID 5046 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMNID()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x08\x01\x01\x00' 5047 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMNID()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x08\x01\x01' 5048 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x08\x01\x01\x01\x05\x00\x00\x00\x00\x00' 5049 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x08\x01\x01\x01\x04\x00\x00\x00\x00' 5050 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x08\x01\x01\x01\x03\x00\x00\x00' 5051 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x08\x01\x01\x01\x02\x00\x00' 5052 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x08\x01\x01\x01\x01\x00' 5053 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x08\x01\x01\x01\x00' 5054 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x08\x01\x01\x00' 5055 a and b and c and d and e and g and h and i and j 5056 5057 5058 ############ 5059 ############ 5060 + Mobility Options - Automatic Padding - MIP6OptMsgAuth 5061 = Mobility Options - Automatic Padding - MIP6OptMsgAuth 5062 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMsgAuth()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 5063 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMsgAuth()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 5064 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' 5065 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' 5066 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' 5067 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' 5068 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 5069 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 5070 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' 5071 a and b and c and d and e and g and h and i and j 5072 5073 5074 ############ 5075 ############ 5076 + Mobility Options - Automatic Padding - MIP6OptReplayProtection 5077 = Mobility Options - Automatic Padding - MIP6OptReplayProtection 5078 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5079 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5080 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5081 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5082 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5083 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5084 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5085 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptReplayProtection()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5086 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptReplayProtection()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5087 a and b and c and d and e and g and h and i and j 5088 5089 5090 ############ 5091 ############ 5092 + Mobility Options - Automatic Padding - MIP6OptCGAParamsReq 5093 = Mobility Options - Automatic Padding - MIP6OptCGAParamsReq 5094 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0b\x00\x01\x00' 5095 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0b\x00\x00' 5096 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0b\x00' 5097 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0b\x00\x01\x05\x00\x00\x00\x00\x00' 5098 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0b\x00\x01\x04\x00\x00\x00\x00' 5099 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0b\x00\x01\x03\x00\x00\x00' 5100 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0b\x00\x01\x02\x00\x00' 5101 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0b\x00\x01\x01\x00' 5102 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0b\x00\x01\x00' 5103 a and b and c and d and e and g and h and i and j 5104 5105 5106 ############ 5107 ############ 5108 + Mobility Options - Automatic Padding - MIP6OptCGAParams 5109 = Mobility Options - Automatic Padding - MIP6OptCGAParams 5110 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0c\x00\x01\x00' 5111 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0c\x00\x00' 5112 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0c\x00' 5113 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0c\x00\x01\x05\x00\x00\x00\x00\x00' 5114 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0c\x00\x01\x04\x00\x00\x00\x00' 5115 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0c\x00\x01\x03\x00\x00\x00' 5116 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0c\x00\x01\x02\x00\x00' 5117 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0c\x00\x01\x01\x00' 5118 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0c\x00\x01\x00' 5119 a and b and c and d and e and g and h and i and j 5120 5121 5122 ############ 5123 ############ 5124 + Mobility Options - Automatic Padding - MIP6OptSignature 5125 = Mobility Options - Automatic Padding - MIP6OptSignature 5126 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\r\x00\x01\x00' 5127 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\r\x00\x00' 5128 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\r\x00' 5129 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\r\x00\x01\x05\x00\x00\x00\x00\x00' 5130 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\r\x00\x01\x04\x00\x00\x00\x00' 5131 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\r\x00\x01\x03\x00\x00\x00' 5132 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\r\x00\x01\x02\x00\x00' 5133 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\r\x00\x01\x01\x00' 5134 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\r\x00\x01\x00' 5135 a and b and c and d and e and g and h and i and j 5136 5137 5138 ############ 5139 ############ 5140 + Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken 5141 = Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken 5142 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0e\x00\x01\x00' 5143 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0e\x00\x00' 5144 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0e\x00' 5145 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0e\x00\x01\x05\x00\x00\x00\x00\x00' 5146 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0e\x00\x01\x04\x00\x00\x00\x00' 5147 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0e\x00\x01\x03\x00\x00\x00' 5148 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0e\x00\x01\x02\x00\x00' 5149 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0e\x00\x01\x01\x00' 5150 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0e\x00\x01\x00' 5151 a and b and c and d and e and g and h and i and j 5152 5153 5154 ############ 5155 ############ 5156 + Mobility Options - Automatic Padding - MIP6OptCareOfTestInit 5157 = Mobility Options - Automatic Padding - MIP6OptCareOfTestInit 5158 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0f\x00\x01\x00' 5159 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0f\x00\x00' 5160 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0f\x00' 5161 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0f\x00\x01\x05\x00\x00\x00\x00\x00' 5162 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0f\x00\x01\x04\x00\x00\x00\x00' 5163 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0f\x00\x01\x03\x00\x00\x00' 5164 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0f\x00\x01\x02\x00\x00' 5165 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0f\x00\x01\x01\x00' 5166 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0f\x00\x01\x00' 5167 a and b and c and d and e and g and h and i and j 5168 5169 5170 ############ 5171 ############ 5172 + Mobility Options - Automatic Padding - MIP6OptCareOfTest 5173 = Mobility Options - Automatic Padding - MIP6OptCareOfTest 5174 a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00' 5175 b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5176 c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00' 5177 d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00' 5178 e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' 5179 g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00' 5180 h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' 5181 i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00' 5182 j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00' 5183 a and b and c and d and e and g and h and i and j 5184 5185 5186 ############ 5187 ############ 5188 + Binding Refresh Request Message 5189 = MIP6MH_BRR - Build (default values) 5190 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR()) == b'`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00' 5191 5192 = MIP6MH_BRR - Build with specific values 5193 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR(nh=0xff, res=0xee, res2=0xaaaa, options=[MIP6OptLLAddr(), MIP6OptAltCoA()])) == b'`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5194 5195 = MIP6MH_BRR - Basic dissection 5196 a=IPv6(b'`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00') 5197 b=a.payload 5198 a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 59 and b.len == 0 and b.mhtype == 0 and b.res == 0 and b.cksum == 0x68fb and b.res2 == 0 and b.options == [] 5199 5200 = MIP6MH_BRR - Dissection with specific values 5201 a=IPv6(b'`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5202 b=a.payload 5203 a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 0xff and b.len == 4 and b.mhtype == 0 and b.res == 238 and b.cksum == 0xec24 and b.res2 == 43690 and len(b.options) == 3 and isinstance(b.options[0], MIP6OptLLAddr) and isinstance(b.options[1], PadN) and isinstance(b.options[2], MIP6OptAltCoA) 5204 5205 = MIP6MH_BRR / MIP6MH_BU / MIP6MH_BA hashret() and answers() 5206 hoa="2001:db8:9999::1" 5207 coa="2001:db8:7777::1" 5208 cn="2001:db8:8888::1" 5209 ha="2001db8:6666::1" 5210 a=IPv6(raw(IPv6(src=cn, dst=hoa)/MIP6MH_BRR())) 5211 b=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=0x01))) 5212 b2=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=~0x01))) 5213 c=IPv6(raw(IPv6(src=cn, dst=coa)/IPv6ExtHdrRouting(type=2, addresses=[hoa])/MIP6MH_BA())) 5214 b.answers(a) and not a.answers(b) and c.answers(b) and not b.answers(c) and not c.answers(b2) 5215 5216 len(b[IPv6ExtHdrDestOpt].options) == 2 5217 5218 5219 ############ 5220 ############ 5221 + Home Test Init Message 5222 5223 = MIP6MH_HoTI - Build (default values) 5224 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI()) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5225 5226 = MIP6MH_HoTI - Dissection (default values) 5227 a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5228 b = a.payload 5229 a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len== 1 and b.res == 0 and b.cksum == 0x67f2 and b.cookie == b'\x00'*8 5230 5231 5232 = MIP6MH_HoTI - Build (specific values) 5233 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' 5234 5235 = MIP6MH_HoTI - Dissection (specific values) 5236 a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa') 5237 b=a.payload 5238 a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8 5239 5240 5241 ############ 5242 ############ 5243 + Care-of Test Init Message 5244 5245 = MIP6MH_CoTI - Build (default values) 5246 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI()) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5247 5248 = MIP6MH_CoTI - Dissection (default values) 5249 a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5250 b = a.payload 5251 a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len== 1 and b.res == 0 and b.cksum == 0x66f2 and b.cookie == b'\x00'*8 5252 5253 = MIP6MH_CoTI - Build (specific values) 5254 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' 5255 5256 = MIP6MH_CoTI - Dissection (specific values) 5257 a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa') 5258 b=a.payload 5259 a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8 5260 5261 5262 ############ 5263 ############ 5264 + Home Test Message 5265 5266 = MIP6MH_HoT - Build (default values) 5267 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT()) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5268 5269 = MIP6MH_HoT - Dissection (default values) 5270 a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5271 b = a.payload 5272 a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0 and b.cksum == 0x65e9 and b.index == 0 and b.cookie == b'\x00'*8 and b.token == b'\x00'*8 5273 5274 = MIP6MH_HoT - Build (specific values) 5275 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' 5276 5277 = MIP6MH_HoT - Dissection (specific values) 5278 a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc') 5279 b = a.payload 5280 a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == b'\xAA'*8 and b.token == b'\xCC'*8 5281 5282 = MIP6MH_HoT answers 5283 a1, a2 = "2001:db8::1", "2001:db8::2" 5284 cookie = RandString(8)._fix() 5285 p1 = IPv6(src=a1, dst=a2)/MIP6MH_HoTI(cookie=cookie) 5286 p2 = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie=cookie) 5287 p2_ko = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie="".join(chr((orb(b'\xff') + 1) % 256))) 5288 assert p1.hashret() == p2.hashret() and p2.answers(p1) and not p1.answers(p2) 5289 assert p1.hashret() != p2_ko.hashret() and not p2_ko.answers(p1) and not p1.answers(p2_ko) 5290 5291 5292 ############ 5293 ############ 5294 + Care-of Test Message 5295 5296 = MIP6MH_CoT - Build (default values) 5297 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT()) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5298 5299 = MIP6MH_CoT - Dissection (default values) 5300 a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5301 b = a.payload 5302 a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0 and b.cksum == 0x64e9 and b.index == 0 and b.cookie == b'\x00'*8 and b.token == b'\x00'*8 5303 5304 = MIP6MH_CoT - Build (specific values) 5305 raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' 5306 5307 = MIP6MH_CoT - Dissection (specific values) 5308 a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc') 5309 b = a.payload 5310 a.nh == 135 and isinstance(b, MIP6MH_CoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == b'\xAA'*8 and b.token == b'\xCC'*8 5311 5312 5313 ############ 5314 ############ 5315 + Binding Update Message 5316 5317 = MIP6MH_BU - build (default values) 5318 s= b'`\x00\x00\x00\x00(<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x01\x05\x00\xee`\x00\x00\xd0\x00\x00\x03\x01\x02\x00\x00' 5319 raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO()])/MIP6MH_BU()) == s 5320 5321 = MIP6MH_BU - dissection (default values) 5322 p = IPv6(s) 5323 p[MIP6MH_BU].len == 1 5324 5325 = MIP6MH_BU - build 5326 s = b'`\x00\x00\x00\x00P<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe;\x06\x05\x00\xea\xf2\x00\x00\xd0\x00\x00*\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5327 raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO(hoa='2001:db8::cafe')])/MIP6MH_BU(mhtime=42, options=[MIP6OptAltCoA(),MIP6OptMobNetPrefix()])) == s 5328 5329 = MIP6MH_BU - dissection 5330 p = IPv6(s) 5331 p[MIP6MH_BU].cksum == 0xeaf2 and p[MIP6MH_BU].len == 6 and len(p[MIP6MH_BU].options) == 4 and p[MIP6MH_BU].mhtime == 42 5332 5333 5334 ############ 5335 ############ 5336 + Binding ACK Message 5337 5338 = MIP6MH_BA - build 5339 s = b'`\x00\x00\x00\x00\x10\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x01\x06\x00\xbc\xb9\x00\x80\x00\x00\x00*\x01\x02\x00\x00' 5340 raw(IPv6()/MIP6MH_BA(mhtime=42)) == s 5341 5342 = MIP6MH_BA - dissection 5343 p = IPv6(s) 5344 p[MIP6MH_BA].cksum == 0xbcb9 and p[MIP6MH_BA].len == 1 and len(p[MIP6MH_BA].options) == 1 and p[MIP6MH_BA].mhtime == 42 5345 5346 5347 ############ 5348 ############ 5349 + Binding ERR Message 5350 5351 = MIP6MH_BE - build 5352 s = b'`\x00\x00\x00\x00\x18\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x02\x07\x00\xbbY\x02\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' 5353 raw(IPv6()/MIP6MH_BE(status=2, ha='1::2')) == s 5354 5355 = MIP6MH_BE - dissection 5356 p = IPv6(s) 5357 p[MIP6MH_BE].cksum=0xba10 and p[MIP6MH_BE].len == 1 and len(p[MIP6MH_BE].options) == 1 5358 5359 5360 ############ 5361 ############ 5362 + Netflow v5 5363 5364 = NetflowHeaderV5 - basic building 5365 5366 raw(NetflowHeader()/NetflowHeaderV5()) == b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5367 5368 raw(NetflowHeaderV5(engineID=42)) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x00\x00' 5369 5370 raw(NetflowRecordV5(dst="192.168.0.1")) == b'\x7f\x00\x00\x01\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5371 5372 raw(NetflowHeader()/NetflowHeaderV5(count=1)/NetflowRecordV5(dst="192.168.0.1")) == b'\x00\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00' 5373 5374 5375 = NetflowHeaderV5 - basic dissection 5376 5377 nf5 = NetflowHeader(b'\x00\x05\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5378 nf5.version == 5 and nf5[NetflowHeaderV5].count == 2 and isinstance(nf5[NetflowRecordV5].payload, NetflowRecordV5) 5379 5380 ############ 5381 ############ 5382 + Netflow v9 5383 5384 = NetflowHeaderV9 - advanced building 5385 5386 import time 5387 5388 pkt = NetflowHeader()/\ 5389 NetflowHeaderV9(unixSecs=int(time.time()))/\ 5390 NetflowFlowsetV9(templates=[ 5391 NetflowTemplateV9(templateID=258, template_fields=[ 5392 NetflowTemplateFieldV9(fieldType=1), 5393 NetflowTemplateFieldV9(fieldType=62), 5394 ]), 5395 NetflowTemplateV9(templateID=257, template_fields=[ 5396 NetflowTemplateFieldV9(fieldType=1), 5397 NetflowTemplateFieldV9(fieldType=62), 5398 ]), 5399 ])/NetflowDataflowsetV9(templateID=258, records=[ 5400 NetflowRecordV9(fieldValue=b"\x01\x02\x03\x05"), 5401 NetflowRecordV9(fieldValue=b"\x05\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"), 5402 ])/NetflowDataflowsetV9(templateID=257, records=[ 5403 NetflowRecordV9(fieldValue=b"\x01\x02\x03\x04"), 5404 NetflowRecordV9(fieldValue=b"\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01"), 5405 ])/NetflowOptionsFlowsetV9(templateID=256, scopes=[NetflowOptionsFlowsetScopeV9(scopeFieldType=1, scopeFieldlength=4), 5406 NetflowOptionsFlowsetScopeV9(scopeFieldType=1, scopeFieldlength=3)], 5407 options=[NetflowOptionsFlowsetOptionV9(optionFieldType=1, optionFieldlength=2), 5408 NetflowOptionsFlowsetOptionV9(optionFieldType=1, optionFieldlength=1)])/\ 5409 NetflowOptionsDataRecordV9(templateID=256, records=[NetflowOptionsRecordScopeV9(fieldValue=b"\x01\x02\x03\x04"), 5410 NetflowOptionsRecordScopeV9(fieldValue=b"\x01\x02\x03"), 5411 NetflowOptionsRecordOptionV9(fieldValue=b"\x01\x02"), 5412 NetflowOptionsRecordOptionV9(fieldValue=b"\x01")]) 5413 5414 assert pkt[NetflowFlowsetV9].templates[0].template_fields[0].fieldLength == 4 5415 assert pkt[NetflowFlowsetV9].templates[0].template_fields[1].fieldLength == 16 5416 5417 = NetflowHeaderV9 - advanced dissection 5418 5419 d = NetflowHeader(raw(pkt)) 5420 d.show() 5421 assert len(d[NetflowDataflowsetV9].records) == 2 5422 assert d.getlayer(NetflowDataflowsetV9, templateID=257).records[0].fieldValue == b"\x01\x02\x03\x04" 5423 assert d.getlayer(NetflowDataflowsetV9, templateID=257).records[1].fieldValue == b"\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01" 5424 5425 assert d.getlayer(NetflowDataflowsetV9, templateID=258).records[0].fieldValue == b"\x01\x02\x03\x05" 5426 assert d.getlayer(NetflowDataflowsetV9, templateID=258).records[1].fieldValue == b"\x05\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01\x04\x03\x02\x01" 5427 5428 assert d[NetflowOptionsFlowsetV9].scopes[0].scopeFieldType == 1 5429 assert d[NetflowOptionsDataRecordV9].records[1].fieldValue == b"\x01\x02\x03" 5430 assert d[NetflowOptionsDataRecordV9].records[3].fieldValue == b"\x01" 5431 5432 ############ 5433 ############ 5434 + pcap / pcapng format support 5435 5436 = Variable creations 5437 from io import BytesIO 5438 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') 5439 pcapngfile = BytesIO(b'\n\r\r\n\\\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00,\x00File created by merging: \nFile1: test.pcap \n\x04\x00\x08\x00mergecap\x00\x00\x00\x00\\\x00\x00\x00\x01\x00\x00\x00\\\x00\x00\x00e\x00\x00\x00\xff\xff\x00\x00\x02\x006\x00Unknown/not available in original file format(libpcap)\x00\x00\t\x00\x01\x00\x06\x00\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x06\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00/\xfc[\xcd(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00H\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\x1f\xff[\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r<\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\xb9\x02\\\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00<\x00\x00\x00') 5440 pcapnanofile = BytesIO(b"M<\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacV\xc9\xc1\xb5'(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV-;\xc1'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\x9aL\xcf'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00") 5441 5442 = Read a pcap file 5443 pktpcap = rdpcap(pcapfile) 5444 5445 = Read a pcapng file 5446 pktpcapng = rdpcap(pcapngfile) 5447 5448 = Read a pcap file with nanosecond precision 5449 pktpcapnano = rdpcap(pcapnanofile) 5450 5451 = Check all packet lists are the same 5452 assert list(pktpcap) == list(pktpcapng) == list(pktpcapnano) 5453 assert [p.time for p in pktpcap] == [p.time for p in pktpcapng] == [p.time for p in pktpcapnano] 5454 5455 = Check packets from pcap file 5456 assert all(IP in pkt for pkt in pktpcap) 5457 assert all(any(proto in pkt for pkt in pktpcap) for proto in [ICMP, UDP, TCP]) 5458 5459 = Check wrpcap() 5460 import os, tempfile 5461 fdesc, filename = tempfile.mkstemp() 5462 fdesc = os.fdopen(fdesc, "wb") 5463 wrpcap(fdesc, pktpcap) 5464 fdesc.close() 5465 5466 = Check offline sniff() (by filename) 5467 assert list(pktpcap) == list(sniff(offline=filename)) 5468 5469 = Check offline sniff() (by file object) 5470 fdesc = open(filename, "rb") 5471 assert list(pktpcap) == list(sniff(offline=fdesc)) 5472 fdesc.close() 5473 5474 = Check offline sniff() with a filter (by filename) 5475 ~ tcpdump 5476 pktpcap_flt = [(proto, sniff(offline=filename, filter=proto.__name__.lower())) 5477 for proto in [ICMP, UDP, TCP]] 5478 assert all(list(pktpcap[proto]) == list(packets) for proto, packets in pktpcap_flt) 5479 5480 = Check offline sniff() with a filter (by file object) 5481 ~ tcpdump 5482 fdesc = open(filename, "rb") 5483 pktpcap_tcp = sniff(offline=fdesc, filter="tcp") 5484 fdesc.close() 5485 assert list(pktpcap[TCP]) == list(pktpcap_tcp) 5486 os.unlink(filename) 5487 5488 = Check wrpcap(nano=True) 5489 fdesc, filename = tempfile.mkstemp() 5490 fdesc = os.fdopen(fdesc, "wb") 5491 pktpcapnano[0].time += 0.000000001 5492 wrpcap(fdesc, pktpcapnano, nano=True) 5493 fdesc.close() 5494 pktpcapnanoread = rdpcap(filename) 5495 assert pktpcapnanoread[0].time == pktpcapnano[0].time 5496 assert pktpcapnanoread[0].time == pktpcap[0].time + 0.000000001 5497 os.unlink(filename) 5498 5499 = Check PcapNg with nanosecond precision using obsolete packet block 5500 * first packet from capture file icmp2.ntar -- https://wiki.wireshark.org/Development/PcapNg?action=AttachFile&do=view&target=icmp2.ntar 5501 pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00e\x14\x00\x00)4\'ON\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00n\x00\x00\x00') 5502 pktpcapng = rdpcap(pcapngfile) 5503 assert len(pktpcapng) == 1 5504 pkt = pktpcapng[0] 5505 # weird, but wireshark agrees 5506 assert pkt.time == 22425.352221737 5507 assert isinstance(pkt, Ether) 5508 pkt = pkt.payload 5509 assert isinstance(pkt, IP) 5510 pkt = pkt.payload 5511 assert isinstance(pkt, ICMP) 5512 pkt = pkt.payload 5513 assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi' 5514 pkt = pkt.payload 5515 assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6' 5516 pkt = pkt.payload 5517 assert isinstance(pkt, NoPayload) 5518 5519 = Check PcapNg using Simple Packet Block 5520 * previous file with the (obsolete) packet block replaced by a Simple Packet Block 5521 pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x03\x00\x00\x00`\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00`\x00\x00\x00') 5522 pktpcapng = rdpcap(pcapngfile) 5523 assert len(pktpcapng) == 1 5524 pkt = pktpcapng[0] 5525 assert isinstance(pkt, Ether) 5526 pkt = pkt.payload 5527 assert isinstance(pkt, IP) 5528 pkt = pkt.payload 5529 assert isinstance(pkt, ICMP) 5530 pkt = pkt.payload 5531 assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi' 5532 pkt = pkt.payload 5533 assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6' 5534 pkt = pkt.payload 5535 assert isinstance(pkt, NoPayload) 5536 5537 = Check tcpdump() 5538 ~ tcpdump 5539 * No very specific tests because we do not want to depend on tcpdump output 5540 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') 5541 data = tcpdump(pcapfile, dump=True, args=['-n']).split(b'\n') 5542 print(data) 5543 assert b'IP 127.0.0.1.20 > 127.0.0.1.80:' in data[0] 5544 assert b'IP 127.0.0.1.53 > 127.0.0.1.53:' in data[1] 5545 assert b'IP 127.0.0.1 > 127.0.0.1:' in data[2] 5546 5547 = Check tcpdump() command with tshark 5548 ~ tshark 5549 pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') 5550 values = [tuple(int(val) for val in line[:-1].split(b'\t')) for line in tcpdump(pcapfile, prog=conf.prog.tshark, getfd=True, args=['-T', 'fields', '-e', 'ip.ttl', '-e', 'ip.proto'])] 5551 assert values == [(64, 6), (64, 17), (64, 1)] 5552 5553 = Run scapy's tshark command 5554 ~ netaccess 5555 tshark(count=1, timeout=3) 5556 5557 = Check Raw IP pcap files 5558 5559 import tempfile 5560 filename = tempfile.mktemp(suffix=".pcap") 5561 wrpcap(filename, [IP()/UDP(), IPv6()/UDP()], linktype=DLT_RAW) 5562 packets = rdpcap(filename) 5563 assert(isinstance(packets[0], IP) and isinstance(packets[1], IPv6)) 5564 5565 ############ 5566 ############ 5567 + LLMNR protocol 5568 5569 = Simple packet dissection 5570 pkt = Ether(b'\x11\x11\x11\x11\x11\x11\x99\x99\x99\x99\x99\x99\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5571 assert pkt.sport == 5355 5572 assert pkt.dport == 5355 5573 assert pkt[LLMNRQuery].opcode == 0 5574 5575 = Packet build / dissection 5576 pkt = UDP(raw(UDP()/LLMNRResponse())) 5577 assert LLMNRResponse in pkt 5578 assert pkt.qr == 1 5579 assert pkt.c == 0 5580 assert pkt.tc == 0 5581 assert pkt.z == 0 5582 assert pkt.rcode == 0 5583 assert pkt.qdcount == 0 5584 assert pkt.arcount == 0 5585 assert pkt.nscount == 0 5586 assert pkt.ancount == 0 5587 5588 = Answers - building 5589 a = UDP()/LLMNRResponse(id=12) 5590 b = UDP()/LLMNRQuery(id=12) 5591 assert a.answers(b) 5592 assert not b.answers(a) 5593 assert b.hashret() == b'\x00\x0c' 5594 5595 = Answers - dissecting 5596 a = Ether(b'\xd0P\x99V\xdd\xf9\x14\x0cv\x8f\xfe(\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\x7f\x00\x00\x01\xc0\xa8\x00w\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5597 b = Ether(b'\x14\x0cv\x8f\xfe(\xd0P\x99V\xdd\xf9\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x15\xcf\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00') 5598 assert b.answers(a) 5599 assert not a.answers(b) 5600 5601 ############ 5602 ############ 5603 + LLTD protocol 5604 5605 = Simple packet dissection 5606 pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x88\xd9\x01\x00\x00\x01\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x00\x00\xfe\xe9[\xa9\xaf\xc1\x0bS[\xa9\xaf\xc1\x0bS\x01\x06}[G\x8f\xec.\x02\x04p\x00\x00\x00\x03\x04\x00\x00\x00\x06\x07\x04\xac\x19\x88\xe4\t\x02\x00l\n\x08\x00\x00\x00\x00\x00\x0fB@\x0c\x04\x00\x08=`\x0e\x00\x0f\x0eT\x00E\x00S\x00T\x00-\x00A\x00P\x00\x12\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x15\x01\x02\x18\x00\x19\x02\x04\x00\x1a\x00\x00') 5607 assert pkt.dst == pkt.real_dst 5608 assert pkt.src == pkt.real_src 5609 assert pkt.current_mapper_address == pkt.apparent_mapper_address 5610 assert pkt.mac == '7d:5b:47:8f:ec:2e' 5611 assert pkt.hostname == "TEST-AP" 5612 assert isinstance(pkt[LLTDAttributeEOP].payload, NoPayload) 5613 5614 = Packet build / dissection 5615 pkt = Ether(raw(Ether(dst=ETHER_BROADCAST, src=RandMAC()) / LLTD(tos=0, function=0))) 5616 assert LLTD in pkt 5617 assert pkt.dst == pkt.real_dst 5618 assert pkt.src == pkt.real_src 5619 assert pkt.tos == 0 5620 assert pkt.function == 0 5621 5622 = Attribute build / dissection 5623 assert isinstance(LLTDAttribute(), LLTDAttribute) 5624 assert isinstance(LLTDAttribute(raw(LLTDAttribute())), LLTDAttribute) 5625 assert all(isinstance(LLTDAttribute(type=i), LLTDAttribute) for i in six.moves.range(256)) 5626 assert all(isinstance(LLTDAttribute(raw(LLTDAttribute(type=i))), LLTDAttribute) for i in six.moves.range(256)) 5627 5628 = Large TLV 5629 m1, m2, seq = RandMAC()._fix(), RandMAC()._fix(), 123 5630 preqbase = Ether(src=m1, dst=m2) / LLTD() / \ 5631 LLTDQueryLargeTlv(type="Detailed Icon Image") 5632 prespbase = Ether(src=m2, dst=m1) / LLTD() / \ 5633 LLTDQueryLargeTlvResp() 5634 plist = [] 5635 pkt = preqbase.copy() 5636 pkt.seq = seq 5637 plist.append(Ether(raw(pkt))) 5638 pkt = prespbase.copy() 5639 pkt.seq = seq 5640 pkt.flags = "M" 5641 pkt.value = "abcd" 5642 plist.append(Ether(raw(pkt))) 5643 pkt = preqbase.copy() 5644 pkt.seq = seq + 1 5645 pkt.offset = 4 5646 plist.append(Ether(raw(pkt))) 5647 pkt = prespbase.copy() 5648 pkt.seq = seq + 1 5649 pkt.value = "efg" 5650 plist.append(Ether(raw(pkt))) 5651 builder = LargeTlvBuilder() 5652 builder.parse(plist) 5653 data = builder.get_data() 5654 assert len(data) == 1 5655 key, value = data.popitem() 5656 assert key.endswith(' [Detailed Icon Image]') 5657 assert value == 'abcdefg' 5658 5659 5660 ############ 5661 ############ 5662 + Test fragment() / defragment() functions 5663 5664 = fragment() 5665 payloadlen, fragsize = 100, 8 5666 assert fragsize % 8 == 0 5667 fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize) 5668 * create the packet 5669 pkt = IP() / ("X" * payloadlen) 5670 * create the fragments 5671 frags = fragment(pkt, fragsize) 5672 * count the fragments 5673 assert len(frags) == fragcount 5674 * each fragment except the last one should have MF set 5675 assert all(p.flags == 1 for p in frags[:-1]) 5676 assert frags[-1].flags == 0 5677 * each fragment except the last one should have a payload of fragsize bytes 5678 assert all(len(p.payload) == 8 for p in frags[:-1]) 5679 assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize) 5680 5681 = fragment() and overloaded_fields 5682 pkt1 = Ether() / IP() / UDP() 5683 pkt2 = fragment(pkt1)[0] 5684 pkt3 = pkt2.__class__(raw(pkt2)) 5685 assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto 5686 5687 = fragment() already fragmented packets 5688 payloadlen = 1480 * 3 5689 ffrags = fragment(IP() / ("X" * payloadlen), 1480) 5690 ffrags = fragment(ffrags, 1400) 5691 len(ffrags) == 6 5692 * each fragment except the last one should have MF set 5693 assert all(p.flags == 1 for p in ffrags[:-1]) 5694 assert ffrags[-1].flags == 0 5695 * fragment offset should be well computed 5696 plen = 0 5697 for p in ffrags: 5698 assert p.frag == plen // 8 5699 plen += len(p.payload) 5700 5701 assert plen == payloadlen 5702 5703 = defrag() 5704 nonfrag, unfrag, badfrag = defrag(frags) 5705 assert not nonfrag 5706 assert not badfrag 5707 assert len(unfrag) == 1 5708 5709 = defragment() 5710 defrags = defragment(frags) 5711 * we should have one single packet 5712 assert len(defrags) == 1 5713 * which should be the same as pkt reconstructed 5714 assert defrags[0] == IP(raw(pkt)) 5715 5716 = defrag() / defragment() - Real DNS packets 5717 5718 import base64 5719 5720 a = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgADIR+u0EAgIECv0DxAA1sRIL83Z7gbCBgAABAB0AAAANA255YwNnb3YAAP8AAcAMAAYAAQAAA4QAKgZ2d2FsbDDADApob3N0bWFzdGVywAx4Og5wAAA4QAAADhAAJOoAAAACWMAMAC4AAQAAA4QAmwAGCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292AHjCDBL0C1rEKUjsuG6Zg3+Rs6gj6llTABm9UZnWk+rRu6nPqW4N7AEllTYqNK+r6uFJ2KhfG3MDPS1F/M5QCVR8qkcbgrqPVRBJAG67/ZqpGORppQV6ib5qqo4ST5KyrgKpa8R1fWH8Fyp881NWLOZekM3TQyczcLFrvw9FFjdRwAwAAQABAAADhAAEobkenMAMAC4AAQAAA4QAmwABCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292ABW8t5tEv9zTLdB6UsoTtZIF6Kx/c4ukIud8UIGM0XdXnJYx0ZDyPDyLVy2rfwmXdEph3KBWAi5dpRT16nthlMmWPQxD1ecg9rc8jcaTGo8z833fYJjzPT8MpMTxhapu4ANSBVbv3LRBnce2abu9QaoCdlHPFHdNphp6JznCLt4jwAwAMAABAAADhAEIAQEDCAMBAAF77useCfI+6T+m6Tsf2ami8/q5XDtgS0Ae7F0jUZ0cpyYxy/28DLFjJaS57YiwAYaabkkugxsoSv9roqBNZjD+gjoUB+MK8fmfaqqkSOgQuIQLZJeOORWD0gAj8mekw+S84DECylbKyYEGf8CB3/59IfV+YkTcHhXBYrMNxhMK1Eiypz4cgYxXiYUSz7jbOmqE3hU2GinhRmNW4Trt4ImUruSO+iQbTTj6LtCtIsScOF4vn4gcLJURLHOs+mf1NU9Yqq9mPC9wlYZk+8rwqcjVIiRpDmmv83huv4be1x1kkz2YqTFwtc33Fzt6SZk96Qtk2wCgg8ZQqLKGx5uwIIyrwAwAMAABAAADhAEIAQEDCAMBAAGYc7SWbSinSc3u8ZcYlO0+yZcJD1vqC5JARxZjKNzszHxc9dpabBtR9covySVu1YaBVrlxNBzfyFd4PKyjvPcBER5sQImoCikC+flD5NwXJbnrO1SG0Kzp8XXDCZpBASxuBF0vjUSU9yMqp0FywCrIfrbfCcOGAFIVP0M2u8dVuoI4nWbkRFc0hiRefoxc1O2IdpR22GAp2OYeeN2/tnFBz/ZMQitU2IZIKBMybKmWLC96tPcqVdWJX6+M1an1ox0+NqBZuPjsCx0/lZbuB/rLHppJOmkRc7q2Fw/tpHOyWHV+ulCfXem9Up/sbrMcP7uumFz0FeNhBPtg3u5kA5OVwAwAMAABAAADhACIAQADCAMBAAF5mlzmmq8cs6Hff0qZLlGKYCGPlG23HZw2qAd7N2FmrLRqPQ0R/hbnw54MYiIs18zyfm2J+ZmzUvGd+gjHGx3ooRRffQQ4RFLq6g6oxaLTbtvqPFbWt4Kr2GwX3UslgZCzH5mXLNpPI2QoetIcQCNRdcxn5QpWxPppCVXbKdNvvcAMADAAAQAAA4QAiAEAAwgDAQABqeGHtNFc0Yh6Pp/aM+ntlDW1fLwuAWToGQhmnQFBTiIUZlH7QMjwh5oMExNp5/ABUb3qBsyk9CLanRfateRgFJCYCNYofrI4S2yqT5X9vvtCXeIoG/QqMSl3PJk4ClYufIKjMPgl5IyN6yBIMNmmsATlMMu5TxM68a/CLCh92L3ADAAuAAEAAAOEAJsAMAgCAAADhFlpvY1ZYHT9Jn0DbnljA2dvdgAViVpFoYwy9dMUbOPDHTKt/LOtoicvtQbHeXiUSQeBkGWTLyiPc/NTW9ZC4WK5AuSj/0+V') 5721 b = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgrDIR+kEEAgIECv0DxApz1F5olFRytjhNlG/JbdW0NSAFeUUF4rBRqsly/h6nFWKoQfih35Lm+BFLE0FoMaikWCjGJQIuf0CXiElMSQifiDM+KTeecNkCgTXADAAuAAEAAAOEARsAMAgCAAADhFlpvY1ZYHT9VwUDbnljA2dvdgAdRZxvC6VlbYUVarYjan0/PlP70gSz1SiYCDZyw5dsGo9vrZd+lMcAm5GFjtKYDXeCb5gVuegzHSNzxDQOa5lVKLQZfXgVHsl3jguCpYwKAygRR3mLBGtnhPrbYcPGMOzIxO6/UE5Hltx9SDqKNe2+rtVeZs5FyHQE5pTVGVjNED9iaauEW9UF3bwEP3K+wLgxWeVycjNry/l4vt9Z0fyTU15kogCZG8MXyStJlzIgdzVZRB96gTJbGBDRFQJfbE2Af+INl0HRY4p+bqQYwFomWg6Tzs30LcqAnkptknb5peUNmQTBI/MU00A6NeVJxkKK3+lf2EuuiJl+nFpfWiKpwAwAMwABAAADhAAJAQAADASqu8zdwAwALgABAAADhACbADMIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAVhcqgSl33lqjLLFR8pQ2cNhdX7dKZ2gRy0vUHOa+980Nljcj4I36rfjEVJCLKodpbseQl0OeTsbfNfqOmi1VrsypDl+YffyPMtHferm02xBK0agcTMdP/glpuKzdKHTiHTlnSOuBpPnEpgxYPNeBGx8yzMvIaU5rOCxuO49Sh/PADAACAAEAAAOEAAoHdndhbGw0YcAMwAwAAgABAAADhAAKB3Z3YWxsMmHADMAMAAIAAQAAA4QACgd2d2FsbDNhwAzADAACAAEAAAOEAAoHdndhbGwxYcAMwAwALgABAAADhACbAAIIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YANn7LVY7YsKLtpH7LKhUz0SVsM/Gk3T/V8I9wIEZ4vEklM9hI92D2aYe+9EKxOts+/py6itZfANXU197pCufktASDxlH5eWSc9S2uqrRnUNnMUe4p3Jy9ZCGhiHDemgFphKGWYTNZUJoML2+SDzbv9tXo4sSbZiKJCDkNdzSv2lfADAAQAAEAAAOEAEVEZ29vZ2xlLXNpdGUtdmVyaWZpY2F0aW9uPWMycnhTa2VPZUxpSG5iY24tSXhZZm5mQjJQcTQzU3lpeEVka2k2ODZlNDTADAAQAAEAAAOEADc2dj1zcGYxIGlwNDoxNjEuMTg1LjIuMC8yNSBpcDQ6MTY3LjE1My4xMzIuMC8yNSBteCAtYWxswAwALgABAAADhACbABAIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAjzLOj5HUtVGhi/emNG90g2zK80hrI6gh2d+twgVLYgWebPeTI2D2ylobevXeq5rK5RQgbg2iG1UiTBnlKPgLPYt8ZL+bi+/v5NTaqHfyHFYdKzZeL0dhrmebRbYzG7tzOllcAOOqieeO29Yr4gz1rpiU6g75vkz6yQoHNfmNVMXADAAPAAEAAAOEAAsAZAZ2d2FsbDLADMAMAA8AAQAAA4QACwBkBnZ3YWxsNMAMwAwADwABAAADhAALAAoGdndhbGwzwAzADAAPAAEAAAOEAAsACgZ2d2FsbDXADMAMAA8AAQAAA4QACwAKBnZ3YWxsNsAMwAwADwABAAADhAALAAoGdndhbGw3wAzADAAPAAEAAAOEAAsACgZ2d2FsbDjADMAMAA8AAQAAA4QACwBkBnZ3YWxsMcAMwAwALgABAAADhACbAA8IAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAooXBSj6PfsdBd8sEN/2AA4cvOl2bcioO') 5722 c = base64.b64decode('bnmYJ63mREVTUwEACABFAAFHU8UBWDIRHcMEAgIECv0DxDtlufeCT1zQktat4aEVA8MF0FO1sNbpEQtqfu5Al//OJISaRvtaArR/tLUj2CoZjS7uEnl7QpP/Ui/gR0YtyLurk9yTw7Vei0lSz4cnaOJqDiTGAKYwzVxjnoR1F3n8lplgQaOalVsHx9UAAQABAAADLAAEobkBA8epAAEAAQAAAywABKG5AQzHvwABAAEAAAMsAASnmYIMx5MAAQABAAADLAAEp5mCDcn9AAEAAQAAAqUABKeZhAvKFAABAAEAAAOEAAShuQIfyisAAQABAAADhAAEobkCKcpCAAEAAQAAA4QABKG5AjPKWQABAAEAAAOEAAShuQI9ynAAAQABAAADhAAEobkCC8nPAAEAAQAAA4QABKG5AgzJ5gABAAEAAAOEAASnmYQMAAApIAAAAAAAAAA=') 5723 d = base64.b64decode('////////REVTUwEACABFAABOawsAAIARtGoK/QExCv0D/wCJAIkAOry/3wsBEAABAAAAAAAAIEVKRkRFQkZFRUJGQUNBQ0FDQUNBQ0FDQUNBQ0FDQUFBAAAgAAEAABYP/WUAAB6N4XIAAB6E4XsAAACR/24AADyEw3sAABfu6BEAAAkx9s4AABXB6j4AAANe/KEAAAAT/+wAAB7z4QwAAEuXtGgAAB304gsAABTB6z4AAAdv+JAAACCu31EAADm+xkEAABR064sAABl85oMAACTw2w8AADrKxTUAABVk6psAABnF5joAABpA5b8AABjP5zAAAAqV9WoAAAUW+ukAACGS3m0AAAEP/vAAABoa5eUAABYP6fAAABX/6gAAABUq6tUAADXIyjcAABpy5Y0AABzb4yQAABqi5V0AAFXaqiUAAEmRtm4AACrL1TQAAESzu0wAAAzs8xMAAI7LcTQAABxN47IAAAbo+RcAABLr7RQAAB3Q4i8AAAck+NsAABbi6R0AAEdruJQAAJl+ZoEAABDH7zgAACOA3H8AAAB5/4YAABQk69sAAEo6tcUAABJU7asAADO/zEAAABGA7n8AAQ9L8LMAAD1DwrwAAB8F4PoAABbG6TkAACmC1n0AAlHErjkAABG97kIAAELBvT4AAEo0tcsAABtC5L0AAA9u8JEAACBU36sAAAAl/9oAABBO77EAAA9M8LMAAA8r8NQAAAp39YgAABB874MAAEDxvw4AAEgyt80AAGwsk9MAAB1O4rEAAAxL87QAADtmxJkAAATo+xcAAAM8/MMAABl55oYAACKh3V4AACGj3lwAAE5ssZMAAC1x0o4AAAO+/EEAABNy7I0AACYp2dYAACb+2QEAABB974IAABc36MgAAA1c8qMAAAf++AEAABDo7xcAACLq3RUAAA8L8PQAAAAV/+oAACNU3KsAABBv75AAABFI7rcAABuH5HgAABAe7+EAAB++4EEAACBl35oAAB7c4SMAADgJx/YAADeVyGoAACKN3XIAAA/C8D0AAASq+1UAAOHPHjAAABRI67cAAABw/48=') 5724 5725 old_debug_dissector = conf.debug_dissector 5726 conf.debug_dissector = 0 5727 plist = PacketList([Ether(x) for x in [a, b, c, d]]) 5728 conf.debug_dissector = old_debug_dissector 5729 5730 left, defragmented, errored = defrag(plist) 5731 assert len(left) == 1 5732 assert left[0] == Ether(d) 5733 assert len(defragmented) == 1 5734 assert len(defragmented[0]) == 3093 5735 assert defragmented[0][DNSRR].rrname == b'nyc.gov.' 5736 assert len(errored) == 0 5737 5738 plist_def = defragment(plist) 5739 assert len(plist_def) == 2 5740 assert len(plist_def[0]) == 3093 5741 assert plist_def[0][DNSRR].rrname == b'nyc.gov.' 5742 5743 = Packet().fragment() 5744 payloadlen, fragsize = 100, 8 5745 assert fragsize % 8 == 0 5746 fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize) 5747 * create the packet 5748 pkt = IP() / ("X" * payloadlen) 5749 * create the fragments 5750 frags = pkt.fragment(fragsize) 5751 * count the fragments 5752 assert len(frags) == fragcount 5753 * each fragment except the last one should have MF set 5754 assert all(p.flags == 1 for p in frags[:-1]) 5755 assert frags[-1].flags == 0 5756 * each fragment except the last one should have a payload of fragsize bytes 5757 assert all(len(p.payload) == 8 for p in frags[:-1]) 5758 assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize) 5759 5760 = Packet().fragment() and overloaded_fields 5761 pkt1 = Ether() / IP() / UDP() 5762 pkt2 = pkt1.fragment()[0] 5763 pkt3 = pkt2.__class__(raw(pkt2)) 5764 assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto 5765 5766 = Packet().fragment() already fragmented packets 5767 payloadlen = 1480 * 3 5768 ffrags = (IP() / ("X" * payloadlen)).fragment(1480) 5769 ffrags = reduce(lambda x, y: x + y, (pkt.fragment(1400) for pkt in ffrags)) 5770 len(ffrags) == 6 5771 * each fragment except the last one should have MF set 5772 assert all(p.flags == 1 for p in ffrags[:-1]) 5773 assert ffrags[-1].flags == 0 5774 * fragment offset should be well computed 5775 plen = 0 5776 for p in ffrags: 5777 assert p.frag == plen / 8 5778 plen += len(p.payload) 5779 5780 assert plen == payloadlen 5781 5782 5783 ############ 5784 ############ 5785 + TCP/IP tests 5786 5787 = TCP options: UTO - basic build 5788 raw(TCP(options=[("UTO", 0xffff)])) == b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff" 5789 5790 = TCP options: UTO - basic dissection 5791 uto = TCP(b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff") 5792 uto[TCP].options[0][0] == "UTO" and uto[TCP].options[0][1] == 0xffff 5793 5794 = TCP options: SAck - basic build 5795 raw(TCP(options=[(5, "abcdefgh")])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00" 5796 5797 = TCP options: SAck - basic dissection 5798 sack = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00") 5799 sack[TCP].options[0][0] == "SAck" and sack[TCP].options[0][1] == (1633837924, 1701209960) 5800 5801 = TCP options: SAckOK - basic build 5802 raw(TCP(options=[('SAckOK', '')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00" 5803 5804 = TCP options: SAckOK - basic dissection 5805 sackok = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00") 5806 sackok[TCP].options[0][0] == "SAckOK" and sackok[TCP].options[0][1] == b'' 5807 5808 = TCP options: EOL - basic build 5809 raw(TCP(options=[(0, '')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00" 5810 5811 = TCP options: EOL - basic dissection 5812 eol = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00") 5813 eol[TCP].options[0][0] == "EOL" and eol[TCP].options[0][1] == None 5814 5815 = TCP options: malformed - build 5816 raw(TCP(options=[('unknown', '')])) == raw(TCP()) 5817 5818 = TCP options: malformed - dissection 5819 raw(TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00")) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00" 5820 5821 = IP, TCP & UDP checksums (these tests highly depend on default values) 5822 pkt = IP() / TCP() 5823 bpkt = IP(raw(pkt)) 5824 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c 5825 5826 pkt = IP(len=40) / TCP() 5827 bpkt = IP(raw(pkt)) 5828 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c 5829 5830 pkt = IP(len=40, ihl=5) / TCP() 5831 bpkt = IP(raw(pkt)) 5832 assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c 5833 5834 pkt = IP() / TCP() / ("A" * 10) 5835 bpkt = IP(raw(pkt)) 5836 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c 5837 5838 pkt = IP(len=50) / TCP() / ("A" * 10) 5839 bpkt = IP(raw(pkt)) 5840 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c 5841 5842 pkt = IP(len=50, ihl=5) / TCP() / ("A" * 10) 5843 bpkt = IP(raw(pkt)) 5844 assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c 5845 5846 pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10) 5847 bpkt = IP(raw(pkt)) 5848 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c 5849 5850 pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10) 5851 bpkt = IP(raw(pkt)) 5852 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c 5853 5854 pkt = IP(len=54, ihl=6, options=[IPOption_RR()]) / TCP() / ("A" * 10) 5855 bpkt = IP(raw(pkt)) 5856 assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c 5857 5858 pkt = IP() / UDP() 5859 bpkt = IP(raw(pkt)) 5860 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 5861 5862 pkt = IP(len=28) / UDP() 5863 bpkt = IP(raw(pkt)) 5864 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 5865 5866 pkt = IP(len=28, ihl=5) / UDP() 5867 bpkt = IP(raw(pkt)) 5868 assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 5869 5870 pkt = IP() / UDP() / ("A" * 10) 5871 bpkt = IP(raw(pkt)) 5872 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 5873 5874 pkt = IP(len=38) / UDP() / ("A" * 10) 5875 bpkt = IP(raw(pkt)) 5876 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 5877 5878 pkt = IP(len=38, ihl=5) / UDP() / ("A" * 10) 5879 bpkt = IP(raw(pkt)) 5880 assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 5881 5882 pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10) 5883 bpkt = IP(raw(pkt)) 5884 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 5885 5886 pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10) 5887 bpkt = IP(raw(pkt)) 5888 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 5889 5890 pkt = IP(len=42, ihl=6, options=[IPOption_RR()]) / UDP() / ("A" * 10) 5891 bpkt = IP(raw(pkt)) 5892 assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 5893 5894 = DNS 5895 5896 * DNS over UDP 5897 pkt = IP(raw(IP(src="10.0.0.1", dst="8.8.8.8")/UDP(sport=RandShort(), dport=53)/DNS(qd=DNSQR(qname="secdev.org.")))) 5898 assert UDP in pkt and isinstance(pkt[UDP].payload, DNS) 5899 assert pkt[UDP].dport == 53 and pkt[UDP].length is None 5900 assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org." 5901 5902 * DNS over TCP 5903 pkt = IP(raw(IP(src="10.0.0.1", dst="8.8.8.8")/TCP(sport=RandShort(), dport=53, flags="P")/DNS(qd=DNSQR(qname="secdev.org.")))) 5904 assert TCP in pkt and isinstance(pkt[TCP].payload, DNS) 5905 assert pkt[TCP].dport == 53 and pkt[DNS].length is not None 5906 assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org." 5907 5908 = DNS frame with advanced decompression 5909 5910 a = b'\x01\x00^\x00\x00\xfb$\xa2\xe1\x90\xa9]\x08\x00E\x00\x01P\\\xdd\x00\x00\xff\x11\xbb\x93\xc0\xa8\x00\x88\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01<*\x81\x00\x00\x84\x00\x00\x00\x00\x03\x00\x00\x00\x04\x01B\x019\x015\x019\x013\x014\x017\x013\x016\x017\x010\x012\x010\x01D\x018\x011\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x0f\x07Zalmoid\x05local\x00\x011\x01A\x019\x014\x017\x01E\x01A\x014\x01B\x01A\x01F\x01B\x012\x011\x014\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x03136\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0o\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0o\x00\x02\x00\x08\xc0\xbd\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\xbd\x00\x02\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xc1&\xa2\xe1\x90\xa9]$\xa2\xe1\x90\xa9]' 5911 pkt = Ether(a) 5912 assert pkt.ancount == 3 5913 assert pkt.arcount == 4 5914 assert pkt.an[1].rdata == b'Zalmoid.local.' 5915 assert pkt.an[2].rdata == b'Zalmoid.local.' 5916 assert pkt.ar[1].nextname == b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.' 5917 assert pkt.ar[2].nextname == b'136.0.168.192.in-addr.arpa.' 5918 pkt.show() 5919 5920 = DNS frame with DNSRRSRV 5921 5922 b = Ether(b'33\x00\x00\x00\xfb$\xe3\x14M\x84\xc0\x86\xdd`\t\xc0f\x02b\x11\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x14\xe9\x14\xe9\x02b_\xd8\x00\x00\x84\x00\x00\x00\x00\x0b\x00\x00\x00\x06\x014\x011\x01F\x012\x01B\x012\x01B\x01A\x013\x010\x01C\x012\x01A\x012\x014\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x14\x0csCapys-fLuff\x05local\x00\x03177\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x01E\x01F\x017\x01D\x01B\x018\x014\x01C\x014\x01B\x016\x01E\x015\x017\x018\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`+24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0\x0e_apple-mobdev2\x04_tcp\xc0m\x00\x10\x80\x01\x00\x00\x11\x94\x00\x01\x00\t_services\x07_dns-sd\x04_udp\xc0m\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc1\x12\x08521805b3\x04_sub\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc0\xe6\x00!\x80\x01\x00\x00\x00x\x00\x08\x00\x00\x00\x00~\xf2\xc0`\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xc0`\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xb1\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10*\x01\x0e5/\x17\xfe`\x08u\xe6\xb4\xc4\x8b\xd7\xfe\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0t\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0t\x00\x02\x00\x08\xc0\x98\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x98\x00\x02\x00\x08\xc0\xe6\x00/\x80\x01\x00\x00\x11\x94\x00\t\xc0\xe6\x00\x05\x00\x00\x80\x00@\xc0`\x00/\x80\x01\x00\x00\x00x\x00\x08\xc0`\x00\x04@\x00\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xcf&\xe3\x14M\x84\xc0$\xe3\x14M\x84\xc0') 5923 assert isinstance(b.an[7], DNSRRSRV) 5924 assert b.an[7].target == b'sCapys-fLuff.local.' 5925 assert b.an[6].rrname == b'_apple-mobdev2._tcp.local.' 5926 assert b.an[6].rdata == b'24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0._apple-mobdev2._tcp.local.' 5927 5928 = DNS frame with decompression hidden args 5929 5930 c = b'\x01\x00^\x00\x00\xfb\x14\x0cv\x8f\xfe(\x08\x00E\x00\x01C\xe3\x91@\x00\xff\x11\xf4u\xc0\xa8\x00\xfe\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01/L \x00\x00\x84\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x80\x01\x00\x00\x11\x94\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00x\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe' 5931 pkt = Ether(c) 5932 assert DNS in pkt 5933 assert pkt.an.rdata == b'140C768FFE28@Freebox Server._raop._tcp.local.' 5934 assert pkt.an.getlayer(DNSRR, type=1).rrname == b'Freebox-Server-3.local.' 5935 assert pkt.an.getlayer(DNSRR, type=1).rdata == '192.168.0.254' 5936 5937 = Layer binding 5938 5939 * Test DestMACField & DestIPField 5940 pkt = Ether(raw(Ether()/IP()/UDP(dport=5353)/DNS())) 5941 assert isinstance(pkt, Ether) and pkt.dst == '01:00:5e:00:00:fb' 5942 pkt = pkt.payload 5943 assert isinstance(pkt, IP) and pkt.dst == '224.0.0.251' 5944 pkt = pkt.payload 5945 assert isinstance(pkt, UDP) and pkt.dport == 5353 5946 pkt = pkt.payload 5947 assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload) 5948 5949 * Same with IPv6 5950 pkt = Ether(raw(Ether()/IPv6()/UDP(dport=5353)/DNS())) 5951 assert isinstance(pkt, Ether) and pkt.dst == '33:33:00:00:00:fb' 5952 pkt = pkt.payload 5953 assert isinstance(pkt, IPv6) and pkt.dst == 'ff02::fb' 5954 pkt = pkt.payload 5955 assert isinstance(pkt, UDP) and pkt.dport == 5353 5956 pkt = pkt.payload 5957 assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload) 5958 5959 5960 ############ 5961 ############ 5962 + Mocked read_routes() calls 5963 5964 = Truncated netstat -rn output on OS X 5965 ~ mock_read_routes6_bsd 5966 5967 import mock 5968 from io import StringIO 5969 5970 @mock.patch("scapy.arch.unix.get_if_addr") 5971 @mock.patch("scapy.arch.unix.os") 5972 def test_osx_netstat_truncated(mock_os, mock_get_if_addr): 5973 """Test read_routes() on OS X 10.? with a long interface name""" 5974 # netstat & ifconfig outputs from https://github.com/secdev/scapy/pull/119 5975 netstat_output = u""" 5976 Routing tables 5977 5978 Internet: 5979 Destination Gateway Flags Refs Use Netif Expire 5980 default 192.168.1.1 UGSc 460 0 en1 5981 default link#11 UCSI 1 0 bridge1 5982 127 127.0.0.1 UCS 1 0 lo0 5983 127.0.0.1 127.0.0.1 UH 10 2012351 lo0 5984 """ 5985 ifconfig_output = u"lo0 en1 bridge10\n" 5986 # Mocked file descriptors 5987 def se_popen(command): 5988 """Perform specific side effects""" 5989 if command.startswith("netstat -rn"): 5990 return StringIO(netstat_output) 5991 elif command == "ifconfig -l": 5992 ret = StringIO(ifconfig_output) 5993 def unit(): 5994 return ret 5995 ret.__call__ = unit 5996 ret.__enter__ = unit 5997 ret.__exit__ = lambda x,y,z: None 5998 return ret 5999 raise Exception("Command not mocked: %s" % command) 6000 mock_os.popen.side_effect = se_popen 6001 # Mocked get_if_addr() behavior 6002 def se_get_if_addr(iface): 6003 """Perform specific side effects""" 6004 if iface == "bridge1": 6005 oserror_exc = OSError() 6006 oserror_exc.message = "Device not configured" 6007 raise oserror_exc 6008 return "1.2.3.4" 6009 mock_get_if_addr.side_effect = se_get_if_addr 6010 # Test the function 6011 from scapy.arch.unix import read_routes 6012 routes = read_routes() 6013 assert(len(routes) == 4) 6014 assert([r for r in routes if r[3] == "bridge10"]) 6015 6016 6017 test_osx_netstat_truncated() 6018 6019 6020 ############ 6021 ############ 6022 + Mocked read_routes6() calls 6023 6024 = Preliminary definitions 6025 ~ mock_read_routes6_bsd 6026 6027 import mock 6028 from io import StringIO 6029 6030 def valid_output_read_routes6(routes): 6031 """"Return True if 'routes' contains correctly formatted entries, False otherwise""" 6032 for destination, plen, next_hop, dev, cset, me in routes: 6033 if not in6_isvalid(destination) or not type(plen) == int: 6034 return False 6035 if not in6_isvalid(next_hop) or not isinstance(dev, six.string_types): 6036 return False 6037 for address in cset: 6038 if not in6_isvalid(address): 6039 return False 6040 return True 6041 6042 def check_mandatory_ipv6_routes(routes6): 6043 """Ensure that mandatory IPv6 routes are present""" 6044 if len([r for r in routes6 if r[0] == "::1" and r[4] == ["::1"]]) < 1: 6045 return False 6046 if len([r for r in routes6 if r[0] == "fe80::" and r[1] == 64]) < 1: 6047 return False 6048 if len([r for r in routes6 if in6_islladdr(r[0]) and r[1] == 128 and \ 6049 r[4] == ["::1"]]) < 1: 6050 return False 6051 return True 6052 6053 6054 = Mac OS X 10.9.5 6055 ~ mock_read_routes6_bsd 6056 6057 @mock.patch("scapy.arch.unix.in6_getifaddr") 6058 @mock.patch("scapy.arch.unix.os") 6059 def test_osx_10_9_5(mock_os, mock_in6_getifaddr): 6060 """Test read_routes6() on OS X 10.9.5""" 6061 # 'netstat -rn -f inet6' output 6062 netstat_output = u""" 6063 Routing tables 6064 6065 Internet6: 6066 Destination Gateway Flags Netif Expire 6067 ::1 ::1 UHL lo0 6068 fe80::%lo0/64 fe80::1%lo0 UcI lo0 6069 fe80::1%lo0 link#1 UHLI lo0 6070 fe80::%en0/64 link#4 UCI en0 6071 fe80::ba26:6cff:fe5f:4eee%en0 b8:26:6c:5f:4e:ee UHLWIi en0 6072 fe80::bae8:56ff:fe45:8ce6%en0 b8:e8:56:45:8c:e6 UHLI lo0 6073 ff01::%lo0/32 ::1 UmCI lo0 6074 ff01::%en0/32 link#4 UmCI en0 6075 ff02::%lo0/32 ::1 UmCI lo0 6076 ff02::%en0/32 link#4 UmCI en0 6077 """ 6078 # Mocked file descriptor 6079 strio = StringIO(netstat_output) 6080 mock_os.popen = mock.MagicMock(return_value=strio) 6081 # Mocked in6_getifaddr() output 6082 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"), 6083 ("fe80::ba26:6cff:fe5f:4eee", IPV6_ADDR_LINKLOCAL, "en0")] 6084 # Test the function 6085 from scapy.arch.unix import read_routes6 6086 routes = read_routes6() 6087 for r in routes: 6088 print(r) 6089 assert(len(routes) == 6) 6090 assert(check_mandatory_ipv6_routes(routes)) 6091 6092 test_osx_10_9_5() 6093 6094 6095 = Mac OS X 10.9.5 with global IPv6 connectivity 6096 ~ mock_read_routes6_bsd 6097 @mock.patch("scapy.arch.unix.in6_getifaddr") 6098 @mock.patch("scapy.arch.unix.os") 6099 def test_osx_10_9_5_global(mock_os, mock_in6_getifaddr): 6100 """Test read_routes6() on OS X 10.9.5 with an IPv6 connectivity""" 6101 # 'netstat -rn -f inet6' output 6102 netstat_output = u""" 6103 Routing tables 6104 6105 Internet6: 6106 Destination Gateway Flags Netif Expire 6107 default fe80::ba26:8aff:fe5f:4eef%en0 UGc en0 6108 ::1 ::1 UHL lo0 6109 2a01:ab09:7d:1f01::/64 link#4 UC en0 6110 2a01:ab09:7d:1f01:420:205c:9fab:5be7 b8:e9:55:44:7c:e5 UHL lo0 6111 2a01:ab09:7d:1f01:ba26:8aff:fe5f:4eef b8:26:8a:5f:4e:ef UHLWI en0 6112 2a01:ab09:7d:1f01:bae9:55ff:fe44:7ce5 b8:e9:55:44:7c:e5 UHL lo0 6113 fe80::%lo0/64 fe80::1%lo0 UcI lo0 6114 fe80::1%lo0 link#1 UHLI lo0 6115 fe80::%en0/64 link#4 UCI en0 6116 fe80::5664:d9ff:fe79:4e00%en0 54:64:d9:79:4e:0 UHLWI en0 6117 fe80::6ead:f8ff:fe74:945a%en0 6c:ad:f8:74:94:5a UHLWI en0 6118 fe80::a2f3:c1ff:fec4:5b50%en0 a0:f3:c1:c4:5b:50 UHLWI en0 6119 fe80::ba26:8aff:fe5f:4eef%en0 b8:26:8a:5f:4e:ef UHLWIir en0 6120 fe80::bae9:55ff:fe44:7ce5%en0 b8:e9:55:44:7c:e5 UHLI lo0 6121 ff01::%lo0/32 ::1 UmCI lo0 6122 ff01::%en0/32 link#4 UmCI en0 6123 ff02::%lo0/32 ::1 UmCI lo 6124 """ 6125 # Mocked file descriptor 6126 strio = StringIO(netstat_output) 6127 mock_os.popen = mock.MagicMock(return_value=strio) 6128 # Mocked in6_getifaddr() output 6129 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"), 6130 ("fe80::ba26:6cff:fe5f:4eee", IPV6_ADDR_LINKLOCAL, "en0")] 6131 # Test the function 6132 from scapy.arch.unix import read_routes6 6133 routes = read_routes6() 6134 print(routes) 6135 assert(valid_output_read_routes6(routes)) 6136 for r in routes: 6137 print(r) 6138 assert(len(routes) == 11) 6139 assert(check_mandatory_ipv6_routes(routes)) 6140 6141 test_osx_10_9_5_global() 6142 6143 6144 = Mac OS X 10.10.4 6145 ~ mock_read_routes6_bsd 6146 6147 @mock.patch("scapy.arch.unix.in6_getifaddr") 6148 @mock.patch("scapy.arch.unix.os") 6149 def test_osx_10_10_4(mock_os, mock_in6_getifaddr): 6150 """Test read_routes6() on OS X 10.10.4""" 6151 # 'netstat -rn -f inet6' output 6152 netstat_output = u""" 6153 Routing tables 6154 6155 Internet6: 6156 Destination Gateway Flags Netif Expire 6157 ::1 ::1 UHL lo0 6158 fe80::%lo0/64 fe80::1%lo0 UcI lo0 6159 fe80::1%lo0 link#1 UHLI lo0 6160 fe80::%en0/64 link#4 UCI en0 6161 fe80::a00:27ff:fe9b:c965%en0 8:0:27:9b:c9:65 UHLI lo0 6162 ff01::%lo0/32 ::1 UmCI lo0 6163 ff01::%en0/32 link#4 UmCI en0 6164 ff02::%lo0/32 ::1 UmCI lo0 6165 ff02::%en0/32 link#4 UmCI en0 6166 """ 6167 # Mocked file descriptor 6168 strio = StringIO(netstat_output) 6169 mock_os.popen = mock.MagicMock(return_value=strio) 6170 # Mocked in6_getifaddr() output 6171 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"), 6172 ("fe80::a00:27ff:fe9b:c965", IPV6_ADDR_LINKLOCAL, "en0")] 6173 # Test the function 6174 from scapy.arch.unix import read_routes6 6175 routes = read_routes6() 6176 for r in routes: 6177 print(r) 6178 assert(len(routes) == 5) 6179 assert(check_mandatory_ipv6_routes(routes)) 6180 6181 test_osx_10_10_4() 6182 6183 6184 = FreeBSD 10.2 6185 ~ mock_read_routes6_bsd 6186 6187 @mock.patch("scapy.arch.unix.in6_getifaddr") 6188 @mock.patch("scapy.arch.unix.os") 6189 def test_freebsd_10_2(mock_os, mock_in6_getifaddr): 6190 """Test read_routes6() on FreeBSD 10.2""" 6191 # 'netstat -rn -f inet6' output 6192 netstat_output = u""" 6193 Routing tables 6194 6195 Internet6: 6196 Destination Gateway Flags Netif Expire 6197 ::/96 ::1 UGRS lo0 6198 ::1 link#2 UH lo0 6199 ::ffff:0.0.0.0/96 ::1 UGRS lo0 6200 fe80::/10 ::1 UGRS lo0 6201 fe80::%lo0/64 link#2 U lo0 6202 fe80::1%lo0 link#2 UHS lo0 6203 ff01::%lo0/32 ::1 U lo0 6204 ff02::/16 ::1 UGRS lo0 6205 ff02::%lo0/32 ::1 U lo0 6206 """ 6207 # Mocked file descriptor 6208 strio = StringIO(netstat_output) 6209 mock_os.popen = mock.MagicMock(return_value=strio) 6210 # Mocked in6_getifaddr() output 6211 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0")] 6212 # Test the function 6213 from scapy.arch.unix import read_routes6 6214 routes = read_routes6() 6215 for r in routes: 6216 print(r) 6217 assert(len(routes) == 3) 6218 assert(check_mandatory_ipv6_routes(routes)) 6219 6220 test_freebsd_10_2() 6221 6222 6223 = OpenBSD 5.5 6224 ~ mock_read_routes6_bsd 6225 6226 @mock.patch("scapy.arch.unix.OPENBSD") 6227 @mock.patch("scapy.arch.unix.in6_getifaddr") 6228 @mock.patch("scapy.arch.unix.os") 6229 def test_openbsd_5_5(mock_os, mock_in6_getifaddr, mock_openbsd): 6230 """Test read_routes6() on OpenBSD 5.5""" 6231 # 'netstat -rn -f inet6' output 6232 netstat_output = u""" 6233 Routing tables 6234 6235 Internet6: 6236 Destination Gateway Flags Refs Use Mtu Prio Iface 6237 ::/104 ::1 UGRS 0 0 - 8 lo0 6238 ::/96 ::1 UGRS 0 0 - 8 lo0 6239 ::1 ::1 UH 14 0 33144 4 lo0 6240 ::127.0.0.0/104 ::1 UGRS 0 0 - 8 lo0 6241 ::224.0.0.0/100 ::1 UGRS 0 0 - 8 lo0 6242 ::255.0.0.0/104 ::1 UGRS 0 0 - 8 lo0 6243 ::ffff:0.0.0.0/96 ::1 UGRS 0 0 - 8 lo0 6244 2002::/24 ::1 UGRS 0 0 - 8 lo0 6245 2002:7f00::/24 ::1 UGRS 0 0 - 8 lo0 6246 2002:e000::/20 ::1 UGRS 0 0 - 8 lo0 6247 2002:ff00::/24 ::1 UGRS 0 0 - 8 lo0 6248 fe80::/10 ::1 UGRS 0 0 - 8 lo0 6249 fe80::%em0/64 link#1 UC 0 0 - 4 em0 6250 fe80::a00:27ff:fe04:59bf%em0 08:00:27:04:59:bf UHL 0 0 - 4 lo0 6251 fe80::%lo0/64 fe80::1%lo0 U 0 0 - 4 lo0 6252 fe80::1%lo0 link#3 UHL 0 0 - 4 lo0 6253 fec0::/10 ::1 UGRS 0 0 - 8 lo0 6254 ff01::/16 ::1 UGRS 0 0 - 8 lo0 6255 ff01::%em0/32 link#1 UC 0 0 - 4 em0 6256 ff01::%lo0/32 fe80::1%lo0 UC 0 0 - 4 lo0 6257 ff02::/16 ::1 UGRS 0 0 - 8 lo0 6258 ff02::%em0/32 link#1 UC 0 0 - 4 em0 6259 ff02::%lo0/32 fe80::1%lo0 UC 0 0 - 4 lo0 6260 """ 6261 # Mocked file descriptor 6262 strio = StringIO(netstat_output) 6263 mock_os.popen = mock.MagicMock(return_value=strio) 6264 6265 # Mocked in6_getifaddr() output 6266 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"), 6267 ("fe80::a00:27ff:fe04:59bf", IPV6_ADDR_LINKLOCAL, "em0")] 6268 # Mocked OpenBSD parsing behavior 6269 mock_openbsd = True 6270 # Test the function 6271 from scapy.arch.unix import read_routes6 6272 routes = read_routes6() 6273 for r in routes: 6274 print(r) 6275 assert(len(routes) == 5) 6276 assert(check_mandatory_ipv6_routes(routes)) 6277 6278 test_openbsd_5_5() 6279 6280 6281 = NetBSD 7.0 6282 ~ mock_read_routes6_bsd 6283 6284 @mock.patch("scapy.arch.unix.NETBSD") 6285 @mock.patch("scapy.arch.unix.in6_getifaddr") 6286 @mock.patch("scapy.arch.unix.os") 6287 def test_netbsd_7_0(mock_os, mock_in6_getifaddr, mock_netbsd): 6288 """Test read_routes6() on NetBSD 7.0""" 6289 # 'netstat -rn -f inet6' output 6290 netstat_output = u""" 6291 Routing tables 6292 6293 Internet6: 6294 Destination Gateway Flags Refs Use Mtu Interface 6295 ::/104 ::1 UGRS - - - lo0 6296 ::/96 ::1 UGRS - - - lo0 6297 ::1 ::1 UH - - 33648 lo0 6298 ::127.0.0.0/104 ::1 UGRS - - - lo0 6299 ::224.0.0.0/100 ::1 UGRS - - - lo0 6300 ::255.0.0.0/104 ::1 UGRS - - - lo0 6301 ::ffff:0.0.0.0/96 ::1 UGRS - - - lo0 6302 2001:db8::/32 ::1 UGRS - - - lo0 6303 2002::/24 ::1 UGRS - - - lo0 6304 2002:7f00::/24 ::1 UGRS - - - lo0 6305 2002:e000::/20 ::1 UGRS - - - lo0 6306 2002:ff00::/24 ::1 UGRS - - - lo0 6307 fe80::/10 ::1 UGRS - - - lo0 6308 fe80::%wm0/64 link#1 UC - - - wm0 6309 fe80::acd1:3989:180e:fde0 08:00:27:a1:64:d8 UHL - - - lo0 6310 fe80::%lo0/64 fe80::1 U - - - lo0 6311 fe80::1 link#2 UHL - - - lo0 6312 ff01:1::/32 link#1 UC - - - wm0 6313 ff01:2::/32 ::1 UC - - - lo0 6314 ff02::%wm0/32 link#1 UC - - - wm0 6315 ff02::%lo0/32 ::1 UC - - - lo0 6316 """ 6317 # Mocked file descriptor 6318 strio = StringIO(netstat_output) 6319 mock_os.popen = mock.MagicMock(return_value=strio) 6320 # Mocked in6_getifaddr() output 6321 mock_in6_getifaddr.return_value = [("::1", IPV6_ADDR_LOOPBACK, "lo0"), 6322 ("fe80::acd1:3989:180e:fde0", IPV6_ADDR_LINKLOCAL, "wm0")] 6323 # Test the function 6324 from scapy.arch.unix import read_routes6 6325 routes = read_routes6() 6326 for r in routes: 6327 print(r) 6328 assert(len(routes) == 5) 6329 assert(check_mandatory_ipv6_routes(routes)) 6330 6331 test_netbsd_7_0() 6332 6333 ############ 6334 ############ 6335 + STP tests 6336 6337 = STP - Basic Instantiation 6338 assert raw(STP()) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00\x02\x00\x0f\x00' 6339 6340 = STP - Basic Dissection 6341 6342 s = STP(b'\x00\x00\x00\x00\x00\x00\x00\x12\x13\x14\x15\x16\x17\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x01\x00\x14\x00\x05\x00\x0f\x00') 6343 assert s.rootmac == "12:13:14:15:16:17" 6344 assert s.bridgemac == "aa:aa:aa:aa:aa:aa" 6345 assert s.hellotime == 5 6346 6347 ############ 6348 ############ 6349 + EAPOL class tests 6350 6351 = EAPOL - Basic Instantiation 6352 raw(EAPOL()) == b'\x01\x00\x00\x00' 6353 6354 = EAPOL - Instantiation with specific values 6355 raw(EAPOL(version = 3, type = 5)) == b'\x03\x05\x00\x00' 6356 6357 = EAPOL - Dissection (1) 6358 s = b'\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6359 eapol = EAPOL(s) 6360 assert(eapol.version == 3) 6361 assert(eapol.type == 1) 6362 assert(eapol.len == 0) 6363 6364 = EAPOL - Dissection (2) 6365 s = b'\x03\x00\x00\x05\x01\x01\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6366 eapol = EAPOL(s) 6367 assert(eapol.version == 3) 6368 assert(eapol.type == 0) 6369 assert(eapol.len == 5) 6370 6371 = EAPOL - Dissection (3) 6372 s = b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6373 eapol = EAPOL(s) 6374 assert(eapol.version == 3) 6375 assert(eapol.type == 0) 6376 assert(eapol.len == 14) 6377 6378 = EAPOL - Dissection (4) 6379 req = EAPOL(b'\x03\x00\x00\x05\x01\x01\x00\x05\x01') 6380 ans = EAPOL(b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous') 6381 ans.answers(req) 6382 6383 = EAPOL - Dissection (5) 6384 s = b'\x02\x00\x00\x06\x01\x01\x00\x06\r ' 6385 eapol = EAPOL(s) 6386 assert(eapol.version == 2) 6387 assert(eapol.type == 0) 6388 assert(eapol.len == 6) 6389 assert(eapol.haslayer(EAP_TLS)) 6390 6391 = EAPOL - Dissection (6) 6392 s = b'\x03\x00\x00<\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00' 6393 eapol = EAPOL(s) 6394 assert(eapol.version == 3) 6395 assert(eapol.type == 0) 6396 assert(eapol.len == 60) 6397 assert(eapol.haslayer(EAP_FAST)) 6398 6399 6400 ############ 6401 ############ 6402 + EAPOL-MKA class tests 6403 6404 = EAPOL-MKA - With Basic parameter set - Dissection 6405 eapol = None 6406 s = b'\x03\x05\x00T\x01\xff\xf0<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xff\x00\x00\x10\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj' 6407 eapol = EAPOL(s) 6408 assert(eapol.version == 3) 6409 assert(eapol.type == 5) 6410 assert(eapol.len == 84) 6411 assert(eapol.haslayer(MKAPDU)) 6412 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7") 6413 assert(eapol[MKAPDU].haslayer(MKAICVSet)) 6414 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj") 6415 6416 6417 = EAPOL-MKA - With Potential Peer List parameter set - Dissection 6418 eapol = None 6419 s = b'\x03\x05\x00h\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00}\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x02\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\xff\x00\x00\x105\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0' 6420 eapol = EAPOL(s) 6421 assert(eapol.version == 3) 6422 assert(eapol.type == 5) 6423 assert(eapol.len == 104) 6424 assert(eapol.haslayer(MKAPDU)) 6425 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6426 assert(eapol.haslayer(MKAPotentialPeerListParamSet)) 6427 assert(eapol[MKAPDU][MKAPotentialPeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7") 6428 assert(eapol[MKAPDU].haslayer(MKAICVSet)) 6429 assert(eapol[MKAPDU][MKAICVSet].icv == b"5\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0") 6430 6431 = EAPOL-MKA - With Live Peer List parameter set - Dissection 6432 eapol = None 6433 s = b"\x03\x05\x00h\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x80\xff\x00\x00\x10\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7" 6434 eapol = EAPOL(s) 6435 assert(eapol.version == 3) 6436 assert(eapol.type == 5) 6437 assert(eapol.len == 104) 6438 assert(eapol.haslayer(MKAPDU)) 6439 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7') 6440 assert(eapol.haslayer(MKALivePeerListParamSet)) 6441 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6442 assert(eapol[MKAPDU].haslayer(MKAICVSet)) 6443 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7") 6444 6445 = EAPOL-MKA - With SAK Use parameter set - Dissection 6446 eapol = None 6447 s = b'\x03\x05\x00\x94\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x03\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x83\xff\x00\x00\x10OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae' 6448 eapol = EAPOL(s) 6449 assert(eapol.version == 3) 6450 assert(eapol.type == 5) 6451 assert(eapol.len == 148) 6452 assert(eapol.haslayer(MKAPDU)) 6453 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7') 6454 assert(eapol.haslayer(MKASAKUseParamSet)) 6455 assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6456 assert(eapol.haslayer(MKALivePeerListParamSet)) 6457 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6458 assert(eapol[MKAPDU].haslayer(MKAICVSet)) 6459 assert(eapol[MKAPDU][MKAICVSet].icv == b"OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae") 6460 6461 = EAPOL-MKA - With Distributed SAK parameter set - Dissection 6462 eapol = None 6463 s = b"\x03\x05\x00\xb4\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x81\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x00\x1c\x00\x00\x00\x01Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu\xff\x00\x00\x10\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur" 6464 eapol = EAPOL(s) 6465 assert(eapol.version == 3) 6466 assert(eapol.type == 5) 6467 assert(eapol.len == 180) 6468 assert(eapol.haslayer(MKAPDU)) 6469 assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6470 assert(eapol.haslayer(MKASAKUseParamSet)) 6471 assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6") 6472 assert(eapol.haslayer(MKALivePeerListParamSet)) 6473 assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7") 6474 assert(eapol.haslayer(MKADistributedSAKParamSet)) 6475 assert(eapol[MKADistributedSAKParamSet].sak_aes_key_wrap == b"Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu") 6476 assert(eapol[MKAPDU].haslayer(MKAICVSet)) 6477 assert(eapol[MKAPDU][MKAICVSet].icv == b"\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur") 6478 6479 6480 ############ 6481 ############ 6482 ############ 6483 + EAP class tests 6484 6485 = EAP - Basic Instantiation 6486 raw(EAP()) == b'\x04\x00\x00\x04' 6487 6488 = EAP - Instantiation with specific values 6489 raw(EAP(code = 1, id = 1, len = 5, type = 1)) == b'\x01\x01\x00\x05\x01' 6490 6491 = EAP - Dissection (1) 6492 s = b'\x01\x01\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6493 eap = EAP(s) 6494 assert(eap.code == 1) 6495 assert(eap.id == 1) 6496 assert(eap.len == 5) 6497 assert(hasattr(eap, "type")) 6498 assert(eap.type == 1) 6499 6500 = EAP - Dissection (2) 6501 s = b'\x02\x01\x00\x0e\x01anonymous\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6502 eap = EAP(s) 6503 assert(eap.code == 2) 6504 assert(eap.id == 1) 6505 assert(eap.len == 14) 6506 assert(eap.type == 1) 6507 assert(hasattr(eap, 'identity')) 6508 assert(eap.identity == b'anonymous') 6509 6510 = EAP - Dissection (3) 6511 s = b'\x01\x01\x00\x06\r ' 6512 eap = EAP(s) 6513 assert(eap.code == 1) 6514 assert(eap.id == 1) 6515 assert(eap.len == 6) 6516 assert(eap.type == 13) 6517 assert(eap.haslayer(EAP_TLS)) 6518 assert(eap[EAP_TLS].L == 0) 6519 assert(eap[EAP_TLS].M == 0) 6520 assert(eap[EAP_TLS].S == 1) 6521 6522 = EAP - Dissection (4) 6523 s = b'\x02\x01\x00\xd1\r\x00\x16\x03\x01\x00\xc6\x01\x00\x00\xc2\x03\x01UK\x02\xdf\x1e\xde5\xab\xfa[\x15\xef\xbe\xa2\xe4`\xc6g\xb9\xa8\xaa%vAs\xb2\x1cXt\x1c0\xb7\x00\x00P\xc0\x14\xc0\n\x009\x008\x00\x88\x00\x87\xc0\x0f\xc0\x05\x005\x00\x84\xc0\x12\xc0\x08\x00\x16\x00\x13\xc0\r\xc0\x03\x00\n\xc0\x13\xc0\t\x003\x002\x00\x9a\x00\x99\x00E\x00D\xc0\x0e\xc0\x04\x00/\x00\x96\x00A\xc0\x11\xc0\x07\xc0\x0c\xc0\x02\x00\x05\x00\x04\x00\x15\x00\x12\x00\t\x00\xff\x01\x00\x00I\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x004\x002\x00\x0e\x00\r\x00\x19\x00\x0b\x00\x0c\x00\x18\x00\t\x00\n\x00\x16\x00\x17\x00\x08\x00\x06\x00\x07\x00\x14\x00\x15\x00\x04\x00\x05\x00\x12\x00\x13\x00\x01\x00\x02\x00\x03\x00\x0f\x00\x10\x00\x11\x00#\x00\x00\x00\x0f\x00\x01\x01' 6524 eap = EAP(s) 6525 assert(eap.code == 2) 6526 assert(eap.id == 1) 6527 assert(eap.len == 209) 6528 assert(eap.type == 13) 6529 assert(eap.haslayer(EAP_TLS)) 6530 assert(eap[EAP_TLS].L == 0) 6531 assert(eap[EAP_TLS].M == 0) 6532 assert(eap[EAP_TLS].S == 0) 6533 6534 = EAP - Dissection (5) 6535 s = b'\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00' 6536 eap = EAP(s) 6537 assert(eap.code == 2) 6538 assert(eap.id == 158) 6539 assert(eap.len == 60) 6540 assert(eap.type == 43) 6541 assert(eap.haslayer(EAP_FAST)) 6542 assert(eap[EAP_FAST].L == 0) 6543 assert(eap[EAP_FAST].M == 0) 6544 assert(eap[EAP_FAST].S == 0) 6545 assert(eap[EAP_FAST].version == 1) 6546 6547 = EAP - Dissection (6) 6548 s = b'\x02\x9f\x01L+\x01\x16\x03\x01\x01\x06\x10\x00\x01\x02\x01\x00Y\xc9\x8a\tcw\t\xdcbU\xfd\x035\xcd\x1a\t\x10f&[(9\xf6\x88W`\xc6\x0f\xb3\x84\x15\x19\xf5\tk\xbd\x8fp&0\xb0\xa4B\x85\x0c<:s\xf2zT\xc3\xbd\x8a\xe4D{m\xe7\x97\xfe>\xda\x14\xb8T1{\xd7H\x9c\xa6\xcb\xe3,u\xdf\xe0\x82\xe5R\x1e<\xe5\x03}\xeb\x98\xe2\xf7\x8d3\xc6\x83\xac"\x8f\xd7\x12\xe5{:"\x84A\xd9\x14\xc2cZF\xd4\t\xab\xdar\xc7\xe0\x0e\x00o\xce\x05g\xdc?\xcc\xf7\xe83\x83E\xb3>\xe8<3-QB\xfd$C/\x1be\xcf\x03\xd6Q4\xbe\\h\xba)<\x99N\x89\xd9\xb1\xfa!\xd7a\xef\xa3\xd3o\xed8Uz\xb5k\xb0`\xfeC\xbc\xb3aS,d\xe6\xdc\x13\xa4A\x1e\x9b\r{\xd6s \xd0cQ\x95y\xc8\x1d\xc3\xd9\x87\xf2=\x81\x96q~\x99E\xc3\x97\xa8px\xe2\xc7\x92\xeb\xff/v\x84\x1e\xfb\x00\x95#\xba\xfb\xd88h\x90K\xa7\xbd9d\xb4\xf2\xf2\x14\x02vtW\xaa\xadY\x14\x03\x01\x00\x01\x01\x16\x03\x01\x000\x97\xc5l\xd6\xef\xffcM\x81\x90Q\x96\xf6\xfeX1\xf7\xfc\x84\xc6\xa0\xf6Z\xcd\xb6\xe1\xd4\xdb\x88\xf9t%Q!\xe7,~#2G-\xdf\x83\xbf\x86Q\xa2$' 6549 eap = EAP(s) 6550 assert(eap.code == 2) 6551 assert(eap.id == 159) 6552 assert(eap.len == 332) 6553 assert(eap.type == 43) 6554 assert(eap.haslayer(EAP_FAST)) 6555 assert(eap[EAP_FAST].L == 0) 6556 assert(eap[EAP_FAST].M == 0) 6557 assert(eap[EAP_FAST].S == 0) 6558 assert(eap[EAP_FAST].version == 1) 6559 6560 = EAP - Dissection (7) 6561 s = b'\x02\xf1\x00\x06\x03+' 6562 eap = EAP(s) 6563 assert(eap.code == 2) 6564 assert(eap.id == 241) 6565 assert(eap.len == 6) 6566 assert(eap.type == 3) 6567 assert(hasattr(eap, 'desired_auth_type')) 6568 assert(eap.desired_auth_type == 43) 6569 6570 = EAP - Dissection (8) 6571 s = b"\x02\x03\x01\x15\x15\x00\x16\x03\x01\x01\n\x01\x00\x01\x06\x03\x03\xd5\xd9\xd5rT\x9e\xb8\xbe,>\xcf!\xcf\xc7\x02\x8c\xb1\x1e^F\xf7\xc84\x8c\x01t4\x91[\x02\xc8/\x00\x00\x8c\xc00\xc0,\xc0(\xc0$\xc0\x14\xc0\n\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00k\x00j\x00i\x00h\x009\x008\x007\x006\x00\x88\x00\x87\x00\x86\x00\x85\xc02\xc0.\xc0*\xc0&\xc0\x0f\xc0\x05\x00\x9d\x00=\x005\x00\x84\xc0/\xc0+\xc0'\xc0#\xc0\x13\xc0\t\x00\xa4\x00\xa2\x00\xa0\x00\x9e\x00g\x00@\x00?\x00>\x003\x002\x001\x000\x00\x9a\x00\x99\x00\x98\x00\x97\x00E\x00D\x00C\x00B\xc01\xc0-\xc0)\xc0%\xc0\x0e\xc0\x04\x00\x9c\x00<\x00/\x00\x96\x00A\x00\xff\x01\x00\x00Q\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x1c\x00\x1a\x00\x17\x00\x19\x00\x1c\x00\x1b\x00\x18\x00\x1a\x00\x16\x00\x0e\x00\r\x00\x0b\x00\x0c\x00\t\x00\n\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03\x00\x0f\x00\x01\x01" 6572 eap = EAP(s) 6573 assert(eap.code == 2) 6574 assert(eap.id == 3) 6575 assert(eap.len == 277) 6576 assert(eap.type == 21) 6577 assert(eap.haslayer(EAP_TTLS)) 6578 assert(eap[EAP_TTLS].L == 0) 6579 assert(eap[EAP_TTLS].M == 0) 6580 assert(eap[EAP_TTLS].S == 0) 6581 assert(eap[EAP_TTLS].version == 0) 6582 6583 = EAP - EAP_TLS - Basic Instantiation 6584 raw(EAP_TLS()) == b'\x01\x00\x00\x06\r\x00' 6585 6586 = EAP - EAP_FAST - Basic Instantiation 6587 raw(EAP_FAST()) == b'\x01\x00\x00\x06+\x00' 6588 6589 = EAP - EAP_TTLS - Basic Instantiation 6590 raw(EAP_TTLS()) == b'\x01\x00\x00\x06\x15\x00' 6591 6592 = EAP - EAP_MD5 - Basic Instantiation 6593 raw(EAP_MD5()) == b'\x01\x00\x00\x06\x04\x00' 6594 6595 = EAP - EAP_MD5 - Request - Dissection (8) 6596 s = b'\x01\x02\x00\x16\x04\x10\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6597 eap = EAP(s) 6598 assert(eap.code == 1) 6599 assert(eap.id == 2) 6600 assert(eap.len == 22) 6601 assert(eap.type == 4) 6602 assert(eap.haslayer(EAP_MD5)) 6603 assert(eap[EAP_MD5].value_size == 16) 6604 assert(eap[EAP_MD5].value == b'\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb') 6605 assert(eap[EAP_MD5].optional_name == b'') 6606 6607 = EAP - EAP_MD5 - Response - Dissection (9) 6608 s = b'\x02\x02\x00\x16\x04\x10\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6609 eap = EAP(s) 6610 assert(eap.code == 2) 6611 assert(eap.id == 2) 6612 assert(eap.len == 22) 6613 assert(eap.type == 4) 6614 assert(eap.haslayer(EAP_MD5)) 6615 assert(eap[EAP_MD5].value_size == 16) 6616 assert(eap[EAP_MD5].value == b'\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf') 6617 assert(eap[EAP_MD5].optional_name == b'') 6618 6619 = EAP - LEAP - Basic Instantiation 6620 raw(LEAP()) == b'\x01\x00\x00\x08\x11\x01\x00\x00' 6621 6622 = EAP - LEAP - Request - Dissection (10) 6623 s = b'\x01D\x00\x1c\x11\x01\x00\x088\xb6\xd7\xa1E<!\x15supplicant-1' 6624 eap = LEAP(s) 6625 assert(eap.code == 1) 6626 assert(eap.id == 68) 6627 assert(eap.len == 28) 6628 assert(eap.type == 17) 6629 assert(eap.haslayer(LEAP)) 6630 assert(eap[LEAP].version == 1) 6631 assert(eap[LEAP].count == 8) 6632 assert(eap[LEAP].challenge_response == b'8\xb6\xd7\xa1E<!\x15') 6633 assert(eap[LEAP].username == b"supplicant-1") 6634 6635 = EAP - LEAP - Response - Dissection (11) 6636 s = b'\x02D\x00,\x11\x01\x00\x18\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95supplicant-1' 6637 eap = LEAP(s) 6638 assert(eap.code == 2) 6639 assert(eap.id == 68) 6640 assert(eap.len == 44) 6641 assert(eap.type == 17) 6642 assert(eap.haslayer(LEAP)) 6643 assert(eap[LEAP].version == 1) 6644 assert(eap[LEAP].count == 24) 6645 assert(eap[LEAP].challenge_response == b'\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95') 6646 assert(eap[LEAP].username == b"supplicant-1") 6647 6648 = EAP - Layers (1) 6649 eap = EAP_MD5() 6650 assert(EAP_MD5 in eap) 6651 assert(not EAP_TLS in eap) 6652 assert(not EAP_FAST in eap) 6653 assert(not LEAP in eap) 6654 assert(EAP in eap) 6655 eap = EAP_TLS() 6656 assert(EAP_TLS in eap) 6657 assert(not EAP_MD5 in eap) 6658 assert(not EAP_FAST in eap) 6659 assert(not LEAP in eap) 6660 assert(EAP in eap) 6661 eap = EAP_FAST() 6662 assert(EAP_FAST in eap) 6663 assert(not EAP_MD5 in eap) 6664 assert(not EAP_TLS in eap) 6665 assert(not LEAP in eap) 6666 assert(EAP in eap) 6667 eap = EAP_TTLS() 6668 assert(EAP_TTLS in eap) 6669 assert(not EAP_MD5 in eap) 6670 assert(not EAP_TLS in eap) 6671 assert(not EAP_FAST in eap) 6672 assert(not LEAP in eap) 6673 assert(EAP in eap) 6674 eap = LEAP() 6675 assert(not EAP_MD5 in eap) 6676 assert(not EAP_TLS in eap) 6677 assert(not EAP_FAST in eap) 6678 assert(LEAP in eap) 6679 assert(EAP in eap) 6680 6681 = EAP - Layers (2) 6682 eap = EAP_MD5() 6683 assert(type(eap[EAP]) == EAP_MD5) 6684 eap = EAP_TLS() 6685 assert(type(eap[EAP]) == EAP_TLS) 6686 eap = EAP_FAST() 6687 assert(type(eap[EAP]) == EAP_FAST) 6688 eap = EAP_TTLS() 6689 assert(type(eap[EAP]) == EAP_TTLS) 6690 eap = LEAP() 6691 assert(type(eap[EAP]) == LEAP) 6692 6693 6694 6695 ############ 6696 ############ 6697 + NTP module tests 6698 6699 = NTP - Layers (1) 6700 p = NTPHeader() 6701 assert(NTPHeader in p) 6702 assert(not NTPControl in p) 6703 assert(not NTPPrivate in p) 6704 assert(NTP in p) 6705 p = NTPControl() 6706 assert(not NTPHeader in p) 6707 assert(NTPControl in p) 6708 assert(not NTPPrivate in p) 6709 assert(NTP in p) 6710 p = NTPPrivate() 6711 assert(not NTPHeader in p) 6712 assert(not NTPControl in p) 6713 assert(NTPPrivate in p) 6714 assert(NTP in p) 6715 6716 6717 = NTP - Layers (2) 6718 p = NTPHeader() 6719 assert(type(p[NTP]) == NTPHeader) 6720 p = NTPControl() 6721 assert(type(p[NTP]) == NTPControl) 6722 p = NTPPrivate() 6723 assert(type(p[NTP]) == NTPPrivate) 6724 6725 6726 ############ 6727 ############ 6728 + NTPHeader tests 6729 6730 = NTPHeader - Basic checks 6731 len(raw(NTP())) == 48 6732 6733 6734 = NTPHeader - Dissection 6735 s = b"!\x0b\x06\xea\x00\x00\x00\x00\x00\x00\xf2\xc1\x7f\x7f\x01\x00\xdb9\xe8\xa21\x02\xe6\xbc\xdb9\xe8\x81\x02U8\xef\xdb9\xe8\x80\xdcl+\x06\xdb9\xe8\xa91\xcbI\xbf\x00\x00\x00\x01\xady\xf3\xa1\xe5\xfc\xd02\xd2j\x1e'\xc3\xc1\xb6\x0e" 6736 p = NTP(s) 6737 assert(isinstance(p, NTPHeader)) 6738 assert(p[NTPAuthenticator].key_id == 1) 6739 assert(bytes_hex(p[NTPAuthenticator].dgst) == b'ad79f3a1e5fcd032d26a1e27c3c1b60e') 6740 6741 6742 = NTPHeader - KoD 6743 s = b'\xe4\x00\x06\xe8\x00\x00\x00\x00\x00\x00\x02\xcaINIT\x00\x00\x00\x00\x00\x00\x00\x00\xdb@\xe3\x9eH\xa3pj\xdb@\xe3\x9eH\xf0\xc3\\\xdb@\xe3\x9eH\xfaL\xac\x00\x00\x00\x01B\x86)\xc1Q4\x8bW8\xe7Q\xda\xd0Z\xbc\xb8' 6744 p = NTP(s) 6745 assert(isinstance(p, NTPHeader)) 6746 assert(p.leap == 3) 6747 assert(p.version == 4) 6748 assert(p.mode == 4) 6749 assert(p.stratum == 0) 6750 assert(p.ref_id == b'INIT') 6751 6752 6753 = NTPHeader - Extension dissection test 6754 s = b'#\x02\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x89\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 6755 p = NTP(s) 6756 assert(isinstance(p, NTPHeader)) 6757 assert(p.leap == 0) 6758 assert(p.version == 4) 6759 assert(p.mode == 3) 6760 assert(p.stratum == 2) 6761 6762 6763 ############ 6764 ############ 6765 + NTP Control (mode 6) tests 6766 6767 = NTP Control (mode 6) - CTL_OP_READSTAT (1) - request 6768 s = b'\x16\x01\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00' 6769 p = NTP(s) 6770 assert(isinstance(p, NTPControl)) 6771 assert(p.version == 2) 6772 assert(p.mode == 6) 6773 assert(p.response == 0) 6774 assert(p.err == 0) 6775 assert(p.more == 0) 6776 assert(p.op_code == 1) 6777 assert(p.sequence == 12) 6778 assert(p.status == 0) 6779 assert(p.association_id == 0) 6780 assert(p.offset == 0) 6781 assert(p.count == 0) 6782 assert(p.data == b'') 6783 6784 6785 = NTP Control (mode 6) - CTL_OP_READSTAT (2) - response 6786 s = b'\x16\x81\x00\x0c\x06d\x00\x00\x00\x00\x00\x04\xe5\xfc\xf6$' 6787 p = NTP(s) 6788 assert(isinstance(p, NTPControl)) 6789 assert(p.version == 2) 6790 assert(p.mode == 6) 6791 assert(p.response == 1) 6792 assert(p.err == 0) 6793 assert(p.more == 0) 6794 assert(p.op_code == 1) 6795 assert(p.sequence == 12) 6796 assert(isinstance(p.status_word, NTPSystemStatusPacket)) 6797 assert(p.status_word.leap_indicator == 0) 6798 assert(p.status_word.clock_source == 6) 6799 assert(p.status_word.system_event_counter == 6) 6800 assert(p.status_word.system_event_code == 4) 6801 assert(p.association_id == 0) 6802 assert(p.offset == 0) 6803 assert(p.count == 4) 6804 assert(isinstance(p.data, NTPPeerStatusDataPacket)) 6805 assert(p.data.association_id == 58876) 6806 assert(isinstance(p.data.peer_status, NTPPeerStatusPacket)) 6807 assert(p.data.peer_status.configured == 1) 6808 assert(p.data.peer_status.auth_enabled == 1) 6809 assert(p.data.peer_status.authentic == 1) 6810 assert(p.data.peer_status.reachability == 1) 6811 assert(p.data.peer_status.reserved == 0) 6812 assert(p.data.peer_status.peer_sel == 6) 6813 assert(p.data.peer_status.peer_event_counter == 2) 6814 assert(p.data.peer_status.peer_event_code == 4) 6815 6816 6817 = NTP Control (mode 6) - CTL_OP_READVAR (1) - request 6818 s = b'\x16\x02\x00\x12\x00\x00\xfc\x8f\x00\x00\x00\x00' 6819 p = NTP(s) 6820 assert(isinstance(p, NTPControl)) 6821 assert(p.version == 2) 6822 assert(p.mode == 6) 6823 assert(p.response == 0) 6824 assert(p.op_code == 2) 6825 assert(p.sequence == 18) 6826 assert(p.status == 0) 6827 assert(p.association_id == 64655) 6828 assert(p.data == b'') 6829 6830 6831 = NTP Control (mode 6) - CTL_OP_READVAR (2) - reponse (1st packet) 6832 s = b'\xd6\xa2\x00\x12\xc0\x11\xfc\x8f\x00\x00\x01\xd4srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 ' 6833 p = NTP(s) 6834 assert(isinstance(p, NTPControl)) 6835 assert(p.version == 2) 6836 assert(p.mode == 6) 6837 assert(p.response == 1) 6838 assert(p.err == 0) 6839 assert(p.more == 1) 6840 assert(p.op_code == 2) 6841 assert(p.sequence == 18) 6842 assert(isinstance(p.status_word, NTPPeerStatusPacket)) 6843 assert(p.status_word.configured == 1) 6844 assert(p.status_word.auth_enabled == 1) 6845 assert(p.status_word.authentic == 0) 6846 assert(p.status_word.reachability == 0) 6847 assert(p.status_word.peer_sel == 0) 6848 assert(p.status_word.peer_event_counter == 1) 6849 assert(p.status_word.peer_event_code == 1) 6850 assert(p.association_id == 64655) 6851 assert(p.offset == 0) 6852 assert(p.count == 468) 6853 assert(p.data.load == b'srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 ') 6854 6855 6856 = NTP Control (mode 6) - CTL_OP_READVAR (3) - reponse (2nd packet) 6857 s = b'\xd6\x82\x00\x12\xc0\x11\xfc\x8f\x01\xd4\x00i0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00' 6858 p = NTP(s) 6859 assert(isinstance(p, NTPControl)) 6860 assert(p.version == 2) 6861 assert(p.mode == 6) 6862 assert(p.response == 1) 6863 assert(p.err == 0) 6864 assert(p.more == 0) 6865 assert(p.op_code == 2) 6866 assert(p.sequence == 18) 6867 assert(isinstance(p.status_word, NTPPeerStatusPacket)) 6868 assert(p.association_id == 64655) 6869 assert(p.offset == 468) 6870 assert(p.count == 105) 6871 assert(p.data.load == b'0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00') 6872 6873 6874 = NTP Control (mode 6) - CTL_OP_READVAR (4) - request 6875 s = b'\x16\x02\x00\x13\x00\x00s\xb5\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01=\xc2;\xc7\xed\xb9US9\xd6\x89\x08\xc8\xaf\xa6\x12' 6876 p = NTP(s) 6877 assert(isinstance(p, NTPControl)) 6878 assert(p.version == 2) 6879 assert(p.mode == 6) 6880 assert(p.response == 0) 6881 assert(p.err == 0) 6882 assert(p.more == 0) 6883 assert(p.op_code == 2) 6884 assert(len(p.data.load) == 12) 6885 assert(p.authenticator.key_id == 1) 6886 assert(bytes_hex(p.authenticator.dgst) == b'3dc23bc7edb9555339d68908c8afa612') 6887 6888 6889 = NTP Control (mode 6) - CTL_OP_READVAR (5) - response 6890 s = b'\xd6\xc2\x00\x13\x05\x00s\xb5\x00\x00\x00\x00\x00\x00\x00\x01\x97(\x02I\xdb\xa0s8\xedr(`\xdbJX\n' 6891 p = NTP(s) 6892 assert(isinstance(p, NTPControl)) 6893 assert(p.version == 2) 6894 assert(p.mode == 6) 6895 assert(p.response == 1) 6896 assert(p.err == 1) 6897 assert(p.more == 0) 6898 assert(p.op_code == 2) 6899 assert(len(p.data.load) == 0) 6900 assert(p.authenticator.key_id == 1) 6901 assert(bytes_hex(p.authenticator.dgst) == b'97280249dba07338ed722860db4a580a') 6902 6903 6904 = NTP Control (mode 6) - CTL_OP_WRITEVAR (1) - request 6905 s = b'\x16\x03\x00\x11\x00\x00\x00\x00\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01\xaf\xf1\x0c\xb4\xc9\x94m\xfcM\x90\tJ\xa1p\x94J' 6906 p = NTP(s) 6907 assert(isinstance(p, NTPControl)) 6908 assert(p.version == 2) 6909 assert(p.mode == 6) 6910 assert(p.response == 0) 6911 assert(p.err == 0) 6912 assert(p.more == 0) 6913 assert(p.op_code == 3) 6914 assert(len(p.data.load) == 12) 6915 assert(p.authenticator.key_id == 1) 6916 assert(bytes_hex(p.authenticator.dgst) == b'aff10cb4c9946dfc4d90094aa170944a') 6917 6918 6919 = NTP Control (mode 6) - CTL_OP_WRITEVAR (2) - response 6920 s = b'\xd6\xc3\x00\x11\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80z\x80\xfb\xaf\xc4pg\x98S\xa8\xe5xe\x81\x1c' 6921 p = NTP(s) 6922 assert(isinstance(p, NTPControl)) 6923 assert(p.version == 2) 6924 assert(p.mode == 6) 6925 assert(p.response == 1) 6926 assert(p.err == 1) 6927 assert(p.more == 0) 6928 assert(p.op_code == 3) 6929 assert(hasattr(p, 'status_word')) 6930 assert(isinstance(p.status_word, NTPErrorStatusPacket)) 6931 assert(p.status_word.error_code == 5) 6932 assert(len(p.data.load) == 0) 6933 assert(p.authenticator.key_id == 1) 6934 assert(bytes_hex(p.authenticator.dgst) == b'807a80fbafc470679853a8e57865811c') 6935 6936 6937 = NTP Control (mode 6) - CTL_OP_CONFIGURE (1) - request 6938 s = b'\x16\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x0ccontrolkey 1\x00\x00\x00\x01\xea\xa7\xac\xa8\x1bj\x9c\xdbX\xe1S\r6\xfb\xef\xa4' 6939 p = NTP(s) 6940 assert(isinstance(p, NTPControl)) 6941 assert(p.version == 2) 6942 assert(p.mode == 6) 6943 assert(p.response == 0) 6944 assert(p.err == 0) 6945 assert(p.more == 0) 6946 assert(p.op_code == 8) 6947 assert(p.count == 12) 6948 assert(p.data.load == b'controlkey 1') 6949 assert(p.authenticator.key_id == 1) 6950 assert(bytes_hex(p.authenticator.dgst) == b'eaa7aca81b6a9cdb58e1530d36fbefa4') 6951 6952 6953 = NTP Control (mode 6) - CTL_OP_CONFIGURE (2) - response 6954 s = b'\xd6\x88\x00\x16\x00\x00\x00\x00\x00\x00\x00\x12Config Succeeded\r\n\x00\x00\x00\x00\x00\x01\xbf\xa6\xd8_\xf9m\x1e2l)<\xac\xee\xc2\xa59' 6955 p = NTP(s) 6956 assert(isinstance(p, NTPControl)) 6957 assert(p.version == 2) 6958 assert(p.mode == 6) 6959 assert(p.response == 1) 6960 assert(p.err == 0) 6961 assert(p.more == 0) 6962 assert(p.op_code == 8) 6963 assert(p.count == 18) 6964 assert(p.data.load == b'Config Succeeded\r\n\x00\x00') 6965 assert(p.authenticator.key_id == 1) 6966 assert(bytes_hex(p.authenticator.dgst) == b'bfa6d85ff96d1e326c293caceec2a539') 6967 6968 6969 = NTP Control (mode 6) - CTL_OP_SAVECONFIG (1) - request 6970 s = b'\x16\t\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x0fntp.test.2.conf\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc9\xfb\x8a\xbe<`_\xfa6\xd2\x18\xc3\xb7d\x89#' 6971 p = NTP(s) 6972 assert(isinstance(p, NTPControl)) 6973 assert(p.version == 2) 6974 assert(p.mode == 6) 6975 assert(p.response == 0) 6976 assert(p.err == 0) 6977 assert(p.more == 0) 6978 assert(p.op_code == 9) 6979 assert(p.count == 15) 6980 assert(p.data.load == b'ntp.test.2.conf\x00') 6981 assert(p.authenticator.key_id == 1) 6982 assert(bytes_hex(p.authenticator.dgst) == b'c9fb8abe3c605ffa36d218c3b7648923') 6983 6984 6985 = NTP Control (mode 6) - CTL_OP_SAVECONFIG (2) - response 6986 s = b"\xd6\x89\x00\x1d\x00\x00\x00\x00\x00\x00\x00*Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00\x00\x00\x00\x012\xc2\xbaY\xc53\xfe(\xf5P\xe5\xa0\x86\x02\x95\xd9" 6987 p = NTP(s) 6988 assert(isinstance(p, NTPControl)) 6989 assert(p.version == 2) 6990 assert(p.mode == 6) 6991 assert(p.response == 1) 6992 assert(p.err == 0) 6993 assert(p.more == 0) 6994 assert(p.op_code == 9) 6995 assert(p.count == 42) 6996 assert(p.data.load == b"Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00") 6997 assert(p.authenticator.key_id == 1) 6998 assert(bytes_hex(p.authenticator.dgst) == b'32c2ba59c533fe28f550e5a0860295d9') 6999 7000 7001 = NTP Control (mode 6) - CTL_OP_REQ_NONCE (1) - request 7002 s = b'\x16\x0c\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00' 7003 p = NTP(s) 7004 assert(isinstance(p, NTPControl)) 7005 assert(p.version == 2) 7006 assert(p.mode == 6) 7007 assert(p.response == 0) 7008 assert(p.err == 0) 7009 assert(p.more == 0) 7010 assert(p.op_code == 12) 7011 assert(p.data == b'') 7012 assert(p.authenticator == b'') 7013 7014 7015 = NTP Control (mode 6) - CTL_OP_REQ_NONCE (2) - response 7016 s = b'\xd6\x8c\x00\x07\x00\x00\x00\x00\x00\x00\x00 nonce=db4186a2e1d9022472e24bc9\r\n' 7017 p = NTP(s) 7018 assert(isinstance(p, NTPControl)) 7019 assert(p.version == 2) 7020 assert(p.mode == 6) 7021 assert(p.response == 1) 7022 assert(p.err == 0) 7023 assert(p.more == 0) 7024 assert(p.op_code == 12) 7025 assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9\r\n') 7026 assert(p.authenticator == b'') 7027 7028 7029 = NTP Control (mode 6) - CTL_OP_READ_MRU (1) - request 7030 s = b'\x16\n\x00\x08\x00\x00\x00\x00\x00\x00\x00(nonce=db4186a2e1d9022472e24bc9, frags=32' 7031 p = NTP(s) 7032 assert(isinstance(p, NTPControl)) 7033 assert(p.version == 2) 7034 assert(p.mode == 6) 7035 assert(p.response == 0) 7036 assert(p.err == 0) 7037 assert(p.op_code == 10) 7038 assert(p.count == 40) 7039 assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9, frags=32') 7040 assert(p.authenticator == b'') 7041 7042 = NTP Control (mode 6) - CTL_OP_READ_MRU (2) - response 7043 s = b'\xd6\x8a\x00\x08\x00\x00\x00\x00\x00\x00\x00\xe9nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00' 7044 p = NTP(s) 7045 assert(isinstance(p, NTPControl)) 7046 assert(p.version == 2) 7047 assert(p.mode == 6) 7048 assert(p.response == 1) 7049 assert(p.err == 0) 7050 assert(p.op_code == 10) 7051 assert(p.count == 233) 7052 assert(p.data.load == b'nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00') 7053 assert(p.authenticator == b'') 7054 7055 7056 ############ 7057 ############ 7058 + NTP Private (mode 7) tests 7059 7060 = NTP Private (mode 7) - error - Dissection 7061 s = b'\x97\x00\x03\x1d@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7062 p = NTP(s) 7063 assert(isinstance(p, NTPPrivate)) 7064 assert(p.response == 1) 7065 assert(p.version == 2) 7066 assert(p.mode == 7) 7067 assert(p.request_code == 29) 7068 assert(p.err == 4) 7069 assert(p.nb_items == 0) 7070 assert(p.data_item_size == 0) 7071 7072 7073 = NTP Private (mode 7) - REQ_PEER_LIST (1) - request 7074 s = b'\x17\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7075 p = NTP(s) 7076 assert(isinstance(p, NTPPrivate)) 7077 assert(p.response == 0) 7078 assert(p.version == 2) 7079 assert(p.mode == 7) 7080 assert(p.request_code == 0) 7081 assert(p.nb_items == 0) 7082 assert(p.data_item_size == 0) 7083 7084 7085 = NTP Private (mode 7) - REQ_PEER_LIST (2) - response 7086 s = b'\x97\x00\x03\x00\x00\x01\x00 \x7f\x7f\x01\x00\x00{\x03\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7087 p = NTP(s) 7088 assert(isinstance(p, NTPPrivate)) 7089 assert(p.response == 1) 7090 assert(p.version == 2) 7091 assert(p.mode == 7) 7092 assert(p.request_code == 0) 7093 assert(p.nb_items == 1) 7094 assert(p.data_item_size == 32) 7095 assert(type(p.data[0]) == NTPInfoPeerList) 7096 assert(p.data[0].addr) == "127.127.1.0" 7097 assert(p.data[0].port) == 123 7098 7099 7100 = NTP Private (mode 7) - REQ_PEER_INFO (1) - request 7101 s = b'\x17\x00\x03\x02\x00\x01\x00 \xc0\xa8zf\x00{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7102 p = NTP(s) 7103 assert(isinstance(p, NTPPrivate)) 7104 assert(p.response == 0) 7105 assert(p.version == 2) 7106 assert(p.mode == 7) 7107 assert(p.request_code == 2) 7108 assert(p.nb_items == 1) 7109 assert(p.data_item_size == 32) 7110 assert(isinstance(p.req_data[0], NTPInfoPeerList)) 7111 assert(p.req_data[0].addr == "192.168.122.102") 7112 assert(p.req_data[0].port == 123) 7113 7114 7115 = NTP Private (mode 7) - REQ_PEER_INFO (2) - response 7116 s = b'\x97\x00\x03\x02\x00\x01\x01\x18\xc0\xa8zf\xc0\xa8ze\x00{\x01\x03\x01\x00\x10\x06\n\xea\x04\x00\x00\xaf"\x00"\x16\x04\xb3\x01\x00\x00\x00\x00\x00\x00\x00INIT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb<\x8d\xc5\xde\x7fB\x89\xdb<\x8d\xc5\xde\x7fB\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7117 p = NTP(s) 7118 assert(isinstance(p, NTPPrivate)) 7119 assert(p.response == 1) 7120 assert(p.version == 2) 7121 assert(p.mode == 7) 7122 assert(p.request_code == 2) 7123 assert(isinstance(p.data[0], NTPInfoPeer)) 7124 assert(p.data[0].dstaddr == "192.168.122.102") 7125 assert(p.data[0].srcaddr == "192.168.122.101") 7126 assert(p.data[0].srcport == 123) 7127 assert(p.data[0].associd == 1203) 7128 assert(p.data[0].keyid == 1) 7129 7130 7131 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (1) - request 7132 s = b'\x17\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7133 p = NTP(s) 7134 assert(isinstance(p, NTPPrivate)) 7135 assert(p.response == 0) 7136 assert(p.version == 2) 7137 assert(p.mode == 7) 7138 assert(p.request_code == 1) 7139 7140 7141 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (2) - response (1st packet) 7142 s = b'\xd7\x00\x03\x01\x00\x06\x00H\n\x00\x02\x0f\xc0\x00\x02\x01\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\x00\x02\x02\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\xa8d\x01\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\xa8d\x02\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x02\x0f\xc0\xa8d\r\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zf\x00{\x0b\x06\x07\xf4\x83\x01\x00\x00\x07\x89\x00\x00\x00\x007\xb1\x00h\x00\x00o?\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00' 7143 p = NTP(s) 7144 assert(isinstance(p, NTPPrivate)) 7145 assert(p.response == 1) 7146 assert(p.more == 1) 7147 assert(p.version == 2) 7148 assert(p.mode == 7) 7149 assert(p.request_code == 1) 7150 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data) 7151 assert(p.data[0].srcaddr == "192.0.2.1") 7152 7153 7154 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (2nd packet) 7155 s = b'\xd7\x01\x03\x01\x00\x06\x00H\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x11\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zh\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zi\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xa8ze\xc0\xa8zj\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zk\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00' 7156 p = NTP(s) 7157 7158 assert(isinstance(p, NTPPrivate)) 7159 assert(p.response == 1) 7160 assert(p.more == 1) 7161 assert(p.version == 2) 7162 assert(p.mode == 7) 7163 assert(p.request_code == 1) 7164 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data) 7165 assert(p.data[0].srcaddr == "192.168.122.103") 7166 7167 7168 = NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (3rd packet) 7169 s = b'\x97\x02\x03\x01\x00\x02\x00H\xc0\xa8ze\xc0\xa8zl\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zm\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7170 p = NTP(s) 7171 7172 assert(isinstance(p, NTPPrivate)) 7173 assert(p.response == 1) 7174 assert(p.more == 0) 7175 assert(p.version == 2) 7176 assert(p.mode == 7) 7177 assert(p.request_code == 1) 7178 assert(isinstance(x, NTPInfoPeerSummary) for x in p.data) 7179 assert(p.data[0].srcaddr == "192.168.122.108") 7180 7181 7182 = NTP Private (mode 7) - REQ_PEER_STATS (1) - request 7183 s = b'\x17\x00\x03\x03\x00\x01\x00 \xc0\xa8ze\x00{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7184 p = NTP(s) 7185 assert(isinstance(p, NTPPrivate)) 7186 assert(p.response == 0) 7187 assert(p.more == 0) 7188 assert(p.version == 2) 7189 assert(p.mode == 7) 7190 assert(p.request_code == 3) 7191 assert(isinstance(p.req_data[0], NTPInfoPeerList)) 7192 7193 7194 = NTP Private (mode 7) - REQ_PEER_STATS (2) - response 7195 s = b'\x97\x00\x03\x03\x00\x01\x00x\xc0\xa8zf\xc0\xa8ze\x00{\x00\x01\x01\x00\x10\x06\x00\x00\x00)\x00\x00\x00\x1e\x00\x02\xda|\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\nJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7196 p = NTP(s) 7197 7198 assert(isinstance(p, NTPPrivate)) 7199 assert(p.response == 1) 7200 assert(p.more == 0) 7201 assert(p.version == 2) 7202 assert(p.mode == 7) 7203 assert(p.request_code == 3) 7204 assert(isinstance(x, NTPInfoPeerStats) for x in p.data) 7205 7206 7207 = NTP Private (mode 7) - REQ_SYS_INFO (1) - request 7208 s = b'\x17\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7209 p = NTP(s) 7210 7211 assert(isinstance(p, NTPPrivate)) 7212 assert(p.response == 0) 7213 assert(p.more == 0) 7214 assert(p.version == 2) 7215 assert(p.mode == 7) 7216 assert(p.request_code == 4) 7217 7218 7219 = NTP Private (mode 7) - REQ_SYS_INFO (2) - response 7220 s = b'\x97\x00\x03\x04\x00\x01\x00P\x7f\x7f\x01\x00\x03\x00\x0b\xf0\x00\x00\x00\x00\x00\x00\x03\x06\x7f\x7f\x01\x00\xdb<\xca\xf3\xa1\x92\xe1\xf7\x06\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5' 7221 p = NTP(s) 7222 7223 assert(isinstance(p, NTPPrivate)) 7224 assert(p.response == 1) 7225 assert(p.more == 0) 7226 assert(p.version == 2) 7227 assert(p.mode == 7) 7228 assert(p.request_code == 4) 7229 assert(isinstance(p.data[0], NTPInfoSys)) 7230 assert(p.data[0].peer == "127.127.1.0") 7231 assert(p.data[0].peer_mode == 3) 7232 assert(p.data[0].leap == 0) 7233 assert(p.data[0].stratum == 11) 7234 assert(p.data[0].precision == 240) 7235 assert(p.data[0].refid == "127.127.1.0") 7236 7237 7238 = NTP Private (mode 7) - REQ_SYS_STATS (1) - request 7239 s = b'\x17\x00\x03\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7240 p = NTP(s) 7241 assert(isinstance(p, NTPPrivate)) 7242 assert(p.response == 0) 7243 assert(p.more == 0) 7244 assert(p.version == 2) 7245 assert(p.mode == 7) 7246 assert(p.request_code == 5) 7247 7248 7249 = NTP Private (mode 7) - REQ_SYS_STATS (2) - response 7250 s = b'\x97\x00\x03\x05\x00\x01\x00,\x00\x02\xe2;\x00\x02\xe2;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x0b=\x00\x00\x00\x00' 7251 p = NTP(s) 7252 assert(isinstance(p, NTPPrivate)) 7253 assert(p.response == 1) 7254 assert(p.more == 0) 7255 assert(p.version == 2) 7256 assert(p.mode == 7) 7257 assert(p.request_code == 5) 7258 assert(isinstance(p.data[0], NTPInfoSysStats)) 7259 assert(p.data[0].timeup == 188987) 7260 assert(p.data[0].received == 2877) 7261 7262 7263 = NTP Private (mode 7) - REQ_IO_STATS (1) - request 7264 s = b'\x17\x00\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7265 p = NTP(s) 7266 assert(isinstance(p, NTPPrivate)) 7267 assert(p.response == 0) 7268 assert(p.more == 0) 7269 assert(p.version == 2) 7270 assert(p.mode == 7) 7271 assert(p.request_code == 6) 7272 7273 7274 = NTP Private (mode 7) - REQ_IO_STATS (2) - response 7275 s = b'\x97\x00\x03\x06\x00\x01\x00(\x00\x00\x03\x04\x00\n\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00J' 7276 p = NTP(s) 7277 assert(isinstance(p, NTPPrivate)) 7278 assert(p.response == 1) 7279 assert(p.more == 0) 7280 assert(p.version == 2) 7281 assert(p.mode == 7) 7282 assert(p.request_code == 6) 7283 assert(p.data[0].timereset == 772) 7284 assert(p.data[0].sent == 217) 7285 7286 7287 = NTP Private (mode 7) - REQ_MEM_STATS (1) - request 7288 s = b'\x17\x00\x03\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7289 p = NTP(s) 7290 assert(isinstance(p, NTPPrivate)) 7291 assert(p.response == 0) 7292 assert(p.more == 0) 7293 assert(p.version == 2) 7294 assert(p.mode == 7) 7295 assert(p.request_code == 7) 7296 7297 7298 = NTP Private (mode 7) - REQ_MEM_STATS (2) - response 7299 s = b'\x97\x00\x03\x07\x00\x01\x00\x94\x00\x00\n\xee\x00\x0f\x00\r\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7300 p = NTP(s) 7301 assert(isinstance(p, NTPPrivate)) 7302 assert(p.response == 1) 7303 assert(p.more == 0) 7304 assert(p.version == 2) 7305 assert(p.mode == 7) 7306 assert(p.request_code == 7) 7307 assert(p.data[0].timereset == 2798) 7308 assert(p.data[0].totalpeermem == 15) 7309 assert(p.data[0].freepeermem == 13) 7310 assert(p.data[0].findpeer_calls == 60) 7311 assert(p.data[0].hashcount[25] == 1 and p.data[0].hashcount[89] == 1) 7312 7313 7314 = NTP Private (mode 7) - REQ_LOOP_INFO (1) - request 7315 s = b'\x17\x00\x03\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7316 p = NTP(s) 7317 assert(isinstance(p, NTPPrivate)) 7318 assert(p.response == 0) 7319 assert(p.more == 0) 7320 assert(p.version == 2) 7321 assert(p.mode == 7) 7322 assert(p.request_code == 8) 7323 7324 7325 = NTP Private (mode 7) - REQ_LOOP_INFO (2) - response 7326 s = b'\x97\x00\x03\x08\x00\x01\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04' 7327 p = NTP(s) 7328 assert(isinstance(p, NTPPrivate)) 7329 assert(p.response == 1) 7330 assert(p.more == 0) 7331 assert(p.version == 2) 7332 assert(p.mode == 7) 7333 assert(p.request_code == 8) 7334 assert(p.data[0].last_offset == 0.0) 7335 assert(p.data[0].watchdog_timer == 4) 7336 7337 7338 7339 = NTP Private (mode 7) - REQ_TIMER_STATS (1) - request 7340 s = b'\x17\x00\x03\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7341 p = NTP(s) 7342 assert(isinstance(p, NTPPrivate)) 7343 assert(p.response == 0) 7344 assert(p.more == 0) 7345 assert(p.version == 2) 7346 assert(p.mode == 7) 7347 assert(p.request_code == 9) 7348 7349 7350 = NTP Private (mode 7) - REQ_TIMER_STATS (2) - response 7351 s = b'\x97\x00\x03\t\x00\x01\x00\x10\x00\x00\x01h\x00\x00\x01h\x00\x00\x00\x00\x00\x00\x00\x00' 7352 p = NTP(s) 7353 assert(isinstance(p, NTPPrivate)) 7354 assert(p.response == 1) 7355 assert(p.more == 0) 7356 assert(p.version == 2) 7357 assert(p.mode == 7) 7358 assert(p.request_code == 9) 7359 assert(p.data[0].timereset == 360) 7360 assert(p.data[0].alarms == 360) 7361 7362 7363 = NTP Private (mode 7) - REQ_CONFIG (1) - request 7364 s = b'\x17\x80\x03\n\x00\x01\x00\xa8\xc0\xa8zm\x01\x03\x06\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xec\x93\xb1\xa8\xa0a\x00\x00\x00\x01Z\xba\xfe\x01\x1cr\x05d\xa1\x14\xb1)\xe9vD\x8d' 7365 p = NTP(s) 7366 assert(isinstance(p, NTPPrivate)) 7367 assert(p.response == 0) 7368 assert(p.more == 0) 7369 assert(p.version == 2) 7370 assert(p.mode == 7) 7371 assert(p.request_code == 10) 7372 assert(p.nb_items == 1) 7373 assert(p.data_item_size == 168) 7374 assert(hasattr(p, 'req_data')) 7375 assert(isinstance(p.req_data[0], NTPConfPeer)) 7376 assert(p.req_data[0].peeraddr == "192.168.122.109") 7377 assert(p.req_data[0].hmode == 1) 7378 assert(p.req_data[0].version == 3) 7379 assert(p.req_data[0].minpoll == 6) 7380 assert(p.req_data[0].maxpoll == 10) 7381 assert(hasattr(p, 'authenticator')) 7382 assert(p.authenticator.key_id == 1) 7383 assert(bytes_hex(p.authenticator.dgst) == b'5abafe011c720564a114b129e976448d') 7384 7385 7386 = NTP Private (mode 7) - REQ_CONFIG (2) - response 7387 s = b'\x97\x00\x03\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7388 p = NTP(s) 7389 assert(isinstance(p, NTPPrivate)) 7390 assert(p.response == 1) 7391 assert(p.more == 0) 7392 assert(p.version == 2) 7393 assert(p.mode == 7) 7394 assert(p.auth == 0) 7395 assert(p.request_code == 10) 7396 assert(p.err == 0) 7397 assert(p.nb_items == 0) 7398 assert(p.data_item_size == 0) 7399 7400 7401 = NTP Private (mode 7) - REQ_UNCONFIG (1) - request 7402 s = b'\x17\x80\x03\x0b\x00\x01\x00\x18\xc0\xa8zk\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0\x1bq\xc8\xe5\xa6\x00\x00\x00\x01\x1dM;\xfeZ~]Z\xe3Ea\x92\x9aE\xd8%' 7403 p = NTP(s) 7404 assert(isinstance(p, NTPPrivate)) 7405 assert(p.response == 0) 7406 assert(p.more == 0) 7407 assert(p.version == 2) 7408 assert(p.mode == 7) 7409 assert(p.request_code == 11) 7410 assert(p.nb_items == 1) 7411 assert(p.data_item_size == 24) 7412 assert(hasattr(p, 'req_data')) 7413 assert(isinstance(p.req_data[0], NTPConfUnpeer)) 7414 assert(p.req_data[0].peeraddr == "192.168.122.107") 7415 assert(p.req_data[0].v6_flag == 0) 7416 assert(hasattr(p, 'authenticator')) 7417 assert(p.authenticator.key_id == 1) 7418 assert(bytes_hex(p.authenticator.dgst) == b'1d4d3bfe5a7e5d5ae34561929a45d825') 7419 7420 7421 = NTP Private (mode 7) - REQ_UNCONFIG (2) - response 7422 s = b'\x97\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7423 p = NTP(s) 7424 assert(isinstance(p, NTPPrivate)) 7425 assert(p.response == 1) 7426 assert(p.more == 0) 7427 assert(p.version == 2) 7428 assert(p.mode == 7) 7429 assert(p.auth == 0) 7430 assert(p.request_code == 11) 7431 assert(p.err == 0) 7432 assert(p.nb_items == 0) 7433 assert(p.data_item_size == 0) 7434 7435 7436 = NTP Private (mode 7) - REQ_RESADDFLAGS (1) - request 7437 s = b'\x17\x80\x03\x11\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0V\xa9"\xe6_\x00\x00\x00\x01>=\xb70Tp\xee\xae\xe1\xad4b\xef\xe3\x80\xc8' 7438 p = NTP(s) 7439 assert(isinstance(p, NTPPrivate)) 7440 assert(p.response == 0) 7441 assert(p.more == 0) 7442 assert(p.version == 2) 7443 assert(p.mode == 7) 7444 assert(p.request_code == 17) 7445 assert(p.nb_items == 1) 7446 assert(p.data_item_size == 48) 7447 assert(hasattr(p, 'req_data')) 7448 assert(isinstance(p.req_data[0], NTPConfRestrict)) 7449 assert(p.req_data[0].addr == "192.168.122.105") 7450 assert(p.req_data[0].mask == "255.255.255.255") 7451 assert(hasattr(p, 'authenticator')) 7452 assert(p.authenticator.key_id == 1) 7453 assert(bytes_hex(p.authenticator.dgst) == b'3e3db7305470eeaee1ad3462efe380c8') 7454 7455 7456 = NTP Private (mode 7) - REQ_RESSUBFLAGS (1) - request 7457 s = b'\x17\x80\x03\x12\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x00\x10\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0F\xe0C\xa9@\x00\x00\x00\x01>e\r\xdf\xdb\x1e1h\xd0\xca)L\x07k\x90\n' 7458 p = NTP(s) 7459 assert(isinstance(p, NTPPrivate)) 7460 assert(p.response == 0) 7461 assert(p.more == 0) 7462 assert(p.version == 2) 7463 assert(p.mode == 7) 7464 assert(p.request_code == 18) 7465 assert(p.nb_items == 1) 7466 assert(p.data_item_size == 48) 7467 assert(hasattr(p, 'req_data')) 7468 assert(isinstance(p.req_data[0], NTPConfRestrict)) 7469 assert(p.req_data[0].addr == "192.168.122.105") 7470 assert(p.req_data[0].mask == "255.255.255.255") 7471 assert(hasattr(p, 'authenticator')) 7472 assert(p.authenticator.key_id == 1) 7473 assert(bytes_hex(p.authenticator.dgst) == b'3e650ddfdb1e3168d0ca294c076b900a') 7474 7475 7476 = NTP Private (mode 7) - REQ_RESET_PEER (1) - request 7477 s = b"\x17\x80\x03\x16\x00\x01\x00\x18\xc0\xa8zf\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xef!\x99\x88\xa3\xf1\x00\x00\x00\x01\xb1\xff\xe8\xefB=\xa9\x96\xdc\xe3\x13'\xb3\xfc\xc2\xf5" 7478 p = NTP(s) 7479 assert(isinstance(p, NTPPrivate)) 7480 assert(p.response == 0) 7481 assert(p.more == 0) 7482 assert(p.version == 2) 7483 assert(p.mode == 7) 7484 assert(p.request_code == 22) 7485 assert(p.nb_items == 1) 7486 assert(p.data_item_size == 24) 7487 assert(hasattr(p, 'req_data')) 7488 assert(isinstance(p.req_data[0], NTPConfUnpeer)) 7489 assert(p.req_data[0].peeraddr == "192.168.122.102") 7490 assert(p.req_data[0].v6_flag == 0) 7491 7492 7493 = NTP Private (mode 7) - REQ_AUTHINFO (1) - response 7494 s = b'\x97\x00\x03\x1c\x00\x01\x00$\x00\x00\x01\xdd\x00\x00\x00\x02\x00\x00\x00\n\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\x01' 7495 p = NTP(s) 7496 assert(isinstance(p, NTPPrivate)) 7497 assert(p.response == 1) 7498 assert(p.more == 0) 7499 assert(p.version == 2) 7500 assert(p.mode == 7) 7501 assert(p.auth == 0) 7502 assert(p.request_code == 28) 7503 assert(p.err == 0) 7504 assert(p.nb_items == 1) 7505 assert(p.data_item_size == 36) 7506 assert(hasattr(p, 'data')) 7507 assert(isinstance(p.data[0], NTPInfoAuth)) 7508 assert(p.data[0].timereset == 477) 7509 assert(p.data[0].numkeys == 2) 7510 assert(p.data[0].numfreekeys == 10) 7511 assert(p.data[0].keylookups == 96) 7512 assert(p.data[0].keynotfound == 0) 7513 assert(p.data[0].encryptions == 9) 7514 assert(p.data[0].decryptions == 47) 7515 assert(p.data[0].expired == 0) 7516 assert(p.data[0].keyuncached == 1) 7517 7518 7519 = NTP Private (mode 7) - REQ_ADD_TRAP (1) - request 7520 s = b'\x17\x80\x03\x1e\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xedB\xdd\xda\x7f\x97\x00\x00\x00\x01b$\xb8IM.\xa61\xd0\x85I\x8f\xa7\'\x89\x92' 7521 p = NTP(s) 7522 assert(isinstance(p, NTPPrivate)) 7523 assert(p.response == 0) 7524 assert(p.more == 0) 7525 assert(p.version == 2) 7526 assert(p.mode == 7) 7527 assert(p.auth == 1) 7528 assert(p.request_code == 30) 7529 assert(p.err == 0) 7530 assert(p.nb_items == 1) 7531 assert(hasattr(p, 'req_data')) 7532 assert(isinstance(p.req_data[0], NTPConfTrap)) 7533 assert(p.req_data[0].trap_address == '192.0.2.3') 7534 assert(hasattr(p, 'authenticator')) 7535 assert(p.authenticator.key_id == 1) 7536 assert(bytes_hex(p.authenticator.dgst) == b'6224b8494d2ea631d085498fa7278992') 7537 7538 7539 = NTP Private (mode 7) - REQ_ADD_TRAP (2) - response 7540 s = b'\x97\x00\x03\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7541 p = NTP(s) 7542 assert(isinstance(p, NTPPrivate)) 7543 assert(p.response == 1) 7544 assert(p.more == 0) 7545 assert(p.version == 2) 7546 assert(p.mode == 7) 7547 assert(p.auth == 0) 7548 assert(p.request_code == 30) 7549 assert(p.err == 0) 7550 assert(p.nb_items == 0) 7551 assert(p.data_item_size == 0) 7552 7553 7554 = NTP Private (mode 7) - REQ_CLR_TRAP (1) - request 7555 s = b'\x17\x80\x03\x1f\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xedb\xb3\x18\x1c\x00\x00\x00\x00\x01\xa5_V\x9e\xb8qD\x92\x1b\x1c>Z\xad]*\x89' 7556 p = NTP(s) 7557 assert(isinstance(p, NTPPrivate)) 7558 assert(p.response == 0) 7559 assert(p.more == 0) 7560 assert(p.version == 2) 7561 assert(p.mode == 7) 7562 assert(p.auth == 1) 7563 assert(p.request_code == 31) 7564 assert(p.err == 0) 7565 assert(p.nb_items == 1) 7566 assert(hasattr(p, 'req_data')) 7567 assert(isinstance(p.req_data[0], NTPConfTrap)) 7568 assert(p.req_data[0].trap_address == '192.0.2.3') 7569 assert(hasattr(p, 'authenticator')) 7570 assert(p.authenticator.key_id == 1) 7571 assert(bytes_hex(p.authenticator.dgst) == b'a55f569eb87144921b1c3e5aad5d2a89') 7572 7573 7574 = NTP Private (mode 7) - REQ_CLR_TRAP (2) - response 7575 s = b'\x97\x00\x03\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7576 p = NTP(s) 7577 assert(isinstance(p, NTPPrivate)) 7578 assert(p.response == 1) 7579 assert(p.more == 0) 7580 assert(p.version == 2) 7581 assert(p.mode == 7) 7582 assert(p.auth == 0) 7583 assert(p.request_code == 31) 7584 assert(p.err == 0) 7585 assert(p.nb_items == 0) 7586 assert(p.data_item_size == 0) 7587 7588 7589 = NTP Private (mode 7) - REQ_GET_CTLSTATS - response 7590 s = b'\x97\x00\x03"\x00\x01\x00<\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7591 p = NTP(s) 7592 assert(isinstance(p, NTPPrivate)) 7593 assert(p.response == 1) 7594 assert(p.more == 0) 7595 assert(p.version == 2) 7596 assert(p.mode == 7) 7597 assert(p.auth == 0) 7598 assert(p.request_code == 34) 7599 assert(p.nb_items == 1) 7600 assert(p.data_item_size == 60) 7601 assert(type(p.data[0]) == NTPInfoControl) 7602 assert(p.data[0].ctltimereset == 237) 7603 7604 7605 = NTP Private (mode 7) - REQ_GET_KERNEL (1) - request 7606 s = b'\x17\x00\x03&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7607 p = NTP(s) 7608 assert(isinstance(p, NTPPrivate)) 7609 assert(p.response == 0) 7610 assert(p.more == 0) 7611 assert(p.version == 2) 7612 assert(p.mode == 7) 7613 assert(p.auth == 0) 7614 assert(p.request_code == 38) 7615 assert(p.nb_items == 0) 7616 assert(p.data_item_size == 0) 7617 7618 7619 = NTP Private (mode 7) - REQ_GET_KERNEL (2) - response 7620 s = b'\x97\x00\x03&\x00\x01\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4$\x00\x00\xf4$\x00 A\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7621 p = NTP(s) 7622 assert(isinstance(p, NTPPrivate)) 7623 assert(p.response == 1) 7624 assert(p.more == 0) 7625 assert(p.version == 2) 7626 assert(p.mode == 7) 7627 assert(p.auth == 0) 7628 assert(p.request_code == 38) 7629 assert(p.nb_items == 1) 7630 assert(p.data_item_size == 60) 7631 assert(isinstance(p.data[0], NTPInfoKernel)) 7632 assert(p.data[0].maxerror == 16000000) 7633 assert(p.data[0].esterror == 16000000) 7634 assert(p.data[0].status == 8257) 7635 assert(p.data[0].constant == 3) 7636 assert(p.data[0].precision == 1) 7637 assert(p.data[0].tolerance == 32768000) 7638 7639 7640 7641 = NTP Private (mode 7) - REQ_MON_GETLIST_1 (1) - request 7642 s = b'\x17\x00\x03*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7643 p = NTP(s) 7644 assert(isinstance(p, NTPPrivate)) 7645 assert(p.response == 0) 7646 assert(p.more == 0) 7647 assert(p.version == 2) 7648 assert(p.mode == 7) 7649 assert(p.request_code == 42) 7650 assert(p.nb_items == 0) 7651 assert(p.data_item_size == 0) 7652 7653 7654 = NTP Private (mode 7) - REQ_MON_GETLIST_1 (2) - response 7655 s = b'\xd7\x00\x03*\x00\x06\x00H\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x94mw\xe9\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x13\xb6\xa9J\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbb]\x81\xea\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xfc\xbf\xd5a\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbe\x10x\xa8\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xde[ng\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 7656 p = NTP(s) 7657 assert(isinstance(p, NTPPrivate)) 7658 assert(p.response == 1) 7659 assert(p.more == 1) 7660 assert(p.version == 2) 7661 assert(p.mode == 7) 7662 assert(p.request_code == 42) 7663 assert(p.nb_items == 6) 7664 assert(p.data_item_size == 72) 7665 7666 7667 = NTP Private (mode 7) - REQ_IF_STATS (1) - request 7668 s = b'\x17\x80\x03,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xeb\xdd\x8cH\xefe\x00\x00\x00\x01\x8b\xfb\x90u\xa8ad\xe8\x87\xca\xbf\x96\xd2\x9d\xddI' 7669 p = NTP(s) 7670 assert(isinstance(p, NTPPrivate)) 7671 assert(p.response == 0) 7672 assert(p.more == 0) 7673 assert(p.version == 2) 7674 assert(p.mode == 7) 7675 assert(p.auth == 1) 7676 assert(p.request_code == 44) 7677 assert(p.nb_items == 0) 7678 assert(p.data_item_size == 0) 7679 assert(hasattr(p, 'authenticator')) 7680 assert(p.authenticator.key_id == 1) 7681 assert(bytes_hex(p.authenticator.dgst) == b'8bfb9075a86164e887cabf96d29ddd49') 7682 7683 7684 = NTP Private (mode 7) - REQ_IF_STATS (2) - response 7685 s = b"\xd7\x00\x03,\x00\x03\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x01lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xe3\x81r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xa0\x1d\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00" 7686 p = NTP(s) 7687 assert(isinstance(p, NTPPrivate)) 7688 assert(p.response == 1) 7689 assert(p.more == 1) 7690 assert(p.version == 2) 7691 assert(p.mode == 7) 7692 assert(p.auth == 0) 7693 assert(p.request_code == 44) 7694 assert(p.err == 0) 7695 assert(p.nb_items == 3) 7696 assert(p.data_item_size == 136) 7697 assert(isinstance(p.data[0], NTPInfoIfStatsIPv6)) 7698 assert(p.data[0].unaddr == "::1") 7699 assert(p.data[0].unmask == "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") 7700 assert(p.data[0].ifname.startswith(b"lo")) 7701 7702 7703 = NTP Private (mode 7) - REQ_IF_STATS (3) - response 7704 s = b'\xd7\x01\x03,\x00\x03\x00\x88\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00' 7705 p = NTP(s) 7706 assert(isinstance(p, NTPPrivate)) 7707 assert(p.response == 1) 7708 assert(p.more == 1) 7709 assert(p.version == 2) 7710 assert(p.mode == 7) 7711 assert(p.auth == 0) 7712 assert(p.request_code == 44) 7713 assert(p.err == 0) 7714 assert(p.nb_items == 3) 7715 assert(p.data_item_size == 136) 7716 assert(isinstance(p.data[0], NTPInfoIfStatsIPv4)) 7717 assert(p.data[0].unaddr == "192.168.122.101") 7718 assert(p.data[0].unmask == "255.255.255.0") 7719 assert(p.data[0].ifname.startswith(b"eth1")) 7720 7721 7722 = NTP Private (mode 7) - REQ_IF_RELOAD (1) - request 7723 s = b'\x17\x80\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xed\xa3\xdc\x7f\xc6\x11\x00\x00\x00\x01\xfb>\x96*\xe7O\xf7\x8feh\xd4\x07L\xc0\x08\xcb' 7724 p = NTP(s) 7725 assert(isinstance(p, NTPPrivate)) 7726 assert(p.response == 0) 7727 assert(p.more == 0) 7728 assert(p.version == 2) 7729 assert(p.mode == 7) 7730 assert(p.auth == 1) 7731 assert(p.request_code == 45) 7732 assert(p.nb_items == 0) 7733 assert(p.data_item_size == 0) 7734 assert(hasattr(p, 'authenticator')) 7735 assert(p.authenticator.key_id == 1) 7736 assert(bytes_hex(p.authenticator.dgst) == b'fb3e962ae74ff78f6568d4074cc008cb') 7737 7738 7739 = NTP Private (mode 7) - REQ_IF_RELOAD (2) - response 7740 s = b'\xd7\x00\x03-\x00\x03\x00\x88\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x02\x00\x01\x00\x00\x00\x00\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\t\x00\x02\x00\x01\x00\x00\x00\x00' 7741 p = NTP(s) 7742 assert(isinstance(p, NTPPrivate)) 7743 assert(p.response == 1) 7744 assert(p.more == 1) 7745 assert(p.version == 2) 7746 assert(p.mode == 7) 7747 assert(p.auth == 0) 7748 assert(p.request_code == 45) 7749 assert(p.err == 0) 7750 assert(p.nb_items == 3) 7751 assert(p.data_item_size == 136) 7752 assert(isinstance(p.data[0], NTPInfoIfStatsIPv4)) 7753 assert(p.data[0].unaddr == "127.0.0.1") 7754 assert(p.data[0].unmask == "255.0.0.0") 7755 assert(p.data[0].ifname.startswith(b"lo")) 7756 7757 7758 ############ 7759 ############ 7760 + VXLAN layer 7761 7762 = Build a VXLAN packet with VNI of 42 7763 raw(UDP(sport=1024, dport=4789, len=None, chksum=None)/VXLAN(flags=0x08, vni=42)) == b'\x04\x00\x12\xb5\x00\x10\x00\x00\x08\x00\x00\x00\x00\x00\x2a\x00' 7764 7765 = Verify VXLAN Ethernet Binding 7766 pkt = VXLAN(raw(VXLAN(vni=23)/Ether(dst="11:11:11:11:11:11", src="11:11:11:11:11:11", type=0x800))) 7767 pkt.flags.NextProtocol and pkt.NextProtocol == 3 7768 7769 = Verify UDP dport overloading 7770 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") 7771 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) 7772 p /= VXLAN(flags=0x8, vni=42) / Ether() / IP() 7773 p = Ether(raw(p)) 7774 assert(p[UDP].dport == 4789) 7775 assert(p[Ether:2].type == 0x800) 7776 7777 = Build a VXLAN packet with next protocol field 7778 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") 7779 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) 7780 p /= VXLAN(flags=0xC, vni=42, NextProtocol=3) / Ether() / IP() 7781 p = Ether(raw(p)) 7782 assert(p[UDP].dport == 4789) 7783 assert(p[VXLAN].reserved0 == 0x0) 7784 assert(p[VXLAN].NextProtocol == 3) 7785 assert(p[Ether:2].type == 0x800) 7786 7787 = Build a VXLAN packet with no group policy ID 7788 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") 7789 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) 7790 p /= VXLAN(flags=0x8, vni=42) / Ether() / IP() 7791 p = Ether(raw(p)) 7792 assert(p[VXLAN].reserved1 == 0x0) 7793 assert(p[VXLAN].gpid is None) 7794 assert(p[Ether:2].type == 0x800) 7795 7796 = Build a VXLAN packet with group policy ID = 42 7797 p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") 7798 p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) 7799 p /= VXLAN(flags=0x88, gpid=42, vni=42) / Ether() / IP() 7800 p = Ether(raw(p)) 7801 assert(p[VXLAN].gpid == 42) 7802 assert(p[VXLAN].reserved1 is None) 7803 assert(p[Ether:2].type == 0x800) 7804 7805 7806 ############ 7807 ############ 7808 ############ 7809 + Tests of StreamSocket 7810 7811 = Test with DNS over TCP 7812 ~ netaccess 7813 7814 import socket 7815 sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7816 sck.connect(("8.8.8.8", 53)) 7817 7818 class DNSTCP(Packet): 7819 name = "DNS over TCP" 7820 fields_desc = [ FieldLenField("len", None, fmt="!H", length_of="dns"), 7821 PacketLenField("dns", 0, DNS, length_from=lambda p: p.len)] 7822 7823 ssck = StreamSocket(sck) 7824 ssck.basecls = DNSTCP 7825 7826 r = ssck.sr1(DNSTCP(dns=DNS(rd=1, qd=DNSQR(qname="www.example.com")))) 7827 sck.close() 7828 assert(DNSTCP in r and len(r.dns.an)) 7829 7830 ############ 7831 + Tests of SSLStreamContext 7832 7833 = Test with recv() calls that return exact packet-length rawings 7834 ~ sslraweamsocket 7835 7836 import socket 7837 class MockSocket(object): 7838 def __init__(self): 7839 self.l = [ b'\x00\x00\x00\x01', b'\x00\x00\x00\x02', b'\x00\x00\x00\x03' ] 7840 def recv(self, x): 7841 if len(self.l) == 0: 7842 raise socket.error(100, 'EOF') 7843 return self.l.pop(0) 7844 7845 class TestPacket(Packet): 7846 name = 'TestPacket' 7847 fields_desc = [ 7848 IntField('data', 0) 7849 ] 7850 def guess_payload_class(self, p): 7851 return conf.padding_layer 7852 7853 s = MockSocket() 7854 ss = SSLStreamSocket(s, basecls=TestPacket) 7855 7856 p = ss.recv() 7857 assert(p.data == 1) 7858 p = ss.recv() 7859 assert(p.data == 2) 7860 p = ss.recv() 7861 assert(p.data == 3) 7862 try: 7863 ss.recv() 7864 ret = False 7865 except socket.error: 7866 ret = True 7867 7868 assert(ret) 7869 7870 = Test with recv() calls that return twice as much data as the exact packet-length 7871 ~ sslraweamsocket 7872 7873 import socket 7874 class MockSocket(object): 7875 def __init__(self): 7876 self.l = [ b'\x00\x00\x00\x01\x00\x00\x00\x02', b'\x00\x00\x00\x03\x00\x00\x00\x04' ] 7877 def recv(self, x): 7878 if len(self.l) == 0: 7879 raise socket.error(100, 'EOF') 7880 return self.l.pop(0) 7881 7882 class TestPacket(Packet): 7883 name = 'TestPacket' 7884 fields_desc = [ 7885 IntField('data', 0) 7886 ] 7887 def guess_payload_class(self, p): 7888 return conf.padding_layer 7889 7890 s = MockSocket() 7891 ss = SSLStreamSocket(s, basecls=TestPacket) 7892 7893 p = ss.recv() 7894 assert(p.data == 1) 7895 p = ss.recv() 7896 assert(p.data == 2) 7897 p = ss.recv() 7898 assert(p.data == 3) 7899 p = ss.recv() 7900 assert(p.data == 4) 7901 try: 7902 ss.recv() 7903 ret = False 7904 except socket.error: 7905 ret = True 7906 7907 assert(ret) 7908 7909 = Test with recv() calls that return not enough data 7910 ~ sslraweamsocket 7911 7912 import socket 7913 class MockSocket(object): 7914 def __init__(self): 7915 self.l = [ b'\x00\x00', b'\x00\x01', b'\x00\x00\x00', b'\x02', b'\x00\x00', b'\x00', b'\x03' ] 7916 def recv(self, x): 7917 if len(self.l) == 0: 7918 raise socket.error(100, 'EOF') 7919 return self.l.pop(0) 7920 7921 class TestPacket(Packet): 7922 name = 'TestPacket' 7923 fields_desc = [ 7924 IntField('data', 0) 7925 ] 7926 def guess_payload_class(self, p): 7927 return conf.padding_layer 7928 7929 s = MockSocket() 7930 ss = SSLStreamSocket(s, basecls=TestPacket) 7931 7932 try: 7933 p = ss.recv() 7934 ret = False 7935 except: 7936 ret = True 7937 7938 assert(ret) 7939 p = ss.recv() 7940 assert(p.data == 1) 7941 try: 7942 p = ss.recv() 7943 ret = False 7944 except: 7945 ret = True 7946 7947 assert(ret) 7948 p = ss.recv() 7949 assert(p.data == 2) 7950 try: 7951 p = ss.recv() 7952 ret = False 7953 except: 7954 ret = True 7955 7956 assert(ret) 7957 try: 7958 p = ss.recv() 7959 ret = False 7960 except: 7961 ret = True 7962 7963 assert(ret) 7964 p = ss.recv() 7965 assert(p.data == 3) 7966 7967 7968 ############ 7969 ############ 7970 + Test correct conversion from binary to rawing of IPv6 addresses 7971 7972 = IPv6 bin to rawing conversion 7973 from scapy.pton_ntop import _inet6_ntop, inet_ntop 7974 import socket 7975 for binfrm, address in [ 7976 (b'\x00' * 16, '::'), 7977 (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88', 7978 '1111:2222:3333:4444:5555:6666:7777:8888'), 7979 (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x00\x00\x00\x00\x00\x00', 7980 '1111:2222:3333:4444:5555::'), 7981 (b'\x00\x00\x00\x00\x00\x00\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88', 7982 '::4444:5555:6666:7777:8888'), 7983 (b'\x00\x00\x00\x00\x33\x33\x44\x44\x00\x00\x00\x00\x00\x00\x88\x88', 7984 '0:0:3333:4444::8888'), 7985 (b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 7986 '1::'), 7987 (b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', 7988 '::1'), 7989 (b'\x11\x11\x00\x00\x00\x00\x44\x44\x00\x00\x00\x00\x77\x77\x88\x88', 7990 '1111::4444:0:0:7777:8888'), 7991 (b'\x10\x00\x02\x00\x00\x30\x00\x04\x00\x05\x00\x60\x07\x00\x80\x00', 7992 '1000:200:30:4:5:60:700:8000'), 7993 ]: 7994 addr1 = inet_ntop(socket.AF_INET6, binfrm) 7995 addr2 = _inet6_ntop(binfrm) 7996 assert address == addr1 == addr2 7997 7998 = IPv6 bin to rawing conversion - Zero-block of length 1 7999 binfrm = b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x00\x00\x88\x88' 8000 addr1, addr2 = inet_ntop(socket.AF_INET6, binfrm), _inet6_ntop(binfrm) 8001 # On Mac OS socket.inet_ntop is not fully compliant with RFC 5952 and 8002 # shortens the single zero block to '::'. This is a valid IPv6 address 8003 # representation anyway. 8004 assert(addr1 in ['1111:2222:3333:4444:5555:6666:0:8888', 8005 '1111:2222:3333:4444:5555:6666::8888']) 8006 assert(addr2 == '1111:2222:3333:4444:5555:6666:0:8888') 8007 8008 = IPv6 bin to rawing conversion - Illegal sizes 8009 for binfrm in ["\x00" * 15, b"\x00" * 17]: 8010 rc = False 8011 try: 8012 inet_ntop(socket.AF_INET6, binfrm) 8013 except Exception as exc1: 8014 _exc1 = exc1 8015 rc = True 8016 assert rc 8017 try: 8018 _inet6_ntop(binfrm) 8019 except Exception as exc2: 8020 rc = isinstance(exc2, type(_exc1)) 8021 assert rc 8022 8023 8024 ############ 8025 ############ 8026 + VRRP tests 8027 8028 = VRRP - build 8029 s = raw(IP()/VRRP()) 8030 s == b'E\x00\x00$\x00\x01\x00\x00@p|g\x7f\x00\x00\x01\x7f\x00\x00\x01!\x01d\x00\x00\x01z\xfd\x00\x00\x00\x00\x00\x00\x00\x00' 8031 8032 = VRRP - dissection 8033 p = IP(s) 8034 VRRP in p and p[VRRP].chksum == 0x7afd 8035 8036 = VRRP - chksums 8037 # VRRPv3 8038 p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRPv3(priority=254,vrid=2,version=3,adv=1,addrlist=["20.0.1.2","20.0.1.3"]) 8039 a = Ether(raw(p)) 8040 assert a[VRRPv3].chksum == 0xb25e 8041 # VRRPv1 8042 p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRP(priority=254,vrid=2,version=1,adv=1,addrlist=["20.0.1.2","20.0.1.3"]) 8043 b = Ether(raw(p)) 8044 assert b[VRRP].chksum == 0xc6f4 8045 8046 ############ 8047 ############ 8048 + L2TP tests 8049 8050 = L2TP - build 8051 s = raw(IP()/UDP()/L2TP()) 8052 s == b'E\x00\x00"\x00\x01\x00\x00@\x11|\xc8\x7f\x00\x00\x01\x7f\x00\x00\x01\x06\xa5\x06\xa5\x00\x0e\xf4\x83\x00\x02\x00\x00\x00\x00' 8053 8054 = L2TP - dissection 8055 p = IP(s) 8056 L2TP in p and len(p[L2TP]) == 6 and p.tunnel_id == 0 and p.session_id == 0 and p[UDP].chksum == 0xf483 8057 8058 8059 ############ 8060 ############ 8061 + HSRP tests 8062 8063 = HSRP - build & dissection 8064 defaddr = conf.route.route('0.0.0.0')[1] 8065 pkt = IP(raw(IP()/UDP(dport=1985, sport=1985)/HSRP()/HSRPmd5())) 8066 assert pkt[IP].dst == "224.0.0.2" and pkt[UDP].sport == pkt[UDP].dport == 1985 8067 assert pkt[HSRP].opcode == 0 and pkt[HSRP].state == 16 8068 assert pkt[HSRPmd5].type == 4 and pkt[HSRPmd5].sourceip == defaddr 8069 8070 8071 ############ 8072 ############ 8073 + RIP tests 8074 8075 = RIP - build 8076 s = raw(IP()/UDP(sport=520)/RIP()/RIPEntry()/RIPAuth(authtype=2, password="scapy")) 8077 s == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x01\x02\x08\x02\x08\x004\xae\x99\x01\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02scapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 8078 8079 = RIP - dissection 8080 p = IP(s) 8081 RIPEntry in p and RIPAuth in p and p[RIPAuth].password.startswith(b"scapy") 8082 8083 8084 ############ 8085 ############ 8086 + RADIUS tests 8087 8088 = IP/UDP/RADIUS - Build 8089 s = raw(IP()/UDP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy")) 8090 s == b'E\x00\x007\x00\x01\x00\x00@\x11|\xb3\x7f\x00\x00\x01\x7f\x00\x00\x01\x07\x14\x07\x15\x00#U\xb2\x01\x00\x00\x1bscapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x07scapy' 8091 8092 = IP/UDP/RADIUS - Dissection 8093 p = IP(s) 8094 Radius in p and len(p[Radius].attributes) == 1 and p[Radius].attributes[0].value == b"scapy" 8095 8096 = RADIUS - Access-Request - Dissection (1) 8097 s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6' 8098 radius_packet = Radius(s) 8099 assert(radius_packet.id == 174) 8100 assert(radius_packet.len == 279) 8101 assert(radius_packet.authenticator == b'>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z') 8102 assert(len(radius_packet.attributes) == 17) 8103 assert(radius_packet.attributes[0].type == 1) 8104 assert(type(radius_packet.attributes[0]) == RadiusAttribute) 8105 assert(radius_packet.attributes[0].len == 6) 8106 assert(radius_packet.attributes[0].value == b"leap") 8107 assert(radius_packet.attributes[1].type == 6) 8108 assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type) 8109 assert(radius_packet.attributes[1].len == 6) 8110 assert(radius_packet.attributes[1].value == 2) 8111 assert(radius_packet.attributes[2].type == 26) 8112 assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific) 8113 assert(radius_packet.attributes[2].len == 27) 8114 assert(radius_packet.attributes[2].vendor_id == 9) 8115 assert(radius_packet.attributes[2].vendor_type == 1) 8116 assert(radius_packet.attributes[2].vendor_len == 21) 8117 assert(radius_packet.attributes[2].value == b"service-type=Framed") 8118 assert(radius_packet.attributes[6].type == 79) 8119 assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message) 8120 assert(radius_packet.attributes[6].len == 11) 8121 assert(radius_packet.attributes[6].value.haslayer(EAP)) 8122 assert(radius_packet.attributes[6].value[EAP].code == 2) 8123 assert(radius_packet.attributes[6].value[EAP].id == 1) 8124 assert(radius_packet.attributes[6].value[EAP].len == 9) 8125 assert(radius_packet.attributes[6].value[EAP].type == 1) 8126 assert(hasattr(radius_packet.attributes[6].value[EAP], "identity")) 8127 assert(radius_packet.attributes[6].value[EAP].identity == b"leap") 8128 assert(radius_packet.attributes[7].type == 80) 8129 assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator) 8130 assert(radius_packet.attributes[7].len == 18) 8131 assert(radius_packet.attributes[7].value == b'U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6') 8132 assert(radius_packet.attributes[11].type == 8) 8133 assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address) 8134 assert(radius_packet.attributes[11].len == 6) 8135 assert(radius_packet.attributes[11].value == '192.168.10.185') 8136 assert(radius_packet.attributes[16].type == 5) 8137 assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port) 8138 assert(radius_packet.attributes[16].len == 6) 8139 assert(radius_packet.attributes[16].value == 50118) 8140 8141 = RADIUS - compute_message_authenticator() 8142 ram = radius_packet[RadiusAttr_Message_Authenticator] 8143 assert ram.compute_message_authenticator(radius_packet, b"dummy bytes", b"scapy") == b'\x19\xa4\x0e*Y4\xe0l?,\x94\x9f \xb8Jb' 8144 8145 = RADIUS - Access-Challenge - Dissection (2) 8146 s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' 8147 radius_packet = Radius(s) 8148 assert(radius_packet.id == 174) 8149 assert(radius_packet.len == 91) 8150 assert(radius_packet.authenticator == b'\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8') 8151 assert(len(radius_packet.attributes) == 4) 8152 assert(radius_packet.attributes[0].type == 18) 8153 assert(type(radius_packet.attributes[0]) == RadiusAttribute) 8154 assert(radius_packet.attributes[0].len == 13) 8155 assert(radius_packet.attributes[0].value == b"Hello, leap") 8156 assert(radius_packet.attributes[1].type == 79) 8157 assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message) 8158 assert(radius_packet.attributes[1].len == 22) 8159 assert(radius_packet.attributes[1][EAP].code == 1) 8160 assert(radius_packet.attributes[1][EAP].id == 2) 8161 assert(radius_packet.attributes[1][EAP].len == 20) 8162 assert(radius_packet.attributes[1][EAP].type == 17) 8163 assert(radius_packet.attributes[2].type == 80) 8164 assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator) 8165 assert(radius_packet.attributes[2].len == 18) 8166 assert(radius_packet.attributes[2].value == b'\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c') 8167 assert(radius_packet.attributes[3].type == 24) 8168 assert(type(radius_packet.attributes[3]) == RadiusAttr_State) 8169 assert(radius_packet.attributes[3].len == 18) 8170 assert(radius_packet.attributes[3].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO') 8171 8172 = RADIUS - Access-Request - Dissection (3) 8173 s = b'\x01\xaf\x01DC\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O&\x02\x02\x00$\x11\x01\x00\x18\rE\xc9\x92\xf6\x9ae\x04\xa2\x06\x13\x8f\x0b#\xf1\xc56\x8eU\xd9\x89\xe5\xa1)leapP\x12|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' 8174 radius_packet = Radius(s) 8175 assert(radius_packet.id == 175) 8176 assert(radius_packet.len == 324) 8177 assert(radius_packet.authenticator == b'C\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8') 8178 assert(len(radius_packet.attributes) == 18) 8179 assert(radius_packet.attributes[0].type == 1) 8180 assert(type(radius_packet.attributes[0]) == RadiusAttribute) 8181 assert(radius_packet.attributes[0].len == 6) 8182 assert(radius_packet.attributes[0].value == b"leap") 8183 assert(radius_packet.attributes[1].type == 6) 8184 assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type) 8185 assert(radius_packet.attributes[1].len == 6) 8186 assert(radius_packet.attributes[1].value == 2) 8187 assert(radius_packet.attributes[2].type == 26) 8188 assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific) 8189 assert(radius_packet.attributes[2].len == 27) 8190 assert(radius_packet.attributes[2].vendor_id == 9) 8191 assert(radius_packet.attributes[2].vendor_type == 1) 8192 assert(radius_packet.attributes[2].vendor_len == 21) 8193 assert(radius_packet.attributes[2].value == b"service-type=Framed") 8194 assert(radius_packet.attributes[6].type == 79) 8195 assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message) 8196 assert(radius_packet.attributes[6].len == 38) 8197 assert(radius_packet.attributes[6].value.haslayer(EAP)) 8198 assert(radius_packet.attributes[6].value[EAP].code == 2) 8199 assert(radius_packet.attributes[6].value[EAP].id == 2) 8200 assert(radius_packet.attributes[6].value[EAP].len == 36) 8201 assert(radius_packet.attributes[6].value[EAP].type == 17) 8202 assert(radius_packet.attributes[7].type == 80) 8203 assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator) 8204 assert(radius_packet.attributes[7].len == 18) 8205 assert(radius_packet.attributes[7].value == b'|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n ') 8206 assert(radius_packet.attributes[11].type == 8) 8207 assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address) 8208 assert(radius_packet.attributes[11].len == 6) 8209 assert(radius_packet.attributes[11].value == '192.168.10.185') 8210 assert(radius_packet.attributes[16].type == 5) 8211 assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port) 8212 assert(radius_packet.attributes[16].len == 6) 8213 assert(radius_packet.attributes[16].value == 50118) 8214 assert(radius_packet.attributes[17].type == 24) 8215 assert(type(radius_packet.attributes[17]) == RadiusAttr_State) 8216 assert(radius_packet.attributes[17].len == 18) 8217 assert(radius_packet.attributes[17].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO') 8218 8219 = RADIUS - Access-Challenge - Dissection (4) 8220 s = b'\x0b\xaf\x00K\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU\x12\rHello, leapO\x06\x03\x03\x00\x04P\x12l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff\x18\x12iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO' 8221 radius_packet = Radius(s) 8222 assert(radius_packet.id == 175) 8223 assert(radius_packet.len == 75) 8224 assert(radius_packet.authenticator == b'\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU') 8225 assert(len(radius_packet.attributes) == 4) 8226 assert(radius_packet.attributes[0].type == 18) 8227 assert(type(radius_packet.attributes[0]) == RadiusAttribute) 8228 assert(radius_packet.attributes[0].len == 13) 8229 assert(radius_packet.attributes[0].value == b"Hello, leap") 8230 assert(radius_packet.attributes[1].type == 79) 8231 assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message) 8232 assert(radius_packet.attributes[1].len == 6) 8233 assert(radius_packet.attributes[1][EAP].code == 3) 8234 assert(radius_packet.attributes[1][EAP].id == 3) 8235 assert(radius_packet.attributes[1][EAP].len == 4) 8236 assert(radius_packet.attributes[2].type == 80) 8237 assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator) 8238 assert(radius_packet.attributes[2].len == 18) 8239 assert(radius_packet.attributes[2].value == b'l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff') 8240 assert(radius_packet.attributes[3].type == 24) 8241 assert(type(radius_packet.attributes[3]) == RadiusAttr_State) 8242 assert(radius_packet.attributes[3].len == 18) 8243 assert(radius_packet.attributes[3].value == b'iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO') 8244 8245 = RADIUS - Response Authenticator computation 8246 s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6' 8247 access_request = Radius(s) 8248 s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' 8249 access_challenge = Radius(s) 8250 access_challenge.compute_authenticator(access_request.authenticator, b"radiuskey") == access_challenge.authenticator 8251 8252 = RADIUS - Layers (1) 8253 radius_attr = RadiusAttr_EAP_Message(value = EAP()) 8254 assert(RadiusAttr_EAP_Message in radius_attr) 8255 assert(RadiusAttribute in radius_attr) 8256 type(radius_attr[RadiusAttribute]) 8257 assert(type(radius_attr[RadiusAttribute]) == RadiusAttr_EAP_Message) 8258 assert(EAP in radius_attr.value) 8259 8260 8261 ############ 8262 ############ 8263 + Addresses generators 8264 8265 = Net 8266 8267 n1 = Net("192.168.0.0/31") 8268 [ip for ip in n1] == ["192.168.0.0", "192.168.0.1"] 8269 8270 n2 = Net("192.168.0.*") 8271 len([ip for ip in n2]) == 256 8272 8273 n3 = Net("192.168.0.1-5") 8274 len([ip for ip in n3]) == 5 8275 8276 (n1 == n3) == False 8277 8278 (n3 in n2) == True 8279 8280 = Net using web address 8281 8282 ip = IP(dst="www.google.com") 8283 n1 = ip.dst 8284 assert isinstance(n1, Net) 8285 assert n1.ip_regex.match(str(n1)) 8286 ip.show() 8287 8288 = OID 8289 8290 oid = OID("1.2.3.4.5.6-8") 8291 len([ o for o in oid ]) == 3 8292 8293 = Net6 8294 8295 n1 = Net6("2001:db8::/127") 8296 len([ip for ip in n1]) == 2 8297 8298 = Net6 using web address 8299 ~ netaccess ipv6 8300 8301 ip = IPv6(dst="www.google.com") 8302 n1 = ip.dst 8303 assert isinstance(n1, Net6) 8304 assert n1.ip_regex.match(str(n1)) 8305 ip.show() 8306 8307 ############ 8308 ############ 8309 + IPv6 helpers 8310 8311 = in6_getLocalUniquePrefix() 8312 8313 p = in6_getLocalUniquePrefix() 8314 len(inet_pton(socket.AF_INET6, p)) == 16 and p.startswith("fd") 8315 8316 = Misc addresses manipulation functions 8317 8318 teredoAddrExtractInfo("2001:0:0a0b:0c0d:0028:f508:f508:08f5") == ("10.11.12.13", 40, "10.247.247.10", 2807) 8319 8320 ip6 = IP6Field("test", None) 8321 ip6.i2repr("", "2001:0:0a0b:0c0d:0028:f508:f508:08f5") == "2001:0:0a0b:0c0d:0028:f508:f508:08f5 [Teredo srv: 10.11.12.13 cli: 10.247.247.10:2807]" 8322 ip6.i2repr("", "2002:0102:0304::1") == "2002:0102:0304::1 [6to4 GW: 1.2.3.4]" 8323 8324 in6_iseui64("fe80::bae8:58ff:fed4:e5f6") == True 8325 8326 in6_isanycast("2001:db8::fdff:ffff:ffff:ff80") == True 8327 8328 a = inet_pton(socket.AF_INET6, "2001:db8::2807") 8329 in6_xor(a, a) == b"\x00" * 16 8330 8331 a = inet_pton(socket.AF_INET6, "fe80::bae8:58ff:fed4:e5f6") 8332 r = inet_ntop(socket.AF_INET6, in6_getnsma(a)) 8333 r == "ff02::1:ffd4:e5f6" 8334 8335 in6_isllsnmaddr(r) == True 8336 8337 in6_isdocaddr("2001:db8::2807") == True 8338 8339 in6_isaddrllallnodes("ff02::1") == True 8340 8341 in6_isaddrllallservers("ff02::2") == True 8342 8343 = in6_getscope() 8344 8345 assert in6_getscope("2001:db8::2807") == IPV6_ADDR_GLOBAL 8346 assert in6_getscope("fec0::2807") == IPV6_ADDR_SITELOCAL 8347 assert in6_getscope("fe80::2807") == IPV6_ADDR_LINKLOCAL 8348 assert in6_getscope("ff02::2807") == IPV6_ADDR_LINKLOCAL 8349 assert in6_getscope("ff0e::2807") == IPV6_ADDR_GLOBAL 8350 assert in6_getscope("ff05::2807") == IPV6_ADDR_SITELOCAL 8351 assert in6_getscope("ff01::2807") == IPV6_ADDR_LOOPBACK 8352 assert in6_getscope("::1") == IPV6_ADDR_LOOPBACK 8353 8354 = construct_source_candidate_set() 8355 8356 dev_addresses = [('fe80::', IPV6_ADDR_LINKLOCAL, "linklocal"),('fec0::', IPV6_ADDR_SITELOCAL, "sitelocal"),('ff0e::', IPV6_ADDR_GLOBAL, "global")] 8357 8358 assert construct_source_candidate_set("2001:db8::2807", 0, dev_addresses) == ["ff0e::"] 8359 assert construct_source_candidate_set("fec0::2807", 0, dev_addresses) == ["fec0::"] 8360 assert construct_source_candidate_set("fe80::2807", 0, dev_addresses) == ["fe80::"] 8361 assert construct_source_candidate_set("ff02::2807", 0, dev_addresses) == ["fe80::"] 8362 assert construct_source_candidate_set("ff0e::2807", 0, dev_addresses) == ["ff0e::"] 8363 assert construct_source_candidate_set("ff05::2807", 0, dev_addresses) == ["fec0::"] 8364 assert construct_source_candidate_set("ff01::2807", 0, dev_addresses) == ["::1"] 8365 assert construct_source_candidate_set("::", 0, dev_addresses) == ["ff0e::"] 8366 8367 = inet_pton() 8368 8369 from scapy.pton_ntop import _inet6_pton, inet_pton 8370 import socket 8371 8372 ip6_bad_addrs = ["fe80::2e67:ef2d:7eca::ed8a", 8373 "fe80:1234:abcd::192.168.40.12:abcd", 8374 "fe80:1234:abcd::192.168.40", 8375 "fe80:1234:abcd::192.168.400.12", 8376 "1234:5678:9abc:def0:1234:5678:9abc:def0:", 8377 "1234:5678:9abc:def0:1234:5678:9abc:def0:1234"] 8378 for ip6 in ip6_bad_addrs: 8379 rc = False 8380 exc1 = None 8381 try: 8382 res1 = inet_pton(socket.AF_INET6, ip6) 8383 except Exception as e: 8384 rc = True 8385 exc1 = e 8386 assert rc 8387 rc = False 8388 try: 8389 res2 = _inet6_pton(ip6) 8390 except Exception as exc2: 8391 rc = isinstance(exc2, type(exc1)) 8392 assert rc 8393 8394 ip6_good_addrs = [("fe80:1234:abcd::192.168.40.12", 8395 b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\xc0\xa8(\x0c'), 8396 ("fe80:1234:abcd::fe06", 8397 b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x06'), 8398 ("fe80::2e67:ef2d:7ece:ed8a", 8399 b'\xfe\x80\x00\x00\x00\x00\x00\x00.g\xef-~\xce\xed\x8a'), 8400 ("::ffff", 8401 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'), 8402 ("ffff::", 8403 b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), 8404 ('::', b'\x00' * 16)] 8405 for ip6, res in ip6_good_addrs: 8406 res1 = inet_pton(socket.AF_INET6, ip6) 8407 res2 = _inet6_pton(ip6) 8408 assert res == res1 == res2 8409 8410 8411 ############ 8412 ############ 8413 + Test Route class 8414 8415 = make_route() 8416 8417 r4 = Route() 8418 tmp_route = r4.make_route(host="10.12.13.14") 8419 (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561934, 4294967295, '0.0.0.0') 8420 8421 tmp_route = r4.make_route(net="10.12.13.0/24") 8422 (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561920, 4294967040, '0.0.0.0') 8423 8424 = add() & delt() 8425 8426 r4 = Route() 8427 len_r4 = len(r4.routes) 8428 r4.add(net="192.168.1.0/24", gw="1.2.3.4") 8429 len(r4.routes) == len_r4 + 1 8430 r4.delt(net="192.168.1.0/24", gw="1.2.3.4") 8431 len(r4.routes) == len_r4 8432 8433 = ifchange() 8434 8435 r4.add(net="192.168.1.0/24", gw="1.2.3.4", dev=get_dummy_interface()) 8436 r4.ifchange(get_dummy_interface(), "5.6.7.8") 8437 r4.routes[-1][4] == "5.6.7.8" 8438 8439 = ifdel() 8440 8441 r4.ifdel(get_dummy_interface()) 8442 len(r4.routes) == len_r4 8443 8444 = ifadd() & get_if_bcast() 8445 8446 r4 = Route() 8447 len_r4 = len(r4.routes) 8448 8449 r4.ifadd(get_dummy_interface(), "1.2.3.4/24") 8450 len(r4.routes) == len_r4 +1 8451 8452 r4.get_if_bcast(get_dummy_interface()) == "1.2.3.255" 8453 8454 r4.ifdel(get_dummy_interface()) 8455 len(r4.routes) == len_r4 8456 8457 8458 ############ 8459 ############ 8460 + Random objects 8461 8462 = RandomEnumeration 8463 8464 re = RandomEnumeration(0, 7, seed=0x2807, forever=False) 8465 [x for x in re] == ([3, 4, 2, 5, 1, 6, 0, 7] if six.PY2 else [5, 0, 2, 7, 6, 3, 1, 4]) 8466 8467 = RandIP6 8468 8469 random.seed(0x2807) 8470 r6 = RandIP6() 8471 assert(r6 == ("d279:1205:e445:5a9f:db28:efc9:afd7:f594" if six.PY2 else 8472 "240b:238f:b53f:b727:d0f9:bfc4:2007:e265")) 8473 8474 random.seed(0x2807) 8475 r6 = RandIP6("2001:db8::-") 8476 assert(r6 == ("2001:0db8::e445" if six.PY2 else "2001:0db8::b53f")) 8477 8478 r6 = RandIP6("2001:db8::*") 8479 assert(r6 == ("2001:0db8::efc9" if six.PY2 else "2001:0db8::bfc4")) 8480 8481 = RandMAC 8482 8483 random.seed(0x2807) 8484 rm = RandMAC() 8485 assert(rm == ("d2:12:e4:5a:db:ef" if six.PY2 else "24:23:b5:b7:d0:bf")) 8486 8487 rm = RandMAC("00:01:02:03:04:0-7") 8488 assert(rm == ("00:01:02:03:04:05" if six.PY2 else "00:01:02:03:04:01")) 8489 8490 8491 = RandOID 8492 8493 random.seed(0x2807) 8494 ro = RandOID() 8495 assert(ro == "7.222.44.194.276.116.320.6.84.97.31.5.25.20.13.84.104.18") 8496 8497 ro = RandOID("1.2.3.*") 8498 assert(ro == "1.2.3.41") 8499 8500 ro = RandOID("1.2.3.0-28") 8501 assert(ro == ("1.2.3.11" if six.PY2 else "1.2.3.12")) 8502 8503 = RandRegExp 8504 8505 random.seed(0x2807) 8506 re = RandRegExp("[g-v]* @? [0-9]{3} . (g|v)") 8507 bytes(re) == ('vmuvr @ 906 \x9e g' if six.PY2 else b'irrtv @ 517 \xc2\xb8 v') 8508 8509 = Corrupted(Bytes|Bits) 8510 8511 random.seed(0x2807) 8512 cb = CorruptedBytes("ABCDE", p=0.5) 8513 assert(sane(raw(cb)) in [".BCD)", "&BCDW"]) 8514 8515 cb = CorruptedBits("ABCDE", p=0.2) 8516 assert(sane(raw(cb)) in ["ECk@Y", "QB.P."]) 8517 8518 = RandEnumKeys 8519 ~ not_pypy random_weird_py3 8520 random.seed(0x2807) 8521 rek = RandEnumKeys({'a': 1, 'b': 2, 'c': 3}, seed=0x2807) 8522 rek.enum.sort() 8523 assert(rek == ('c' if six.PY2 else 'a')) 8524 8525 = RandSingNum 8526 ~ not_pypy random_weird_py3 8527 random.seed(0x2807) 8528 rs = RandSingNum(-28, 7) 8529 assert(rs == (3 if six.PY2 else 2)) 8530 assert(rs == (-27 if six.PY2 else -17)) 8531 8532 = Rand* 8533 random.seed(0x2807) 8534 rss = RandSingString() 8535 assert(rss == ("CON:" if six.PY2 else "foo.exe:")) 8536 8537 random.seed(0x2807) 8538 rts = RandTermString(4, "scapy") 8539 assert(sane(raw(rts)) in ["...[scapy", "......scapy"]) 8540 8541 8542 ############ 8543 ############ 8544 + Flags 8545 8546 = IP flags 8547 ~ IP 8548 8549 pkt = IP(flags="MF") 8550 assert pkt.flags.MF 8551 assert not pkt.flags.DF 8552 assert not pkt.flags.evil 8553 assert repr(pkt.flags) == '<Flag 1 (MF)>' 8554 pkt.flags.MF = 0 8555 pkt.flags.DF = 1 8556 assert not pkt.flags.MF 8557 assert pkt.flags.DF 8558 assert not pkt.flags.evil 8559 assert repr(pkt.flags) == '<Flag 2 (DF)>' 8560 pkt.flags |= 'evil+MF' 8561 pkt.flags &= 'DF+MF' 8562 assert pkt.flags.MF 8563 assert pkt.flags.DF 8564 assert not pkt.flags.evil 8565 assert repr(pkt.flags) == '<Flag 3 (MF+DF)>' 8566 8567 pkt = IP(flags=3) 8568 assert pkt.flags.MF 8569 assert pkt.flags.DF 8570 assert not pkt.flags.evil 8571 assert repr(pkt.flags) == '<Flag 3 (MF+DF)>' 8572 pkt.flags = 6 8573 assert not pkt.flags.MF 8574 assert pkt.flags.DF 8575 assert pkt.flags.evil 8576 assert repr(pkt.flags) == '<Flag 6 (DF+evil)>' 8577 8578 assert len({IP().flags, IP().flags}) == 1 8579 8580 = TCP flags 8581 ~ TCP 8582 8583 pkt = TCP(flags="SA") 8584 assert pkt.flags == 18 8585 assert pkt.flags.S 8586 assert pkt.flags.A 8587 assert pkt.flags.SA 8588 assert not any(getattr(pkt.flags, f) for f in 'FRPUECN') 8589 assert repr(pkt.flags) == '<Flag 18 (SA)>' 8590 pkt.flags.U = True 8591 pkt.flags.S = False 8592 assert pkt.flags.A 8593 assert pkt.flags.U 8594 assert pkt.flags.AU 8595 assert not any(getattr(pkt.flags, f) for f in 'FSRPECN') 8596 assert repr(pkt.flags) == '<Flag 48 (AU)>' 8597 pkt.flags &= 'SFA' 8598 pkt.flags |= 'P' 8599 assert pkt.flags.P 8600 assert pkt.flags.A 8601 assert pkt.flags.PA 8602 assert not any(getattr(pkt.flags, f) for f in 'FSRUECN') 8603 8604 pkt = TCP(flags=56) 8605 assert all(getattr(pkt.flags, f) for f in 'PAU') 8606 assert pkt.flags.PAU 8607 assert not any(getattr(pkt.flags, f) for f in 'FSRECN') 8608 assert repr(pkt.flags) == '<Flag 56 (PAU)>' 8609 pkt.flags = 50 8610 assert all(getattr(pkt.flags, f) for f in 'SAU') 8611 assert pkt.flags.SAU 8612 assert not any(getattr(pkt.flags, f) for f in 'FRPECN') 8613 assert repr(pkt.flags) == '<Flag 50 (SAU)>' 8614 8615 = Flag values mutation with .raw_packet_cache 8616 ~ IP TCP 8617 8618 pkt = IP(raw(IP(flags="MF")/TCP(flags="SA"))) 8619 assert pkt.raw_packet_cache is not None 8620 assert pkt[TCP].raw_packet_cache is not None 8621 assert pkt.flags.MF 8622 assert not pkt.flags.DF 8623 assert not pkt.flags.evil 8624 assert repr(pkt.flags) == '<Flag 1 (MF)>' 8625 assert pkt[TCP].flags.S 8626 assert pkt[TCP].flags.A 8627 assert pkt[TCP].flags.SA 8628 assert not any(getattr(pkt[TCP].flags, f) for f in 'FRPUECN') 8629 assert repr(pkt[TCP].flags) == '<Flag 18 (SA)>' 8630 pkt.flags.MF = 0 8631 pkt.flags.DF = 1 8632 pkt[TCP].flags.U = True 8633 pkt[TCP].flags.S = False 8634 pkt = IP(raw(pkt)) 8635 assert not pkt.flags.MF 8636 assert pkt.flags.DF 8637 assert not pkt.flags.evil 8638 assert repr(pkt.flags) == '<Flag 2 (DF)>' 8639 assert pkt[TCP].flags.A 8640 assert pkt[TCP].flags.U 8641 assert pkt[TCP].flags.AU 8642 assert not any(getattr(pkt[TCP].flags, f) for f in 'FSRPECN') 8643 assert repr(pkt[TCP].flags) == '<Flag 48 (AU)>' 8644 8645 = Operations on flag values 8646 ~ TCP 8647 8648 p1, p2 = TCP(flags="SU"), TCP(flags="AU") 8649 assert (p1.flags & p2.flags).U 8650 assert not any(getattr(p1.flags & p2.flags, f) for f in 'FSRPAECN') 8651 assert all(getattr(p1.flags | p2.flags, f) for f in 'SAU') 8652 assert (p1.flags | p2.flags).SAU 8653 assert not any(getattr(p1.flags | p2.flags, f) for f in 'FRPECN') 8654 8655 assert TCP(flags="SA").flags & TCP(flags="S").flags == TCP(flags="S").flags 8656 assert TCP(flags="SA").flags | TCP(flags="S").flags == TCP(flags="SA").flags 8657 8658 = Using tuples and lists as flag values 8659 ~ IP TCP 8660 8661 plist = PacketList(list(IP()/TCP(flags=(0, 2**9 - 1)))) 8662 assert [p[TCP].flags for p in plist] == [x for x in range(512)] 8663 8664 plist = PacketList(list(IP()/TCP(flags=["S", "SA", "A"]))) 8665 assert [p[TCP].flags for p in plist] == [2, 18, 16] 8666 8667 8668 ############ 8669 ############ 8670 + SCTP 8671 8672 = SCTP - Chunk Init - build 8673 s = raw(IP()/SCTP()/SCTPChunkInit(params=[SCTPChunkParamIPv4Addr()])) 8674 s == b'E\x00\x00<\x00\x01\x00\x00@\x84|;\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00@,\x0b_\x01\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x08\x7f\x00\x00\x01' 8675 8676 = SCTP - Chunk Init - dissection 8677 p = IP(s) 8678 SCTPChunkParamIPv4Addr in p and p[SCTP].chksum == 0x402c0b5f and p[SCTPChunkParamIPv4Addr].addr == "127.0.0.1" 8679 8680 = SCTP - SCTPChunkSACK - build 8681 s = raw(IP()/SCTP()/SCTPChunkSACK(gap_ack_list=["7:28"])) 8682 s == b'E\x00\x004\x00\x01\x00\x00@\x84|C\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00;\x01\xd4\x04\x03\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x1c' 8683 8684 = SCTP - SCTPChunkSACK - dissection 8685 p = IP(s) 8686 SCTPChunkSACK in p and p[SCTP].chksum == 0x3b01d404 and p[SCTPChunkSACK].gap_ack_list[0] == "7:28" 8687 8688 = SCTP - answers 8689 (IP()/SCTP()).answers(IP()/SCTP()) == True 8690 8691 = SCTP basic header - Dissection 8692 ~ sctp 8693 blob = b"\x1A\x85\x26\x94\x00\x00\x00\x0D\x00\x00\x04\xD2" 8694 p = SCTP(blob) 8695 assert(p.dport == 9876) 8696 assert(p.sport == 6789) 8697 assert(p.tag == 13) 8698 assert(p.chksum == 1234) 8699 8700 = basic SCTPChunkData - Dissection 8701 ~ sctp 8702 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61" 8703 p = SCTP(blob).lastlayer() 8704 assert(isinstance(p, SCTPChunkData)) 8705 assert(p.reserved == 0) 8706 assert(p.delay_sack == 0) 8707 assert(p.unordered == 0) 8708 assert(p.beginning == 0) 8709 assert(p.ending == 0) 8710 assert(p.tsn == 0) 8711 assert(p.stream_id == 0) 8712 assert(p.stream_seq == 0) 8713 assert(p.len == (len("data") + 16)) 8714 assert(p.data == b"data") 8715 8716 = basic SCTPChunkInit - Dissection 8717 ~ sctp 8718 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 8719 p = SCTP(blob).lastlayer() 8720 assert(isinstance(p, SCTPChunkInit)) 8721 assert(p.flags == 0) 8722 assert(p.len == 20) 8723 assert(p.init_tag == 0) 8724 assert(p.a_rwnd == 0) 8725 assert(p.n_out_streams == 0) 8726 assert(p.n_in_streams == 0) 8727 assert(p.init_tsn == 0) 8728 assert(p.params == []) 8729 8730 = SCTPChunkInit multiple valid parameters - Dissection 8731 ~ sctp 8732 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x5C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x00\x0C\x00\x06\x00\x05\x00\x00\x80\x00\x00\x04\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x80\x03\x00\x04\x80\x02\x00\x24\x87\x77\x21\x29\x3F\xDA\x62\x0C\x06\x6F\x10\xA5\x39\x58\x60\x98\x4C\xD4\x59\xD8\x8A\x00\x85\xFB\x9E\x2E\x66\xBA\x3A\x23\x54\xEF\x80\x04\x00\x06\x00\x01\x00\x00" 8733 p = SCTP(blob).lastlayer() 8734 assert(isinstance(p, SCTPChunkInit)) 8735 assert(p.flags == 0) 8736 assert(p.len == 92) 8737 assert(p.init_tag == 101) 8738 assert(p.a_rwnd == 102) 8739 assert(p.n_out_streams == 103) 8740 assert(p.n_in_streams == 104) 8741 assert(p.init_tsn == 105) 8742 assert(len(p.params) == 7) 8743 params = {type(param): param for param in p.params} 8744 assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamFwdTSN, 8745 SCTPChunkParamSupportedExtensions, SCTPChunkParamChunkList, 8746 SCTPChunkParamRandom, SCTPChunkParamRequestedHMACFunctions, 8747 SCTPChunkParamSupportedAddrTypes}) 8748 assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable()) 8749 assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN()) 8750 assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7)) 8751 assert(params[SCTPChunkParamChunkList] == SCTPChunkParamChunkList(len=4)) 8752 assert(params[SCTPChunkParamRandom].len == 4+32) 8753 assert(len(params[SCTPChunkParamRandom].random) == 32) 8754 assert(params[SCTPChunkParamRequestedHMACFunctions] == SCTPChunkParamRequestedHMACFunctions(len=6)) 8755 assert(params[SCTPChunkParamSupportedAddrTypes] == SCTPChunkParamSupportedAddrTypes(len=6)) 8756 8757 = basic SCTPChunkInitAck - Dissection 8758 ~ sctp 8759 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 8760 p = SCTP(blob).lastlayer() 8761 assert(isinstance(p, SCTPChunkInitAck)) 8762 assert(p.flags == 0) 8763 assert(p.len == 20) 8764 assert(p.init_tag == 0) 8765 assert(p.a_rwnd == 0) 8766 assert(p.n_out_streams == 0) 8767 assert(p.n_in_streams == 0) 8768 assert(p.init_tsn == 0) 8769 assert(p.params == []) 8770 8771 = SCTPChunkInitAck with state cookie - Dissection 8772 ~ sctp 8773 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x4C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x80\x00\x00\x04\x00\x0B\x00\x0D\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x00\x00\x00\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x00\x07\x00\x14\x00\x10\x9E\xB2\x86\xCE\xE1\x7D\x0F\x6A\xAD\xFD\xB3\x5D\xBC\x00" 8774 p = SCTP(blob).lastlayer() 8775 assert(isinstance(p, SCTPChunkInitAck)) 8776 assert(p.flags == 0) 8777 assert(p.len == 76) 8778 assert(p.init_tag == 101) 8779 assert(p.a_rwnd == 102) 8780 assert(p.n_out_streams == 103) 8781 assert(p.n_in_streams == 104) 8782 assert(p.init_tsn == 105) 8783 assert(len(p.params) == 5) 8784 params = {type(param): param for param in p.params} 8785 assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamHostname, 8786 SCTPChunkParamFwdTSN, SCTPChunkParamSupportedExtensions, 8787 SCTPChunkParamStateCookie}) 8788 assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable()) 8789 assert(raw(params[SCTPChunkParamHostname]) == raw(SCTPChunkParamHostname(len=13, hostname="localhost"))) 8790 assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN()) 8791 assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7)) 8792 assert(params[SCTPChunkParamStateCookie].len == 4+16) 8793 assert(len(params[SCTPChunkParamStateCookie].cookie) == 16) 8794 8795 = basic SCTPChunkSACK - Dissection 8796 ~ sctp 8797 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" 8798 p = SCTP(blob).lastlayer() 8799 assert(isinstance(p, SCTPChunkSACK)) 8800 assert(p.flags == 0) 8801 assert(p.len == 16) 8802 assert(p.cumul_tsn_ack == 0) 8803 assert(p.a_rwnd == 0) 8804 assert(p.n_gap_ack == 0) 8805 assert(p.n_dup_tsn == 0) 8806 assert(p.gap_ack_list == []) 8807 assert(p.dup_tsn_list == []) 8808 8809 = basic SCTPChunkHeartbeatReq - Dissection 8810 ~ sctp 8811 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04" 8812 p = SCTP(blob).lastlayer() 8813 assert(isinstance(p, SCTPChunkHeartbeatReq)) 8814 assert(p.flags == 0) 8815 assert(p.len == 4) 8816 assert(p.params == []) 8817 8818 = basic SCTPChunkHeartbeatAck - Dissection 8819 ~ sctp 8820 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x04" 8821 p = SCTP(blob).lastlayer() 8822 assert(isinstance(p, SCTPChunkHeartbeatAck)) 8823 assert(p.flags == 0) 8824 assert(p.len == 4) 8825 assert(p.params == []) 8826 8827 = basic SCTPChunkAbort - Dissection 8828 ~ sctp 8829 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x04" 8830 p = SCTP(blob).lastlayer() 8831 assert(isinstance(p, SCTPChunkAbort)) 8832 assert(p.reserved == 0) 8833 assert(p.TCB == 0) 8834 assert(p.len == 4) 8835 assert(p.error_causes == b"") 8836 8837 = basic SCTPChunkShutDown - Dissection 8838 ~ sctp 8839 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x08\x00\x00\x00\x00" 8840 p = SCTP(blob).lastlayer() 8841 assert(isinstance(p, SCTPChunkShutdown)) 8842 assert(p.flags == 0) 8843 assert(p.len == 8) 8844 assert(p.cumul_tsn_ack == 0) 8845 8846 = basic SCTPChunkShutDownAck - Dissection 8847 ~ sctp 8848 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04" 8849 p = SCTP(blob).lastlayer() 8850 assert(isinstance(p, SCTPChunkShutdownAck)) 8851 assert(p.flags == 0) 8852 assert(p.len == 4) 8853 8854 = basic SCTPChunkError - Dissection 8855 ~ sctp 8856 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x04" 8857 p = SCTP(blob).lastlayer() 8858 assert(isinstance(p, SCTPChunkError)) 8859 assert(p.flags == 0) 8860 assert(p.len == 4) 8861 assert(p.error_causes == b"") 8862 8863 = basic SCTPChunkCookieEcho - Dissection 8864 ~ sctp 8865 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x00\x04" 8866 p = SCTP(blob).lastlayer() 8867 assert(isinstance(p, SCTPChunkCookieEcho)) 8868 assert(p.flags == 0) 8869 assert(p.len == 4) 8870 assert(p.cookie == b"") 8871 8872 = basic SCTPChunkCookieAck - Dissection 8873 ~ sctp 8874 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x04" 8875 p = SCTP(blob).lastlayer() 8876 assert(isinstance(p, SCTPChunkCookieAck)) 8877 assert(p.flags == 0) 8878 assert(p.len == 4) 8879 8880 = basic SCTPChunkShutdownComplete - Dissection 8881 ~ sctp 8882 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\x00\x00\x04" 8883 p = SCTP(blob).lastlayer() 8884 assert(isinstance(p, SCTPChunkShutdownComplete)) 8885 assert(p.reserved == 0) 8886 assert(p.TCB == 0) 8887 assert(p.len == 4) 8888 8889 = basic SCTPChunkAuthentication - Dissection 8890 ~ sctp 8891 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x08\x00\x00\x00\x00" 8892 p = SCTP(blob).lastlayer() 8893 assert(isinstance(p, SCTPChunkAuthentication)) 8894 assert(p.flags == 0) 8895 assert(p.len == 8) 8896 assert(p.shared_key_id == 0) 8897 assert(p.HMAC_function == 0) 8898 8899 = basic SCTPChunkAddressConf - Dissection 8900 ~ sctp 8901 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x08\x00\x00\x00\x00" 8902 p = SCTP(blob).lastlayer() 8903 assert(isinstance(p, SCTPChunkAddressConf)) 8904 assert(p.flags == 0) 8905 assert(p.len == 8) 8906 assert(p.seq == 0) 8907 assert(p.params == []) 8908 8909 = basic SCTPChunkAddressConfAck - Dissection 8910 ~ sctp 8911 blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00" 8912 p = SCTP(blob).lastlayer() 8913 assert(isinstance(p, SCTPChunkAddressConfAck)) 8914 assert(p.flags == 0) 8915 assert(p.len == 8) 8916 assert(p.seq == 0) 8917 assert(p.params == []) 8918 8919 = SCTPChunkParamRandom - Consecutive calls 8920 ~ sctp 8921 param1, param2 = SCTPChunkParamRandom(), SCTPChunkParamRandom() 8922 assert(param1.random != param2.random) 8923 8924 ############ 8925 ############ 8926 + DHCP 8927 8928 = BOOTP - misc 8929 BOOTP().answers(BOOTP()) == True 8930 BOOTP().hashret() == b"\x00\x00\x00\x00" 8931 8932 import random 8933 random.seed(0x2807) 8934 str(RandDHCPOptions()) == "[('WWW_server', '90.219.239.175')]" 8935 8936 value = ("hostname", "scapy") 8937 dof = DHCPOptionsField("options", value) 8938 dof.i2repr("", value) == '[hostname scapy]' 8939 dof.i2m("", value) == b'\x0cscapy' 8940 8941 unknown_value_end = b"\xfe" + b"\xff"*257 8942 udof = DHCPOptionsField("options", unknown_value_end) 8943 udof.m2i("", unknown_value_end) == [(254, b'\xff'*255), 'end'] 8944 8945 unknown_value_pad = b"\xfe" + b"\xff"*256 + b"\x00" 8946 udof = DHCPOptionsField("options", unknown_value_pad) 8947 udof.m2i("", unknown_value_pad) == [(254, b'\xff'*255), 'pad'] 8948 8949 = DHCP - build 8950 s = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("message-type","discover"),"end"])) 8951 assert s == b'E\x00\x01\x10\x00\x01\x00\x00@\x11{\xda\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x00\xfcf\xea\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000:01:02:03:04:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x01\xff' 8952 8953 s2 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="05:04:03:02:01:00")/DHCP(options=[("param_req_list",[12,57,45,254]),("requested_addr", "192.168.0.1"),"end"])) 8954 assert s2 == b'E\x00\x01\x19\x00\x01\x00\x00@\x11{\xd1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01\x058\xeb\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0005:04:03:02:01:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc7\x04\x0c9-\xfe2\x04\xc0\xa8\x00\x01\xff' 8955 8956 = DHCP - dissection 8957 p = IP(s) 8958 assert DHCP in p and p[DHCP].options[0] == ('message-type', 1) 8959 8960 p2 = IP(s2) 8961 assert DHCP in p2 8962 assert p2[DHCP].options[0] == ("param_req_list",[12,57,45,254]) 8963 assert p2[DHCP].options[1] == ("requested_addr", "192.168.0.1") 8964 8965 ############ 8966 ############ 8967 + 802.11 8968 8969 = 802.11 - misc 8970 PrismHeader().answers(PrismHeader()) == True 8971 8972 dpl = Dot11PacketList([Dot11()/LLC()/SNAP()/IP()/UDP()]) 8973 len(dpl) == 1 8974 8975 dpl_ether = dpl.toEthernet() 8976 len(dpl_ether) == 1 and Ether in dpl_ether[0] 8977 8978 = Dot11 - build 8979 s = raw(Dot11()) 8980 s == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 8981 8982 = Dot11 - dissection 8983 p = Dot11(s) 8984 Dot11 in p and p.addr3 == "00:00:00:00:00:00" 8985 p.mysummary() == '802.11 Management 0 00:00:00:00:00:00 > 00:00:00:00:00:00' 8986 8987 = Dot11QoS - build 8988 s = raw(Dot11(type=2, subtype=8)/Dot11QoS(TID=4)) 8989 s == b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' 8990 8991 = Dot11 - binary in SSID 8992 pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID=0, info=b"".join(chb(i) for i in range(32))) 8993 pkt.show() 8994 pkt.summary() 8995 assert pkt[Dot11Elt::{"ID": 0}].summary() in [ 8996 "SSID='%s'" % "".join(repr(chr(d))[1:-1] for d in range(32)), 8997 'SSID="%s"' % "".join(repr(chr(d))[1:-1] for d in range(32)), 8998 ] 8999 pkt = Dot11(raw(pkt)) 9000 pkt.show() 9001 pkt.summary() 9002 assert pkt[Dot11Elt::{"ID": 0}].summary() in [ 9003 "SSID='%s'" % "".join(repr(chr(d))[1:-1] for d in range(32)), 9004 'SSID="%s"' % "".join(repr(chr(d))[1:-1] for d in range(32)), 9005 ] 9006 9007 = Dot11QoS - dissection 9008 p = Dot11(s) 9009 Dot11QoS in p 9010 9011 = Dot11 - answers 9012 query = Dot11(type=0, subtype=0) 9013 Dot11(type=0, subtype=1).answers(query) == True 9014 9015 = Dot11 - misc 9016 assert Dot11Elt(info="scapy").summary() == "SSID='scapy'" 9017 assert Dot11Elt(ID=1).mysummary() == "" 9018 9019 = Multiple Dot11Elt layers 9020 pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID="Rates") / Dot11Elt(ID="SSID", info="Scapy") 9021 assert pkt[Dot11Elt::{"ID": 0}].info == b"Scapy" 9022 assert pkt.getlayer(Dot11Elt, ID=0).info == b"Scapy" 9023 9024 = Dot11WEP - build 9025 ~ crypto 9026 conf.wepkey = "" 9027 assert raw(PPI()/Dot11(FCfield=0x40)/Dot11WEP()) == b'\x00\x00\x08\x00i\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 9028 conf.wepkey = "test123" 9029 assert raw(PPI()/Dot11(type=2, subtype=8, FCfield=0x40)/Dot11QoS()/Dot11WEP()) == b'\x00\x00\x08\x00i\x00\x00\x00\x88@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008(^a' 9030 9031 = Dot11WEP - dissect 9032 ~ crypto 9033 conf.wepkey = "test123" 9034 a = PPI(b'\x00\x00\x08\x00i\x00\x00\x00\x88@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008(^a') 9035 assert a[Dot11QoS][Dot11WEP].icv == 942169697 9036 9037 = Dot11 - answers 9038 a = Dot11()/Dot11Auth(seqnum=1) 9039 b = Dot11()/Dot11Auth(seqnum=2) 9040 assert b.answers(a) 9041 assert not a.answers(b) 9042 9043 assert not (Dot11()/Dot11Ack()).answers(Dot11()) 9044 assert (Dot11()/LLC(dsap=2, ctrl=4)).answers(Dot11()/LLC(dsap=1, ctrl=5)) 9045 9046 9047 ############ 9048 ############ 9049 + 802.3 9050 9051 = Test detection 9052 9053 assert isinstance(Dot3(raw(Ether())),Ether) 9054 assert isinstance(Ether(raw(Dot3())),Dot3) 9055 9056 a = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00') 9057 assert isinstance(a,Dot3) 9058 assert a.dst == 'ff:ff:ff:ff:ff:ff' 9059 assert a.src == '00:00:00:00:00:00' 9060 9061 a = Dot3(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x90\x00') 9062 assert isinstance(a,Ether) 9063 assert a.dst == 'ff:ff:ff:ff:ff:ff' 9064 assert a.src == '00:00:00:00:00:00' 9065 9066 9067 ############ 9068 ############ 9069 + ASN.1 9070 9071 = MIB 9072 9073 import tempfile 9074 fd, fname = tempfile.mkstemp() 9075 os.write(fd, b"-- MIB test\nscapy OBJECT IDENTIFIER ::= {test 2807}\n") 9076 os.close(fd) 9077 9078 load_mib(fname) 9079 assert(len([k for k in conf.mib.iterkeys() if "scapy" in k]) == 1) 9080 9081 assert(len([oid for oid in conf.mib]) > 100) 9082 9083 assert(conf.mib._my_find("MIB", "keyUsage")) 9084 9085 assert(len(conf.mib._find("MIB", "keyUsage"))) 9086 9087 assert(len(conf.mib._recurs_find_all((), "MIB", "keyUsage"))) 9088 9089 = MIB - graph 9090 9091 @mock.patch("scapy.asn1.mib.do_graph") 9092 def get_mib_graph(do_graph): 9093 def store_graph(graph, **kargs): 9094 assert graph.startswith("""digraph "mib" {""") 9095 assert """"test.2807" [ label="scapy" ];""" in graph 9096 do_graph.side_effect = store_graph 9097 conf.mib._make_graph() 9098 9099 get_mib_graph() 9100 9101 = DADict tests 9102 9103 a = DADict("test") 9104 a.test_value = "scapy" 9105 with ContextManagerCaptureOutput() as cmco: 9106 a._show() 9107 assert(cmco.get_output() == "test_value = 'scapy'\n") 9108 9109 b = DADict("test2") 9110 b.test_value_2 = "hello_world" 9111 9112 a._branch(b, 1) 9113 try: 9114 a._branch(b, 1) 9115 assert False 9116 except DADict_Exception: 9117 pass 9118 9119 assert(len(a._find("test2"))) 9120 9121 assert(len(a._find(test_value_2="hello_world"))) 9122 9123 assert(len(a._find_all("test2"))) 9124 9125 assert(not a._recurs_find((a,))) 9126 9127 assert(not a._recurs_find_all((a,))) 9128 9129 = BER tests 9130 9131 BER_id_enc(42) == '*' 9132 BER_id_enc(2807) == b'\xbfw' 9133 9134 b = BERcodec_IPADDRESS() 9135 r1 = b.enc("8.8.8.8") 9136 r1 == b'@\x04\x08\x08\x08\x08' 9137 9138 r2 = b.dec(r1)[0] 9139 r2.val == '8.8.8.8' 9140 9141 9142 ############ 9143 ############ 9144 + inet.py 9145 9146 = IPv4 - ICMPTimeStampField 9147 test = ICMPTimeStampField("test", None) 9148 value = test.any2i("", "07:28:28.07") 9149 value == 26908070 9150 test.i2repr("", value) == '7:28:28.70' 9151 9152 = IPv4 - UDP null checksum 9153 IP(raw(IP()/UDP()/Raw(b"\xff\xff\x01\x6a")))[UDP].chksum == 0xFFFF 9154 9155 = IPv4 - (IP|UDP|TCP|ICMP)Error 9156 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS() 9157 answer = IP(dst="192.168.0.254", src="192.168.0.2", ttl=1)/ICMP()/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS() 9158 9159 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS() 9160 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS() 9161 assert(answer.answers(query) == True) 9162 9163 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/TCP() 9164 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror() 9165 9166 assert(answer.answers(query) == True) 9167 9168 query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/ICMP()/"scapy" 9169 answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/ICMPerror()/"scapy" 9170 assert(answer.answers(query) == True) 9171 9172 = IPv4 - mDNS 9173 a = IP(dst="224.0.0.251") 9174 assert a.hashret() == b"\x00" 9175 9176 # TODO add real case here 9177 9178 = IPv4 - utilities 9179 l = overlap_frag(IP(dst="1.2.3.4")/ICMP()/("AB"*8), ICMP()/("CD"*8)) 9180 assert(len(l) == 6) 9181 assert([len(raw(p[IP].payload)) for p in l] == [8, 8, 8, 8, 8, 8]) 9182 assert([(p.frag, p.flags.MF) for p in [IP(raw(p)) for p in l]] == [(0, True), (1, True), (2, True), (0, True), (1, True), (2, False)]) 9183 9184 = IPv4 - traceroute utilities 9185 ip_ttl = [("192.168.0.%d" % i, i) for i in six.moves.range(1, 10)] 9186 9187 tr_packets = [ (IP(dst="192.168.0.1", src="192.168.0.254", ttl=ttl)/TCP(options=[("Timestamp", "00:00:%.2d.00" % ttl)])/"scapy", 9188 IP(dst="192.168.0.254", src=ip)/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror()/"scapy") 9189 for (ip, ttl) in ip_ttl ] 9190 9191 tr = TracerouteResult(tr_packets) 9192 assert(tr.get_trace() == {'192.168.0.1': {1: ('192.168.0.1', False), 2: ('192.168.0.2', False), 3: ('192.168.0.3', False), 4: ('192.168.0.4', False), 5: ('192.168.0.5', False), 6: ('192.168.0.6', False), 7: ('192.168.0.7', False), 8: ('192.168.0.8', False), 9: ('192.168.0.9', False)}}) 9193 9194 def test_show(): 9195 with ContextManagerCaptureOutput() as cmco: 9196 tr = TracerouteResult(tr_packets) 9197 tr.show() 9198 result_show = cmco.get_output() 9199 expected = " 192.168.0.1:tcp80 \n" 9200 expected += "1 192.168.0.1 11 \n" 9201 expected += "2 192.168.0.2 11 \n" 9202 expected += "3 192.168.0.3 11 \n" 9203 expected += "4 192.168.0.4 11 \n" 9204 expected += "5 192.168.0.5 11 \n" 9205 expected += "6 192.168.0.6 11 \n" 9206 expected += "7 192.168.0.7 11 \n" 9207 expected += "8 192.168.0.8 11 \n" 9208 expected += "9 192.168.0.9 11 \n" 9209 index_result = result_show.index("\n1") 9210 index_expected = expected.index("\n1") 9211 assert(result_show[index_result:] == expected[index_expected:]) 9212 9213 test_show() 9214 9215 def test_summary(): 9216 with ContextManagerCaptureOutput() as cmco: 9217 tr = TracerouteResult(tr_packets) 9218 tr.summary() 9219 result_summary = cmco.get_output() 9220 assert(len(result_summary.split('\n')) == 10) 9221 assert(any( 9222 "IP / TCP 192.168.0.254:%s > 192.168.0.1:%s S / Raw ==> " 9223 "IP / ICMP 192.168.0.9 > 192.168.0.254 time-exceeded " 9224 "ttl-zero-during-transit / IPerror / TCPerror / " 9225 "Raw" % (ftp_data, http) in result_summary 9226 for ftp_data in ['21', 'ftp_data'] 9227 for http in ['80', 'http', 'www_http', 'www'] 9228 )) 9229 9230 test_summary() 9231 9232 @mock.patch("scapy.layers.inet.plt") 9233 def test_timeskew_graph(mock_plt): 9234 def fake_plot(data, **kwargs): 9235 return data 9236 mock_plt.plot = fake_plot 9237 srl = SndRcvList([(a, a) for a in [IP(raw(p[0])) for p in tr_packets]]) 9238 ret = srl.timeskew_graph("192.168.0.254") 9239 assert(len(ret) == 9) 9240 assert(ret[0][1] == 0.0) 9241 9242 test_timeskew_graph() 9243 9244 tr = TracerouteResult(tr_packets) 9245 saved_AS_resolver = conf.AS_resolver 9246 conf.AS_resolver = None 9247 tr.make_graph() 9248 assert(len(tr.graphdef) == 491) 9249 tr.graphdef.startswith("digraph trace {") == True 9250 assert(('"192.168.0.9" ->' in tr.graphdef) == True) 9251 conf.AS_resolver = conf.AS_resolver 9252 9253 pl = PacketList(list([Ether()/x for x in itertools.chain(*tr_packets)])) 9254 srl, ul = pl.sr() 9255 assert(len(srl) == 9 and len(ul) == 0) 9256 9257 conf_color_theme = conf.color_theme 9258 conf.color_theme = BlackAndWhite() 9259 assert(len(pl.sessions().keys()) == 10) 9260 conf.color_theme = conf_color_theme 9261 9262 new_pl = pl.replace(IP.src, "192.168.0.254", "192.168.0.42") 9263 assert("192.168.0.254" not in [p[IP].src for p in new_pl]) 9264 9265 = IPv4 - reporting 9266 9267 @mock.patch("scapy.layers.inet.sr") 9268 def test_report_ports(mock_sr): 9269 def sr(*args, **kargs): 9270 return [(IP()/TCP(dport=65081, flags="S"), IP()/TCP(sport=65081, flags="SA")), 9271 (IP()/TCP(dport=65082, flags="S"), IP()/ICMP(type=3, code=1)), 9272 (IP()/TCP(dport=65083, flags="S"), IP()/TCP(sport=65083, flags="R"))], [IP()/TCP(dport=65084, flags="S")] 9273 mock_sr.side_effect = sr 9274 report = "\\begin{tabular}{|r|l|l|}\n\hline\n65081 & open & SA \\\\\n\hline\n?? & closed & ICMP type dest-unreach/host-unreachable from 127.0.0.1 \\\\\n65083 & closed & TCP R \\\\\n\hline\n65084 & ? & unanswered \\\\\n\hline\n\end{tabular}\n" 9275 assert(report_ports("www.secdev.org", [65081,65082,65083,65084]) == report) 9276 9277 test_report_ports() 9278 9279 def test_IPID_count(): 9280 with ContextManagerCaptureOutput() as cmco: 9281 random.seed(0x2807) 9282 IPID_count([(IP()/UDP(), IP(id=random.randint(0, 65535))/UDP()) for i in range(3)]) 9283 result_IPID_count = cmco.get_output() 9284 lines = result_IPID_count.split("\n") 9285 assert(len(lines) == 5) 9286 assert(lines[0] in ["Probably 3 classes: [4613, 53881, 58437]", 9287 "Probably 3 classes: [9103, 9227, 46399]"]) 9288 9289 test_IPID_count() 9290 9291 9292 ############ 9293 ############ 9294 + Fields 9295 9296 = FieldLenField with BitField 9297 class Test(Packet): 9298 name = "Test" 9299 fields_desc = [ 9300 FieldLenField("BitCount", None, fmt="H", count_of="Values"), 9301 FieldLenField("ByteCount", None, fmt="B", length_of="Values"), 9302 FieldListField("Values", [], BitField("data", 0x0, size=1), 9303 count_from=lambda pkt: pkt.BitCount), 9304 ] 9305 9306 pkt = Test(raw(Test(Values=[0, 0, 0, 0, 1, 1, 1, 1]))) 9307 assert(pkt.BitCount == 8) 9308 assert(pkt.ByteCount == 1) 9309 9310 ############ 9311 ############ 9312 + MPLS tests 9313 9314 = MPLS - build/dissection 9315 from scapy.contrib.mpls import MPLS 9316 p1 = MPLS()/IP()/UDP() 9317 assert(p1[MPLS].s == 1) 9318 p2 = MPLS()/MPLS()/IP()/UDP() 9319 assert(p2[MPLS].s == 0) 9320 9321 p1[MPLS] 9322 p1[IP] 9323 p2[MPLS] 9324 p2[MPLS:1] 9325 p2[IP] 9326 9327 9328 + Restore normal routes & Ifaces 9329 9330 = Windows 9331 9332 if WINDOWS: 9333 IFACES.reload() 9334 conf.route.resync() 9335 conf.route6.resync() 9336 9337 True 9338 9339 9340 ############ 9341 ############ 9342 + PacketList methods 9343 9344 = plot() 9345 9346 import mock 9347 @mock.patch("scapy.plist.plt") 9348 def test_plot(mock_plt): 9349 def fake_plot(data, **kwargs): 9350 return data 9351 mock_plt.plot = fake_plot 9352 plist = PacketList([IP(id=i)/TCP() for i in range(10)]) 9353 lines = plist.plot(lambda p: (p.time, p.id)) 9354 assert(len(lines) == 10) 9355 9356 test_plot() 9357 9358 = diffplot() 9359 9360 import mock 9361 @mock.patch("scapy.plist.plt") 9362 def test_diffplot(mock_plt): 9363 def fake_plot(data, **kwargs): 9364 return data 9365 mock_plt.plot = fake_plot 9366 plist = PacketList([IP(id=i)/TCP() for i in range(10)]) 9367 lines = plist.diffplot(lambda x,y: (x.time, y.id-x.id)) 9368 assert(len(lines) == 9) 9369 9370 test_diffplot() 9371 9372 = multiplot() 9373 9374 import mock 9375 @mock.patch("scapy.plist.plt") 9376 def test_multiplot(mock_plt): 9377 def fake_plot(data, **kwargs): 9378 return data 9379 mock_plt.plot = fake_plot 9380 tmp = [IP(id=i)/TCP() for i in range(10)] 9381 plist = PacketList([tuple(tmp[i-2:i]) for i in range(2, 10, 2)]) 9382 lines = plist.multiplot(lambda x: (x[1][IP].src, (x[1].time, x[1][IP].id))) 9383 assert(len(lines) == 1) 9384 assert(len(lines[0]) == 4) 9385 9386 test_multiplot() 9387 9388 = rawhexdump() 9389 9390 def test_rawhexdump(): 9391 with ContextManagerCaptureOutput() as cmco: 9392 p = PacketList([IP()/TCP() for i in range(2)]) 9393 p.rawhexdump() 9394 result_pl_rawhexdump = cmco.get_output() 9395 assert(len(result_pl_rawhexdump.split('\n')) == 7) 9396 assert(result_pl_rawhexdump.startswith("0000 45000028")) 9397 9398 test_rawhexdump() 9399 9400 = hexraw() 9401 9402 def test_hexraw(): 9403 with ContextManagerCaptureOutput() as cmco: 9404 p = PacketList([IP()/Raw(str(i)) for i in range(2)]) 9405 p.hexraw() 9406 result_pl_hexraw = cmco.get_output() 9407 assert(len(result_pl_hexraw.split('\n')) == 5) 9408 assert("0000 30" in result_pl_hexraw) 9409 9410 test_hexraw() 9411 9412 = hexdump() 9413 9414 def test_hexdump(): 9415 with ContextManagerCaptureOutput() as cmco: 9416 p = PacketList([IP()/Raw(str(i)) for i in range(2)]) 9417 p.hexdump() 9418 result_pl_hexdump = cmco.get_output() 9419 assert(len(result_pl_hexdump.split('\n')) == 7) 9420 assert("0010 7F00000131" in result_pl_hexdump) 9421 9422 test_hexdump() 9423 9424 = padding() 9425 9426 def test_padding(): 9427 with ContextManagerCaptureOutput() as cmco: 9428 p = PacketList([IP()/conf.padding_layer(str(i)) for i in range(2)]) 9429 p.padding() 9430 result_pl_padding = cmco.get_output() 9431 assert(len(result_pl_padding.split('\n')) == 5) 9432 assert("0000 30" in result_pl_padding) 9433 9434 test_padding() 9435 9436 = nzpadding() 9437 9438 def test_nzpadding(): 9439 with ContextManagerCaptureOutput() as cmco: 9440 p = PacketList([IP()/conf.padding_layer("A%s" % i) for i in range(2)]) 9441 p.nzpadding() 9442 result_pl_nzpadding = cmco.get_output() 9443 assert(len(result_pl_nzpadding.split('\n')) == 5) 9444 assert("0000 4130" in result_pl_nzpadding) 9445 9446 test_nzpadding() 9447 9448 = conversations() 9449 9450 import mock 9451 @mock.patch("scapy.plist.do_graph") 9452 def test_conversations(mock_do_graph): 9453 def fake_do_graph(graph, **kwargs): 9454 return graph 9455 mock_do_graph.side_effect = fake_do_graph 9456 plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)]) 9457 plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)]) 9458 result_conversations = plist.conversations() 9459 assert(len(result_conversations.split('\n')) == 5) 9460 assert(result_conversations.startswith('digraph "conv" {')) 9461 9462 test_conversations() 9463 9464 = afterglow() 9465 9466 import mock 9467 @mock.patch("scapy.plist.do_graph") 9468 def test_afterglow(mock_do_graph): 9469 def fake_do_graph(graph, **kwargs): 9470 return graph 9471 mock_do_graph.side_effect = fake_do_graph 9472 plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)]) 9473 plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)]) 9474 result_afterglow = plist.afterglow() 9475 assert(len(result_afterglow.split('\n')) == 19) 9476 assert(result_afterglow.startswith('digraph "afterglow" {')) 9477 9478 test_afterglow() 9479 9480 = psdump() 9481 9482 print("PYX: %d" % PYX) 9483 if PYX: 9484 import tempfile 9485 import os 9486 filename = tempfile.mktemp(suffix=".ps") 9487 plist = PacketList([IP()/TCP()]) 9488 plist.psdump(filename) 9489 assert(os.path.exists(filename)) 9490 os.unlink(filename) 9491 9492 = pdfdump() 9493 9494 print("PYX: %d" % PYX) 9495 if PYX: 9496 import tempfile 9497 import os 9498 filename = tempfile.mktemp(suffix=".pdf") 9499 plist = PacketList([IP()/TCP()]) 9500 plist.pdfdump(filename) 9501 assert(os.path.exists(filename)) 9502 os.unlink(filename) 9503 9504 ############ 9505 ############ 9506 + Scapy version 9507 9508 = _version() 9509 9510 import os 9511 version_filename = os.path.join(scapy._SCAPY_PKG_DIR, "VERSION") 9512 9513 version = scapy._version() 9514 assert(os.path.exists(version_filename)) 9515 9516 import mock 9517 with mock.patch("scapy._version_from_git_describe") as version_mocked: 9518 version_mocked.side_effect = Exception() 9519 assert(scapy._version() == version) 9520 os.unlink(version_filename) 9521 assert(scapy._version() == "git-archive.dev$Format:%h") 9522 9523 9524 ############ 9525 # RTP 9526 ############ 9527 9528 + RTP tests 9529 9530 = test rtp with extension header 9531 ~ rtp 9532 9533 data = b'\x90o\x14~YY\xf5h\xcc#\xd7\xcfUH\x00\x03\x167116621 \x000\x00' 9534 pkt = RTP(data) 9535 assert "RTP" in pkt 9536 parsed = pkt["RTP"] 9537 assert parsed.version == 2 9538 assert parsed.extension 9539 assert parsed.numsync == 0 9540 assert not parsed.marker 9541 assert parsed.payload_type == 111 9542 assert parsed.sequence == 5246 9543 assert parsed.timestamp == 1499067752 9544 assert parsed.sourcesync == 0xcc23d7cf 9545 assert "RTPExtension" in parsed, parsed.show() 9546 assert parsed["RTPExtension"].header_id == 0x5548 9547 assert parsed["RTPExtension"].header == [0x16373131,0x36363231,0x20003000] 9548 9549 = test layer creation 9550 9551 created = RTP(extension=True, payload_type="PCMA", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01) 9552 created /= RTPExtension(header_id=0x4321, header=[0x11223344]) 9553 assert raw(created) == b'\x90\x08\x124\x00\xbcaN\xab\xcd\xef\x01C!\x00\x01\x11"3D' 9554 parsed = RTP(raw(created)) 9555 assert parsed.payload_type == 8 9556 assert "RTPExtension" in parsed, parsed.show() 9557 assert parsed["RTPExtension"].header == [0x11223344] 9558 9559 = test RTP without extension 9560 9561 created = RTP(extension=False, payload_type="DVI4", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01) 9562 assert raw(created) == b'\x80\x11\x124\x00\xbcaN\xab\xcd\xef\x01' 9563 parsed = RTP(raw(created)) 9564 assert parsed.sourcesync == 0xabcdef01 9565 assert "RTPExtension" not in parsed 9566