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
12conf
13
14IP().src
15scapy.consts.LOOPBACK_INTERFACE
16
17= List layers
18~ conf command
19ls()
20
21= List commands
22~ conf command
23lsc()
24
25= List contribs
26def 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
33test_list_contrib()
34
35= Configuration
36~ conf
37conf.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
45if WINDOWS:
46    route_add_loopback()
47
48IP().src
49assert _ == "127.0.0.1"
50
51############
52############
53+ Scapy functions tests
54
55= Interface related functions
56
57get_if_raw_hwaddr(conf.iface)
58
59bytes_hex(get_if_raw_addr(conf.iface))
60
61def 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
77get_if_raw_addr(get_dummy_interface())
78
79get_if_list()
80
81get_if_raw_addr6(conf.iface6)
82
83= Test read_routes6() - default output
84
85routes6 = read_routes6()
86if WINDOWS:
87    route_add_loopback(routes6, True)
88
89routes6
90
91# Expected results:
92# - one route if there is only the loopback interface
93# - three routes if there is a network interface
94
95if 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
105else:
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
112if 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
117else:
118    True
119
120= Test ifchange()
121conf.route6.ifchange(LOOPBACK_NAME, "::1/128")
122True
123
124
125############
126############
127+ Main.py tests
128
129= Pickle and unpickle a packet
130
131import scapy.modules.six as six
132
133a = IP(dst="192.168.0.1")/UDP()
134
135b = six.moves.cPickle.dumps(a)
136c = six.moves.cPickle.loads(b)
137
138assert c[IP].dst == "192.168.0.1"
139assert raw(c) == raw(a)
140
141= Usage test
142
143from scapy.main import _usage
144try:
145    _usage()
146    assert False
147except SystemExit:
148    assert True
149
150= Session test
151
152# This is automatic when using the console
153def get_var(var):
154    return six.moves.builtins.__dict__["scapy_session"][var]
155
156def set_var(var, value):
157    six.moves.builtins.__dict__["scapy_session"][var] = value
158
159def del_var(var):
160    del(six.moves.builtins.__dict__["scapy_session"][var])
161
162init_session(None, {"init_value": 123})
163set_var("test_value", "8.8.8.8") # test_value = "8.8.8.8"
164save_session()
165del_var("test_value")
166load_session()
167update_session()
168assert get_var("test_value") == "8.8.8.8" #test_value == "8.8.8.8"
169assert get_var("init_value") == 123
170
171= Session test with fname
172
173init_session("scapySession2")
174set_var("test_value", IP(dst="192.168.0.1")) # test_value = IP(dst="192.168.0.1")
175save_session(fname="scapySession1.dat")
176del_var("test_value")
177
178set_var("z", True) #z = True
179load_session(fname="scapySession1.dat")
180try:
181    get_var("z")
182    assert False
183except:
184    pass
185
186set_var("z", False) #z = False
187update_session(fname="scapySession1.dat")
188assert get_var("test_value").dst == "192.168.0.1" #test_value.dst == "192.168.0.1"
189assert not get_var("z")
190
191= Clear session files
192
193os.remove("scapySession1.dat")
194
195= Test temporary file creation
196~ appveyor_only
197
198scapy_delete_temp_files()
199
200tmpfile = get_temp_file(autoext=".ut")
201tmpfile
202if WINDOWS:
203    assert("scapy" in tmpfile and tmpfile.lower().startswith('c:\\users\\appveyor\\appdata\\local\\temp'))
204else:
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
209assert(conf.temp_files[0].endswith(".ut"))
210scapy_delete_temp_files()
211assert(len(conf.temp_files) == 0)
212
213= Emulate interact()
214
215import mock, sys
216from scapy.main import interact
217# Detect IPython
218try:
219    import IPython
220except:
221    code_interact_import = "scapy.main.code.interact"
222else:
223    code_interact_import = "IPython.terminal.embed.InteractiveShellEmbed"
224
225@mock.patch(code_interact_import)
226def 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
237assert interact_emulator()  # Default
238assert not interact_emulator(extra_args=["-?"])  # Failing
239assert interact_emulator(extra_args=["-d"])  # Extended
240
241= Test sane function
242sane("A\x00\xFFB") == "A..B"
243
244= Test lhex function
245assert(lhex(42) == "0x2a")
246assert(lhex((28,7)) == "(0x1c, 0x7)")
247assert(lhex([28,7]) == "[0x1c, 0x7]")
248
249= Test restart function
250import mock
251conf.interactive = True
252
253try:
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()
270finally:
271    conf.interactive = False
272
273= Test linehexdump function
274conf_color_theme = conf.color_theme
275conf.color_theme = BlackAndWhite()
276assert(linehexdump(Ether(src="00:01:02:03:04:05"), dump=True) == "FFFFFFFFFFFF0001020304059000 ..............")
277conf.color_theme = conf_color_theme
278
279= Test chexdump function
280chexdump(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
283repr_hex("scapy") == "7363617079"
284
285= Test hexstr function
286hexstr(b"A\x00\xFFB") == "41 00 ff 42  A..B"
287
288= Test fletcher16 functions
289assert(fletcher16_checksum(b"\x28\x07") == 22319)
290assert(fletcher16_checkbytes(b"\x28\x07", 1) == b"\xaf(")
291
292= Test hexdiff function
293~ not_pypy
294def 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
306test_hexdiff()
307
308= Test mysummary functions - Ether
309
310Ether(dst="ff:ff:ff:ff:ff:ff", src="ff:ff:ff:ff:ff:ff", type=0x9000)
311assert _.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
315random.seed(0x2807)
316zerofree_randstring(4) in [b"\xd2\x12\xe4\x5b", b'\xd3\x8b\x13\x12']
317
318= Test export_object and import_object functions
319import mock
320def 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
327test_export_import_object()
328
329= Test tex_escape function
330tex_escape("$#_") == "\\$\\#\\_"
331
332= Test colgen function
333f = colgen(range(3))
334assert(len([next(f) for i in range(2)]) == 2)
335
336= Test incremental_label function
337f = incremental_label()
338assert([next(f) for i in range(2)] == ["tag00000", "tag00001"])
339
340= Test corrupt_* functions
341import random
342random.seed(0x2807)
343assert(corrupt_bytes("ABCDE") in [b"ABCDW", b"ABCDX"])
344assert(sane(corrupt_bytes("ABCDE", n=3)) in ["A.8D4", ".2.DE"])
345
346assert(corrupt_bits("ABCDE") in [b"EBCDE", b"ABCDG"])
347assert(sane(corrupt_bits("ABCDE", n=3)) in ["AF.EE", "QB.TE"])
348
349= Test save_object and load_object functions
350import tempfile
351fd, fname = tempfile.mkstemp()
352save_object(fname, 2807)
353assert(load_object(fname) == 2807)
354
355= Test whois function
356if 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
362assert(conf.manufdb._resolve_MAC("00:00:0F:01:02:03") == "Next:01:02:03")
363assert(conf.manufdb._get_short_manuf("00:00:0F:01:02:03") == "Next")
364assert(in6_addrtovendor("fe80::0200:0fff:fe01:0203").lower().startswith("next"))
365
366= Test utility functions - network related
367~ netaccess
368
369atol("www.secdev.org") == 3642339845
370
371= Test autorun functions
372
373ret = autorun_get_text_interactive_session("IP().src")
374assert(ret == (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1'))
375
376ret = autorun_get_html_interactive_session("IP().src")
377assert(ret == ("<span class=prompt>&gt;&gt;&gt; </span>IP().src\n'127.0.0.1'\n", '127.0.0.1'))
378
379ret = autorun_get_latex_interactive_session("IP().src")
380assert(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
384assert tex_escape("{scapy}\\^$~#_&%|><") == "{\\tt\\char123}scapy{\\tt\\char125}{\\tt\\char92}\\^{}\\${\\tt\\char126}\\#\\_\\&\\%{\\tt\\char124}{\\tt\\char62}{\\tt\\char60}"
385
386a = colgen(1, 2, 3)
387assert next(a) == (1, 2, 2)
388assert next(a) == (1, 3, 3)
389assert next(a) == (2, 2, 1)
390assert next(a) == (2, 3, 2)
391assert next(a) == (2, 1, 3)
392assert next(a) == (3, 3, 1)
393assert next(a) == (3, 1, 2)
394assert next(a) == (3, 2, 3)
395
396= Test config file functions
397
398saved_conf_verb = conf.verb
399fd, fname = tempfile.mkstemp()
400os.write(fd, b"conf.verb = 42\n")
401os.close(fd)
402from scapy.main import _read_config_file
403_read_config_file(fname, globals(), locals())
404assert(conf.verb == 42)
405conf.verb = saved_conf_verb
406
407= Test CacheInstance repr
408
409conf.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
420p = IP()/ICMP()
421ret = p.do_build_ps()
422assert(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")
423assert(len(ret[1]) == 2)
424
425assert(p[ICMP].firstlayer() == p)
426
427assert(p.command() == "IP()/ICMP()")
428
429p.decode_payload_as(UDP)
430assert(p.sport == 2048 and p.dport == 63487)
431
432= hide_defaults
433conf_color_theme = conf.color_theme
434conf.color_theme = BlackAndWhite()
435p = IP(ttl=64)/ICMP()
436assert(repr(p) in ["<IP  frag=0 ttl=64 proto=icmp |<ICMP  |>>", "<IP  frag=0 ttl=64 proto=1 |<ICMP  |>>"])
437p.hide_defaults()
438assert(repr(p) in ["<IP  frag=0 proto=icmp |<ICMP  |>>", "<IP  frag=0 proto=1 |<ICMP  |>>"])
439conf.color_theme = conf_color_theme
440
441= split_layers
442p = IP()/ICMP()
443s = raw(p)
444split_layers(IP, ICMP, proto=1)
445assert(Raw in IP(s))
446bind_layers(IP, ICMP, frag=0, proto=1)
447
448= fuzz
449~ not_pypy random_weird_py3
450random.seed(0x2807)
451raw(fuzz(IP()/ICMP()))
452assert _ 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
459IP()/TCP()
460Ether()/IP()/UDP()/NTP()
461Dot11()/LLC()/SNAP()/IP()/TCP()/"XXX"
462IP(ttl=25)/TCP(sport=12, dport=42)
463IP().summary()
464
465= Manipulating some packets
466~ basic IP TCP
467a=IP(ttl=4)/TCP()
468a.ttl
469a.ttl=10
470del(a.ttl)
471a.ttl
472TCP in a
473a[TCP]
474a[TCP].dport=[80,443]
475a
476assert(a.copy().time == a.time)
477a=3
478
479
480= Checking overloads
481~ basic IP TCP Ether
482a=Ether()/IP()/TCP()
483a.proto
484_ == 6
485
486
487= sprintf() function
488~ basic sprintf Ether IP UDP NTP
489a=Ether()/IP()/IP(ttl=4)/UDP()/NTP()
490a.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>
497a=Dot11()/LLC()/SNAP()/IP()/TCP()
498a.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
504x=IP(id=1)/ISAKMP_payload_SA(prop=ISAKMP_payload_SA(prop=IP()/ICMP()))/TCP()
505TCP 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
510x=IP(id=1)/ISAKMP_payload_SA(prop=IP(id=2)/UDP(dport=1))/IP(id=3)/UDP(dport=2)
511x[IP]
512x[IP:2]
513x[IP:3]
514x.getlayer(IP,3)
515x.getlayer(IP,4)
516x[UDP]
517x[UDP:1]
518x[UDP:2]
519assert(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)
523try:
524    x[IP:4]
525except IndexError:
526    True
527else:
528    False
529
530= getlayer with a filter
531~ getlayer IP
532pkt = IP() / IP(ttl=3) / IP()
533assert pkt[IP::{"ttl":3}].ttl == 3
534assert pkt.getlayer(IP, ttl=3).ttl == 3
535
536= specific haslayer and getlayer implementations for NTP
537~ haslayer getlayer NTP
538pkt = IP() / UDP() / NTPHeader()
539assert NTP in pkt
540assert pkt.haslayer(NTP)
541assert isinstance(pkt[NTP], NTPHeader)
542assert isinstance(pkt.getlayer(NTP), NTPHeader)
543
544= specific haslayer and getlayer implementations for EAP
545~ haslayer getlayer EAP
546pkt = Ether() / EAPOL() / EAP_MD5()
547assert EAP in pkt
548assert pkt.haslayer(EAP)
549assert isinstance(pkt[EAP], EAP_MD5)
550assert isinstance(pkt.getlayer(EAP), EAP_MD5)
551
552= specific haslayer and getlayer implementations for RadiusAttribute
553~ haslayer getlayer RadiusAttribute
554pkt = RadiusAttr_EAP_Message()
555assert RadiusAttribute in pkt
556assert pkt.haslayer(RadiusAttribute)
557assert isinstance(pkt[RadiusAttribute], RadiusAttr_EAP_Message)
558assert isinstance(pkt.getlayer(RadiusAttribute), RadiusAttr_EAP_Message)
559
560
561= equality
562~ basic
563w=Ether()/IP()/UDP(dport=53)
564x=Ether()/IP(version=4)/UDP()
565y=Ether()/IP()/UDP(dport=4)
566z=Ether()/IP()/UDP()/NTP()
567t=Ether()/IP()/TCP()
568x==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
573a1, a2 = "1.2.3.4", "5.6.7.8"
574p1 = IP(src=a1, dst=a2)/ICMP(type=8)
575p2 = IP(src=a2, dst=a1)/ICMP(type=0)
576assert p1.hashret() == p2.hashret()
577assert not p1.answers(p2)
578assert p2.answers(p1)
579assert p1 > p2
580assert p2 < p1
581assert p1 == p1
582conf_back = conf.checkIPinIP
583conf.checkIPinIP = True
584px = [IP()/p1, IPv6()/p1]
585assert not any(p.hashret() == p2.hashret() for p in px)
586assert not any(p.answers(p2) for p in px)
587assert not any(p2.answers(p) for p in px)
588conf.checkIPinIP = False
589assert all(p.hashret() == p2.hashret() for p in px)
590assert not any(p.answers(p2) for p in px)
591assert all(p2.answers(p) for p in px)
592conf.checkIPinIP = conf_back
593
594a1, a2 = Net("www.google.com"), Net("www.secdev.org")
595prt1, prt2 = 12345, 54321
596s1, s2 = 2767216324, 3845532842
597p1 = IP(src=a1, dst=a2)/TCP(flags='SA', seq=s1, ack=s2, sport=prt1, dport=prt2)
598p2 = IP(src=a2, dst=a1)/TCP(flags='R', seq=s2, ack=0, sport=prt2, dport=prt1)
599assert p2.answers(p1)
600assert not p1.answers(p2)
601# Not available yet because of IPv6
602# a1, a2 = Net6("www.google.com"), Net6("www.secdev.org")
603p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
604p2 = IP(src=a2, dst=a1)/TCP(flags='RA', seq=0, ack=s1+1, sport=prt2, dport=prt1)
605assert p2.answers(p1)
606assert not p1.answers(p2)
607p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
608p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+1, sport=prt2, dport=prt1)
609assert p2.answers(p1)
610assert not p1.answers(p2)
611p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2)
612assert not p2.answers(p1)
613assert p1.answers(p2)
614p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2)
615p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+10, sport=prt2, dport=prt1)
616assert not p2.answers(p1)
617assert not p1.answers(p2)
618p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2)
619assert not p2.answers(p1)
620assert not p1.answers(p2)
621p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1+9, ack=s2+10, sport=prt1, dport=prt2)
622assert not p2.answers(p1)
623assert not p1.answers(p2)
624
625
626############
627############
628+ Tests on padding
629
630= Padding assembly
631raw(Padding("abc"))
632assert( _ == b"abc" )
633raw(Padding("abc")/Padding("def"))
634assert( _ == b"abcdef" )
635raw(Raw("ABC")/Padding("abc")/Padding("def"))
636assert( _ == b"ABCabcdef" )
637raw(Raw("ABC")/Padding("abc")/Raw("DEF")/Padding("def"))
638assert( _ == b"ABCDEFabcdef" )
639
640= Padding and length computation
641IP(raw(IP()/Padding("abc")))
642assert( _.len == 20 and len(_) == 23 )
643IP(raw(IP()/Raw("ABC")/Padding("abc")))
644assert( _.len == 23 and len(_) == 26 )
645IP(raw(IP()/Raw("ABC")/Padding("abc")/Padding("def")))
646assert( _.len == 23 and len(_) == 29 )
647
648= PadField test
649~ PadField padding
650
651class TestPad(Packet):
652    fields_desc = [ PadField(StrNullField("st", b""),4), StrField("id", b"")]
653
654TestPad() == 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
662class IPv3(IP):
663    version = 3
664    ttl = 32
665
666= Test of IPv3 class
667a = IPv3()
668a.version, a.ttl
669assert(_ == (3,32))
670raw(a)
671assert(_ == 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
680p=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)])))
681p.show()
682p
683
684
685= ISAKMP manipulation
686~ ISAKMP
687p[ISAKMP_payload_Transform:2]
688_.res2 == 12345
689
690= ISAKMP assembly
691~ ISAKMP
692hexdump(p)
693raw(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
698q=IP(raw(p))
699q.show()
700q[ISAKMP_payload_Transform:2]
701_.res2 == 12345
702
703
704############
705############
706+ TFTP tests
707
708= TFTP Options
709x=IP()/UDP(sport=12345)/TFTP()/TFTP_RRQ(filename="fname")/TFTP_Options(options=[TFTP_Option(oname="blksize", value="8192"),TFTP_Option(oname="other", value="othervalue")])
710assert( 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' )
711y=IP(raw(x))
712y[TFTP_Option].oname
713y[TFTP_Option:2].oname
714assert(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
724conf.wepkey = "Fobar"
725raw(Dot11WEP()/LLC()/SNAP()/IP()/TCP(seq=12345678))
726assert(_ == 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')
727Dot11WEP(_)
728assert(TCP in _ and _[TCP].seq == 12345678)
729
730= RadioTap Big-Small endian dissection
731data = b'\x00\x00\x1a\x00/H\x00\x00\xe1\xd3\xcb\x05\x00\x00\x00\x00@0x\x14@\x01\xac\x00\x00\x00'
732r = RadioTap(data)
733r.show()
734assert r.present == 18479
735
736
737############
738############
739+ SNMP tests
740
741= SNMP assembling
742~ SNMP ASN1
743raw(SNMP())
744assert(_ == b'0\x18\x02\x01\x01\x04\x06public\xa0\x0b\x02\x01\x00\x02\x01\x00\x02\x01\x000\x00')
745SNMP(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"))]))
746raw(_)
747assert(_ == 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
751x=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')
752x.show()
753assert(x.community==b"public" and x.version == 0)
754assert(x.PDU.id == 41 and len(x.PDU.varbindlist) == 3)
755assert(x.PDU.varbindlist[0].oid == "1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104")
756assert(x.PDU.varbindlist[0].value == b"172.31.19.2")
757assert(x.PDU.varbindlist[2].oid == "1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400")
758assert(x.PDU.varbindlist[2].value == 1)
759
760= ASN1 - ASN1_Object
761assert ASN1_Object(1) == ASN1_Object(1)
762assert ASN1_Object(1) > ASN1_Object(0)
763assert ASN1_Object(1) >= ASN1_Object(1)
764assert ASN1_Object(0) < ASN1_Object(1)
765assert ASN1_Object(1) <= ASN1_Object(2)
766assert ASN1_Object(1) != ASN1_Object(2)
767ASN1_Object(2).show()
768
769= ASN1 - RandASN1Object
770~ random_weird_py3
771a = RandASN1Object()
772random.seed(0x2807)
773assert raw(a) in [b'A\x02\x07q', b'C\x02\xfe\x92', b'\x1e\x023V']
774
775= ASN1 - ASN1_BIT_STRING
776a = ASN1_BIT_STRING("test", "value")
777a
778assert raw(a) == b'test'
779
780a = ASN1_BIT_STRING(b"\xff"*16, "value")
781a
782assert raw(a) == b'\xff'*16
783
784= ASN1 - ASN1_SEQUENCE
785a = ASN1_SEQUENCE([ASN1_Object(1), ASN1_Object(0)])
786assert a.strshow() == '# ASN1_SEQUENCE:\n  <ASN1_Object[1]>\n  <ASN1_Object[0]>\n'
787
788= ASN1 - ASN1_DECODING_ERROR
789a = ASN1_DECODING_ERROR("error", exc=OSError(1))
790assert repr(a) == "<ASN1_DECODING_ERROR['error']{{1}}>"
791b = ASN1_DECODING_ERROR("error", exc=OSError(ASN1_BIT_STRING("0")))
792assert repr(b) == "<ASN1_DECODING_ERROR['error']{{<ASN1_BIT_STRING[0] (7 unused bits)>}}>"
793
794= ASN1 - ASN1_INTEGER
795a = ASN1_INTEGER(int("1"*23))
796assert repr(a) in ["0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...1111111111]>",
797                   "0x25a55a46e5da99c71c7 <ASN1_INTEGER[1111111111...111111111L]>"]
798
799= RandASN1Object(), specific crashes
800
801import random
802
803# ASN1F_NUMERIC_STRING
804random.seed(1514315682)
805raw(RandASN1Object())
806
807# ASN1F_VIDEOTEX_STRING
808random.seed(1240186058)
809raw(RandASN1Object())
810
811# ASN1F_UTC_TIME & ASN1F_GENERALIZED_TIME
812random.seed(1873503288)
813raw(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
824old_debug_dissector = conf.debug_dissector
825conf.debug_dissector = False
826x = sr1(IP(dst="www.google.com")/ICMP(),timeout=3)
827conf.debug_dissector = old_debug_dissector
828x
829assert x[IP].ottl() in [32, 64, 128, 255]
830assert 0 <= x[IP].hops() <= 126
831x 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
835tmp = send(IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True)
836assert(len(tmp) == 1)
837
838tmp = sendp(Ether()/IP(dst="8.8.8.8")/ICMP(), return_packets=True, realtime=True)
839assert(len(tmp) == 1)
840
841= Sending an ICMP message 'forever' at layer 2 and layer 3
842~ netaccess IP ICMP
843tmp = srloop(IP(dst="8.8.8.8")/ICMP(), count=1)
844assert(type(tmp) == tuple and len(tmp[0]) == 1)
845
846tmp = srploop(Ether()/IP(dst="8.8.8.8")/ICMP(), count=1)
847assert(type(tmp) == tuple and len(tmp[0]) == 1)
848
849= Sending and receiving an ICMP with flooding methods
850~ netaccess IP ICMP
851from functools import partial
852# flooding methods do not support timeout. Packing the test for security
853def _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)
869t = Thread(target=_test_srflood)
870t.start()
871t.join(3)
872assert not t.is_alive()
873
874_test_sr1flood = partial(_test_flood, sr1flood)
875t = Thread(target=_test_sr1flood)
876t.start()
877t.join(3)
878assert not t.is_alive()
879
880_test_srpflood = partial(_test_flood, srpflood, True)
881t = Thread(target=_test_sr1flood)
882t.start()
883t.join(3)
884assert not t.is_alive()
885
886_test_srp1flood = partial(_test_flood, srp1flood, True)
887t = Thread(target=_test_sr1flood)
888t.start()
889t.join(3)
890assert not t.is_alive()
891
892= Sending and receiving an ICMPv6EchoRequest
893~ netaccess ipv6
894old_debug_dissector = conf.debug_dissector
895conf.debug_dissector = False
896x = sr1(IPv6(dst="www.google.com")/ICMPv6EchoRequest(),timeout=3)
897conf.debug_dissector = old_debug_dissector
898x
899assert x[IPv6].ottl() in [32, 64, 128, 255]
900assert 0 <= x[IPv6].hops() <= 126
901x 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.
907old_debug_dissector = conf.debug_dissector
908conf.debug_dissector = False
909dns_ans = sr1(IP(dst="resolver1.opendns.com")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.slashdot.com")),timeout=5)
910conf.debug_dissector = old_debug_dissector
911DNS in dns_ans
912
913= Whois request
914~ netaccess IP
915* This test retries on failure because it often fails
916import time
917import socket
918success = False
919for 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
928assert success
929
930= AS resolvers
931~ netaccess IP
932* This test retries on failure because it often fails
933
934ret = list()
935success = False
936for 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
945assert (len(ret) == 2)
946all(x[1] == "AS15169" for x in ret)
947
948ret = list()
949success = False
950for 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
959assert (len(ret) == 1)
960assert 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
978cymru_bulk_data = """
979Bulk mode; whois.cymru.com [2017-10-03 08:38:08 +0000]
98024776   | 217.25.178.5     | INFOCLIP-AS, FR
98136459   | 192.30.253.112   | GITHUB - GitHub, Inc., US
98226496   | 68.178.213.61    | AS-26496-GO-DADDY-COM-LLC - GoDaddy.com, LLC, US
983"""
984tmp = AS_resolver_cymru().parse(cymru_bulk_data)
985assert(len(tmp) == 3)
986assert([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
992ret = list()
993success = False
994as_resolver6 = AS_resolver6()
995for 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
1004assert (len(ret) == 2)
1005assert all(x[1] == 15169 for x in ret)
1006
1007= sendpfast
1008
1009old_interactive = conf.interactive
1010conf.interactive = False
1011try:
1012    sendpfast([])
1013    assert False
1014except Exception:
1015    assert True
1016
1017conf.interactive = old_interactive
1018assert True
1019
1020############
1021############
1022+ More complex tests
1023
1024= Implicit logic
1025~ IP TCP
1026a = Ether() / IP(ttl=(5, 10)) / TCP(dport=[80, 443])
1027ls(a)
1028ls(a, verbose=True)
1029[p for p in a]
1030len(_) == 12
1031
1032
1033############
1034############
1035+ Real usages
1036
1037= Port scan
1038~ netaccess IP TCP
1039old_debug_dissector = conf.debug_dissector
1040conf.debug_dissector = False
1041ans,unans=sr(IP(dst="www.google.com/30")/TCP(dport=[80,443]),timeout=2)
1042conf.debug_dissector = old_debug_dissector
1043ans.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
1047old_debug_dissector = conf.debug_dissector
1048conf.debug_dissector = False
1049ans, unans = sr(IP(dst=["8.8.8.8", "1.2.3.4"]) / ICMP(), timeout=2, retry=1)
1050conf.debug_dissector = old_debug_dissector
1051len(ans) == 1 and len(unans) == 1
1052
1053= Traceroute function
1054~ netaccess
1055* Let's test traceroute
1056traceroute("www.slashdot.org")
1057ans,unans=_
1058
1059= Result manipulation
1060~ netaccess
1061ans.nsummary()
1062s,r=ans[0]
1063s.show()
1064s.show(2)
1065
1066= DNS packet manipulation
1067~ netaccess IP UDP DNS
1068dns_ans.show()
1069dns_ans.show2()
1070dns_ans[DNS].an.show()
1071dns_ans2 = IP(raw(dns_ans))
1072DNS in dns_ans2
1073assert(raw(dns_ans2) == raw(dns_ans))
1074dns_ans2.qd.qname = "www.secdev.org."
1075* We need to recalculate these values
1076del(dns_ans2[IP].len)
1077del(dns_ans2[IP].chksum)
1078del(dns_ans2[UDP].len)
1079del(dns_ans2[UDP].chksum)
1080assert(b"\x03www\x06secdev\x03org\x00" in raw(dns_ans2))
1081assert(DNS in IP(raw(dns_ans2)))
1082
1083= Arping
1084~ netaccess
1085* This test assumes the local network is a /24. This is bad.
1086conf.route.route("0.0.0.0")[2]
1087arping(_+"/24")
1088
1089= send() and sniff()
1090~ netaccess
1091import time
1092import os
1093
1094from scapy.modules.six.moves.queue import Queue
1095
1096def _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
1121def 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
1141send_and_sniff(IP(dst="secdev.org")/ICMP())
1142send_and_sniff(IP(dst="secdev.org")/ICMP(), flt="icmp")
1143send_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
1149import time
1150for 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
1162response = res[0][1]
1163assert response[ICMP].type == 0
1164
1165############
1166############
1167+ ManuFDB tests
1168
1169= __repr__
1170
1171if conf.manufdb:
1172    len(conf.manufdb)
1173else:
1174    True
1175
1176= check _resolve_MAC
1177
1178if conf.manufdb:
1179    assert conf.manufdb._resolve_MAC("00:00:63") == "HP"
1180else:
1181    True
1182
1183############
1184############
1185+ Automaton tests
1186
1187= Simple automaton
1188~ automaton
1189class 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
1221a=ATMT1(init="a", ll=lambda: None, recvsock=lambda: None)
1222a.run()
1223assert( _ == 'aabaaababaaabaaababab' )
1224a.result
1225assert( _ == 'aabaaababaaabaaababab' )
1226a=ATMT1(init="b", ll=lambda: None, recvsock=lambda: None)
1227a.run()
1228assert( _ == 'babababababababababababababab' )
1229a.result
1230assert( _ == 'babababababababababababababab' )
1231
1232= Simple automaton stuck test
1233~ automaton
1234
1235try:
1236    ATMT1(init="", ll=lambda: None, recvsock=lambda: None).run()
1237except Automaton.Stuck:
1238    True
1239else:
1240    False
1241
1242
1243= Automaton state overloading
1244~ automaton
1245class ATMT2(ATMT1):
1246    @ATMT.state()
1247    def MAIN(self, s):
1248        return "c"+ATMT1.MAIN(self, s).run()
1249
1250a=ATMT2(init="a", ll=lambda: None, recvsock=lambda: None)
1251a.run()
1252assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
1253
1254
1255a.result
1256assert( _ == 'ccccccacabacccacababacccccacabacccacababab' )
1257a=ATMT2(init="b", ll=lambda: None, recvsock=lambda: None)
1258a.run()
1259assert( _ == 'cccccbaccbabaccccbaccbabab')
1260a.result
1261assert( _ == 'cccccbaccbabaccccbaccbabab')
1262
1263
1264= Automaton condition overloading
1265~ automaton
1266class 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
1273a=ATMT3(init="a", debug=2, ll=lambda: None, recvsock=lambda: None)
1274a.run()
1275assert( _ == 'cccccacabdacccacabdabda')
1276a.result
1277assert( _ == 'cccccacabdacccacabdabda')
1278a=ATMT3(init="b", ll=lambda: None, recvsock=lambda: None)
1279a.run()
1280assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
1281
1282a.result
1283assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
1284
1285
1286= Automaton action overloading
1287~ automaton
1288class ATMT4(ATMT3):
1289    @ATMT.action(ATMT1.go_to_END)
1290    def action_test(self, s):
1291        self.result = "e"+s+"e"
1292
1293a=ATMT4(init="a", ll=lambda: None, recvsock=lambda: None)
1294a.run()
1295assert( _ == 'cccccacabdacccacabdabda')
1296a.result
1297assert( _ == 'ecccccacabdacccacabdabdae')
1298a=ATMT4(init="b", ll=lambda: None, recvsock=lambda: None)
1299a.run()
1300assert( _ == 'cccccbdaccbdabdaccccbdaccbdabdab' )
1301a.result
1302assert( _ == 'ecccccbdaccbdabdaccccbdaccbdabdabe' )
1303
1304
1305= Automaton priorities
1306~ automaton
1307class 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
1336a=ATMT5(ll=lambda: None, recvsock=lambda: None)
1337a.run()
1338assert( _ == 'Jupiter' )
1339
1340= Automaton test same action for many conditions
1341~ automaton
1342class 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
1372a=ATMT6(ll=lambda: None, recvsock=lambda: None)
1373a.run()
1374assert( _ == 'Mercury' )
1375
1376a.restart()
1377a.run()
1378assert( _ == 'Mercury' )
1379
1380= Automaton test io event
1381~ automaton
1382
1383class 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
1403a=ATMT7(ll=lambda: None, recvsock=lambda: None)
1404a.run(wait=False)
1405a.io.tst.send("at")
1406a.io.tst.recv()
1407a.io.tst.send(_)
1408a.run()
1409assert( _ == "Saturn" )
1410
1411a.restart()
1412a.run(wait=False)
1413a.io.tst.send("at")
1414a.io.tst.recv()
1415a.io.tst.send(_)
1416a.run()
1417assert( _ == "Saturn" )
1418
1419= Automaton test io event from external fd
1420~ automaton
1421import os
1422
1423class 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
1443if WINDOWS:
1444    r = w = ObjectPipe()
1445else:
1446    r,w = os.pipe()
1447
1448def writeOn(w, msg):
1449    if WINDOWS:
1450        w.write(msg)
1451    else:
1452        os.write(w, msg)
1453
1454a=ATMT8(external_fd={"extfd":r}, ll=lambda: None, recvsock=lambda: None)
1455a.run(wait=False)
1456writeOn(w, b"ra")
1457writeOn(w, b"nu")
1458
1459a.run()
1460assert( _ == b"Uranus" )
1461
1462a.restart()
1463a.run(wait=False)
1464writeOn(w, b"ra")
1465writeOn(w, b"nu")
1466a.run()
1467assert( _ == b"Uranus" )
1468
1469= Automaton test interception_points, and restart
1470~ automaton
1471class 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
1487a=ATMT9(debug=5, ll=lambda: None, recvsock=lambda: None)
1488a.run()
1489assert( _ == "VENUs" )
1490
1491a.restart()
1492a.run()
1493assert( _ == "VENUs" )
1494
1495a.restart()
1496a.BEGIN.intercepts()
1497while 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
1505x
1506assert( _ == "Venus" )
1507
1508
1509############
1510############
1511+ Test IP options
1512
1513= IP options individual assembly
1514~ IP options
1515raw(IPOption())
1516assert(_ == b'\x00\x02')
1517raw(IPOption_NOP())
1518assert(_ == b'\x01')
1519raw(IPOption_EOL())
1520assert(_ == b'\x00')
1521raw(IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"]))
1522assert(_ == b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08')
1523
1524= IP options individual dissection
1525~ IP options
1526IPOption(b"\x00")
1527assert(_.option == 0 and isinstance(_, IPOption_EOL))
1528IPOption(b"\x01")
1529assert(_.option == 1 and isinstance(_, IPOption_NOP))
1530lsrr=b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08'
1531p=IPOption_LSRR(lsrr)
1532p
1533q=IPOption(lsrr)
1534q
1535assert(p == q)
1536
1537= IP assembly and dissection with options
1538~ IP options
1539p = IP(src="9.10.11.12",dst="13.14.15.16",options=IPOption_SDBM(addresses=["1.2.3.4","5.6.7.8"]))/TCP()
1540raw(p)
1541assert(_ == 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')
1542q=IP(_)
1543q
1544assert( isinstance(q.options[0],IPOption_SDBM) )
1545assert( q[IPOption_SDBM].addresses[1] == "5.6.7.8" )
1546p.options[0].addresses[0] = '5.6.7.8'
1547assert( IP(raw(p)).options[0].addresses[0] == '5.6.7.8' )
1548IP(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()
1549raw(_)
1550assert(_ == 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')
1551IP(_)
1552q=_
1553assert(q[IPOption_LSRR].get_current_router() == "1.2.3.4")
1554assert(q[IPOption_Security].transmission_control_code == b"XYZ")
1555assert(q[TCP].flags == 2)
1556
1557
1558############
1559############
1560+ Test PPP
1561
1562= PPP/HDLC
1563~ ppp hdlc
1564HDLC()/PPP()/PPP_IPCP()
1565raw(_)
1566s=_
1567assert(s == b'\xff\x03\x80!\x01\x00\x00\x04')
1568PPP(s)
1569p=_
1570assert(HDLC in p)
1571assert(p[HDLC].control==3)
1572assert(p[PPP].proto==0x8021)
1573PPP(s[2:])
1574q=_
1575assert(HDLC not in q)
1576assert(q[PPP].proto==0x8021)
1577
1578
1579= PPP IPCP
1580~ ppp ipcp
1581PPP(b'\x80!\x01\x01\x00\x10\x03\x06\xc0\xa8\x01\x01\x02\x06\x00-\x0f\x01')
1582p=_
1583assert(p[PPP_IPCP].code == 1)
1584assert(p[PPP_IPCP_Option_IPAddress].data=="192.168.1.1")
1585assert(p[PPP_IPCP_Option].data == b'\x00-\x0f\x01')
1586p=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")])
1587raw(p)
1588assert(_ == b'\x80!\x01\x00\x00\x16\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08\x84\x06\t\n\x0b\x0c')
1589PPP(_)
1590q=_
1591assert(raw(p) == raw(q))
1592assert(PPP(raw(q))==q)
1593PPP()/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")])
1594p=_
1595raw(p)
1596assert(_ == 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')
1597PPP(_)
1598q=_
1599assert( q[PPP_IPCP_Option].type == 123 )
1600assert( q[PPP_IPCP_Option].data == b"ABCDEFG" )
1601assert( q[PPP_IPCP_Option_NBNS2].data == '9.10.11.12' )
1602
1603
1604= PPP ECP
1605~ ppp ecp
1606
1607PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ")])
1608p=_
1609raw(p)
1610assert(_ == b'\x80S\x01\x00\x00\n\x00\x06XYZ\x00')
1611PPP(_)
1612q=_
1613assert( raw(p)==raw(q) )
1614PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui="XYZ"),PPP_ECP_Option(type=1,data="ABCDEFG")])
1615p=_
1616raw(p)
1617assert(_ == b'\x80S\x01\x00\x00\x13\x00\x06XYZ\x00\x01\tABCDEFG')
1618PPP(_)
1619q=_
1620assert( raw(p) == raw(q) )
1621assert( 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
1630a=IPv6()
1631
1632= IPv6 Class basic build (default values)
1633raw(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)
1636a=IPv6(raw(IPv6()))
1637a.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
1640raw(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
1643a=IPv6(raw(IPv6()/TCP()))
1644a.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
1647raw(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
1650a=IPv6(raw(IPv6()/TCP()/Raw(load="somedata")))
1651a.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
1654raw(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
1657a=Ether(raw(Ether()/IPv6()/TCP()))
1658a.type == 0x86dd
1659
1660= IPv6 Class binding with GRE - build
1661s = 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"))
1662s == 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
1665p = IP(s)
1666GRE 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
1672raw(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
1675raw(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
1678raw(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
1681raw(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
1684raw(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
1689s = raw(IPv6()/IPv6ExtHdrSegmentRouting()/UDP())
1690assert(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
1692p = IPv6(s)
1693assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
1694assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 1 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
1695
1696= IPv6ExtHdrSegmentRouting Class - empty lists - build & dissect
1697
1698s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[])/UDP())
1699assert(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
1701p = IPv6(s)
1702assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
1703assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
1704
1705= IPv6ExtHdrSegmentRouting Class - addresses list - build & dissect
1706
1707s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"])/UDP())
1708assert(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
1710p = IPv6(s)
1711assert(UDP in p and IPv6ExtHdrSegmentRouting in p)
1712assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0)
1713
1714= IPv6ExtHdrSegmentRouting Class - TLVs list - build & dissect
1715
1716s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=[], tlv_objects=[IPv6ExtHdrSegmentRoutingTLV()])/TCP())
1717assert(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
1719p = IPv6(s)
1720assert(TCP in p and IPv6ExtHdrSegmentRouting in p)
1721assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 0 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2)
1722assert(isinstance(p[IPv6ExtHdrSegmentRouting].tlv_objects[1], IPv6ExtHdrSegmentRoutingTLVPadding))
1723
1724= IPv6ExtHdrSegmentRouting Class - both lists - build & dissect
1725
1726s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"], tlv_objects=[IPv6ExtHdrSegmentRoutingTLVIngressNode(),IPv6ExtHdrSegmentRoutingTLVEgressNode()])/ICMPv6EchoRequest())
1727assert(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
1729p = IPv6(s)
1730assert(ICMPv6EchoRequest in p and IPv6ExtHdrSegmentRouting in p)
1731assert(len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2)
1732
1733= IPv6ExtHdrSegmentRouting Class - UDP pseudo-header checksum - build & dissect
1734
1735s= 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'))
1736assert(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
1744in6_get6to4Prefix("0.0.0.0") == "2002::"
1745
1746= Test in6_get6to4Prefix() - 255.255.255.255 address
1747in6_get6to4Prefix("255.255.255.255") == "2002:ffff:ffff::"
1748
1749= Test in6_get6to4Prefix() - 1.1.1.1 address
1750in6_get6to4Prefix("1.1.1.1") == "2002:101:101::"
1751
1752= Test in6_get6to4Prefix() - invalid address
1753in6_get6to4Prefix("somebadrawing") is None
1754
1755
1756############
1757############
1758+ Test in6_6to4ExtractAddr()
1759
1760= Test in6_6to4ExtractAddr() - 2002:: address
1761in6_6to4ExtractAddr("2002::") == "0.0.0.0"
1762
1763= Test in6_6to4ExtractAddr() - 255.255.255.255 address
1764in6_6to4ExtractAddr("2002:ffff:ffff::") == "255.255.255.255"
1765
1766= Test in6_6to4ExtractAddr() - "2002:101:101::" address
1767in6_6to4ExtractAddr("2002:101:101::") == "1.1.1.1"
1768
1769= Test in6_6to4ExtractAddr() - invalid address
1770in6_6to4ExtractAddr("somebadrawing") is None
1771
1772
1773########### RFC 4489 - Link-Scoped IPv6 Multicast address ###########
1774
1775= in6_getLinkScopedMcastAddr() : default generation
1776a = in6_getLinkScopedMcastAddr(addr="FE80::")
1777a == 'ff32:ff::'
1778
1779= in6_getLinkScopedMcastAddr() : different valid scope values
1780a = in6_getLinkScopedMcastAddr(addr="FE80::", scope=0)
1781b = in6_getLinkScopedMcastAddr(addr="FE80::", scope=1)
1782c = in6_getLinkScopedMcastAddr(addr="FE80::", scope=2)
1783d = in6_getLinkScopedMcastAddr(addr="FE80::", scope=3)
1784a == 'ff30:ff::' and b == 'ff31:ff::' and c == 'ff32:ff::' and d is None
1785
1786= in6_getLinkScopedMcastAddr() : grpid in different formats
1787a = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=b"\x12\x34\x56\x78")
1788b = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="12345678")
1789c = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=305419896)
1790a == b and b == c
1791
1792
1793########### ethernet address to iface ID conversion #################
1794
1795= in6_mactoifaceid() conversion function (test 1)
1796in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000'
1797
1798= in6_mactoifaceid() conversion function (test 2)
1799in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
1800
1801= in6_mactoifaceid() conversion function (test 3)
1802in6_mactoifaceid("FD:00:00:00:00:00") == 'FF00:00FF:FE00:0000'
1803
1804= in6_mactoifaceid() conversion function (test 4)
1805in6_mactoifaceid("FF:00:00:00:00:00") == 'FD00:00FF:FE00:0000'
1806
1807= in6_mactoifaceid() conversion function (test 5)
1808in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000'
1809
1810= in6_mactoifaceid() conversion function (test 6)
1811in6_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)
1816in6_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)
1819in6_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)
1822in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
1823
1824= in6_mactoifaceid() conversion function (test 4)
1825in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
1826
1827= in6_mactoifaceid() conversion function (test 5)
1828in6_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)
1831in6_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)
1835in6_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)
1838in6_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)
1841in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00'
1842
1843= in6_addrtomac() conversion function (test 4)
1844in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00'
1845
1846= in6_addrtomac() conversion function (test 5)
1847in6_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)
1850in6_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
1854import socket
1855
1856res=True
1857for 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
1869in6_ctop("4)+k&C#VzJ4br>0wv%Yp") == '1080::8:800:200c:417a'
1870
1871= Test RFC 1924 function - in6_ctop() with character outside charset
1872in6_ctop("4)+k&C#VzJ4br>0wv%Y'") == None
1873
1874= Test RFC 1924 function - in6_ctop() with bad length address
1875in6_ctop("4)+k&C#VzJ4br>0wv%Y") == None
1876
1877= Test RFC 1924 function - in6_ptoc() basic test
1878in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
1879
1880= Test RFC 1924 function - in6_ptoc() basic test
1881in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp'
1882
1883= Test RFC 1924 function - in6_ptoc() with bad input
1884in6_ptoc('1080:::8:800:200c:417a') == None
1885
1886########### in6_getAddrType #########################################
1887
1888= in6_getAddrType - 6to4 addresses
1889in6_getAddrType("2002::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL | IPV6_ADDR_6TO4)
1890
1891= in6_getAddrType - Assignable Unicast global address
1892in6_getAddrType("2001:db8::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL)
1893
1894= in6_getAddrType - Multicast global address
1895in6_getAddrType("FF0E::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST)
1896
1897= in6_getAddrType - Multicast local address
1898in6_getAddrType("FF02::1") == (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST)
1899
1900= in6_getAddrType - Unicast Link-Local address
1901in6_getAddrType("FE80::") == (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL)
1902
1903= in6_getAddrType - Loopback address
1904in6_getAddrType("::1") == IPV6_ADDR_LOOPBACK
1905
1906= in6_getAddrType - Unspecified address
1907in6_getAddrType("::") == IPV6_ADDR_UNSPECIFIED
1908
1909= in6_getAddrType - Unassigned Global Unicast address
1910in6_getAddrType("4000::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
1911
1912= in6_getAddrType - Weird address (FE::1)
1913in6_getAddrType("FE::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
1914
1915= in6_getAddrType - Weird address (FE8::1)
1916in6_getAddrType("FE8::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
1917
1918= in6_getAddrType - Weird address (1::1)
1919in6_getAddrType("1::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
1920
1921= in6_getAddrType - Weird address (1000::1)
1922in6_getAddrType("1000::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST)
1923
1924########### ICMPv6DestUnreach Class #################################
1925
1926= ICMPv6DestUnreach Class - Basic Build (no argument)
1927raw(ICMPv6DestUnreach()) == b'\x01\x00\x00\x00\x00\x00\x00\x00'
1928
1929= ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload)
1930raw(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
1933raw(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
1936a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")))
1937a.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
1940a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")))
1941a.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
1944a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
1945b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
1946a[ICMPv6DestUnreach][TCPerror].chksum == b.chksum
1947
1948
1949########### ICMPv6PacketTooBig Class ################################
1950
1951= ICMPv6PacketTooBig Class - Basic Build (no argument)
1952raw(ICMPv6PacketTooBig()) == b'\x02\x00\x00\x00\x00\x00\x05\x00'
1953
1954= ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload)
1955raw(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
1958raw(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
1961a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")))
1962a.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
1963True
1964
1965= ICMPv6PacketTooBig Class - Dissection with specific values
1966a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=2, cksum=0x6666, mtu=1460)/IPv6(src="2047::cafe", dst="2048::deca")))
1967a.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
1970a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=1, cksum=0x6666, mtu=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
1971b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP()))
1972a[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
1987raw(ICMPv6EchoRequest()) == b'\x80\x00\x00\x00\x00\x00\x00\x00'
1988
1989= ICMPv6EchoRequest - Instantiation with specific values
1990raw(ICMPv6EchoRequest(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x80\xff\x11\x11""33thisissomestring'
1991
1992= ICMPv6EchoRequest - Basic dissection
1993a=ICMPv6EchoRequest(b'\x80\x00\x00\x00\x00\x00\x00\x00')
1994a.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
1997a=ICMPv6EchoRequest(b'\x80\xff\x11\x11""33thisissomerawing')
1998a.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)
2001raw(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)
2004a=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')
2005isinstance(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
2013raw(ICMPv6EchoReply()) == b'\x81\x00\x00\x00\x00\x00\x00\x00'
2014
2015= ICMPv6EchoReply - Instantiation with specific values
2016raw(ICMPv6EchoReply(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x81\xff\x11\x11""33thisissomestring'
2017
2018= ICMPv6EchoReply - Basic dissection
2019a=ICMPv6EchoReply(b'\x80\x00\x00\x00\x00\x00\x00\x00')
2020a.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
2023a=ICMPv6EchoReply(b'\x80\xff\x11\x11""33thisissomerawing')
2024a.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)
2027raw(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)
2030a=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')
2031isinstance(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
2036b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
2037a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
2038b.hashret() == a.hashret()
2039
2040# data are not taken into account for hashret
2041= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2
2042b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
2043a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="otherdata")
2044b.hashret() == a.hashret()
2045
2046= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3
2047b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
2048a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x8888, data="somedata")
2049b.hashret() != a.hashret()
2050
2051= ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4
2052b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata")
2053a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x8888, seq=0x7777, data="somedata")
2054b.hashret() != a.hashret()
2055
2056= ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5
2057b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata")
2058a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata")
2059(a > b) == True
2060
2061= ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6
2062b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777, data="somedata")
2063a=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
2069a = IPv6(dst="www.google.com")/ICMPv6EchoRequest()
2070b = IPv6(src="www.google.com", dst=a.src)/ICMPv6EchoReply()
2071assert b.answers(a)
2072assert (a > b)
2073
2074
2075########### ICMPv6MRD* Classes ######################################
2076
2077= ICMPv6MRD_Advertisement - Basic instantiation
2078raw(ICMPv6MRD_Advertisement()) == b'\x97\x14\x00\x00\x00\x00\x00\x00'
2079
2080= ICMPv6MRD_Advertisement - Instantiation with specific values
2081raw(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
2084a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Advertisement()))
2085a.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
2089raw(ICMPv6MRD_Solicitation()) == b'\x98\x00\x00\x00'
2090
2091= ICMPv6MRD_Solicitation - Instantiation with specific values
2092raw(ICMPv6MRD_Solicitation(res=0xbb)) == b'\x98\xbb\x00\x00'
2093
2094= ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms
2095a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Solicitation()))
2096a.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
2100raw(ICMPv6MRD_Termination()) == b'\x99\x00\x00\x00'
2101
2102= ICMPv6MRD_Termination - Instantiation with specific values
2103raw(ICMPv6MRD_Termination(res=0xbb)) == b'\x99\xbb\x00\x00'
2104
2105= ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms
2106a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Termination()))
2107a.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
2115raw(HBHOptUnknown()) == b'\x01\x00'
2116
2117= HBHOptUnknown - Basic Dissection
2118a=HBHOptUnknown(b'\x01\x00')
2119a.otype == 0x01 and a.optlen == 0 and a.optdata == b""
2120
2121= HBHOptUnknown - Automatic optlen computation
2122raw(HBHOptUnknown(optdata="B"*10)) == b'\x01\nBBBBBBBBBB'
2123
2124= HBHOptUnknown - Instantiation with specific values
2125raw(HBHOptUnknown(optlen=9, optdata="B"*10)) == b'\x01\tBBBBBBBBBB'
2126
2127= HBHOptUnknown - Dissection with specific values
2128a=HBHOptUnknown(b'\x01\tBBBBBBBBBB')
2129a.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
2137raw(Pad1()) == b'\x00'
2138
2139= Pad1 - Basic Dissection
2140raw(Pad1(b'\x00')) == b'\x00'
2141
2142
2143############
2144############
2145+ Test PadN Class
2146
2147= PadN - Basic Instantiation
2148raw(PadN()) == b'\x01\x00'
2149
2150= PadN - Optlen Automatic computation
2151raw(PadN(optdata="B"*10)) == b'\x01\nBBBBBBBBBB'
2152
2153= PadN - Basic Dissection
2154a=PadN(b'\x01\x00')
2155a.otype == 1 and a.optlen == 0 and a.optdata == b""
2156
2157= PadN - Dissection with specific values
2158a=PadN(b'\x01\x0cBBBBBBBBBB')
2159a.otype == 1 and a.optlen == 12 and a.optdata == b'BBBBBBBBBB'
2160
2161= PadN - Instantiation with forced optlen
2162raw(PadN(optdata="B"*10, optlen=9)) == b'\x01\x09BBBBBBBBBB'
2163
2164
2165############
2166############
2167+ Test RouterAlert Class (RFC 2711)
2168
2169= RouterAlert - Basic Instantiation
2170raw(RouterAlert()) == b'\x05\x02\x00\x00'
2171
2172= RouterAlert - Basic Dissection
2173a=RouterAlert(b'\x05\x02\x00\x00')
2174a.otype == 0x05 and a.optlen == 2 and a.value == 00
2175
2176= RouterAlert - Instantiation with specific values
2177raw(RouterAlert(optlen=3, value=0xffff)) == b'\x05\x03\xff\xff'
2178
2179= RouterAlert - Instantiation with specific values
2180a=RouterAlert(b'\x05\x03\xff\xff')
2181a.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
2189raw(Jumbo()) == b'\xc2\x04\x00\x00\x00\x00'
2190
2191= Jumbo - Basic Dissection
2192a=Jumbo(b'\xc2\x04\x00\x00\x00\x00')
2193a.otype == 0xC2 and a.optlen == 4 and a.jumboplen == 0
2194
2195= Jumbo - Instantiation with specific values
2196raw(Jumbo(optlen=6, jumboplen=0xffffffff)) == b'\xc2\x06\xff\xff\xff\xff'
2197
2198= Jumbo - Dissection with specific values
2199a=Jumbo(b'\xc2\x06\xff\xff\xff\xff')
2200a.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
2208raw(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
2211a=HAO(b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
2212a.otype == 0xC9 and a.optlen == 16 and a.hoa == "::"
2213
2214= HAO - Instantiation with specific values
2215raw(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
2218a=HAO(b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff')
2219a.otype == 0xC9 and a.optlen == 9 and a.hoa == "2001::ffff"
2220
2221= HAO - hashret
2222
2223p = IPv6()/IPv6ExtHdrDestOpt(options=HAO(hoa="2001:db8::1"))/ICMPv6EchoRequest()
2224p.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
2232raw(IPv6ExtHdrHopByHop()) ==  b';\x00\x01\x04\x00\x00\x00\x00'
2233
2234= IPv6ExtHdrHopByHop - Instantiation with HAO option
2235raw(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
2238raw(IPv6ExtHdrHopByHop(options=[RouterAlert()])) == b';\x00\x05\x02\x00\x00\x01\x00'
2239
2240= IPv6ExtHdrHopByHop - Instantiation with Jumbo option
2241raw(IPv6ExtHdrHopByHop(options=[Jumbo()])) == b';\x00\xc2\x04\x00\x00\x00\x00'
2242
2243= IPv6ExtHdrHopByHop - Instantiation with Pad1 option
2244raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00'
2245
2246= IPv6ExtHdrHopByHop - Instantiation with PadN option
2247raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00'
2248
2249= IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO
2250raw(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
2253raw(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
2256raw(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
2259a=IPv6ExtHdrHopByHop(b';\x00\x01\x04\x00\x00\x00\x00')
2260a.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
2273raw(ICMPv6ND_RS()) == b'\x85\x00\x00\x00\x00\x00\x00\x00'
2274
2275= ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer
2276raw(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
2279a=ICMPv6ND_RS(b'\x85\x00\x00\x00\x00\x00\x00\x00')
2280a.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
2283a=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')
2284isinstance(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
2292raw(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
2295raw(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
2298a=ICMPv6ND_RA(b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00')
2299a.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
2302a=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')
2303isinstance(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
2306assert ICMPv6ND_RA().answers(ICMPv6ND_RS())
2307a=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')
2308b = 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")
2309assert a.answers(b)
2310
2311############
2312############
2313+ ICMPv6ND_NS Class Test
2314
2315= ICMPv6ND_NS - Basic Instantiation
2316raw(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
2319raw(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
2322a=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')
2323a.code==0 and a.res==0 and a.tgt=="::"
2324
2325= ICMPv6ND_NS - Dissection with specific values
2326a=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')
2327a.code==0x11 and a.res==3758096385 and a.tgt=="ffff::1111"
2328
2329= ICMPv6ND_NS - IPv6 layer fields overloading
2330a=IPv6(raw(IPv6()/ICMPv6ND_NS()))
2331a.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
2338raw(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
2341raw(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
2344a=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')
2345a.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
2348a=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')
2349a.code==0x11 and a.R==0 and a.S==1 and a.O==0 and a.res==1 and a.tgt=="ffff::1111"
2350assert a.hashret() == b'ffff::1111'
2351
2352= ICMPv6ND_NS - IPv6 layer fields overloading
2353a=IPv6(raw(IPv6()/ICMPv6ND_NS()))
2354a.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
2363a=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
2365b=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')
2366b.answers(a)
2367
2368
2369############
2370############
2371+ ICMPv6NDOptUnknown Class Test
2372
2373= ICMPv6NDOptUnknown - Basic Instantiation
2374raw(ICMPv6NDOptUnknown()) == b'\x00\x02'
2375
2376= ICMPv6NDOptUnknown - Instantiation with specific values
2377raw(ICMPv6NDOptUnknown(len=4, data="somestring")) == b'\x00\x04somestring'
2378
2379= ICMPv6NDOptUnknown - Basic Dissection
2380a=ICMPv6NDOptUnknown(b'\x00\x02')
2381a.type == 0 and a.len == 2
2382
2383= ICMPv6NDOptUnknown - Dissection with specific values
2384a=ICMPv6NDOptUnknown(b'\x00\x04somerawing')
2385a.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
2393raw(ICMPv6NDOptSrcLLAddr()) == b'\x01\x01\x00\x00\x00\x00\x00\x00'
2394
2395= ICMPv6NDOptSrcLLAddr - Instantiation with specific values
2396raw(ICMPv6NDOptSrcLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x01\x02\x11\x11\x11\x11\x11\x11'
2397
2398= ICMPv6NDOptSrcLLAddr - Basic Dissection
2399a=ICMPv6NDOptSrcLLAddr(b'\x01\x01\x00\x00\x00\x00\x00\x00')
2400a.type == 1 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
2401
2402= ICMPv6NDOptSrcLLAddr - Instantiation with specific values
2403a=ICMPv6NDOptSrcLLAddr(b'\x01\x02\x11\x11\x11\x11\x11\x11')
2404a.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
2412raw(ICMPv6NDOptDstLLAddr()) == b'\x02\x01\x00\x00\x00\x00\x00\x00'
2413
2414= ICMPv6NDOptDstLLAddr - Instantiation with specific values
2415raw(ICMPv6NDOptDstLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x02\x02\x11\x11\x11\x11\x11\x11'
2416
2417= ICMPv6NDOptDstLLAddr - Basic Dissection
2418a=ICMPv6NDOptDstLLAddr(b'\x02\x01\x00\x00\x00\x00\x00\x00')
2419a.type == 2 and a.len == 1 and a.lladdr == "00:00:00:00:00:00"
2420
2421= ICMPv6NDOptDstLLAddr - Instantiation with specific values
2422a=ICMPv6NDOptDstLLAddr(b'\x02\x02\x11\x11\x11\x11\x11\x11')
2423a.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
2431raw(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
2434raw(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
2437a=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')
2438a.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
2441a=ICMPv6NDOptPrefixInfo(b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
2442a.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
2451raw(ICMPv6NDOptRedirectedHdr()) == b'\x04\x01\x00\x00\x00\x00\x00\x00'
2452
2453= ICMPv6NDOptRedirectedHdr - Instantiation with specific values
2454~ ICMPv6NDOptRedirectedHdr
2455raw(ICMPv6NDOptRedirectedHdr(len=0xff, res="abcdef", pkt="somestringthatisnotanipv6packet")) == b'\x04\xffabcdefsomestringthatisnotanipv'
2456
2457= ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer)
2458~ ICMPv6NDOptRedirectedHdr
2459raw(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
2463a=ICMPv6NDOptRedirectedHdr(b'\x04\x00\x00\x00')
2464assert(a.type == 4)
2465assert(a.len == 0)
2466assert(a.res == b"\x00\x00")
2467assert(a.pkt == b"")
2468
2469= ICMPv6NDOptRedirectedHdr - Disssection with specific values
2470~ ICMPv6NDOptRedirectedHdr
2471a=ICMPv6NDOptRedirectedHdr(b'\x04\xff\x11\x11\x00\x00\x00\x00somerawingthatisnotanipv6pac')
2472a.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
2476a=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')
2477a.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
2481x=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')
2482y=x.copy()
2483del(y.len)
2484x == ICMPv6NDOptRedirectedHdr(raw(y))
2485
2486# Add more tests
2487
2488
2489############
2490############
2491+ ICMPv6NDOptMTU Class Test
2492
2493= ICMPv6NDOptMTU - Basic Instantiation
2494raw(ICMPv6NDOptMTU()) == b'\x05\x01\x00\x00\x00\x00\x05\x00'
2495
2496= ICMPv6NDOptMTU - Instantiation with specific values
2497raw(ICMPv6NDOptMTU(len=2, res=0x1111, mtu=1500)) == b'\x05\x02\x11\x11\x00\x00\x05\xdc'
2498
2499= ICMPv6NDOptMTU - Basic dissection
2500a=ICMPv6NDOptMTU(b'\x05\x01\x00\x00\x00\x00\x05\x00')
2501a.type == 5 and a.len == 1 and a.res == 0 and a.mtu == 1280
2502
2503= ICMPv6NDOptMTU - Dissection with specific values
2504a=ICMPv6NDOptMTU(b'\x05\x02\x11\x11\x00\x00\x05\xdc')
2505a.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
2513raw(ICMPv6NDOptShortcutLimit()) == b'\x06\x01(\x00\x00\x00\x00\x00'
2514
2515= ICMPv6NDOptShortcutLimit - Instantiation with specific values
2516raw(ICMPv6NDOptShortcutLimit(len=2, shortcutlim=0x11, res1=0xee, res2=0xaaaaaaaa)) == b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa'
2517
2518= ICMPv6NDOptShortcutLimit - Basic Dissection
2519a=ICMPv6NDOptShortcutLimit(b'\x06\x01(\x00\x00\x00\x00\x00')
2520a.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
2523a=ICMPv6NDOptShortcutLimit(b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa')
2524a.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
2532raw(ICMPv6NDOptAdvInterval()) == b'\x07\x01\x00\x00\x00\x00\x00\x00'
2533
2534= ICMPv6NDOptAdvInterval - Instantiation with specific values
2535raw(ICMPv6NDOptAdvInterval(len=2, res=0x1111, advint=0xffffffff)) == b'\x07\x02\x11\x11\xff\xff\xff\xff'
2536
2537= ICMPv6NDOptAdvInterval - Basic dissection
2538a=ICMPv6NDOptAdvInterval(b'\x07\x01\x00\x00\x00\x00\x00\x00')
2539a.type == 7 and a.len == 1 and a.res == 0 and a.advint == 0
2540
2541= ICMPv6NDOptAdvInterval - Dissection with specific values
2542a=ICMPv6NDOptAdvInterval(b'\x07\x02\x11\x11\xff\xff\xff\xff')
2543a.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
2551raw(ICMPv6NDOptHAInfo()) == b'\x08\x01\x00\x00\x00\x00\x00\x01'
2552
2553= ICMPv6NDOptHAInfo - Instantiation with specific values
2554raw(ICMPv6NDOptHAInfo(len=2, res=0x1111, pref=0x2222, lifetime=0x3333)) == b'\x08\x02\x11\x11""33'
2555
2556= ICMPv6NDOptHAInfo - Basic dissection
2557a=ICMPv6NDOptHAInfo(b'\x08\x01\x00\x00\x00\x00\x00\x01')
2558a.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
2561a=ICMPv6NDOptHAInfo(b'\x08\x02\x11\x11""33')
2562a.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
2570raw(ICMPv6NDOptSrcAddrList()) == b'\t\x01\x00\x00\x00\x00\x00\x00'
2571
2572= ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len)
2573raw(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
2576raw(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
2579a=ICMPv6NDOptSrcAddrList(b'\t\x01\x00\x00\x00\x00\x00\x00')
2580a.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)
2583a=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')
2584a.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
2587conf.debug_dissector = False
2588a=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')
2589conf.debug_dissector = True
2590a.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
2598raw(ICMPv6NDOptTgtAddrList()) == b'\n\x01\x00\x00\x00\x00\x00\x00'
2599
2600= ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len)
2601raw(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
2604raw(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
2607a=ICMPv6NDOptTgtAddrList(b'\n\x01\x00\x00\x00\x00\x00\x00')
2608a.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)
2611a=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')
2612a.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
2615conf.debug_dissector = False
2616a=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')
2617conf.debug_dissector = True
2618a.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
2626raw(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
2629raw(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
2632a=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')
2633a.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
2636a=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')
2637a.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
2645raw(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
2648raw(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
2651a=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')
2652a.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
2655a=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')
2656a.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
2664raw(ICMPv6NDOptLLA()) == b'\x13\x01\x00\x00\x00\x00\x00\x00\x00'
2665
2666= ICMPv6NDOptLLA - Instantiation with specific values
2667raw(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
2670a=ICMPv6NDOptLLA(b'\x13\x01\x00\x00\x00\x00\x00\x00\x00')
2671a.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
2674a=ICMPv6NDOptLLA(b'\x13\x02\x03\xff\x11\xff\x11\xff\x11')
2675a.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
2683raw(ICMPv6NDOptRouteInfo()) == b'\x18\x01\x00\x00\xff\xff\xff\xff'
2684
2685= ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length
2686raw(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)
2689raw(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)
2692raw(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)
2695raw(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)
2698raw(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
2701raw(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
2704a=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')
2705a.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
2708a=ICMPv6NDOptRouteInfo(b'\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
2709a.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
2717raw(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
2720raw(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
2723a=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')
2724a.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
2727a=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')
2728a.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
2736raw(ICMPv6NDOptRDNSS()) == b'\x19\x01\x00\x00\xff\xff\xff\xff'
2737
2738= ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address
2739raw(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
2742raw(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
2745raw(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
2748a=ICMPv6NDOptRDNSS(b'\x19\x01\x00\x00\xff\xff\xff\xff')
2749a.type==25 and a.len==1 and a.res == 0 and a.dns==[]
2750
2751= ICMPv6NDOptRDNSS - Dissection (with 1 DNS address)
2752a=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')
2753a.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)
2756a=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')
2757a.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
2765raw(ICMPv6NDOptDNSSL()) == b'\x1f\x01\x00\x00\xff\xff\xff\xff'
2766
2767= ICMPv6NDOptDNSSL - Instantiation with 1 search domain, as seen in the wild
2768raw(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
2771raw(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
2774raw(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
2777p = ICMPv6NDOptDNSSL(b'\x1f\x01\x00\x00\xff\xff\xff\xff')
2778p.type == 31 and p.len == 1 and p.res == 0 and p.searchlist == []
2779
2780= ICMPv6NDOptDNSSL - Basic Dissection with specific values
2781p = ICMPv6NDOptDNSSL(b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00')
2782p.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
2790raw(ICMPv6NDOptEFA()) == b'\x1a\x01\x00\x00\x00\x00\x00\x00'
2791
2792= ICMPv6NDOptEFA - Basic Dissection
2793a=ICMPv6NDOptEFA(b'\x1a\x01\x00\x00\x00\x00\x00\x00')
2794a.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
2802raw(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
2805a = ICMPv6NIQueryNOOP(b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
2806a.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)
2814a=ICMPv6NIQueryName(data="abricot").getfieldval("data")
2815type(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
2818ICMPv6NIQueryName(data="abricot").data == b"abricot"
2819
2820= ICMPv6NIQueryName - fqdn (internal)
2821a=ICMPv6NIQueryName(data="n.d.org").getfieldval("data")
2822type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
2823
2824= ICMPv6NIQueryName - fqdn
2825ICMPv6NIQueryName(data="n.d.org").data == b"n.d.org"
2826
2827= ICMPv6NIQueryName - IPv6 address (internal)
2828a=ICMPv6NIQueryName(data="2001:db8::1").getfieldval("data")
2829type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
2830
2831= ICMPv6NIQueryName - IPv6 address
2832ICMPv6NIQueryName(data="2001:db8::1").data == "2001:db8::1"
2833
2834= ICMPv6NIQueryName - IPv4 address (internal)
2835a=ICMPv6NIQueryName(data="169.254.253.252").getfieldval("data")
2836type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
2837
2838= ICMPv6NIQueryName - IPv4 address
2839ICMPv6NIQueryName(data="169.254.253.252").data == '169.254.253.252'
2840
2841= ICMPv6NIQueryName - build & dissection
2842s = raw(IPv6()/ICMPv6NIQueryName(data="n.d.org"))
2843p = IPv6(s)
2844ICMPv6NIQueryName 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)
2852a = ICMPv6NIQueryIPv6(data="abricot")
2853ls(a)
2854a = a.getfieldval("data")
2855type(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
2858ICMPv6NIQueryIPv6(data="abricot").data == b"abricot"
2859
2860= ICMPv6NIQueryIPv6 - fqdn (internal)
2861a=ICMPv6NIQueryIPv6(data="n.d.org").getfieldval("data")
2862type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
2863
2864= ICMPv6NIQueryIPv6 - fqdn
2865ICMPv6NIQueryIPv6(data="n.d.org").data == b"n.d.org"
2866
2867= ICMPv6NIQueryIPv6 - IPv6 address (internal)
2868a=ICMPv6NIQueryIPv6(data="2001:db8::1").getfieldval("data")
2869type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
2870
2871= ICMPv6NIQueryIPv6 - IPv6 address
2872ICMPv6NIQueryIPv6(data="2001:db8::1").data == "2001:db8::1"
2873
2874= ICMPv6NIQueryIPv6 - IPv4 address (internal)
2875a=ICMPv6NIQueryIPv6(data="169.254.253.252").getfieldval("data")
2876type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
2877
2878= ICMPv6NIQueryIPv6 - IPv4 address
2879ICMPv6NIQueryIPv6(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)
2887a=ICMPv6NIQueryIPv4(data="abricot").getfieldval("data")
2888type(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
2891ICMPv6NIQueryIPv4(data="abricot").data == b"abricot"
2892
2893= ICMPv6NIQueryIPv4 - fqdn (internal)
2894a=ICMPv6NIQueryIPv4(data="n.d.org").getfieldval("data")
2895type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00'
2896
2897= ICMPv6NIQueryIPv4 - fqdn
2898ICMPv6NIQueryIPv4(data="n.d.org").data == b"n.d.org"
2899
2900= ICMPv6NIQueryIPv4 - IPv6 address (internal)
2901a=ICMPv6NIQueryIPv4(data="2001:db8::1").getfieldval("data")
2902type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1'
2903
2904= ICMPv6NIQueryIPv4 - IPv6 address
2905ICMPv6NIQueryIPv4(data="2001:db8::1").data == "2001:db8::1"
2906
2907= ICMPv6NIQueryIPv4 - IPv4 address (internal)
2908a=ICMPv6NIQueryIPv4(data="169.254.253.252").getfieldval("data")
2909type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252'
2910
2911= ICMPv6NIQueryIPv4 - IPv4 address
2912ICMPv6NIQueryIPv4(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)
2920t = ICMPv6NIQueryIPv6(flags="T")
2921a = ICMPv6NIQueryIPv6(flags="A")
2922c = ICMPv6NIQueryIPv6(flags="C")
2923l = ICMPv6NIQueryIPv6(flags="L")
2924s = ICMPv6NIQueryIPv6(flags="S")
2925g = ICMPv6NIQueryIPv6(flags="G")
2926allflags = ICMPv6NIQueryIPv6(flags="TALCLSG")
2927t.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)
2931t = raw(ICMPv6NIQueryNOOP(flags="T", nonce="A"*8))[6:8]
2932a = raw(ICMPv6NIQueryNOOP(flags="A", nonce="A"*8))[6:8]
2933c = raw(ICMPv6NIQueryNOOP(flags="C", nonce="A"*8))[6:8]
2934l = raw(ICMPv6NIQueryNOOP(flags="L", nonce="A"*8))[6:8]
2935s = raw(ICMPv6NIQueryNOOP(flags="S", nonce="A"*8))[6:8]
2936g = raw(ICMPv6NIQueryNOOP(flags="G", nonce="A"*8))[6:8]
2937allflags = raw(ICMPv6NIQueryNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
2938t == 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)
2942t = ICMPv6NIReplyIPv6(flags="T")
2943a = ICMPv6NIReplyIPv6(flags="A")
2944c = ICMPv6NIReplyIPv6(flags="C")
2945l = ICMPv6NIReplyIPv6(flags="L")
2946s = ICMPv6NIReplyIPv6(flags="S")
2947g = ICMPv6NIReplyIPv6(flags="G")
2948allflags = ICMPv6NIReplyIPv6(flags="TALCLSG")
2949t.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)
2953t = raw(ICMPv6NIReplyNOOP(flags="T", nonce="A"*8))[6:8]
2954a = raw(ICMPv6NIReplyNOOP(flags="A", nonce="A"*8))[6:8]
2955c = raw(ICMPv6NIReplyNOOP(flags="C", nonce="A"*8))[6:8]
2956l = raw(ICMPv6NIReplyNOOP(flags="L", nonce="A"*8))[6:8]
2957s = raw(ICMPv6NIReplyNOOP(flags="S", nonce="A"*8))[6:8]
2958g = raw(ICMPv6NIReplyNOOP(flags="G", nonce="A"*8))[6:8]
2959allflags = raw(ICMPv6NIReplyNOOP(flags="TALCLSG", nonce="A"*8))[6:8]
2960t == 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
2964a = ICMPv6NIQueryNOOP()
2965b = ICMPv6NIQueryName()
2966c = ICMPv6NIQueryIPv4()
2967d = ICMPv6NIQueryIPv6()
2968a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 62
2969
2970= ICMPv6NIReply* - Flags Default values
2971a = ICMPv6NIReplyIPv6()
2972b = ICMPv6NIReplyName()
2973c = ICMPv6NIReplyIPv6()
2974d = ICMPv6NIReplyIPv4()
2975e = ICMPv6NIReplyRefuse()
2976f = ICMPv6NIReplyUnknown()
2977a.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
2993s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6())
2994p = IPv6(s)
2995isinstance(p.payload, ICMPv6NIQueryIPv6)
2996
2997= ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data
2998s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="2001::db8::1"))
2999p = IPv6(s)
3000isinstance(p.payload, ICMPv6NIQueryIPv6)
3001
3002= ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data
3003s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="192.168.0.1"))
3004p = IPv6(s)
3005isinstance(p.payload, ICMPv6NIQueryIPv6)
3006
3007= ICMPv6NIQueryIPv6 - dispatch with name in data
3008s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="alfred"))
3009p = IPv6(s)
3010isinstance(p.payload, ICMPv6NIQueryIPv6)
3011
3012= ICMPv6NIQueryName - dispatch with nothing in data
3013s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName())
3014p = IPv6(s)
3015isinstance(p.payload, ICMPv6NIQueryName)
3016
3017= ICMPv6NIQueryName - dispatch with IPv6 address in data
3018s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="2001:db8::1"))
3019p = IPv6(s)
3020isinstance(p.payload, ICMPv6NIQueryName)
3021
3022= ICMPv6NIQueryName - dispatch with IPv4 address in data
3023s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="192.168.0.1"))
3024p = IPv6(s)
3025isinstance(p.payload, ICMPv6NIQueryName)
3026
3027= ICMPv6NIQueryName - dispatch with name in data
3028s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="alfred"))
3029p = IPv6(s)
3030isinstance(p.payload, ICMPv6NIQueryName)
3031
3032= ICMPv6NIQueryIPv4 - dispatch with nothing in data
3033s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4())
3034p = IPv6(s)
3035isinstance(p.payload, ICMPv6NIQueryIPv4)
3036
3037= ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
3038s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="2001:db8::1"))
3039p = IPv6(s)
3040isinstance(p.payload, ICMPv6NIQueryIPv4)
3041
3042= ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data
3043s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="192.168.0.1"))
3044p = IPv6(s)
3045isinstance(p.payload, ICMPv6NIQueryIPv4)
3046
3047= ICMPv6NIQueryIPv4 - dispatch with name in data
3048s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="alfred"))
3049p = IPv6(s)
3050isinstance(p.payload, ICMPv6NIQueryIPv4)
3051
3052= ICMPv6NIReplyName - dispatch
3053s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyName())
3054p = IPv6(s)
3055isinstance(p.payload, ICMPv6NIReplyName)
3056
3057= ICMPv6NIReplyIPv6 - dispatch
3058s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv6())
3059p = IPv6(s)
3060isinstance(p.payload, ICMPv6NIReplyIPv6)
3061
3062= ICMPv6NIReplyIPv4 - dispatch
3063s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv4())
3064p = IPv6(s)
3065isinstance(p.payload, ICMPv6NIReplyIPv4)
3066
3067= ICMPv6NIReplyRefuse - dispatch
3068s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyRefuse())
3069p = IPv6(s)
3070isinstance(p.payload, ICMPv6NIReplyRefuse)
3071
3072= ICMPv6NIReplyUnknown - dispatch
3073s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyUnknown())
3074p = IPv6(s)
3075isinstance(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)
3083a=ICMPv6NIReplyNOOP(data="abricot").getfieldval("data")
3084type(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
3087ICMPv6NIReplyNOOP(data="abricot").data == b"abricot"
3088
3089= ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal)
3090a=ICMPv6NIReplyNOOP(data="n.d.tld").getfieldval("data")
3091type(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
3094ICMPv6NIReplyNOOP(data="n.d.tld").data == b"n.d.tld"
3095
3096= ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal)
3097a=ICMPv6NIReplyNOOP(data="2001:0db8::1").getfieldval("data")
3098type(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
3101ICMPv6NIReplyNOOP(data="2001:0db8::1").data == b"2001:0db8::1"
3102
3103= ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal)
3104a=ICMPv6NIReplyNOOP(data="169.254.253.010").getfieldval("data")
3105type(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
3108ICMPv6NIReplyNOOP(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)
3116a=ICMPv6NIReplyName(data="abricot").getfieldval("data")
3117type(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)
3120ICMPv6NIReplyName(data="abricot").data == [0, b"abricot"]
3121
3122= ICMPv6NIReplyName - fqdn name as a rawing (without ttl) (internal)
3123a=ICMPv6NIReplyName(data="n.d.tld").getfieldval("data")
3124type(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)
3127ICMPv6NIReplyName(data="n.d.tld").data == [0, b'n.d.tld']
3128
3129= ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal)
3130a=ICMPv6NIReplyName(data=["abricot", "poire"]).getfieldval("data")
3131type(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)
3134ICMPv6NIReplyName(data=["abricot", "poire"]).data == [0, b"abricot", b"poire"]
3135
3136= ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal)
3137a=ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).getfieldval("data")
3138type(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]
3141ICMPv6NIReplyName(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)
3149a=ICMPv6NIReplyIPv6(data="2001:db8::1").getfieldval("data")
3150type(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
3153ICMPv6NIReplyIPv6(data="2001:db8::1").data == [(0, '2001:db8::1')]
3154
3155= ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list)  (internal)
3156a=ICMPv6NIReplyIPv6(data=["2001:db8::1"]).getfieldval("data")
3157type(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)
3160ICMPv6NIReplyIPv6(data=["2001:db8::1"]).data == [(0, '2001:db8::1')]
3161
3162= ICMPv6NIReplyIPv6 - one IPv6 address with TTL  (internal)
3163a=ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).getfieldval("data")
3164type(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
3167ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).data == [(0, '2001:db8::1')]
3168
3169= ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) (internal)
3170a=ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).getfieldval("data")
3171type(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)
3174ICMPv6NIReplyIPv6(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)
3177a=ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).getfieldval("data")
3178type(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)
3181ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).data == [(42, "2001:db8::1"), (0, "2001:db8::2")]
3182
3183= ICMPv6NIReplyIPv6 - build & dissection
3184
3185s = raw(IPv6()/ICMPv6NIReplyIPv6(data="2001:db8::1"))
3186p = IPv6(s)
3187ICMPv6NIReplyIPv6 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)
3194a=ICMPv6NIReplyIPv4(data="169.254.253.252").getfieldval("data")
3195type(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
3198ICMPv6NIReplyIPv4(data="169.254.253.252").data == [(0, '169.254.253.252')]
3199
3200= ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal)
3201a=ICMPv6NIReplyIPv4(data=["169.254.253.252"]).getfieldval("data")
3202type(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)
3205ICMPv6NIReplyIPv4(data=["169.254.253.252"]).data == [(0, '169.254.253.252')]
3206
3207= ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal)
3208a=ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).getfieldval("data")
3209type(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)
3212ICMPv6NIReplyIPv4(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)
3215a=ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).getfieldval("data")
3216type(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)
3219ICMPv6NIReplyIPv4(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)
3222a=ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).getfieldval("data")
3223type(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)
3226ICMPv6NIReplyIPv4(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
3230s = raw(IPv6()/ICMPv6NIReplyIPv4(data="192.168.0.1"))
3231p = IPv6(s)
3232ICMPv6NIReplyIPv4 in p and p.data == [(0, '192.168.0.1')]
3233
3234s = raw(IPv6()/ICMPv6NIReplyIPv4(data=[(2807, "192.168.0.1")]))
3235p = IPv6(s)
3236ICMPv6NIReplyIPv4 in p and p.data == [(2807, "192.168.0.1")]
3237
3238
3239############
3240############
3241+ Test Node Information Query - ICMPv6NIReplyRefuse
3242= ICMPv6NIReplyRefuse - basic instantiation
3243raw(ICMPv6NIReplyRefuse())[:8] == b'\x8c\x01\x00\x00\x00\x00\x00\x00'
3244
3245= ICMPv6NIReplyRefuse - basic dissection
3246a=ICMPv6NIReplyRefuse(b'\x8c\x01\x00\x00\x00\x00\x00\x00\xf1\xe9\xab\xc9\x8c\x0by\x18')
3247a.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
3255raw(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
3258a=ICMPv6NIReplyRefuse(b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
3259a.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
3267computeNIGroupAddr("scapy") == "ff02::2:f886:2f66"
3268
3269
3270############
3271############
3272+ IPv6ExtHdrFragment Class Test
3273
3274= IPv6ExtHdrFragment - Basic Instantiation
3275raw(IPv6ExtHdrFragment()) == b';\x00\x00\x00\x00\x00\x00\x00'
3276
3277= IPv6ExtHdrFragment - Instantiation with specific values
3278raw(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
3281a=IPv6ExtHdrFragment(b';\x00\x00\x00\x00\x00\x00\x00')
3282a.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
3285a=IPv6ExtHdrFragment(b'\xff\xee\xff\xfb\x11\x11\x11\x11')
3286a.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
3294l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
3295len(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
3303l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
3304raw(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
3308l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280)
3309del(l[2])
3310del(l[4])
3311del(l[12])
3312del(l[18])
3313raw(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
3317l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*4000), 800)
3318del(l[4])
3319del(l[2])
3320raw(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
3328conf.route6.routes=[
3329(                               '::1', 128,                       '::',   'lo', ['::1'], 1),
3330(          'fe80::20f:1fff:feca:4650', 128,                       '::',   'lo', ['::1'], 1)]
3331conf.route6.flush()
3332not conf.route6.routes
3333
3334= Route6 - Route6.route
3335conf.route6.flush()
3336conf.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]
3344conf.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')
3345conf.route6.resync()
3346if 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
3353r6 = Route6()
3354r6.make_route("2001:db8::1", dev=LOOPBACK_NAME) == ("2001:db8::1", 128, "::", LOOPBACK_NAME, [], 1)
3355len_r6 = len(r6.routes)
3356
3357= Route6 - Route6.add & Route6.delt
3358
3359r6.add(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1", dev="eth0")
3360assert(len(r6.routes) == len_r6 + 1)
3361r6.delt(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1")
3362assert(len(r6.routes) == len_r6)
3363
3364= Route6 - Route6.ifadd & Route6.ifdel
3365r6.ifadd("scapy0", "2001:bd8:cafe:1::1/64")
3366r6.ifdel("scapy0")
3367
3368= IPv6 - utils
3369
3370@mock.patch("scapy.layers.inet6.get_if_hwaddr")
3371@mock.patch("scapy.layers.inet6.srp1")
3372def 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
3377p = test_neighsol()
3378ICMPv6NDOptDstLLAddr 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")
3383def 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
3388test_getmacbyip6() == "05:04:03:02:01:00"
3389
3390= IPv6 - IPerror6 & UDPerror & _ICMPv6Error
3391
3392query = IPv6(dst="2001:db8::1", src="2001:db8::2", hlim=1)/UDP()/DNS()
3393answer = 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()
3394answer.answers(query) == True
3395
3396# Test _ICMPv6Error
3397from scapy.layers.inet6 import _ICMPv6Error
3398assert _ICMPv6Error().guess_payload_class(None) == IPerror6
3399
3400############
3401############
3402+ ICMPv6ML
3403
3404= ICMPv6MLQuery - build & dissection
3405s = raw(IPv6()/ICMPv6MLQuery())
3406s == 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
3408p = IPv6(s)
3409ICMPv6MLQuery 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
3418p = Ether()/IPv6(dst="www.google.com")/TCP()
3419assert p.dst != p[IPv6].dst
3420p.show()
3421
3422############
3423############
3424+ TracerouteResult6
3425
3426= get_trace()
3427ip6_hlim = [("2001:db8::%d" % i, i) for i in six.moves.range(1, 12)]
3428
3429tr6_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
3433tr6 = TracerouteResult6(tr6_packets)
3434tr6.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()
3437def 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
3458test_show()
3459
3460= graph()
3461saved_AS_resolver = conf.AS_resolver
3462conf.AS_resolver = None
3463tr6.make_graph()
3464len(tr6.graphdef) == 492
3465tr6.graphdef.startswith("digraph trace {") == True
3466'"2001:db8::1 53/udp";' in tr6.graphdef
3467conf.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
3497a=DUID_LLT()
3498
3499= DUID_LLT basic build
3500raw(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
3503raw(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
3506a=DUID_LLT(raw(DUID_LLT()))
3507a.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
3510a=DUID_LLT(b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff')
3511a.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
3519a=DUID_EN()
3520
3521= DUID_EN basic build
3522raw(DUID_EN()) == b'\x00\x02\x00\x00\x017'
3523
3524= DUID_EN build with specific values
3525raw(DUID_EN(enterprisenum=0x11111111, id="iamastring")) == b'\x00\x02\x11\x11\x11\x11iamastring'
3526
3527= DUID_EN basic dissection
3528a=DUID_EN(b'\x00\x02\x00\x00\x017')
3529a.type == 2 and a.enterprisenum == 311
3530
3531= DUID_EN dissection with specific values
3532a=DUID_EN(b'\x00\x02\x11\x11\x11\x11iamarawing')
3533a.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
3541a=DUID_LL()
3542
3543= DUID_LL basic build
3544raw(DUID_LL()) == b'\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00'
3545
3546= DUID_LL build with specific values
3547raw(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
3550a=DUID_LL(raw(DUID_LL()))
3551a.type == 3 and a.hwtype == 1 and a.lladdr == "00:00:00:00:00:00"
3552
3553= DUID_LL with specific values
3554a=DUID_LL(b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff')
3555a.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
3563a=DHCP6OptUnknown()
3564
3565= DHCP6 Opt Unknown basic build (default values)
3566raw(DHCP6OptUnknown()) == b'\x00\x00\x00\x00'
3567
3568= DHCP6 Opt Unknown - len computation test
3569raw(DHCP6OptUnknown(data="shouldbe9")) == b'\x00\x00\x00\tshouldbe9'
3570
3571
3572############
3573############
3574+ Test DHCP6 Client Identifier option
3575
3576= DHCP6OptClientId basic instantiation
3577a=DHCP6OptClientId()
3578
3579= DHCP6OptClientId basic build
3580raw(DHCP6OptClientId()) == b'\x00\x01\x00\x00'
3581
3582= DHCP6OptClientId instantiation with specific values
3583raw(DHCP6OptClientId(duid="toto")) == b'\x00\x01\x00\x04toto'
3584
3585= DHCP6OptClientId instantiation with DUID_LL
3586raw(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
3589raw(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
3592raw(DHCP6OptClientId(duid=DUID_EN())) == b'\x00\x01\x00\x06\x00\x02\x00\x00\x017'
3593
3594= DHCP6OptClientId instantiation with specified length
3595raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring'
3596
3597= DHCP6OptClientId basic dissection
3598a=DHCP6OptClientId(b'\x00\x01\x00\x00')
3599a.optcode == 1 and a.optlen == 0
3600
3601= DHCP6OptClientId instantiation with specified length
3602raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring'
3603
3604= DHCP6OptClientId basic dissection
3605a=DHCP6OptClientId(b'\x00\x01\x00\x00')
3606a.optcode == 1 and a.optlen == 0
3607
3608= DHCP6OptClientId dissection with specific duid value
3609a=DHCP6OptClientId(b'\x00\x01\x00\x04somerawing')
3610a.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
3613a=DHCP6OptClientId(b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
3614a.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
3617a=DHCP6OptClientId(b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
3618a.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
3621a=DHCP6OptClientId(b'\x00\x01\x00\x06\x00\x02\x00\x00\x017')
3622a.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
3630a=DHCP6OptServerId()
3631
3632= DHCP6OptServerId basic build
3633raw(DHCP6OptServerId()) == b'\x00\x02\x00\x00'
3634
3635= DHCP6OptServerId basic build with specific values
3636raw(DHCP6OptServerId(duid="toto")) == b'\x00\x02\x00\x04toto'
3637
3638= DHCP6OptServerId instantiation with DUID_LL
3639raw(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
3642raw(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
3645raw(DHCP6OptServerId(duid=DUID_EN())) == b'\x00\x02\x00\x06\x00\x02\x00\x00\x017'
3646
3647= DHCP6OptServerId instantiation with specified length
3648raw(DHCP6OptServerId(optlen=80, duid="somestring")) == b'\x00\x02\x00Psomestring'
3649
3650= DHCP6OptServerId basic dissection
3651a=DHCP6OptServerId(b'\x00\x02\x00\x00')
3652a.optcode == 2 and a.optlen == 0
3653
3654= DHCP6OptServerId dissection with specific duid value
3655a=DHCP6OptServerId(b'\x00\x02\x00\x04somerawing')
3656a.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
3659a=DHCP6OptServerId(b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00')
3660a.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
3663a=DHCP6OptServerId(b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
3664a.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
3667a=DHCP6OptServerId(b'\x00\x02\x00\x06\x00\x02\x00\x00\x017')
3668a.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
3676raw(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
3679a = 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')
3680a.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
3683raw(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)
3686raw(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
3689a = DHCP6OptIAAddress(b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomerawing')
3690a.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
3698raw(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
3701a = DHCP6OptIA_NA(b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
3702a.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)
3705raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x00\x0c""""3333DDDD'
3706
3707= DHCP6OptIA_NA - Instantiation with specific values (forced optlen)
3708raw(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)
3711raw(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
3714a = 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')
3715a.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
3723raw(DHCP6OptIA_TA()) == b'\x00\x04\x00\x04\x00\x00\x00\x00'
3724
3725= DHCP6OptIA_TA - Basic Dissection
3726a = DHCP6OptIA_TA(b'\x00\x04\x00\x04\x00\x00\x00\x00')
3727a.optcode == 4 and a.optlen == 4 and a.iaid == 0 and a.iataopts == []
3728
3729= DHCP6OptIA_TA - Instantiation with specific values
3730raw(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
3733a = 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')
3734a.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
3742raw(DHCP6OptOptReq()) ==  b'\x00\x06\x00\x04\x00\x17\x00\x18'
3743
3744= DHCP6OptOptReq - optlen field computation
3745raw(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
3748raw(DHCP6OptOptReq(reqopts=[])) == b'\x00\x06\x00\x00'
3749
3750= DHCP6OptOptReq - Basic dissection
3751a=DHCP6OptOptReq(b'\x00\x06\x00\x00')
3752a.optcode == 6 and a.optlen == 0 and a.reqopts == [23,24]
3753
3754= DHCP6OptOptReq - Dissection with specific value
3755a=DHCP6OptOptReq(b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
3756a.optcode == 6 and a.optlen == 8 and a.reqopts == [1,2,3,4]
3757
3758= DHCP6OptOptReq - repr
3759a.show()
3760
3761
3762############
3763############
3764+ Test DHCP6 Option - Preference option
3765
3766= DHCP6OptPref - Basic instantiation
3767raw(DHCP6OptPref()) == b'\x00\x07\x00\x01\xff'
3768
3769= DHCP6OptPref - Instantiation with specific values
3770raw(DHCP6OptPref(optlen=0xffff, prefval= 0x11)) == b'\x00\x07\xff\xff\x11'
3771
3772= DHCP6OptPref - Basic Dissection
3773a=DHCP6OptPref(b'\x00\x07\x00\x01\xff')
3774a.optcode == 7 and a.optlen == 1 and a.prefval == 255
3775
3776= DHCP6OptPref - Dissection with specific values
3777a=DHCP6OptPref(b'\x00\x07\xff\xff\x11')
3778a.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
3786raw(DHCP6OptElapsedTime()) == b'\x00\x08\x00\x02\x00\x00'
3787
3788= DHCP6OptElapsedTime - Instantiation with specific elapsedtime value
3789raw(DHCP6OptElapsedTime(elapsedtime=421)) == b'\x00\x08\x00\x02\x01\xa5'
3790
3791= DHCP6OptElapsedTime - Basic Dissection
3792a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x00\x00')
3793a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 0
3794
3795= DHCP6OptElapsedTime - Dissection with specific values
3796a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x01\xa5')
3797a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 421
3798
3799= DHCP6OptElapsedTime - Repr
3800a.show()
3801
3802
3803############
3804############
3805+ Test DHCP6 Option - Server Unicast Address
3806
3807= DHCP6OptServerUnicast - Basic Instantiation
3808raw(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)
3811raw(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)
3814raw(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
3817a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
3818a.optcode == 12 and a.optlen == 16 and a.srvaddr == "::"
3819
3820= DHCP6OptServerUnicast - Dissection with specific values (test 1)
3821a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
3822a.optcode == 12 and a.optlen == 16 and a.srvaddr == "2001::1"
3823
3824= DHCP6OptServerUnicast - Dissection with specific values (test 2)
3825a=DHCP6OptServerUnicast(b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
3826a.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
3834raw(DHCP6OptStatusCode()) == b'\x00\r\x00\x02\x00\x00'
3835
3836= DHCP6OptStatusCode - Instantiation with specific values
3837raw(DHCP6OptStatusCode(optlen=42, statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00*\x00\xffHello'
3838
3839= DHCP6OptStatusCode - Automatic Length computation
3840raw(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
3850raw(DHCP6OptRapidCommit()) == b'\x00\x0e\x00\x00'
3851
3852= DHCP6OptRapidCommit - Basic Dissection
3853a=DHCP6OptRapidCommit(b'\x00\x0e\x00\x00')
3854a.optcode == 14 and a.optlen == 0
3855
3856
3857############
3858############
3859+ Test DHCP6 Option - User class
3860
3861= DHCP6OptUserClass - Basic Instantiation
3862raw(DHCP6OptUserClass()) == b'\x00\x0f\x00\x00'
3863
3864= DHCP6OptUserClass - Basic Dissection
3865a = DHCP6OptUserClass(b'\x00\x0f\x00\x00')
3866a.optcode == 15 and a.optlen == 0 and a.userclassdata == []
3867
3868= DHCP6OptUserClass - Instantiation with one user class data rawucture
3869raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something")])) == b'\x00\x0f\x00\x0b\x00\tsomething'
3870
3871= DHCP6OptUserClass - Dissection with one user class data rawucture
3872a = DHCP6OptUserClass(b'\x00\x0f\x00\x0b\x00\tsomething')
3873a.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
3876raw(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
3879a = DHCP6OptUserClass(b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse')
3880a.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
3888raw(DHCP6OptVendorClass()) == b'\x00\x10\x00\x04\x00\x00\x00\x00'
3889
3890= DHCP6OptVendorClass - Basic Dissection
3891a = DHCP6OptVendorClass(b'\x00\x10\x00\x04\x00\x00\x00\x00')
3892a.optcode == 16 and a.optlen == 4 and a.enterprisenum == 0 and a.vcdata == []
3893
3894= DHCP6OptVendorClass - Instantiation with one vendor class data rawucture
3895raw(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
3898a = DHCP6OptVendorClass(b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething')
3899a.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
3902raw(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
3905a = DHCP6OptVendorClass(b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse')
3906a.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
3914raw(DHCP6OptVendorSpecificInfo()) == b'\x00\x11\x00\x04\x00\x00\x00\x00'
3915
3916= DHCP6OptVendorSpecificInfo - Basic Dissection
3917a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x04\x00\x00\x00\x00')
3918a.optcode == 17 and a.optlen == 4 and a.enterprisenum == 0
3919
3920= DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option)
3921raw(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)
3924a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething')
3925a.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)
3928raw(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)
3931a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse')
3932a.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
3940raw(DHCP6OptIfaceId()) == b'\x00\x12\x00\x00'
3941
3942= DHCP6OptIfaceId - Basic Dissection
3943a = DHCP6OptIfaceId(b'\x00\x12\x00\x00')
3944a.optcode == 18 and a.optlen == 0
3945
3946= DHCP6OptIfaceId - Instantiation with specific value
3947raw(DHCP6OptIfaceId(ifaceid="something")) == b'\x00\x12\x00\x09something'
3948
3949= DHCP6OptIfaceId - Dissection with specific value
3950a = DHCP6OptIfaceId(b'\x00\x12\x00\x09something')
3951a.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
3959raw(DHCP6OptReconfMsg()) == b'\x00\x13\x00\x01\x0b'
3960
3961= DHCP6OptReconfMsg - Basic Dissection
3962a = DHCP6OptReconfMsg(b'\x00\x13\x00\x01\x0b')
3963a.optcode == 19 and a.optlen == 1 and a.msgtype == 11
3964
3965= DHCP6OptReconfMsg - Instantiation with specific values
3966raw(DHCP6OptReconfMsg(optlen=4, msgtype=5)) == b'\x00\x13\x00\x04\x05'
3967
3968= DHCP6OptReconfMsg - Dissection with specific values
3969a = DHCP6OptReconfMsg(b'\x00\x13\x00\x04\x05')
3970a.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
3978raw(DHCP6OptReconfAccept()) == b'\x00\x14\x00\x00'
3979
3980= DHCP6OptReconfAccept - Basic Dissection
3981a = DHCP6OptReconfAccept(b'\x00\x14\x00\x00')
3982a.optcode == 20 and a.optlen == 0
3983
3984= DHCP6OptReconfAccept - Instantiation with specific values
3985raw(DHCP6OptReconfAccept(optlen=23)) == b'\x00\x14\x00\x17'
3986
3987= DHCP6OptReconfAccept - Dssection with specific values
3988a = DHCP6OptReconfAccept(b'\x00\x14\x00\x17')
3989a.optcode == 20 and a.optlen == 23
3990
3991
3992############
3993############
3994+ Test DHCP6 Option - SIP Servers Domain Name List
3995
3996= DHCP6OptSIPDomains - Basic Instantiation
3997raw(DHCP6OptSIPDomains()) == b'\x00\x15\x00\x00'
3998
3999= DHCP6OptSIPDomains - Basic Dissection
4000a = DHCP6OptSIPDomains(b'\x00\x15\x00\x00')
4001a.optcode == 21 and a.optlen == 0 and a.sipdomains == []
4002
4003= DHCP6OptSIPDomains - Instantiation with one domain
4004raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org"])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00'
4005
4006= DHCP6OptSIPDomains - Dissection with one domain
4007a = DHCP6OptSIPDomains(b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00')
4008a.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
4011raw(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
4014a = DHCP6OptSIPDomains(b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04TITI\x07example\x03org\x00')
4015a.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
4018raw(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
4026raw(DHCP6OptSIPServers()) == b'\x00\x16\x00\x00'
4027
4028= DHCP6OptSIPServers - Basic Dissection
4029a = DHCP6OptSIPServers(b'\x00\x16\x00\x00')
4030a.optcode == 22 and a. optlen == 0 and a.sipservers == []
4031
4032= DHCP6OptSIPServers - Instantiation with specific values (1 address)
4033raw(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)
4036a = DHCP6OptSIPServers(b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4037a.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)
4040raw(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)
4043a = 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')
4044a.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
4052raw(DHCP6OptDNSServers()) == b'\x00\x17\x00\x00'
4053
4054= DHCP6OptDNSServers - Basic Dissection
4055a = DHCP6OptDNSServers(b'\x00\x17\x00\x00')
4056a.optcode == 23 and a. optlen == 0 and a.dnsservers == []
4057
4058= DHCP6OptDNSServers - Instantiation with specific values (1 address)
4059raw(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)
4062a = DHCP6OptDNSServers(b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4063a.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)
4066raw(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)
4069a = 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')
4070a.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
4078raw(DHCP6OptDNSDomains()) == b'\x00\x18\x00\x00'
4079
4080= DHCP6OptDNSDomains - Basic Dissection
4081a = DHCP6OptDNSDomains(b'\x00\x18\x00\x00')
4082a.optcode == 24 and a.optlen == 0 and a.dnsdomains == []
4083
4084= DHCP6OptDNSDomains - Instantiation with specific values (1 domain)
4085raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com."])) == b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00'
4086
4087= DHCP6OptDNSDomains - Dissection with specific values (1 domain)
4088a = DHCP6OptDNSDomains(b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00')
4089a.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)
4092raw(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)
4095a = DHCP6OptDNSDomains(b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
4096a.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
4104raw(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
4114raw(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
4124raw(DHCP6OptNISServers()) == b'\x00\x1b\x00\x00'
4125
4126= DHCP6OptNISServers - Basic Dissection
4127a = DHCP6OptNISServers(b'\x00\x1b\x00\x00')
4128a.optcode == 27 and a. optlen == 0 and a.nisservers == []
4129
4130= DHCP6OptNISServers - Instantiation with specific values (1 address)
4131raw(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)
4134a = DHCP6OptNISServers(b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4135a.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)
4138raw(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)
4141a = 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')
4142a.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
4150raw(DHCP6OptNISPServers()) == b'\x00\x1c\x00\x00'
4151
4152= DHCP6OptNISPServers - Basic Dissection
4153a = DHCP6OptNISPServers(b'\x00\x1c\x00\x00')
4154a.optcode == 28 and a. optlen == 0 and a.nispservers == []
4155
4156= DHCP6OptNISPServers - Instantiation with specific values (1 address)
4157raw(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)
4160a = DHCP6OptNISPServers(b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4161a.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)
4164raw(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)
4167a = 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')
4168a.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
4176raw(DHCP6OptNISDomain()) == b'\x00\x1d\x00\x00'
4177
4178= DHCP6OptNISDomain - Basic Dissection
4179a = DHCP6OptNISDomain(b'\x00\x1d\x00\x00')
4180a.optcode == 29 and a.optlen == 0 and a.nisdomain == b""
4181
4182= DHCP6OptNISDomain - Instantiation with one domain name
4183raw(DHCP6OptNISDomain(nisdomain="toto.example.org")) == b'\x00\x1d\x00\x11\x04toto\x07example\x03org'
4184
4185= DHCP6OptNISDomain - Dissection with one domain name
4186a = DHCP6OptNISDomain(b'\x00\x1d\x00\x11\x04toto\x07example\x03org\x00')
4187a.optcode == 29 and a.optlen == 17 and a.nisdomain == b"toto.example.org"
4188
4189= DHCP6OptNISDomain - Instantiation with one domain with trailing dot
4190raw(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
4198raw(DHCP6OptNISPDomain()) == b'\x00\x1e\x00\x00'
4199
4200= DHCP6OptNISPDomain - Basic Dissection
4201a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x00')
4202a.optcode == 30 and a.optlen == 0 and a.nispdomain == b""
4203
4204= DHCP6OptNISPDomain - Instantiation with one domain name
4205raw(DHCP6OptNISPDomain(nispdomain="toto.example.org")) == b'\x00\x1e\x00\x11\x04toto\x07example\x03org'
4206
4207= DHCP6OptNISPDomain - Dissection with one domain name
4208a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x11\x04toto\x07example\x03org\x00')
4209a.optcode == 30 and a.optlen == 17 and a.nispdomain == b"toto.example.org"
4210
4211= DHCP6OptNISPDomain - Instantiation with one domain with trailing dot
4212raw(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
4220raw(DHCP6OptSNTPServers()) == b'\x00\x1f\x00\x00'
4221
4222= DHCP6OptSNTPServers - Basic Dissection
4223a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x00')
4224a.optcode == 31 and a. optlen == 0 and a.sntpservers == []
4225
4226= DHCP6OptSNTPServers - Instantiation with specific values (1 address)
4227raw(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)
4230a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4231a.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)
4234raw(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)
4237a = 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')
4238a.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
4245raw(DHCP6OptInfoRefreshTime()) == b'\x00 \x00\x04\x00\x01Q\x80'
4246
4247= DHCP6OptInfoRefreshTime - Basic Dissction
4248a = DHCP6OptInfoRefreshTime(b'\x00 \x00\x04\x00\x01Q\x80')
4249a.optcode == 32 and a.optlen == 4 and a.reftime == 86400
4250
4251= DHCP6OptInfoRefreshTime - Instantiation with specific values
4252raw(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
4259raw(DHCP6OptBCMCSServers()) == b'\x00"\x00\x00'
4260
4261= DHCP6OptBCMCSServers - Basic Dissection
4262a = DHCP6OptBCMCSServers(b'\x00"\x00\x00')
4263a.optcode == 34 and a. optlen == 0 and a.bcmcsservers == []
4264
4265= DHCP6OptBCMCSServers - Instantiation with specific values (1 address)
4266raw(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)
4269a = DHCP6OptBCMCSServers(b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01')
4270a.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)
4273raw(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)
4276a = 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')
4277a.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
4285raw(DHCP6OptBCMCSDomains()) == b'\x00!\x00\x00'
4286
4287= DHCP6OptBCMCSDomains - Basic Dissection
4288a = DHCP6OptBCMCSDomains(b'\x00!\x00\x00')
4289a.optcode == 33 and a.optlen == 0 and a.bcmcsdomains == []
4290
4291= DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain)
4292raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com."])) == b'\x00!\x00\x12\x04toto\x07example\x03com\x00'
4293
4294= DHCP6OptBCMCSDomains - Dissection with specific values (1 domain)
4295a = DHCP6OptBCMCSDomains(b'\x00!\x00\x12\x04toto\x07example\x03com\x00')
4296a.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)
4299raw(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)
4302a = DHCP6OptBCMCSDomains(b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00')
4303a.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
4311raw(DHCP6OptRemoteID()) == b'\x00%\x00\x04\x00\x00\x00\x00'
4312
4313= DHCP6OptRemoteID - Basic Dissection
4314a = DHCP6OptRemoteID(b'\x00%\x00\x04\x00\x00\x00\x00')
4315a.optcode == 37 and a.optlen == 4 and a.enterprisenum == 0 and a.remoteid == b""
4316
4317= DHCP6OptRemoteID - Instantiation with specific values
4318raw(DHCP6OptRemoteID(enterprisenum=0xeeeeeeee, remoteid="someid")) == b'\x00%\x00\n\xee\xee\xee\xeesomeid'
4319
4320= DHCP6OptRemoteID - Dissection with specific values
4321a = DHCP6OptRemoteID(b'\x00%\x00\n\xee\xee\xee\xeesomeid')
4322a.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
4330raw(DHCP6OptSubscriberID()) == b'\x00&\x00\x00'
4331
4332= DHCP6OptSubscriberID - Basic Dissection
4333a = DHCP6OptSubscriberID(b'\x00&\x00\x00')
4334a.optcode == 38 and a.optlen == 0 and a.subscriberid == b""
4335
4336= DHCP6OptSubscriberID - Instantiation with specific values
4337raw(DHCP6OptSubscriberID(subscriberid="someid")) == b'\x00&\x00\x06someid'
4338
4339= DHCP6OptSubscriberID - Dissection with specific values
4340a = DHCP6OptSubscriberID(b'\x00&\x00\x06someid')
4341a.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
4349raw(DHCP6OptClientFQDN()) == b"\x00'\x00\x01\x00"
4350
4351= DHCP6OptClientFQDN - Basic Dissection
4352a = DHCP6OptClientFQDN(b"\x00'\x00\x01\x00")
4353a.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
4356raw(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
4359raw(DHCP6OptClientFQDN(fqdn="toto.example.org")) == b"\x00'\x00\x12\x00\x04toto\x07example\x03org"
4360
4361= DHCP6OptClientFQDN - Dissection with one fqdn
4362a = DHCP6OptClientFQDN(b"\x00'\x00\x12\x00\x04toto\x07example\x03org\x00")
4363a.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
4371raw(DHCP6OptRelayAgentERO()) ==  b'\x00+\x00\x04\x00\x17\x00\x18'
4372
4373= DHCP6OptRelayAgentERO - optlen field computation
4374raw(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
4377raw(DHCP6OptRelayAgentERO(reqopts=[])) == b'\x00+\x00\x00'
4378
4379= DHCP6OptRelayAgentERO - Basic dissection
4380a=DHCP6OptRelayAgentERO(b'\x00+\x00\x00')
4381a.optcode == 43 and a.optlen == 0 and a.reqopts == [23,24]
4382
4383= DHCP6OptRelayAgentERO - Dissection with specific value
4384a=DHCP6OptRelayAgentERO(b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04')
4385a.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
4393s = raw(DHCP6OptClientLinkLayerAddr())
4394assert(s == b"\x00O\x00\x07\x00\x01\x00\x00\x00\x00\x00\x00")
4395
4396p = DHCP6OptClientLinkLayerAddr(s)
4397assert(p.clladdr == "00:00:00:00:00:00")
4398
4399
4400############
4401############
4402+ Test DHCP6 Option Virtual Subnet Selection
4403
4404= Basic build & dissect
4405s = raw(DHCP6OptVSS())
4406assert(s == b"\x00D\x00\x01\xff")
4407
4408p = DHCP6OptVSS(s)
4409assert(p.type == 255)
4410
4411
4412############
4413############
4414+ Test DHCP6 Messages - DHCP6_Solicit
4415
4416= DHCP6_Solicit - Basic Instantiation
4417raw(DHCP6_Solicit()) == b'\x01\x00\x00\x00'
4418
4419= DHCP6_Solicit - Basic Dissection
4420a = DHCP6_Solicit(b'\x01\x00\x00\x00')
4421a.msgtype == 1 and a.trid == 0
4422
4423= DHCP6_Solicit - Basic test of DHCP6_solicit.hashret()
4424DHCP6_Solicit().hashret() == b'\x00\x00\x00'
4425
4426= DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values
4427DHCP6_Solicit(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd'
4428
4429= DHCP6_Solicit - UDP ports overload
4430a=UDP()/DHCP6_Solicit()
4431a.sport == 546 and a.dport == 547
4432
4433= DHCP6_Solicit - Dispatch based on UDP port
4434a=UDP(raw(UDP()/DHCP6_Solicit()))
4435isinstance(a.payload, DHCP6_Solicit)
4436
4437
4438############
4439############
4440+ Test DHCP6 Messages - DHCP6_Advertise
4441
4442= DHCP6_Advertise - Basic Instantiation
4443raw(DHCP6_Advertise()) == b'\x02\x00\x00\x00'
4444
4445= DHCP6_Advertise - Basic test of DHCP6_solicit.hashret()
4446DHCP6_Advertise().hashret() == b'\x00\x00\x00'
4447
4448= DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values
4449DHCP6_Advertise(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd'
4450
4451= DHCP6_Advertise - Basic test of answers() with solicit message
4452a = DHCP6_Solicit()
4453b = DHCP6_Advertise()
4454a > b
4455
4456= DHCP6_Advertise - Test of answers() with solicit message
4457a = DHCP6_Solicit(trid=0xbbccdd)
4458b = DHCP6_Advertise(trid=0xbbccdd)
4459a > b
4460
4461= DHCP6_Advertise - UDP ports overload
4462a=UDP()/DHCP6_Advertise()
4463a.sport == 547 and a.dport == 546
4464
4465
4466############
4467############
4468+ Test DHCP6 Messages - DHCP6_Request
4469
4470= DHCP6_Request - Basic Instantiation
4471raw(DHCP6_Request()) == b'\x03\x00\x00\x00'
4472
4473= DHCP6_Request - Basic Dissection
4474a=DHCP6_Request(b'\x03\x00\x00\x00')
4475a.msgtype == 3 and a.trid == 0
4476
4477= DHCP6_Request - UDP ports overload
4478a=UDP()/DHCP6_Request()
4479a.sport == 546 and a.dport == 547
4480
4481
4482############
4483############
4484+ Test DHCP6 Messages - DHCP6_Confirm
4485
4486= DHCP6_Confirm - Basic Instantiation
4487raw(DHCP6_Confirm()) == b'\x04\x00\x00\x00'
4488
4489= DHCP6_Confirm - Basic Dissection
4490a=DHCP6_Confirm(b'\x04\x00\x00\x00')
4491a.msgtype == 4 and a.trid == 0
4492
4493= DHCP6_Confirm - UDP ports overload
4494a=UDP()/DHCP6_Confirm()
4495a.sport == 546 and a.dport == 547
4496
4497
4498############
4499############
4500+ Test DHCP6 Messages - DHCP6_Renew
4501
4502= DHCP6_Renew - Basic Instantiation
4503raw(DHCP6_Renew()) == b'\x05\x00\x00\x00'
4504
4505= DHCP6_Renew - Basic Dissection
4506a=DHCP6_Renew(b'\x05\x00\x00\x00')
4507a.msgtype == 5 and a.trid == 0
4508
4509= DHCP6_Renew - UDP ports overload
4510a=UDP()/DHCP6_Renew()
4511a.sport == 546 and a.dport == 547
4512
4513
4514############
4515############
4516+ Test DHCP6 Messages - DHCP6_Rebind
4517
4518= DHCP6_Rebind - Basic Instantiation
4519raw(DHCP6_Rebind()) == b'\x06\x00\x00\x00'
4520
4521= DHCP6_Rebind - Basic Dissection
4522a=DHCP6_Rebind(b'\x06\x00\x00\x00')
4523a.msgtype == 6 and a.trid == 0
4524
4525= DHCP6_Rebind - UDP ports overload
4526a=UDP()/DHCP6_Rebind()
4527a.sport == 546 and a.dport == 547
4528
4529
4530############
4531############
4532+ Test DHCP6 Messages - DHCP6_Reply
4533
4534= DHCP6_Reply - Basic Instantiation
4535raw(DHCP6_Reply()) == b'\x07\x00\x00\x00'
4536
4537= DHCP6_Reply - Basic Dissection
4538a=DHCP6_Reply(b'\x07\x00\x00\x00')
4539a.msgtype == 7 and a.trid == 0
4540
4541= DHCP6_Reply - UDP ports overload
4542a=UDP()/DHCP6_Reply()
4543a.sport == 547 and a.dport == 546
4544
4545= DHCP6_Reply - Answers
4546
4547assert not DHCP6_Reply(trid=0).answers(DHCP6_Request(trid=1))
4548assert 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
4556raw(DHCP6_Release()) == b'\x08\x00\x00\x00'
4557
4558= DHCP6_Release - Basic Dissection
4559a=DHCP6_Release(b'\x08\x00\x00\x00')
4560a.msgtype == 8 and a.trid == 0
4561
4562= DHCP6_Release - UDP ports overload
4563a=UDP()/DHCP6_Release()
4564a.sport == 546 and a.dport == 547
4565
4566
4567############
4568############
4569+ Test DHCP6 Messages - DHCP6_Decline
4570
4571= DHCP6_Decline - Basic Instantiation
4572raw(DHCP6_Decline()) == b'\x09\x00\x00\x00'
4573
4574= DHCP6_Confirm - Basic Dissection
4575a=DHCP6_Confirm(b'\x09\x00\x00\x00')
4576a.msgtype == 9 and a.trid == 0
4577
4578= DHCP6_Decline - UDP ports overload
4579a=UDP()/DHCP6_Decline()
4580a.sport == 546 and a.dport == 547
4581
4582
4583############
4584############
4585+ Test DHCP6 Messages - DHCP6_Reconf
4586
4587= DHCP6_Reconf - Basic Instantiation
4588raw(DHCP6_Reconf()) == b'\x0A\x00\x00\x00'
4589
4590= DHCP6_Reconf - Basic Dissection
4591a=DHCP6_Reconf(b'\x0A\x00\x00\x00')
4592a.msgtype == 10 and a.trid == 0
4593
4594= DHCP6_Reconf - UDP ports overload
4595a=UDP()/DHCP6_Reconf()
4596a.sport == 547 and a.dport == 546
4597
4598
4599############
4600############
4601+ Test DHCP6 Messages - DHCP6_InfoRequest
4602
4603= DHCP6_InfoRequest - Basic Instantiation
4604raw(DHCP6_InfoRequest()) == b'\x0B\x00\x00\x00'
4605
4606= DHCP6_InfoRequest - Basic Dissection
4607a=DHCP6_InfoRequest(b'\x0B\x00\x00\x00')
4608a.msgtype == 11 and a.trid == 0
4609
4610= DHCP6_InfoRequest - UDP ports overload
4611a=UDP()/DHCP6_InfoRequest()
4612a.sport == 546 and a.dport == 547
4613
4614
4615############
4616############
4617+ Test DHCP6 Messages - DHCP6_RelayForward
4618
4619= DHCP6_RelayForward - Basic Instantiation
4620raw(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
4623a=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')
4624a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::"
4625
4626= DHCP6_RelayForward - Dissection with options
4627a = 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')
4628a.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
4636raw(DHCP6OptRelayMsg(optcode=37)) == b'\x00%\x00\x04\x00\x00\x00\x00'
4637
4638= DHCP6OptRelayMsg - Basic Dissection
4639a=DHCP6OptRelayMsg(b'\x00\r\x00\x00')
4640assert a.optcode == 13
4641
4642= DHCP6OptRelayMsg - Embedded DHCP6 packet
4643p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x00\x00\x00\x00')
4644isinstance(p.message, DHCP6)
4645
4646############
4647############
4648+ Test DHCP6 Messages - DHCP6_RelayReply
4649
4650= DHCP6_RelayReply - Basic Instantiation
4651raw(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
4654a=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')
4655a.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()
4663in6_getha('2001:db8::') == '2001:db8::fdff:ffff:ffff:fffe'
4664
4665= ICMPv6HAADRequest - build/dissection
4666p = IPv6(raw(IPv6(dst=in6_getha('2001:db8::'), src='2001:db8::1')/ICMPv6HAADRequest(id=42)))
4667p.cksum == 0x9620 and p.dst == '2001:db8::fdff:ffff:ffff:fffe' and p.R == 1
4668
4669= ICMPv6HAADReply - build/dissection
4670p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::42')/ICMPv6HAADReply(id=42, addresses=['2001:db8::2', '2001:db8::3'])))
4671p.cksum = 0x3747 and p.addresses == [ '2001:db8::2', '2001:db8::3' ]
4672
4673= ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection
4674a=ICMPv6HAADRequest(id=42)
4675b=ICMPv6HAADReply(id=42)
4676not a < b and a > b
4677
4678
4679############
4680############
4681+ Mobile Prefix Solicitation/Advertisement
4682
4683= ICMPv6MPSol - build (default values)
4684
4685s = 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'
4686raw(IPv6()/ICMPv6MPSol()) == s
4687
4688= ICMPv6MPSol - dissection (default values)
4689p = IPv6(s)
4690p[ICMPv6MPSol].type == 146 and p[ICMPv6MPSol].cksum == 0x6dbb and p[ICMPv6MPSol].id == 0
4691
4692= ICMPv6MPSol - build
4693s = 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'
4694raw(IPv6()/ICMPv6MPSol(cksum=0x2808, id=8)) == s
4695
4696= ICMPv6MPSol - dissection
4697p = IPv6(s)
4698p[ICMPv6MPSol].cksum == 0x2808 and p[ICMPv6MPSol].id == 8
4699
4700= ICMPv6MPAdv - build (default values)
4701s = 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'
4702raw(IPv6()/ICMPv6MPAdv()/ICMPv6NDOptPrefixInfo()) == s
4703
4704= ICMPv6MPAdv - dissection (default values)
4705p = IPv6(s)
4706p[ICMPv6MPAdv].type == 147 and p[ICMPv6MPAdv].cksum == 0xe8d6 and p[ICMPv6NDOptPrefixInfo].prefix == '::'
4707
4708= ICMPv6MPAdv - build
4709s = 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'
4710raw(IPv6()/ICMPv6MPAdv(cksum=0x2807, flags=1, id=42)/ICMPv6NDOptPrefixInfo(prefix='2001:db8::1', L=0, preferredlifetime=12)) == s
4711
4712= ICMPv6MPAdv - dissection
4713p = IPv6(s)
4714p[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
4722p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::2')/IPv6ExtHdrRouting(type=2, addresses=['2001:db8::3'])/ICMPv6EchoRequest()))
4723p.type == 2 and len(p.addresses) == 1 and p.cksum == 0x2446
4724
4725= IPv6ExtHdrRouting - type 2 - hashret
4726
4727p = IPv6()/IPv6ExtHdrRouting(addresses=["2001:db8::1", "2001:db8::2"])/ICMPv6EchoRequest()
4728p.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)
4736s = b'\x02\x02\x00\x00'
4737raw(MIP6OptBRAdvice()) == s
4738
4739= MIP6OptBRAdvice - dissection (default values)
4740p = MIP6OptBRAdvice(s)
4741p.otype == 2 and p.olen == 2 and p.rinter == 0
4742
4743= MIP6OptBRAdvice - build
4744s = b'\x03*\n\xf7'
4745raw(MIP6OptBRAdvice(otype=3, olen=42, rinter=2807)) == s
4746
4747= MIP6OptBRAdvice - dissection
4748p = MIP6OptBRAdvice(s)
4749p.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)
4757s = b'\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4758raw(MIP6OptAltCoA()) == s
4759
4760= MIP6OptAltCoA - dissection (default values)
4761p = MIP6OptAltCoA(s)
4762p.otype == 3 and p.olen == 16 and p.acoa == '::'
4763
4764= MIP6OptAltCoA - build
4765s = b'*\x08 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
4766raw(MIP6OptAltCoA(otype=42, olen=8, acoa='2001:db8::1')) == s
4767
4768= MIP6OptAltCoA - dissection
4769p = MIP6OptAltCoA(s)
4770p.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)
4778s = b'\x04\x10\x00\x00\x00\x00'
4779raw(MIP6OptNonceIndices()) == s
4780
4781= MIP6OptNonceIndices - dissection (default values)
4782p = MIP6OptNonceIndices(s)
4783p.otype == 4 and p.olen == 16 and p.hni == 0 and p.coni == 0
4784
4785= MIP6OptNonceIndices - build
4786s = b'\x04\x12\x00\x13\x00\x14'
4787raw(MIP6OptNonceIndices(olen=18, hni=19, coni=20)) == s
4788
4789= MIP6OptNonceIndices - dissection
4790p = MIP6OptNonceIndices(s)
4791p.hni == 19 and p.coni == 20
4792
4793
4794############
4795############
4796+ Mobility Options - Binding Authentication Data
4797
4798= MIP6OptBindingAuthData - build (default values)
4799s = b'\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4800raw(MIP6OptBindingAuthData()) == s
4801
4802= MIP6OptBindingAuthData - dissection (default values)
4803p = MIP6OptBindingAuthData(s)
4804p.otype == 5 and p.olen == 16 and p.authenticator == 0
4805
4806= MIP6OptBindingAuthData - build
4807s = b'\x05*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf7'
4808raw(MIP6OptBindingAuthData(olen=42, authenticator=2807)) == s
4809
4810= MIP6OptBindingAuthData - dissection
4811p = MIP6OptBindingAuthData(s)
4812p.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)
4820s = b'\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4821raw(MIP6OptMobNetPrefix()) == s
4822
4823= MIP6OptMobNetPrefix - dissection (default values)
4824p = MIP6OptMobNetPrefix(s)
4825p.otype == 6 and p.olen == 18 and p.plen == 64 and p.prefix == '::'
4826
4827= MIP6OptMobNetPrefix - build
4828s = b'\x06*\x02  \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
4829raw(MIP6OptMobNetPrefix(olen=42, reserved=2, plen=32, prefix='2001:db8::')) == s
4830
4831= MIP6OptMobNetPrefix - dissection
4832p = MIP6OptMobNetPrefix(s)
4833p.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
4841raw(MIP6OptLLAddr()) == b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00'
4842
4843= MIP6OptLLAddr - basic dissection
4844p = MIP6OptLLAddr(b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00')
4845p.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
4848raw(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
4851p = MIP6OptLLAddr(b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee')
4852
4853raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE'))
4854p.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
4862raw(MIP6OptMNID()) == b'\x08\x01\x01'
4863
4864= MIP6OptMNID - basic dissection
4865p = MIP6OptMNID(b'\x08\x01\x01')
4866p.otype == 8 and p.olen == 1 and p.subtype == 1 and p.id == b""
4867
4868= MIP6OptMNID - build with specific values
4869raw(MIP6OptMNID(subtype=42, id="someid")) == b'\x08\x07*someid'
4870
4871= MIP6OptMNID - dissection with specific values
4872p = MIP6OptMNID(b'\x08\x07*someid')
4873p.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
4882raw(MIP6OptMsgAuth()) == b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA'
4883
4884= MIP6OptMsgAuth - basic dissection
4885p = MIP6OptMsgAuth(b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA')
4886p.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
4889raw(MIP6OptMsgAuth(authdata="B"*16, mspi=0xeeeeeeee, subtype=0xff)) == b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB'
4890
4891= MIP6OptMsgAuth - dissection with specific values
4892p = MIP6OptMsgAuth(b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB')
4893p.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
4901raw(MIP6OptReplayProtection()) == b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00'
4902
4903= MIP6OptReplayProtection - basic dissection
4904p = MIP6OptReplayProtection(b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00')
4905p.otype == 10 and p.olen == 8 and p.timestamp == 0
4906
4907= MIP6OptReplayProtection - build with specific values
4908s = raw(MIP6OptReplayProtection(olen=42, timestamp=(72*31536000)<<32))
4909s == b'\n*\x87V|\x00\x00\x00\x00\x00'
4910
4911= MIP6OptReplayProtection - dissection with specific values
4912p = MIP6OptReplayProtection(s)
4913p.otype == 10 and p.olen == 42 and p.timestamp == 9752118382559232000
4914p.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
4951a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBRAdvice()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x02\x02\x00\x00'
4952b = 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'
4953c = 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'
4954d = 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'
4955e = 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'
4956g = 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'
4957h = 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'
4958i = 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'
4959j = 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'
4960a 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
4966a = 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'
4967b = 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'
4968c = 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'
4969d = 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'
4970e = 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'
4971g = 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'
4972h = 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'
4973i = 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'
4974j = 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'
4975a 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
4982a = 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'
4983b = 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'
4984c = 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'
4985d = 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'
4986e = 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'
4987g = 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'
4988h = 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'
4989i = 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'
4990j = 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'
4991a 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
4998a = 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'
4999b = 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'
5000c = 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'
5001d = 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'
5002e = 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'
5003g = 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'
5004h = 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'
5005i = 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'
5006j = 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'
5007a 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
5014a = 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'
5015b = 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'
5016c = 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'
5017d = 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'
5018e = 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'
5019g = 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'
5020h = 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'
5021i = 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'
5022j = 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'
5023a 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
5030a = 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'
5031b = 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'
5032c = 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'
5033d = 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'
5034e = 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'
5035g = 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'
5036h = 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'
5037i = 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'
5038j = 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'
5039a 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
5046a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMNID()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x08\x01\x01\x00'
5047b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMNID()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x08\x01\x01'
5048c = 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'
5049d = 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'
5050e = 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'
5051g = 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'
5052h = 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'
5053i = 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'
5054j = 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'
5055a 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
5062a = 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'
5063b = 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'
5064c = 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'
5065d = 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'
5066e = 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'
5067g = 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'
5068h = 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'
5069i = 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'
5070j = 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'
5071a 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
5078a = 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'
5079b = 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'
5080c = 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'
5081d = 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'
5082e = 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'
5083g = 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'
5084h = 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'
5085i = 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'
5086j = 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'
5087a 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
5094a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParamsReq()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0b\x00\x01\x00'
5095b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParamsReq()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0b\x00\x00'
5096c = 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'
5097d = 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'
5098e = 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'
5099g = 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'
5100h = 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'
5101i = 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'
5102j = 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'
5103a 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
5110a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParams()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0c\x00\x01\x00'
5111b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParams()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0c\x00\x00'
5112c = 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'
5113d = 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'
5114e = 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'
5115g = 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'
5116h = 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'
5117i = 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'
5118j = 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'
5119a 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
5126a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptSignature()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\r\x00\x01\x00'
5127b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptSignature()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\r\x00\x00'
5128c = 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'
5129d = 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'
5130e = 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'
5131g = 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'
5132h = 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'
5133i = 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'
5134j = 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'
5135a 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
5142a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptHomeKeygenToken()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0e\x00\x01\x00'
5143b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptHomeKeygenToken()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0e\x00\x00'
5144c = 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'
5145d = 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'
5146e = 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'
5147g = 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'
5148h = 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'
5149i = 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'
5150j = 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'
5151a 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
5158a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTestInit()]))                        ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0f\x00\x01\x00'
5159b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTestInit()]))                 ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0f\x00\x00'
5160c = 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'
5161d = 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'
5162e = 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'
5163g = 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'
5164h = 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'
5165i = 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'
5166j = 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'
5167a 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
5174a = 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'
5175b = 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'
5176c = 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'
5177d = 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'
5178e = 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'
5179g = 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'
5180h = 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'
5181i = 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'
5182j = 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'
5183a 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)
5190raw(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
5193raw(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
5196a=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')
5197b=a.payload
5198a.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
5201a=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')
5202b=a.payload
5203a.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()
5206hoa="2001:db8:9999::1"
5207coa="2001:db8:7777::1"
5208cn="2001:db8:8888::1"
5209ha="2001db8:6666::1"
5210a=IPv6(raw(IPv6(src=cn, dst=hoa)/MIP6MH_BRR()))
5211b=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=0x01)))
5212b2=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=~0x01)))
5213c=IPv6(raw(IPv6(src=cn, dst=coa)/IPv6ExtHdrRouting(type=2, addresses=[hoa])/MIP6MH_BA()))
5214b.answers(a) and not a.answers(b) and c.answers(b) and not b.answers(c) and not c.answers(b2)
5215
5216len(b[IPv6ExtHdrDestOpt].options) == 2
5217
5218
5219############
5220############
5221+ Home Test Init Message
5222
5223= MIP6MH_HoTI - Build (default values)
5224raw(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)
5227a=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')
5228b = a.payload
5229a.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)
5233raw(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)
5236a=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')
5237b=a.payload
5238a.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)
5246raw(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)
5249a=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')
5250b = a.payload
5251a.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)
5254raw(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)
5257a=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')
5258b=a.payload
5259a.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)
5267raw(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)
5270a=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')
5271b = a.payload
5272a.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)
5275raw(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)
5278a=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')
5279b = a.payload
5280a.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
5283a1, a2 = "2001:db8::1", "2001:db8::2"
5284cookie = RandString(8)._fix()
5285p1 = IPv6(src=a1, dst=a2)/MIP6MH_HoTI(cookie=cookie)
5286p2 = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie=cookie)
5287p2_ko = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie="".join(chr((orb(b'\xff') + 1) % 256)))
5288assert p1.hashret() == p2.hashret() and p2.answers(p1) and not p1.answers(p2)
5289assert 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)
5297raw(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)
5300a=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')
5301b = a.payload
5302a.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)
5305raw(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)
5308a=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')
5309b = a.payload
5310a.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)
5318s= 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'
5319raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO()])/MIP6MH_BU()) == s
5320
5321= MIP6MH_BU - dissection (default values)
5322p = IPv6(s)
5323p[MIP6MH_BU].len == 1
5324
5325= MIP6MH_BU - build
5326s = 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'
5327raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO(hoa='2001:db8::cafe')])/MIP6MH_BU(mhtime=42, options=[MIP6OptAltCoA(),MIP6OptMobNetPrefix()])) == s
5328
5329= MIP6MH_BU - dissection
5330p = IPv6(s)
5331p[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
5339s = 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'
5340raw(IPv6()/MIP6MH_BA(mhtime=42)) == s
5341
5342=  MIP6MH_BA - dissection
5343p = IPv6(s)
5344p[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
5352s = 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'
5353raw(IPv6()/MIP6MH_BE(status=2, ha='1::2')) == s
5354
5355=  MIP6MH_BE - dissection
5356p = IPv6(s)
5357p[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
5366raw(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
5368raw(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
5370raw(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
5372raw(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
5377nf5 = 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')
5378nf5.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
5386import time
5387
5388pkt = 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
5414assert pkt[NetflowFlowsetV9].templates[0].template_fields[0].fieldLength == 4
5415assert pkt[NetflowFlowsetV9].templates[0].template_fields[1].fieldLength == 16
5416
5417= NetflowHeaderV9 - advanced dissection
5418
5419d = NetflowHeader(raw(pkt))
5420d.show()
5421assert len(d[NetflowDataflowsetV9].records) == 2
5422assert d.getlayer(NetflowDataflowsetV9, templateID=257).records[0].fieldValue == b"\x01\x02\x03\x04"
5423assert 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
5425assert d.getlayer(NetflowDataflowsetV9, templateID=258).records[0].fieldValue == b"\x01\x02\x03\x05"
5426assert 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
5428assert d[NetflowOptionsFlowsetV9].scopes[0].scopeFieldType == 1
5429assert d[NetflowOptionsDataRecordV9].records[1].fieldValue == b"\x01\x02\x03"
5430assert d[NetflowOptionsDataRecordV9].records[3].fieldValue == b"\x01"
5431
5432############
5433############
5434+ pcap / pcapng format support
5435
5436= Variable creations
5437from io import BytesIO
5438pcapfile = 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')
5439pcapngfile = 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')
5440pcapnanofile = 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
5443pktpcap = rdpcap(pcapfile)
5444
5445= Read a pcapng file
5446pktpcapng = rdpcap(pcapngfile)
5447
5448= Read a pcap file with nanosecond precision
5449pktpcapnano = rdpcap(pcapnanofile)
5450
5451= Check all packet lists are the same
5452assert list(pktpcap) == list(pktpcapng) == list(pktpcapnano)
5453assert [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
5456assert all(IP in pkt for pkt in pktpcap)
5457assert all(any(proto in pkt for pkt in pktpcap) for proto in [ICMP, UDP, TCP])
5458
5459= Check wrpcap()
5460import os, tempfile
5461fdesc, filename = tempfile.mkstemp()
5462fdesc = os.fdopen(fdesc, "wb")
5463wrpcap(fdesc, pktpcap)
5464fdesc.close()
5465
5466= Check offline sniff() (by filename)
5467assert list(pktpcap) == list(sniff(offline=filename))
5468
5469= Check offline sniff() (by file object)
5470fdesc = open(filename, "rb")
5471assert list(pktpcap) == list(sniff(offline=fdesc))
5472fdesc.close()
5473
5474= Check offline sniff() with a filter (by filename)
5475~ tcpdump
5476pktpcap_flt = [(proto, sniff(offline=filename, filter=proto.__name__.lower()))
5477               for proto in [ICMP, UDP, TCP]]
5478assert 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
5482fdesc = open(filename, "rb")
5483pktpcap_tcp = sniff(offline=fdesc, filter="tcp")
5484fdesc.close()
5485assert list(pktpcap[TCP]) == list(pktpcap_tcp)
5486os.unlink(filename)
5487
5488= Check wrpcap(nano=True)
5489fdesc, filename = tempfile.mkstemp()
5490fdesc = os.fdopen(fdesc, "wb")
5491pktpcapnano[0].time += 0.000000001
5492wrpcap(fdesc, pktpcapnano, nano=True)
5493fdesc.close()
5494pktpcapnanoread = rdpcap(filename)
5495assert pktpcapnanoread[0].time == pktpcapnano[0].time
5496assert pktpcapnanoread[0].time == pktpcap[0].time + 0.000000001
5497os.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
5501pcapngfile = 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')
5502pktpcapng = rdpcap(pcapngfile)
5503assert len(pktpcapng) == 1
5504pkt = pktpcapng[0]
5505# weird, but wireshark agrees
5506assert pkt.time == 22425.352221737
5507assert isinstance(pkt, Ether)
5508pkt = pkt.payload
5509assert isinstance(pkt, IP)
5510pkt = pkt.payload
5511assert isinstance(pkt, ICMP)
5512pkt = pkt.payload
5513assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi'
5514pkt = pkt.payload
5515assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6'
5516pkt = pkt.payload
5517assert 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
5521pcapngfile = 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')
5522pktpcapng = rdpcap(pcapngfile)
5523assert len(pktpcapng) == 1
5524pkt = pktpcapng[0]
5525assert isinstance(pkt, Ether)
5526pkt = pkt.payload
5527assert isinstance(pkt, IP)
5528pkt = pkt.payload
5529assert isinstance(pkt, ICMP)
5530pkt = pkt.payload
5531assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi'
5532pkt = pkt.payload
5533assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6'
5534pkt = pkt.payload
5535assert isinstance(pkt, NoPayload)
5536
5537= Check tcpdump()
5538~ tcpdump
5539* No very specific tests because we do not want to depend on tcpdump output
5540pcapfile = 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')
5541data = tcpdump(pcapfile, dump=True, args=['-n']).split(b'\n')
5542print(data)
5543assert b'IP 127.0.0.1.20 > 127.0.0.1.80:' in data[0]
5544assert b'IP 127.0.0.1.53 > 127.0.0.1.53:' in data[1]
5545assert b'IP 127.0.0.1 > 127.0.0.1:' in data[2]
5546
5547= Check tcpdump() command with tshark
5548~ tshark
5549pcapfile = 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')
5550values = [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'])]
5551assert values == [(64, 6), (64, 17), (64, 1)]
5552
5553= Run scapy's tshark command
5554~ netaccess
5555tshark(count=1, timeout=3)
5556
5557= Check Raw IP pcap files
5558
5559import tempfile
5560filename = tempfile.mktemp(suffix=".pcap")
5561wrpcap(filename, [IP()/UDP(), IPv6()/UDP()], linktype=DLT_RAW)
5562packets = rdpcap(filename)
5563assert(isinstance(packets[0], IP) and isinstance(packets[1], IPv6))
5564
5565############
5566############
5567+ LLMNR protocol
5568
5569= Simple packet dissection
5570pkt = 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')
5571assert pkt.sport == 5355
5572assert pkt.dport == 5355
5573assert pkt[LLMNRQuery].opcode == 0
5574
5575= Packet build / dissection
5576pkt = UDP(raw(UDP()/LLMNRResponse()))
5577assert LLMNRResponse in pkt
5578assert pkt.qr == 1
5579assert pkt.c == 0
5580assert pkt.tc == 0
5581assert pkt.z == 0
5582assert pkt.rcode == 0
5583assert pkt.qdcount == 0
5584assert pkt.arcount == 0
5585assert pkt.nscount == 0
5586assert pkt.ancount == 0
5587
5588= Answers - building
5589a = UDP()/LLMNRResponse(id=12)
5590b = UDP()/LLMNRQuery(id=12)
5591assert a.answers(b)
5592assert not b.answers(a)
5593assert b.hashret() == b'\x00\x0c'
5594
5595= Answers - dissecting
5596a = 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')
5597b = 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')
5598assert b.answers(a)
5599assert not a.answers(b)
5600
5601############
5602############
5603+ LLTD protocol
5604
5605= Simple packet dissection
5606pkt = 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')
5607assert pkt.dst == pkt.real_dst
5608assert pkt.src == pkt.real_src
5609assert pkt.current_mapper_address == pkt.apparent_mapper_address
5610assert pkt.mac == '7d:5b:47:8f:ec:2e'
5611assert pkt.hostname == "TEST-AP"
5612assert isinstance(pkt[LLTDAttributeEOP].payload, NoPayload)
5613
5614= Packet build / dissection
5615pkt = Ether(raw(Ether(dst=ETHER_BROADCAST, src=RandMAC()) / LLTD(tos=0, function=0)))
5616assert LLTD in pkt
5617assert pkt.dst == pkt.real_dst
5618assert pkt.src == pkt.real_src
5619assert pkt.tos == 0
5620assert pkt.function == 0
5621
5622= Attribute build / dissection
5623assert isinstance(LLTDAttribute(), LLTDAttribute)
5624assert isinstance(LLTDAttribute(raw(LLTDAttribute())), LLTDAttribute)
5625assert all(isinstance(LLTDAttribute(type=i), LLTDAttribute) for i in six.moves.range(256))
5626assert all(isinstance(LLTDAttribute(raw(LLTDAttribute(type=i))), LLTDAttribute) for i in six.moves.range(256))
5627
5628= Large TLV
5629m1, m2, seq = RandMAC()._fix(), RandMAC()._fix(), 123
5630preqbase = Ether(src=m1, dst=m2) / LLTD() / \
5631           LLTDQueryLargeTlv(type="Detailed Icon Image")
5632prespbase = Ether(src=m2, dst=m1) / LLTD() / \
5633            LLTDQueryLargeTlvResp()
5634plist = []
5635pkt = preqbase.copy()
5636pkt.seq = seq
5637plist.append(Ether(raw(pkt)))
5638pkt = prespbase.copy()
5639pkt.seq = seq
5640pkt.flags = "M"
5641pkt.value = "abcd"
5642plist.append(Ether(raw(pkt)))
5643pkt = preqbase.copy()
5644pkt.seq = seq + 1
5645pkt.offset = 4
5646plist.append(Ether(raw(pkt)))
5647pkt = prespbase.copy()
5648pkt.seq = seq + 1
5649pkt.value = "efg"
5650plist.append(Ether(raw(pkt)))
5651builder = LargeTlvBuilder()
5652builder.parse(plist)
5653data = builder.get_data()
5654assert len(data) == 1
5655key, value = data.popitem()
5656assert key.endswith(' [Detailed Icon Image]')
5657assert value == 'abcdefg'
5658
5659
5660############
5661############
5662+ Test fragment() / defragment() functions
5663
5664= fragment()
5665payloadlen, fragsize = 100, 8
5666assert fragsize % 8 == 0
5667fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize)
5668* create the packet
5669pkt = IP() / ("X" * payloadlen)
5670* create the fragments
5671frags = fragment(pkt, fragsize)
5672* count the fragments
5673assert len(frags) == fragcount
5674* each fragment except the last one should have MF set
5675assert all(p.flags == 1 for p in frags[:-1])
5676assert frags[-1].flags == 0
5677* each fragment except the last one should have a payload of fragsize bytes
5678assert all(len(p.payload) == 8 for p in frags[:-1])
5679assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize)
5680
5681= fragment() and overloaded_fields
5682pkt1 = Ether() / IP() / UDP()
5683pkt2 = fragment(pkt1)[0]
5684pkt3 = pkt2.__class__(raw(pkt2))
5685assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto
5686
5687= fragment() already fragmented packets
5688payloadlen = 1480 * 3
5689ffrags = fragment(IP() / ("X" * payloadlen), 1480)
5690ffrags = fragment(ffrags, 1400)
5691len(ffrags) == 6
5692* each fragment except the last one should have MF set
5693assert all(p.flags == 1 for p in ffrags[:-1])
5694assert ffrags[-1].flags == 0
5695* fragment offset should be well computed
5696plen = 0
5697for p in ffrags:
5698    assert p.frag == plen // 8
5699    plen += len(p.payload)
5700
5701assert plen == payloadlen
5702
5703= defrag()
5704nonfrag, unfrag, badfrag = defrag(frags)
5705assert not nonfrag
5706assert not badfrag
5707assert len(unfrag) == 1
5708
5709= defragment()
5710defrags = defragment(frags)
5711* we should have one single packet
5712assert len(defrags) == 1
5713* which should be the same as pkt reconstructed
5714assert defrags[0] == IP(raw(pkt))
5715
5716= defrag() / defragment() - Real DNS packets
5717
5718import base64
5719
5720a = 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')
5721b = 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')
5722c = base64.b64decode('bnmYJ63mREVTUwEACABFAAFHU8UBWDIRHcMEAgIECv0DxDtlufeCT1zQktat4aEVA8MF0FO1sNbpEQtqfu5Al//OJISaRvtaArR/tLUj2CoZjS7uEnl7QpP/Ui/gR0YtyLurk9yTw7Vei0lSz4cnaOJqDiTGAKYwzVxjnoR1F3n8lplgQaOalVsHx9UAAQABAAADLAAEobkBA8epAAEAAQAAAywABKG5AQzHvwABAAEAAAMsAASnmYIMx5MAAQABAAADLAAEp5mCDcn9AAEAAQAAAqUABKeZhAvKFAABAAEAAAOEAAShuQIfyisAAQABAAADhAAEobkCKcpCAAEAAQAAA4QABKG5AjPKWQABAAEAAAOEAAShuQI9ynAAAQABAAADhAAEobkCC8nPAAEAAQAAA4QABKG5AgzJ5gABAAEAAAOEAASnmYQMAAApIAAAAAAAAAA=')
5723d = 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
5725old_debug_dissector = conf.debug_dissector
5726conf.debug_dissector = 0
5727plist = PacketList([Ether(x) for x in [a, b, c, d]])
5728conf.debug_dissector = old_debug_dissector
5729
5730left, defragmented, errored = defrag(plist)
5731assert len(left) == 1
5732assert left[0] == Ether(d)
5733assert len(defragmented) == 1
5734assert len(defragmented[0]) == 3093
5735assert defragmented[0][DNSRR].rrname == b'nyc.gov.'
5736assert len(errored) == 0
5737
5738plist_def = defragment(plist)
5739assert len(plist_def) == 2
5740assert len(plist_def[0]) == 3093
5741assert plist_def[0][DNSRR].rrname == b'nyc.gov.'
5742
5743= Packet().fragment()
5744payloadlen, fragsize = 100, 8
5745assert fragsize % 8 == 0
5746fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize)
5747* create the packet
5748pkt = IP() / ("X" * payloadlen)
5749* create the fragments
5750frags = pkt.fragment(fragsize)
5751* count the fragments
5752assert len(frags) == fragcount
5753* each fragment except the last one should have MF set
5754assert all(p.flags == 1 for p in frags[:-1])
5755assert frags[-1].flags == 0
5756* each fragment except the last one should have a payload of fragsize bytes
5757assert all(len(p.payload) == 8 for p in frags[:-1])
5758assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize)
5759
5760= Packet().fragment() and overloaded_fields
5761pkt1 = Ether() / IP() / UDP()
5762pkt2 = pkt1.fragment()[0]
5763pkt3 = pkt2.__class__(raw(pkt2))
5764assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto
5765
5766= Packet().fragment() already fragmented packets
5767payloadlen = 1480 * 3
5768ffrags = (IP() / ("X" * payloadlen)).fragment(1480)
5769ffrags = reduce(lambda x, y: x + y, (pkt.fragment(1400) for pkt in ffrags))
5770len(ffrags) == 6
5771* each fragment except the last one should have MF set
5772assert all(p.flags == 1 for p in ffrags[:-1])
5773assert ffrags[-1].flags == 0
5774* fragment offset should be well computed
5775plen = 0
5776for p in ffrags:
5777    assert p.frag == plen / 8
5778    plen += len(p.payload)
5779
5780assert plen == payloadlen
5781
5782
5783############
5784############
5785+ TCP/IP tests
5786
5787= TCP options: UTO - basic build
5788raw(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
5791uto = 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")
5792uto[TCP].options[0][0] == "UTO" and uto[TCP].options[0][1] == 0xffff
5793
5794= TCP options: SAck - basic build
5795raw(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
5798sack = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00")
5799sack[TCP].options[0][0] == "SAck" and sack[TCP].options[0][1] == (1633837924, 1701209960)
5800
5801= TCP options: SAckOK - basic build
5802raw(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
5805sackok = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00")
5806sackok[TCP].options[0][0] == "SAckOK" and sackok[TCP].options[0][1] == b''
5807
5808= TCP options: EOL - basic build
5809raw(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
5812eol = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00")
5813eol[TCP].options[0][0] == "EOL" and eol[TCP].options[0][1] == None
5814
5815= TCP options: malformed - build
5816raw(TCP(options=[('unknown', '')])) == raw(TCP())
5817
5818= TCP options: malformed - dissection
5819raw(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)
5822pkt = IP() / TCP()
5823bpkt = IP(raw(pkt))
5824assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
5825
5826pkt = IP(len=40) / TCP()
5827bpkt = IP(raw(pkt))
5828assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
5829
5830pkt = IP(len=40, ihl=5) / TCP()
5831bpkt = IP(raw(pkt))
5832assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
5833
5834pkt = IP() / TCP() / ("A" * 10)
5835bpkt = IP(raw(pkt))
5836assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
5837
5838pkt = IP(len=50) / TCP() / ("A" * 10)
5839bpkt = IP(raw(pkt))
5840assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
5841
5842pkt = IP(len=50, ihl=5) / TCP() / ("A" * 10)
5843bpkt = IP(raw(pkt))
5844assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
5845
5846pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10)
5847bpkt = IP(raw(pkt))
5848assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
5849
5850pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10)
5851bpkt = IP(raw(pkt))
5852assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
5853
5854pkt = IP(len=54, ihl=6, options=[IPOption_RR()]) / TCP() / ("A" * 10)
5855bpkt = IP(raw(pkt))
5856assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
5857
5858pkt = IP() / UDP()
5859bpkt = IP(raw(pkt))
5860assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
5861
5862pkt = IP(len=28) / UDP()
5863bpkt = IP(raw(pkt))
5864assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
5865
5866pkt = IP(len=28, ihl=5) / UDP()
5867bpkt = IP(raw(pkt))
5868assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
5869
5870pkt = IP() / UDP() / ("A" * 10)
5871bpkt = IP(raw(pkt))
5872assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
5873
5874pkt = IP(len=38) / UDP() / ("A" * 10)
5875bpkt = IP(raw(pkt))
5876assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
5877
5878pkt = IP(len=38, ihl=5) / UDP() / ("A" * 10)
5879bpkt = IP(raw(pkt))
5880assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
5881
5882pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10)
5883bpkt = IP(raw(pkt))
5884assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
5885
5886pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10)
5887bpkt = IP(raw(pkt))
5888assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
5889
5890pkt = IP(len=42, ihl=6, options=[IPOption_RR()]) / UDP() / ("A" * 10)
5891bpkt = IP(raw(pkt))
5892assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
5893
5894= DNS
5895
5896* DNS over UDP
5897pkt = IP(raw(IP(src="10.0.0.1", dst="8.8.8.8")/UDP(sport=RandShort(), dport=53)/DNS(qd=DNSQR(qname="secdev.org."))))
5898assert UDP in pkt and isinstance(pkt[UDP].payload, DNS)
5899assert pkt[UDP].dport == 53 and pkt[UDP].length is None
5900assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org."
5901
5902* DNS over TCP
5903pkt = 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."))))
5904assert TCP in pkt and isinstance(pkt[TCP].payload, DNS)
5905assert pkt[TCP].dport == 53 and pkt[DNS].length is not None
5906assert pkt[DNS].qdcount == 1 and pkt[DNS].qd.qname == b"secdev.org."
5907
5908= DNS frame with advanced decompression
5909
5910a = 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]'
5911pkt = Ether(a)
5912assert pkt.ancount == 3
5913assert pkt.arcount == 4
5914assert pkt.an[1].rdata == b'Zalmoid.local.'
5915assert pkt.an[2].rdata == b'Zalmoid.local.'
5916assert 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.'
5917assert pkt.ar[2].nextname == b'136.0.168.192.in-addr.arpa.'
5918pkt.show()
5919
5920= DNS frame with DNSRRSRV
5921
5922b = 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')
5923assert isinstance(b.an[7], DNSRRSRV)
5924assert b.an[7].target == b'sCapys-fLuff.local.'
5925assert b.an[6].rrname == b'_apple-mobdev2._tcp.local.'
5926assert 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
5930c = 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'
5931pkt = Ether(c)
5932assert DNS in pkt
5933assert pkt.an.rdata == b'140C768FFE28@Freebox Server._raop._tcp.local.'
5934assert pkt.an.getlayer(DNSRR, type=1).rrname == b'Freebox-Server-3.local.'
5935assert pkt.an.getlayer(DNSRR, type=1).rdata == '192.168.0.254'
5936
5937= Layer binding
5938
5939* Test DestMACField & DestIPField
5940pkt = Ether(raw(Ether()/IP()/UDP(dport=5353)/DNS()))
5941assert isinstance(pkt, Ether) and pkt.dst == '01:00:5e:00:00:fb'
5942pkt = pkt.payload
5943assert isinstance(pkt, IP) and pkt.dst == '224.0.0.251'
5944pkt = pkt.payload
5945assert isinstance(pkt, UDP) and pkt.dport == 5353
5946pkt = pkt.payload
5947assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload)
5948
5949* Same with IPv6
5950pkt = Ether(raw(Ether()/IPv6()/UDP(dport=5353)/DNS()))
5951assert isinstance(pkt, Ether) and pkt.dst == '33:33:00:00:00:fb'
5952pkt = pkt.payload
5953assert isinstance(pkt, IPv6) and pkt.dst == 'ff02::fb'
5954pkt = pkt.payload
5955assert isinstance(pkt, UDP) and pkt.dport == 5353
5956pkt = pkt.payload
5957assert 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
5967import mock
5968from io import StringIO
5969
5970@mock.patch("scapy.arch.unix.get_if_addr")
5971@mock.patch("scapy.arch.unix.os")
5972def 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"""
5976Routing tables
5977
5978Internet:
5979Destination        Gateway            Flags        Refs      Use   Netif Expire
5980default            192.168.1.1        UGSc          460        0     en1
5981default            link#11            UCSI            1        0 bridge1
5982127                127.0.0.1          UCS             1        0     lo0
5983127.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
6017test_osx_netstat_truncated()
6018
6019
6020############
6021############
6022+ Mocked read_routes6() calls
6023
6024= Preliminary definitions
6025~ mock_read_routes6_bsd
6026
6027import mock
6028from io import StringIO
6029
6030def 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
6042def 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")
6059def 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"""
6063Routing tables
6064
6065Internet6:
6066Destination                             Gateway                         Flags         Netif Expire
6067::1                                     ::1                             UHL             lo0
6068fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
6069fe80::1%lo0                             link#1                          UHLI            lo0
6070fe80::%en0/64                           link#4                          UCI             en0
6071fe80::ba26:6cff:fe5f:4eee%en0           b8:26:6c:5f:4e:ee               UHLWIi          en0
6072fe80::bae8:56ff:fe45:8ce6%en0           b8:e8:56:45:8c:e6               UHLI            lo0
6073ff01::%lo0/32                           ::1                             UmCI            lo0
6074ff01::%en0/32                           link#4                          UmCI            en0
6075ff02::%lo0/32                           ::1                             UmCI            lo0
6076ff02::%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
6092test_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")
6099def 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"""
6103Routing tables
6104
6105Internet6:
6106Destination                             Gateway                         Flags         Netif Expire
6107default                                 fe80::ba26:8aff:fe5f:4eef%en0   UGc             en0
6108::1                                     ::1                             UHL             lo0
61092a01:ab09:7d:1f01::/64                  link#4                          UC              en0
61102a01:ab09:7d:1f01:420:205c:9fab:5be7    b8:e9:55:44:7c:e5               UHL             lo0
61112a01:ab09:7d:1f01:ba26:8aff:fe5f:4eef   b8:26:8a:5f:4e:ef               UHLWI           en0
61122a01:ab09:7d:1f01:bae9:55ff:fe44:7ce5   b8:e9:55:44:7c:e5               UHL             lo0
6113fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
6114fe80::1%lo0                             link#1                          UHLI            lo0
6115fe80::%en0/64                           link#4                          UCI             en0
6116fe80::5664:d9ff:fe79:4e00%en0           54:64:d9:79:4e:0                UHLWI           en0
6117fe80::6ead:f8ff:fe74:945a%en0           6c:ad:f8:74:94:5a               UHLWI           en0
6118fe80::a2f3:c1ff:fec4:5b50%en0           a0:f3:c1:c4:5b:50               UHLWI           en0
6119fe80::ba26:8aff:fe5f:4eef%en0           b8:26:8a:5f:4e:ef               UHLWIir         en0
6120fe80::bae9:55ff:fe44:7ce5%en0           b8:e9:55:44:7c:e5               UHLI            lo0
6121ff01::%lo0/32                           ::1                             UmCI            lo0
6122ff01::%en0/32                           link#4                          UmCI            en0
6123ff02::%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
6141test_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")
6149def 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"""
6153Routing tables
6154
6155Internet6:
6156Destination                             Gateway                         Flags         Netif Expire
6157::1                                     ::1                             UHL             lo0
6158fe80::%lo0/64                           fe80::1%lo0                     UcI             lo0
6159fe80::1%lo0                             link#1                          UHLI            lo0
6160fe80::%en0/64                           link#4                          UCI             en0
6161fe80::a00:27ff:fe9b:c965%en0            8:0:27:9b:c9:65                 UHLI            lo0
6162ff01::%lo0/32                           ::1                             UmCI            lo0
6163ff01::%en0/32                           link#4                          UmCI            en0
6164ff02::%lo0/32                           ::1                             UmCI            lo0
6165ff02::%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
6181test_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")
6189def 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"""
6193Routing tables
6194
6195Internet6:
6196Destination                       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
6200fe80::/10                         ::1                           UGRS        lo0
6201fe80::%lo0/64                     link#2                        U           lo0
6202fe80::1%lo0                       link#2                        UHS         lo0
6203ff01::%lo0/32                     ::1                           U           lo0
6204ff02::/16                         ::1                           UGRS        lo0
6205ff02::%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
6220test_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")
6229def 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"""
6233Routing tables
6234
6235Internet6:
6236Destination                        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
62442002::/24                          ::1                            UGRS       0        0     -     8 lo0
62452002:7f00::/24                     ::1                            UGRS       0        0     -     8 lo0
62462002:e000::/20                     ::1                            UGRS       0        0     -     8 lo0
62472002:ff00::/24                     ::1                            UGRS       0        0     -     8 lo0
6248fe80::/10                          ::1                            UGRS       0        0     -     8 lo0
6249fe80::%em0/64                      link#1                         UC         0        0     -     4 em0
6250fe80::a00:27ff:fe04:59bf%em0       08:00:27:04:59:bf              UHL        0        0     -     4 lo0
6251fe80::%lo0/64                      fe80::1%lo0                    U          0        0     -     4 lo0
6252fe80::1%lo0                        link#3                         UHL        0        0     -     4 lo0
6253fec0::/10                          ::1                            UGRS       0        0     -     8 lo0
6254ff01::/16                          ::1                            UGRS       0        0     -     8 lo0
6255ff01::%em0/32                      link#1                         UC         0        0     -     4 em0
6256ff01::%lo0/32                      fe80::1%lo0                    UC         0        0     -     4 lo0
6257ff02::/16                          ::1                            UGRS       0        0     -     8 lo0
6258ff02::%em0/32                      link#1                         UC         0        0     -     4 em0
6259ff02::%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
6278test_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")
6287def 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"""
6291Routing tables
6292
6293Internet6:
6294Destination                        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
63022001:db8::/32                      ::1                            UGRS        -        -      -  lo0
63032002::/24                          ::1                            UGRS        -        -      -  lo0
63042002:7f00::/24                     ::1                            UGRS        -        -      -  lo0
63052002:e000::/20                     ::1                            UGRS        -        -      -  lo0
63062002:ff00::/24                     ::1                            UGRS        -        -      -  lo0
6307fe80::/10                          ::1                            UGRS        -        -      -  lo0
6308fe80::%wm0/64                      link#1                         UC          -        -      -  wm0
6309fe80::acd1:3989:180e:fde0          08:00:27:a1:64:d8              UHL         -        -      -  lo0
6310fe80::%lo0/64                      fe80::1                        U           -        -      -  lo0
6311fe80::1                            link#2                         UHL         -        -      -  lo0
6312ff01:1::/32                        link#1                         UC          -        -      -  wm0
6313ff01:2::/32                        ::1                            UC          -        -      -  lo0
6314ff02::%wm0/32                      link#1                         UC          -        -      -  wm0
6315ff02::%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
6331test_netbsd_7_0()
6332
6333############
6334############
6335+ STP tests
6336
6337= STP - Basic Instantiation
6338assert 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
6342s = 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')
6343assert s.rootmac == "12:13:14:15:16:17"
6344assert s.bridgemac == "aa:aa:aa:aa:aa:aa"
6345assert s.hellotime == 5
6346
6347############
6348############
6349+ EAPOL class tests
6350
6351= EAPOL - Basic Instantiation
6352raw(EAPOL()) == b'\x01\x00\x00\x00'
6353
6354= EAPOL - Instantiation with specific values
6355raw(EAPOL(version = 3, type = 5)) == b'\x03\x05\x00\x00'
6356
6357= EAPOL - Dissection (1)
6358s = 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'
6359eapol = EAPOL(s)
6360assert(eapol.version == 3)
6361assert(eapol.type == 1)
6362assert(eapol.len == 0)
6363
6364= EAPOL - Dissection (2)
6365s = 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'
6366eapol = EAPOL(s)
6367assert(eapol.version == 3)
6368assert(eapol.type == 0)
6369assert(eapol.len == 5)
6370
6371= EAPOL - Dissection (3)
6372s = 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'
6373eapol = EAPOL(s)
6374assert(eapol.version == 3)
6375assert(eapol.type == 0)
6376assert(eapol.len == 14)
6377
6378= EAPOL - Dissection (4)
6379req = EAPOL(b'\x03\x00\x00\x05\x01\x01\x00\x05\x01')
6380ans = EAPOL(b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous')
6381ans.answers(req)
6382
6383= EAPOL - Dissection (5)
6384s = b'\x02\x00\x00\x06\x01\x01\x00\x06\r '
6385eapol = EAPOL(s)
6386assert(eapol.version == 2)
6387assert(eapol.type == 0)
6388assert(eapol.len == 6)
6389assert(eapol.haslayer(EAP_TLS))
6390
6391= EAPOL - Dissection (6)
6392s = 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'
6393eapol = EAPOL(s)
6394assert(eapol.version == 3)
6395assert(eapol.type == 0)
6396assert(eapol.len == 60)
6397assert(eapol.haslayer(EAP_FAST))
6398
6399
6400############
6401############
6402+ EAPOL-MKA class tests
6403
6404= EAPOL-MKA - With Basic parameter set - Dissection
6405eapol = None
6406s = 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'
6407eapol = EAPOL(s)
6408assert(eapol.version == 3)
6409assert(eapol.type == 5)
6410assert(eapol.len == 84)
6411assert(eapol.haslayer(MKAPDU))
6412assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
6413assert(eapol[MKAPDU].haslayer(MKAICVSet))
6414assert(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
6418eapol = None
6419s = 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'
6420eapol = EAPOL(s)
6421assert(eapol.version == 3)
6422assert(eapol.type == 5)
6423assert(eapol.len == 104)
6424assert(eapol.haslayer(MKAPDU))
6425assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6426assert(eapol.haslayer(MKAPotentialPeerListParamSet))
6427assert(eapol[MKAPDU][MKAPotentialPeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
6428assert(eapol[MKAPDU].haslayer(MKAICVSet))
6429assert(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
6432eapol = None
6433s = 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"
6434eapol = EAPOL(s)
6435assert(eapol.version == 3)
6436assert(eapol.type == 5)
6437assert(eapol.len == 104)
6438assert(eapol.haslayer(MKAPDU))
6439assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7')
6440assert(eapol.haslayer(MKALivePeerListParamSet))
6441assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6442assert(eapol[MKAPDU].haslayer(MKAICVSet))
6443assert(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
6446eapol = None
6447s = 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'
6448eapol = EAPOL(s)
6449assert(eapol.version == 3)
6450assert(eapol.type == 5)
6451assert(eapol.len == 148)
6452assert(eapol.haslayer(MKAPDU))
6453assert(eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7')
6454assert(eapol.haslayer(MKASAKUseParamSet))
6455assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6456assert(eapol.haslayer(MKALivePeerListParamSet))
6457assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6458assert(eapol[MKAPDU].haslayer(MKAICVSet))
6459assert(eapol[MKAPDU][MKAICVSet].icv == b"OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae")
6460
6461= EAPOL-MKA - With Distributed SAK parameter set - Dissection
6462eapol = None
6463s = 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"
6464eapol = EAPOL(s)
6465assert(eapol.version == 3)
6466assert(eapol.type == 5)
6467assert(eapol.len == 180)
6468assert(eapol.haslayer(MKAPDU))
6469assert(eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6470assert(eapol.haslayer(MKASAKUseParamSet))
6471assert(eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6")
6472assert(eapol.haslayer(MKALivePeerListParamSet))
6473assert(eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7")
6474assert(eapol.haslayer(MKADistributedSAKParamSet))
6475assert(eapol[MKADistributedSAKParamSet].sak_aes_key_wrap == b"Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu")
6476assert(eapol[MKAPDU].haslayer(MKAICVSet))
6477assert(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
6486raw(EAP()) == b'\x04\x00\x00\x04'
6487
6488= EAP - Instantiation with specific values
6489raw(EAP(code = 1, id = 1, len = 5, type = 1)) == b'\x01\x01\x00\x05\x01'
6490
6491= EAP - Dissection (1)
6492s = 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'
6493eap = EAP(s)
6494assert(eap.code == 1)
6495assert(eap.id == 1)
6496assert(eap.len == 5)
6497assert(hasattr(eap, "type"))
6498assert(eap.type == 1)
6499
6500= EAP - Dissection (2)
6501s = 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'
6502eap = EAP(s)
6503assert(eap.code == 2)
6504assert(eap.id == 1)
6505assert(eap.len == 14)
6506assert(eap.type == 1)
6507assert(hasattr(eap, 'identity'))
6508assert(eap.identity == b'anonymous')
6509
6510= EAP - Dissection (3)
6511s = b'\x01\x01\x00\x06\r '
6512eap = EAP(s)
6513assert(eap.code == 1)
6514assert(eap.id == 1)
6515assert(eap.len == 6)
6516assert(eap.type == 13)
6517assert(eap.haslayer(EAP_TLS))
6518assert(eap[EAP_TLS].L == 0)
6519assert(eap[EAP_TLS].M == 0)
6520assert(eap[EAP_TLS].S == 1)
6521
6522= EAP - Dissection (4)
6523s = 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'
6524eap = EAP(s)
6525assert(eap.code == 2)
6526assert(eap.id == 1)
6527assert(eap.len == 209)
6528assert(eap.type == 13)
6529assert(eap.haslayer(EAP_TLS))
6530assert(eap[EAP_TLS].L == 0)
6531assert(eap[EAP_TLS].M == 0)
6532assert(eap[EAP_TLS].S == 0)
6533
6534= EAP - Dissection (5)
6535s = 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'
6536eap = EAP(s)
6537assert(eap.code == 2)
6538assert(eap.id == 158)
6539assert(eap.len == 60)
6540assert(eap.type == 43)
6541assert(eap.haslayer(EAP_FAST))
6542assert(eap[EAP_FAST].L == 0)
6543assert(eap[EAP_FAST].M == 0)
6544assert(eap[EAP_FAST].S == 0)
6545assert(eap[EAP_FAST].version == 1)
6546
6547= EAP - Dissection (6)
6548s = 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$'
6549eap = EAP(s)
6550assert(eap.code == 2)
6551assert(eap.id == 159)
6552assert(eap.len == 332)
6553assert(eap.type == 43)
6554assert(eap.haslayer(EAP_FAST))
6555assert(eap[EAP_FAST].L == 0)
6556assert(eap[EAP_FAST].M == 0)
6557assert(eap[EAP_FAST].S == 0)
6558assert(eap[EAP_FAST].version == 1)
6559
6560= EAP - Dissection (7)
6561s = b'\x02\xf1\x00\x06\x03+'
6562eap = EAP(s)
6563assert(eap.code == 2)
6564assert(eap.id == 241)
6565assert(eap.len == 6)
6566assert(eap.type == 3)
6567assert(hasattr(eap, 'desired_auth_type'))
6568assert(eap.desired_auth_type == 43)
6569
6570= EAP - Dissection (8)
6571s = 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"
6572eap = EAP(s)
6573assert(eap.code == 2)
6574assert(eap.id == 3)
6575assert(eap.len == 277)
6576assert(eap.type == 21)
6577assert(eap.haslayer(EAP_TTLS))
6578assert(eap[EAP_TTLS].L == 0)
6579assert(eap[EAP_TTLS].M == 0)
6580assert(eap[EAP_TTLS].S == 0)
6581assert(eap[EAP_TTLS].version == 0)
6582
6583= EAP - EAP_TLS - Basic Instantiation
6584raw(EAP_TLS()) == b'\x01\x00\x00\x06\r\x00'
6585
6586= EAP - EAP_FAST - Basic Instantiation
6587raw(EAP_FAST()) == b'\x01\x00\x00\x06+\x00'
6588
6589= EAP - EAP_TTLS - Basic Instantiation
6590raw(EAP_TTLS()) == b'\x01\x00\x00\x06\x15\x00'
6591
6592= EAP - EAP_MD5 - Basic Instantiation
6593raw(EAP_MD5()) == b'\x01\x00\x00\x06\x04\x00'
6594
6595= EAP - EAP_MD5 - Request - Dissection (8)
6596s = 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'
6597eap = EAP(s)
6598assert(eap.code == 1)
6599assert(eap.id == 2)
6600assert(eap.len == 22)
6601assert(eap.type == 4)
6602assert(eap.haslayer(EAP_MD5))
6603assert(eap[EAP_MD5].value_size == 16)
6604assert(eap[EAP_MD5].value == b'\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb')
6605assert(eap[EAP_MD5].optional_name == b'')
6606
6607= EAP - EAP_MD5 - Response - Dissection (9)
6608s = 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'
6609eap = EAP(s)
6610assert(eap.code == 2)
6611assert(eap.id == 2)
6612assert(eap.len == 22)
6613assert(eap.type == 4)
6614assert(eap.haslayer(EAP_MD5))
6615assert(eap[EAP_MD5].value_size == 16)
6616assert(eap[EAP_MD5].value == b'\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf')
6617assert(eap[EAP_MD5].optional_name == b'')
6618
6619= EAP - LEAP - Basic Instantiation
6620raw(LEAP()) == b'\x01\x00\x00\x08\x11\x01\x00\x00'
6621
6622= EAP - LEAP - Request - Dissection (10)
6623s = b'\x01D\x00\x1c\x11\x01\x00\x088\xb6\xd7\xa1E<!\x15supplicant-1'
6624eap = LEAP(s)
6625assert(eap.code == 1)
6626assert(eap.id == 68)
6627assert(eap.len == 28)
6628assert(eap.type == 17)
6629assert(eap.haslayer(LEAP))
6630assert(eap[LEAP].version == 1)
6631assert(eap[LEAP].count == 8)
6632assert(eap[LEAP].challenge_response == b'8\xb6\xd7\xa1E<!\x15')
6633assert(eap[LEAP].username == b"supplicant-1")
6634
6635= EAP - LEAP - Response - Dissection (11)
6636s = 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'
6637eap = LEAP(s)
6638assert(eap.code == 2)
6639assert(eap.id == 68)
6640assert(eap.len == 44)
6641assert(eap.type == 17)
6642assert(eap.haslayer(LEAP))
6643assert(eap[LEAP].version == 1)
6644assert(eap[LEAP].count == 24)
6645assert(eap[LEAP].challenge_response == b'\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95')
6646assert(eap[LEAP].username == b"supplicant-1")
6647
6648= EAP - Layers (1)
6649eap = EAP_MD5()
6650assert(EAP_MD5 in eap)
6651assert(not EAP_TLS in eap)
6652assert(not EAP_FAST in eap)
6653assert(not LEAP in eap)
6654assert(EAP in eap)
6655eap = EAP_TLS()
6656assert(EAP_TLS in eap)
6657assert(not EAP_MD5 in eap)
6658assert(not EAP_FAST in eap)
6659assert(not LEAP in eap)
6660assert(EAP in eap)
6661eap = EAP_FAST()
6662assert(EAP_FAST in eap)
6663assert(not EAP_MD5 in eap)
6664assert(not EAP_TLS in eap)
6665assert(not LEAP in eap)
6666assert(EAP in eap)
6667eap = EAP_TTLS()
6668assert(EAP_TTLS in eap)
6669assert(not EAP_MD5 in eap)
6670assert(not EAP_TLS in eap)
6671assert(not EAP_FAST in eap)
6672assert(not LEAP in eap)
6673assert(EAP in eap)
6674eap = LEAP()
6675assert(not EAP_MD5 in eap)
6676assert(not EAP_TLS in eap)
6677assert(not EAP_FAST in eap)
6678assert(LEAP in eap)
6679assert(EAP in eap)
6680
6681= EAP - Layers (2)
6682eap = EAP_MD5()
6683assert(type(eap[EAP]) == EAP_MD5)
6684eap = EAP_TLS()
6685assert(type(eap[EAP]) == EAP_TLS)
6686eap = EAP_FAST()
6687assert(type(eap[EAP]) == EAP_FAST)
6688eap = EAP_TTLS()
6689assert(type(eap[EAP]) == EAP_TTLS)
6690eap = LEAP()
6691assert(type(eap[EAP]) == LEAP)
6692
6693
6694
6695############
6696############
6697+ NTP module tests
6698
6699= NTP - Layers (1)
6700p = NTPHeader()
6701assert(NTPHeader in p)
6702assert(not NTPControl in p)
6703assert(not NTPPrivate in p)
6704assert(NTP in p)
6705p = NTPControl()
6706assert(not NTPHeader in p)
6707assert(NTPControl in p)
6708assert(not NTPPrivate in p)
6709assert(NTP in p)
6710p = NTPPrivate()
6711assert(not NTPHeader in p)
6712assert(not NTPControl in p)
6713assert(NTPPrivate in p)
6714assert(NTP in p)
6715
6716
6717= NTP - Layers (2)
6718p = NTPHeader()
6719assert(type(p[NTP]) == NTPHeader)
6720p = NTPControl()
6721assert(type(p[NTP]) == NTPControl)
6722p = NTPPrivate()
6723assert(type(p[NTP]) == NTPPrivate)
6724
6725
6726############
6727############
6728+ NTPHeader tests
6729
6730= NTPHeader - Basic checks
6731len(raw(NTP())) == 48
6732
6733
6734= NTPHeader - Dissection
6735s = 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"
6736p = NTP(s)
6737assert(isinstance(p, NTPHeader))
6738assert(p[NTPAuthenticator].key_id == 1)
6739assert(bytes_hex(p[NTPAuthenticator].dgst) == b'ad79f3a1e5fcd032d26a1e27c3c1b60e')
6740
6741
6742= NTPHeader - KoD
6743s = 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'
6744p = NTP(s)
6745assert(isinstance(p, NTPHeader))
6746assert(p.leap == 3)
6747assert(p.version == 4)
6748assert(p.mode == 4)
6749assert(p.stratum == 0)
6750assert(p.ref_id == b'INIT')
6751
6752
6753= NTPHeader - Extension dissection test
6754s = 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'
6755p = NTP(s)
6756assert(isinstance(p, NTPHeader))
6757assert(p.leap == 0)
6758assert(p.version == 4)
6759assert(p.mode == 3)
6760assert(p.stratum == 2)
6761
6762
6763############
6764############
6765+ NTP Control (mode 6) tests
6766
6767= NTP Control (mode 6) - CTL_OP_READSTAT (1) - request
6768s = b'\x16\x01\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00'
6769p = NTP(s)
6770assert(isinstance(p, NTPControl))
6771assert(p.version == 2)
6772assert(p.mode == 6)
6773assert(p.response == 0)
6774assert(p.err == 0)
6775assert(p.more == 0)
6776assert(p.op_code == 1)
6777assert(p.sequence == 12)
6778assert(p.status == 0)
6779assert(p.association_id == 0)
6780assert(p.offset == 0)
6781assert(p.count == 0)
6782assert(p.data == b'')
6783
6784
6785= NTP Control (mode 6) - CTL_OP_READSTAT (2) - response
6786s = b'\x16\x81\x00\x0c\x06d\x00\x00\x00\x00\x00\x04\xe5\xfc\xf6$'
6787p = NTP(s)
6788assert(isinstance(p, NTPControl))
6789assert(p.version == 2)
6790assert(p.mode == 6)
6791assert(p.response == 1)
6792assert(p.err == 0)
6793assert(p.more == 0)
6794assert(p.op_code == 1)
6795assert(p.sequence == 12)
6796assert(isinstance(p.status_word, NTPSystemStatusPacket))
6797assert(p.status_word.leap_indicator == 0)
6798assert(p.status_word.clock_source == 6)
6799assert(p.status_word.system_event_counter == 6)
6800assert(p.status_word.system_event_code == 4)
6801assert(p.association_id == 0)
6802assert(p.offset == 0)
6803assert(p.count == 4)
6804assert(isinstance(p.data, NTPPeerStatusDataPacket))
6805assert(p.data.association_id == 58876)
6806assert(isinstance(p.data.peer_status, NTPPeerStatusPacket))
6807assert(p.data.peer_status.configured == 1)
6808assert(p.data.peer_status.auth_enabled == 1)
6809assert(p.data.peer_status.authentic == 1)
6810assert(p.data.peer_status.reachability == 1)
6811assert(p.data.peer_status.reserved == 0)
6812assert(p.data.peer_status.peer_sel == 6)
6813assert(p.data.peer_status.peer_event_counter == 2)
6814assert(p.data.peer_status.peer_event_code == 4)
6815
6816
6817= NTP Control (mode 6) - CTL_OP_READVAR (1) - request
6818s = b'\x16\x02\x00\x12\x00\x00\xfc\x8f\x00\x00\x00\x00'
6819p = NTP(s)
6820assert(isinstance(p, NTPControl))
6821assert(p.version == 2)
6822assert(p.mode == 6)
6823assert(p.response == 0)
6824assert(p.op_code == 2)
6825assert(p.sequence == 18)
6826assert(p.status == 0)
6827assert(p.association_id == 64655)
6828assert(p.data == b'')
6829
6830
6831= NTP Control (mode 6) - CTL_OP_READVAR (2) - reponse (1st packet)
6832s = 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 '
6833p = NTP(s)
6834assert(isinstance(p, NTPControl))
6835assert(p.version == 2)
6836assert(p.mode == 6)
6837assert(p.response == 1)
6838assert(p.err == 0)
6839assert(p.more == 1)
6840assert(p.op_code == 2)
6841assert(p.sequence == 18)
6842assert(isinstance(p.status_word, NTPPeerStatusPacket))
6843assert(p.status_word.configured == 1)
6844assert(p.status_word.auth_enabled == 1)
6845assert(p.status_word.authentic == 0)
6846assert(p.status_word.reachability == 0)
6847assert(p.status_word.peer_sel == 0)
6848assert(p.status_word.peer_event_counter == 1)
6849assert(p.status_word.peer_event_code == 1)
6850assert(p.association_id == 64655)
6851assert(p.offset == 0)
6852assert(p.count == 468)
6853assert(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)
6857s = 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'
6858p = NTP(s)
6859assert(isinstance(p, NTPControl))
6860assert(p.version == 2)
6861assert(p.mode == 6)
6862assert(p.response == 1)
6863assert(p.err == 0)
6864assert(p.more == 0)
6865assert(p.op_code == 2)
6866assert(p.sequence == 18)
6867assert(isinstance(p.status_word, NTPPeerStatusPacket))
6868assert(p.association_id == 64655)
6869assert(p.offset == 468)
6870assert(p.count == 105)
6871assert(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
6875s = 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'
6876p = NTP(s)
6877assert(isinstance(p, NTPControl))
6878assert(p.version == 2)
6879assert(p.mode == 6)
6880assert(p.response == 0)
6881assert(p.err == 0)
6882assert(p.more == 0)
6883assert(p.op_code == 2)
6884assert(len(p.data.load) == 12)
6885assert(p.authenticator.key_id == 1)
6886assert(bytes_hex(p.authenticator.dgst) == b'3dc23bc7edb9555339d68908c8afa612')
6887
6888
6889= NTP Control (mode 6) - CTL_OP_READVAR (5) - response
6890s = b'\xd6\xc2\x00\x13\x05\x00s\xb5\x00\x00\x00\x00\x00\x00\x00\x01\x97(\x02I\xdb\xa0s8\xedr(`\xdbJX\n'
6891p = NTP(s)
6892assert(isinstance(p, NTPControl))
6893assert(p.version == 2)
6894assert(p.mode == 6)
6895assert(p.response == 1)
6896assert(p.err == 1)
6897assert(p.more == 0)
6898assert(p.op_code == 2)
6899assert(len(p.data.load) == 0)
6900assert(p.authenticator.key_id == 1)
6901assert(bytes_hex(p.authenticator.dgst) == b'97280249dba07338ed722860db4a580a')
6902
6903
6904= NTP Control (mode 6) - CTL_OP_WRITEVAR (1) - request
6905s = 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'
6906p = NTP(s)
6907assert(isinstance(p, NTPControl))
6908assert(p.version == 2)
6909assert(p.mode == 6)
6910assert(p.response == 0)
6911assert(p.err == 0)
6912assert(p.more == 0)
6913assert(p.op_code == 3)
6914assert(len(p.data.load) == 12)
6915assert(p.authenticator.key_id == 1)
6916assert(bytes_hex(p.authenticator.dgst) == b'aff10cb4c9946dfc4d90094aa170944a')
6917
6918
6919= NTP Control (mode 6) - CTL_OP_WRITEVAR (2) - response
6920s = 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'
6921p = NTP(s)
6922assert(isinstance(p, NTPControl))
6923assert(p.version == 2)
6924assert(p.mode == 6)
6925assert(p.response == 1)
6926assert(p.err == 1)
6927assert(p.more == 0)
6928assert(p.op_code == 3)
6929assert(hasattr(p, 'status_word'))
6930assert(isinstance(p.status_word, NTPErrorStatusPacket))
6931assert(p.status_word.error_code == 5)
6932assert(len(p.data.load) == 0)
6933assert(p.authenticator.key_id == 1)
6934assert(bytes_hex(p.authenticator.dgst) == b'807a80fbafc470679853a8e57865811c')
6935
6936
6937= NTP Control (mode 6) - CTL_OP_CONFIGURE (1) - request
6938s = 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'
6939p = NTP(s)
6940assert(isinstance(p, NTPControl))
6941assert(p.version == 2)
6942assert(p.mode == 6)
6943assert(p.response == 0)
6944assert(p.err == 0)
6945assert(p.more == 0)
6946assert(p.op_code == 8)
6947assert(p.count == 12)
6948assert(p.data.load == b'controlkey 1')
6949assert(p.authenticator.key_id == 1)
6950assert(bytes_hex(p.authenticator.dgst) == b'eaa7aca81b6a9cdb58e1530d36fbefa4')
6951
6952
6953= NTP Control (mode 6) - CTL_OP_CONFIGURE (2) - response
6954s = 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'
6955p = NTP(s)
6956assert(isinstance(p, NTPControl))
6957assert(p.version == 2)
6958assert(p.mode == 6)
6959assert(p.response == 1)
6960assert(p.err == 0)
6961assert(p.more == 0)
6962assert(p.op_code == 8)
6963assert(p.count == 18)
6964assert(p.data.load == b'Config Succeeded\r\n\x00\x00')
6965assert(p.authenticator.key_id == 1)
6966assert(bytes_hex(p.authenticator.dgst) == b'bfa6d85ff96d1e326c293caceec2a539')
6967
6968
6969= NTP Control (mode 6) - CTL_OP_SAVECONFIG (1) - request
6970s = 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#'
6971p = NTP(s)
6972assert(isinstance(p, NTPControl))
6973assert(p.version == 2)
6974assert(p.mode == 6)
6975assert(p.response == 0)
6976assert(p.err == 0)
6977assert(p.more == 0)
6978assert(p.op_code == 9)
6979assert(p.count == 15)
6980assert(p.data.load == b'ntp.test.2.conf\x00')
6981assert(p.authenticator.key_id == 1)
6982assert(bytes_hex(p.authenticator.dgst) == b'c9fb8abe3c605ffa36d218c3b7648923')
6983
6984
6985= NTP Control (mode 6) - CTL_OP_SAVECONFIG (2) - response
6986s = 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"
6987p = NTP(s)
6988assert(isinstance(p, NTPControl))
6989assert(p.version == 2)
6990assert(p.mode == 6)
6991assert(p.response == 1)
6992assert(p.err == 0)
6993assert(p.more == 0)
6994assert(p.op_code == 9)
6995assert(p.count == 42)
6996assert(p.data.load == b"Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00")
6997assert(p.authenticator.key_id == 1)
6998assert(bytes_hex(p.authenticator.dgst) == b'32c2ba59c533fe28f550e5a0860295d9')
6999
7000
7001= NTP Control (mode 6) - CTL_OP_REQ_NONCE (1) - request
7002s = b'\x16\x0c\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00'
7003p = NTP(s)
7004assert(isinstance(p, NTPControl))
7005assert(p.version == 2)
7006assert(p.mode == 6)
7007assert(p.response == 0)
7008assert(p.err == 0)
7009assert(p.more == 0)
7010assert(p.op_code == 12)
7011assert(p.data == b'')
7012assert(p.authenticator == b'')
7013
7014
7015= NTP Control (mode 6) - CTL_OP_REQ_NONCE (2) - response
7016s = b'\xd6\x8c\x00\x07\x00\x00\x00\x00\x00\x00\x00 nonce=db4186a2e1d9022472e24bc9\r\n'
7017p = NTP(s)
7018assert(isinstance(p, NTPControl))
7019assert(p.version == 2)
7020assert(p.mode == 6)
7021assert(p.response == 1)
7022assert(p.err == 0)
7023assert(p.more == 0)
7024assert(p.op_code == 12)
7025assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9\r\n')
7026assert(p.authenticator == b'')
7027
7028
7029= NTP Control (mode 6) - CTL_OP_READ_MRU (1) - request
7030s = b'\x16\n\x00\x08\x00\x00\x00\x00\x00\x00\x00(nonce=db4186a2e1d9022472e24bc9, frags=32'
7031p = NTP(s)
7032assert(isinstance(p, NTPControl))
7033assert(p.version == 2)
7034assert(p.mode == 6)
7035assert(p.response == 0)
7036assert(p.err == 0)
7037assert(p.op_code == 10)
7038assert(p.count == 40)
7039assert(p.data.load == b'nonce=db4186a2e1d9022472e24bc9, frags=32')
7040assert(p.authenticator == b'')
7041
7042= NTP Control (mode 6) - CTL_OP_READ_MRU (2) - response
7043s = 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'
7044p = NTP(s)
7045assert(isinstance(p, NTPControl))
7046assert(p.version == 2)
7047assert(p.mode == 6)
7048assert(p.response == 1)
7049assert(p.err == 0)
7050assert(p.op_code == 10)
7051assert(p.count == 233)
7052assert(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')
7053assert(p.authenticator == b'')
7054
7055
7056############
7057############
7058+ NTP Private (mode 7) tests
7059
7060= NTP Private (mode 7) - error - Dissection
7061s = b'\x97\x00\x03\x1d@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
7062p = NTP(s)
7063assert(isinstance(p, NTPPrivate))
7064assert(p.response == 1)
7065assert(p.version == 2)
7066assert(p.mode == 7)
7067assert(p.request_code == 29)
7068assert(p.err == 4)
7069assert(p.nb_items == 0)
7070assert(p.data_item_size == 0)
7071
7072
7073= NTP Private (mode 7) - REQ_PEER_LIST (1) - request
7074s = 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'
7075p = NTP(s)
7076assert(isinstance(p, NTPPrivate))
7077assert(p.response == 0)
7078assert(p.version == 2)
7079assert(p.mode == 7)
7080assert(p.request_code == 0)
7081assert(p.nb_items == 0)
7082assert(p.data_item_size == 0)
7083
7084
7085= NTP Private (mode 7) - REQ_PEER_LIST (2) - response
7086s = 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'
7087p = NTP(s)
7088assert(isinstance(p, NTPPrivate))
7089assert(p.response == 1)
7090assert(p.version == 2)
7091assert(p.mode == 7)
7092assert(p.request_code == 0)
7093assert(p.nb_items == 1)
7094assert(p.data_item_size == 32)
7095assert(type(p.data[0]) == NTPInfoPeerList)
7096assert(p.data[0].addr) == "127.127.1.0"
7097assert(p.data[0].port) == 123
7098
7099
7100= NTP Private (mode 7) - REQ_PEER_INFO (1) - request
7101s = 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'
7102p = NTP(s)
7103assert(isinstance(p, NTPPrivate))
7104assert(p.response == 0)
7105assert(p.version == 2)
7106assert(p.mode == 7)
7107assert(p.request_code == 2)
7108assert(p.nb_items == 1)
7109assert(p.data_item_size == 32)
7110assert(isinstance(p.req_data[0], NTPInfoPeerList))
7111assert(p.req_data[0].addr == "192.168.122.102")
7112assert(p.req_data[0].port == 123)
7113
7114
7115= NTP Private (mode 7) - REQ_PEER_INFO (2) - response
7116s = 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'
7117p = NTP(s)
7118assert(isinstance(p, NTPPrivate))
7119assert(p.response == 1)
7120assert(p.version == 2)
7121assert(p.mode == 7)
7122assert(p.request_code == 2)
7123assert(isinstance(p.data[0], NTPInfoPeer))
7124assert(p.data[0].dstaddr == "192.168.122.102")
7125assert(p.data[0].srcaddr == "192.168.122.101")
7126assert(p.data[0].srcport == 123)
7127assert(p.data[0].associd == 1203)
7128assert(p.data[0].keyid == 1)
7129
7130
7131= NTP Private (mode 7) - REQ_PEER_LIST_SUM (1) - request
7132s = 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'
7133p = NTP(s)
7134assert(isinstance(p, NTPPrivate))
7135assert(p.response == 0)
7136assert(p.version == 2)
7137assert(p.mode == 7)
7138assert(p.request_code == 1)
7139
7140
7141= NTP Private (mode 7) - REQ_PEER_LIST_SUM (2) - response (1st packet)
7142s = 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'
7143p = NTP(s)
7144assert(isinstance(p, NTPPrivate))
7145assert(p.response == 1)
7146assert(p.more == 1)
7147assert(p.version == 2)
7148assert(p.mode == 7)
7149assert(p.request_code == 1)
7150assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
7151assert(p.data[0].srcaddr == "192.0.2.1")
7152
7153
7154= NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (2nd packet)
7155s = 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'
7156p = NTP(s)
7157
7158assert(isinstance(p, NTPPrivate))
7159assert(p.response == 1)
7160assert(p.more == 1)
7161assert(p.version == 2)
7162assert(p.mode == 7)
7163assert(p.request_code == 1)
7164assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
7165assert(p.data[0].srcaddr == "192.168.122.103")
7166
7167
7168= NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (3rd packet)
7169s = 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'
7170p = NTP(s)
7171
7172assert(isinstance(p, NTPPrivate))
7173assert(p.response == 1)
7174assert(p.more == 0)
7175assert(p.version == 2)
7176assert(p.mode == 7)
7177assert(p.request_code == 1)
7178assert(isinstance(x, NTPInfoPeerSummary) for x in p.data)
7179assert(p.data[0].srcaddr == "192.168.122.108")
7180
7181
7182= NTP Private (mode 7) - REQ_PEER_STATS (1) - request
7183s = 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'
7184p = NTP(s)
7185assert(isinstance(p, NTPPrivate))
7186assert(p.response == 0)
7187assert(p.more == 0)
7188assert(p.version == 2)
7189assert(p.mode == 7)
7190assert(p.request_code == 3)
7191assert(isinstance(p.req_data[0], NTPInfoPeerList))
7192
7193
7194= NTP Private (mode 7) - REQ_PEER_STATS (2) - response
7195s = 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'
7196p = NTP(s)
7197
7198assert(isinstance(p, NTPPrivate))
7199assert(p.response == 1)
7200assert(p.more == 0)
7201assert(p.version == 2)
7202assert(p.mode == 7)
7203assert(p.request_code == 3)
7204assert(isinstance(x, NTPInfoPeerStats) for x in p.data)
7205
7206
7207= NTP Private (mode 7) - REQ_SYS_INFO (1) - request
7208s = 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'
7209p = NTP(s)
7210
7211assert(isinstance(p, NTPPrivate))
7212assert(p.response == 0)
7213assert(p.more == 0)
7214assert(p.version == 2)
7215assert(p.mode == 7)
7216assert(p.request_code == 4)
7217
7218
7219= NTP Private (mode 7) - REQ_SYS_INFO (2) - response
7220s = 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'
7221p = NTP(s)
7222
7223assert(isinstance(p, NTPPrivate))
7224assert(p.response == 1)
7225assert(p.more == 0)
7226assert(p.version == 2)
7227assert(p.mode == 7)
7228assert(p.request_code == 4)
7229assert(isinstance(p.data[0], NTPInfoSys))
7230assert(p.data[0].peer == "127.127.1.0")
7231assert(p.data[0].peer_mode == 3)
7232assert(p.data[0].leap == 0)
7233assert(p.data[0].stratum == 11)
7234assert(p.data[0].precision == 240)
7235assert(p.data[0].refid == "127.127.1.0")
7236
7237
7238= NTP Private (mode 7) - REQ_SYS_STATS (1) - request
7239s = 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'
7240p = NTP(s)
7241assert(isinstance(p, NTPPrivate))
7242assert(p.response == 0)
7243assert(p.more == 0)
7244assert(p.version == 2)
7245assert(p.mode == 7)
7246assert(p.request_code == 5)
7247
7248
7249= NTP Private (mode 7) - REQ_SYS_STATS (2) - response
7250s = 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'
7251p = NTP(s)
7252assert(isinstance(p, NTPPrivate))
7253assert(p.response == 1)
7254assert(p.more == 0)
7255assert(p.version == 2)
7256assert(p.mode == 7)
7257assert(p.request_code == 5)
7258assert(isinstance(p.data[0], NTPInfoSysStats))
7259assert(p.data[0].timeup == 188987)
7260assert(p.data[0].received == 2877)
7261
7262
7263= NTP Private (mode 7) - REQ_IO_STATS (1) - request
7264s = 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'
7265p = NTP(s)
7266assert(isinstance(p, NTPPrivate))
7267assert(p.response == 0)
7268assert(p.more == 0)
7269assert(p.version == 2)
7270assert(p.mode == 7)
7271assert(p.request_code == 6)
7272
7273
7274= NTP Private (mode 7) - REQ_IO_STATS (2) - response
7275s = 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'
7276p = NTP(s)
7277assert(isinstance(p, NTPPrivate))
7278assert(p.response == 1)
7279assert(p.more == 0)
7280assert(p.version == 2)
7281assert(p.mode == 7)
7282assert(p.request_code == 6)
7283assert(p.data[0].timereset == 772)
7284assert(p.data[0].sent == 217)
7285
7286
7287= NTP Private (mode 7) - REQ_MEM_STATS (1) - request
7288s = 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'
7289p = NTP(s)
7290assert(isinstance(p, NTPPrivate))
7291assert(p.response == 0)
7292assert(p.more == 0)
7293assert(p.version == 2)
7294assert(p.mode == 7)
7295assert(p.request_code == 7)
7296
7297
7298= NTP Private (mode 7) - REQ_MEM_STATS (2) - response
7299s = 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'
7300p = NTP(s)
7301assert(isinstance(p, NTPPrivate))
7302assert(p.response == 1)
7303assert(p.more == 0)
7304assert(p.version == 2)
7305assert(p.mode == 7)
7306assert(p.request_code == 7)
7307assert(p.data[0].timereset == 2798)
7308assert(p.data[0].totalpeermem == 15)
7309assert(p.data[0].freepeermem == 13)
7310assert(p.data[0].findpeer_calls == 60)
7311assert(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
7315s = 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'
7316p = NTP(s)
7317assert(isinstance(p, NTPPrivate))
7318assert(p.response == 0)
7319assert(p.more == 0)
7320assert(p.version == 2)
7321assert(p.mode == 7)
7322assert(p.request_code == 8)
7323
7324
7325= NTP Private (mode 7) - REQ_LOOP_INFO (2) - response
7326s = 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'
7327p = NTP(s)
7328assert(isinstance(p, NTPPrivate))
7329assert(p.response == 1)
7330assert(p.more == 0)
7331assert(p.version == 2)
7332assert(p.mode == 7)
7333assert(p.request_code == 8)
7334assert(p.data[0].last_offset == 0.0)
7335assert(p.data[0].watchdog_timer == 4)
7336
7337
7338
7339= NTP Private (mode 7) - REQ_TIMER_STATS (1) - request
7340s = 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'
7341p = NTP(s)
7342assert(isinstance(p, NTPPrivate))
7343assert(p.response == 0)
7344assert(p.more == 0)
7345assert(p.version == 2)
7346assert(p.mode == 7)
7347assert(p.request_code == 9)
7348
7349
7350= NTP Private (mode 7) - REQ_TIMER_STATS (2) - response
7351s = b'\x97\x00\x03\t\x00\x01\x00\x10\x00\x00\x01h\x00\x00\x01h\x00\x00\x00\x00\x00\x00\x00\x00'
7352p = NTP(s)
7353assert(isinstance(p, NTPPrivate))
7354assert(p.response == 1)
7355assert(p.more == 0)
7356assert(p.version == 2)
7357assert(p.mode == 7)
7358assert(p.request_code == 9)
7359assert(p.data[0].timereset == 360)
7360assert(p.data[0].alarms == 360)
7361
7362
7363= NTP Private (mode 7) - REQ_CONFIG (1) - request
7364s = 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'
7365p = NTP(s)
7366assert(isinstance(p, NTPPrivate))
7367assert(p.response == 0)
7368assert(p.more == 0)
7369assert(p.version == 2)
7370assert(p.mode == 7)
7371assert(p.request_code == 10)
7372assert(p.nb_items == 1)
7373assert(p.data_item_size == 168)
7374assert(hasattr(p, 'req_data'))
7375assert(isinstance(p.req_data[0], NTPConfPeer))
7376assert(p.req_data[0].peeraddr == "192.168.122.109")
7377assert(p.req_data[0].hmode == 1)
7378assert(p.req_data[0].version == 3)
7379assert(p.req_data[0].minpoll == 6)
7380assert(p.req_data[0].maxpoll == 10)
7381assert(hasattr(p, 'authenticator'))
7382assert(p.authenticator.key_id == 1)
7383assert(bytes_hex(p.authenticator.dgst) == b'5abafe011c720564a114b129e976448d')
7384
7385
7386= NTP Private (mode 7) - REQ_CONFIG (2) - response
7387s = b'\x97\x00\x03\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
7388p = NTP(s)
7389assert(isinstance(p, NTPPrivate))
7390assert(p.response == 1)
7391assert(p.more == 0)
7392assert(p.version == 2)
7393assert(p.mode == 7)
7394assert(p.auth == 0)
7395assert(p.request_code == 10)
7396assert(p.err == 0)
7397assert(p.nb_items == 0)
7398assert(p.data_item_size == 0)
7399
7400
7401= NTP Private (mode 7) - REQ_UNCONFIG (1) - request
7402s = 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%'
7403p = NTP(s)
7404assert(isinstance(p, NTPPrivate))
7405assert(p.response == 0)
7406assert(p.more == 0)
7407assert(p.version == 2)
7408assert(p.mode == 7)
7409assert(p.request_code == 11)
7410assert(p.nb_items == 1)
7411assert(p.data_item_size == 24)
7412assert(hasattr(p, 'req_data'))
7413assert(isinstance(p.req_data[0], NTPConfUnpeer))
7414assert(p.req_data[0].peeraddr == "192.168.122.107")
7415assert(p.req_data[0].v6_flag == 0)
7416assert(hasattr(p, 'authenticator'))
7417assert(p.authenticator.key_id == 1)
7418assert(bytes_hex(p.authenticator.dgst) == b'1d4d3bfe5a7e5d5ae34561929a45d825')
7419
7420
7421= NTP Private (mode 7) - REQ_UNCONFIG (2) - response
7422s = b'\x97\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
7423p = NTP(s)
7424assert(isinstance(p, NTPPrivate))
7425assert(p.response == 1)
7426assert(p.more == 0)
7427assert(p.version == 2)
7428assert(p.mode == 7)
7429assert(p.auth == 0)
7430assert(p.request_code == 11)
7431assert(p.err == 0)
7432assert(p.nb_items == 0)
7433assert(p.data_item_size == 0)
7434
7435
7436= NTP Private (mode 7) - REQ_RESADDFLAGS (1) - request
7437s = 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'
7438p = NTP(s)
7439assert(isinstance(p, NTPPrivate))
7440assert(p.response == 0)
7441assert(p.more == 0)
7442assert(p.version == 2)
7443assert(p.mode == 7)
7444assert(p.request_code == 17)
7445assert(p.nb_items == 1)
7446assert(p.data_item_size == 48)
7447assert(hasattr(p, 'req_data'))
7448assert(isinstance(p.req_data[0], NTPConfRestrict))
7449assert(p.req_data[0].addr == "192.168.122.105")
7450assert(p.req_data[0].mask == "255.255.255.255")
7451assert(hasattr(p, 'authenticator'))
7452assert(p.authenticator.key_id == 1)
7453assert(bytes_hex(p.authenticator.dgst) == b'3e3db7305470eeaee1ad3462efe380c8')
7454
7455
7456= NTP Private (mode 7) - REQ_RESSUBFLAGS (1) - request
7457s = 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'
7458p = NTP(s)
7459assert(isinstance(p, NTPPrivate))
7460assert(p.response == 0)
7461assert(p.more == 0)
7462assert(p.version == 2)
7463assert(p.mode == 7)
7464assert(p.request_code == 18)
7465assert(p.nb_items == 1)
7466assert(p.data_item_size == 48)
7467assert(hasattr(p, 'req_data'))
7468assert(isinstance(p.req_data[0], NTPConfRestrict))
7469assert(p.req_data[0].addr == "192.168.122.105")
7470assert(p.req_data[0].mask == "255.255.255.255")
7471assert(hasattr(p, 'authenticator'))
7472assert(p.authenticator.key_id == 1)
7473assert(bytes_hex(p.authenticator.dgst) == b'3e650ddfdb1e3168d0ca294c076b900a')
7474
7475
7476= NTP Private (mode 7) - REQ_RESET_PEER (1) - request
7477s = 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"
7478p = NTP(s)
7479assert(isinstance(p, NTPPrivate))
7480assert(p.response == 0)
7481assert(p.more == 0)
7482assert(p.version == 2)
7483assert(p.mode == 7)
7484assert(p.request_code == 22)
7485assert(p.nb_items == 1)
7486assert(p.data_item_size == 24)
7487assert(hasattr(p, 'req_data'))
7488assert(isinstance(p.req_data[0], NTPConfUnpeer))
7489assert(p.req_data[0].peeraddr == "192.168.122.102")
7490assert(p.req_data[0].v6_flag == 0)
7491
7492
7493= NTP Private (mode 7) - REQ_AUTHINFO (1) - response
7494s = 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'
7495p = NTP(s)
7496assert(isinstance(p, NTPPrivate))
7497assert(p.response == 1)
7498assert(p.more == 0)
7499assert(p.version == 2)
7500assert(p.mode == 7)
7501assert(p.auth == 0)
7502assert(p.request_code == 28)
7503assert(p.err == 0)
7504assert(p.nb_items == 1)
7505assert(p.data_item_size == 36)
7506assert(hasattr(p, 'data'))
7507assert(isinstance(p.data[0], NTPInfoAuth))
7508assert(p.data[0].timereset == 477)
7509assert(p.data[0].numkeys == 2)
7510assert(p.data[0].numfreekeys == 10)
7511assert(p.data[0].keylookups == 96)
7512assert(p.data[0].keynotfound == 0)
7513assert(p.data[0].encryptions == 9)
7514assert(p.data[0].decryptions == 47)
7515assert(p.data[0].expired == 0)
7516assert(p.data[0].keyuncached == 1)
7517
7518
7519= NTP Private (mode 7) - REQ_ADD_TRAP (1) - request
7520s = 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'
7521p = NTP(s)
7522assert(isinstance(p, NTPPrivate))
7523assert(p.response == 0)
7524assert(p.more == 0)
7525assert(p.version == 2)
7526assert(p.mode == 7)
7527assert(p.auth == 1)
7528assert(p.request_code == 30)
7529assert(p.err == 0)
7530assert(p.nb_items == 1)
7531assert(hasattr(p, 'req_data'))
7532assert(isinstance(p.req_data[0], NTPConfTrap))
7533assert(p.req_data[0].trap_address == '192.0.2.3')
7534assert(hasattr(p, 'authenticator'))
7535assert(p.authenticator.key_id == 1)
7536assert(bytes_hex(p.authenticator.dgst) == b'6224b8494d2ea631d085498fa7278992')
7537
7538
7539= NTP Private (mode 7) - REQ_ADD_TRAP (2) - response
7540s = b'\x97\x00\x03\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
7541p = NTP(s)
7542assert(isinstance(p, NTPPrivate))
7543assert(p.response == 1)
7544assert(p.more == 0)
7545assert(p.version == 2)
7546assert(p.mode == 7)
7547assert(p.auth == 0)
7548assert(p.request_code == 30)
7549assert(p.err == 0)
7550assert(p.nb_items == 0)
7551assert(p.data_item_size == 0)
7552
7553
7554= NTP Private (mode 7) - REQ_CLR_TRAP (1) - request
7555s = 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'
7556p = NTP(s)
7557assert(isinstance(p, NTPPrivate))
7558assert(p.response == 0)
7559assert(p.more == 0)
7560assert(p.version == 2)
7561assert(p.mode == 7)
7562assert(p.auth == 1)
7563assert(p.request_code == 31)
7564assert(p.err == 0)
7565assert(p.nb_items == 1)
7566assert(hasattr(p, 'req_data'))
7567assert(isinstance(p.req_data[0], NTPConfTrap))
7568assert(p.req_data[0].trap_address == '192.0.2.3')
7569assert(hasattr(p, 'authenticator'))
7570assert(p.authenticator.key_id == 1)
7571assert(bytes_hex(p.authenticator.dgst) == b'a55f569eb87144921b1c3e5aad5d2a89')
7572
7573
7574= NTP Private (mode 7) - REQ_CLR_TRAP (2) - response
7575s = b'\x97\x00\x03\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
7576p = NTP(s)
7577assert(isinstance(p, NTPPrivate))
7578assert(p.response == 1)
7579assert(p.more == 0)
7580assert(p.version == 2)
7581assert(p.mode == 7)
7582assert(p.auth == 0)
7583assert(p.request_code == 31)
7584assert(p.err == 0)
7585assert(p.nb_items == 0)
7586assert(p.data_item_size == 0)
7587
7588
7589= NTP Private (mode 7) - REQ_GET_CTLSTATS - response
7590s = 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'
7591p = NTP(s)
7592assert(isinstance(p, NTPPrivate))
7593assert(p.response == 1)
7594assert(p.more == 0)
7595assert(p.version == 2)
7596assert(p.mode == 7)
7597assert(p.auth == 0)
7598assert(p.request_code == 34)
7599assert(p.nb_items == 1)
7600assert(p.data_item_size == 60)
7601assert(type(p.data[0]) == NTPInfoControl)
7602assert(p.data[0].ctltimereset == 237)
7603
7604
7605= NTP Private (mode 7) - REQ_GET_KERNEL (1) - request
7606s = 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'
7607p = NTP(s)
7608assert(isinstance(p, NTPPrivate))
7609assert(p.response == 0)
7610assert(p.more == 0)
7611assert(p.version == 2)
7612assert(p.mode == 7)
7613assert(p.auth == 0)
7614assert(p.request_code == 38)
7615assert(p.nb_items == 0)
7616assert(p.data_item_size == 0)
7617
7618
7619= NTP Private (mode 7) - REQ_GET_KERNEL (2) - response
7620s = 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'
7621p = NTP(s)
7622assert(isinstance(p, NTPPrivate))
7623assert(p.response == 1)
7624assert(p.more == 0)
7625assert(p.version == 2)
7626assert(p.mode == 7)
7627assert(p.auth == 0)
7628assert(p.request_code == 38)
7629assert(p.nb_items == 1)
7630assert(p.data_item_size == 60)
7631assert(isinstance(p.data[0], NTPInfoKernel))
7632assert(p.data[0].maxerror == 16000000)
7633assert(p.data[0].esterror == 16000000)
7634assert(p.data[0].status == 8257)
7635assert(p.data[0].constant == 3)
7636assert(p.data[0].precision == 1)
7637assert(p.data[0].tolerance == 32768000)
7638
7639
7640
7641= NTP Private (mode 7) - REQ_MON_GETLIST_1 (1) - request
7642s = 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'
7643p = NTP(s)
7644assert(isinstance(p, NTPPrivate))
7645assert(p.response == 0)
7646assert(p.more == 0)
7647assert(p.version == 2)
7648assert(p.mode == 7)
7649assert(p.request_code == 42)
7650assert(p.nb_items == 0)
7651assert(p.data_item_size == 0)
7652
7653
7654= NTP Private (mode 7) - REQ_MON_GETLIST_1 (2) - response
7655s = 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'
7656p = NTP(s)
7657assert(isinstance(p, NTPPrivate))
7658assert(p.response == 1)
7659assert(p.more == 1)
7660assert(p.version == 2)
7661assert(p.mode == 7)
7662assert(p.request_code == 42)
7663assert(p.nb_items == 6)
7664assert(p.data_item_size == 72)
7665
7666
7667= NTP Private (mode 7) - REQ_IF_STATS (1) - request
7668s = 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'
7669p = NTP(s)
7670assert(isinstance(p, NTPPrivate))
7671assert(p.response == 0)
7672assert(p.more == 0)
7673assert(p.version == 2)
7674assert(p.mode == 7)
7675assert(p.auth == 1)
7676assert(p.request_code == 44)
7677assert(p.nb_items == 0)
7678assert(p.data_item_size == 0)
7679assert(hasattr(p, 'authenticator'))
7680assert(p.authenticator.key_id == 1)
7681assert(bytes_hex(p.authenticator.dgst) == b'8bfb9075a86164e887cabf96d29ddd49')
7682
7683
7684= NTP Private (mode 7) - REQ_IF_STATS (2) - response
7685s = 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"
7686p = NTP(s)
7687assert(isinstance(p, NTPPrivate))
7688assert(p.response == 1)
7689assert(p.more == 1)
7690assert(p.version == 2)
7691assert(p.mode == 7)
7692assert(p.auth == 0)
7693assert(p.request_code == 44)
7694assert(p.err == 0)
7695assert(p.nb_items == 3)
7696assert(p.data_item_size == 136)
7697assert(isinstance(p.data[0], NTPInfoIfStatsIPv6))
7698assert(p.data[0].unaddr == "::1")
7699assert(p.data[0].unmask == "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
7700assert(p.data[0].ifname.startswith(b"lo"))
7701
7702
7703= NTP Private (mode 7) - REQ_IF_STATS (3) - response
7704s = 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'
7705p = NTP(s)
7706assert(isinstance(p, NTPPrivate))
7707assert(p.response == 1)
7708assert(p.more == 1)
7709assert(p.version == 2)
7710assert(p.mode == 7)
7711assert(p.auth == 0)
7712assert(p.request_code == 44)
7713assert(p.err == 0)
7714assert(p.nb_items == 3)
7715assert(p.data_item_size == 136)
7716assert(isinstance(p.data[0], NTPInfoIfStatsIPv4))
7717assert(p.data[0].unaddr == "192.168.122.101")
7718assert(p.data[0].unmask == "255.255.255.0")
7719assert(p.data[0].ifname.startswith(b"eth1"))
7720
7721
7722= NTP Private (mode 7) - REQ_IF_RELOAD (1) - request
7723s = 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'
7724p = NTP(s)
7725assert(isinstance(p, NTPPrivate))
7726assert(p.response == 0)
7727assert(p.more == 0)
7728assert(p.version == 2)
7729assert(p.mode == 7)
7730assert(p.auth == 1)
7731assert(p.request_code == 45)
7732assert(p.nb_items == 0)
7733assert(p.data_item_size == 0)
7734assert(hasattr(p, 'authenticator'))
7735assert(p.authenticator.key_id == 1)
7736assert(bytes_hex(p.authenticator.dgst) == b'fb3e962ae74ff78f6568d4074cc008cb')
7737
7738
7739= NTP Private (mode 7) - REQ_IF_RELOAD (2) - response
7740s = 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'
7741p = NTP(s)
7742assert(isinstance(p, NTPPrivate))
7743assert(p.response == 1)
7744assert(p.more == 1)
7745assert(p.version == 2)
7746assert(p.mode == 7)
7747assert(p.auth == 0)
7748assert(p.request_code == 45)
7749assert(p.err == 0)
7750assert(p.nb_items == 3)
7751assert(p.data_item_size == 136)
7752assert(isinstance(p.data[0], NTPInfoIfStatsIPv4))
7753assert(p.data[0].unaddr == "127.0.0.1")
7754assert(p.data[0].unmask == "255.0.0.0")
7755assert(p.data[0].ifname.startswith(b"lo"))
7756
7757
7758############
7759############
7760+ VXLAN layer
7761
7762= Build a VXLAN packet with VNI of 42
7763raw(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
7766pkt = VXLAN(raw(VXLAN(vni=23)/Ether(dst="11:11:11:11:11:11", src="11:11:11:11:11:11", type=0x800)))
7767pkt.flags.NextProtocol and pkt.NextProtocol == 3
7768
7769= Verify UDP dport overloading
7770p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
7771p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
7772p /= VXLAN(flags=0x8, vni=42) / Ether() / IP()
7773p = Ether(raw(p))
7774assert(p[UDP].dport == 4789)
7775assert(p[Ether:2].type == 0x800)
7776
7777= Build a VXLAN packet with next protocol field
7778p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
7779p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
7780p /= VXLAN(flags=0xC, vni=42, NextProtocol=3) / Ether() / IP()
7781p = Ether(raw(p))
7782assert(p[UDP].dport == 4789)
7783assert(p[VXLAN].reserved0 == 0x0)
7784assert(p[VXLAN].NextProtocol == 3)
7785assert(p[Ether:2].type == 0x800)
7786
7787= Build a VXLAN packet with no group policy ID
7788p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
7789p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
7790p /= VXLAN(flags=0x8, vni=42) / Ether() / IP()
7791p = Ether(raw(p))
7792assert(p[VXLAN].reserved1 == 0x0)
7793assert(p[VXLAN].gpid is None)
7794assert(p[Ether:2].type == 0x800)
7795
7796= Build a VXLAN packet with group policy ID = 42
7797p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22")
7798p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111)
7799p /= VXLAN(flags=0x88, gpid=42, vni=42) / Ether() / IP()
7800p = Ether(raw(p))
7801assert(p[VXLAN].gpid == 42)
7802assert(p[VXLAN].reserved1 is None)
7803assert(p[Ether:2].type == 0x800)
7804
7805
7806############
7807############
7808############
7809+ Tests of StreamSocket
7810
7811= Test with DNS over TCP
7812~ netaccess
7813
7814import socket
7815sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7816sck.connect(("8.8.8.8", 53))
7817
7818class 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
7823ssck = StreamSocket(sck)
7824ssck.basecls = DNSTCP
7825
7826r = ssck.sr1(DNSTCP(dns=DNS(rd=1, qd=DNSQR(qname="www.example.com"))))
7827sck.close()
7828assert(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
7836import socket
7837class 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
7845class 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
7853s = MockSocket()
7854ss = SSLStreamSocket(s, basecls=TestPacket)
7855
7856p = ss.recv()
7857assert(p.data == 1)
7858p = ss.recv()
7859assert(p.data == 2)
7860p = ss.recv()
7861assert(p.data == 3)
7862try:
7863    ss.recv()
7864    ret = False
7865except socket.error:
7866    ret = True
7867
7868assert(ret)
7869
7870= Test with recv() calls that return twice as much data as the exact packet-length
7871~ sslraweamsocket
7872
7873import socket
7874class 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
7882class 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
7890s = MockSocket()
7891ss = SSLStreamSocket(s, basecls=TestPacket)
7892
7893p = ss.recv()
7894assert(p.data == 1)
7895p = ss.recv()
7896assert(p.data == 2)
7897p = ss.recv()
7898assert(p.data == 3)
7899p = ss.recv()
7900assert(p.data == 4)
7901try:
7902    ss.recv()
7903    ret = False
7904except socket.error:
7905    ret = True
7906
7907assert(ret)
7908
7909= Test with recv() calls that return not enough data
7910~ sslraweamsocket
7911
7912import socket
7913class 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
7921class 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
7929s = MockSocket()
7930ss = SSLStreamSocket(s, basecls=TestPacket)
7931
7932try:
7933    p = ss.recv()
7934    ret = False
7935except:
7936    ret = True
7937
7938assert(ret)
7939p = ss.recv()
7940assert(p.data == 1)
7941try:
7942    p = ss.recv()
7943    ret = False
7944except:
7945    ret = True
7946
7947assert(ret)
7948p = ss.recv()
7949assert(p.data == 2)
7950try:
7951    p = ss.recv()
7952    ret = False
7953except:
7954    ret = True
7955
7956assert(ret)
7957try:
7958    p = ss.recv()
7959    ret = False
7960except:
7961    ret = True
7962
7963assert(ret)
7964p = ss.recv()
7965assert(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
7973from scapy.pton_ntop import _inet6_ntop, inet_ntop
7974import socket
7975for 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
7999binfrm = b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x00\x00\x88\x88'
8000addr1, 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.
8004assert(addr1 in ['1111:2222:3333:4444:5555:6666:0:8888',
8005                 '1111:2222:3333:4444:5555:6666::8888'])
8006assert(addr2 == '1111:2222:3333:4444:5555:6666:0:8888')
8007
8008= IPv6 bin to rawing conversion - Illegal sizes
8009for 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
8029s = raw(IP()/VRRP())
8030s == 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
8033p = IP(s)
8034VRRP in p and p[VRRP].chksum == 0x7afd
8035
8036= VRRP - chksums
8037# VRRPv3
8038p = 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"])
8039a = Ether(raw(p))
8040assert a[VRRPv3].chksum == 0xb25e
8041# VRRPv1
8042p = 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"])
8043b = Ether(raw(p))
8044assert b[VRRP].chksum == 0xc6f4
8045
8046############
8047############
8048+ L2TP tests
8049
8050= L2TP - build
8051s = raw(IP()/UDP()/L2TP())
8052s == 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
8055p = IP(s)
8056L2TP 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
8064defaddr = conf.route.route('0.0.0.0')[1]
8065pkt = IP(raw(IP()/UDP(dport=1985, sport=1985)/HSRP()/HSRPmd5()))
8066assert pkt[IP].dst == "224.0.0.2" and pkt[UDP].sport == pkt[UDP].dport == 1985
8067assert pkt[HSRP].opcode == 0 and pkt[HSRP].state == 16
8068assert pkt[HSRPmd5].type == 4 and pkt[HSRPmd5].sourceip == defaddr
8069
8070
8071############
8072############
8073+ RIP tests
8074
8075= RIP - build
8076s = raw(IP()/UDP(sport=520)/RIP()/RIPEntry()/RIPAuth(authtype=2, password="scapy"))
8077s == 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
8080p = IP(s)
8081RIPEntry 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
8089s = raw(IP()/UDP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy"))
8090s == 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
8093p = IP(s)
8094Radius in p and len(p[Radius].attributes) == 1 and p[Radius].attributes[0].value == b"scapy"
8095
8096= RADIUS - Access-Request - Dissection (1)
8097s = 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'
8098radius_packet = Radius(s)
8099assert(radius_packet.id == 174)
8100assert(radius_packet.len == 279)
8101assert(radius_packet.authenticator == b'>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z')
8102assert(len(radius_packet.attributes) == 17)
8103assert(radius_packet.attributes[0].type == 1)
8104assert(type(radius_packet.attributes[0]) == RadiusAttribute)
8105assert(radius_packet.attributes[0].len == 6)
8106assert(radius_packet.attributes[0].value == b"leap")
8107assert(radius_packet.attributes[1].type == 6)
8108assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type)
8109assert(radius_packet.attributes[1].len == 6)
8110assert(radius_packet.attributes[1].value == 2)
8111assert(radius_packet.attributes[2].type == 26)
8112assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific)
8113assert(radius_packet.attributes[2].len == 27)
8114assert(radius_packet.attributes[2].vendor_id == 9)
8115assert(radius_packet.attributes[2].vendor_type == 1)
8116assert(radius_packet.attributes[2].vendor_len == 21)
8117assert(radius_packet.attributes[2].value == b"service-type=Framed")
8118assert(radius_packet.attributes[6].type == 79)
8119assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message)
8120assert(radius_packet.attributes[6].len == 11)
8121assert(radius_packet.attributes[6].value.haslayer(EAP))
8122assert(radius_packet.attributes[6].value[EAP].code == 2)
8123assert(radius_packet.attributes[6].value[EAP].id == 1)
8124assert(radius_packet.attributes[6].value[EAP].len == 9)
8125assert(radius_packet.attributes[6].value[EAP].type == 1)
8126assert(hasattr(radius_packet.attributes[6].value[EAP], "identity"))
8127assert(radius_packet.attributes[6].value[EAP].identity == b"leap")
8128assert(radius_packet.attributes[7].type == 80)
8129assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator)
8130assert(radius_packet.attributes[7].len == 18)
8131assert(radius_packet.attributes[7].value == b'U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6')
8132assert(radius_packet.attributes[11].type == 8)
8133assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address)
8134assert(radius_packet.attributes[11].len == 6)
8135assert(radius_packet.attributes[11].value == '192.168.10.185')
8136assert(radius_packet.attributes[16].type == 5)
8137assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port)
8138assert(radius_packet.attributes[16].len == 6)
8139assert(radius_packet.attributes[16].value == 50118)
8140
8141= RADIUS - compute_message_authenticator()
8142ram = radius_packet[RadiusAttr_Message_Authenticator]
8143assert 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)
8146s = 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'
8147radius_packet = Radius(s)
8148assert(radius_packet.id == 174)
8149assert(radius_packet.len == 91)
8150assert(radius_packet.authenticator == b'\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8')
8151assert(len(radius_packet.attributes) == 4)
8152assert(radius_packet.attributes[0].type == 18)
8153assert(type(radius_packet.attributes[0]) == RadiusAttribute)
8154assert(radius_packet.attributes[0].len == 13)
8155assert(radius_packet.attributes[0].value == b"Hello, leap")
8156assert(radius_packet.attributes[1].type == 79)
8157assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message)
8158assert(radius_packet.attributes[1].len == 22)
8159assert(radius_packet.attributes[1][EAP].code == 1)
8160assert(radius_packet.attributes[1][EAP].id == 2)
8161assert(radius_packet.attributes[1][EAP].len == 20)
8162assert(radius_packet.attributes[1][EAP].type == 17)
8163assert(radius_packet.attributes[2].type == 80)
8164assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator)
8165assert(radius_packet.attributes[2].len == 18)
8166assert(radius_packet.attributes[2].value == b'\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c')
8167assert(radius_packet.attributes[3].type == 24)
8168assert(type(radius_packet.attributes[3]) == RadiusAttr_State)
8169assert(radius_packet.attributes[3].len == 18)
8170assert(radius_packet.attributes[3].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO')
8171
8172= RADIUS - Access-Request - Dissection (3)
8173s = 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'
8174radius_packet = Radius(s)
8175assert(radius_packet.id == 175)
8176assert(radius_packet.len == 324)
8177assert(radius_packet.authenticator == b'C\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8')
8178assert(len(radius_packet.attributes) == 18)
8179assert(radius_packet.attributes[0].type == 1)
8180assert(type(radius_packet.attributes[0]) == RadiusAttribute)
8181assert(radius_packet.attributes[0].len == 6)
8182assert(radius_packet.attributes[0].value == b"leap")
8183assert(radius_packet.attributes[1].type == 6)
8184assert(type(radius_packet.attributes[1]) == RadiusAttr_Service_Type)
8185assert(radius_packet.attributes[1].len == 6)
8186assert(radius_packet.attributes[1].value == 2)
8187assert(radius_packet.attributes[2].type == 26)
8188assert(type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific)
8189assert(radius_packet.attributes[2].len == 27)
8190assert(radius_packet.attributes[2].vendor_id == 9)
8191assert(radius_packet.attributes[2].vendor_type == 1)
8192assert(radius_packet.attributes[2].vendor_len == 21)
8193assert(radius_packet.attributes[2].value == b"service-type=Framed")
8194assert(radius_packet.attributes[6].type == 79)
8195assert(type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message)
8196assert(radius_packet.attributes[6].len == 38)
8197assert(radius_packet.attributes[6].value.haslayer(EAP))
8198assert(radius_packet.attributes[6].value[EAP].code == 2)
8199assert(radius_packet.attributes[6].value[EAP].id == 2)
8200assert(radius_packet.attributes[6].value[EAP].len == 36)
8201assert(radius_packet.attributes[6].value[EAP].type == 17)
8202assert(radius_packet.attributes[7].type == 80)
8203assert(type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator)
8204assert(radius_packet.attributes[7].len == 18)
8205assert(radius_packet.attributes[7].value == b'|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n ')
8206assert(radius_packet.attributes[11].type == 8)
8207assert(type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address)
8208assert(radius_packet.attributes[11].len == 6)
8209assert(radius_packet.attributes[11].value == '192.168.10.185')
8210assert(radius_packet.attributes[16].type == 5)
8211assert(type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port)
8212assert(radius_packet.attributes[16].len == 6)
8213assert(radius_packet.attributes[16].value == 50118)
8214assert(radius_packet.attributes[17].type == 24)
8215assert(type(radius_packet.attributes[17]) == RadiusAttr_State)
8216assert(radius_packet.attributes[17].len == 18)
8217assert(radius_packet.attributes[17].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO')
8218
8219= RADIUS - Access-Challenge - Dissection (4)
8220s = 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'
8221radius_packet = Radius(s)
8222assert(radius_packet.id == 175)
8223assert(radius_packet.len == 75)
8224assert(radius_packet.authenticator == b'\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU')
8225assert(len(radius_packet.attributes) == 4)
8226assert(radius_packet.attributes[0].type == 18)
8227assert(type(radius_packet.attributes[0]) == RadiusAttribute)
8228assert(radius_packet.attributes[0].len == 13)
8229assert(radius_packet.attributes[0].value == b"Hello, leap")
8230assert(radius_packet.attributes[1].type == 79)
8231assert(type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message)
8232assert(radius_packet.attributes[1].len == 6)
8233assert(radius_packet.attributes[1][EAP].code == 3)
8234assert(radius_packet.attributes[1][EAP].id == 3)
8235assert(radius_packet.attributes[1][EAP].len == 4)
8236assert(radius_packet.attributes[2].type == 80)
8237assert(type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator)
8238assert(radius_packet.attributes[2].len == 18)
8239assert(radius_packet.attributes[2].value == b'l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff')
8240assert(radius_packet.attributes[3].type == 24)
8241assert(type(radius_packet.attributes[3]) == RadiusAttr_State)
8242assert(radius_packet.attributes[3].len == 18)
8243assert(radius_packet.attributes[3].value == b'iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO')
8244
8245= RADIUS - Response Authenticator computation
8246s = 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'
8247access_request = Radius(s)
8248s = 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'
8249access_challenge = Radius(s)
8250access_challenge.compute_authenticator(access_request.authenticator, b"radiuskey") == access_challenge.authenticator
8251
8252= RADIUS - Layers (1)
8253radius_attr = RadiusAttr_EAP_Message(value = EAP())
8254assert(RadiusAttr_EAP_Message in radius_attr)
8255assert(RadiusAttribute in radius_attr)
8256type(radius_attr[RadiusAttribute])
8257assert(type(radius_attr[RadiusAttribute]) == RadiusAttr_EAP_Message)
8258assert(EAP in radius_attr.value)
8259
8260
8261############
8262############
8263+ Addresses generators
8264
8265= Net
8266
8267n1 = Net("192.168.0.0/31")
8268[ip for ip in n1] == ["192.168.0.0", "192.168.0.1"]
8269
8270n2 = Net("192.168.0.*")
8271len([ip for ip in n2]) == 256
8272
8273n3 = Net("192.168.0.1-5")
8274len([ip for ip in n3]) == 5
8275
8276(n1 == n3) == False
8277
8278(n3 in n2) == True
8279
8280= Net using web address
8281
8282ip = IP(dst="www.google.com")
8283n1 = ip.dst
8284assert isinstance(n1, Net)
8285assert n1.ip_regex.match(str(n1))
8286ip.show()
8287
8288= OID
8289
8290oid = OID("1.2.3.4.5.6-8")
8291len([ o for o in oid ]) == 3
8292
8293= Net6
8294
8295n1 = Net6("2001:db8::/127")
8296len([ip for ip in n1]) == 2
8297
8298= Net6 using web address
8299~ netaccess ipv6
8300
8301ip = IPv6(dst="www.google.com")
8302n1 = ip.dst
8303assert isinstance(n1, Net6)
8304assert n1.ip_regex.match(str(n1))
8305ip.show()
8306
8307############
8308############
8309+ IPv6 helpers
8310
8311= in6_getLocalUniquePrefix()
8312
8313p = in6_getLocalUniquePrefix()
8314len(inet_pton(socket.AF_INET6, p)) == 16 and p.startswith("fd")
8315
8316= Misc addresses manipulation functions
8317
8318teredoAddrExtractInfo("2001:0:0a0b:0c0d:0028:f508:f508:08f5") == ("10.11.12.13", 40, "10.247.247.10", 2807)
8319
8320ip6 = IP6Field("test", None)
8321ip6.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]"
8322ip6.i2repr("", "2002:0102:0304::1") == "2002:0102:0304::1 [6to4 GW: 1.2.3.4]"
8323
8324in6_iseui64("fe80::bae8:58ff:fed4:e5f6") == True
8325
8326in6_isanycast("2001:db8::fdff:ffff:ffff:ff80") == True
8327
8328a = inet_pton(socket.AF_INET6, "2001:db8::2807")
8329in6_xor(a, a) == b"\x00" * 16
8330
8331a = inet_pton(socket.AF_INET6, "fe80::bae8:58ff:fed4:e5f6")
8332r = inet_ntop(socket.AF_INET6, in6_getnsma(a))
8333r == "ff02::1:ffd4:e5f6"
8334
8335in6_isllsnmaddr(r) == True
8336
8337in6_isdocaddr("2001:db8::2807") == True
8338
8339in6_isaddrllallnodes("ff02::1") == True
8340
8341in6_isaddrllallservers("ff02::2") == True
8342
8343= in6_getscope()
8344
8345assert in6_getscope("2001:db8::2807") == IPV6_ADDR_GLOBAL
8346assert in6_getscope("fec0::2807") == IPV6_ADDR_SITELOCAL
8347assert in6_getscope("fe80::2807") == IPV6_ADDR_LINKLOCAL
8348assert in6_getscope("ff02::2807") == IPV6_ADDR_LINKLOCAL
8349assert in6_getscope("ff0e::2807") == IPV6_ADDR_GLOBAL
8350assert in6_getscope("ff05::2807") == IPV6_ADDR_SITELOCAL
8351assert in6_getscope("ff01::2807") == IPV6_ADDR_LOOPBACK
8352assert in6_getscope("::1") == IPV6_ADDR_LOOPBACK
8353
8354= construct_source_candidate_set()
8355
8356dev_addresses = [('fe80::', IPV6_ADDR_LINKLOCAL, "linklocal"),('fec0::', IPV6_ADDR_SITELOCAL, "sitelocal"),('ff0e::', IPV6_ADDR_GLOBAL, "global")]
8357
8358assert construct_source_candidate_set("2001:db8::2807", 0, dev_addresses) == ["ff0e::"]
8359assert construct_source_candidate_set("fec0::2807", 0, dev_addresses) == ["fec0::"]
8360assert construct_source_candidate_set("fe80::2807", 0, dev_addresses) == ["fe80::"]
8361assert construct_source_candidate_set("ff02::2807", 0, dev_addresses) == ["fe80::"]
8362assert construct_source_candidate_set("ff0e::2807", 0, dev_addresses) == ["ff0e::"]
8363assert construct_source_candidate_set("ff05::2807", 0, dev_addresses) == ["fec0::"]
8364assert construct_source_candidate_set("ff01::2807", 0, dev_addresses) == ["::1"]
8365assert construct_source_candidate_set("::", 0, dev_addresses) == ["ff0e::"]
8366
8367= inet_pton()
8368
8369from scapy.pton_ntop import _inet6_pton, inet_pton
8370import socket
8371
8372ip6_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"]
8378for 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
8394ip6_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)]
8405for 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
8417r4 = Route()
8418tmp_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
8421tmp_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
8426r4 = Route()
8427len_r4 = len(r4.routes)
8428r4.add(net="192.168.1.0/24", gw="1.2.3.4")
8429len(r4.routes) == len_r4 + 1
8430r4.delt(net="192.168.1.0/24", gw="1.2.3.4")
8431len(r4.routes) == len_r4
8432
8433= ifchange()
8434
8435r4.add(net="192.168.1.0/24", gw="1.2.3.4", dev=get_dummy_interface())
8436r4.ifchange(get_dummy_interface(), "5.6.7.8")
8437r4.routes[-1][4] == "5.6.7.8"
8438
8439= ifdel()
8440
8441r4.ifdel(get_dummy_interface())
8442len(r4.routes) == len_r4
8443
8444= ifadd() & get_if_bcast()
8445
8446r4 = Route()
8447len_r4 = len(r4.routes)
8448
8449r4.ifadd(get_dummy_interface(), "1.2.3.4/24")
8450len(r4.routes) == len_r4 +1
8451
8452r4.get_if_bcast(get_dummy_interface()) == "1.2.3.255"
8453
8454r4.ifdel(get_dummy_interface())
8455len(r4.routes) == len_r4
8456
8457
8458############
8459############
8460+ Random objects
8461
8462= RandomEnumeration
8463
8464re = 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
8469random.seed(0x2807)
8470r6 = RandIP6()
8471assert(r6 == ("d279:1205:e445:5a9f:db28:efc9:afd7:f594" if six.PY2 else
8472              "240b:238f:b53f:b727:d0f9:bfc4:2007:e265"))
8473
8474random.seed(0x2807)
8475r6 = RandIP6("2001:db8::-")
8476assert(r6 == ("2001:0db8::e445" if six.PY2 else "2001:0db8::b53f"))
8477
8478r6 = RandIP6("2001:db8::*")
8479assert(r6 == ("2001:0db8::efc9" if six.PY2 else "2001:0db8::bfc4"))
8480
8481= RandMAC
8482
8483random.seed(0x2807)
8484rm = RandMAC()
8485assert(rm == ("d2:12:e4:5a:db:ef" if six.PY2 else "24:23:b5:b7:d0:bf"))
8486
8487rm = RandMAC("00:01:02:03:04:0-7")
8488assert(rm == ("00:01:02:03:04:05" if six.PY2 else "00:01:02:03:04:01"))
8489
8490
8491= RandOID
8492
8493random.seed(0x2807)
8494ro = RandOID()
8495assert(ro == "7.222.44.194.276.116.320.6.84.97.31.5.25.20.13.84.104.18")
8496
8497ro = RandOID("1.2.3.*")
8498assert(ro == "1.2.3.41")
8499
8500ro = RandOID("1.2.3.0-28")
8501assert(ro == ("1.2.3.11" if six.PY2 else "1.2.3.12"))
8502
8503= RandRegExp
8504
8505random.seed(0x2807)
8506re = RandRegExp("[g-v]* @? [0-9]{3} . (g|v)")
8507bytes(re) == ('vmuvr @ 906 \x9e g' if six.PY2 else b'irrtv @ 517 \xc2\xb8 v')
8508
8509= Corrupted(Bytes|Bits)
8510
8511random.seed(0x2807)
8512cb = CorruptedBytes("ABCDE", p=0.5)
8513assert(sane(raw(cb)) in [".BCD)", "&BCDW"])
8514
8515cb = CorruptedBits("ABCDE", p=0.2)
8516assert(sane(raw(cb)) in ["ECk@Y", "QB.P."])
8517
8518= RandEnumKeys
8519~ not_pypy random_weird_py3
8520random.seed(0x2807)
8521rek = RandEnumKeys({'a': 1, 'b': 2, 'c': 3}, seed=0x2807)
8522rek.enum.sort()
8523assert(rek == ('c' if six.PY2 else 'a'))
8524
8525= RandSingNum
8526~ not_pypy random_weird_py3
8527random.seed(0x2807)
8528rs = RandSingNum(-28, 7)
8529assert(rs == (3 if six.PY2 else 2))
8530assert(rs == (-27 if six.PY2 else -17))
8531
8532= Rand*
8533random.seed(0x2807)
8534rss = RandSingString()
8535assert(rss == ("CON:" if six.PY2 else "foo.exe:"))
8536
8537random.seed(0x2807)
8538rts = RandTermString(4, "scapy")
8539assert(sane(raw(rts)) in ["...[scapy", "......scapy"])
8540
8541
8542############
8543############
8544+ Flags
8545
8546= IP flags
8547~ IP
8548
8549pkt = IP(flags="MF")
8550assert pkt.flags.MF
8551assert not pkt.flags.DF
8552assert not pkt.flags.evil
8553assert repr(pkt.flags) == '<Flag 1 (MF)>'
8554pkt.flags.MF = 0
8555pkt.flags.DF = 1
8556assert not pkt.flags.MF
8557assert pkt.flags.DF
8558assert not pkt.flags.evil
8559assert repr(pkt.flags) == '<Flag 2 (DF)>'
8560pkt.flags |= 'evil+MF'
8561pkt.flags &= 'DF+MF'
8562assert pkt.flags.MF
8563assert pkt.flags.DF
8564assert not pkt.flags.evil
8565assert repr(pkt.flags) == '<Flag 3 (MF+DF)>'
8566
8567pkt = IP(flags=3)
8568assert pkt.flags.MF
8569assert pkt.flags.DF
8570assert not pkt.flags.evil
8571assert repr(pkt.flags) == '<Flag 3 (MF+DF)>'
8572pkt.flags = 6
8573assert not pkt.flags.MF
8574assert pkt.flags.DF
8575assert pkt.flags.evil
8576assert repr(pkt.flags) == '<Flag 6 (DF+evil)>'
8577
8578assert len({IP().flags, IP().flags}) == 1
8579
8580= TCP flags
8581~ TCP
8582
8583pkt = TCP(flags="SA")
8584assert pkt.flags == 18
8585assert pkt.flags.S
8586assert pkt.flags.A
8587assert pkt.flags.SA
8588assert not any(getattr(pkt.flags, f) for f in 'FRPUECN')
8589assert repr(pkt.flags) == '<Flag 18 (SA)>'
8590pkt.flags.U = True
8591pkt.flags.S = False
8592assert pkt.flags.A
8593assert pkt.flags.U
8594assert pkt.flags.AU
8595assert not any(getattr(pkt.flags, f) for f in 'FSRPECN')
8596assert repr(pkt.flags) == '<Flag 48 (AU)>'
8597pkt.flags &= 'SFA'
8598pkt.flags |= 'P'
8599assert pkt.flags.P
8600assert pkt.flags.A
8601assert pkt.flags.PA
8602assert not any(getattr(pkt.flags, f) for f in 'FSRUECN')
8603
8604pkt = TCP(flags=56)
8605assert all(getattr(pkt.flags, f) for f in 'PAU')
8606assert pkt.flags.PAU
8607assert not any(getattr(pkt.flags, f) for f in 'FSRECN')
8608assert repr(pkt.flags) == '<Flag 56 (PAU)>'
8609pkt.flags = 50
8610assert all(getattr(pkt.flags, f) for f in 'SAU')
8611assert pkt.flags.SAU
8612assert not any(getattr(pkt.flags, f) for f in 'FRPECN')
8613assert repr(pkt.flags) == '<Flag 50 (SAU)>'
8614
8615= Flag values mutation with .raw_packet_cache
8616~ IP TCP
8617
8618pkt = IP(raw(IP(flags="MF")/TCP(flags="SA")))
8619assert pkt.raw_packet_cache is not None
8620assert pkt[TCP].raw_packet_cache is not None
8621assert pkt.flags.MF
8622assert not pkt.flags.DF
8623assert not pkt.flags.evil
8624assert repr(pkt.flags) == '<Flag 1 (MF)>'
8625assert pkt[TCP].flags.S
8626assert pkt[TCP].flags.A
8627assert pkt[TCP].flags.SA
8628assert not any(getattr(pkt[TCP].flags, f) for f in 'FRPUECN')
8629assert repr(pkt[TCP].flags) == '<Flag 18 (SA)>'
8630pkt.flags.MF = 0
8631pkt.flags.DF = 1
8632pkt[TCP].flags.U = True
8633pkt[TCP].flags.S = False
8634pkt = IP(raw(pkt))
8635assert not pkt.flags.MF
8636assert pkt.flags.DF
8637assert not pkt.flags.evil
8638assert repr(pkt.flags) == '<Flag 2 (DF)>'
8639assert pkt[TCP].flags.A
8640assert pkt[TCP].flags.U
8641assert pkt[TCP].flags.AU
8642assert not any(getattr(pkt[TCP].flags, f) for f in 'FSRPECN')
8643assert repr(pkt[TCP].flags) == '<Flag 48 (AU)>'
8644
8645= Operations on flag values
8646~ TCP
8647
8648p1, p2 = TCP(flags="SU"), TCP(flags="AU")
8649assert (p1.flags & p2.flags).U
8650assert not any(getattr(p1.flags & p2.flags, f) for f in 'FSRPAECN')
8651assert all(getattr(p1.flags | p2.flags, f) for f in 'SAU')
8652assert (p1.flags | p2.flags).SAU
8653assert not any(getattr(p1.flags | p2.flags, f) for f in 'FRPECN')
8654
8655assert TCP(flags="SA").flags & TCP(flags="S").flags == TCP(flags="S").flags
8656assert 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
8661plist = PacketList(list(IP()/TCP(flags=(0, 2**9 - 1))))
8662assert [p[TCP].flags for p in plist] == [x for x in range(512)]
8663
8664plist = PacketList(list(IP()/TCP(flags=["S", "SA", "A"])))
8665assert [p[TCP].flags for p in plist] == [2, 18, 16]
8666
8667
8668############
8669############
8670+ SCTP
8671
8672= SCTP - Chunk Init - build
8673s = raw(IP()/SCTP()/SCTPChunkInit(params=[SCTPChunkParamIPv4Addr()]))
8674s == 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
8677p = IP(s)
8678SCTPChunkParamIPv4Addr in p and p[SCTP].chksum == 0x402c0b5f and p[SCTPChunkParamIPv4Addr].addr == "127.0.0.1"
8679
8680= SCTP - SCTPChunkSACK - build
8681s = raw(IP()/SCTP()/SCTPChunkSACK(gap_ack_list=["7:28"]))
8682s == 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
8685p = IP(s)
8686SCTPChunkSACK 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
8693blob = b"\x1A\x85\x26\x94\x00\x00\x00\x0D\x00\x00\x04\xD2"
8694p = SCTP(blob)
8695assert(p.dport == 9876)
8696assert(p.sport == 6789)
8697assert(p.tag == 13)
8698assert(p.chksum == 1234)
8699
8700= basic SCTPChunkData - Dissection
8701~ sctp
8702blob = 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"
8703p = SCTP(blob).lastlayer()
8704assert(isinstance(p, SCTPChunkData))
8705assert(p.reserved == 0)
8706assert(p.delay_sack == 0)
8707assert(p.unordered == 0)
8708assert(p.beginning == 0)
8709assert(p.ending == 0)
8710assert(p.tsn == 0)
8711assert(p.stream_id == 0)
8712assert(p.stream_seq == 0)
8713assert(p.len == (len("data") + 16))
8714assert(p.data == b"data")
8715
8716= basic SCTPChunkInit - Dissection
8717~ sctp
8718blob = 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"
8719p = SCTP(blob).lastlayer()
8720assert(isinstance(p, SCTPChunkInit))
8721assert(p.flags == 0)
8722assert(p.len == 20)
8723assert(p.init_tag == 0)
8724assert(p.a_rwnd == 0)
8725assert(p.n_out_streams == 0)
8726assert(p.n_in_streams == 0)
8727assert(p.init_tsn == 0)
8728assert(p.params == [])
8729
8730= SCTPChunkInit multiple valid parameters - Dissection
8731~ sctp
8732blob = 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"
8733p = SCTP(blob).lastlayer()
8734assert(isinstance(p, SCTPChunkInit))
8735assert(p.flags == 0)
8736assert(p.len == 92)
8737assert(p.init_tag == 101)
8738assert(p.a_rwnd == 102)
8739assert(p.n_out_streams == 103)
8740assert(p.n_in_streams == 104)
8741assert(p.init_tsn == 105)
8742assert(len(p.params) == 7)
8743params = {type(param): param for param in p.params}
8744assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamFwdTSN,
8745                              SCTPChunkParamSupportedExtensions, SCTPChunkParamChunkList,
8746                              SCTPChunkParamRandom, SCTPChunkParamRequestedHMACFunctions,
8747                              SCTPChunkParamSupportedAddrTypes})
8748assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable())
8749assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN())
8750assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7))
8751assert(params[SCTPChunkParamChunkList] == SCTPChunkParamChunkList(len=4))
8752assert(params[SCTPChunkParamRandom].len == 4+32)
8753assert(len(params[SCTPChunkParamRandom].random) == 32)
8754assert(params[SCTPChunkParamRequestedHMACFunctions] == SCTPChunkParamRequestedHMACFunctions(len=6))
8755assert(params[SCTPChunkParamSupportedAddrTypes] == SCTPChunkParamSupportedAddrTypes(len=6))
8756
8757= basic SCTPChunkInitAck - Dissection
8758~ sctp
8759blob = 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"
8760p = SCTP(blob).lastlayer()
8761assert(isinstance(p, SCTPChunkInitAck))
8762assert(p.flags == 0)
8763assert(p.len == 20)
8764assert(p.init_tag == 0)
8765assert(p.a_rwnd == 0)
8766assert(p.n_out_streams == 0)
8767assert(p.n_in_streams == 0)
8768assert(p.init_tsn == 0)
8769assert(p.params == [])
8770
8771= SCTPChunkInitAck with state cookie - Dissection
8772~ sctp
8773blob = 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"
8774p = SCTP(blob).lastlayer()
8775assert(isinstance(p, SCTPChunkInitAck))
8776assert(p.flags == 0)
8777assert(p.len == 76)
8778assert(p.init_tag == 101)
8779assert(p.a_rwnd == 102)
8780assert(p.n_out_streams == 103)
8781assert(p.n_in_streams == 104)
8782assert(p.init_tsn == 105)
8783assert(len(p.params) == 5)
8784params = {type(param): param for param in p.params}
8785assert(set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamHostname,
8786                              SCTPChunkParamFwdTSN, SCTPChunkParamSupportedExtensions,
8787                              SCTPChunkParamStateCookie})
8788assert(params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable())
8789assert(raw(params[SCTPChunkParamHostname]) == raw(SCTPChunkParamHostname(len=13, hostname="localhost")))
8790assert(params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN())
8791assert(params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7))
8792assert(params[SCTPChunkParamStateCookie].len == 4+16)
8793assert(len(params[SCTPChunkParamStateCookie].cookie) == 16)
8794
8795= basic SCTPChunkSACK - Dissection
8796~ sctp
8797blob = 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"
8798p = SCTP(blob).lastlayer()
8799assert(isinstance(p, SCTPChunkSACK))
8800assert(p.flags == 0)
8801assert(p.len == 16)
8802assert(p.cumul_tsn_ack == 0)
8803assert(p.a_rwnd == 0)
8804assert(p.n_gap_ack == 0)
8805assert(p.n_dup_tsn == 0)
8806assert(p.gap_ack_list == [])
8807assert(p.dup_tsn_list == [])
8808
8809= basic SCTPChunkHeartbeatReq - Dissection
8810~ sctp
8811blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04"
8812p = SCTP(blob).lastlayer()
8813assert(isinstance(p, SCTPChunkHeartbeatReq))
8814assert(p.flags == 0)
8815assert(p.len == 4)
8816assert(p.params == [])
8817
8818= basic SCTPChunkHeartbeatAck - Dissection
8819~ sctp
8820blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x04"
8821p = SCTP(blob).lastlayer()
8822assert(isinstance(p, SCTPChunkHeartbeatAck))
8823assert(p.flags == 0)
8824assert(p.len == 4)
8825assert(p.params == [])
8826
8827= basic SCTPChunkAbort - Dissection
8828~ sctp
8829blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x04"
8830p = SCTP(blob).lastlayer()
8831assert(isinstance(p, SCTPChunkAbort))
8832assert(p.reserved == 0)
8833assert(p.TCB == 0)
8834assert(p.len == 4)
8835assert(p.error_causes == b"")
8836
8837= basic SCTPChunkShutDown - Dissection
8838~ sctp
8839blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x08\x00\x00\x00\x00"
8840p = SCTP(blob).lastlayer()
8841assert(isinstance(p, SCTPChunkShutdown))
8842assert(p.flags == 0)
8843assert(p.len == 8)
8844assert(p.cumul_tsn_ack == 0)
8845
8846= basic SCTPChunkShutDownAck - Dissection
8847~ sctp
8848blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04"
8849p = SCTP(blob).lastlayer()
8850assert(isinstance(p, SCTPChunkShutdownAck))
8851assert(p.flags == 0)
8852assert(p.len == 4)
8853
8854= basic SCTPChunkError - Dissection
8855~ sctp
8856blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x04"
8857p = SCTP(blob).lastlayer()
8858assert(isinstance(p, SCTPChunkError))
8859assert(p.flags == 0)
8860assert(p.len == 4)
8861assert(p.error_causes == b"")
8862
8863= basic SCTPChunkCookieEcho - Dissection
8864~ sctp
8865blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x00\x04"
8866p = SCTP(blob).lastlayer()
8867assert(isinstance(p, SCTPChunkCookieEcho))
8868assert(p.flags == 0)
8869assert(p.len == 4)
8870assert(p.cookie == b"")
8871
8872= basic SCTPChunkCookieAck - Dissection
8873~ sctp
8874blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x04"
8875p = SCTP(blob).lastlayer()
8876assert(isinstance(p, SCTPChunkCookieAck))
8877assert(p.flags == 0)
8878assert(p.len == 4)
8879
8880= basic SCTPChunkShutdownComplete - Dissection
8881~ sctp
8882blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\x00\x00\x04"
8883p = SCTP(blob).lastlayer()
8884assert(isinstance(p, SCTPChunkShutdownComplete))
8885assert(p.reserved == 0)
8886assert(p.TCB == 0)
8887assert(p.len == 4)
8888
8889= basic SCTPChunkAuthentication - Dissection
8890~ sctp
8891blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x08\x00\x00\x00\x00"
8892p = SCTP(blob).lastlayer()
8893assert(isinstance(p, SCTPChunkAuthentication))
8894assert(p.flags == 0)
8895assert(p.len == 8)
8896assert(p.shared_key_id == 0)
8897assert(p.HMAC_function == 0)
8898
8899= basic SCTPChunkAddressConf - Dissection
8900~ sctp
8901blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x08\x00\x00\x00\x00"
8902p = SCTP(blob).lastlayer()
8903assert(isinstance(p, SCTPChunkAddressConf))
8904assert(p.flags == 0)
8905assert(p.len == 8)
8906assert(p.seq == 0)
8907assert(p.params == [])
8908
8909= basic SCTPChunkAddressConfAck - Dissection
8910~ sctp
8911blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00"
8912p = SCTP(blob).lastlayer()
8913assert(isinstance(p, SCTPChunkAddressConfAck))
8914assert(p.flags == 0)
8915assert(p.len == 8)
8916assert(p.seq == 0)
8917assert(p.params == [])
8918
8919= SCTPChunkParamRandom - Consecutive calls
8920~ sctp
8921param1, param2 = SCTPChunkParamRandom(), SCTPChunkParamRandom()
8922assert(param1.random != param2.random)
8923
8924############
8925############
8926+ DHCP
8927
8928= BOOTP - misc
8929BOOTP().answers(BOOTP()) == True
8930BOOTP().hashret() == b"\x00\x00\x00\x00"
8931
8932import random
8933random.seed(0x2807)
8934str(RandDHCPOptions()) == "[('WWW_server', '90.219.239.175')]"
8935
8936value = ("hostname", "scapy")
8937dof = DHCPOptionsField("options", value)
8938dof.i2repr("", value) == '[hostname scapy]'
8939dof.i2m("", value) == b'\x0cscapy'
8940
8941unknown_value_end = b"\xfe" + b"\xff"*257
8942udof = DHCPOptionsField("options", unknown_value_end)
8943udof.m2i("", unknown_value_end) == [(254, b'\xff'*255), 'end']
8944
8945unknown_value_pad = b"\xfe" + b"\xff"*256 + b"\x00"
8946udof = DHCPOptionsField("options", unknown_value_pad)
8947udof.m2i("", unknown_value_pad) == [(254, b'\xff'*255), 'pad']
8948
8949= DHCP - build
8950s = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("message-type","discover"),"end"]))
8951assert 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
8953s2 = 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"]))
8954assert 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
8957p = IP(s)
8958assert DHCP in p and p[DHCP].options[0] == ('message-type', 1)
8959
8960p2 = IP(s2)
8961assert DHCP in p2
8962assert p2[DHCP].options[0] == ("param_req_list",[12,57,45,254])
8963assert p2[DHCP].options[1] == ("requested_addr", "192.168.0.1")
8964
8965############
8966############
8967+ 802.11
8968
8969= 802.11 - misc
8970PrismHeader().answers(PrismHeader()) == True
8971
8972dpl = Dot11PacketList([Dot11()/LLC()/SNAP()/IP()/UDP()])
8973len(dpl) == 1
8974
8975dpl_ether = dpl.toEthernet()
8976len(dpl_ether) == 1 and Ether in dpl_ether[0]
8977
8978= Dot11 - build
8979s = raw(Dot11())
8980s == 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
8983p = Dot11(s)
8984Dot11 in p and p.addr3 == "00:00:00:00:00:00"
8985p.mysummary() == '802.11 Management 0 00:00:00:00:00:00 > 00:00:00:00:00:00'
8986
8987= Dot11QoS - build
8988s = raw(Dot11(type=2, subtype=8)/Dot11QoS(TID=4))
8989s == 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
8992pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID=0, info=b"".join(chb(i) for i in range(32)))
8993pkt.show()
8994pkt.summary()
8995assert 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]
8999pkt = Dot11(raw(pkt))
9000pkt.show()
9001pkt.summary()
9002assert 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
9008p = Dot11(s)
9009Dot11QoS in p
9010
9011= Dot11 - answers
9012query = Dot11(type=0, subtype=0)
9013Dot11(type=0, subtype=1).answers(query) == True
9014
9015= Dot11 - misc
9016assert Dot11Elt(info="scapy").summary() == "SSID='scapy'"
9017assert Dot11Elt(ID=1).mysummary() == ""
9018
9019= Multiple Dot11Elt layers
9020pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID="Rates") / Dot11Elt(ID="SSID", info="Scapy")
9021assert pkt[Dot11Elt::{"ID": 0}].info == b"Scapy"
9022assert pkt.getlayer(Dot11Elt, ID=0).info == b"Scapy"
9023
9024= Dot11WEP - build
9025~ crypto
9026conf.wepkey = ""
9027assert 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'
9028conf.wepkey = "test123"
9029assert 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
9033conf.wepkey = "test123"
9034a = 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')
9035assert a[Dot11QoS][Dot11WEP].icv == 942169697
9036
9037= Dot11 - answers
9038a = Dot11()/Dot11Auth(seqnum=1)
9039b = Dot11()/Dot11Auth(seqnum=2)
9040assert b.answers(a)
9041assert not a.answers(b)
9042
9043assert not (Dot11()/Dot11Ack()).answers(Dot11())
9044assert (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
9053assert isinstance(Dot3(raw(Ether())),Ether)
9054assert isinstance(Ether(raw(Dot3())),Dot3)
9055
9056a = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00')
9057assert isinstance(a,Dot3)
9058assert a.dst == 'ff:ff:ff:ff:ff:ff'
9059assert a.src == '00:00:00:00:00:00'
9060
9061a = Dot3(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x90\x00')
9062assert isinstance(a,Ether)
9063assert a.dst == 'ff:ff:ff:ff:ff:ff'
9064assert a.src == '00:00:00:00:00:00'
9065
9066
9067############
9068############
9069+ ASN.1
9070
9071= MIB
9072
9073import tempfile
9074fd, fname = tempfile.mkstemp()
9075os.write(fd, b"-- MIB test\nscapy       OBJECT IDENTIFIER ::= {test 2807}\n")
9076os.close(fd)
9077
9078load_mib(fname)
9079assert(len([k for k in conf.mib.iterkeys() if "scapy" in k]) == 1)
9080
9081assert(len([oid for oid in conf.mib]) > 100)
9082
9083assert(conf.mib._my_find("MIB", "keyUsage"))
9084
9085assert(len(conf.mib._find("MIB", "keyUsage")))
9086
9087assert(len(conf.mib._recurs_find_all((), "MIB", "keyUsage")))
9088
9089= MIB - graph
9090
9091@mock.patch("scapy.asn1.mib.do_graph")
9092def 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
9099get_mib_graph()
9100
9101= DADict tests
9102
9103a = DADict("test")
9104a.test_value = "scapy"
9105with ContextManagerCaptureOutput() as cmco:
9106    a._show()
9107    assert(cmco.get_output() == "test_value = 'scapy'\n")
9108
9109b = DADict("test2")
9110b.test_value_2 = "hello_world"
9111
9112a._branch(b, 1)
9113try:
9114    a._branch(b, 1)
9115    assert False
9116except DADict_Exception:
9117    pass
9118
9119assert(len(a._find("test2")))
9120
9121assert(len(a._find(test_value_2="hello_world")))
9122
9123assert(len(a._find_all("test2")))
9124
9125assert(not a._recurs_find((a,)))
9126
9127assert(not a._recurs_find_all((a,)))
9128
9129= BER tests
9130
9131BER_id_enc(42) == '*'
9132BER_id_enc(2807) == b'\xbfw'
9133
9134b = BERcodec_IPADDRESS()
9135r1 = b.enc("8.8.8.8")
9136r1 == b'@\x04\x08\x08\x08\x08'
9137
9138r2 = b.dec(r1)[0]
9139r2.val == '8.8.8.8'
9140
9141
9142############
9143############
9144+ inet.py
9145
9146= IPv4 - ICMPTimeStampField
9147test = ICMPTimeStampField("test", None)
9148value = test.any2i("", "07:28:28.07")
9149value == 26908070
9150test.i2repr("", value) == '7:28:28.70'
9151
9152= IPv4 - UDP null checksum
9153IP(raw(IP()/UDP()/Raw(b"\xff\xff\x01\x6a")))[UDP].chksum == 0xFFFF
9154
9155= IPv4 - (IP|UDP|TCP|ICMP)Error
9156query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS()
9157answer = 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
9159query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS()
9160answer = 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()
9161assert(answer.answers(query) == True)
9162
9163query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/TCP()
9164answer = 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
9166assert(answer.answers(query) == True)
9167
9168query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/ICMP()/"scapy"
9169answer = 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"
9170assert(answer.answers(query) == True)
9171
9172= IPv4 - mDNS
9173a = IP(dst="224.0.0.251")
9174assert a.hashret() == b"\x00"
9175
9176# TODO add real case here
9177
9178= IPv4 - utilities
9179l = overlap_frag(IP(dst="1.2.3.4")/ICMP()/("AB"*8), ICMP()/("CD"*8))
9180assert(len(l) == 6)
9181assert([len(raw(p[IP].payload)) for p in l] == [8, 8, 8, 8, 8, 8])
9182assert([(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
9185ip_ttl = [("192.168.0.%d" % i, i) for i in six.moves.range(1, 10)]
9186
9187tr_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
9191tr = TracerouteResult(tr_packets)
9192assert(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
9194def 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
9213test_show()
9214
9215def 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
9230test_summary()
9231
9232@mock.patch("scapy.layers.inet.plt")
9233def 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
9242test_timeskew_graph()
9243
9244tr = TracerouteResult(tr_packets)
9245saved_AS_resolver = conf.AS_resolver
9246conf.AS_resolver = None
9247tr.make_graph()
9248assert(len(tr.graphdef) == 491)
9249tr.graphdef.startswith("digraph trace {") == True
9250assert(('"192.168.0.9" ->' in tr.graphdef) == True)
9251conf.AS_resolver = conf.AS_resolver
9252
9253pl = PacketList(list([Ether()/x for x in itertools.chain(*tr_packets)]))
9254srl, ul = pl.sr()
9255assert(len(srl) == 9 and len(ul) == 0)
9256
9257conf_color_theme = conf.color_theme
9258conf.color_theme = BlackAndWhite()
9259assert(len(pl.sessions().keys()) == 10)
9260conf.color_theme = conf_color_theme
9261
9262new_pl = pl.replace(IP.src, "192.168.0.254", "192.168.0.42")
9263assert("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")
9268def 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
9277test_report_ports()
9278
9279def 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
9289test_IPID_count()
9290
9291
9292############
9293############
9294+ Fields
9295
9296= FieldLenField with BitField
9297class 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
9306pkt = Test(raw(Test(Values=[0, 0, 0, 0, 1, 1, 1, 1])))
9307assert(pkt.BitCount == 8)
9308assert(pkt.ByteCount == 1)
9309
9310############
9311############
9312+ MPLS tests
9313
9314= MPLS - build/dissection
9315from scapy.contrib.mpls import MPLS
9316p1 = MPLS()/IP()/UDP()
9317assert(p1[MPLS].s == 1)
9318p2 = MPLS()/MPLS()/IP()/UDP()
9319assert(p2[MPLS].s == 0)
9320
9321p1[MPLS]
9322p1[IP]
9323p2[MPLS]
9324p2[MPLS:1]
9325p2[IP]
9326
9327
9328+ Restore normal routes & Ifaces
9329
9330= Windows
9331
9332if WINDOWS:
9333    IFACES.reload()
9334    conf.route.resync()
9335    conf.route6.resync()
9336
9337True
9338
9339
9340############
9341############
9342+ PacketList methods
9343
9344= plot()
9345
9346import mock
9347@mock.patch("scapy.plist.plt")
9348def 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
9356test_plot()
9357
9358= diffplot()
9359
9360import mock
9361@mock.patch("scapy.plist.plt")
9362def 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
9370test_diffplot()
9371
9372= multiplot()
9373
9374import mock
9375@mock.patch("scapy.plist.plt")
9376def 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
9386test_multiplot()
9387
9388= rawhexdump()
9389
9390def 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
9398test_rawhexdump()
9399
9400= hexraw()
9401
9402def 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
9410test_hexraw()
9411
9412= hexdump()
9413
9414def 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
9422test_hexdump()
9423
9424= padding()
9425
9426def 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
9434test_padding()
9435
9436= nzpadding()
9437
9438def 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
9446test_nzpadding()
9447
9448= conversations()
9449
9450import mock
9451@mock.patch("scapy.plist.do_graph")
9452def 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
9462test_conversations()
9463
9464= afterglow()
9465
9466import mock
9467@mock.patch("scapy.plist.do_graph")
9468def 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
9478test_afterglow()
9479
9480= psdump()
9481
9482print("PYX: %d" % PYX)
9483if 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
9494print("PYX: %d" % PYX)
9495if 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
9510import os
9511version_filename = os.path.join(scapy._SCAPY_PKG_DIR, "VERSION")
9512
9513version = scapy._version()
9514assert(os.path.exists(version_filename))
9515
9516import mock
9517with 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
9533data = b'\x90o\x14~YY\xf5h\xcc#\xd7\xcfUH\x00\x03\x167116621 \x000\x00'
9534pkt = RTP(data)
9535assert "RTP" in pkt
9536parsed = pkt["RTP"]
9537assert parsed.version == 2
9538assert parsed.extension
9539assert parsed.numsync == 0
9540assert not parsed.marker
9541assert parsed.payload_type == 111
9542assert parsed.sequence == 5246
9543assert parsed.timestamp == 1499067752
9544assert parsed.sourcesync == 0xcc23d7cf
9545assert "RTPExtension" in parsed, parsed.show()
9546assert parsed["RTPExtension"].header_id == 0x5548
9547assert parsed["RTPExtension"].header == [0x16373131,0x36363231,0x20003000]
9548
9549= test layer creation
9550
9551created = RTP(extension=True, payload_type="PCMA", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
9552created /= RTPExtension(header_id=0x4321, header=[0x11223344])
9553assert raw(created) == b'\x90\x08\x124\x00\xbcaN\xab\xcd\xef\x01C!\x00\x01\x11"3D'
9554parsed = RTP(raw(created))
9555assert parsed.payload_type == 8
9556assert "RTPExtension" in parsed, parsed.show()
9557assert parsed["RTPExtension"].header == [0x11223344]
9558
9559= test RTP without extension
9560
9561created = RTP(extension=False, payload_type="DVI4", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01)
9562assert raw(created) == b'\x80\x11\x124\x00\xbcaN\xab\xcd\xef\x01'
9563parsed = RTP(raw(created))
9564assert parsed.sourcesync == 0xabcdef01
9565assert "RTPExtension" not in parsed
9566