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
14 * RCSID $Id: vendor.c,v 1.35 2006/04/12 16:44:28 as Exp $
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},
166 * - 54494d455354455020312053475720313532302033313520322e303145303133
167 * = 'TIMESTEP 1 SGW 1520 315 2.01E013'
169 { VID_TIMESTEP
, VID_STRING
| VID_SUBSTRING_DUMPASCII
, "TIMESTEP",
174 * 4865617274426561745f4e6f74696679386b0100 (HeartBeat_Notify + 386b0100)
176 { VID_MISC_HEARTBEAT_NOTIFY
, VID_STRING
| VID_SUBSTRING_DUMPHEXA
,
177 "HeartBeat_Notify", "HeartBeat Notify", NULL
, 0 },
182 { VID_MACOSX
, VID_STRING
|VID_SUBSTRING_DUMPHEXA
, "Mac OSX 10.x",
183 "\x4d\xf3\x79\x28\xe9\xfc\x4f\xd1\xb3\x26\x21\x70\xd5\x15\xc6\x62", NULL
, 0},
188 DEC_FSWAN_VID(OPENSWAN2
, "Openswan 2.2.0", "Openswan 2.2.0")
191 { VID_NCP_SERVER
, VID_KEEP
| VID_SUBSTRING_MATCH
, NULL
, "NCP Server",
192 "\xc6\xf5\x7a\xc3\x98\xf4\x93\x20\x81\x45\xb7\x58", 12},
193 { VID_NCP_CLIENT
, VID_KEEP
| VID_SUBSTRING_MATCH
, NULL
, "NCP Client",
194 "\xeb\x4c\x1b\x78\x8a\xfd\x4a\x9c\xb7\x73\x0a\x68", 12},
198 DEC_MD5_VID(STRONGSWAN
, "strongSwan 4.0.4")
199 DEC_MD5_VID(STRONGSWAN_4_0_3
, "strongSwan 4.0.3")
200 DEC_MD5_VID(STRONGSWAN_4_0_2
, "strongSwan 4.0.2")
201 DEC_MD5_VID(STRONGSWAN_4_0_1
, "strongSwan 4.0.1")
202 DEC_MD5_VID(STRONGSWAN_4_0_0
, "strongSwan 4.0.0")
204 DEC_MD5_VID(STRONGSWAN_2_7_4
, "strongSwan 2.7.4")
205 DEC_MD5_VID(STRONGSWAN_2_7_3
, "strongSwan 2.7.3")
206 DEC_MD5_VID(STRONGSWAN_2_7_2
, "strongSwan 2.7.2")
207 DEC_MD5_VID(STRONGSWAN_2_7_1
, "strongSwan 2.7.1")
208 DEC_MD5_VID(STRONGSWAN_2_7_0
, "strongSwan 2.7.0")
209 DEC_MD5_VID(STRONGSWAN_2_6_4
, "strongSwan 2.6.4")
210 DEC_MD5_VID(STRONGSWAN_2_6_3
, "strongSwan 2.6.3")
211 DEC_MD5_VID(STRONGSWAN_2_6_2
, "strongSwan 2.6.2")
212 DEC_MD5_VID(STRONGSWAN_2_6_1
, "strongSwan 2.6.1")
213 DEC_MD5_VID(STRONGSWAN_2_6_0
, "strongSwan 2.6.0")
214 DEC_MD5_VID(STRONGSWAN_2_5_7
, "strongSwan 2.5.7")
215 DEC_MD5_VID(STRONGSWAN_2_5_6
, "strongSwan 2.5.6")
216 DEC_MD5_VID(STRONGSWAN_2_5_5
, "strongSwan 2.5.5")
217 DEC_MD5_VID(STRONGSWAN_2_5_4
, "strongSwan 2.5.4")
218 DEC_MD5_VID(STRONGSWAN_2_5_3
, "strongSwan 2.5.3")
219 DEC_MD5_VID(STRONGSWAN_2_5_2
, "strongSwan 2.5.2")
220 DEC_MD5_VID(STRONGSWAN_2_5_1
, "strongSwan 2.5.1")
221 DEC_MD5_VID(STRONGSWAN_2_5_0
, "strongSwan 2.5.0")
222 DEC_MD5_VID(STRONGSWAN_2_4_4
, "strongSwan 2.4.4")
223 DEC_MD5_VID(STRONGSWAN_2_4_3
, "strongSwan 2.4.3")
224 DEC_MD5_VID(STRONGSWAN_2_4_2
, "strongSwan 2.4.2")
225 DEC_MD5_VID(STRONGSWAN_2_4_1
, "strongSwan 2.4.1")
226 DEC_MD5_VID(STRONGSWAN_2_4_0
, "strongSwan 2.4.0")
227 DEC_MD5_VID(STRONGSWAN_2_3_2
, "strongSwan 2.3.2")
228 DEC_MD5_VID(STRONGSWAN_2_3_1
, "strongSwan 2.3.1")
229 DEC_MD5_VID(STRONGSWAN_2_3_0
, "strongSwan 2.3.0")
230 DEC_MD5_VID(STRONGSWAN_2_2_2
, "strongSwan 2.2.2")
231 DEC_MD5_VID(STRONGSWAN_2_2_1
, "strongSwan 2.2.1")
232 DEC_MD5_VID(STRONGSWAN_2_2_0
, "strongSwan 2.2.0")
236 DEC_MD5_VID(NATT_STENBERG_01
, "draft-stenberg-ipsec-nat-traversal-01")
237 DEC_MD5_VID(NATT_STENBERG_02
, "draft-stenberg-ipsec-nat-traversal-02")
238 DEC_MD5_VID(NATT_HUTTUNEN
, "ESPThruNAT")
239 DEC_MD5_VID(NATT_HUTTUNEN_ESPINUDP
, "draft-huttunen-ipsec-esp-in-udp-00.txt")
240 DEC_MD5_VID(NATT_IETF_00
, "draft-ietf-ipsec-nat-t-ike-00")
241 DEC_MD5_VID(NATT_IETF_02
, "draft-ietf-ipsec-nat-t-ike-02")
242 /* hash in draft-ietf-ipsec-nat-t-ike-02 contains '\n'... Accept both */
243 DEC_MD5_VID_D(NATT_IETF_02_N
, "draft-ietf-ipsec-nat-t-ike-02\n", "draft-ietf-ipsec-nat-t-ike-02_n")
244 DEC_MD5_VID(NATT_IETF_03
, "draft-ietf-ipsec-nat-t-ike-03")
245 DEC_MD5_VID(NATT_RFC
, "RFC 3947")
249 { VID_MISC_XAUTH
, VID_KEEP
, NULL
, "XAUTH",
250 "\x09\x00\x26\x89\xdf\xd6\xb7\x12", 8 },
252 { VID_MISC_DPD
, VID_KEEP
, NULL
, "Dead Peer Detection",
253 "\xaf\xca\xd7\x13\x68\xa1\xf1\xc9\x6b\x86\x96\xfc\x77\x57\x01\x00", 16 },
255 DEC_MD5_VID(MISC_FRAGMENTATION
, "FRAGMENTATION")
257 DEC_MD5_VID(INITIAL_CONTACT
, "Vid-Initial-Contact")
260 { 0, 0, NULL
, NULL
, NULL
, 0 }
264 static const char _hexdig
[] = "0123456789abcdef";
266 static int _vid_struct_init
= 0;
271 struct vid_struct
*vid
;
275 for (vid
= _vid_tab
; vid
->id
; vid
++)
277 if (vid
->flags
& VID_STRING
)
279 /** VendorID is a string **/
280 vid
->vid
= strdup(vid
->data
);
281 vid
->vid_len
= strlen(vid
->data
);
283 else if (vid
->flags
& VID_MD5HASH
)
285 /** VendorID is a string to hash with MD5 **/
286 char *vidm
= malloc(MD5_DIGEST_SIZE
);
292 MD5Update(&ctx
, (const u_char
*)vid
->data
, strlen(vid
->data
));
293 MD5Final(vidm
, &ctx
);
294 vid
->vid_len
= MD5_DIGEST_SIZE
;
297 else if (vid
->flags
& VID_FSWAN_HASH
)
299 /** FreeS/WAN 2.00+ specific hash **/
300 #define FSWAN_VID_SIZE 12
301 unsigned char hash
[MD5_DIGEST_SIZE
];
302 char *vidm
= malloc(FSWAN_VID_SIZE
);
308 MD5Update(&ctx
, (const u_char
*)vid
->data
, strlen(vid
->data
));
309 MD5Final(hash
, &ctx
);
312 #if FSWAN_VID_SIZE - 2 <= MD5_DIGEST_SIZE
313 memcpy(vidm
+ 2, hash
, FSWAN_VID_SIZE
- 2);
315 memcpy(vidm
+ 2, hash
, MD5_DIGEST_SIZE
);
316 memset(vidm
+ 2 + MD5_DIGEST_SIZE
, '\0',
317 FSWAN_VID_SIZE
- 2 - MD5_DIGEST_SIZE
);
319 for (i
= 2; i
< FSWAN_VID_SIZE
; i
++)
324 vid
->vid_len
= FSWAN_VID_SIZE
;
328 if (vid
->descr
== NULL
)
330 /** Find something to display **/
331 vid
->descr
= vid
->data
;
334 _vid_struct_init
= 1;
338 handle_known_vendorid (struct msg_digest
*md
339 , const char *vidstr
, size_t len
, struct vid_struct
*vid
)
342 bool vid_useful
= FALSE
;
346 /* Remote side supports OpenPGP certificates */
353 * Use most recent supported NAT-Traversal method and ignore the
354 * other ones (implementations will send all supported methods but
355 * only one will be used)
357 * Note: most recent == higher id in vendor.h
359 case VID_NATT_IETF_00
:
360 if (!nat_traversal_support_non_ike
)
362 if ((nat_traversal_enabled
) && (!md
->nat_traversal_vid
))
364 md
->nat_traversal_vid
= vid
->id
;
368 case VID_NATT_IETF_02
:
369 case VID_NATT_IETF_02_N
:
370 case VID_NATT_IETF_03
:
372 if (nat_traversal_support_port_floating
373 && md
->nat_traversal_vid
< vid
->id
)
375 md
->nat_traversal_vid
= vid
->id
;
380 /* Remote side would like to do DPD with us on this connection */
389 if (vid
->flags
& VID_SUBSTRING_DUMPHEXA
)
391 /* Dump description + Hexa */
392 memset(vid_dump
, 0, sizeof(vid_dump
));
393 snprintf(vid_dump
, sizeof(vid_dump
), "%s ",
394 vid
->descr ? vid
->descr
: "");
395 for (i
= strlen(vid_dump
), j
= vid
->vid_len
;
396 j
< len
&& i
< sizeof(vid_dump
) - 2;
399 vid_dump
[i
] = _hexdig
[(vidstr
[j
] >> 4) & 0xF];
400 vid_dump
[i
+1] = _hexdig
[vidstr
[j
] & 0xF];
403 else if (vid
->flags
& VID_SUBSTRING_DUMPASCII
)
405 /* Dump ASCII content */
406 memset(vid_dump
, 0, sizeof(vid_dump
));
407 for (i
= 0; i
< len
&& i
< sizeof(vid_dump
) - 1; i
++)
409 vid_dump
[i
] = (isprint(vidstr
[i
])) ? vidstr
[i
] : '.';
414 /* Dump description (descr) */
415 snprintf(vid_dump
, sizeof(vid_dump
), "%s",
416 vid
->descr ? vid
->descr
: "");
419 loglog(RC_LOG_SERIOUS
, "%s Vendor ID payload [%s]",
420 vid_useful ?
"received" : "ignoring", vid_dump
);
424 handle_vendorid (struct msg_digest
*md
, const char *vid
, size_t len
)
426 struct vid_struct
*pvid
;
428 if (!_vid_struct_init
)
432 * Find known VendorID in _vid_tab
434 for (pvid
= _vid_tab
; pvid
->id
; pvid
++)
436 if (pvid
->vid
&& vid
&& pvid
->vid_len
&& len
)
438 if (pvid
->vid_len
== len
)
440 if (memcmp(pvid
->vid
, vid
, len
) == 0)
442 handle_known_vendorid(md
, vid
, len
, pvid
);
446 else if ((pvid
->vid_len
< len
) && (pvid
->flags
& VID_SUBSTRING
))
448 if (memcmp(pvid
->vid
, vid
, pvid
->vid_len
) == 0)
450 handle_known_vendorid(md
, vid
, len
, pvid
);
458 * Unknown VendorID. Log the beginning.
461 char log_vid
[2*MAX_LOG_VID_LEN
+1];
464 memset(log_vid
, 0, sizeof(log_vid
));
466 for (i
= 0; i
< len
&& i
< MAX_LOG_VID_LEN
; i
++)
468 log_vid
[2*i
] = _hexdig
[(vid
[i
] >> 4) & 0xF];
469 log_vid
[2*i
+1] = _hexdig
[vid
[i
] & 0xF];
471 loglog(RC_LOG_SERIOUS
, "ignoring Vendor ID payload [%s%s]",
472 log_vid
, (len
>MAX_LOG_VID_LEN
) ?
"..." : "");
477 * Add a vendor id payload to the msg
480 out_vendorid (u_int8_t np
, pb_stream
*outs
, enum known_vendorid vid
)
482 struct vid_struct
*pvid
;
484 if (!_vid_struct_init
)
487 for (pvid
= _vid_tab
; pvid
->id
&& pvid
->id
!= vid
; pvid
++);
490 return STF_INTERNAL_ERROR
; /* not found */
492 return STF_INTERNAL_ERROR
; /* not initialized */
495 DBG_log("out_vendorid(): sending [%s]", pvid
->descr
)
497 return out_generic_raw(np
, &isakmp_vendor_id_desc
, outs
,
498 pvid
->vid
, pvid
->vid_len
, "V_ID");