move more extra packages from ./trunk to ./packages
[packages.git] / net / isakmpd / patches / 010-debian_3.patch
1 Index: isakmpd-20041012.orig/dpd.c
2 ===================================================================
3 --- isakmpd-20041012.orig.orig/dpd.c    2007-06-04 13:22:39.088912864 +0200
4 +++ isakmpd-20041012.orig/dpd.c 2007-06-04 13:22:39.282883376 +0200
5 @@ -26,6 +26,7 @@
6  
7  #include <sys/types.h>
8  #include <stdlib.h>
9 +#include <memory.h>
10  
11  #include "sysdep.h"
12  
13 @@ -174,6 +175,7 @@
14                 }
15                 break;
16         default:
17 +       ;
18         }
19  
20         /* Mark handled.  */
21 @@ -223,6 +225,7 @@
22                     dpd_check_event, sa, &tv);
23                 break;
24         default:
25 +       ;
26         }
27         if (!sa->dpd_event) 
28                 log_print("dpd_timer_reset: timer_add_event failed");
29 Index: isakmpd-20041012.orig/ipsec.c
30 ===================================================================
31 --- isakmpd-20041012.orig.orig/ipsec.c  2007-06-04 13:22:39.093912104 +0200
32 +++ isakmpd-20041012.orig/ipsec.c       2007-06-04 13:22:39.283883224 +0200
33 @@ -1020,6 +1020,52 @@
34         }
35  }
36  
37 +/*
38 + * deal with a NOTIFY of INVALID_SPI
39 + */
40 +static void
41 +ipsec_invalid_spi (struct message *msg, struct payload *p)
42 +{
43 +  struct sockaddr *dst;
44 +  int invspisz, off;
45 +  u_int32_t spi;
46 +  u_int16_t totsiz;
47 +  u_int8_t spisz;
48 +
49 +  /* Any notification that make us do something should be protected */
50 +  if(!TAILQ_FIRST (&msg->payload[ISAKMP_PAYLOAD_HASH]))
51 +    {
52 +      LOG_DBG ((LOG_SA, 40,
53 +              "ipsec_invalid_spi: missing HASH payload in INVALID_SPI"
54 +              " notification"));
55 +      return;
56 +    }
57 +
58 +  /*
59 +   * get the invalid spi out of the variable sized notification data
60 +   * field, which is after the variable sized SPI field [which specifies
61 +   * the receiving entity's phase-1 SPI, not the invalid spi]
62 +   */
63 +  totsiz = GET_ISAKMP_GEN_LENGTH (p->p);
64 +  spisz = GET_ISAKMP_NOTIFY_SPI_SZ (p->p);
65 +  off = ISAKMP_NOTIFY_SPI_OFF + spisz;
66 +  invspisz = totsiz - off;
67 +
68 +  if (invspisz != sizeof spi)
69 +    {
70 +      LOG_DBG ((LOG_SA, 40,
71 +              "ipsec_invalid_spi: SPI size %d in INVALID_SPI "
72 +              "payload unsupported", spisz));
73 +       return;
74 +    }
75 +  memcpy (&spi, p->p + off, sizeof spi);
76 +
77 +  msg->transport->vtbl->get_dst (msg->transport, &dst);
78 +
79 +  /* delete matching SPI's from this peer */
80 +  ipsec_delete_spi_list (dst, 0, (u_int8_t *)&spi, 1, "INVALID_SPI");
81 +}
82 +
83  static int
84  ipsec_responder(struct message *msg)
85  {
86 @@ -1205,7 +1251,9 @@
87                         return dv != IPSEC_ENCAP_TUNNEL
88                             && dv != IPSEC_ENCAP_TRANSPORT
89                             && dv != IPSEC_ENCAP_UDP_ENCAP_TUNNEL
90 -                           && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT;
91 +                           && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT
92 +                           && dv != IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT
93 +                           && dv != IPSEC_ENCAP_UDP_ENCAP_TRANSPORT_DRAFT;
94  #else
95                         return dv < IPSEC_ENCAP_TUNNEL
96                             || dv > IPSEC_ENCAP_TRANSPORT;
97 @@ -1837,7 +1885,7 @@
98  ipsec_get_id(char *section, int *id, struct sockaddr **addr,
99      struct sockaddr **mask, u_int8_t *tproto, u_int16_t *port)
100  {
101 -       char    *type, *address, *netmask;
102 +    char       *type, *address, *netmask;
103  
104         type = conf_get_str(section, "ID-type");
105         if (!type) {
106 Index: isakmpd-20041012.orig/GNUmakefile
107 ===================================================================
108 --- isakmpd-20041012.orig.orig/GNUmakefile      2007-06-04 13:22:39.099911192 +0200
109 +++ isakmpd-20041012.orig/GNUmakefile   2007-06-04 13:22:39.283883224 +0200
110 @@ -40,12 +40,12 @@
111  # integrated, freebsd/netbsd means FreeBSD/NetBSD with KAME IPsec.
112  # darwin means MacOS X 10.2 and later with KAME IPsec. linux means Linux-2.5
113  # and later with native IPSec support.
114 -OS=            openbsd
115 +#OS=           openbsd
116  #OS=           netbsd
117  #OS=           freebsd
118  #OS=           freeswan
119  #OS=           darwin
120 -#OS=           linux
121 +OS=            linux
122  
123  .CURDIR:=      $(shell pwd)
124  VPATH=         ${.CURDIR}/sysdep/${OS}
125 @@ -55,9 +55,10 @@
126  ifndef BINDIR
127  BINDIR=                /sbin
128  endif
129 -ifndef LDSTATIC
130 -LDSTATIC=      -static
131 -endif
132 +
133 +#ifndef LDSTATIC
134 +#LDSTATIC=     -static
135 +#endif
136  
137  SRCS=          app.c attribute.c cert.c connection.c \
138                 constants.c conf.c cookie.c crypto.c dh.c doi.c exchange.c \
139 @@ -131,11 +132,14 @@
140  ifneq ($(findstring install,$(MAKECMDGOALS)),install)
141  # Skip 'regress' until the regress/ structure has gmake makefiles for it.
142  #SUBDIR:=      regress
143 -SUBDIR:=
144 +#SUBDIR:=      apps/certpatch
145  mksubdirs:
146         $(foreach DIR, ${SUBDIR}, \
147 -               cd ${DIR}; ${MAKE} ${MAKEFLAGS} CFLAGS="${CFLAGS}" \
148 -                       MKDEP="${MKDEP}" ${MAKECMDGOALS})
149 +               cd ${.CURDIR}/${DIR}; ${MAKE} ${MAKECMDGOALS};)
150 +               
151 +#      $(foreach DIR, ${SUBDIR}, \
152 +#              cd ${DIR}; ${MAKE} CFLAGS="${CFLAGS}" \
153 +#                      MKDEP="${MKDEP}" ${MAKECMDGOALS})
154  else
155  mksubdirs:
156  endif
157 @@ -173,7 +177,7 @@
158  endif
159  
160  SRCS+=         ${IPSEC_SRCS} ${X509} ${POLICY} ${EC} ${AGGRESSIVE} ${DNSSEC} \
161 -               $(ISAKMP_CFG)
162 +                       $(ISAKMP_CFG) ${DPD} ${NAT_TRAVERSAL}
163  CFLAGS+=       ${IPSEC_CFLAGS}
164  LDADD+=                ${DESLIB}
165  DPADD+=                ${DESLIBDEP}
166 Index: isakmpd-20041012.orig/exchange.h
167 ===================================================================
168 --- isakmpd-20041012.orig.orig/exchange.h       2007-06-04 13:22:39.104910432 +0200
169 +++ isakmpd-20041012.orig/exchange.h    2007-06-04 13:22:39.283883224 +0200
170 @@ -221,6 +221,8 @@
171  #define EXCHANGE_FLAG_NAT_T_ENABLE     0x10    /* We are doing NAT-T.  */
172  #define EXCHANGE_FLAG_NAT_T_KEEPALIVE  0x20    /* We are the NAT:ed peer.  */
173  #define EXCHANGE_FLAG_DPD_CAP_PEER     0x40    /* Peer is DPD capable.  */
174 +#define EXCHANGE_FLAG_NAT_T_RFC                0x0080  /* Peer does RFC NAT-T. */
175 +#define EXCHANGE_FLAG_NAT_T_DRAFT      0x0100  /* Peer does draft NAT-T.*/
176  
177  extern int      exchange_add_certs(struct message *);
178  extern void     exchange_finalize(struct message *);
179 Index: isakmpd-20041012.orig/log.c
180 ===================================================================
181 --- isakmpd-20041012.orig.orig/log.c    2007-06-04 13:22:39.110909520 +0200
182 +++ isakmpd-20041012.orig/log.c 2007-06-04 13:22:39.284883072 +0200
183 @@ -79,7 +79,6 @@
184  
185  struct packhdr {
186         struct pcap_pkthdr pcap;/* pcap file packet header */
187 -       u_int32_t sa_family;    /* address family */
188         union {
189                 struct ip       ip4;    /* IPv4 header (w/o options) */
190                 struct ip6_hdr  ip6;    /* IPv6 header */
191 @@ -97,7 +96,7 @@
192  static u_int8_t *packet_buf = NULL;
193  
194  static int      udp_cksum(struct packhdr *, const struct udphdr *,
195 -    u_int16_t *);
196 +    u_int16_t *, int);
197  static u_int16_t in_cksum(const u_int16_t *, int);
198  #endif                         /* USE_DEBUG */
199  
200 @@ -539,11 +538,9 @@
201         udp.uh_ulen = htons(datalen);
202  
203         /* ip */
204 -       hdr.sa_family = htonl(src->sa_family);
205         switch (src->sa_family) {
206         default:
207                 /* Assume IPv4. XXX Can 'default' ever happen here?  */
208 -               hdr.sa_family = htonl(AF_INET);
209                 hdr.ip.ip4.ip_src.s_addr = 0x02020202;
210                 hdr.ip.ip4.ip_dst.s_addr = 0x01010101;
211                 /* The rest of the setup is common to AF_INET.  */
212 @@ -584,9 +581,7 @@
213         }
214  
215         /* Calculate UDP checksum.  */
216 -       udp.uh_sum = udp_cksum(&hdr, &udp, (u_int16_t *) packet_buf);
217 -       hdrlen += sizeof hdr.sa_family;
218 -
219 +       udp.uh_sum = udp_cksum(&hdr, &udp, (u_int16_t *) packet_buf, src->sa_family);
220         /* pcap file packet header */
221         gettimeofday(&tv, 0);
222         hdr.pcap.ts.tv_sec = tv.tv_sec;
223 @@ -610,7 +605,7 @@
224  
225  /* Copied from tcpdump/print-udp.c, mostly rewritten.  */
226  static int
227 -udp_cksum(struct packhdr *hdr, const struct udphdr *u, u_int16_t *d)
228 +udp_cksum(struct packhdr *hdr, const struct udphdr *u, u_int16_t *d, int af)
229  {
230         struct ip       *ip4;
231         struct ip6_hdr  *ip6;
232 @@ -639,7 +634,7 @@
233  
234         /* Setup pseudoheader.  */
235         memset(phu.pa, 0, sizeof phu);
236 -       switch (ntohl(hdr->sa_family)) {
237 +       switch (af) {
238         case AF_INET:
239                 ip4 = &hdr->ip.ip4;
240                 memcpy(&phu.ip4p.src, &ip4->ip_src, sizeof(struct in_addr));
241 @@ -664,7 +659,7 @@
242  
243         /* IPv6 wants a 0xFFFF checksum "on error", not 0x0.  */
244         if (tlen < 0)
245 -               return (ntohl(hdr->sa_family) == AF_INET ? 0 : 0xFFFF);
246 +               return (af == AF_INET ? 0 : 0xFFFF);
247  
248         sum = 0;
249         for (i = 0; i < hdrlen; i += 2)
250 Index: isakmpd-20041012.orig/nat_traversal.c
251 ===================================================================
252 --- isakmpd-20041012.orig.orig/nat_traversal.c  2007-06-04 13:22:39.115908760 +0200
253 +++ isakmpd-20041012.orig/nat_traversal.c       2007-06-04 13:22:39.284883072 +0200
254 @@ -1,4 +1,4 @@
255 -/*     $OpenBSD: nat_traversal.c,v 1.7 2004/08/08 19:11:06 deraadt Exp $       */
256 +/*     $OpenBSD: nat_traversal.c,v 1.17 2006/06/14 14:03:33 hshoexer Exp $     */
257  
258  /*
259   * Copyright (c) 2004 HÃ¥kan Olsson.  All rights reserved.
260 @@ -48,40 +48,40 @@
261  #include "util.h"
262  #include "virtual.h"
263  
264 +int    disable_nat_t = 0;
265 +
266  /*
267 - * XXX According to draft-ietf-ipsec-nat-t-ike-07.txt, the NAT-T
268 - * capability of the other peer is determined by a particular vendor ID
269 - * sent as the first message. This vendor ID string is supposed to be a
270 - * MD5 hash of "RFC XXXX", where XXXX is the future RFC number.
271 + * NAT-T capability of the other peer is determined by a particular vendor
272 + * ID sent in the first message. This vendor ID string is supposed to be a
273 + * MD5 hash of "RFC 3947".
274   *
275   * These seem to be the "well" known variants of this string in use by
276   * products today.
277   */
278 -static const char *isakmp_nat_t_cap_text[] = {
279 -       "draft-ietf-ipsec-nat-t-ike-00",        /* V1 (XXX: may be obsolete) */
280 -       "draft-ietf-ipsec-nat-t-ike-02\n",      /* V2 */
281 -       "draft-ietf-ipsec-nat-t-ike-03",        /* V3 */
282 -#ifdef notyet
283 -       "RFC XXXX",
284 -#endif
285 +
286 +static struct nat_t_cap isakmp_nat_t_cap[] = {
287 +       { VID_DRAFT_V2_N, EXCHANGE_FLAG_NAT_T_DRAFT,
288 +         "draft-ietf-ipsec-nat-t-ike-02\n", NULL, 0 },
289 +       { VID_DRAFT_V3, EXCHANGE_FLAG_NAT_T_DRAFT,
290 +         "draft-ietf-ipsec-nat-t-ike-03", NULL, 0 },
291 +       { VID_RFC3947, EXCHANGE_FLAG_NAT_T_RFC,
292 +         "RFC 3947", NULL, 0 },
293  };
294  
295 +#define NUMNATTCAP     (sizeof isakmp_nat_t_cap / sizeof isakmp_nat_t_cap[0])
296 +
297  /* In seconds. Recommended in draft-ietf-ipsec-udp-encaps-09.  */
298  #define NAT_T_KEEPALIVE_INTERVAL       20
299  
300 -/* The MD5 hashes of the above strings is put in this array.  */
301 -static char    **nat_t_hashes;
302 -static size_t    nat_t_hashsize;
303 -
304  static int     nat_t_setup_hashes(void);
305 -static int     nat_t_add_vendor_payload(struct message *, char *);
306 +static int     nat_t_add_vendor_payload(struct message *, struct nat_t_cap *);
307  static int     nat_t_add_nat_d(struct message *, struct sockaddr *);
308  static int     nat_t_match_nat_d_payload(struct message *, struct sockaddr *);
309  
310  void
311  nat_t_init(void)
312  {
313 -       nat_t_hashes = (char **)NULL;
314 +       nat_t_setup_hashes();
315  }
316  
317  /* Generate the NAT-T capability marker hashes. Executed only once.  */
318 @@ -89,7 +89,7 @@
319  nat_t_setup_hashes(void)
320  {
321         struct hash *hash;
322 -       int n = sizeof isakmp_nat_t_cap_text / sizeof isakmp_nat_t_cap_text[0];
323 +       int n = NUMNATTCAP;
324         int i;
325  
326         /* The draft says to use MD5.  */
327 @@ -100,56 +100,49 @@
328                     "could not find MD5 hash structure!");
329                 return -1;
330         }
331 -       nat_t_hashsize = hash->hashsize;
332  
333 -       /* Allocate one more than is necessary, i.e NULL terminated.  */
334 -       nat_t_hashes = (char **)calloc((size_t)(n + 1), sizeof(char *));
335 -       if (!nat_t_hashes) {
336 -               log_error("nat_t_setup_hashes: calloc (%lu,%lu) failed",
337 -                   (unsigned long)n, (unsigned long)sizeof(char *));
338 -               return -1;
339 -       }
340 -
341 -       /* Populate with hashes.  */
342 +       /* Populate isakmp_nat_t_cap with hashes.  */
343         for (i = 0; i < n; i++) {
344 -               nat_t_hashes[i] = (char *)malloc(nat_t_hashsize);
345 -               if (!nat_t_hashes[i]) {
346 +               isakmp_nat_t_cap[i].hashsize = hash->hashsize;
347 +               isakmp_nat_t_cap[i].hash = (char *)malloc(hash->hashsize);
348 +               if (!isakmp_nat_t_cap[i].hash) {
349                         log_error("nat_t_setup_hashes: malloc (%lu) failed",
350 -                           (unsigned long)nat_t_hashsize);
351 +                           (unsigned long)hash->hashsize);
352                         goto errout;
353                 }
354  
355                 hash->Init(hash->ctx);
356                 hash->Update(hash->ctx,
357 -                   (unsigned char *)isakmp_nat_t_cap_text[i],
358 -                   strlen(isakmp_nat_t_cap_text[i]));
359 -               hash->Final(nat_t_hashes[i], hash->ctx);
360 +                   (unsigned char *)isakmp_nat_t_cap[i].text,
361 +                   strlen(isakmp_nat_t_cap[i].text));
362 +               hash->Final(isakmp_nat_t_cap[i].hash, hash->ctx);
363  
364                 LOG_DBG((LOG_EXCHANGE, 50, "nat_t_setup_hashes: "
365 -                   "MD5(\"%s\") (%lu bytes)", isakmp_nat_t_cap_text[i],
366 -                   (unsigned long)nat_t_hashsize));
367 +                   "MD5(\"%s\") (%lu bytes)", isakmp_nat_t_cap[i].text,
368 +                   (unsigned long)hash->hashsize));
369                 LOG_DBG_BUF((LOG_EXCHANGE, 50, "nat_t_setup_hashes",
370 -                   nat_t_hashes[i], nat_t_hashsize));
371 +                   isakmp_nat_t_cap[i].hash, hash->hashsize));
372         }
373  
374         return 0;
375  
376 -  errout:
377 +errout:
378         for (i = 0; i < n; i++)
379 -               if (nat_t_hashes[i])
380 -                       free(nat_t_hashes[i]);
381 -       free(nat_t_hashes);
382 -       nat_t_hashes = NULL;
383 +               if (isakmp_nat_t_cap[i].hash)
384 +                       free(isakmp_nat_t_cap[i].hash);
385         return -1;
386  }
387  
388  /* Add one NAT-T VENDOR payload.  */
389  static int
390 -nat_t_add_vendor_payload(struct message *msg, char *hash)
391 +nat_t_add_vendor_payload(struct message *msg, struct nat_t_cap *cap)
392  {
393 -       size_t   buflen = nat_t_hashsize + ISAKMP_GEN_SZ;
394 +       size_t    buflen = cap->hashsize + ISAKMP_GEN_SZ;
395         u_int8_t *buf;
396  
397 +       if (disable_nat_t)
398 +               return 0;
399 +
400         buf = malloc(buflen);
401         if (!buf) {
402                 log_error("nat_t_add_vendor_payload: malloc (%lu) failed",
403 @@ -158,12 +151,11 @@
404         }
405  
406         SET_ISAKMP_GEN_LENGTH(buf, buflen);
407 -       memcpy(buf + ISAKMP_VENDOR_ID_OFF, hash, nat_t_hashsize);
408 +       memcpy(buf + ISAKMP_VENDOR_ID_OFF, cap->hash, cap->hashsize);
409         if (message_add_payload(msg, ISAKMP_PAYLOAD_VENDOR, buf, buflen, 1)) {
410                 free(buf);
411                 return -1;
412         }
413 -
414         return 0;
415  }
416  
417 @@ -171,16 +163,14 @@
418  int
419  nat_t_add_vendor_payloads(struct message *msg)
420  {
421 -       int i = 0;
422 +       int i;
423  
424 -       if (!nat_t_hashes)
425 -               if (nat_t_setup_hashes())
426 -                       return 0;  /* XXX should this be an error?  */
427 +       if (disable_nat_t)
428 +               return 0;
429  
430 -       while (nat_t_hashes[i])
431 -               if (nat_t_add_vendor_payload(msg, nat_t_hashes[i++]))
432 +       for (i = 0; i < NUMNATTCAP; i++)
433 +               if (nat_t_add_vendor_payload(msg, &isakmp_nat_t_cap[i]))
434                         return -1;
435 -
436         return 0;
437  }
438  
439 @@ -192,36 +182,31 @@
440  {
441         u_int8_t *pbuf = p->p;
442         size_t    vlen;
443 -       int       i = 0;
444 +       int       i;
445  
446 -       /* Already checked? */
447 -       if (p->flags & PL_MARK ||
448 -           msg->exchange->flags & EXCHANGE_FLAG_NAT_T_CAP_PEER)
449 +       if (disable_nat_t)
450                 return;
451  
452 -       if (!nat_t_hashes)
453 -               if (nat_t_setup_hashes())
454 -                       return;
455 -
456         vlen = GET_ISAKMP_GEN_LENGTH(pbuf) - ISAKMP_GEN_SZ;
457 -       if (vlen != nat_t_hashsize) {
458 -               LOG_DBG((LOG_EXCHANGE, 50, "nat_t_check_vendor_payload: "
459 -                   "bad size %lu != %lu", (unsigned long)vlen,
460 -                   (unsigned long)nat_t_hashsize));
461 -               return;
462 -       }
463  
464 -       while (nat_t_hashes[i])
465 -               if (memcmp(nat_t_hashes[i++], pbuf + ISAKMP_GEN_SZ,
466 +       for (i = 0; i < NUMNATTCAP; i++) {
467 +               if (vlen != isakmp_nat_t_cap[i].hashsize) {
468 +                       LOG_DBG((LOG_EXCHANGE, 50, "nat_t_check_vendor_payload: "
469 +                           "bad size %lu != %lu", (unsigned long)vlen,
470 +                           (unsigned long)isakmp_nat_t_cap[i].hashsize));
471 +                       continue;
472 +               }
473 +               if (memcmp(isakmp_nat_t_cap[i].hash, pbuf + ISAKMP_GEN_SZ,
474                     vlen) == 0) {
475                         /* This peer is NAT-T capable.  */
476                         msg->exchange->flags |= EXCHANGE_FLAG_NAT_T_CAP_PEER;
477 +                       msg->exchange->flags |= isakmp_nat_t_cap[i].flags;
478                         LOG_DBG((LOG_EXCHANGE, 10,
479                             "nat_t_check_vendor_payload: "
480                             "NAT-T capable peer detected"));
481                         p->flags |= PL_MARK;
482 -                       return;
483                 }
484 +       }
485  
486         return;
487  }
488 @@ -233,10 +218,8 @@
489  {
490         struct ipsec_exch *ie = (struct ipsec_exch *)msg->exchange->data;
491         struct hash      *hash;
492 -       struct prf       *prf;
493         u_int8_t         *res;
494         in_port_t         port;
495 -       int               prf_type = PRF_HMAC; /* XXX */
496  
497         hash = hash_get(ie->hash->type);
498         if (hash == NULL) {
499 @@ -244,31 +227,25 @@
500                 return NULL;
501         }
502  
503 -       prf = prf_alloc(prf_type, hash->type, msg->exchange->cookies,
504 -           ISAKMP_HDR_COOKIES_LEN);
505 -       if(!prf) {
506 -               log_print("nat_t_generate_nat_d_hash: prf_alloc failed");
507 -               return NULL;
508 -       }
509 +       *hashlen = hash->hashsize;
510  
511 -       *hashlen = prf->blocksize;
512         res = (u_int8_t *)malloc((unsigned long)*hashlen);
513         if (!res) {
514                 log_print("nat_t_generate_nat_d_hash: malloc (%lu) failed",
515                     (unsigned long)*hashlen);
516 -               prf_free(prf);
517                 *hashlen = 0;
518                 return NULL;
519         }
520  
521         port = sockaddr_port(sa);
522 -       memset(res, 0, *hashlen);
523 -
524 -       prf->Update(prf->prfctx, sockaddr_addrdata(sa), sockaddr_addrlen(sa));
525 -       prf->Update(prf->prfctx, (unsigned char *)&port, sizeof port);
526 -       prf->Final(res, prf->prfctx);
527 -       prf_free (prf);
528 +       bzero(res, *hashlen);
529  
530 +       hash->Init(hash->ctx);
531 +       hash->Update(hash->ctx, msg->exchange->cookies,
532 +           sizeof msg->exchange->cookies);
533 +       hash->Update(hash->ctx, sockaddr_addrdata(sa), sockaddr_addrlen(sa));
534 +       hash->Update(hash->ctx, (unsigned char *)&port, sizeof port);
535 +       hash->Final(res, hash->ctx);
536         return res;
537  }
538  
539 @@ -276,6 +253,7 @@
540  static int
541  nat_t_add_nat_d(struct message *msg, struct sockaddr *sa)
542  {
543 +       int       ret;
544         u_int8_t *hbuf, *buf;
545         size_t    hbuflen, buflen;
546  
547 @@ -298,11 +276,19 @@
548         memcpy(buf + ISAKMP_NAT_D_DATA_OFF, hbuf, hbuflen);
549         free(hbuf);
550  
551 -       if (message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D, buf, buflen, 1)) {
552 +       if (msg->exchange->flags & EXCHANGE_FLAG_NAT_T_RFC)
553 +               ret = message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D, buf,
554 +                   buflen, 1);
555 +       else if (msg->exchange->flags & EXCHANGE_FLAG_NAT_T_DRAFT)
556 +               ret = message_add_payload(msg, ISAKMP_PAYLOAD_NAT_D_DRAFT,
557 +                   buf, buflen, 1);
558 +       else
559 +               ret = -1;
560 +               
561 +       if (ret) {
562                 free(buf);
563                 return -1;
564         }
565 -
566         return 0;
567  }
568  
569 @@ -312,14 +298,14 @@
570  {
571         struct sockaddr *sa;
572  
573 -       msg->transport->vtbl->get_src(msg->transport, &sa);
574 +       /* Remote address first. */
575 +       msg->transport->vtbl->get_dst(msg->transport, &sa);
576         if (nat_t_add_nat_d(msg, sa))
577                 return -1;
578  
579 -       msg->transport->vtbl->get_dst(msg->transport, &sa);
580 +       msg->transport->vtbl->get_src(msg->transport, &sa);
581         if (nat_t_add_nat_d(msg, sa))
582                 return -1;
583 -
584         return 0;
585  }
586  
587 @@ -336,8 +322,8 @@
588          * If there are no NAT-D payloads in the message, return "found"
589          * as this will avoid NAT-T (see nat_t_exchange_check_nat_d()).
590          */
591 -       p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D);
592 -       if (!p)
593 +       if ((p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D_DRAFT)) == NULL &&
594 +           (p = payload_first(msg, ISAKMP_PAYLOAD_NAT_D)) == NULL)
595                 return 1;
596  
597         hbuf = nat_t_generate_nat_d_hash(msg, sa, &hbuflen);
598 Index: isakmpd-20041012.orig/udp_encap.c
599 ===================================================================
600 --- isakmpd-20041012.orig.orig/udp_encap.c      2007-06-04 13:22:39.121907848 +0200
601 +++ isakmpd-20041012.orig/udp_encap.c   2007-06-04 13:22:39.284883072 +0200
602 @@ -61,6 +61,11 @@
603  
604  #define UDP_SIZE 65536
605  
606 +#if defined(USE_NAT_TRAVERSAL) && defined (LINUX_IPSEC)
607 +#include <linux/socket.h>
608 +#include <linux/udp.h>
609 +#endif
610 +
611  /* If a system doesn't have SO_REUSEPORT, SO_REUSEADDR will have to do.  */
612  #ifndef SO_REUSEPORT
613  #define SO_REUSEPORT SO_REUSEADDR
614 @@ -134,6 +139,18 @@
615         if (sysdep_cleartext(s, laddr->sa_family) == -1)
616                 goto err;
617  
618 +#if defined(USE_NAT_TRAVERSAL) && defined (LINUX_IPSEC)
619 +    {
620 +#ifndef SOL_UDP
621 +#define SOL_UDP 17
622 +#endif
623 +        int option = UDP_ENCAP_ESPINUDP;
624 +        if(setsockopt(s, SOL_UDP, UDP_ENCAP, &option,
625 +                      sizeof (option)) < 0)
626 +            goto err;
627 +    }
628 +#endif
629 +
630         /* Wildcard address ?  */
631         switch (laddr->sa_family) {
632         case AF_INET:
633 Index: isakmpd-20041012.orig/apps/Makefile
634 ===================================================================
635 --- isakmpd-20041012.orig.orig/apps/Makefile    2007-06-04 13:22:39.126907088 +0200
636 +++ isakmpd-20041012.orig/apps/Makefile 2007-06-04 13:22:39.285882920 +0200
637 @@ -31,4 +31,4 @@
638  
639  SUBDIR= certpatch
640  
641 -.include <bsd.subdir.mk>
642 +#.include <bsd.subdir.mk>
643 Index: isakmpd-20041012.orig/apps/certpatch/GNUmakefile
644 ===================================================================
645 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
646 +++ isakmpd-20041012.orig/apps/certpatch/GNUmakefile    2007-06-04 13:22:39.285882920 +0200
647 @@ -0,0 +1,55 @@
648 +#      $OpenBSD: Makefile,v 1.7 2003/06/03 14:35:00 ho Exp $
649 +#      $EOM: Makefile,v 1.6 2000/03/28 21:22:06 ho Exp $
650 +
651 +#
652 +# Copyright (c) 1999 Niels Provos.  All rights reserved.
653 +# Copyright (c) 2001 Niklas Hallqvist.  All rights reserved.
654 +#
655 +# Redistribution and use in source and binary forms, with or without
656 +# modification, are permitted provided that the following conditions
657 +# are met:
658 +# 1. Redistributions of source code must retain the above copyright
659 +#    notice, this list of conditions and the following disclaimer.
660 +# 2. Redistributions in binary form must reproduce the above copyright
661 +#    notice, this list of conditions and the following disclaimer in the
662 +#    documentation and/or other materials provided with the distribution.
663 +#
664 +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
665 +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
666 +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
667 +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
668 +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
669 +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
670 +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
671 +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
672 +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
673 +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
674 +#
675 +
676 +#
677 +# This code was written under funding by Ericsson Radio Systems.
678 +#
679 +
680 +PROG=          certpatch
681 +SRCS=          certpatch.c
682 +BINDIR?=       /usr/sbin
683 +TOPSRC=                ${.CURDIR}../..
684 +TOPOBJ!=       cd ${TOPSRC}; printf "all:\n\t@pwd\n" |${MAKE} -f-
685 +OS=                    linux
686 +FEATURES!=     awk '/^FEATURES=/ { print $$0 }' ${.CURDIR}/../../Makefile | sed 's/FEATURES=.//'
687 +.PATH:         ${TOPSRC} ${TOPSRC}/sysdep/${OS} ${TOPOBJ}
688 +CFLAGS+=       -I${TOPSRC} -I${TOPSRC}/sysdep/${OS} -I${TOPOBJ} -Wall
689 +LDFLAGS+=      -lcrypto -lssl -lgmp
690 +MAN=           certpatch.8
691 +
692 +CFLAGS+=       -DMP_FLAVOUR=MP_FLAVOUR_GMP
693 +LDADD+=                -lgmp
694 +DPADD+=                ${LIBGMP}
695 +
696 +# Override LIBSYSDEPDIR definition from Makefile.sysdep
697 +LIBSYSDEPDIR=  ${TOPSRC}/sysdep/common/libsysdep
698 +
699 +all:   ${PROG}
700 +
701 +clean: 
702 +       rm -f ${PROG}
703 Index: isakmpd-20041012.orig/pf_key_v2.c
704 ===================================================================
705 --- isakmpd-20041012.orig.orig/pf_key_v2.c      2007-06-04 13:22:39.137905416 +0200
706 +++ isakmpd-20041012.orig/pf_key_v2.c   2007-06-04 13:22:39.287882616 +0200
707 @@ -1055,6 +1055,10 @@
708  #endif
709  #if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
710         struct sadb_x_udpencap udpencap;
711 +#elif defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_NAT_T_TYPE)
712 +       struct sadb_x_nat_t_type nat_t_type;
713 +       struct sadb_x_nat_t_port nat_t_sport;
714 +       struct sadb_x_nat_t_port nat_t_dport;
715  #endif
716  #ifdef USE_DEBUG
717         char           *addr_str;
718 @@ -1273,10 +1277,15 @@
719                 log_print("pf_key_v2_set_spi: invalid proto %d", proto->proto);
720                 goto cleanup;
721         }
722 -       if (incoming)
723 +       if (incoming) {
724                 sa->transport->vtbl->get_src(sa->transport, &dst);
725 -       else
726 +               sa->transport->vtbl->get_dst(sa->transport, &src);
727 +       }
728 +       else {
729                 sa->transport->vtbl->get_dst(sa->transport, &dst);
730 +               sa->transport->vtbl->get_src(sa->transport, &src);
731 +       }
732 +
733  #ifdef KAME
734         msg.sadb_msg_seq = (incoming ?
735             pf_key_v2_seq_by_sa(proto->spi[incoming], sizeof ssa.sadb_sa_spi,
736 @@ -1319,12 +1328,13 @@
737         ssa.sadb_sa_flags = 0;
738  #ifdef SADB_X_SAFLAGS_TUNNEL
739         if (iproto->encap_mode == IPSEC_ENCAP_TUNNEL ||
740 -           iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL)
741 +           iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL ||
742 +           iproto->encap_mode == IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT)
743                 ssa.sadb_sa_flags = SADB_X_SAFLAGS_TUNNEL;
744  #endif
745  
746 -#if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
747         if (isakmp_sa->flags & SA_FLAG_NAT_T_ENABLE) {
748 +#if defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_UDPENCAP)
749                 memset(&udpencap, 0, sizeof udpencap);
750                 ssa.sadb_sa_flags |= SADB_X_SAFLAGS_UDPENCAP;
751                 udpencap.sadb_x_udpencap_exttype = SADB_X_EXT_UDPENCAP;
752 @@ -1334,8 +1344,40 @@
753                 if (pf_key_v2_msg_add(update, (struct sadb_ext *)&udpencap, 0)
754                     == -1)
755                         goto cleanup;
756 -       }
757 +#elif defined (USE_NAT_TRAVERSAL) && defined (SADB_X_EXT_NAT_T_TYPE)
758 +#ifndef UDP_ENCAP_ESPINUDP
759 +#define UDP_ENCAP_ESPINUDP     2
760 +#endif
761 +               memset(&nat_t_type, 0, sizeof nat_t_type);
762 +               memset(&nat_t_sport, 0, sizeof nat_t_sport);
763 +               memset(&nat_t_dport, 0, sizeof nat_t_dport);
764 +
765 +               /* type = draft-udp-encap-06 */
766 +               nat_t_type.sadb_x_nat_t_type_len = sizeof nat_t_type / PF_KEY_V2_CHUNK;
767 +               nat_t_type.sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
768 +               nat_t_type.sadb_x_nat_t_type_type = UDP_ENCAP_ESPINUDP;
769 +               if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_type, 0) == -1)
770 +                       goto cleanup;
771 +
772 +               /* source port */
773 +               nat_t_sport.sadb_x_nat_t_port_len = sizeof nat_t_sport / 
774 +                                                          PF_KEY_V2_CHUNK;
775 +               nat_t_sport.sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_SPORT;
776 +               nat_t_sport.sadb_x_nat_t_port_port = sockaddr_port(src);
777 +               if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_sport, 0) == -1)
778 +                       goto cleanup;
779 +
780 +               /* destination port */
781 +               nat_t_dport.sadb_x_nat_t_port_len = sizeof nat_t_dport / 
782 +                                                          PF_KEY_V2_CHUNK;
783 +               nat_t_dport.sadb_x_nat_t_port_exttype = SADB_X_EXT_NAT_T_DPORT;
784 +               nat_t_dport.sadb_x_nat_t_port_port = sockaddr_port(dst);
785 +               if(pf_key_v2_msg_add(update, (struct sadb_ext *)&nat_t_dport, 0) == -1)
786 +                       goto cleanup;
787 +
788 +               /* original address (transport mode checksum missing info) goes here */
789  #endif
790 +    }
791  
792         if (pf_key_v2_msg_add(update, (struct sadb_ext *)&ssa, 0) == -1)
793                 goto cleanup;
794 @@ -1395,10 +1437,6 @@
795         /*
796          * Setup the ADDRESS extensions.
797           */
798 -       if (incoming)
799 -               sa->transport->vtbl->get_dst(sa->transport, &src);
800 -       else
801 -               sa->transport->vtbl->get_src(sa->transport, &src);
802         len = sizeof *addr + PF_KEY_V2_ROUND(sysdep_sa_len(src));
803         addr = calloc(1, len);
804         if (!addr)
805 @@ -2167,7 +2205,7 @@
806                 pf_key_v2_msg_free(ret);
807         return -1;
808  
809 -#elif defined (SADB_X_SPDADD) && defined (SADB_X_SPDDELETE)
810 +#elif defined (SADB_X_SPDUPDATE) && defined (SADB_X_SPDDELETE)
811         struct sadb_msg msg;
812         struct sadb_x_policy *policy = 0;
813         struct sadb_x_ipsecrequest *ipsecrequest;
814 @@ -2181,7 +2219,7 @@
815         struct sockaddr_in *ip4_sa;
816         struct sockaddr_in6 *ip6_sa;
817  
818 -       msg.sadb_msg_type = delete ? SADB_X_SPDDELETE : SADB_X_SPDADD;
819 +       msg.sadb_msg_type = delete ? SADB_X_SPDDELETE : SADB_X_SPDUPDATE;
820         msg.sadb_msg_satype = SADB_SATYPE_UNSPEC;
821         msg.sadb_msg_seq = 0;
822         flow = pf_key_v2_msg_new(&msg, 0);
823 Index: isakmpd-20041012.orig/isakmp_num.cst
824 ===================================================================
825 --- isakmpd-20041012.orig.orig/isakmp_num.cst   2007-06-04 13:22:39.143904504 +0200
826 +++ isakmpd-20041012.orig/isakmp_num.cst        2007-06-04 13:22:39.287882616 +0200
827 @@ -57,15 +57,18 @@
828    KD                           17      # RFC 3547, Key Download
829    SEQ                          18      # RFC 3547, Sequence Number
830    POP                          19      # RFC 3547, Proof of possession
831 -  RESERVED_MIN                 20
832 +  NAT_D                                20      # RFC 3947, NAT Discovery payload
833 +  NAT_OA                       21      # RFC 3947, NAT Original Address payload
834 +  RESERVED_MIN                 22
835    RESERVED_MAX                 127
836    PRIVATE_MIN                  128
837  # XXX values from draft-ietf-ipsec-nat-t-ike-01,02,03. Later drafts specify
838  # XXX NAT_D as payload 15 and NAT_OA as 16, but these are allocated by RFC
839  # XXX 3547 as seen above.
840 -  NAT_D                                130     # NAT Discovery payload
841 -  NAT_OA                       131     # NAT Original Address payload
842 +  NAT_D_DRAFT                  130     # NAT Discovery payload
843 +  NAT_OA_DRAFT                 131     # NAT Original Address payload
844    PRIVATE_MAX                  255
845 +  MAX                          255
846  .
847  
848  # ISAKMP exchange types.
849 Index: isakmpd-20041012.orig/ipsec_num.cst
850 ===================================================================
851 --- isakmpd-20041012.orig.orig/ipsec_num.cst    2007-06-04 13:22:39.149903592 +0200
852 +++ isakmpd-20041012.orig/ipsec_num.cst 2007-06-04 13:22:39.287882616 +0200
853 @@ -62,10 +62,10 @@
854  IPSEC_ENCAP
855    TUNNEL                               1
856    TRANSPORT                            2
857 -  FUTURE_UDP_ENCAP_TUNNEL              3       # XXX Not yet assigned
858 -  FUTURE_UDP_ENCAP_TRANSPORT           4       # XXX Not yet assigned
859 -  UDP_ENCAP_TUNNEL                     61443   # draft-ietf-ipsec-nat-t-ike
860 -  UDP_ENCAP_TRANSPORT                  61443   # draft-ietf-ipsec-nat-t-ike
861 +  UDP_ENCAP_TUNNEL                     3
862 +  UDP_ENCAP_TRANSPORT                  4
863 +  UDP_ENCAP_TUNNEL_DRAFT               61443   # draft-ietf-ipsec-nat-t-ike
864 +  UDP_ENCAP_TRANSPORT_DRAFT            61443   # draft-ietf-ipsec-nat-t-ike
865  .
866  
867  # IPSEC authentication algorithm.
868 Index: isakmpd-20041012.orig/nat_traversal.h
869 ===================================================================
870 --- isakmpd-20041012.orig.orig/nat_traversal.h  2007-06-04 13:22:39.154902832 +0200
871 +++ isakmpd-20041012.orig/nat_traversal.h       2007-06-04 13:22:39.287882616 +0200
872 @@ -1,4 +1,4 @@
873 -/*     $OpenBSD: nat_traversal.h,v 1.2 2004/06/21 23:27:10 ho Exp $    */
874 +/*     $OpenBSD: nat_traversal.h,v 1.4 2005/07/25 15:03:47 hshoexer Exp $      */
875  
876  /*
877   * Copyright (c) 2004 HÃ¥kan Olsson.  All rights reserved.
878 @@ -27,6 +27,24 @@
879  #ifndef _NAT_TRAVERSAL_H_
880  #define _NAT_TRAVERSAL_H_
881  
882 +#define VID_DRAFT_V2   0
883 +#define VID_DRAFT_V2_N 1
884 +#define VID_DRAFT_V3   2
885 +#define VID_RFC3947    3
886 +
887 +struct nat_t_cap {
888 +       int              id;
889 +       u_int32_t        flags;
890 +       const char      *text;
891 +       char            *hash;
892 +       size_t           hashsize;
893 +};
894 +
895 +/*
896 + * Set if -T is given on the command line to disable NAT-T support.
897 + */
898 +extern int     disable_nat_t;
899 +
900  void   nat_t_init(void);
901  int    nat_t_add_vendor_payloads(struct message *);
902  void   nat_t_check_vendor_payload(struct message *, struct payload *);
903 Index: isakmpd-20041012.orig/message.c
904 ===================================================================
905 --- isakmpd-20041012.orig.orig/message.c        2007-06-04 13:22:39.160901920 +0200
906 +++ isakmpd-20041012.orig/message.c     2007-06-04 13:22:39.288882464 +0200
907 @@ -112,6 +112,7 @@
908         message_validate_hash, message_validate_sig, message_validate_nonce,
909         message_validate_notify, message_validate_delete,
910         message_validate_vendor, message_validate_attribute,
911 +       message_validate_nat_d, message_validate_nat_oa,
912         message_validate_nat_d, message_validate_nat_oa
913  };
914  
915 @@ -120,7 +121,7 @@
916         isakmp_id_fld, isakmp_cert_fld, isakmp_certreq_fld, isakmp_hash_fld,
917         isakmp_sig_fld, isakmp_nonce_fld, isakmp_notify_fld, isakmp_delete_fld,
918         isakmp_vendor_fld, isakmp_attribute_fld, isakmp_nat_d_fld,
919 -       isakmp_nat_oa_fld
920 +       isakmp_nat_oa_fld, isakmp_nat_d_fld, isakmp_nat_oa_fld
921  };
922  
923  /*
924 @@ -138,7 +139,8 @@
925         ISAKMP_PAYLOAD_SAK, ISAKMP_PAYLOAD_SAT, ISAKMP_PAYLOAD_KD,
926         ISAKMP_PAYLOAD_SEQ, ISAKMP_PAYLOAD_POP
927  #endif
928 -       ISAKMP_PAYLOAD_NAT_D, ISAKMP_PAYLOAD_NAT_OA
929 +       ISAKMP_PAYLOAD_NAT_D, ISAKMP_PAYLOAD_NAT_OA, 
930 +       ISAKMP_PAYLOAD_NAT_D_DRAFT, ISAKMP_PAYLOAD_NAT_OA_DRAFT
931  };
932  
933  static u_int8_t payload_map[256];
934 @@ -347,8 +349,8 @@
935                 }
936                 /* Ignore most private payloads.  */
937                 if (next >= ISAKMP_PAYLOAD_PRIVATE_MIN &&
938 -                   next != ISAKMP_PAYLOAD_NAT_D &&
939 -                   next != ISAKMP_PAYLOAD_NAT_OA) {
940 +                   next != ISAKMP_PAYLOAD_NAT_D_DRAFT &&
941 +                   next != ISAKMP_PAYLOAD_NAT_OA_DRAFT) {
942                         LOG_DBG((LOG_MESSAGE, 30, "message_parse_payloads: "
943                             "private next payload type %s in payload of "
944                             "type %d ignored",
945 @@ -460,8 +462,10 @@
946                 return ISAKMP_ATTRIBUTE_SZ;
947  #if defined (USE_NAT_TRAVERSAL)
948         case ISAKMP_PAYLOAD_NAT_D:
949 +       case ISAKMP_PAYLOAD_NAT_D_DRAFT:
950                 return ISAKMP_NAT_D_SZ;
951         case ISAKMP_PAYLOAD_NAT_OA:
952 +       case ISAKMP_PAYLOAD_NAT_OA_DRAFT:
953                 return ISAKMP_NAT_OA_SZ;
954  #endif
955         /* Not yet supported and any other unknown payloads. */
956 Index: isakmpd-20041012.orig/policy.c
957 ===================================================================
958 --- isakmpd-20041012.orig.orig/policy.c 2007-06-04 13:22:39.165901160 +0200
959 +++ isakmpd-20041012.orig/policy.c      2007-06-04 13:22:39.289882312 +0200
960 @@ -511,7 +511,10 @@
961                                                         break;
962                                                 }
963  #if defined (USE_NAT_TRAVERSAL)
964 -                                       else if (decode_16(value) == IPSEC_ENCAP_UDP_ENCAP_TUNNEL)
965 +                                       else if (decode_16(value) ==
966 +                                           IPSEC_ENCAP_UDP_ENCAP_TUNNEL ||
967 +                                           decode_16(value) ==
968 +                                           IPSEC_ENCAP_UDP_ENCAP_TUNNEL_DRAFT)
969                                                 switch (proto->proto) {
970                                                 case IPSEC_PROTO_IPSEC_AH:
971                                                         ah_encapsulation = "udp-encap-tunnel";
972 @@ -1932,7 +1935,7 @@
973  void
974  policy_init(void)
975  {
976 -       char           *ptr, *policy_file;
977 +       char           *ptr, *policy_file, *use_keynote;
978         char          **asserts;
979         size_t          sz, len;
980         int             fd, i;
981 @@ -1940,10 +1943,11 @@
982         LOG_DBG((LOG_POLICY, 30, "policy_init: initializing"));
983  
984         /* Do we want to use the policy modules?  */
985 -       if (ignore_policy ||
986 -           strncmp("yes", conf_get_str("General", "Use-Keynote"), 3))
987 -               return;
988 -
989 +       use_keynote = conf_get_str("General", "Use-Keynote");
990 +       if (ignore_policy || 
991 +               (use_keynote && strncmp("yes", use_keynote, 3)))
992 +                return;
993
994         /* Get policy file from configuration.  */
995         policy_file = conf_get_str("General", "Policy-file");
996         if (!policy_file)
997 Index: isakmpd-20041012.orig/ike_phase_1.c
998 ===================================================================
999 --- isakmpd-20041012.orig.orig/ike_phase_1.c    2007-06-04 13:22:39.170900400 +0200
1000 +++ isakmpd-20041012.orig/ike_phase_1.c 2007-06-04 13:22:39.290882160 +0200
1001 @@ -1040,9 +1040,9 @@
1002  
1003                 /* Compare expected/desired and received remote ID */
1004                 if (bcmp(rid, payload->p + ISAKMP_ID_DATA_OFF, sz)) {
1005 -                       free(rid);
1006                         log_print("ike_phase_1_recv_ID: "
1007 -                           "received remote ID other than expected %s", p);
1008 +                           "received remote ID other than expected %s - %s", p, payload->p);
1009 +                       free(rid);
1010                         return -1;
1011                 }
1012                 free(rid);
1013 Index: isakmpd-20041012.orig/x509.c
1014 ===================================================================
1015 --- isakmpd-20041012.orig.orig/x509.c   2007-06-04 13:22:39.176899488 +0200
1016 +++ isakmpd-20041012.orig/x509.c        2007-06-04 13:22:39.290882160 +0200
1017 @@ -910,7 +910,11 @@
1018         X509_STORE_CTX_init(&csc, x509_cas, cert, NULL);
1019  #if OPENSSL_VERSION_NUMBER >= 0x00907000L
1020         /* XXX See comment in x509_read_crls_from_dir.  */
1021 +#if OPENSSL_VERSION_NUMBER >= 0x00908000L
1022 +       if (x509_cas->param->flags & X509_V_FLAG_CRL_CHECK) {
1023 +#else
1024         if (x509_cas->flags & X509_V_FLAG_CRL_CHECK) {
1025 +#endif
1026                 X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK);
1027                 X509_STORE_CTX_set_flags(&csc, X509_V_FLAG_CRL_CHECK_ALL);
1028         }
1029 Index: isakmpd-20041012.orig/sysdep/linux/sysdep.c
1030 ===================================================================
1031 --- isakmpd-20041012.orig.orig/sysdep/linux/sysdep.c    2007-06-04 13:22:39.182898576 +0200
1032 +++ isakmpd-20041012.orig/sysdep/linux/sysdep.c 2007-06-04 13:22:39.291882008 +0200
1033 @@ -169,22 +169,22 @@
1034      return 0;
1035  
1036    if (!(af == AF_INET || af == AF_INET6))
1037 -    {
1038 +    { 
1039        log_print ("sysdep_cleartext: unsupported protocol family %d", af);
1040        return -1;
1041      }
1042  
1043    if (setsockopt (fd, af == AF_INET ? IPPROTO_IP : IPPROTO_IPV6,
1044 -                 af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
1045 -                 &pol_in, sizeof pol_in) < 0 ||
1046 +          af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
1047 +          &pol_in, sizeof pol_in) < 0 ||
1048        setsockopt (fd, af == AF_INET ? IPPROTO_IP : IPPROTO_IPV6,
1049 -                 af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
1050 -                 &pol_out, sizeof pol_out) < 0)
1051 -    {
1052 +          af == AF_INET ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY,
1053 +          &pol_out, sizeof pol_out) < 0)
1054 +    { 
1055        log_error ("sysdep_cleartext: "
1056 -                "setsockopt (%d, IPPROTO_IP%s, IP%s_IPSEC_POLICY, ...) "
1057 -                "failed", fd, af == AF_INET ? "" : "V6",
1058 -                af == AF_INET ? "" : "V6");
1059 +         "setsockopt (%d, IPPROTO_IP%s, IP%s_IPSEC_POLICY, ...) "
1060 +         "failed", fd, af == AF_INET ? "" : "V6",
1061 +         af == AF_INET ? "" : "V6");
1062        return -1;
1063      }
1064    return 0;
1065 Index: isakmpd-20041012.orig/sysdep/linux/GNUmakefile.sysdep
1066 ===================================================================
1067 --- isakmpd-20041012.orig.orig/sysdep/linux/GNUmakefile.sysdep  2007-06-04 13:22:39.187897816 +0200
1068 +++ isakmpd-20041012.orig/sysdep/linux/GNUmakefile.sysdep       2007-06-04 13:22:39.291882008 +0200
1069 @@ -33,13 +33,13 @@
1070  LDADD+=                -lgmp ${LIBSYSDEP} ${LIBCRYPTO}
1071  DPADD+=                ${LIBGMP} ${LIBSYSDEP}
1072  
1073 -CFLAGS+=       -DUSE_OLD_SOCKADDR -DHAVE_PCAP \
1074 -               -DNEED_SYSDEP_APP -DMP_FLAVOUR=MP_FLAVOUR_GMP \
1075 -               -I/usr/src/linux/include -I${.CURDIR}/sysdep/common \
1076 +CFLAGS+=       -DHAVE_GETNAMEINFO -DUSE_OLD_SOCKADDR -DHAVE_PCAP \
1077 +               -DNEED_SYSDEP_APP -DMP_FLAVOUR=MP_FLAVOUR_GMP -DUSE_AES \
1078 +               -I${.CURDIR}/sysdep/linux/include -I${.CURDIR}/sysdep/common \
1079                 -I/usr/include/openssl
1080  
1081  FEATURES=      debug tripledes blowfish cast ec aggressive x509 policy
1082 -FEATURES+=     des aes
1083 +FEATURES+=     dpd nat_traversal isakmp_cfg des aes
1084  
1085  IPSEC_SRCS=    pf_key_v2.c
1086  IPSEC_CFLAGS=  -DUSE_PF_KEY_V2
1087 @@ -51,7 +51,7 @@
1088  # hack libsysdep.a dependenc
1089  ${LIBSYSDEPDIR}/.depend ${LIBSYSDEP}:
1090         cd ${LIBSYSDEPDIR} && \
1091 -               ${MAKE} --no-print-directory ${MAKEFLAGS} \
1092 +               ${MAKE} --no-print-directory \
1093                         CFLAGS="${CFLAGS}" MKDEP="${MKDEP}" ${MAKECMDGOALS}
1094  
1095  ifeq ($(findstring clean,$(MAKECMDGOALS)),clean)
1096 Index: isakmpd-20041012.orig/sysdep/linux/include/bitstring.h
1097 ===================================================================
1098 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
1099 +++ isakmpd-20041012.orig/sysdep/linux/include/bitstring.h      2007-06-04 13:22:39.291882008 +0200
1100 @@ -0,0 +1,132 @@
1101 +/*     $OpenBSD: bitstring.h,v 1.4 2002/06/19 02:50:10 millert Exp $   */
1102 +/*     $NetBSD: bitstring.h,v 1.5 1997/05/14 15:49:55 pk Exp $ */
1103 +
1104 +/*
1105 + * Copyright (c) 1989, 1993
1106 + *     The Regents of the University of California.  All rights reserved.
1107 + *
1108 + * This code is derived from software contributed to Berkeley by
1109 + * Paul Vixie.
1110 + *
1111 + * Redistribution and use in source and binary forms, with or without
1112 + * modification, are permitted provided that the following conditions
1113 + * are met:
1114 + * 1. Redistributions of source code must retain the above copyright
1115 + *    notice, this list of conditions and the following disclaimer.
1116 + * 2. Redistributions in binary form must reproduce the above copyright
1117 + *    notice, this list of conditions and the following disclaimer in the
1118 + *    documentation and/or other materials provided with the distribution.
1119 + * 3. All advertising materials mentioning features or use of this software
1120 + *    must display the following acknowledgement:
1121 + *     This product includes software developed by the University of
1122 + *     California, Berkeley and its contributors.
1123 + * 4. Neither the name of the University nor the names of its contributors
1124 + *    may be used to endorse or promote products derived from this software
1125 + *    without specific prior written permission.
1126 + *
1127 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1128 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1129 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1130 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1131 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1132 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1133 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1134 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1135 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1136 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1137 + * SUCH DAMAGE.
1138 + *
1139 + *     @(#)bitstring.h 8.1 (Berkeley) 7/19/93
1140 + */
1141 +
1142 +#ifndef _BITSTRING_H_
1143 +#define        _BITSTRING_H_
1144 +
1145 +/* modified for SV/AT and bitstring bugfix by M.R.Murphy, 11oct91
1146 + * bitstr_size changed gratuitously, but shorter
1147 + * bit_alloc   spelling error fixed
1148 + * the following were efficient, but didn't work, they've been made to
1149 + * work, but are no longer as efficient :-)
1150 + * bit_nclear, bit_nset, bit_ffc, bit_ffs
1151 + */
1152 +typedef        unsigned char bitstr_t;
1153 +
1154 +/* internal macros */
1155 +                               /* byte of the bitstring bit is in */
1156 +#define        _bit_byte(bit) \
1157 +       ((bit) >> 3)
1158 +
1159 +                               /* mask for the bit within its byte */
1160 +#define        _bit_mask(bit) \
1161 +       (1 << ((bit)&0x7))
1162 +
1163 +/* external macros */
1164 +                               /* bytes in a bitstring of nbits bits */
1165 +#define        bitstr_size(nbits) \
1166 +       (((nbits) + 7) >> 3)
1167 +
1168 +                               /* allocate a bitstring */
1169 +#define        bit_alloc(nbits) \
1170 +       (bitstr_t *)calloc((size_t)bitstr_size(nbits), sizeof(bitstr_t))
1171 +
1172 +                               /* allocate a bitstring on the stack */
1173 +#define        bit_decl(name, nbits) \
1174 +       ((name)[bitstr_size(nbits)])
1175 +
1176 +                               /* is bit N of bitstring name set? */
1177 +#define        bit_test(name, bit) \
1178 +       ((name)[_bit_byte(bit)] & _bit_mask(bit))
1179 +
1180 +                               /* set bit N of bitstring name */
1181 +#define        bit_set(name, bit) \
1182 +       ((name)[_bit_byte(bit)] |= _bit_mask(bit))
1183 +
1184 +                               /* clear bit N of bitstring name */
1185 +#define        bit_clear(name, bit) \
1186 +       ((name)[_bit_byte(bit)] &= ~_bit_mask(bit))
1187 +
1188 +                               /* clear bits start ... stop in bitstring */
1189 +#define        bit_nclear(name, start, stop) do { \
1190 +       register bitstr_t *_name = name; \
1191 +       register int _start = start, _stop = stop; \
1192 +       while (_start <= _stop) { \
1193 +               bit_clear(_name, _start); \
1194 +               _start++; \
1195 +               } \
1196 +} while(0)
1197 +
1198 +                               /* set bits start ... stop in bitstring */
1199 +#define        bit_nset(name, start, stop) do { \
1200 +       register bitstr_t *_name = name; \
1201 +       register int _start = start, _stop = stop; \
1202 +       while (_start <= _stop) { \
1203 +               bit_set(_name, _start); \
1204 +               _start++; \
1205 +               } \
1206 +} while(0)
1207 +
1208 +                               /* find first bit clear in name */
1209 +#define        bit_ffc(name, nbits, value) do { \
1210 +       register bitstr_t *_name = name; \
1211 +       register int _bit, _nbits = nbits, _value = -1; \
1212 +       for (_bit = 0; _bit < _nbits; ++_bit) \
1213 +               if (!bit_test(_name, _bit)) { \
1214 +                       _value = _bit; \
1215 +                       break; \
1216 +               } \
1217 +       *(value) = _value; \
1218 +} while(0)
1219 +
1220 +                               /* find first bit set in name */
1221 +#define        bit_ffs(name, nbits, value) do { \
1222 +       register bitstr_t *_name = name; \
1223 +       register int _bit, _nbits = nbits, _value = -1; \
1224 +       for (_bit = 0; _bit < _nbits; ++_bit) \
1225 +               if (bit_test(_name, _bit)) { \
1226 +                       _value = _bit; \
1227 +                       break; \
1228 +               } \
1229 +       *(value) = _value; \
1230 +} while(0)
1231 +
1232 +#endif /* !_BITSTRING_H_ */
1233 Index: isakmpd-20041012.orig/sysdep/linux/include/sys/queue.h
1234 ===================================================================
1235 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
1236 +++ isakmpd-20041012.orig/sysdep/linux/include/sys/queue.h      2007-06-04 13:22:39.292881856 +0200
1237 @@ -0,0 +1,453 @@
1238 +/*
1239 + * Copyright (c) 1991, 1993
1240 + *     The Regents of the University of California.  All rights reserved.
1241 + *
1242 + * Redistribution and use in source and binary forms, with or without
1243 + * modification, are permitted provided that the following conditions
1244 + * are met:
1245 + * 1. Redistributions of source code must retain the above copyright
1246 + *    notice, this list of conditions and the following disclaimer.
1247 + * 2. Redistributions in binary form must reproduce the above copyright
1248 + *    notice, this list of conditions and the following disclaimer in the
1249 + *    documentation and/or other materials provided with the distribution.
1250 + * 3. All advertising materials mentioning features or use of this software
1251 + *    must display the following acknowledgement:
1252 + *     This product includes software developed by the University of
1253 + *     California, Berkeley and its contributors.
1254 + * 4. Neither the name of the University nor the names of its contributors
1255 + *    may be used to endorse or promote products derived from this software
1256 + *    without specific prior written permission.
1257 + *
1258 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1259 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1260 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1261 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1262 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1263 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1264 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1265 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1266 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1267 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1268 + * SUCH DAMAGE.
1269 + *
1270 + *     @(#)queue.h     8.5 (Berkeley) 8/20/94
1271 + * $FreeBSD: src/sys/sys/queue.h,v 1.45 2001/12/11 11:49:58 sheldonh Exp $
1272 + */
1273 +
1274 +#ifndef _SYS_QUEUE_H_
1275 +#define        _SYS_QUEUE_H_
1276 +
1277 +//#include <machine/ansi.h>    /* for __offsetof */
1278 +
1279 +/*
1280 + * This file defines four types of data structures: singly-linked lists,
1281 + * singly-linked tail queues, lists and tail queues.
1282 + *
1283 + * A singly-linked list is headed by a single forward pointer. The elements
1284 + * are singly linked for minimum space and pointer manipulation overhead at
1285 + * the expense of O(n) removal for arbitrary elements. New elements can be
1286 + * added to the list after an existing element or at the head of the list.
1287 + * Elements being removed from the head of the list should use the explicit
1288 + * macro for this purpose for optimum efficiency. A singly-linked list may
1289 + * only be traversed in the forward direction.  Singly-linked lists are ideal
1290 + * for applications with large datasets and few or no removals or for
1291 + * implementing a LIFO queue.
1292 + *
1293 + * A singly-linked tail queue is headed by a pair of pointers, one to the
1294 + * head of the list and the other to the tail of the list. The elements are
1295 + * singly linked for minimum space and pointer manipulation overhead at the
1296 + * expense of O(n) removal for arbitrary elements. New elements can be added
1297 + * to the list after an existing element, at the head of the list, or at the
1298 + * end of the list. Elements being removed from the head of the tail queue
1299 + * should use the explicit macro for this purpose for optimum efficiency.
1300 + * A singly-linked tail queue may only be traversed in the forward direction.
1301 + * Singly-linked tail queues are ideal for applications with large datasets
1302 + * and few or no removals or for implementing a FIFO queue.
1303 + *
1304 + * A list is headed by a single forward pointer (or an array of forward
1305 + * pointers for a hash table header). The elements are doubly linked
1306 + * so that an arbitrary element can be removed without a need to
1307 + * traverse the list. New elements can be added to the list before
1308 + * or after an existing element or at the head of the list. A list
1309 + * may only be traversed in the forward direction.
1310 + *
1311 + * A tail queue is headed by a pair of pointers, one to the head of the
1312 + * list and the other to the tail of the list. The elements are doubly
1313 + * linked so that an arbitrary element can be removed without a need to
1314 + * traverse the list. New elements can be added to the list before or
1315 + * after an existing element, at the head of the list, or at the end of
1316 + * the list. A tail queue may be traversed in either direction.
1317 + *
1318 + * For details on the use of these macros, see the queue(3) manual page.
1319 + *
1320 + *
1321 + *                     SLIST   LIST    STAILQ  TAILQ
1322 + * _HEAD               +       +       +       +
1323 + * _HEAD_INITIALIZER   +       +       +       +
1324 + * _ENTRY              +       +       +       +
1325 + * _INIT               +       +       +       +
1326 + * _EMPTY              +       +       +       +
1327 + * _FIRST              +       +       +       +
1328 + * _NEXT               +       +       +       +
1329 + * _PREV               -       -       -       +
1330 + * _LAST               -       -       +       +
1331 + * _FOREACH            +       +       +       +
1332 + * _FOREACH_REVERSE    -       -       -       +
1333 + * _INSERT_HEAD                +       +       +       +
1334 + * _INSERT_BEFORE      -       +       -       +
1335 + * _INSERT_AFTER       +       +       +       +
1336 + * _INSERT_TAIL                -       -       +       +
1337 + * _REMOVE_HEAD                +       -       +       -
1338 + * _REMOVE             +       +       +       +
1339 + *
1340 + */
1341 +
1342 +/*
1343 + * Singly-linked List declarations.
1344 + */
1345 +#define        SLIST_HEAD(name, type)                                          \
1346 +struct name {                                                          \
1347 +       struct type *slh_first; /* first element */                     \
1348 +}
1349 +
1350 +#define        SLIST_HEAD_INITIALIZER(head)                                    \
1351 +       { NULL }
1352
1353 +#define        SLIST_ENTRY(type)                                               \
1354 +struct {                                                               \
1355 +       struct type *sle_next;  /* next element */                      \
1356 +}
1357
1358 +/*
1359 + * Singly-linked List functions.
1360 + */
1361 +#define        SLIST_EMPTY(head)       ((head)->slh_first == NULL)
1362 +
1363 +#define        SLIST_FIRST(head)       ((head)->slh_first)
1364 +
1365 +#define        SLIST_FOREACH(var, head, field)                                 \
1366 +       for ((var) = SLIST_FIRST((head));                               \
1367 +           (var);                                                      \
1368 +           (var) = SLIST_NEXT((var), field))
1369 +
1370 +#define        SLIST_INIT(head) do {                                           \
1371 +       SLIST_FIRST((head)) = NULL;                                     \
1372 +} while (0)
1373 +
1374 +#define        SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \
1375 +       SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);       \
1376 +       SLIST_NEXT((slistelm), field) = (elm);                          \
1377 +} while (0)
1378 +
1379 +#define        SLIST_INSERT_HEAD(head, elm, field) do {                        \
1380 +       SLIST_NEXT((elm), field) = SLIST_FIRST((head));                 \
1381 +       SLIST_FIRST((head)) = (elm);                                    \
1382 +} while (0)
1383 +
1384 +#define        SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
1385 +
1386 +#define        SLIST_REMOVE(head, elm, type, field) do {                       \
1387 +       if (SLIST_FIRST((head)) == (elm)) {                             \
1388 +               SLIST_REMOVE_HEAD((head), field);                       \
1389 +       }                                                               \
1390 +       else {                                                          \
1391 +               struct type *curelm = SLIST_FIRST((head));              \
1392 +               while (SLIST_NEXT(curelm, field) != (elm))              \
1393 +                       curelm = SLIST_NEXT(curelm, field);             \
1394 +               SLIST_NEXT(curelm, field) =                             \
1395 +                   SLIST_NEXT(SLIST_NEXT(curelm, field), field);       \
1396 +       }                                                               \
1397 +} while (0)
1398 +
1399 +#define        SLIST_REMOVE_HEAD(head, field) do {                             \
1400 +       SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);   \
1401 +} while (0)
1402 +
1403 +/*
1404 + * Singly-linked Tail queue declarations.
1405 + */
1406 +#define        STAILQ_HEAD(name, type)                                         \
1407 +struct name {                                                          \
1408 +       struct type *stqh_first;/* first element */                     \
1409 +       struct type **stqh_last;/* addr of last next element */         \
1410 +}
1411 +
1412 +#define        STAILQ_HEAD_INITIALIZER(head)                                   \
1413 +       { NULL, &(head).stqh_first }
1414 +
1415 +#define        STAILQ_ENTRY(type)                                              \
1416 +struct {                                                               \
1417 +       struct type *stqe_next; /* next element */                      \
1418 +}
1419 +
1420 +/*
1421 + * Singly-linked Tail queue functions.
1422 + */
1423 +#define        STAILQ_EMPTY(head)      ((head)->stqh_first == NULL)
1424 +
1425 +#define        STAILQ_FIRST(head)      ((head)->stqh_first)
1426 +
1427 +#define        STAILQ_FOREACH(var, head, field)                                \
1428 +       for((var) = STAILQ_FIRST((head));                               \
1429 +          (var);                                                       \
1430 +          (var) = STAILQ_NEXT((var), field))
1431 +
1432 +#define        STAILQ_INIT(head) do {                                          \
1433 +       STAILQ_FIRST((head)) = NULL;                                    \
1434 +       (head)->stqh_last = &STAILQ_FIRST((head));                      \
1435 +} while (0)
1436 +
1437 +#define        STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {               \
1438 +       if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
1439 +               (head)->stqh_last = &STAILQ_NEXT((elm), field);         \
1440 +       STAILQ_NEXT((tqelm), field) = (elm);                            \
1441 +} while (0)
1442 +
1443 +#define        STAILQ_INSERT_HEAD(head, elm, field) do {                       \
1444 +       if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \
1445 +               (head)->stqh_last = &STAILQ_NEXT((elm), field);         \
1446 +       STAILQ_FIRST((head)) = (elm);                                   \
1447 +} while (0)
1448 +
1449 +#define        STAILQ_INSERT_TAIL(head, elm, field) do {                       \
1450 +       STAILQ_NEXT((elm), field) = NULL;                               \
1451 +       *(head)->stqh_last = (elm);                                     \
1452 +       (head)->stqh_last = &STAILQ_NEXT((elm), field);                 \
1453 +} while (0)
1454 +
1455 +#define        STAILQ_LAST(head, type, field)                                  \
1456 +       (STAILQ_EMPTY(head) ?                                           \
1457 +               NULL :                                                  \
1458 +               ((struct type *)                                        \
1459 +               ((char *)((head)->stqh_last) - __offsetof(struct type, field))))
1460 +
1461 +#define        STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
1462 +
1463 +#define        STAILQ_REMOVE(head, elm, type, field) do {                      \
1464 +       if (STAILQ_FIRST((head)) == (elm)) {                            \
1465 +               STAILQ_REMOVE_HEAD(head, field);                        \
1466 +       }                                                               \
1467 +       else {                                                          \
1468 +               struct type *curelm = STAILQ_FIRST((head));             \
1469 +               while (STAILQ_NEXT(curelm, field) != (elm))             \
1470 +                       curelm = STAILQ_NEXT(curelm, field);            \
1471 +               if ((STAILQ_NEXT(curelm, field) =                       \
1472 +                    STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\
1473 +                       (head)->stqh_last = &STAILQ_NEXT((curelm), field);\
1474 +       }                                                               \
1475 +} while (0)
1476 +
1477 +#define        STAILQ_REMOVE_HEAD(head, field) do {                            \
1478 +       if ((STAILQ_FIRST((head)) =                                     \
1479 +            STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)         \
1480 +               (head)->stqh_last = &STAILQ_FIRST((head));              \
1481 +} while (0)
1482 +
1483 +#define        STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {                 \
1484 +       if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \
1485 +               (head)->stqh_last = &STAILQ_FIRST((head));              \
1486 +} while (0)
1487 +
1488 +/*
1489 + * List declarations.
1490 + */
1491 +#define        LIST_HEAD(name, type)                                           \
1492 +struct name {                                                          \
1493 +       struct type *lh_first;  /* first element */                     \
1494 +}
1495 +
1496 +#define        LIST_HEAD_INITIALIZER(head)                                     \
1497 +       { NULL }
1498 +
1499 +#define        LIST_ENTRY(type)                                                \
1500 +struct {                                                               \
1501 +       struct type *le_next;   /* next element */                      \
1502 +       struct type **le_prev;  /* address of previous next element */  \
1503 +}
1504 +
1505 +/*
1506 + * List functions.
1507 + */
1508 +
1509 +#define        LIST_EMPTY(head)        ((head)->lh_first == NULL)
1510 +
1511 +#define        LIST_FIRST(head)        ((head)->lh_first)
1512 +
1513 +#define        LIST_FOREACH(var, head, field)                                  \
1514 +       for ((var) = LIST_FIRST((head));                                \
1515 +           (var);                                                      \
1516 +           (var) = LIST_NEXT((var), field))
1517 +
1518 +#define        LIST_INIT(head) do {                                            \
1519 +       LIST_FIRST((head)) = NULL;                                      \
1520 +} while (0)
1521 +
1522 +#define        LIST_INSERT_AFTER(listelm, elm, field) do {                     \
1523 +       if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
1524 +               LIST_NEXT((listelm), field)->field.le_prev =            \
1525 +                   &LIST_NEXT((elm), field);                           \
1526 +       LIST_NEXT((listelm), field) = (elm);                            \
1527 +       (elm)->field.le_prev = &LIST_NEXT((listelm), field);            \
1528 +} while (0)
1529 +
1530 +#define        LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
1531 +       (elm)->field.le_prev = (listelm)->field.le_prev;                \
1532 +       LIST_NEXT((elm), field) = (listelm);                            \
1533 +       *(listelm)->field.le_prev = (elm);                              \
1534 +       (listelm)->field.le_prev = &LIST_NEXT((elm), field);            \
1535 +} while (0)
1536 +
1537 +#define        LIST_INSERT_HEAD(head, elm, field) do {                         \
1538 +       if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)     \
1539 +               LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
1540 +       LIST_FIRST((head)) = (elm);                                     \
1541 +       (elm)->field.le_prev = &LIST_FIRST((head));                     \
1542 +} while (0)
1543 +
1544 +#define        LIST_NEXT(elm, field)   ((elm)->field.le_next)
1545 +
1546 +#define        LIST_REMOVE(elm, field) do {                                    \
1547 +       if (LIST_NEXT((elm), field) != NULL)                            \
1548 +               LIST_NEXT((elm), field)->field.le_prev =                \
1549 +                   (elm)->field.le_prev;                               \
1550 +       *(elm)->field.le_prev = LIST_NEXT((elm), field);                \
1551 +} while (0)
1552 +
1553 +/*
1554 + * Tail queue declarations.
1555 + */
1556 +#define        TAILQ_HEAD(name, type)                                          \
1557 +struct name {                                                          \
1558 +       struct type *tqh_first; /* first element */                     \
1559 +       struct type **tqh_last; /* addr of last next element */         \
1560 +}
1561 +
1562 +#define        TAILQ_HEAD_INITIALIZER(head)                                    \
1563 +       { NULL, &(head).tqh_first }
1564 +
1565 +#define        TAILQ_ENTRY(type)                                               \
1566 +struct {                                                               \
1567 +       struct type *tqe_next;  /* next element */                      \
1568 +       struct type **tqe_prev; /* address of previous next element */  \
1569 +}
1570 +
1571 +/*
1572 + * Tail queue functions.
1573 + */
1574 +#define        TAILQ_EMPTY(head)       ((head)->tqh_first == NULL)
1575 +
1576 +#define        TAILQ_FIRST(head)       ((head)->tqh_first)
1577 +
1578 +#define        TAILQ_FOREACH(var, head, field)                                 \
1579 +       for ((var) = TAILQ_FIRST((head));                               \
1580 +           (var);                                                      \
1581 +           (var) = TAILQ_NEXT((var), field))
1582 +
1583 +#define        TAILQ_FOREACH_REVERSE(var, head, headname, field)               \
1584 +       for ((var) = TAILQ_LAST((head), headname);                      \
1585 +           (var);                                                      \
1586 +           (var) = TAILQ_PREV((var), headname, field))
1587 +
1588 +#define        TAILQ_INIT(head) do {                                           \
1589 +       TAILQ_FIRST((head)) = NULL;                                     \
1590 +       (head)->tqh_last = &TAILQ_FIRST((head));                        \
1591 +} while (0)
1592 +
1593 +#define        TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \
1594 +       if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
1595 +               TAILQ_NEXT((elm), field)->field.tqe_prev =              \
1596 +                   &TAILQ_NEXT((elm), field);                          \
1597 +       else                                                            \
1598 +               (head)->tqh_last = &TAILQ_NEXT((elm), field);           \
1599 +       TAILQ_NEXT((listelm), field) = (elm);                           \
1600 +       (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);          \
1601 +} while (0)
1602 +
1603 +#define        TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \
1604 +       (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \
1605 +       TAILQ_NEXT((elm), field) = (listelm);                           \
1606 +       *(listelm)->field.tqe_prev = (elm);                             \
1607 +       (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);          \
1608 +} while (0)
1609 +
1610 +#define        TAILQ_INSERT_HEAD(head, elm, field) do {                        \
1611 +       if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)   \
1612 +               TAILQ_FIRST((head))->field.tqe_prev =                   \
1613 +                   &TAILQ_NEXT((elm), field);                          \
1614 +       else                                                            \
1615 +               (head)->tqh_last = &TAILQ_NEXT((elm), field);           \
1616 +       TAILQ_FIRST((head)) = (elm);                                    \
1617 +       (elm)->field.tqe_prev = &TAILQ_FIRST((head));                   \
1618 +} while (0)
1619 +
1620 +#define        TAILQ_INSERT_TAIL(head, elm, field) do {                        \
1621 +       TAILQ_NEXT((elm), field) = NULL;                                \
1622 +       (elm)->field.tqe_prev = (head)->tqh_last;                       \
1623 +       *(head)->tqh_last = (elm);                                      \
1624 +       (head)->tqh_last = &TAILQ_NEXT((elm), field);                   \
1625 +} while (0)
1626 +
1627 +#define        TAILQ_LAST(head, headname)                                      \
1628 +       (*(((struct headname *)((head)->tqh_last))->tqh_last))
1629 +
1630 +#define        TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
1631 +
1632 +#define        TAILQ_PREV(elm, headname, field)                                \
1633 +       (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
1634 +
1635 +#define        TAILQ_REMOVE(head, elm, field) do {                             \
1636 +       if ((TAILQ_NEXT((elm), field)) != NULL)                         \
1637 +               TAILQ_NEXT((elm), field)->field.tqe_prev =              \
1638 +                   (elm)->field.tqe_prev;                              \
1639 +       else                                                            \
1640 +               (head)->tqh_last = (elm)->field.tqe_prev;               \
1641 +       *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);              \
1642 +} while (0)
1643 +
1644 +
1645 +#ifdef _KERNEL
1646 +
1647 +/*
1648 + * XXX insque() and remque() are an old way of handling certain queues.
1649 + * They bogusly assumes that all queue heads look alike.
1650 + */
1651 +
1652 +struct quehead {
1653 +       struct quehead *qh_link;
1654 +       struct quehead *qh_rlink;
1655 +};
1656 +
1657 +#ifdef __GNUC__
1658 +
1659 +static __inline void
1660 +insque(void *a, void *b)
1661 +{
1662 +       struct quehead *element = (struct quehead *)a,
1663 +                *head = (struct quehead *)b;
1664 +
1665 +       element->qh_link = head->qh_link;
1666 +       element->qh_rlink = head;
1667 +       head->qh_link = element;
1668 +       element->qh_link->qh_rlink = element;
1669 +}
1670 +
1671 +static __inline void
1672 +remque(void *a)
1673 +{
1674 +       struct quehead *element = (struct quehead *)a;
1675 +
1676 +       element->qh_link->qh_rlink = element->qh_rlink;
1677 +       element->qh_rlink->qh_link = element->qh_link;
1678 +       element->qh_rlink = 0;
1679 +}
1680 +
1681 +#else /* !__GNUC__ */
1682 +
1683 +void   insque __P((void *a, void *b));
1684 +void   remque __P((void *a));
1685 +
1686 +#endif /* __GNUC__ */
1687 +
1688 +#endif /* _KERNEL */
1689 +
1690 +#endif /* !_SYS_QUEUE_H_ */
1691 Index: isakmpd-20041012.orig/sysdep/common/pcap.h
1692 ===================================================================
1693 --- isakmpd-20041012.orig.orig/sysdep/common/pcap.h     2007-06-04 13:22:39.203895384 +0200
1694 +++ isakmpd-20041012.orig/sysdep/common/pcap.h  2007-06-04 13:22:39.292881856 +0200
1695 @@ -55,8 +55,13 @@
1696         u_int32_t linktype;     /* data link type (DLT_*) */
1697  };
1698  
1699 +struct pcap_timeval {
1700 +       int32_t tv_sec;         /* seconds */
1701 +       int32_t tv_usec;        /* microseconds */
1702 +};
1703 +
1704  struct pcap_pkthdr {
1705 -       struct timeval ts;      /* time stamp */
1706 +       struct pcap_timeval ts; /* time stamp */
1707         u_int32_t caplen;       /* length of portion present */
1708         u_int32_t len;          /* length this packet (off wire) */
1709  };
1710 Index: isakmpd-20041012.orig/sysdep/common/libsysdep/arc4random.c
1711 ===================================================================
1712 --- isakmpd-20041012.orig.orig/sysdep/common/libsysdep/arc4random.c     2007-06-04 13:22:39.211894168 +0200
1713 +++ isakmpd-20041012.orig/sysdep/common/libsysdep/arc4random.c  2007-06-04 13:22:39.292881856 +0200
1714 @@ -78,7 +78,7 @@
1715  static void
1716  arc4_stir(struct arc4_stream *as)
1717  {
1718 -       int     fd;
1719 +       int     fd, i;
1720         struct {
1721                 struct timeval tv;
1722                 u_int8_t rnd[128 - sizeof(struct timeval)];
1723 Index: isakmpd-20041012.orig/x509v3.cnf
1724 ===================================================================
1725 --- /dev/null   1970-01-01 00:00:00.000000000 +0000
1726 +++ isakmpd-20041012.orig/x509v3.cnf    2007-06-04 13:22:39.293881704 +0200
1727 @@ -0,0 +1,26 @@
1728 +# default settings
1729 +CERTPATHLEN             = 1
1730 +CERTUSAGE               = digitalSignature,keyCertSign
1731 +CERTIP                  = 0.0.0.0
1732 +CERTFQDN                = nohost.nodomain
1733 +
1734 +# This section should be referenced when building an x509v3 CA
1735 +# Certificate.
1736 +# The default path length and the key usage can be overriden
1737 +# modified by setting the CERTPATHLEN and CERTUSAGE environment 
1738 +# variables.
1739 +[x509v3_CA]
1740 +basicConstraints=critical,CA:true,pathlen:$ENV::CERTPATHLEN
1741 +keyUsage=$ENV::CERTUSAGE
1742 +
1743 +# This section should be referenced to add an IP Address
1744 +# as an alternate subject name, needed by isakmpd
1745 +# The address must be provided in the CERTIP environment variable
1746 +[x509v3_IPAddr]
1747 +subjectAltName=IP:$ENV::CERTIP
1748 +
1749 +# This section should be referenced to add a FQDN hostname
1750 +# as an alternate subject name, needed by isakmpd
1751 +# The address must be provided in the CERTFQDN environment variable
1752 +[x509v3_FQDN]
1753 +subjectAltName=DNS:$ENV::CERTFQDN