ikev2.py revision 33420f2494d766bab5b154622c241d2057620c89
1770bb9f5f4acc0c59e3a200849c189d6616e2417Phil#!/usr/bin/env python
2770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
3770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# http://trac.secdev.org/scapy/ticket/353
4770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
5770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# scapy.contrib.description = IKEv2
6770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# scapy.contrib.status = loads
7770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
8770bb9f5f4acc0c59e3a200849c189d6616e2417Philimport logging
96057906368d55634d11e1d19a5cca1f127595b11Robin Jarryimport struct
10770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
11770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
12770bb9f5f4acc0c59e3a200849c189d6616e2417Phil## Modified from the original ISAKMP code by Yaron Sheffer <yaronf.ietf@gmail.com>, June 2010.
13770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
14770bb9f5f4acc0c59e3a200849c189d6616e2417Philfrom scapy.packet import *
15770bb9f5f4acc0c59e3a200849c189d6616e2417Philfrom scapy.fields import *
16770bb9f5f4acc0c59e3a200849c189d6616e2417Philfrom scapy.ansmachine import *
17770bb9f5f4acc0c59e3a200849c189d6616e2417Philfrom scapy.layers.inet import IP,UDP
186057906368d55634d11e1d19a5cca1f127595b11Robin Jarryfrom scapy.layers.isakmp import ISAKMP
19770bb9f5f4acc0c59e3a200849c189d6616e2417Philfrom scapy.sendrecv import sr
20770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
21770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# see http://www.iana.org/assignments/ikev2-parameters for details
22770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2AttributeTypes= { "Encryption":    (1, { "DES-IV64"  : 1,
23770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "DES" : 2,
24770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "3DES" : 3,
25770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "RC5" : 4,
26770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "IDEA" : 5,
27770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "CAST" : 6,
28770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Blowfish" : 7,
29770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "3IDEA" : 8,
30770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "DES-IV32" : 9,
31770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CBC" : 12,
32770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CTR" : 13,
33770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CCM-8" : 14,
34770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CCM-12" : 15,
35770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CCM-16" : 16,
36770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-GCM-8ICV" : 18,
37770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-GCM-12ICV" : 19,
38770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-GCM-16ICV" : 20,
39770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Camellia-CBC" : 23,
40770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Camellia-CTR" : 24,
41770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Camellia-CCM-8ICV" : 25,
42770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Camellia-CCM-12ICV" : 26,
43770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "Camellia-CCM-16ICV" : 27,
44770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                        }, 0),
45770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                         "PRF":            (2, {"PRF_HMAC_MD5":1,
46770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_HMAC_SHA1":2,
47770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_HMAC_TIGER":3,
48770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_AES128_XCBC":4,
49770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_HMAC_SHA2_256":5,
50770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_HMAC_SHA2_384":6,
51770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_HMAC_SHA2_512":7,
52770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "PRF_AES128_CMAC":8,
53770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                       }, 0),
54770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                         "Integrity":    (3, { "HMAC-MD5-96": 1,
55770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "HMAC-SHA1-96": 2,
56770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "DES-MAC": 3,
57770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "KPDK-MD5": 4,
58770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-XCBC-96": 5,
59770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "HMAC-MD5-128": 6,
60770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "HMAC-SHA1-160": 7,
61770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-CMAC-96": 8,
62770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-128-GMAC": 9,
63770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-192-GMAC": 10,
64770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "AES-256-GMAC": 11,
65770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "SHA2-256-128": 12,
66770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "SHA2-384-192": 13,
67770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "SHA2-512-256": 14,
68770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                        }, 0),
69770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                         "GroupDesc":     (4, { "768MODPgr"  : 1,
70770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "1024MODPgr" : 2,
71770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "1536MODPgr" : 5,
72770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "2048MODPgr" : 14,
73770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "3072MODPgr" : 15,
74770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "4096MODPgr" : 16,
75770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "6144MODPgr" : 17,
76770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "8192MODPgr" : 18,
77770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "256randECPgr" : 19,
78770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "384randECPgr" : 20,
79770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "521randECPgr" : 21,
80770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "1024MODP160POSgr"  : 22,
81770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "2048MODP224POSgr"  : 23,
82770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "2048MODP256POSgr"  : 24,
83770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "192randECPgr" : 25,
84770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                "224randECPgr" : 26,
85770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                        }, 0),
86770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                         "Extended Sequence Number":       (5, {"No ESN":     0,
87770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                                 "ESN":   1,  }, 0),
88770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                         }
89770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
9033420f2494d766bab5b154622c241d2057620c89Philippe ROSEIKEv2NotifyMessageTypes = {
9133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  1 : "UNSUPPORTED_CRITICAL_PAYLOAD",
9233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  4 : "INVALID_IKE_SPI",
9333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  5 : "INVALID_MAJOR_VERSION",
9433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  7 : "INVALID_SYNTAX",
9533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  9 : "INVALID_MESSAGE_ID",
9633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  11 : "INVALID_SPI",
9733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  14 : "NO_PROPOSAL_CHOSEN",
9833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  17 : "INVALID_KE_PAYLOAD",
9933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  24 : "AUTHENTICATION_FAILED",
10033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  34 : "SINGLE_PAIR_REQUIRED",
10133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  35 : "NO_ADDITIONAL_SAS",
10233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  36 : "INTERNAL_ADDRESS_FAILURE",
10333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  37 : "FAILED_CP_REQUIRED",
10433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  38 : "TS_UNACCEPTABLE",
10533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  39 : "INVALID_SELECTORS",
10633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  40 : "UNACCEPTABLE_ADDRESSES",
10733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  41 : "UNEXPECTED_NAT_DETECTED",
10833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  42 : "USE_ASSIGNED_HoA",
10933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  43 : "TEMPORARY_FAILURE",
11033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  44 : "CHILD_SA_NOT_FOUND",
11133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  45 : "INVALID_GROUP_ID",
11233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  46 : "AUTHORIZATION_FAILED",
11333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16384 : "INITIAL_CONTACT",
11433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16385 : "SET_WINDOW_SIZE",
11533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16386 : "ADDITIONAL_TS_POSSIBLE",
11633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16387 : "IPCOMP_SUPPORTED",
11733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16388 : "NAT_DETECTION_SOURCE_IP",
11833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16389 : "NAT_DETECTION_DESTINATION_IP",
11933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16390 : "COOKIE",
12033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16391 : "USE_TRANSPORT_MODE",
12133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16392 : "HTTP_CERT_LOOKUP_SUPPORTED",
12233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16393 : "REKEY_SA",
12333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16394 : "ESP_TFC_PADDING_NOT_SUPPORTED",
12433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16395 : "NON_FIRST_FRAGMENTS_ALSO",
12533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16396 : "MOBIKE_SUPPORTED",
12633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16397 : "ADDITIONAL_IP4_ADDRESS",
12733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16398 : "ADDITIONAL_IP6_ADDRESS",
12833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16399 : "NO_ADDITIONAL_ADDRESSES",
12933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16400 : "UPDATE_SA_ADDRESSES",
13033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16401 : "COOKIE2",
13133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16402 : "NO_NATS_ALLOWED",
13233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16403 : "AUTH_LIFETIME",
13333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16404 : "MULTIPLE_AUTH_SUPPORTED",
13433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16405 : "ANOTHER_AUTH_FOLLOWS",
13533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16406 : "REDIRECT_SUPPORTED",
13633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16407 : "REDIRECT",
13733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16408 : "REDIRECTED_FROM",
13833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16409 : "TICKET_LT_OPAQUE",
13933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16410 : "TICKET_REQUEST",
14033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16411 : "TICKET_ACK",
14133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16412 : "TICKET_NACK",
14233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16413 : "TICKET_OPAQUE",
14333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16414 : "LINK_ID",
14433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16415 : "USE_WESP_MODE",
14533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16416 : "ROHC_SUPPORTED",
14633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16417 : "EAP_ONLY_AUTHENTICATION",
14733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16418 : "CHILDLESS_IKEV2_SUPPORTED",
14833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16419 : "QUICK_CRASH_DETECTION",
14933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16420 : "IKEV2_MESSAGE_ID_SYNC_SUPPORTED",
15033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16421 : "IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED",
15133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16422 : "IKEV2_MESSAGE_ID_SYNC",
15233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16423 : "IPSEC_REPLAY_COUNTER_SYNC",
15333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16424 : "SECURE_PASSWORD_METHODS",
15433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16425 : "PSK_PERSIST",
15533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16426 : "PSK_CONFIRM",
15633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16427 : "ERX_SUPPORTED",
15733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16428 : "IFOM_CAPABILITY",
15833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16429 : "SENDER_REQUEST_ID",
15933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16430 : "IKEV2_FRAGMENTATION_SUPPORTED",
16033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16431 : "SIGNATURE_HASH_ALGORITHMS",
16133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16432 : "CLONE_IKE_SA_SUPPORTED",
16233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  16433 : "CLONE_IKE_SA"
16333420f2494d766bab5b154622c241d2057620c89Philippe ROSE}
16433420f2494d766bab5b154622c241d2057620c89Philippe ROSE
16533420f2494d766bab5b154622c241d2057620c89Philippe ROSEIKEv2CertificateEncodings = {
16633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  1 : "PKCS #7 wrapped X.509 certificate",
16733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  2 : "PGP Certificate",
16833420f2494d766bab5b154622c241d2057620c89Philippe ROSE  3 : "DNS Signed Key",
16933420f2494d766bab5b154622c241d2057620c89Philippe ROSE  4 : "X.509 Certificate - Signature",
17033420f2494d766bab5b154622c241d2057620c89Philippe ROSE  6 : "Kerberos Token",
17133420f2494d766bab5b154622c241d2057620c89Philippe ROSE  7 : "Certificate Revocation List (CRL)",
17233420f2494d766bab5b154622c241d2057620c89Philippe ROSE  8 : "Authority Revocation List (ARL)",
17333420f2494d766bab5b154622c241d2057620c89Philippe ROSE  9 : "SPKI Certificate",
17433420f2494d766bab5b154622c241d2057620c89Philippe ROSE  10 : "X.509 Certificate - Attribute",
17533420f2494d766bab5b154622c241d2057620c89Philippe ROSE  11 : "Raw RSA Key",
17633420f2494d766bab5b154622c241d2057620c89Philippe ROSE  12 : "Hash and URL of X.509 certificate",
17733420f2494d766bab5b154622c241d2057620c89Philippe ROSE  13 : "Hash and URL of X.509 bundle"
17833420f2494d766bab5b154622c241d2057620c89Philippe ROSE}
17933420f2494d766bab5b154622c241d2057620c89Philippe ROSE
180770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# the name 'IKEv2TransformTypes' is actually a misnomer (since the table
181770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# holds info for all IKEv2 Attribute types, not just transforms, but we'll
182770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# keep it for backwards compatibility... for now at least
183770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2TransformTypes = IKEv2AttributeTypes
184770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
185770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2TransformNum = {}
186770bb9f5f4acc0c59e3a200849c189d6616e2417Philfor n in IKEv2TransformTypes:
187770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    val = IKEv2TransformTypes[n]
188770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    tmp = {}
189770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    for e in val[1]:
190770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        tmp[val[1][e]] = e
19133420f2494d766bab5b154622c241d2057620c89Philippe ROSE    IKEv2TransformNum[val[0]] = tmp
192770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
193770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2Transforms = {}
194770bb9f5f4acc0c59e3a200849c189d6616e2417Philfor n in IKEv2TransformTypes:
195770bb9f5f4acc0c59e3a200849c189d6616e2417Phil	IKEv2Transforms[IKEv2TransformTypes[n][0]]=n
196770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
197770bb9f5f4acc0c59e3a200849c189d6616e2417Phildel(n)
198770bb9f5f4acc0c59e3a200849c189d6616e2417Phildel(e)
199770bb9f5f4acc0c59e3a200849c189d6616e2417Phildel(tmp)
200770bb9f5f4acc0c59e3a200849c189d6616e2417Phildel(val)
201770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
202770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# Note: Transform and Proposal can only be used inside the SA payload
203770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_payload_type = ["None", "", "Proposal", "Transform"]
204770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
205770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_payload_type.extend([""] * 29)
206770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_payload_type.extend(["SA","KE","IDi","IDr", "CERT","CERTREQ","AUTH","Nonce","Notify","Delete",
207770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                       "VendorID","TSi","TSr","Encrypted","CP","EAP"])
208770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
209770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_exchange_type = [""] * 34
210770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_exchange_type.extend(["IKE_SA_INIT","IKE_AUTH","CREATE_CHILD_SA",
211770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                        "INFORMATIONAL", "IKE_SESSION_RESUME"])
212770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
213770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
214770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_class(Packet):
215770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    def guess_payload_class(self, payload):
216770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        np = self.next_payload
217770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        logging.debug("For IKEv2_class np=%d" % np)
218770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        if np == 0:
2197b3e970663abd72697e17b70aba9943ae0dad404Phil            return conf.raw_layer
220770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        elif np < len(IKEv2_payload_type):
221770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            pt = IKEv2_payload_type[np]
222770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            logging.debug(globals().get("IKEv2_payload_%s" % pt, IKEv2_payload))
223770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            return globals().get("IKEv2_payload_%s" % pt, IKEv2_payload)
224770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        else:
225770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            return IKEv2_payload
226770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
227770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
228770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2(IKEv2_class): # rfc4306
229770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2"
230770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
231770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrFixedLenField("init_SPI","",8),
232770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrFixedLenField("resp_SPI","",8),
233770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",0,IKEv2_payload_type),
234770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        XByteField("version",0x20), # IKEv2, right?
235770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("exch_type",0,IKEv2_exchange_type),
236770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FlagsField("flags",0, 8, ["res0","res1","res2","Initiator","Version","Response","res6","res7"]),
237770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        IntField("id",0),
238770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        IntField("length",None)
239770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
240770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
241770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    def guess_payload_class(self, payload):
242770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        if self.flags & 1:
2437b3e970663abd72697e17b70aba9943ae0dad404Phil            return conf.raw_layer
244770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        return IKEv2_class.guess_payload_class(self, payload)
245770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
246770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    def answers(self, other):
247770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        if isinstance(other, IKEv2):
248770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            if other.init_SPI == self.init_SPI:
249770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                return 1
250770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        return 0
251770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    def post_build(self, p, pay):
252770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        p += pay
253770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        if self.length is None:
254770bb9f5f4acc0c59e3a200849c189d6616e2417Phil            p = p[:24]+struct.pack("!I",len(p))+p[28:]
255770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        return p
256770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
257770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
258770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_Key_Length_Attribute(IntField):
25933420f2494d766bab5b154622c241d2057620c89Philippe ROSE	# We only support the fixed-length Key Length attribute (the only one currently defined)
260770bb9f5f4acc0c59e3a200849c189d6616e2417Phil	def __init__(self, name):
26133420f2494d766bab5b154622c241d2057620c89Philippe ROSE		IntField.__init__(self, name, 0x800E0000)
262770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
263770bb9f5f4acc0c59e3a200849c189d6616e2417Phil	def i2h(self, pkt, x):
26433420f2494d766bab5b154622c241d2057620c89Philippe ROSE		return IntField.i2h(self, pkt, x & 0xFFFF)
265770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
266770bb9f5f4acc0c59e3a200849c189d6616e2417Phil	def h2i(self, pkt, x):
26733420f2494d766bab5b154622c241d2057620c89Philippe ROSE		return IntField.h2i(self, pkt, x if x !=None else 0 | 0x800E0000)
268770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
269770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Transform(IKEv2_class):
270770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKE Transform"
271770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
272770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,{0:"last", 3:"Transform"}),
273770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
274770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ShortField("length",8),
275770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("transform_type",None,IKEv2Transforms),
276770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res2",0),
27733420f2494d766bab5b154622c241d2057620c89Philippe ROSE        MultiEnumField("transform_id",None,IKEv2TransformNum,depends_on=lambda pkt:pkt.transform_type,fmt="H"),
278770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ConditionalField(IKEv2_Key_Length_Attribute("key_length"), lambda pkt: pkt.length > 8),
279770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    ]
280770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
281770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Proposal(IKEv2_class):
282770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Proposal"
283770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
284770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,{0:"last", 2:"Proposal"}),
285770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
286770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"trans","H", adjust=lambda pkt,x:x+8),
287770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("proposal",1),
288770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("proto",1,{1:"IKEv2"}),
289770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("SPIsize",None,"SPI","B"),
290770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("trans_nb",None),
291770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("SPI","",length_from=lambda x:x.SPIsize),
2927b3e970663abd72697e17b70aba9943ae0dad404Phil        PacketLenField("trans",conf.raw_layer(),IKEv2_payload_Transform,length_from=lambda x:x.length-8),
293770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
294770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
295770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
296770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload(IKEv2_class):
297770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Payload"
298770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
299770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
300770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FlagsField("flags",0, 8, ["critical","res1","res2","res3","res4","res5","res6","res7"]),
301770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4),
302770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("load","",length_from=lambda x:x.length-4),
303770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
304770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
305770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
306770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_VendorID(IKEv2_class):
307770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Vendor ID"
308770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":43 }}
309770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
310770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
311770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
312770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"vendorID","H", adjust=lambda pkt,x:x+4),
313770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("vendorID","",length_from=lambda x:x.length-4),
314770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
315770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
316770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Delete(IKEv2_class):
317770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Vendor ID"
318770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":42 }}
319770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
320770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
321770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
322770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"vendorID","H", adjust=lambda pkt,x:x+4),
323770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("vendorID","",length_from=lambda x:x.length-4),
324770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
325770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
326770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_SA(IKEv2_class):
327770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 SA"
328770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":33 }}
329770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
330770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
331770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
332770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"prop","H", adjust=lambda pkt,x:x+4),
3337b3e970663abd72697e17b70aba9943ae0dad404Phil        PacketLenField("prop",conf.raw_layer(),IKEv2_payload_Proposal,length_from=lambda x:x.length-4),
334770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
335770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
336770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Nonce(IKEv2_class):
337770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Nonce"
338770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":40 }}
339770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
340770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
341770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
342770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+4),
343770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("load","",length_from=lambda x:x.length-4),
344770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
345770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
346770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Notify(IKEv2_class):
347770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Notify"
348770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":41 }}
349770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
350770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
351770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
35233420f2494d766bab5b154622c241d2057620c89Philippe ROSE        FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+8),
35333420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("proto",None,{0:"Reserved",1:"IKE",2:"AH", 3:"ESP"}),
35433420f2494d766bab5b154622c241d2057620c89Philippe ROSE        FieldLenField("SPIsize",None,"SPI","B"),
35533420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ShortEnumField("type",0,IKEv2NotifyMessageTypes),
35633420f2494d766bab5b154622c241d2057620c89Philippe ROSE        StrLenField("SPI","",length_from=lambda x:x.SPIsize),
35733420f2494d766bab5b154622c241d2057620c89Philippe ROSE        StrLenField("load","",length_from=lambda x:x.length-8),
358770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
359770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
360770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_KE(IKEv2_class):
361770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Key Exchange"
362770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":34 }}
363770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
364770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
365770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
36633420f2494d766bab5b154622c241d2057620c89Philippe ROSE        FieldLenField("length",None,"load","H", adjust=lambda pkt,x:x+8),
367770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ShortEnumField("group", 0, IKEv2TransformTypes['GroupDesc'][1]),
36833420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ShortField("res2", 0),
36933420f2494d766bab5b154622c241d2057620c89Philippe ROSE        StrLenField("load","",length_from=lambda x:x.length-8),
370770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
371770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
372770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_IDi(IKEv2_class):
373770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Identification - Initiator"
374770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":35 }}
375770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
376770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
377770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
378770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+8),
37933420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("IDtype",1,{1:"IPv4_addr", 2:"FQDN", 3:"Email_addr", 5:"IPv6_addr", 11:"Key"}),
380770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("ProtoID",0,{0:"Unused"}),
381770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ShortEnumField("Port",0,{0:"Unused"}),
382770bb9f5f4acc0c59e3a200849c189d6616e2417Phil#        IPField("IdentData","127.0.0.1"),
383770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("load","",length_from=lambda x:x.length-8),
384770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
385770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
386770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_IDr(IKEv2_class):
387770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Identification - Responder"
388770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":36 }}
389770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
390770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
391770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
392770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+8),
39333420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("IDtype",1,{1:"IPv4_addr", 2:"FQDN", 3:"Email_addr", 5:"IPv6_addr", 11:"Key"}),
394770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("ProtoID",0,{0:"Unused"}),
395770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ShortEnumField("Port",0,{0:"Unused"}),
396770bb9f5f4acc0c59e3a200849c189d6616e2417Phil#        IPField("IdentData","127.0.0.1"),
397770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("load","",length_from=lambda x:x.length-8),
398770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
399770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
400770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
401770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
402770bb9f5f4acc0c59e3a200849c189d6616e2417Philclass IKEv2_payload_Encrypted(IKEv2_class):
403770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    name = "IKEv2 Encrypted and Authenticated"
404770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    overload_fields = { IKEv2: { "next_payload":46 }}
405770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    fields_desc = [
406770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteEnumField("next_payload",None,IKEv2_payload_type),
407770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ByteField("res",0),
408770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        FieldLenField("length",None,"load","H",adjust=lambda pkt,x:x+4),
409770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        StrLenField("load","",length_from=lambda x:x.length-4),
410770bb9f5f4acc0c59e3a200849c189d6616e2417Phil        ]
411770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
41233420f2494d766bab5b154622c241d2057620c89Philippe ROSEclass IKEv2_payload_CERTREQ(IKEv2_class):
41333420f2494d766bab5b154622c241d2057620c89Philippe ROSE    name = "IKEv2 Certificate Request"
41433420f2494d766bab5b154622c241d2057620c89Philippe ROSE    fields_desc = [
41533420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("next_payload",None,IKEv2_payload_type),
41633420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteField("res",0),
41733420f2494d766bab5b154622c241d2057620c89Philippe ROSE        FieldLenField("length",None,"cert_data","H",adjust=lambda pkt,x:x+5),
41833420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("cert_type",0,IKEv2CertificateEncodings),
41933420f2494d766bab5b154622c241d2057620c89Philippe ROSE        StrLenField("cert_data","",length_from=lambda x:x.length-5),
42033420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ]
421770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
42233420f2494d766bab5b154622c241d2057620c89Philippe ROSEclass IKEv2_payload_CERT(IKEv2_class):
42333420f2494d766bab5b154622c241d2057620c89Philippe ROSE    name = "IKEv2 Certificate"
42433420f2494d766bab5b154622c241d2057620c89Philippe ROSE    fields_desc = [
42533420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("next_payload",None,IKEv2_payload_type),
42633420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteField("res",0),
42733420f2494d766bab5b154622c241d2057620c89Philippe ROSE        FieldLenField("length",None,"cert_data","H",adjust=lambda pkt,x:x+5),
42833420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ByteEnumField("cert_type",0,IKEv2CertificateEncodings),
42933420f2494d766bab5b154622c241d2057620c89Philippe ROSE        StrLenField("cert_data","",length_from=lambda x:x.length-5),
43033420f2494d766bab5b154622c241d2057620c89Philippe ROSE        ]
431770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
432770bb9f5f4acc0c59e3a200849c189d6616e2417PhilIKEv2_payload_type_overload = {}
4334cca8708a5fdc52e592aa2661ab7c4b06fd539b3Pierre LALETfor i, payloadname in enumerate(IKEv2_payload_type):
4344cca8708a5fdc52e592aa2661ab7c4b06fd539b3Pierre LALET    name = "IKEv2_payload_%s" % payloadname
435770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    if name in globals():
4364cca8708a5fdc52e592aa2661ab7c4b06fd539b3Pierre LALET        IKEv2_payload_type_overload[globals()[name]] = {"next_payload": i}
437770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
4384cca8708a5fdc52e592aa2661ab7c4b06fd539b3Pierre LALETdel i, payloadname, name
439b86ad4e841bdabc2c4e79f090cb6cf129040ca2bPierre LALETIKEv2_class._overload_fields = IKEv2_payload_type_overload.copy()
440770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
441770bb9f5f4acc0c59e3a200849c189d6616e2417Philsplit_layers(UDP, ISAKMP, sport=500)
442770bb9f5f4acc0c59e3a200849c189d6616e2417Philsplit_layers(UDP, ISAKMP, dport=500)
443770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
444770bb9f5f4acc0c59e3a200849c189d6616e2417Philbind_layers( UDP,           IKEv2,        dport=500, sport=500) # TODO: distinguish IKEv1/IKEv2
445770bb9f5f4acc0c59e3a200849c189d6616e2417Philbind_layers( UDP,           IKEv2,        dport=4500, sport=4500)
446770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
447770bb9f5f4acc0c59e3a200849c189d6616e2417Phildef ikev2scan(ip):
448770bb9f5f4acc0c59e3a200849c189d6616e2417Phil    return sr(IP(dst=ip)/UDP()/IKEv2(init_SPI=RandString(8),
449770bb9f5f4acc0c59e3a200849c189d6616e2417Phil                                      exch_type=34)/IKEv2_payload_SA(prop=IKEv2_payload_Proposal()))
450770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
451770bb9f5f4acc0c59e3a200849c189d6616e2417Phil# conf.debug_dissector = 1
452770bb9f5f4acc0c59e3a200849c189d6616e2417Phil
4535e2a4c735bd6211f5473df2b51e0558d318eeec6Philif __name__ == "__main__":
4546057906368d55634d11e1d19a5cca1f127595b11Robin Jarry    from scapy.main import interact
4555e2a4c735bd6211f5473df2b51e0558d318eeec6Phil    interact(mydict=globals(), mybanner="IKEv2 alpha-level protocol implementation")
456