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