@@ -396,10 +396,29 @@ assert pkt.options[0][1] == (b'\xe3\xa0,\xdc\xe4\xae\x87\x18\xad{\xab\xd0b\x12\x
396396assert TCP(bytes(pkt)).options[0][0] == "MD5"
397397
398398= IP, TCP & UDP checksums (these tests highly depend on default values)
399+
400+ def transferPacket(pkt):
401+ packet = hexdump(pkt, dump=True).split('\n')
402+ packet = list(map(lambda x: x.split(" ")[1], packet))
403+ return " ".join(packet).strip().split(" ")
404+
399405pkt = IP() / TCP()
400406bpkt = IP(raw(pkt))
401407assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
402408
409+ Ah_dicts = {'nh': 6, 'payloadlen': 2, 'reserved': 0, 'spi': 1, 'seq': 0, 'icv': b'\x00\x00\x00\x00'}
410+ pkt = IP(proto=51) / AH(**Ah_dicts) / TCP()
411+ bpkt = IP(raw(pkt))
412+ assert bpkt.chksum == 0x7c90
413+ packetStr = transferPacket(pkt)
414+ tcpCheckSum = int("".join(packetStr[-4:-2]), 16)
415+ assert tcpCheckSum == 0x917c
416+
417+ pkt = IPv6(nh=51) / AH(**Ah_dicts) / TCP()
418+ packetStr = transferPacket(pkt)
419+ tcpCheckSum = int("".join(packetStr[-4:-2]), 16)
420+ assert tcpCheckSum == 0x8f7d
421+
403422pkt = IP(len=40) / TCP()
404423bpkt = IP(raw(pkt))
405424assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c
@@ -412,6 +431,18 @@ pkt = IP() / TCP() / ("A" * 10)
412431bpkt = IP(raw(pkt))
413432assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
414433
434+ pkt = IP(proto=51) / AH(**Ah_dicts) / TCP() / ("A" * 10)
435+ bpkt = IP(raw(pkt))
436+ assert bpkt.chksum == 0x7c86
437+ packetStr = transferPacket(pkt)
438+ tcpCheckSum = int("".join(packetStr[-14:-12]), 16)
439+ assert tcpCheckSum == 0x4b2c
440+
441+ pkt = IPv6(nh=51) / AH(**Ah_dicts) / TCP() / ("A" * 10)
442+ packetStr = transferPacket(pkt)
443+ tcpCheckSum = int("".join(packetStr[-14:-12]), 16)
444+ assert tcpCheckSum == 0x492d
445+
415446pkt = IP(len=50) / TCP() / ("A" * 10)
416447bpkt = IP(raw(pkt))
417448assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c
@@ -424,6 +455,13 @@ pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10)
424455bpkt = IP(raw(pkt))
425456assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
426457
458+ pkt = IP(proto=51, options=[IPOption_RR()]) / AH(**Ah_dicts) / TCP() / ("A" * 10)
459+ bpkt = IP(raw(pkt))
460+ assert bpkt.chksum == 0x707f
461+ packetStr = transferPacket(pkt)
462+ tcpCheckSum = int("".join(packetStr[-14:-12]), 16)
463+ assert tcpCheckSum == 0x4b2c
464+
427465pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10)
428466bpkt = IP(raw(pkt))
429467assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c
@@ -436,10 +474,30 @@ pkt = IP(options=[IPOption_Timestamp()]) / TCP() / ("A" * 10)
436474bpkt = IP(raw(pkt))
437475assert bpkt.chksum == 0x2caa and bpkt.payload.chksum == 0x4b2c
438476
477+ pkt = IP(proto=51, options=[IPOption_Timestamp()]) / AH(**Ah_dicts) / TCP() / ("A" * 10)
478+ bpkt = IP(raw(pkt))
479+ assert bpkt.chksum == 0x2c6d
480+ packetStr = transferPacket(pkt)
481+ tcpCheckSum = int("".join(packetStr[-14:-12]), 16)
482+ assert tcpCheckSum == 0x4b2c
483+
439484pkt = IP() / UDP()
440485bpkt = IP(raw(pkt))
441486assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
442487
488+ Ah_dicts = {'nh': 17, 'payloadlen': 2, 'reserved': 0, 'spi': 1, 'seq': 0, 'icv': b'\x00\x00\x00\x00'}
489+ pkt = IP(proto=51) / AH(**Ah_dicts) / UDP()
490+ bpkt = IP(raw(pkt))
491+ assert bpkt.chksum == 0x7c9c
492+ packetStr = transferPacket(pkt)
493+ udpCheckSum = int("".join(packetStr[-2:]), 16)
494+ assert udpCheckSum == 0x0172
495+
496+ pkt = IPv6(nh=51) / AH(**Ah_dicts) / UDP()
497+ packetStr = transferPacket(pkt)
498+ udpCheckSum = int("".join(packetStr[-2:]), 16)
499+ assert udpCheckSum == 0xff72
500+
443501pkt = IP(len=28) / UDP()
444502bpkt = IP(raw(pkt))
445503assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172
@@ -455,6 +513,18 @@ pkt = IP() / UDP() / ("A" * 10)
455513bpkt = IP(raw(pkt))
456514assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
457515
516+ pkt = IP(proto=51) / AH(**Ah_dicts) / UDP() / ("A" * 10)
517+ bpkt = IP(raw(pkt))
518+ assert bpkt.chksum == 0x7c92
519+ packetStr = transferPacket(pkt)
520+ udpCheckSum = int("".join(packetStr[-12:-10]), 16)
521+ assert udpCheckSum == 0xbb17
522+
523+ pkt = IPv6(nh=51) / AH(**Ah_dicts) / UDP() / ("A" * 10)
524+ packetStr = transferPacket(pkt)
525+ udpCheckSum = int("".join(packetStr[-12:-10]), 16)
526+ assert udpCheckSum == 0xb918
527+
458528pkt = IP(len=38) / UDP() / ("A" * 10)
459529bpkt = IP(raw(pkt))
460530assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17
@@ -467,6 +537,13 @@ pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10)
467537bpkt = IP(raw(pkt))
468538assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
469539
540+ pkt = IP(proto=51, options=[IPOption_RR()]) / AH(**Ah_dicts) / UDP() / ("A" * 10)
541+ bpkt = IP(raw(pkt))
542+ assert bpkt.chksum == 0x708b
543+ packetStr = transferPacket(pkt)
544+ udpCheckSum = int("".join(packetStr[-12:-10]), 16)
545+ assert udpCheckSum == 0xbb17
546+
470547pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10)
471548bpkt = IP(raw(pkt))
472549assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17
0 commit comments