mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-24 02:23:27 +08:00
preliminary patch to support decoding IKEv2 packets.
Only payloads commonly seen in PARENT_SAs are presently decoded. Encrypted payload support will come later, aka print-esp.c
This commit is contained in:
parent
8a53b88233
commit
650e708afb
149
isakmp.h
149
isakmp.h
@ -26,7 +26,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
/* YIPS @(#)$Id: isakmp.h,v 1.10 2002-12-11 07:13:54 guy Exp $ */
|
||||
/* YIPS @(#)$Id: isakmp.h,v 1.11 2007-08-29 02:38:14 mcr Exp $ */
|
||||
|
||||
/* refer to RFC 2408 */
|
||||
|
||||
@ -81,7 +81,7 @@ typedef struct { /* i_cookie + r_cookie */
|
||||
#define ISAKMP_TIMER_DEFAULT 10 /* seconds */
|
||||
#define ISAKMP_TRY_DEFAULT 3 /* times */
|
||||
|
||||
/* 3.1 ISAKMP Header Format
|
||||
/* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
! Initiator !
|
||||
@ -128,8 +128,11 @@ struct isakmp {
|
||||
#define ISAKMP_NPTYPE_D 12 /* Delete */
|
||||
#define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
|
||||
|
||||
#define ISAKMP_MAJOR_VERSION 1
|
||||
#define ISAKMP_MINOR_VERSION 0
|
||||
#define IKEv1_MAJOR_VERSION 1
|
||||
#define IKEv1_MINOR_VERSION 0
|
||||
|
||||
#define IKEv2_MAJOR_VERSION 2
|
||||
#define IKEv2_MINOR_VERSION 0
|
||||
|
||||
/* Exchange Type */
|
||||
#define ISAKMP_ETYPE_NONE 0 /* NONE */
|
||||
@ -142,6 +145,13 @@ struct isakmp {
|
||||
/* Flags */
|
||||
#define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
|
||||
#define ISAKMP_FLAG_C 0x02 /* Commit Bit */
|
||||
#define ISAKMP_FLAG_extra 0x04
|
||||
|
||||
/* IKEv2 */
|
||||
#define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
|
||||
#define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
|
||||
#define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
|
||||
|
||||
|
||||
/* 3.2 Payload Generic Header
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
@ -151,7 +161,7 @@ struct isakmp {
|
||||
*/
|
||||
struct isakmp_gen {
|
||||
u_int8_t np; /* Next Payload */
|
||||
u_int8_t reserved; /* RESERVED, unused, must set to 0 */
|
||||
u_int8_t critical; /* bit 7 - critical, rest is RESERVED */
|
||||
u_int16_t len; /* Payload Length */
|
||||
};
|
||||
|
||||
@ -188,7 +198,7 @@ struct isakmp_data {
|
||||
message of a Base Exchange (see Section 4.4) and the value "0" in the
|
||||
first message of an Identity Protect Exchange (see Section 4.5).
|
||||
*/
|
||||
struct isakmp_pl_sa {
|
||||
struct ikev1_pl_sa {
|
||||
struct isakmp_gen h;
|
||||
u_int32_t doi; /* Domain of Interpretation */
|
||||
u_int32_t sit; /* Situation */
|
||||
@ -202,7 +212,7 @@ struct isakmp_pl_sa {
|
||||
last within the security association proposal, then this field will
|
||||
be 0.
|
||||
*/
|
||||
struct isakmp_pl_p {
|
||||
struct ikev1_pl_p {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t p_no; /* Proposal # */
|
||||
u_int8_t prot_id; /* Protocol */
|
||||
@ -218,7 +228,7 @@ struct isakmp_pl_p {
|
||||
then this field will be 3. If the current Transform payload is the
|
||||
last within the proposal, then this field will be 0.
|
||||
*/
|
||||
struct isakmp_pl_t {
|
||||
struct ikev1_pl_t {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t t_no; /* Transform # */
|
||||
u_int8_t t_id; /* Transform-Id */
|
||||
@ -227,14 +237,14 @@ struct isakmp_pl_t {
|
||||
};
|
||||
|
||||
/* 3.7 Key Exchange Payload */
|
||||
struct isakmp_pl_ke {
|
||||
struct ikev1_pl_ke {
|
||||
struct isakmp_gen h;
|
||||
/* Key Exchange Data */
|
||||
};
|
||||
|
||||
/* 3.8 Identification Payload */
|
||||
/* MUST NOT to be used, because of being defined in ipsec-doi. */
|
||||
struct isakmp_pl_id {
|
||||
struct ikev1_pl_id {
|
||||
struct isakmp_gen h;
|
||||
union {
|
||||
u_int8_t id_type; /* ID Type */
|
||||
@ -244,7 +254,7 @@ struct isakmp_pl_id {
|
||||
};
|
||||
|
||||
/* 3.9 Certificate Payload */
|
||||
struct isakmp_pl_cert {
|
||||
struct ikev1_pl_cert {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t encode; /* Cert Encoding */
|
||||
char cert; /* Certificate Data */
|
||||
@ -268,7 +278,7 @@ struct isakmp_pl_cert {
|
||||
#define ISAKMP_CERT_SPKI 9
|
||||
|
||||
/* 3.10 Certificate Request Payload */
|
||||
struct isakmp_pl_cr {
|
||||
struct ikev1_pl_cr {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t num_cert; /* # Cert. Types */
|
||||
/*
|
||||
@ -283,27 +293,27 @@ struct isakmp_pl_cr {
|
||||
|
||||
/* 3.11 Hash Payload */
|
||||
/* may not be used, because of having only data. */
|
||||
struct isakmp_pl_hash {
|
||||
struct ikev1_pl_hash {
|
||||
struct isakmp_gen h;
|
||||
/* Hash Data */
|
||||
};
|
||||
|
||||
/* 3.12 Signature Payload */
|
||||
/* may not be used, because of having only data. */
|
||||
struct isakmp_pl_sig {
|
||||
struct ikev1_pl_sig {
|
||||
struct isakmp_gen h;
|
||||
/* Signature Data */
|
||||
};
|
||||
|
||||
/* 3.13 Nonce Payload */
|
||||
/* may not be used, because of having only data. */
|
||||
struct isakmp_pl_nonce {
|
||||
struct ikev1_pl_nonce {
|
||||
struct isakmp_gen h;
|
||||
/* Nonce Data */
|
||||
};
|
||||
|
||||
/* 3.14 Notification Payload */
|
||||
struct isakmp_pl_n {
|
||||
struct ikev1_pl_n {
|
||||
struct isakmp_gen h;
|
||||
u_int32_t doi; /* Domain of Interpretation */
|
||||
u_int8_t prot_id; /* Protocol-ID */
|
||||
@ -347,7 +357,7 @@ struct isakmp_pl_n {
|
||||
#define ISAKMP_LOG_RETRY_LIMIT_REACHED 65530
|
||||
|
||||
/* 3.15 Delete Payload */
|
||||
struct isakmp_pl_d {
|
||||
struct ikev1_pl_d {
|
||||
struct isakmp_gen h;
|
||||
u_int32_t doi; /* Domain of Interpretation */
|
||||
u_int8_t prot_id; /* Protocol-Id */
|
||||
@ -357,15 +367,15 @@ struct isakmp_pl_d {
|
||||
};
|
||||
|
||||
|
||||
struct isakmp_ph1tab {
|
||||
struct isakmp_ph1 *head;
|
||||
struct isakmp_ph1 *tail;
|
||||
struct ikev1_ph1tab {
|
||||
struct ikev1_ph1 *head;
|
||||
struct ikev1_ph1 *tail;
|
||||
int len;
|
||||
};
|
||||
|
||||
struct isakmp_ph2tab {
|
||||
struct isakmp_ph2 *head;
|
||||
struct isakmp_ph2 *tail;
|
||||
struct ikev1_ph2 *head;
|
||||
struct ikev1_ph2 *tail;
|
||||
int len;
|
||||
};
|
||||
|
||||
@ -375,4 +385,99 @@ struct isakmp_ph2tab {
|
||||
#define PFS_NEED 1
|
||||
#define PFS_NONEED 0
|
||||
|
||||
/* IKEv2 (RFC4306) */
|
||||
|
||||
/* 3.3 Security Association Payload -- generic header */
|
||||
/* 3.3.1. Proposal Substructure */
|
||||
struct ikev2_p {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t p_no; /* Proposal # */
|
||||
u_int8_t prot_id; /* Protocol */
|
||||
u_int8_t spi_size; /* SPI Size */
|
||||
u_int8_t num_t; /* Number of Transforms */
|
||||
};
|
||||
|
||||
/* 3.3.2. Transform Substructure */
|
||||
struct ikev2_t {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t t_type; /* Transform Type (ENCR,PRF,INTEG,etc.*/
|
||||
u_int8_t res2; /* reserved byte */
|
||||
u_int16_t t_id; /* Transform ID */
|
||||
};
|
||||
|
||||
enum ikev2_t_type {
|
||||
IV2_T_ENCR = 1,
|
||||
IV2_T_PRF = 2,
|
||||
IV2_T_INTEG= 3,
|
||||
IV2_T_DH = 4,
|
||||
IV2_T_ESN = 5,
|
||||
};
|
||||
|
||||
/* 3.4. Key Exchange Payload */
|
||||
struct ikev2_ke {
|
||||
struct isakmp_gen h;
|
||||
u_int16_t ke_group;
|
||||
u_int16_t ke_res1;
|
||||
/* KE data */
|
||||
};
|
||||
|
||||
|
||||
/* 3.10 Notification Payload */
|
||||
struct ikev2_n {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t prot_id; /* Protocol-ID */
|
||||
u_int8_t spi_size; /* SPI Size */
|
||||
u_int16_t type; /* Notify Message Type */
|
||||
/* SPI */
|
||||
/* Notification Data */
|
||||
};
|
||||
|
||||
enum ikev2_n_type {
|
||||
IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD = 1,
|
||||
IV2_NOTIFY_INVALID_IKE_SPI = 4,
|
||||
IV2_NOTIFY_INVALID_MAJOR_VERSION = 5,
|
||||
IV2_NOTIFY_INVALID_SYNTAX = 7,
|
||||
IV2_NOTIFY_INVALID_MESSAGE_ID = 9,
|
||||
IV2_NOTIFY_INVALID_SPI =11,
|
||||
IV2_NOTIFY_NO_PROPOSAL_CHOSEN =14,
|
||||
IV2_NOTIFY_INVALID_KE_PAYLOAD =17,
|
||||
IV2_NOTIFY_AUTHENTICATION_FAILED =24,
|
||||
IV2_NOTIFY_SINGLE_PAIR_REQUIRED =34,
|
||||
IV2_NOTIFY_NO_ADDITIONAL_SAS =35,
|
||||
IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE =36,
|
||||
IV2_NOTIFY_FAILED_CP_REQUIRED =37,
|
||||
IV2_NOTIFY_INVALID_SELECTORS =39,
|
||||
IV2_NOTIFY_INITIAL_CONTACT =16384,
|
||||
IV2_NOTIFY_SET_WINDOW_SIZE =16385,
|
||||
IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE =16386,
|
||||
IV2_NOTIFY_IPCOMP_SUPPORTED =16387,
|
||||
IV2_NOTIFY_NAT_DETECTION_SOURCE_IP =16388,
|
||||
IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP =16389,
|
||||
IV2_NOTIFY_COOKIE =16390,
|
||||
IV2_NOTIFY_USE_TRANSPORT_MODE =16391,
|
||||
IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED =16392,
|
||||
IV2_NOTIFY_REKEY_SA =16393,
|
||||
IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED =16394,
|
||||
IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO =16395
|
||||
};
|
||||
|
||||
struct notify_messages {
|
||||
u_int16_t type;
|
||||
char *msg;
|
||||
};
|
||||
|
||||
/* 3.8 Notification Payload */
|
||||
struct ikev2_auth {
|
||||
struct isakmp_gen h;
|
||||
u_int8_t auth_method; /* Protocol-ID */
|
||||
u_int8_t reserved[3];
|
||||
/* authentication data */
|
||||
};
|
||||
|
||||
enum ikev2_auth_type {
|
||||
IV2_RSA_SIG = 1,
|
||||
IV2_SHARED = 2,
|
||||
IV2_DSS_SIG = 3,
|
||||
};
|
||||
|
||||
#endif /* !defined(_ISAKMP_H_) */
|
||||
|
1705
print-isakmp.c
1705
print-isakmp.c
File diff suppressed because it is too large
Load Diff
22231
tests/ikev2.puu
Normal file
22231
tests/ikev2.puu
Normal file
File diff suppressed because it is too large
Load Diff
134
tests/ikev2four.puu
Normal file
134
tests/ikev2four.puu
Normal file
@ -0,0 +1,134 @@
|
||||
begin 644 ikev2four.pcap
|
||||
MU,.RH0(`!````````````-P%````````1!*W1JWG!0"8`0``F`$```(```!%
|
||||
M``&43<0``$`1J$'`J`$"P*@!`0'T`?0!@`=EJ(AUJ!F)DJ8``````````"$@
|
||||
M(@@````````!>"(``'@```!T`0$`#`,```P!```,@`X`@`,```P!```,@`X!
|
||||
M``,```P!```,@`X`P`,```@!```#`P``"`(```(#```(`@```0,```@"```$
|
||||
M`P``"`,```(#```(`P```0,```@#```%`P``"`0```(````(!```#B@``(@`
|
||||
M`@``M41;U@SLYOW-/):E++M[M":HQZ#U:IPXT;'$\,.FZ.?;I<<SFV[0+G5Q
|
||||
M&=^UMI,\Z3M@28?[O'<B&RH,?-TR>'[_$%<K[U1L-A1B^=HTA'EII"Y1QU69
|
||||
M:^K$+F^ZEAIUW@_!LC\)DX");NB2`A(M[:P;U4JH24K#UT"^32I,\YTI```D
|
||||
M82CKT".H9.E*?_MTOWS.+]0V<R*XL'/Y0B@KU2Z_X^8I```<``!`!$0O_EKJ
|
||||
M#.Y-NLQUCH`2,[W`F@J_````'```0`6Z!!M=Y9E5D`V!BL5.&+(V<YV>BT02
|
||||
MMT9`]@4`7````%P````"````10``6$W%``!`$:E\P*@!`<"H`0(!]`'T`$0&
|
||||
M*:B(=:@9B9*F```````````I("(@`````````#P````@``!`!@````'"(AY0
|
||||
MP6X2/RL,<:[\\,L[>8>"QD02MT8;!08`N`$``+@!```"````10`!M$W&``!`
|
||||
M$:@?P*@!`L"H`0$!]`'T`:`'A:B(=:@9B9*F```````````I("((````````
|
||||
M`9@A```@``!`!@````'"(AY0P6X2/RL,<:[\\,L[>8>"QB(``'@```!T`0$`
|
||||
M#`,```P!```,@`X`@`,```P!```,@`X!``,```P!```,@`X`P`,```@!```#
|
||||
M`P``"`(```(#```(`@```0,```@"```$`P``"`,```(#```(`P```0,```@#
|
||||
M```%`P``"`0```(````(!```#B@``(@``@``M41;U@SLYOW-/):E++M[M":H
|
||||
MQZ#U:IPXT;'$\,.FZ.?;I<<SFV[0+G5Q&=^UMI,\Z3M@28?[O'<B&RH,?-TR
|
||||
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
|
||||
MWO@]9O3$W<0SYFNOE0I9G$U>E$YL+8^OS+F4M\).+K>I:E@[A=8X`^J9#
|
||||
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
|
||||
&*A]EV_;R
|
||||
`
|
||||
end
|
Loading…
Reference in New Issue
Block a user