2 * Copyright (C) 2002-2005 Mathieu Lafon - Arkoon Network Security
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 #include <sys/queue.h>
23 #include "constants.h"
27 #include "connections.h"
33 #include "nat_traversal.h"
36 * Unknown/Special VID:
38 * SafeNet SoftRemote 8.0.0:
39 * 47bbe7c993f1fc13b4e6d0db565c68e5010201010201010310382e302e3020284275696c6420313029000000
40 * >> 382e302e3020284275696c6420313029 = '8.0.0 (Build 10)'
43 * SafeNet SoftRemote 9.0.1
44 * 47bbe7c993f1fc13b4e6d0db565c68e5010201010201010310392e302e3120284275696c6420313229000000
45 * >> 392e302e3120284275696c6420313229 = '9.0.1 (Build 12)'
49 * d6b45f82f24bacb288af59a978830ab7
50 * cf49908791073fb46439790fdeb6aeed981101ab0000000500000300
53 * 1f07f70eaa6514d3b0fa96542a500300 (VPN 3000 version 3.0.0)
54 * 1f07f70eaa6514d3b0fa96542a500301 (VPN 3000 version 3.0.1)
55 * 1f07f70eaa6514d3b0fa96542a500305 (VPN 3000 version 3.0.5)
56 * 1f07f70eaa6514d3b0fa96542a500407 (VPN 3000 version 4.0.7)
57 * (Can you see the pattern?)
58 * afcad71368a1f1c96b8696fc77570100 (Non-RFC Dead Peer Detection ?)
59 * c32364b3b4f447eb17c488ab2a480a57
60 * 6d761ddc26aceca1b0ed11fabbb860c4
61 * 5946c258f99a1a57b03eb9d1759e0f24 (From a Cisco VPN 3k)
62 * ebbc5b00141d0c895e11bd395902d690 (From a Cisco VPN 3k)
64 * Microsoft L2TP (???):
65 * 47bbe7c993f1fc13b4e6d0db565c68e5010201010201010310382e312e3020284275696c6420313029000000
66 * >> 382e312e3020284275696c6420313029 = '8.1.0 (Build 10)'
67 * 3025dbd21062b9e53dc441c6aab5293600000000
75 * If someone know what they mean, mail me.
78 #define MAX_LOG_VID_LEN 32
80 #define VID_KEEP 0x0000
81 #define VID_MD5HASH 0x0001
82 #define VID_STRING 0x0002
83 #define VID_FSWAN_HASH 0x0004
85 #define VID_SUBSTRING_DUMPHEXA 0x0100
86 #define VID_SUBSTRING_DUMPASCII 0x0200
87 #define VID_SUBSTRING_MATCH 0x0400
88 #define VID_SUBSTRING (VID_SUBSTRING_DUMPHEXA | VID_SUBSTRING_DUMPASCII | VID_SUBSTRING_MATCH)
91 enum known_vendorid id
;
99 #define DEC_MD5_VID_D(id,str,descr) \
100 { VID_##id, VID_MD5HASH, str, descr, NULL, 0 },
101 #define DEC_MD5_VID(id,str) \
102 { VID_##id, VID_MD5HASH, str, NULL, NULL, 0 },
103 #define DEC_FSWAN_VID(id,str,descr) \
104 { VID_##id, VID_FSWAN_HASH, str, descr, NULL, 0 },
106 static struct vid_struct _vid_tab
[] = {
108 /* Implementation names */
110 { VID_OPENPGP
, VID_STRING
, "OpenPGP10171", "OpenPGP", NULL
, 0 },
112 DEC_MD5_VID(KAME_RACOON
, "KAME/racoon")
114 { VID_MS_NT5
, VID_MD5HASH
| VID_SUBSTRING_DUMPHEXA
,
115 "MS NT5 ISAKMPOAKLEY", NULL
, NULL
, 0 },
117 DEC_MD5_VID(SSH_SENTINEL
, "SSH Sentinel")
118 DEC_MD5_VID(SSH_SENTINEL_1_1
, "SSH Sentinel 1.1")
119 DEC_MD5_VID(SSH_SENTINEL_1_2
, "SSH Sentinel 1.2")
120 DEC_MD5_VID(SSH_SENTINEL_1_3
, "SSH Sentinel 1.3")
121 DEC_MD5_VID(SSH_SENTINEL_1_4
, "SSH Sentinel 1.4")
122 DEC_MD5_VID(SSH_SENTINEL_1_4_1
, "SSH Sentinel 1.4.1")
124 /* These ones come from SSH vendors.txt */
125 DEC_MD5_VID(SSH_IPSEC_1_1_0
,
126 "Ssh Communications Security IPSEC Express version 1.1.0")
127 DEC_MD5_VID(SSH_IPSEC_1_1_1
,
128 "Ssh Communications Security IPSEC Express version 1.1.1")
129 DEC_MD5_VID(SSH_IPSEC_1_1_2
,
130 "Ssh Communications Security IPSEC Express version 1.1.2")
131 DEC_MD5_VID(SSH_IPSEC_1_2_1
,
132 "Ssh Communications Security IPSEC Express version 1.2.1")
133 DEC_MD5_VID(SSH_IPSEC_1_2_2
,
134 "Ssh Communications Security IPSEC Express version 1.2.2")
135 DEC_MD5_VID(SSH_IPSEC_2_0_0
,
136 "SSH Communications Security IPSEC Express version 2.0.0")
137 DEC_MD5_VID(SSH_IPSEC_2_1_0
,
138 "SSH Communications Security IPSEC Express version 2.1.0")
139 DEC_MD5_VID(SSH_IPSEC_2_1_1
,
140 "SSH Communications Security IPSEC Express version 2.1.1")
141 DEC_MD5_VID(SSH_IPSEC_2_1_2
,
142 "SSH Communications Security IPSEC Express version 2.1.2")
143 DEC_MD5_VID(SSH_IPSEC_3_0_0
,
144 "SSH Communications Security IPSEC Express version 3.0.0")
145 DEC_MD5_VID(SSH_IPSEC_3_0_1
,
146 "SSH Communications Security IPSEC Express version 3.0.1")
147 DEC_MD5_VID(SSH_IPSEC_4_0_0
,
148 "SSH Communications Security IPSEC Express version 4.0.0")
149 DEC_MD5_VID(SSH_IPSEC_4_0_1
,
150 "SSH Communications Security IPSEC Express version 4.0.1")
151 DEC_MD5_VID(SSH_IPSEC_4_1_0
,
152 "SSH Communications Security IPSEC Express version 4.1.0")
153 DEC_MD5_VID(SSH_IPSEC_4_2_0
,
154 "SSH Communications Security IPSEC Express version 4.2.0")
156 /* note: md5('CISCO-UNITY') = 12f5f28c457168a9702d9fe274cc02d4 */
157 { VID_CISCO_UNITY
, VID_KEEP
, NULL
, "Cisco-Unity",
158 "\x12\xf5\xf2\x8c\x45\x71\x68\xa9\x70\x2d\x9f\xe2\x74\xcc\x01\x00",
161 { VID_CISCO3K
, VID_KEEP
| VID_SUBSTRING_MATCH
,
162 NULL
, "Cisco VPN 3000 Series" , "\x1f\x07\xf7\x0e\xaa\x65\x14\xd3\xb0\xfa\x96\x54\x2a\x50", 14},
164 { VID_CISCO_IOS
, VID_KEEP
| VID_SUBSTRING_MATCH
,
165 NULL
, "Cisco IOS Device", "\x3e\x98\x40\x48", 4},
169 * - 54494d455354455020312053475720313532302033313520322e303145303133
170 * = 'TIMESTEP 1 SGW 1520 315 2.01E013'
172 { VID_TIMESTEP
, VID_STRING
| VID_SUBSTRING_DUMPASCII
, "TIMESTEP",
177 * 4865617274426561745f4e6f74696679386b0100 (HeartBeat_Notify + 386b0100)
179 { VID_MISC_HEARTBEAT_NOTIFY
, VID_STRING
| VID_SUBSTRING_DUMPHEXA
,
180 "HeartBeat_Notify", "HeartBeat Notify", NULL
, 0 },
185 { VID_MACOSX
, VID_STRING
|VID_SUBSTRING_DUMPHEXA
, "Mac OSX 10.x",
186 "\x4d\xf3\x79\x28\xe9\xfc\x4f\xd1\xb3\x26\x21\x70\xd5\x15\xc6\x62", NULL
, 0},
191 DEC_FSWAN_VID(OPENSWAN2
, "Openswan 2.2.0", "Openswan 2.2.0")
194 { VID_NCP_SERVER
, VID_KEEP
| VID_SUBSTRING_MATCH
, NULL
, "NCP Server",
195 "\xc6\xf5\x7a\xc3\x98\xf4\x93\x20\x81\x45\xb7\x58", 12},
196 { VID_NCP_CLIENT
, VID_KEEP
| VID_SUBSTRING_MATCH
, NULL
, "NCP Client",
197 "\xeb\x4c\x1b\x78\x8a\xfd\x4a\x9c\xb7\x73\x0a\x68", 12},
200 * Windows Vista (and Windows Server 2008?)
202 DEC_MD5_VID(VISTA_AUTHIP
, "MS-Negotiation Discovery Capable")
203 DEC_MD5_VID(VISTA_AUTHIP2
, "IKE CGA version 1")
204 DEC_MD5_VID(VISTA_AUTHIP3
, "MS-MamieExists")
209 DEC_MD5_VID(STRONGSWAN
, "strongSwan 4.2.1")
210 DEC_MD5_VID(STRONGSWAN_4_2_0
, "strongSwan 4.2.0")
211 DEC_MD5_VID(STRONGSWAN_4_1_11
,"strongSwan 4.1.11")
212 DEC_MD5_VID(STRONGSWAN_4_1_10
,"strongSwan 4.1.10")
213 DEC_MD5_VID(STRONGSWAN_4_1_9
, "strongSwan 4.1.9")
214 DEC_MD5_VID(STRONGSWAN_4_1_8
, "strongSwan 4.1.8")
215 DEC_MD5_VID(STRONGSWAN_4_1_7
, "strongSwan 4.1.7")
216 DEC_MD5_VID(STRONGSWAN_4_1_6
, "strongSwan 4.1.6")
217 DEC_MD5_VID(STRONGSWAN_4_1_5
, "strongSwan 4.1.5")
218 DEC_MD5_VID(STRONGSWAN_4_1_4
, "strongSwan 4.1.4")
219 DEC_MD5_VID(STRONGSWAN_4_1_3
, "strongSwan 4.1.3")
220 DEC_MD5_VID(STRONGSWAN_4_1_2
, "strongSwan 4.1.2")
221 DEC_MD5_VID(STRONGSWAN_4_1_1
, "strongSwan 4.1.1")
222 DEC_MD5_VID(STRONGSWAN_4_1_0
, "strongSwan 4.1.0")
223 DEC_MD5_VID(STRONGSWAN_4_0_7
, "strongSwan 4.0.7")
224 DEC_MD5_VID(STRONGSWAN_4_0_6
, "strongSwan 4.0.6")
225 DEC_MD5_VID(STRONGSWAN_4_0_5
, "strongSwan 4.0.5")
226 DEC_MD5_VID(STRONGSWAN_4_0_4
, "strongSwan 4.0.4")
227 DEC_MD5_VID(STRONGSWAN_4_0_3
, "strongSwan 4.0.3")
228 DEC_MD5_VID(STRONGSWAN_4_0_2
, "strongSwan 4.0.2")
229 DEC_MD5_VID(STRONGSWAN_4_0_1
, "strongSwan 4.0.1")
230 DEC_MD5_VID(STRONGSWAN_4_0_0
, "strongSwan 4.0.0")
232 DEC_MD5_VID(STRONGSWAN_2_8_8
, "strongSwan 2.8.8")
233 DEC_MD5_VID(STRONGSWAN_2_8_7
, "strongSwan 2.8.7")
234 DEC_MD5_VID(STRONGSWAN_2_8_6
, "strongSwan 2.8.6")
235 DEC_MD5_VID(STRONGSWAN_2_8_5
, "strongSwan 2.8.5")
236 DEC_MD5_VID(STRONGSWAN_2_8_4
, "strongSwan 2.8.4")
237 DEC_MD5_VID(STRONGSWAN_2_8_3
, "strongSwan 2.8.3")
238 DEC_MD5_VID(STRONGSWAN_2_8_2
, "strongSwan 2.8.2")
239 DEC_MD5_VID(STRONGSWAN_2_8_1
, "strongSwan 2.8.1")
240 DEC_MD5_VID(STRONGSWAN_2_8_0
, "strongSwan 2.8.0")
241 DEC_MD5_VID(STRONGSWAN_2_7_3
, "strongSwan 2.7.3")
242 DEC_MD5_VID(STRONGSWAN_2_7_2
, "strongSwan 2.7.2")
243 DEC_MD5_VID(STRONGSWAN_2_7_1
, "strongSwan 2.7.1")
244 DEC_MD5_VID(STRONGSWAN_2_7_0
, "strongSwan 2.7.0")
245 DEC_MD5_VID(STRONGSWAN_2_6_4
, "strongSwan 2.6.4")
246 DEC_MD5_VID(STRONGSWAN_2_6_3
, "strongSwan 2.6.3")
247 DEC_MD5_VID(STRONGSWAN_2_6_2
, "strongSwan 2.6.2")
248 DEC_MD5_VID(STRONGSWAN_2_6_1
, "strongSwan 2.6.1")
249 DEC_MD5_VID(STRONGSWAN_2_6_0
, "strongSwan 2.6.0")
250 DEC_MD5_VID(STRONGSWAN_2_5_7
, "strongSwan 2.5.7")
251 DEC_MD5_VID(STRONGSWAN_2_5_6
, "strongSwan 2.5.6")
252 DEC_MD5_VID(STRONGSWAN_2_5_5
, "strongSwan 2.5.5")
253 DEC_MD5_VID(STRONGSWAN_2_5_4
, "strongSwan 2.5.4")
254 DEC_MD5_VID(STRONGSWAN_2_5_3
, "strongSwan 2.5.3")
255 DEC_MD5_VID(STRONGSWAN_2_5_2
, "strongSwan 2.5.2")
256 DEC_MD5_VID(STRONGSWAN_2_5_1
, "strongSwan 2.5.1")
257 DEC_MD5_VID(STRONGSWAN_2_5_0
, "strongSwan 2.5.0")
258 DEC_MD5_VID(STRONGSWAN_2_4_4
, "strongSwan 2.4.4")
259 DEC_MD5_VID(STRONGSWAN_2_4_3
, "strongSwan 2.4.3")
260 DEC_MD5_VID(STRONGSWAN_2_4_2
, "strongSwan 2.4.2")
261 DEC_MD5_VID(STRONGSWAN_2_4_1
, "strongSwan 2.4.1")
262 DEC_MD5_VID(STRONGSWAN_2_4_0
, "strongSwan 2.4.0")
263 DEC_MD5_VID(STRONGSWAN_2_3_2
, "strongSwan 2.3.2")
264 DEC_MD5_VID(STRONGSWAN_2_3_1
, "strongSwan 2.3.1")
265 DEC_MD5_VID(STRONGSWAN_2_3_0
, "strongSwan 2.3.0")
266 DEC_MD5_VID(STRONGSWAN_2_2_2
, "strongSwan 2.2.2")
267 DEC_MD5_VID(STRONGSWAN_2_2_1
, "strongSwan 2.2.1")
268 DEC_MD5_VID(STRONGSWAN_2_2_0
, "strongSwan 2.2.0")
272 DEC_MD5_VID(NATT_STENBERG_01
, "draft-stenberg-ipsec-nat-traversal-01")
273 DEC_MD5_VID(NATT_STENBERG_02
, "draft-stenberg-ipsec-nat-traversal-02")
274 DEC_MD5_VID(NATT_HUTTUNEN
, "ESPThruNAT")
275 DEC_MD5_VID(NATT_HUTTUNEN_ESPINUDP
, "draft-huttunen-ipsec-esp-in-udp-00.txt")
276 DEC_MD5_VID(NATT_IETF_00
, "draft-ietf-ipsec-nat-t-ike-00")
277 DEC_MD5_VID(NATT_IETF_02
, "draft-ietf-ipsec-nat-t-ike-02")
278 /* hash in draft-ietf-ipsec-nat-t-ike-02 contains '\n'... Accept both */
279 DEC_MD5_VID_D(NATT_IETF_02_N
, "draft-ietf-ipsec-nat-t-ike-02\n", "draft-ietf-ipsec-nat-t-ike-02_n")
280 DEC_MD5_VID(NATT_IETF_03
, "draft-ietf-ipsec-nat-t-ike-03")
281 DEC_MD5_VID(NATT_RFC
, "RFC 3947")
285 { VID_MISC_XAUTH
, VID_KEEP
, NULL
, "XAUTH",
286 "\x09\x00\x26\x89\xdf\xd6\xb7\x12", 8 },
288 { VID_MISC_DPD
, VID_KEEP
, NULL
, "Dead Peer Detection",
289 "\xaf\xca\xd7\x13\x68\xa1\xf1\xc9\x6b\x86\x96\xfc\x77\x57\x01\x00", 16 },
291 DEC_MD5_VID(MISC_FRAGMENTATION
, "FRAGMENTATION")
293 DEC_MD5_VID(INITIAL_CONTACT
, "Vid-Initial-Contact")
298 { VID_MISC_FRAGMENTATION
, VID_MD5HASH
| VID_SUBSTRING_DUMPHEXA
,
299 "FRAGMENTATION", NULL
, NULL
, 0 },
302 { 0, 0, NULL
, NULL
, NULL
, 0 }
306 static const char _hexdig
[] = "0123456789abcdef";
308 static int _vid_struct_init
= 0;
313 struct vid_struct
*vid
;
317 for (vid
= _vid_tab
; vid
->id
; vid
++)
319 if (vid
->flags
& VID_STRING
)
321 /** VendorID is a string **/
322 vid
->vid
= strdup(vid
->data
);
323 vid
->vid_len
= strlen(vid
->data
);
325 else if (vid
->flags
& VID_MD5HASH
)
327 /** VendorID is a string to hash with MD5 **/
328 char *vidm
= malloc(MD5_DIGEST_SIZE
);
334 MD5Update(&ctx
, (const u_char
*)vid
->data
, strlen(vid
->data
));
335 MD5Final(vidm
, &ctx
);
336 vid
->vid_len
= MD5_DIGEST_SIZE
;
339 else if (vid
->flags
& VID_FSWAN_HASH
)
341 /** FreeS/WAN 2.00+ specific hash **/
342 #define FSWAN_VID_SIZE 12
343 unsigned char hash
[MD5_DIGEST_SIZE
];
344 char *vidm
= malloc(FSWAN_VID_SIZE
);
350 MD5Update(&ctx
, (const u_char
*)vid
->data
, strlen(vid
->data
));
351 MD5Final(hash
, &ctx
);
354 #if FSWAN_VID_SIZE - 2 <= MD5_DIGEST_SIZE
355 memcpy(vidm
+ 2, hash
, FSWAN_VID_SIZE
- 2);
357 memcpy(vidm
+ 2, hash
, MD5_DIGEST_SIZE
);
358 memset(vidm
+ 2 + MD5_DIGEST_SIZE
, '\0',
359 FSWAN_VID_SIZE
- 2 - MD5_DIGEST_SIZE
);
361 for (i
= 2; i
< FSWAN_VID_SIZE
; i
++)
366 vid
->vid_len
= FSWAN_VID_SIZE
;
370 if (vid
->descr
== NULL
)
372 /** Find something to display **/
373 vid
->descr
= vid
->data
;
376 _vid_struct_init
= 1;
380 handle_known_vendorid (struct msg_digest
*md
381 , const char *vidstr
, size_t len
, struct vid_struct
*vid
)
384 bool vid_useful
= FALSE
;
388 /* Remote side supports OpenPGP certificates */
395 * Use most recent supported NAT-Traversal method and ignore the
396 * other ones (implementations will send all supported methods but
397 * only one will be used)
399 * Note: most recent == higher id in vendor.h
401 case VID_NATT_IETF_00
:
402 if (!nat_traversal_support_non_ike
)
404 if ((nat_traversal_enabled
) && (!md
->nat_traversal_vid
))
406 md
->nat_traversal_vid
= vid
->id
;
410 case VID_NATT_IETF_02
:
411 case VID_NATT_IETF_02_N
:
412 case VID_NATT_IETF_03
:
414 if (nat_traversal_support_port_floating
415 && md
->nat_traversal_vid
< vid
->id
)
417 md
->nat_traversal_vid
= vid
->id
;
422 /* Remote side would like to do DPD with us on this connection */
434 if (vid
->flags
& VID_SUBSTRING_DUMPHEXA
)
436 /* Dump description + Hexa */
437 memset(vid_dump
, 0, sizeof(vid_dump
));
438 snprintf(vid_dump
, sizeof(vid_dump
), "%s ",
439 vid
->descr ? vid
->descr
: "");
440 for (i
= strlen(vid_dump
), j
= vid
->vid_len
;
441 j
< len
&& i
< sizeof(vid_dump
) - 2;
444 vid_dump
[i
] = _hexdig
[(vidstr
[j
] >> 4) & 0xF];
445 vid_dump
[i
+1] = _hexdig
[vidstr
[j
] & 0xF];
448 else if (vid
->flags
& VID_SUBSTRING_DUMPASCII
)
450 /* Dump ASCII content */
451 memset(vid_dump
, 0, sizeof(vid_dump
));
452 for (i
= 0; i
< len
&& i
< sizeof(vid_dump
) - 1; i
++)
454 vid_dump
[i
] = (isprint(vidstr
[i
])) ? vidstr
[i
] : '.';
459 /* Dump description (descr) */
460 snprintf(vid_dump
, sizeof(vid_dump
), "%s",
461 vid
->descr ? vid
->descr
: "");
464 loglog(RC_LOG_SERIOUS
, "%s Vendor ID payload [%s]",
465 vid_useful ?
"received" : "ignoring", vid_dump
);
469 handle_vendorid (struct msg_digest
*md
, const char *vid
, size_t len
)
471 struct vid_struct
*pvid
;
473 if (!_vid_struct_init
)
477 * Find known VendorID in _vid_tab
479 for (pvid
= _vid_tab
; pvid
->id
; pvid
++)
481 if (pvid
->vid
&& vid
&& pvid
->vid_len
&& len
)
483 if (pvid
->vid_len
== len
)
485 if (memcmp(pvid
->vid
, vid
, len
) == 0)
487 handle_known_vendorid(md
, vid
, len
, pvid
);
491 else if ((pvid
->vid_len
< len
) && (pvid
->flags
& VID_SUBSTRING
))
493 if (memcmp(pvid
->vid
, vid
, pvid
->vid_len
) == 0)
495 handle_known_vendorid(md
, vid
, len
, pvid
);
503 * Unknown VendorID. Log the beginning.
506 char log_vid
[2*MAX_LOG_VID_LEN
+1];
509 memset(log_vid
, 0, sizeof(log_vid
));
511 for (i
= 0; i
< len
&& i
< MAX_LOG_VID_LEN
; i
++)
513 log_vid
[2*i
] = _hexdig
[(vid
[i
] >> 4) & 0xF];
514 log_vid
[2*i
+1] = _hexdig
[vid
[i
] & 0xF];
516 loglog(RC_LOG_SERIOUS
, "ignoring Vendor ID payload [%s%s]",
517 log_vid
, (len
>MAX_LOG_VID_LEN
) ?
"..." : "");
522 * Add a vendor id payload to the msg
525 out_vendorid (u_int8_t np
, pb_stream
*outs
, enum known_vendorid vid
)
527 struct vid_struct
*pvid
;
529 if (!_vid_struct_init
)
532 for (pvid
= _vid_tab
; pvid
->id
&& pvid
->id
!= vid
; pvid
++);
535 return STF_INTERNAL_ERROR
; /* not found */
537 return STF_INTERNAL_ERROR
; /* not initialized */
540 DBG_log("out_vendorid(): sending [%s]", pvid
->descr
)
542 return out_generic_raw(np
, &isakmp_vendor_id_desc
, outs
,
543 pvid
->vid
, pvid
->vid_len
, "V_ID");