| 519 | |
| 520 | |
| 521 | class IKEv2(_IKEv2_Packet): # rfc4306 |
| 522 | name = "IKEv2" |
| 523 | fields_desc = [ |
| 524 | XStrFixedLenField("init_SPI", "", 8), |
| 525 | XStrFixedLenField("resp_SPI", "", 8), |
| 526 | ByteEnumField("next_payload", 0, IKEv2PayloadTypes), |
| 527 | XByteField("version", 0x20), |
| 528 | ByteEnumField("exch_type", 0, IKEv2ExchangeTypes), |
| 529 | FlagsField("flags", 0, 8, ["res0", "res1", "res2", "Initiator", "Version", "Response", "res6", "res7"]), # noqa: E501 |
| 530 | IntField("id", 0), |
| 531 | IntField("length", None) # Length of total message: packets + all payloads # noqa: E501 |
| 532 | ] |
| 533 | |
| 534 | @classmethod |
| 535 | def dispatch_hook(cls, _pkt=None, *args, **kargs): |
| 536 | if _pkt and len(_pkt) >= 18: |
| 537 | version = struct.unpack("!B", _pkt[17:18])[0] |
| 538 | if version < 0x20: |
| 539 | return ISAKMP |
| 540 | return cls |
| 541 | |
| 542 | def answers(self, other): |
| 543 | if isinstance(other, IKEv2): |
| 544 | if other.init_SPI == self.init_SPI: |
| 545 | return 1 |
| 546 | return 0 |
| 547 | |
| 548 | def post_build(self, p, pay): |
| 549 | p += pay |
| 550 | if self.length is None: |
| 551 | p = p[:24] + struct.pack("!I", len(p)) + p[28:] |
| 552 | return p |
| 553 | |
| 554 | |
| 555 | class IKEv2_Key_Length_Attribute(IntField): |
no test coverage detected
searching dependent graphs…