Annotation of embedaddon/ipsec-tools/src/racoon/isakmp.c, revision 1.1.1.1.2.1

1.1       misho       1: /*     $NetBSD: isakmp.c,v 1.71 2011/03/15 13:20:14 vanhu Exp $        */
                      2: 
                      3: /* Id: isakmp.c,v 1.74 2006/05/07 21:32:59 manubsd Exp */
                      4: 
                      5: /*
                      6:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. Neither the name of the project nor the names of its contributors
                     18:  *    may be used to endorse or promote products derived from this software
                     19:  *    without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
                     22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
                     25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     31:  * SUCH DAMAGE.
                     32:  */
                     33: 
                     34: #include "config.h"
                     35: 
                     36: #include <sys/types.h>
                     37: #include <sys/param.h>
                     38: #include <sys/socket.h>
                     39: #include <sys/queue.h>
                     40: 
                     41: #include <netinet/in.h>
                     42: #include <arpa/inet.h>
                     43: 
                     44: #include PATH_IPSEC_H
                     45: 
                     46: #include <stdlib.h>
                     47: #include <stdio.h>
                     48: #include <string.h>
                     49: #include <errno.h>
                     50: #if TIME_WITH_SYS_TIME
                     51: # include <sys/time.h>
                     52: # include <time.h>
                     53: #else
                     54: # if HAVE_SYS_TIME_H
                     55: #  include <sys/time.h>
                     56: # else
                     57: #  include <time.h>
                     58: # endif
                     59: #endif
                     60: #include <netdb.h>
                     61: #ifdef HAVE_UNISTD_H
                     62: #include <unistd.h>
                     63: #endif
                     64: #include <ctype.h>
                     65: #ifdef ENABLE_HYBRID
                     66: #include <resolv.h>
                     67: #endif
                     68: 
                     69: #include "var.h"
                     70: #include "misc.h"
                     71: #include "vmbuf.h"
                     72: #include "plog.h"
                     73: #include "sockmisc.h"
                     74: #include "schedule.h"
                     75: #include "session.h"
                     76: #include "debug.h"
                     77: 
                     78: #include "remoteconf.h"
                     79: #include "localconf.h"
                     80: #include "grabmyaddr.h"
                     81: #include "admin.h"
                     82: #include "privsep.h"
                     83: #include "isakmp_var.h"
                     84: #include "isakmp.h"
                     85: #include "oakley.h"
                     86: #include "evt.h"
                     87: #include "handler.h"
                     88: #include "ipsec_doi.h"
                     89: #include "pfkey.h"
                     90: #include "crypto_openssl.h"
                     91: #include "policy.h"
                     92: #include "algorithm.h"
                     93: #include "proposal.h"
                     94: #include "sainfo.h"
                     95: #include "isakmp_ident.h"
                     96: #include "isakmp_agg.h"
                     97: #include "isakmp_base.h"
                     98: #include "isakmp_quick.h"
                     99: #include "isakmp_inf.h"
                    100: #include "isakmp_newg.h"
                    101: #ifdef ENABLE_HYBRID
                    102: #include "vendorid.h"
                    103: #include "isakmp_xauth.h"
                    104: #include "isakmp_unity.h"
                    105: #include "isakmp_cfg.h"
                    106: #endif
                    107: #ifdef ENABLE_FRAG
                    108: #include "isakmp_frag.h"
                    109: #endif
                    110: #include "strnames.h"
                    111: 
                    112: #include <fcntl.h>
                    113: 
                    114: #ifdef ENABLE_NATT
                    115: # include "nattraversal.h"
                    116: #endif
                    117: # ifdef __linux__
                    118: #  include <linux/udp.h>
                    119: #  include <linux/ip.h>
                    120: #  ifndef SOL_UDP
                    121: #   define SOL_UDP 17
                    122: #  endif
                    123: # endif /* __linux__ */
                    124: # if defined(__NetBSD__) || defined(__FreeBSD__) ||    \
                    125:   (defined(__APPLE__) && defined(__MACH__))
                    126: #  include <netinet/in.h>
                    127: #  include <netinet/udp.h>
                    128: #  include <netinet/in_systm.h>
                    129: #  include <netinet/ip.h>
                    130: #  define SOL_UDP IPPROTO_UDP
                    131: # endif /* __NetBSD__ / __FreeBSD__ */
                    132: 
                    133: static int nostate1 __P((struct ph1handle *, vchar_t *));
                    134: static int nostate2 __P((struct ph2handle *, vchar_t *));
                    135: 
                    136: extern caddr_t val2str(const char *, size_t);
                    137: 
                    138: static int (*ph1exchange[][2][PHASE1ST_MAX])
                    139:        __P((struct ph1handle *, vchar_t *)) = {
                    140:  /* error */
                    141:  { { 0 }, { 0 }, },
                    142:  /* Identity Protection exchange */
                    143:  {
                    144:   { nostate1, ident_i1send, nostate1, ident_i2recv, ident_i2send,
                    145:     ident_i3recv, ident_i3send, ident_i4recv, ident_i4send, nostate1, nostate1,},
                    146:   { nostate1, ident_r1recv, ident_r1send, ident_r2recv, ident_r2send,
                    147:     ident_r3recv, ident_r3send, nostate1, nostate1, nostate1, nostate1, },
                    148:  },
                    149:  /* Aggressive exchange */
                    150:  {
                    151:   { nostate1, agg_i1send, nostate1, agg_i2recv, agg_i2send,
                    152:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
                    153:   { nostate1, agg_r1recv, agg_r1send, agg_r2recv, agg_r2send,
                    154:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
                    155:  },
                    156:  /* Base exchange */
                    157:  {
                    158:   { nostate1, base_i1send, nostate1, base_i2recv, base_i2send,
                    159:     base_i3recv, base_i3send, nostate1, nostate1, nostate1, nostate1, },
                    160:   { nostate1, base_r1recv, base_r1send, base_r2recv, base_r2send,
                    161:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
                    162:  },
                    163: };
                    164: 
                    165: static int (*ph2exchange[][2][PHASE2ST_MAX])
                    166:        __P((struct ph2handle *, vchar_t *)) = {
                    167:  /* error */
                    168:  { { 0 }, { 0 }, },
                    169:  /* Quick mode for IKE */
                    170:  {
                    171:   { nostate2, nostate2, quick_i1prep, nostate2, quick_i1send,
                    172:     quick_i2recv, quick_i2send, quick_i3recv, nostate2, nostate2, },
                    173:   { nostate2, quick_r1recv, quick_r1prep, nostate2, quick_r2send,
                    174:     quick_r3recv, quick_r3prep, quick_r3send, nostate2, nostate2, }
                    175:  },
                    176: };
                    177: 
                    178: static u_char r_ck0[] = { 0,0,0,0,0,0,0,0 }; /* used to verify the r_ck. */
                    179: 
                    180: static int isakmp_main __P((vchar_t *, struct sockaddr *, struct sockaddr *));
                    181: static int ph1_main __P((struct ph1handle *, vchar_t *));
                    182: static int quick_main __P((struct ph2handle *, vchar_t *));
                    183: static int isakmp_ph1begin_r __P((vchar_t *,
                    184:        struct sockaddr *, struct sockaddr *, u_int8_t));
                    185: static int isakmp_ph2begin_i __P((struct ph1handle *, struct ph2handle *));
                    186: static int isakmp_ph2begin_r __P((struct ph1handle *, vchar_t *));
                    187: static int etypesw1 __P((int));
                    188: static int etypesw2 __P((int));
                    189: static int isakmp_ph1resend __P((struct ph1handle *));
                    190: static int isakmp_ph2resend __P((struct ph2handle *));
                    191: 
                    192: #ifdef ENABLE_FRAG
                    193: static int frag_handler(struct ph1handle *,
                    194:     vchar_t *, struct sockaddr *, struct sockaddr *);
                    195: #endif
                    196: 
                    197: /*
                    198:  * isakmp packet handler
                    199:  */
                    200: static int
                    201: isakmp_handler(ctx, so_isakmp)
                    202:         void *ctx;
                    203:        int so_isakmp;
                    204: {
                    205:        struct isakmp isakmp;
                    206:        union {
                    207:                char            buf[sizeof (isakmp) + 4];
                    208:                u_int32_t       non_esp[2];
                    209:                struct          {
                    210:                                     struct udphdr udp;
                    211: #ifdef __linux
                    212:                                     struct iphdr ip;
                    213: #else
                    214:                                     struct ip ip;
                    215: #endif
                    216:                                     char buf[sizeof(isakmp) + 4];
                    217:                                } lbuf;
                    218:        } x;
                    219:        struct sockaddr_storage remote;
                    220:        struct sockaddr_storage local;
                    221:        unsigned int remote_len = sizeof(remote);
                    222:        unsigned int local_len = sizeof(local);
                    223:        int len = 0, extralen = 0;
                    224:        vchar_t *buf = NULL, *tmpbuf = NULL;
                    225:        int error = -1, res;
                    226: 
                    227:        /* read message by MSG_PEEK */
                    228:        while ((len = recvfromto(so_isakmp, x.buf, sizeof(x),
                    229:                    MSG_PEEK, (struct sockaddr *)&remote, &remote_len,
                    230:                    (struct sockaddr *)&local, &local_len)) < 0) {
                    231:                if (errno == EINTR)
                    232:                        continue;
                    233:                plog(LLV_ERROR, LOCATION, NULL,
                    234:                        "failed to receive isakmp packet: %s\n",
                    235:                        strerror (errno));
                    236:                goto end;
                    237:        }
                    238: 
                    239:        /* keep-alive packet - ignore */
                    240:        if (len == 1 && (x.buf[0]&0xff) == 0xff) {
                    241:                /* Pull the keep-alive packet */
                    242:                if ((len = recvfrom(so_isakmp, (char *)x.buf, 1,
                    243:                    0, (struct sockaddr *)&remote, &remote_len)) != 1) {
                    244:                        plog(LLV_ERROR, LOCATION, NULL,
                    245:                            "failed to receive keep alive packet: %s\n",
                    246:                            strerror (errno));
                    247:                }
                    248:                goto end;
                    249:        }
                    250: 
                    251:        /* Lucent IKE in UDP encapsulation */
                    252:        {
                    253: #ifdef __linux__
                    254:                if (ntohs(x.lbuf.udp.dest) == 501) {
                    255:                        extralen += sizeof(x.lbuf.udp) + x.lbuf.ip.ihl;
                    256:                }
                    257: #else
                    258:                if (ntohs(x.lbuf.udp.uh_dport) == 501) {
                    259:                        extralen += sizeof(x.lbuf.udp) + x.lbuf.ip.ip_hl;
                    260:                }
                    261: #endif
                    262:        }
                    263: 
                    264: #ifdef ENABLE_NATT
                    265:        /* we don't know about portchange yet,
                    266:           look for non-esp marker instead */
                    267:        if (x.non_esp[0] == 0 && x.non_esp[1] != 0)
                    268:                extralen = NON_ESP_MARKER_LEN;
                    269: #endif
                    270: 
                    271:        /* now we know if there is an extra non-esp
                    272:           marker at the beginning or not */
                    273:        memcpy ((char *)&isakmp, x.buf + extralen, sizeof (isakmp));
                    274: 
                    275:        /* check isakmp header length, as well as sanity of header length */
                    276:        if (len < sizeof(isakmp) || ntohl(isakmp.len) < sizeof(isakmp)) {
                    277:                plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
                    278:                        "packet shorter than isakmp header size (%u, %u, %zu)\n",
                    279:                        len, ntohl(isakmp.len), sizeof(isakmp));
                    280:                /* dummy receive */
                    281:                if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
                    282:                            0, (struct sockaddr *)&remote, &remote_len)) < 0) {
                    283:                        plog(LLV_ERROR, LOCATION, NULL,
                    284:                                "failed to receive isakmp packet: %s\n",
                    285:                                strerror (errno));
                    286:                }
                    287:                goto end;
                    288:        }
                    289: 
                    290:        /* reject it if the size is tooooo big. */
                    291:        if (ntohl(isakmp.len) > 0xffff) {
                    292:                plog(LLV_ERROR, LOCATION, NULL,
                    293:                        "the length in the isakmp header is too big.\n");
                    294:                if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
                    295:                            0, (struct sockaddr *)&remote, &remote_len)) < 0) {
                    296:                        plog(LLV_ERROR, LOCATION, NULL,
                    297:                                "failed to receive isakmp packet: %s\n",
                    298:                                strerror (errno));
                    299:                }
                    300:                goto end;
                    301:        }
                    302: 
                    303:        /* read real message */
                    304:        if ((tmpbuf = vmalloc(ntohl(isakmp.len) + extralen)) == NULL) {
                    305:                plog(LLV_ERROR, LOCATION, NULL,
                    306:                        "failed to allocate reading buffer (%u Bytes)\n",
                    307:                        ntohl(isakmp.len) + extralen);
                    308:                /* dummy receive */
                    309:                if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
                    310:                            0, (struct sockaddr *)&remote, &remote_len)) < 0) {
                    311:                        plog(LLV_ERROR, LOCATION, NULL,
                    312:                                "failed to receive isakmp packet: %s\n",
                    313:                                strerror (errno));
                    314:                }
                    315:                goto end;
                    316:        }
                    317: 
                    318:        while ((len = recvfromto(so_isakmp, (char *)tmpbuf->v, tmpbuf->l,
                    319:                            0, (struct sockaddr *)&remote, &remote_len,
                    320:                            (struct sockaddr *)&local, &local_len)) < 0) {
                    321:                if (errno == EINTR)
                    322:                        continue;
                    323:                plog(LLV_ERROR, LOCATION, NULL,
                    324:                        "failed to receive isakmp packet: %s\n",
                    325:                        strerror (errno));
                    326:                goto end;
                    327:        }
                    328: 
                    329:        if ((buf = vmalloc(len - extralen)) == NULL) {
                    330:                plog(LLV_ERROR, LOCATION, NULL,
                    331:                        "failed to allocate reading buffer (%u Bytes)\n",
                    332:                        (len - extralen));
                    333:                goto end;
                    334:        }
                    335: 
                    336:        memcpy (buf->v, tmpbuf->v + extralen, buf->l);
                    337: 
                    338:        len -= extralen;
                    339: 
                    340:        if (len != buf->l) {
                    341:                plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
                    342:                        "received invalid length (%d != %zu), why ?\n",
                    343:                        len, buf->l);
                    344:                goto end;
                    345:        }
                    346: 
                    347:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                    348:        plog(LLV_DEBUG, LOCATION, NULL,
                    349:                "%d bytes message received %s\n",
                    350:                len, saddr2str_fromto("from %s to %s",
                    351:                        (struct sockaddr *)&remote,
                    352:                        (struct sockaddr *)&local));
                    353:        plogdump(LLV_DEBUG, buf->v, buf->l);
                    354: 
                    355:        /* avoid packets with malicious port/address */
                    356:        if (extract_port((struct sockaddr *)&remote) == 0) {
                    357:                plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
                    358:                        "src port == 0 (valid as UDP but not with IKE)\n");
                    359:                goto end;
                    360:        }
                    361: 
                    362:        /* XXX: check sender whether to be allowed or not to accept */
                    363: 
                    364:        /* XXX: I don't know how to check isakmp half connection attack. */
                    365: 
                    366:        /* simply reply if the packet was processed. */
                    367:        res=check_recvdpkt((struct sockaddr *)&remote,(struct sockaddr *)&local, buf);
                    368:        if (res) {
                    369:                plog(LLV_NOTIFY, LOCATION, NULL,
                    370:                        "the packet is retransmitted by %s (%d).\n",
                    371:                         saddr2str((struct sockaddr *)&remote), res);
                    372:                error = 0;
                    373:                goto end;
                    374:        }
                    375: 
                    376:        /* isakmp main routine */
                    377:        if (isakmp_main(buf, (struct sockaddr *)&remote,
                    378:                        (struct sockaddr *)&local) != 0) goto end;
                    379: 
                    380:        error = 0;
                    381: 
                    382: end:
                    383:        if (tmpbuf != NULL)
                    384:                vfree(tmpbuf);
                    385:        if (buf != NULL)
                    386:                vfree(buf);
                    387:        return error;
                    388: }
                    389: 
                    390: /*
                    391:  * main processing to handle isakmp payload
                    392:  */
                    393: static int
                    394: isakmp_main(msg, remote, local)
                    395:        vchar_t *msg;
                    396:        struct sockaddr *remote, *local;
                    397: {
                    398:        struct isakmp *isakmp = (struct isakmp *)msg->v;
                    399:        isakmp_index *index = (isakmp_index *)isakmp;
                    400:        u_int32_t msgid = isakmp->msgid;
                    401:        struct ph1handle *iph1;
                    402: 
                    403: #ifdef HAVE_PRINT_ISAKMP_C
                    404:        isakmp_printpacket(msg, remote, local, 0);
                    405: #endif
                    406: 
                    407:        /* the initiator's cookie must not be zero */
                    408:        if (memcmp(&isakmp->i_ck, r_ck0, sizeof(cookie_t)) == 0) {
                    409:                plog(LLV_ERROR, LOCATION, remote,
                    410:                        "malformed cookie received.\n");
                    411:                return -1;
                    412:        }
                    413: 
                    414:        /* Check the Major and Minor Version fields. */
                    415:        /*
                    416:         * XXX Is is right to check version here ?
                    417:         * I think it may no be here because the version depends
                    418:         * on exchange status.
                    419:         */
                    420:        if (isakmp->v < ISAKMP_VERSION_NUMBER) {
                    421:                if (ISAKMP_GETMAJORV(isakmp->v) < ISAKMP_MAJOR_VERSION) {
                    422:                        plog(LLV_ERROR, LOCATION, remote,
                    423:                                "invalid major version %d.\n",
                    424:                                ISAKMP_GETMAJORV(isakmp->v));
                    425:                        return -1;
                    426:                }
                    427: #if ISAKMP_MINOR_VERSION > 0
                    428:                if (ISAKMP_GETMINORV(isakmp->v) < ISAKMP_MINOR_VERSION) {
                    429:                        plog(LLV_ERROR, LOCATION, remote,
                    430:                                "invalid minor version %d.\n",
                    431:                                ISAKMP_GETMINORV(isakmp->v));
                    432:                        return -1;
                    433:                }
                    434: #endif
                    435:        }
                    436: 
                    437:        /* check the Flags field. */
                    438:        /* XXX How is the exclusive check, E and A ? */
                    439:        if (isakmp->flags & ~(ISAKMP_FLAG_E | ISAKMP_FLAG_C | ISAKMP_FLAG_A)) {
                    440:                plog(LLV_ERROR, LOCATION, remote,
                    441:                        "invalid flag 0x%02x.\n", isakmp->flags);
                    442:                return -1;
                    443:        }
                    444: 
                    445:        /* ignore commit bit. */
                    446:        if (ISSET(isakmp->flags, ISAKMP_FLAG_C)) {
                    447:                if (isakmp->msgid == 0) {
                    448:                        isakmp_info_send_nx(isakmp, remote, local,
                    449:                                ISAKMP_NTYPE_INVALID_FLAGS, NULL);
                    450:                        plog(LLV_ERROR, LOCATION, remote,
                    451:                                "Commit bit on phase1 forbidden.\n");
                    452:                        return -1;
                    453:                }
                    454:        }
                    455: 
                    456:        iph1 = getph1byindex(index);
                    457:        if (iph1 != NULL) {
                    458:                /* validity check */
                    459:                if (memcmp(&isakmp->r_ck, r_ck0, sizeof(cookie_t)) == 0 &&
                    460:                    iph1->side == INITIATOR) {
                    461:                        plog(LLV_DEBUG, LOCATION, remote,
                    462:                                "malformed cookie received or "
                    463:                                "the initiator's cookies collide.\n");
                    464:                        return -1;
                    465:                }
                    466: 
                    467: #ifdef ENABLE_NATT
                    468:                /* Floating ports for NAT-T */
                    469:                if (NATT_AVAILABLE(iph1) &&
                    470:                    ! (iph1->natt_flags & NAT_PORTS_CHANGED) &&
                    471:                    ((cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) ||
                    472:                     (cmpsaddr(iph1->local, local) != CMPSADDR_MATCH)))
                    473:                {
                    474:                        /* prevent memory leak */
                    475:                        racoon_free(iph1->remote);
                    476:                        racoon_free(iph1->local);
                    477:                        iph1->remote = NULL;
                    478:                        iph1->local = NULL;
                    479: 
                    480:                        /* copy-in new addresses */
                    481:                        iph1->remote = dupsaddr(remote);
                    482:                        if (iph1->remote == NULL) {
                    483:                                plog(LLV_ERROR, LOCATION, iph1->remote,
                    484:                                   "phase1 failed: dupsaddr failed.\n");
                    485:                                remph1(iph1);
                    486:                                delph1(iph1);
                    487:                                return -1;
                    488:                        }
                    489:                        iph1->local = dupsaddr(local);
                    490:                        if (iph1->local == NULL) {
                    491:                                plog(LLV_ERROR, LOCATION, iph1->remote,
                    492:                                   "phase1 failed: dupsaddr failed.\n");
                    493:                                remph1(iph1);
                    494:                                delph1(iph1);
                    495:                                return -1;
                    496:                        }
                    497: 
                    498:                        /* set the flag to prevent further port floating
                    499:                           (FIXME: should we allow it? E.g. when the NAT gw
                    500:                            is rebooted?) */
                    501:                        iph1->natt_flags |= NAT_PORTS_CHANGED | NAT_ADD_NON_ESP_MARKER;
                    502: 
                    503:                        /* print some neat info */
                    504:                        plog (LLV_INFO, LOCATION, NULL,
                    505:                              "NAT-T: ports changed to: %s\n",
                    506:                              saddr2str_fromto ("%s<->%s", iph1->remote, iph1->local));
                    507: 
                    508:                        natt_keepalive_add_ph1 (iph1);
                    509:                }
                    510: #endif
                    511: 
                    512:                /* must be same addresses in one stream of a phase at least. */
                    513:                if (cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) {
                    514:                        char *saddr_db, *saddr_act;
                    515: 
                    516:                        saddr_db = racoon_strdup(saddr2str(iph1->remote));
                    517:                        saddr_act = racoon_strdup(saddr2str(remote));
                    518:                        STRDUP_FATAL(saddr_db);
                    519:                        STRDUP_FATAL(saddr_act);
                    520: 
                    521:                        plog(LLV_WARNING, LOCATION, remote,
                    522:                                "remote address mismatched. db=%s, act=%s\n",
                    523:                                saddr_db, saddr_act);
                    524: 
                    525:                        racoon_free(saddr_db);
                    526:                        racoon_free(saddr_act);
                    527:                }
                    528: 
                    529:                /*
                    530:                 * don't check of exchange type here because other type will be
                    531:                 * with same index, for example, informational exchange.
                    532:                 */
                    533: 
                    534:                /* XXX more acceptable check */
                    535:        }
                    536: 
                    537:        switch (isakmp->etype) {
                    538:        case ISAKMP_ETYPE_IDENT:
                    539:        case ISAKMP_ETYPE_AGG:
                    540:        case ISAKMP_ETYPE_BASE:
                    541:                /* phase 1 validity check */
                    542:                if (isakmp->msgid != 0) {
                    543:                        plog(LLV_ERROR, LOCATION, remote,
                    544:                                "message id should be zero in phase1.\n");
                    545:                        return -1;
                    546:                }
                    547: 
                    548:                /* search for isakmp status record of phase 1 */
                    549:                if (iph1 == NULL) {
                    550:                        /*
                    551:                         * the packet must be the 1st message from a initiator
                    552:                         * or the 2nd message from the responder.
                    553:                         */
                    554: 
                    555:                        /* search for phase1 handle by index without r_ck */
                    556:                        iph1 = getph1byindex0(index);
                    557:                        if (iph1 == NULL) {
                    558:                                /*it must be the 1st message from a initiator.*/
                    559:                                if (memcmp(&isakmp->r_ck, r_ck0,
                    560:                                        sizeof(cookie_t)) != 0) {
                    561: 
                    562:                                        plog(LLV_DEBUG, LOCATION, remote,
                    563:                                                "malformed cookie received "
                    564:                                                "or the spi expired.\n");
                    565:                                        return -1;
                    566:                                }
                    567: 
                    568:                                /* it must be responder's 1st exchange. */
                    569:                                if (isakmp_ph1begin_r(msg, remote, local,
                    570:                                        isakmp->etype) < 0)
                    571:                                        return -1;
                    572:                                break;
                    573: 
                    574:                                /*NOTREACHED*/
                    575:                        }
                    576: 
                    577:                        /* it must be the 2nd message from the responder. */
                    578:                        if (iph1->side != INITIATOR) {
                    579:                                plog(LLV_DEBUG, LOCATION, remote,
                    580:                                        "malformed cookie received. "
                    581:                                        "it has to be as the initiator.  %s\n",
                    582:                                        isakmp_pindex(&iph1->index, 0));
                    583:                                return -1;
                    584:                        }
                    585:                }
                    586: 
                    587:                /*
                    588:                 * Don't delete phase 1 handler when the exchange type
                    589:                 * in handler is not equal to packet's one because of no
                    590:                 * authencication completed.
                    591:                 */
                    592:                if (iph1->etype != isakmp->etype) {
                    593:                        plog(LLV_ERROR, LOCATION, iph1->remote,
                    594:                                "exchange type is mismatched: "
                    595:                                "db=%s packet=%s, ignore it.\n",
                    596:                                s_isakmp_etype(iph1->etype),
                    597:                                s_isakmp_etype(isakmp->etype));
                    598:                        return -1;
                    599:                }
                    600: 
                    601: #ifdef ENABLE_FRAG
                    602:                if (isakmp->np == ISAKMP_NPTYPE_FRAG)
                    603:                        return frag_handler(iph1, msg, remote, local);
                    604: #endif
                    605: 
                    606:                /* call main process of phase 1 */
                    607:                if (ph1_main(iph1, msg) < 0) {
                    608:                        plog(LLV_ERROR, LOCATION, iph1->remote,
                    609:                                "phase1 negotiation failed.\n");
                    610:                        remph1(iph1);
                    611:                        delph1(iph1);
                    612:                        return -1;
                    613:                }
                    614:                break;
                    615: 
                    616:        case ISAKMP_ETYPE_AUTH:
                    617:                plog(LLV_INFO, LOCATION, remote,
                    618:                        "unsupported exchange %d received.\n",
                    619:                        isakmp->etype);
                    620:                break;
                    621: 
                    622:        case ISAKMP_ETYPE_INFO:
                    623:        case ISAKMP_ETYPE_ACKINFO:
                    624:                /*
                    625:                 * iph1 must be present for Information message.
                    626:                 * if iph1 is null then trying to get the phase1 status
                    627:                 * as the packet from responder againt initiator's 1st
                    628:                 * exchange in phase 1.
                    629:                 * NOTE: We think such informational exchange should be ignored.
                    630:                 */
                    631:                if (iph1 == NULL) {
                    632:                        iph1 = getph1byindex0(index);
                    633:                        if (iph1 == NULL) {
                    634:                                plog(LLV_ERROR, LOCATION, remote,
                    635:                                        "unknown Informational "
                    636:                                        "exchange received.\n");
                    637:                                return -1;
                    638:                        }
                    639:                        if (cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) {
                    640:                                plog(LLV_WARNING, LOCATION, remote,
                    641:                                        "remote address mismatched. "
                    642:                                        "db=%s\n",
                    643:                                        saddr2str(iph1->remote));
                    644:                        }
                    645:                }
                    646: 
                    647: #ifdef ENABLE_FRAG
                    648:                if (isakmp->np == ISAKMP_NPTYPE_FRAG)
                    649:                        return frag_handler(iph1, msg, remote, local);
                    650: #endif
                    651: 
                    652:                if (isakmp_info_recv(iph1, msg) < 0)
                    653:                        return -1;
                    654:                break;
                    655: 
                    656:        case ISAKMP_ETYPE_QUICK:
                    657:        {
                    658:                struct ph2handle *iph2;
                    659: 
                    660:                if (iph1 == NULL) {
                    661:                        isakmp_info_send_nx(isakmp, remote, local,
                    662:                                ISAKMP_NTYPE_INVALID_COOKIE, NULL);
                    663:                        plog(LLV_ERROR, LOCATION, remote,
                    664:                                "can't start the quick mode, "
                    665:                                "there is no ISAKMP-SA, %s\n",
                    666:                                isakmp_pindex((isakmp_index *)&isakmp->i_ck,
                    667:                                        isakmp->msgid));
                    668:                        return -1;
                    669:                }
                    670: #ifdef ENABLE_HYBRID
                    671:                /* Reinit the IVM if it's still there */
                    672:                if (iph1->mode_cfg && iph1->mode_cfg->ivm) {
                    673:                        oakley_delivm(iph1->mode_cfg->ivm);
                    674:                        iph1->mode_cfg->ivm = NULL;
                    675:                }
                    676: #endif
                    677: #ifdef ENABLE_FRAG
                    678:                if (isakmp->np == ISAKMP_NPTYPE_FRAG)
                    679:                        return frag_handler(iph1, msg, remote, local);
                    680: #endif
                    681: 
                    682:                /* check status of phase 1 whether negotiated or not. */
                    683:                if (iph1->status != PHASE1ST_ESTABLISHED &&
                    684:                    iph1->status != PHASE1ST_DYING) {
                    685:                        plog(LLV_ERROR, LOCATION, remote,
                    686:                                "can't start the quick mode, "
                    687:                                "there is no valid ISAKMP-SA, %s\n",
                    688:                                isakmp_pindex(&iph1->index, iph1->msgid));
                    689:                        return -1;
                    690:                }
                    691: 
                    692:                /* search isakmp phase 2 stauts record. */
                    693:                iph2 = getph2bymsgid(iph1, msgid);
                    694:                if (iph2 == NULL) {
                    695:                        /* it must be new negotiation as responder */
                    696:                        if (isakmp_ph2begin_r(iph1, msg) < 0)
                    697:                                return -1;
                    698:                        return 0;
                    699:                        /*NOTREACHED*/
                    700:                }
                    701: 
                    702:                /* commit bit. */
                    703:                /* XXX
                    704:                 * we keep to set commit bit during negotiation.
                    705:                 * When SA is configured, bit will be reset.
                    706:                 * XXX
                    707:                 * don't initiate commit bit.  should be fixed in the future.
                    708:                 */
                    709:                if (ISSET(isakmp->flags, ISAKMP_FLAG_C))
                    710:                        iph2->flags |= ISAKMP_FLAG_C;
                    711: 
                    712:                /* call main process of quick mode */
                    713:                if (quick_main(iph2, msg) < 0) {
                    714:                        plog(LLV_ERROR, LOCATION, iph1->remote,
                    715:                                "phase2 negotiation failed.\n");
                    716:                        remph2(iph2);
                    717:                        delph2(iph2);
                    718:                        return -1;
                    719:                }
                    720:        }
                    721:                break;
                    722: 
                    723:        case ISAKMP_ETYPE_NEWGRP:
                    724:                if (iph1 == NULL) {
                    725:                        plog(LLV_ERROR, LOCATION, remote,
                    726:                                "Unknown new group mode exchange, "
                    727:                                "there is no ISAKMP-SA.\n");
                    728:                        return -1;
                    729:                }
                    730: 
                    731: #ifdef ENABLE_FRAG
                    732:                if (isakmp->np == ISAKMP_NPTYPE_FRAG)
                    733:                        return frag_handler(iph1, msg, remote, local);
                    734: #endif
                    735: 
                    736:                isakmp_newgroup_r(iph1, msg);
                    737:                break;
                    738: 
                    739: #ifdef ENABLE_HYBRID
                    740:        case ISAKMP_ETYPE_CFG:
                    741:                if (iph1 == NULL) {
                    742:                        plog(LLV_ERROR, LOCATION, NULL,
                    743:                             "mode config %d from %s, "
                    744:                             "but we have no ISAKMP-SA.\n",
                    745:                             isakmp->etype, saddr2str(remote));
                    746:                        return -1;
                    747:                }
                    748: 
                    749: #ifdef ENABLE_FRAG
                    750:                if (isakmp->np == ISAKMP_NPTYPE_FRAG)
                    751:                        return frag_handler(iph1, msg, remote, local);
                    752: #endif
                    753: 
                    754:                isakmp_cfg_r(iph1, msg);
                    755:                break;
                    756: #endif
                    757: 
                    758:        case ISAKMP_ETYPE_NONE:
                    759:        default:
                    760:                plog(LLV_ERROR, LOCATION, NULL,
                    761:                        "Invalid exchange type %d from %s.\n",
                    762:                        isakmp->etype, saddr2str(remote));
                    763:                return -1;
                    764:        }
                    765: 
                    766:        return 0;
                    767: }
                    768: 
                    769: /*
                    770:  * main function of phase 1.
                    771:  */
                    772: static int
                    773: ph1_main(iph1, msg)
                    774:        struct ph1handle *iph1;
                    775:        vchar_t *msg;
                    776: {
                    777:        int error;
                    778: #ifdef ENABLE_STATS
                    779:        struct timeval start, end;
                    780: #endif
                    781: 
                    782:        /* ignore a packet */
                    783:        if (iph1->status >= PHASE1ST_ESTABLISHED)
                    784:                return 0;
                    785: 
                    786: #ifdef ENABLE_STATS
                    787:        gettimeofday(&start, NULL);
                    788: #endif
                    789:        /* receive */
                    790:        if (ph1exchange[etypesw1(iph1->etype)]
                    791:                       [iph1->side]
                    792:                       [iph1->status] == NULL) {
                    793:                plog(LLV_ERROR, LOCATION, iph1->remote,
                    794:                        "why isn't the function defined.\n");
                    795:                return -1;
                    796:        }
                    797:        error = (ph1exchange[etypesw1(iph1->etype)]
                    798:                            [iph1->side]
                    799:                            [iph1->status])(iph1, msg);
                    800:        if (error != 0) {
                    801: 
                    802:                /* XXX
                    803:                 * When an invalid packet is received on phase1, it should
                    804:                 * be selected to process this packet.  That is to respond
                    805:                 * with a notify and delete phase 1 handler, OR not to respond
                    806:                 * and keep phase 1 handler. However, in PHASE1ST_START when
                    807:                 * acting as RESPONDER we must not keep phase 1 handler or else
                    808:                 * it will stay forever.
                    809:                 */
                    810: 
                    811:                if (iph1->side == RESPONDER && iph1->status == PHASE1ST_START) {
                    812:                        plog(LLV_ERROR, LOCATION, iph1->remote,
                    813:                                "failed to pre-process ph1 packet (side: %d, status %d).\n",
                    814:                                iph1->side, iph1->status);
                    815:                        return -1;
                    816:                } else {
                    817:                        /* ignore the error and keep phase 1 handler */
                    818:                        return 0;
                    819:                }
                    820:        }
                    821: 
                    822: #ifndef ENABLE_FRAG
                    823:        /* free resend buffer */
                    824:        if (iph1->sendbuf == NULL) {
                    825:                plog(LLV_ERROR, LOCATION, NULL,
                    826:                        "no buffer found as sendbuf\n");
                    827:                return -1;
                    828:        }
                    829: #endif
                    830: 
                    831:        VPTRINIT(iph1->sendbuf);
                    832: 
                    833:        /* turn off schedule */
                    834:        sched_cancel(&iph1->scr);
                    835: 
                    836:        /* send */
                    837:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                    838:        if ((ph1exchange[etypesw1(iph1->etype)]
                    839:                        [iph1->side]
                    840:                        [iph1->status])(iph1, msg) != 0) {
                    841:                plog(LLV_ERROR, LOCATION, iph1->remote,
                    842:                        "failed to process ph1 packet (side: %d, status: %d).\n",
                    843:                        iph1->side, iph1->status);
                    844:                return -1;
                    845:        }
                    846: 
                    847: #ifdef ENABLE_STATS
                    848:        gettimeofday(&end, NULL);
                    849:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                    850:                "phase1", s_isakmp_state(iph1->etype, iph1->side, iph1->status),
                    851:                timedelta(&start, &end));
                    852: #endif
                    853:        if (iph1->status == PHASE1ST_ESTABLISHED) {
                    854: 
                    855: #ifdef ENABLE_STATS
                    856:                gettimeofday(&iph1->end, NULL);
                    857:                syslog(LOG_NOTICE, "%s(%s): %8.6f",
                    858:                        "phase1", s_isakmp_etype(iph1->etype),
                    859:                        timedelta(&iph1->start, &iph1->end));
                    860: #endif
                    861: 
                    862:                /* save created date. */
                    863:                (void)time(&iph1->created);
                    864: 
                    865:                /* migrate ph2s from dying ph1s */
                    866:                migrate_dying_ph12(iph1);
                    867: 
                    868:                /* add to the schedule to expire, and seve back pointer. */
                    869:                if (ph1_rekey_enabled(iph1)) {
                    870:                        sched_schedule(&iph1->sce,
                    871:                                       iph1->approval->lifetime *
                    872:                                       PFKEY_SOFT_LIFETIME_RATE / 100,
                    873:                                       isakmp_ph1dying_stub);
                    874:                } else {
                    875:                        sched_schedule(&iph1->sce, iph1->approval->lifetime,
                    876:                                       isakmp_ph1expire_stub);
                    877:                }
                    878: 
                    879: #ifdef ENABLE_HYBRID
                    880:                if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
                    881:                        switch (iph1->approval->authmethod) {
                    882:                        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
                    883:                        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
                    884:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
                    885:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
                    886:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
                    887:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
                    888:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
                    889:                                xauth_sendreq(iph1);
                    890:                                /* XXX Don't process INITIAL_CONTACT */
                    891:                                iph1->rmconf->ini_contact = 0;
                    892:                                break;
                    893:                        default:
                    894:                                break;
                    895:                        }
                    896:                }
                    897: #endif
                    898: #ifdef ENABLE_DPD
                    899:                /* Schedule the r_u_there.... */
                    900:                if(iph1->dpd_support && iph1->rmconf->dpd_interval)
                    901:                        isakmp_sched_r_u(iph1, 0);
                    902: #endif
                    903: 
                    904:                /* INITIAL-CONTACT processing */
                    905:                /* don't anything if local test mode. */
                    906:                if (!f_local
                    907:                 && iph1->rmconf->ini_contact && !getcontacted(iph1->remote)) {
                    908:                        /* send INITIAL-CONTACT */
                    909:                        isakmp_info_send_n1(iph1,
                    910:                                        ISAKMP_NTYPE_INITIAL_CONTACT, NULL);
                    911:                        /* insert a node into contacted list. */
                    912:                        if (inscontacted(iph1->remote) == -1) {
                    913:                                plog(LLV_ERROR, LOCATION, iph1->remote,
                    914:                                        "failed to add contacted list.\n");
                    915:                                /* ignore */
                    916:                        }
                    917:                }
                    918:                if (iph1->initial_contact_received)
                    919:                        isakmp_info_recv_initialcontact(iph1, NULL);
                    920: 
                    921:                log_ph1established(iph1);
                    922:                plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                    923: 
                    924:                /*
                    925:                 * SA up shell script hook: do it now,except if
                    926:                 * ISAKMP mode config was requested. In the later
                    927:                 * case it is done when we receive the configuration.
                    928:                 */
                    929:                if ((iph1->status == PHASE1ST_ESTABLISHED) &&
                    930:                    !iph1->rmconf->mode_cfg) {
                    931:                        switch (iph1->approval->authmethod) {
                    932: #ifdef ENABLE_HYBRID
                    933:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
                    934:                        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
                    935:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
                    936:                        /* Unimplemeted... */
                    937:                        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
                    938:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
                    939:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
                    940:                        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
                    941:                                break;
                    942: #endif
                    943:                        default:
                    944:                                script_hook(iph1, SCRIPT_PHASE1_UP);
                    945:                                break;
                    946:                        }
                    947:                }
                    948:        }
                    949: 
                    950:        return 0;
                    951: }
                    952: 
                    953: /*
                    954:  * main function of quick mode.
                    955:  */
                    956: static int
                    957: quick_main(iph2, msg)
                    958:        struct ph2handle *iph2;
                    959:        vchar_t *msg;
                    960: {
                    961:        struct isakmp *isakmp = (struct isakmp *)msg->v;
                    962:        int error;
                    963: #ifdef ENABLE_STATS
                    964:        struct timeval start, end;
                    965: #endif
                    966: 
                    967:        /* ignore a packet */
                    968:        if (iph2->status == PHASE2ST_ESTABLISHED
                    969:         || iph2->status == PHASE2ST_GETSPISENT)
                    970:                return 0;
                    971: 
                    972: #ifdef ENABLE_STATS
                    973:        gettimeofday(&start, NULL);
                    974: #endif
                    975: 
                    976:        /* receive */
                    977:        if (ph2exchange[etypesw2(isakmp->etype)]
                    978:                       [iph2->side]
                    979:                       [iph2->status] == NULL) {
                    980:                plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
                    981:                        "why isn't the function defined.\n");
                    982:                return -1;
                    983:        }
                    984:        error = (ph2exchange[etypesw2(isakmp->etype)]
                    985:                            [iph2->side]
                    986:                            [iph2->status])(iph2, msg);
                    987:        if (error != 0) {
                    988:                plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
                    989:                        "failed to pre-process ph2 packet (side: %d, status %d).\n",
                    990:                        iph2->side, iph2->status);
                    991:                if (error == ISAKMP_INTERNAL_ERROR)
                    992:                        return 0;
                    993:                isakmp_info_send_n1(iph2->ph1, error, NULL);
                    994:                return -1;
                    995:        }
                    996: 
                    997:        /* when using commit bit, status will be reached here. */
                    998:        if (iph2->status == PHASE2ST_ADDSA)
                    999:                return 0;
                   1000: 
                   1001:        /* free resend buffer */
                   1002:        if (iph2->sendbuf == NULL) {
                   1003:                plog(LLV_ERROR, LOCATION, NULL,
                   1004:                        "no buffer found as sendbuf\n");
                   1005:                return -1;
                   1006:        }
                   1007:        VPTRINIT(iph2->sendbuf);
                   1008: 
                   1009:        /* turn off schedule */
                   1010:        sched_cancel(&iph2->scr);
                   1011: 
                   1012:        /* send */
                   1013:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1014:        if ((ph2exchange[etypesw2(isakmp->etype)]
                   1015:                        [iph2->side]
                   1016:                        [iph2->status])(iph2, msg) != 0) {
                   1017:                plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
                   1018:                        "failed to process ph2 packet (side: %d, status: %d).\n",
                   1019:                        iph2->side, iph2->status);
                   1020:                return -1;
                   1021:        }
                   1022: 
                   1023: #ifdef ENABLE_STATS
                   1024:        gettimeofday(&end, NULL);
                   1025:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                   1026:                "phase2",
                   1027:                s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
                   1028:                timedelta(&start, &end));
                   1029: #endif
                   1030: 
                   1031:        return 0;
                   1032: }
                   1033: 
                   1034: /* new negotiation of phase 1 for initiator */
                   1035: struct ph1handle *
                   1036: isakmp_ph1begin_i(rmconf, remote, local)
                   1037:        struct remoteconf *rmconf;
                   1038:        struct sockaddr *remote, *local;
                   1039: {
                   1040:        struct ph1handle *iph1;
                   1041: #ifdef ENABLE_STATS
                   1042:        struct timeval start, end;
                   1043: #endif
                   1044: 
                   1045:        /* get new entry to isakmp status table. */
                   1046:        iph1 = newph1();
                   1047:        if (iph1 == NULL)
                   1048:                return NULL;
                   1049: 
                   1050:        iph1->status = PHASE1ST_START;
                   1051:        iph1->rmconf = rmconf;
                   1052:        iph1->side = INITIATOR;
                   1053:        iph1->version = ISAKMP_VERSION_NUMBER;
                   1054:        iph1->msgid = 0;
                   1055:        iph1->flags = 0;
                   1056:        iph1->ph2cnt = 0;
                   1057: #ifdef HAVE_GSSAPI
                   1058:        iph1->gssapi_state = NULL;
                   1059: #endif
                   1060: #ifdef ENABLE_HYBRID
                   1061:        if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
                   1062:                delph1(iph1);
                   1063:                return NULL;
                   1064:        }
                   1065: #endif
                   1066: #ifdef ENABLE_FRAG
                   1067: 
                   1068:        if(rmconf->ike_frag == ISAKMP_FRAG_FORCE)
                   1069:                iph1->frag = 1;
                   1070:        else
                   1071:                iph1->frag = 0;
                   1072:        iph1->frag_chain = NULL;
                   1073: #endif
                   1074:        iph1->approval = NULL;
                   1075: 
                   1076:        /* XXX copy remote address */
                   1077:        if (copy_ph1addresses(iph1, rmconf, remote, local) < 0) {
                   1078:                delph1(iph1);
                   1079:                return NULL;
                   1080:        }
                   1081: 
                   1082:        (void)insph1(iph1);
                   1083: 
                   1084:        /* start phase 1 exchange */
                   1085:        iph1->etype = rmconf->etypes->type;
                   1086: 
                   1087:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1088:     {
                   1089:        char *a;
                   1090: 
                   1091:        a = racoon_strdup(saddr2str(iph1->local));
                   1092:        STRDUP_FATAL(a);
                   1093: 
                   1094:        plog(LLV_INFO, LOCATION, NULL,
                   1095:                "initiate new phase 1 negotiation: %s<=>%s\n",
                   1096:                a, saddr2str(iph1->remote));
                   1097:        racoon_free(a);
                   1098:     }
                   1099:        plog(LLV_INFO, LOCATION, NULL,
                   1100:                "begin %s mode.\n",
                   1101:                s_isakmp_etype(iph1->etype));
                   1102: 
                   1103: #ifdef ENABLE_STATS
                   1104:        gettimeofday(&iph1->start, NULL);
                   1105:        gettimeofday(&start, NULL);
                   1106: #endif
                   1107:        /* start exchange */
                   1108:        if ((ph1exchange[etypesw1(iph1->etype)]
                   1109:                        [iph1->side]
                   1110:                        [iph1->status])(iph1, NULL) != 0) {
                   1111:                /* failed to start phase 1 negotiation */
                   1112:                remph1(iph1);
                   1113:                delph1(iph1);
                   1114: 
                   1115:                return NULL;
                   1116:        }
                   1117: 
                   1118: #ifdef ENABLE_STATS
                   1119:        gettimeofday(&end, NULL);
                   1120:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                   1121:                "phase1",
                   1122:                s_isakmp_state(iph1->etype, iph1->side, iph1->status),
                   1123:                timedelta(&start, &end));
                   1124: #endif
                   1125: 
                   1126:        return iph1;
                   1127: }
                   1128: 
                   1129: /* new negotiation of phase 1 for responder */
                   1130: static int
1.1.1.1.2.1! misho    1131: isakmp_ph1begin_r(vchar_t *msg, struct sockaddr *remote, struct sockaddr *local, u_int8_t etype)
1.1       misho    1132: {
                   1133:        struct isakmp *isakmp = (struct isakmp *)msg->v;
                   1134:        struct ph1handle *iph1;
                   1135:        struct rmconfselector rmsel;
                   1136: #ifdef ENABLE_STATS
                   1137:        struct timeval start, end;
                   1138: #endif
                   1139: 
                   1140:        /* check if this etype is allowed */
                   1141:        memset(&rmsel, 0, sizeof(rmsel));
                   1142:        rmsel.remote = remote;
                   1143:        if (enumrmconf(&rmsel, check_etypeok, (void *) (intptr_t) etype) == 0) {
                   1144:                plog(LLV_ERROR, LOCATION, remote,
                   1145:                     "exchange %s not allowed in any applicable rmconf.\n",
                   1146:                     s_isakmp_etype(etype));
                   1147:                return -1;
                   1148:        }
                   1149: 
                   1150:        /* get new entry to isakmp status table. */
                   1151:        iph1 = newph1();
                   1152:        if (iph1 == NULL)
                   1153:                return -1;
                   1154: 
                   1155:        memcpy(&iph1->index.i_ck, &isakmp->i_ck, sizeof(iph1->index.i_ck));
                   1156:        iph1->status = PHASE1ST_START;
                   1157:        iph1->flags = 0;
                   1158:        iph1->side = RESPONDER;
                   1159:        iph1->etype = etype;
                   1160:        iph1->version = isakmp->v;
                   1161:        iph1->msgid = 0;
                   1162: #ifdef HAVE_GSSAPI
                   1163:        iph1->gssapi_state = NULL;
                   1164: #endif
                   1165: #ifdef ENABLE_HYBRID
                   1166:        if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
                   1167:                delph1(iph1);
                   1168:                return -1;
                   1169:        }
                   1170: #endif
                   1171: #ifdef ENABLE_FRAG
                   1172:        iph1->frag = 0;
                   1173:        iph1->frag_chain = NULL;
                   1174: #endif
                   1175:        iph1->approval = NULL;
                   1176: 
                   1177: #ifdef ENABLE_NATT
                   1178:        /* RFC3947 says that we MUST accept new phases1 on NAT-T floated port.
                   1179:         * We have to setup this flag now to correctly generate the first reply.
                   1180:         * Don't know if a better check could be done for that ?
                   1181:         */
                   1182:        if(extract_port(local) == lcconf->port_isakmp_natt)
                   1183:                iph1->natt_flags |= (NAT_PORTS_CHANGED);
                   1184: #endif
                   1185: 
                   1186:        /* copy remote address; remote and local always contain
                   1187:         * port numbers so rmconf is not needed */
                   1188:        if (copy_ph1addresses(iph1, NULL, remote, local) < 0) {
                   1189:                delph1(iph1);
                   1190:                return -1;
                   1191:        }
                   1192:        (void)insph1(iph1);
                   1193: 
                   1194:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1195:     {
                   1196:        char *a;
                   1197: 
                   1198:        a = racoon_strdup(saddr2str(iph1->local));
                   1199:        STRDUP_FATAL(a);
                   1200: 
                   1201:        plog(LLV_INFO, LOCATION, NULL,
                   1202:                "respond new phase 1 negotiation: %s<=>%s\n",
                   1203:                a, saddr2str(iph1->remote));
                   1204:        racoon_free(a);
                   1205:     }
                   1206:        plog(LLV_INFO, LOCATION, NULL,
                   1207:                "begin %s mode.\n", s_isakmp_etype(etype));
                   1208: 
                   1209: #ifdef ENABLE_STATS
                   1210:        gettimeofday(&iph1->start, NULL);
                   1211:        gettimeofday(&start, NULL);
                   1212: #endif
                   1213: 
                   1214: #ifndef ENABLE_FRAG
                   1215: 
                   1216:        /* start exchange */
                   1217:        if ((ph1exchange[etypesw1(iph1->etype)]
                   1218:                        [iph1->side]
                   1219:                        [iph1->status])(iph1, msg) < 0
                   1220:         || (ph1exchange[etypesw1(iph1->etype)]
                   1221:                        [iph1->side]
                   1222:                        [iph1->status])(iph1, msg) < 0) {
                   1223:                plog(LLV_ERROR, LOCATION, remote,
                   1224:                        "failed to process ph1 packet (side: %d, status: %d).\n",
                   1225:                        iph1->side, iph1->status);
                   1226:                remph1(iph1);
                   1227:                delph1(iph1);
                   1228:                return -1;
                   1229:        }
                   1230: 
                   1231: #ifdef ENABLE_STATS
                   1232:        gettimeofday(&end, NULL);
                   1233:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                   1234:                "phase1",
                   1235:                s_isakmp_state(iph1->etype, iph1->side, iph1->status),
                   1236:                timedelta(&start, &end));
                   1237: #endif
                   1238: 
                   1239:        return 0;
                   1240: 
                   1241: #else /* ENABLE_FRAG */
                   1242: 
                   1243:        /* now that we have a phase1 handle, feed back into our
                   1244:         * main receive function to catch fragmented packets
                   1245:         */
                   1246: 
                   1247:        return isakmp_main(msg, remote, local);
                   1248: 
                   1249: #endif /* ENABLE_FRAG */
                   1250: 
                   1251: }
                   1252: 
                   1253: /* new negotiation of phase 2 for initiator */
                   1254: static int
                   1255: isakmp_ph2begin_i(iph1, iph2)
                   1256:        struct ph1handle *iph1;
                   1257:        struct ph2handle *iph2;
                   1258: {
                   1259: #ifdef ENABLE_HYBRID
                   1260:        if (xauth_check(iph1) != 0) {
                   1261:                plog(LLV_ERROR, LOCATION, NULL,
                   1262:                    "Attempt to start phase 2 whereas Xauth failed\n");
                   1263:                return -1;
                   1264:        }
                   1265: #endif
                   1266: 
                   1267:        /* fixup ph2 ports for this ph1 */
                   1268:        if (extract_port(iph2->src) == 0)
                   1269:                set_port(iph2->src, extract_port(iph1->local));
                   1270:        if (extract_port(iph2->dst) == 0)
                   1271:                set_port(iph2->dst, extract_port(iph1->remote));
                   1272: 
                   1273:        /* found ISAKMP-SA. */
                   1274:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1275:        plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
                   1276:     {
                   1277:        char *a;
                   1278:        a = racoon_strdup(saddr2str(iph2->src));
                   1279:        STRDUP_FATAL(a);
                   1280: 
                   1281:        plog(LLV_INFO, LOCATION, NULL,
                   1282:                "initiate new phase 2 negotiation: %s<=>%s\n",
                   1283:                a, saddr2str(iph2->dst));
                   1284:        racoon_free(a);
                   1285:     }
                   1286: 
                   1287: #ifdef ENABLE_STATS
                   1288:        gettimeofday(&iph2->start, NULL);
                   1289: #endif
                   1290:        if (iph2->status != PHASE2ST_EXPIRED) /* Phase 1 is already bound (ongoing rekeying) */
                   1291:                bindph12(iph1, iph2);
                   1292:        iph2->status = PHASE2ST_STATUS2;
                   1293: 
                   1294:        if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
                   1295:                         [iph2->side]
                   1296:                         [iph2->status])(iph2, NULL) < 0) {
                   1297:                /* release ipsecsa handler due to internal error. */
                   1298:                remph2(iph2);
                   1299:                return -1;
                   1300:        }
                   1301:        return 0;
                   1302: }
                   1303: 
                   1304: /* new negotiation of phase 2 for responder */
                   1305: static int
                   1306: isakmp_ph2begin_r(iph1, msg)
                   1307:        struct ph1handle *iph1;
                   1308:        vchar_t *msg;
                   1309: {
                   1310:        struct isakmp *isakmp = (struct isakmp *)msg->v;
                   1311:        struct ph2handle *iph2 = 0;
                   1312:        int error;
                   1313: #ifdef ENABLE_STATS
                   1314:        struct timeval start, end;
                   1315: #endif
                   1316: #ifdef ENABLE_HYBRID
                   1317:        if (xauth_check(iph1) != 0) {
                   1318:                plog(LLV_ERROR, LOCATION, NULL,
                   1319:                    "Attempt to start phase 2 whereas Xauth failed\n");
                   1320:                return -1;
                   1321:        }
                   1322: #endif
                   1323: 
                   1324:        iph2 = newph2();
                   1325:        if (iph2 == NULL) {
                   1326:                plog(LLV_ERROR, LOCATION, NULL,
                   1327:                        "failed to allocate phase2 entry.\n");
                   1328:                return -1;
                   1329:        }
                   1330: 
                   1331:        iph2->side = RESPONDER;
                   1332:        iph2->status = PHASE2ST_START;
                   1333:        iph2->flags = isakmp->flags;
                   1334:        iph2->msgid = isakmp->msgid;
                   1335:        iph2->seq = pk_getseq();
                   1336:        iph2->ivm = oakley_newiv2(iph1, iph2->msgid);
                   1337:        if (iph2->ivm == NULL) {
                   1338:                delph2(iph2);
                   1339:                return -1;
                   1340:        }
                   1341:        iph2->dst = dupsaddr(iph1->remote);     /* XXX should be considered */
                   1342:        if (iph2->dst == NULL) {
                   1343:                delph2(iph2);
                   1344:                return -1;
                   1345:        }
                   1346:        iph2->src = dupsaddr(iph1->local);      /* XXX should be considered */
                   1347:        if (iph2->src == NULL) {
                   1348:                delph2(iph2);
                   1349:                return -1;
                   1350:        }
                   1351: 
                   1352:        /* add new entry to isakmp status table */
                   1353:        insph2(iph2);
                   1354:        bindph12(iph1, iph2);
                   1355: 
                   1356:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1357:     {
                   1358:        char *a;
                   1359: 
                   1360:        a = racoon_strdup(saddr2str(iph2->src));
                   1361:        STRDUP_FATAL(a);
                   1362: 
                   1363:        plog(LLV_INFO, LOCATION, NULL,
                   1364:                "respond new phase 2 negotiation: %s<=>%s\n",
                   1365:                a, saddr2str(iph2->dst));
                   1366:        racoon_free(a);
                   1367:     }
                   1368: 
                   1369: #ifdef ENABLE_STATS
                   1370:        gettimeofday(&start, NULL);
                   1371: #endif
                   1372: 
                   1373:        error = (ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
                   1374:                           [iph2->side]
                   1375:                           [iph2->status])(iph2, msg);
                   1376:        if (error != 0) {
                   1377:                plog(LLV_ERROR, LOCATION, iph1->remote,
                   1378:                        "failed to pre-process ph2 packet (side: %d, status: %d).\n",
                   1379:                        iph2->side, iph2->status);
                   1380:                if (error != ISAKMP_INTERNAL_ERROR)
                   1381:                        isakmp_info_send_n1(iph2->ph1, error, NULL);
                   1382:                /*
                   1383:                 * release handler because it's wrong that ph2handle is kept
                   1384:                 * after failed to check message for responder's.
                   1385:                 */
                   1386:                remph2(iph2);
                   1387:                delph2(iph2);
                   1388:                return -1;
                   1389:        }
                   1390: 
                   1391:        /* send */
                   1392:        plog(LLV_DEBUG, LOCATION, NULL, "===\n");
                   1393:        if ((ph2exchange[etypesw2(isakmp->etype)]
                   1394:                        [iph2->side]
                   1395:                        [iph2->status])(iph2, msg) < 0) {
                   1396:                plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
                   1397:                        "failed to process ph2 packet (side: %d, status: %d).\n",
                   1398:                        iph2->side, iph2->status);
                   1399:                /* don't release handler */
                   1400:                return -1;
                   1401:        }
                   1402: #ifdef ENABLE_STATS
                   1403:        gettimeofday(&end, NULL);
                   1404:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                   1405:                "phase2",
                   1406:                s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
                   1407:                timedelta(&start, &end));
                   1408: #endif
                   1409: 
                   1410:        return 0;
                   1411: }
                   1412: 
                   1413: /*
                   1414:  * parse ISAKMP payloads, without ISAKMP base header.
                   1415:  */
                   1416: vchar_t *
                   1417: isakmp_parsewoh(np0, gen, len)
                   1418:        int np0;
                   1419:        struct isakmp_gen *gen;
                   1420:        int len;
                   1421: {
                   1422:        u_char np = np0 & 0xff;
                   1423:        int tlen, plen;
                   1424:        vchar_t *result;
                   1425:        struct isakmp_parse_t *p, *ep;
                   1426: 
                   1427:        plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
                   1428: 
                   1429:        /*
                   1430:         * 5 is a magic number, but any value larger than 2 should be fine
                   1431:         * as we do vrealloc() in the following loop.
                   1432:         */
                   1433:        result = vmalloc(sizeof(struct isakmp_parse_t) * 5);
                   1434:        if (result == NULL) {
                   1435:                plog(LLV_ERROR, LOCATION, NULL,
                   1436:                        "failed to get buffer.\n");
                   1437:                return NULL;
                   1438:        }
                   1439:        p = (struct isakmp_parse_t *)result->v;
                   1440:        ep = (struct isakmp_parse_t *)(result->v + result->l - sizeof(*ep));
                   1441: 
                   1442:        tlen = len;
                   1443: 
                   1444:        /* parse through general headers */
                   1445:        while (0 < tlen && np != ISAKMP_NPTYPE_NONE) {
                   1446:                if (tlen <= sizeof(struct isakmp_gen)) {
                   1447:                        /* don't send information, see isakmp_ident_r1() */
                   1448:                        plog(LLV_ERROR, LOCATION, NULL,
                   1449:                                "invalid length of payload\n");
                   1450:                        vfree(result);
                   1451:                        return NULL;
                   1452:                }
                   1453: 
                   1454:                plog(LLV_DEBUG, LOCATION, NULL,
                   1455:                        "seen nptype=%u(%s)\n", np, s_isakmp_nptype(np));
                   1456: 
                   1457:                p->type = np;
                   1458:                p->len = ntohs(gen->len);
                   1459:                if (p->len < sizeof(struct isakmp_gen) || p->len > tlen) {
                   1460:                        plog(LLV_DEBUG, LOCATION, NULL,
                   1461:                                "invalid length of payload\n");
                   1462:                        vfree(result);
                   1463:                        return NULL;
                   1464:                }
                   1465:                p->ptr = gen;
                   1466:                p++;
                   1467:                if (ep <= p) {
                   1468:                        int off;
                   1469: 
                   1470:                        off = p - (struct isakmp_parse_t *)result->v;
                   1471:                        result = vrealloc(result, result->l * 2);
                   1472:                        if (result == NULL) {
                   1473:                                plog(LLV_DEBUG, LOCATION, NULL,
                   1474:                                        "failed to realloc buffer.\n");
                   1475:                                vfree(result);
                   1476:                                return NULL;
                   1477:                        }
                   1478:                        ep = (struct isakmp_parse_t *)
                   1479:                                (result->v + result->l - sizeof(*ep));
                   1480:                        p = (struct isakmp_parse_t *)result->v;
                   1481:                        p += off;
                   1482:                }
                   1483: 
                   1484:                np = gen->np;
                   1485:                plen = ntohs(gen->len);
                   1486:                gen = (struct isakmp_gen *)((caddr_t)gen + plen);
                   1487:                tlen -= plen;
                   1488:        }
                   1489:        p->type = ISAKMP_NPTYPE_NONE;
                   1490:        p->len = 0;
                   1491:        p->ptr = NULL;
                   1492: 
                   1493:        plog(LLV_DEBUG, LOCATION, NULL, "succeed.\n");
                   1494: 
                   1495:        return result;
                   1496: }
                   1497: 
                   1498: /*
                   1499:  * parse ISAKMP payloads, including ISAKMP base header.
                   1500:  */
                   1501: vchar_t *
                   1502: isakmp_parse(buf)
                   1503:        vchar_t *buf;
                   1504: {
                   1505:        struct isakmp *isakmp = (struct isakmp *)buf->v;
                   1506:        struct isakmp_gen *gen;
                   1507:        int tlen;
                   1508:        vchar_t *result;
                   1509:        u_char np;
                   1510: 
                   1511:        np = isakmp->np;
                   1512:        gen = (struct isakmp_gen *)(buf->v + sizeof(*isakmp));
                   1513:        tlen = buf->l - sizeof(struct isakmp);
                   1514:        result = isakmp_parsewoh(np, gen, tlen);
                   1515: 
                   1516:        return result;
                   1517: }
                   1518: 
                   1519: /* %%% */
                   1520: int
                   1521: isakmp_init()
                   1522: {
                   1523:        /* initialize a isakmp status table */
                   1524:        initph1tree();
                   1525:        initph2tree();
                   1526:        initctdtree();
                   1527:        init_recvdpkt();
                   1528: 
                   1529:        return 0;
                   1530: }
                   1531: 
                   1532: /*
                   1533:  * make strings containing i_cookie + r_cookie + msgid
                   1534:  */
                   1535: const char *
                   1536: isakmp_pindex(index, msgid)
                   1537:        const isakmp_index *index;
                   1538:        const u_int32_t msgid;
                   1539: {
                   1540:        static char buf[64];
                   1541:        const u_char *p;
                   1542:        int i, j;
                   1543: 
                   1544:        memset(buf, 0, sizeof(buf));
                   1545: 
                   1546:        /* copy index */
                   1547:        p = (const u_char *)index;
                   1548:        for (j = 0, i = 0; i < sizeof(isakmp_index); i++) {
                   1549:                snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]);
                   1550:                j += 2;
                   1551:                switch (i) {
                   1552:                case 7:
                   1553:                        buf[j++] = ':';
                   1554:                }
                   1555:        }
                   1556: 
                   1557:        if (msgid == 0)
                   1558:                return buf;
                   1559: 
                   1560:        /* copy msgid */
                   1561:        snprintf((char *)&buf[j], sizeof(buf) - j, ":%08x", ntohs(msgid));
                   1562: 
                   1563:        return buf;
                   1564: }
                   1565: 
                   1566: /* open ISAKMP sockets. */
                   1567: int
                   1568: isakmp_open(struct sockaddr *addr, int udp_encap)
                   1569: {
                   1570:        const int yes = 1;
                   1571:        int ifnum = 0, encap_ifnum = 0, fd;
                   1572:        struct sockaddr_in *sin = (struct sockaddr_in *) addr;
                   1573: #ifdef INET6
                   1574:        struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
                   1575:        int pktinfo;
                   1576: #endif
                   1577: #ifdef ENABLE_NATT
                   1578:        int option = -1;
                   1579: #endif
                   1580: 
                   1581:        /* warn if wildcard address - should we forbid this? */
                   1582:        switch (addr->sa_family) {
                   1583:        case AF_INET:
                   1584:                if (sin->sin_addr.s_addr == 0)
                   1585:                        plog(LLV_WARNING, LOCATION, NULL,
                   1586:                             "listening to wildcard address,"
                   1587:                             "broadcast IKE packet may kill you\n");
                   1588:                break;
                   1589: #ifdef INET6
                   1590:        case AF_INET6:
                   1591:                if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
                   1592:                        plog(LLV_DEBUG, LOCATION, NULL,
                   1593:                             "ignoring multicast address %s\n",
                   1594:                             saddr2str(addr));
                   1595:                        return -1;
                   1596:                }
                   1597: 
                   1598:                if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
                   1599:                        plog(LLV_WARNING, LOCATION, NULL,
                   1600:                             "listening to wildcard address, "
                   1601:                             "broadcast IKE packet may kill you\n");
                   1602:                break;
                   1603: #endif
                   1604:        default:
                   1605:                plog(LLV_ERROR, LOCATION, NULL,
                   1606:                     "unsupported address family %d\n",
                   1607:                     addr->sa_family);
                   1608:                return -1;
                   1609:        }
                   1610: 
                   1611:        if ((fd = privsep_socket(addr->sa_family, SOCK_DGRAM, 0)) < 0) {
                   1612:                plog(LLV_ERROR, LOCATION, NULL,
                   1613:                     "socket(%s)\n", strerror(errno));
                   1614:                return -1;
                   1615:        }
                   1616:        close_on_exec(fd);
                   1617:        if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
                   1618:                plog(LLV_WARNING, LOCATION, NULL,
                   1619:                     "failed to put socket in non-blocking mode\n");
                   1620: 
                   1621:        /* receive my interface address on inbound packets. */
                   1622:        switch (addr->sa_family) {
                   1623:        case AF_INET:
                   1624:                if (setsockopt(fd, IPPROTO_IP,
                   1625: #ifdef __linux__
                   1626:                               IP_PKTINFO,
                   1627: #else
                   1628:                               IP_RECVDSTADDR,
                   1629: #endif
                   1630:                               (const void *) &yes, sizeof(yes)) < 0) {
                   1631:                        plog(LLV_ERROR, LOCATION, NULL,
                   1632:                             "setsockopt IP_RECVDSTADDR (%s)\n",
                   1633:                             strerror(errno));
                   1634:                        goto err;
                   1635:                }
                   1636: 
                   1637: #ifdef ENABLE_NATT
                   1638:                if (udp_encap)
                   1639:                        option = UDP_ENCAP_ESPINUDP;
                   1640: #if defined(ENABLE_NATT_00) || defined(ENABLE_NATT_01)
                   1641:                else
                   1642:                        option = UDP_ENCAP_ESPINUDP_NON_IKE;
                   1643: #endif
                   1644:                if (option == -1)
                   1645:                        break;
                   1646: 
                   1647:                if (setsockopt(fd, SOL_UDP,
                   1648:                               UDP_ENCAP, &option,
                   1649:                               sizeof(option)) < 0) {
                   1650:                        plog(LLV_WARNING, LOCATION, NULL,
                   1651:                             "setsockopt(%s): UDP_ENCAP %s\n",
                   1652:                             option == UDP_ENCAP_ESPINUDP ? "UDP_ENCAP_ESPINUDP" : "UDP_ENCAP_ESPINUDP_NON_IKE",
                   1653:                             strerror(errno));
                   1654:                } else {
                   1655:                        plog(LLV_INFO, LOCATION, NULL,
                   1656:                             "%s used for NAT-T\n",
                   1657:                             saddr2str(addr));
                   1658:                }
                   1659: #endif
                   1660:                break;
                   1661: 
                   1662: #ifdef INET6
                   1663:        case AF_INET6:
                   1664: #if defined(INET6_ADVAPI)
                   1665: #ifdef IPV6_RECVPKTINFO
                   1666:                pktinfo = IPV6_RECVPKTINFO;
                   1667: #else  /* old adv. API */
                   1668:                pktinfo = IPV6_PKTINFO;
                   1669: #endif /* IPV6_RECVPKTINFO */
                   1670: #else
                   1671:                pktinfo = IPV6_RECVDSTADDR;
                   1672: #endif
                   1673:                if (setsockopt(fd, IPPROTO_IPV6, pktinfo,
                   1674:                               (const void *) &yes, sizeof(yes)) < 0) {
                   1675:                        plog(LLV_ERROR, LOCATION, NULL,
                   1676:                             "setsockopt IPV6_RECVDSTADDR (%d):%s\n",
                   1677:                             pktinfo, strerror(errno));
                   1678:                        goto err;
                   1679:                }
                   1680: 
                   1681: #ifdef IPV6_USE_MIN_MTU
                   1682:                if (setsockopt(fd, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
                   1683:                               (void *) &yes, sizeof(yes)) < 0) {
                   1684:                        plog(LLV_ERROR, LOCATION, NULL,
                   1685:                             "setsockopt IPV6_USE_MIN_MTU (%s)\n",
                   1686:                             strerror(errno));
                   1687:                        goto err;
                   1688:                }
                   1689: #endif
                   1690:                break;
                   1691: #endif
                   1692:        }
                   1693: 
                   1694:        if (setsockopt(fd, SOL_SOCKET,
                   1695: #ifdef __linux__
                   1696:                       SO_REUSEADDR,
                   1697: #else
                   1698:                       SO_REUSEPORT,
                   1699: #endif
                   1700:                       (void *) &yes, sizeof(yes)) < 0) {
                   1701:                plog(LLV_ERROR, LOCATION, NULL,
                   1702:                     "failed to set REUSE flag on %s (%s).\n",
                   1703:                     saddr2str(addr), strerror(errno));
                   1704:                goto err;
                   1705:        }
                   1706: 
                   1707:        if (setsockopt_bypass(fd, addr->sa_family) < 0)
                   1708:                goto err;
                   1709: 
                   1710:        if (privsep_bind(fd, addr, sysdep_sa_len(addr)) < 0) {
                   1711:                plog(LLV_ERROR, LOCATION, addr,
                   1712:                     "failed to bind to address %s (%s).\n",
                   1713:                     saddr2str(addr), strerror(errno));
                   1714:                goto err;
                   1715:        }
                   1716: 
                   1717:        plog(LLV_INFO, LOCATION, NULL,
                   1718:             "%s used as isakmp port (fd=%d)\n",
                   1719:             saddr2str(addr), fd);
                   1720: 
                   1721:        monitor_fd(fd, isakmp_handler, NULL, 1);
                   1722:        return fd;
                   1723: 
                   1724: err:
                   1725:        close(fd);
                   1726:        return -1;
                   1727: }
                   1728: 
                   1729: void
                   1730: isakmp_close(int fd)
                   1731: {
                   1732:        unmonitor_fd(fd);
                   1733:        close(fd);
                   1734: }
                   1735: 
                   1736: int
                   1737: isakmp_send(iph1, sbuf)
                   1738:        struct ph1handle *iph1;
                   1739:        vchar_t *sbuf;
                   1740: {
                   1741:        int len = 0;
                   1742:        int s;
                   1743:        vchar_t *vbuf = NULL, swap;
                   1744: 
                   1745: #ifdef ENABLE_NATT
                   1746:        size_t extralen = NON_ESP_MARKER_USE(iph1) ? NON_ESP_MARKER_LEN : 0;
                   1747: 
                   1748:        /* Check if NON_ESP_MARKER_LEN is already there (happens when resending packets)
                   1749:         */
                   1750:        if(extralen == NON_ESP_MARKER_LEN &&
                   1751:           *(u_int32_t *)sbuf->v == 0)
                   1752:                extralen = 0;
                   1753: 
                   1754: #ifdef ENABLE_FRAG
                   1755:        /*
                   1756:         * Do not add the non ESP marker for a packet that will
                   1757:         * be fragmented. The non ESP marker should appear in
                   1758:         * all fragment's packets, but not in the fragmented packet
                   1759:         */
                   1760:        if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN)
                   1761:                extralen = 0;
                   1762: #endif
                   1763:        if (extralen)
                   1764:                plog (LLV_DEBUG, LOCATION, NULL, "Adding NON-ESP marker\n");
                   1765: 
                   1766:        /* If NAT-T port floating is in use, 4 zero bytes (non-ESP marker)
                   1767:           must added just before the packet itself. For this we must
                   1768:           allocate a new buffer and release it at the end. */
                   1769:        if (extralen) {
                   1770:                if ((vbuf = vmalloc (sbuf->l + extralen)) == NULL) {
                   1771:                        plog(LLV_ERROR, LOCATION, NULL,
                   1772:                            "vbuf allocation failed\n");
                   1773:                        return -1;
                   1774:                }
                   1775:                *(u_int32_t *)vbuf->v = 0;
                   1776:                memcpy (vbuf->v + extralen, sbuf->v, sbuf->l);
                   1777:                /* ensures that the modified buffer will be sent back to the caller, so
                   1778:                 * add_recvdpkt() will add the correct buffer
                   1779:                 */
                   1780:                swap = *sbuf;
                   1781:                *sbuf = *vbuf;
                   1782:                *vbuf = swap;
                   1783:                vfree(vbuf);
                   1784:        }
                   1785: #endif
                   1786: 
                   1787:        /* select the socket to be sent */
                   1788:        s = myaddr_getfd(iph1->local);
                   1789:        if (s == -1)
                   1790:                return -1;
                   1791: 
                   1792:        plog (LLV_DEBUG, LOCATION, NULL, "%zu bytes %s\n", sbuf->l,
                   1793:              saddr2str_fromto("from %s to %s", iph1->local, iph1->remote));
                   1794: 
                   1795: #ifdef ENABLE_FRAG
                   1796:        if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN) {
                   1797:                if (isakmp_sendfrags(iph1, sbuf) == -1) {
                   1798:                        plog(LLV_ERROR, LOCATION, NULL,
                   1799:                            "isakmp_sendfrags failed\n");
                   1800:                        return -1;
                   1801:                }
                   1802:        } else
                   1803: #endif
                   1804:        {
                   1805:                len = sendfromto(s, sbuf->v, sbuf->l,
                   1806:                    iph1->local, iph1->remote, lcconf->count_persend);
                   1807: 
                   1808:                if (len == -1) {
                   1809:                        plog(LLV_ERROR, LOCATION, NULL, "sendfromto failed\n");
                   1810:                        return -1;
                   1811:                }
                   1812:        }
                   1813: 
                   1814:        return 0;
                   1815: }
                   1816: 
                   1817: /* called from scheduler */
                   1818: static void
                   1819: isakmp_ph1resend_stub(p)
                   1820:        struct sched *p;
                   1821: {
                   1822:        struct ph1handle *iph1 = container_of(p, struct ph1handle, scr);
                   1823: 
                   1824:        if (isakmp_ph1resend(iph1) < 0) {
                   1825:                remph1(iph1);
                   1826:                delph1(iph1);
                   1827:        }
                   1828: }
                   1829: 
                   1830: static int
                   1831: isakmp_ph1resend(iph1)
                   1832:        struct ph1handle *iph1;
                   1833: {
                   1834:        /* Note: NEVER do the rem/del here, it will be done by the caller or by the _stub function
                   1835:         */
                   1836:        if (iph1->retry_counter <= 0) {
                   1837:                plog(LLV_ERROR, LOCATION, NULL,
                   1838:                        "phase1 negotiation failed due to time up. %s\n",
                   1839:                        isakmp_pindex(&iph1->index, iph1->msgid));
                   1840:                /* XXX is the peer really "dead" here ??? */
                   1841:                script_hook(iph1, SCRIPT_PHASE1_DEAD);
                   1842:                evt_phase1(iph1, EVT_PHASE1_NO_RESPONSE, NULL);
                   1843: 
                   1844:                return -1;
                   1845:        }
                   1846: 
                   1847:        if (isakmp_send(iph1, iph1->sendbuf) < 0){
                   1848:                plog(LLV_ERROR, LOCATION, NULL,
                   1849:                         "phase1 negotiation failed due to send error. %s\n",
                   1850:                         isakmp_pindex(&iph1->index, iph1->msgid));
                   1851:                evt_phase1(iph1, EVT_PHASE1_NO_RESPONSE, NULL);
                   1852:                return -1;
                   1853:        }
                   1854: 
                   1855:        plog(LLV_DEBUG, LOCATION, NULL,
                   1856:                "resend phase1 packet %s\n",
                   1857:                isakmp_pindex(&iph1->index, iph1->msgid));
                   1858: 
                   1859:        iph1->retry_counter--;
                   1860: 
                   1861:        sched_schedule(&iph1->scr, lcconf->retry_interval,
                   1862:                       isakmp_ph1resend_stub);
                   1863: 
                   1864:        return 0;
                   1865: }
                   1866: 
                   1867: int
                   1868: isakmp_ph1send(iph1)
                   1869:        struct ph1handle *iph1;
                   1870: {
                   1871:        iph1->retry_counter = lcconf->retry_counter;
                   1872:        return isakmp_ph1resend(iph1);
                   1873: }
                   1874: 
                   1875: /* called from scheduler */
                   1876: static void
                   1877: isakmp_ph2resend_stub(p)
                   1878:        struct sched *p;
                   1879: {
                   1880:        struct ph2handle *iph2 = container_of(p, struct ph2handle, scr);
                   1881: 
                   1882:        if (isakmp_ph2resend(iph2) < 0) {
                   1883:                remph2(iph2);
                   1884:                delph2(iph2);
                   1885:        }
                   1886: }
                   1887: 
                   1888: static int
                   1889: isakmp_ph2resend(iph2)
                   1890:        struct ph2handle *iph2;
                   1891: {
                   1892:        /* Note: NEVER do the unbind/rem/del here, it will be done by the caller or by the _stub function
                   1893:         */
                   1894:        if (iph2->ph1->status >= PHASE1ST_EXPIRED) {
                   1895:                plog(LLV_ERROR, LOCATION, NULL,
                   1896:                        "phase2 negotiation failed due to phase1 expired. %s\n",
                   1897:                                isakmp_pindex(&iph2->ph1->index, iph2->msgid));
                   1898:                return -1;
                   1899:        }
                   1900: 
                   1901:        if (iph2->retry_counter <= 0) {
                   1902:                plog(LLV_ERROR, LOCATION, NULL,
                   1903:                        "phase2 negotiation failed due to time up. %s\n",
                   1904:                                isakmp_pindex(&iph2->ph1->index, iph2->msgid));
                   1905:                evt_phase2(iph2, EVT_PHASE2_NO_RESPONSE, NULL);
                   1906:                unbindph12(iph2);
                   1907:                return -1;
                   1908:        }
                   1909: 
                   1910:        if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0){
                   1911:                plog(LLV_ERROR, LOCATION, NULL,
                   1912:                        "phase2 negotiation failed due to send error. %s\n",
                   1913:                                isakmp_pindex(&iph2->ph1->index, iph2->msgid));
                   1914:                evt_phase2(iph2, EVT_PHASE2_NO_RESPONSE, NULL);
                   1915:                return -1;
                   1916:        }
                   1917: 
                   1918:        plog(LLV_DEBUG, LOCATION, NULL,
                   1919:                "resend phase2 packet %s\n",
                   1920:                isakmp_pindex(&iph2->ph1->index, iph2->msgid));
                   1921: 
                   1922:        iph2->retry_counter--;
                   1923: 
                   1924:        sched_schedule(&iph2->scr, lcconf->retry_interval,
                   1925:                       isakmp_ph2resend_stub);
                   1926: 
                   1927:        return 0;
                   1928: }
                   1929: 
                   1930: int
                   1931: isakmp_ph2send(iph2)
                   1932:        struct ph2handle *iph2;
                   1933: {
                   1934:        iph2->retry_counter = lcconf->retry_counter;
                   1935:        return isakmp_ph2resend(iph2);
                   1936: }
                   1937: 
                   1938: /* called from scheduler */
                   1939: void
                   1940: isakmp_ph1dying_stub(p)
                   1941:        struct sched *p;
                   1942: {
                   1943: 
                   1944:        isakmp_ph1dying(container_of(p, struct ph1handle, sce));
                   1945: }
                   1946: 
                   1947: void
                   1948: isakmp_ph1dying(iph1)
                   1949:        struct ph1handle *iph1;
                   1950: {
                   1951:        struct ph1handle *new_iph1;
                   1952:        struct ph2handle *p;
                   1953:        struct remoteconf *rmconf;
                   1954: 
                   1955:        if (iph1->status >= PHASE1ST_DYING)
                   1956:                return;
                   1957: 
                   1958:        /* Going away in after a while... */
                   1959:        iph1->status = PHASE1ST_DYING;
                   1960: 
                   1961:        /* Any fresh phase1s? */
                   1962:        new_iph1 = getph1(iph1, iph1->local, iph1->remote, 1);
                   1963:        if (new_iph1 == NULL) {
                   1964:                LIST_FOREACH(p, &iph1->ph2tree, ph1bind) {
                   1965:                        if (p->status != PHASE2ST_ESTABLISHED)
                   1966:                                continue;
                   1967: 
                   1968:                        plog(LLV_INFO, LOCATION, NULL,
                   1969:                             "renegotiating phase1 to %s due to "
                   1970:                             "active phase2\n",
                   1971:                             saddrwop2str(iph1->remote));
                   1972: 
                   1973:                        if (iph1->side == INITIATOR)
                   1974:                                isakmp_ph1begin_i(iph1->rmconf, iph1->remote,
                   1975:                                                  iph1->local);
                   1976: 
                   1977:                        break;
                   1978:                }
                   1979:        } else {
                   1980:                migrate_ph12(iph1, new_iph1);
                   1981:        }
                   1982: 
                   1983:        /* Schedule for expiration */
                   1984:        sched_schedule(&iph1->sce, iph1->approval->lifetime *
                   1985:                       (100 - PFKEY_SOFT_LIFETIME_RATE) / 100,
                   1986:                       isakmp_ph1expire_stub);
                   1987: }
                   1988: 
                   1989: /* called from scheduler */
                   1990: void
                   1991: isakmp_ph1expire_stub(p)
                   1992:        struct sched *p;
                   1993: {
                   1994:        isakmp_ph1expire(container_of(p, struct ph1handle, sce));
                   1995: }
                   1996: 
                   1997: void
                   1998: isakmp_ph1expire(iph1)
                   1999:        struct ph1handle *iph1;
                   2000: {
                   2001:        char *src, *dst;
                   2002: 
                   2003:        if (iph1->status < PHASE1ST_EXPIRED) {
                   2004:                src = racoon_strdup(saddr2str(iph1->local));
                   2005:                dst = racoon_strdup(saddr2str(iph1->remote));
                   2006:                STRDUP_FATAL(src);
                   2007:                STRDUP_FATAL(dst);
                   2008: 
                   2009:                plog(LLV_INFO, LOCATION, NULL,
                   2010:                         "ISAKMP-SA expired %s-%s spi:%s\n",
                   2011:                         src, dst,
                   2012:                         isakmp_pindex(&iph1->index, 0));
                   2013:                racoon_free(src);
                   2014:                racoon_free(dst);
                   2015:                iph1->status = PHASE1ST_EXPIRED;
                   2016:        }
                   2017: 
                   2018:        isakmp_ph1delete(iph1);
                   2019: }
                   2020: 
                   2021: /* called from scheduler */
                   2022: void
                   2023: isakmp_ph1delete_stub(p)
                   2024:        struct sched *p;
                   2025: {
                   2026: 
                   2027:        isakmp_ph1delete(container_of(p, struct ph1handle, sce));
                   2028: }
                   2029: 
                   2030: void
                   2031: isakmp_ph1delete(iph1)
                   2032:        struct ph1handle *iph1;
                   2033: {
                   2034:        struct ph2handle *p, *next;
                   2035:        struct ph1handle *new_iph1;
                   2036:        char *src, *dst;
                   2037: 
                   2038:        /* Migrate established phase2s. Any fresh phase1s? */
                   2039:        new_iph1 = getph1(iph1, iph1->local, iph1->remote, 1);
                   2040:        if (new_iph1 != NULL)
                   2041:                migrate_ph12(iph1, new_iph1);
                   2042: 
                   2043:        /* Discard any left phase2s */
                   2044:        for (p = LIST_FIRST(&iph1->ph2tree); p; p = next) {
                   2045:                next = LIST_NEXT(p, ph1bind);
                   2046:                if (p->status == PHASE2ST_ESTABLISHED)
                   2047:                        isakmp_info_send_d2(p);
                   2048:                /* remove all ph2 handles,
                   2049:                 * as ph1handle will be expired soon
                   2050:                 */
                   2051:                delete_spd(p, 1);
                   2052:                remph2(p);
                   2053:                delph2(p);
                   2054:        }
                   2055: 
                   2056:        src = racoon_strdup(saddr2str(iph1->local));
                   2057:        dst = racoon_strdup(saddr2str(iph1->remote));
                   2058:        STRDUP_FATAL(src);
                   2059:        STRDUP_FATAL(dst);
                   2060: 
                   2061:        plog(LLV_INFO, LOCATION, NULL,
                   2062:                "ISAKMP-SA deleted %s-%s spi:%s\n",
                   2063:                src, dst, isakmp_pindex(&iph1->index, 0));
                   2064: 
                   2065:        evt_phase1(iph1, EVT_PHASE1_DOWN, NULL);
                   2066:        if (new_iph1 == NULL && ph1_rekey_enabled(iph1))
                   2067:                script_hook(iph1, SCRIPT_PHASE1_DEAD);
                   2068: 
                   2069:        racoon_free(src);
                   2070:        racoon_free(dst);
                   2071: 
                   2072:        remph1(iph1);
                   2073:        delph1(iph1);
                   2074: }
                   2075: 
                   2076: /* called from scheduler.
                   2077:  * this function will call only isakmp_ph2delete().
                   2078:  * phase 2 handler remain forever if kernel doesn't cry a expire of phase 2 SA
                   2079:  * by something cause.  That's why this function is called after phase 2 SA
                   2080:  * expires in the userland.
                   2081:  */
                   2082: void
                   2083: isakmp_ph2expire_stub(p)
                   2084:        struct sched *p;
                   2085: {
                   2086: 
                   2087:        isakmp_ph2expire(container_of(p, struct ph2handle, sce));
                   2088: }
                   2089: 
                   2090: void
                   2091: isakmp_ph2expire(iph2)
                   2092:        struct ph2handle *iph2;
                   2093: {
                   2094:        char *src, *dst;
                   2095: 
                   2096:        src = racoon_strdup(saddrwop2str(iph2->src));
                   2097:        dst = racoon_strdup(saddrwop2str(iph2->dst));
                   2098:        STRDUP_FATAL(src);
                   2099:        STRDUP_FATAL(dst);
                   2100: 
                   2101:        plog(LLV_INFO, LOCATION, NULL,
                   2102:                "phase2 sa expired %s-%s\n", src, dst);
                   2103:        racoon_free(src);
                   2104:        racoon_free(dst);
                   2105: 
                   2106:        iph2->status = PHASE2ST_EXPIRED;
                   2107:        sched_schedule(&iph2->sce, 1, isakmp_ph2delete_stub);
                   2108: }
                   2109: 
                   2110: /* called from scheduler */
                   2111: void
                   2112: isakmp_ph2delete_stub(p)
                   2113:        struct sched *p;
                   2114: {
                   2115: 
                   2116:        isakmp_ph2delete(container_of(p, struct ph2handle, sce));
                   2117: }
                   2118: 
                   2119: void
                   2120: isakmp_ph2delete(iph2)
                   2121:        struct ph2handle *iph2;
                   2122: {
                   2123:        char *src, *dst;
                   2124: 
                   2125:        src = racoon_strdup(saddrwop2str(iph2->src));
                   2126:        dst = racoon_strdup(saddrwop2str(iph2->dst));
                   2127:        STRDUP_FATAL(src);
                   2128:        STRDUP_FATAL(dst);
                   2129: 
                   2130:        plog(LLV_INFO, LOCATION, NULL,
                   2131:                "phase2 sa deleted %s-%s\n", src, dst);
                   2132:        racoon_free(src);
                   2133:        racoon_free(dst);
                   2134: 
                   2135:        remph2(iph2);
                   2136:        delph2(iph2);
                   2137: 
                   2138:        return;
                   2139: }
                   2140: 
                   2141: /* %%%
                   2142:  * Interface between PF_KEYv2 and ISAKMP
                   2143:  */
                   2144: /*
                   2145:  * receive ACQUIRE from kernel, and begin either phase1 or phase2.
                   2146:  * if phase1 has been finished, begin phase2.
                   2147:  */
                   2148: int
                   2149: isakmp_post_acquire(iph2, iph1hint, nopassive)
                   2150:        struct ph2handle *iph2;
                   2151:        struct ph1handle *iph1hint;
                   2152:        int nopassive;
                   2153: {
                   2154:        struct remoteconf *rmconf;
                   2155:        struct ph1handle *iph1 = NULL;
                   2156: 
                   2157:        plog(LLV_DEBUG, LOCATION, NULL, "in post_acquire\n");
                   2158: 
                   2159:        /* Search appropriate configuration with masking port. Note that
                   2160:         * we always use iph2->dst, and not iph2->sa_dst.
                   2161:         *
                   2162:         * XXX One possible need for using iph2->sa_dst if not NULL would
                   2163:         * be for selecting a remote configuration based on a stable
                   2164:         * address of a mobile node (not a CoA provided by MIGRATE/KMADDRESS
                   2165:         * as iph2->dst hint). This scenario would require additional changes,
                   2166:         * so no need to bother yet. --arno */
                   2167: 
                   2168:        if (iph1hint == NULL || iph1hint->rmconf == NULL) {
                   2169:                rmconf = getrmconf(iph2->dst, nopassive ? GETRMCONF_F_NO_PASSIVE : 0);
                   2170:                if (rmconf == NULL) {
                   2171:                        plog(LLV_ERROR, LOCATION, NULL,
                   2172:                                "no configuration found for %s.\n",
                   2173:                                saddrwop2str(iph2->dst));
                   2174:                        return -1;
                   2175:                }
                   2176:        } else {
                   2177:                rmconf = iph1hint->rmconf;
                   2178:        }
                   2179: 
                   2180:        /* if passive mode, ignore the acquire message */
                   2181:        if (nopassive && rmconf->passive) {
                   2182:                plog(LLV_DEBUG, LOCATION, NULL,
                   2183:                        "because of passive mode, "
                   2184:                        "ignore the acquire message for %s.\n",
                   2185:                        saddrwop2str(iph2->dst));
                   2186:                return 0;
                   2187:        }
                   2188: 
                   2189:        /*
                   2190:         * XXX Searching by IP addresses + ports might fail on
                   2191:         * some cases, we should use the ISAKMP identity to search
                   2192:         * matching ISAKMP.
                   2193:         */
                   2194:        iph1 = getph1(iph1hint, iph2->src, iph2->dst, 0);
                   2195: 
                   2196:        /* no ISAKMP-SA found. */
                   2197:        if (iph1 == NULL) {
                   2198:                iph2->retry_checkph1 = lcconf->retry_checkph1;
                   2199:                sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
                   2200:                plog(LLV_INFO, LOCATION, NULL,
                   2201:                        "IPsec-SA request for %s queued "
                   2202:                        "due to no phase1 found.\n",
                   2203:                        saddrwop2str(iph2->dst));
                   2204: 
                   2205:                /* start phase 1 negotiation as a initiator. */
                   2206:                if (isakmp_ph1begin_i(rmconf, iph2->dst, iph2->src) == NULL) {
                   2207:                        sched_cancel(&iph2->sce);
                   2208:                        return -1;
                   2209:                }
                   2210: 
                   2211:                return 0;
                   2212:                /*NOTREACHED*/
                   2213:        }
                   2214: 
                   2215:        /* found ISAKMP-SA, but on negotiation. */
                   2216:        if (iph1->status < PHASE1ST_ESTABLISHED) {
                   2217:                iph2->retry_checkph1 = lcconf->retry_checkph1;
                   2218:                sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
                   2219:                plog(LLV_INFO, LOCATION, iph2->dst,
                   2220:                        "request for establishing IPsec-SA was queued "
                   2221:                        "due to no phase1 found.\n");
                   2222:                return 0;
                   2223:                /*NOTREACHED*/
                   2224:        }
                   2225: 
                   2226:        /* found established ISAKMP-SA */
                   2227:        /* i.e. iph1->status == PHASE1ST_ESTABLISHED */
                   2228: 
                   2229:        /* found ISAKMP-SA. */
                   2230:        plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
                   2231: 
                   2232:        /* begin quick mode */
                   2233:        if (isakmp_ph2begin_i(iph1, iph2))
                   2234:                return -1;
                   2235: 
                   2236:        return 0;
                   2237: }
                   2238: 
                   2239: int
                   2240: isakmp_get_sainfo(iph2, sp_out, sp_in)
                   2241:        struct ph2handle *iph2;
                   2242:        struct secpolicy *sp_out, *sp_in;
                   2243: {
                   2244:        struct remoteconf *conf;
                   2245:        uint32_t remoteid = 0;
                   2246: 
                   2247:        plog(LLV_DEBUG, LOCATION, NULL,
                   2248:                "new acquire %s\n", spidx2str(&sp_out->spidx));
                   2249: 
                   2250:        /* get sainfo */
                   2251:        {
                   2252:                vchar_t *idsrc, *iddst;
                   2253: 
                   2254:                idsrc = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.src,
                   2255:                        sp_out->spidx.prefs, sp_out->spidx.ul_proto);
                   2256:                if (idsrc == NULL) {
                   2257:                        plog(LLV_ERROR, LOCATION, NULL,
                   2258:                                "failed to get ID for %s\n",
                   2259:                                spidx2str(&sp_out->spidx));
                   2260:                        return -1;
                   2261:                }
                   2262:                iddst = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.dst,
                   2263:                        sp_out->spidx.prefd, sp_out->spidx.ul_proto);
                   2264:                if (iddst == NULL) {
                   2265:                        plog(LLV_ERROR, LOCATION, NULL,
                   2266:                                "failed to get ID for %s\n",
                   2267:                                spidx2str(&sp_out->spidx));
                   2268:                        vfree(idsrc);
                   2269:                        return -1;
                   2270:                }
                   2271: 
                   2272:                conf = getrmconf(iph2->dst, 0);
                   2273:                if (conf != NULL)
                   2274:                        remoteid = conf->ph1id;
                   2275:                else
                   2276:                        plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
                   2277: 
                   2278:                iph2->sainfo = getsainfo(idsrc, iddst, NULL, NULL, remoteid);
                   2279:                vfree(idsrc);
                   2280:                vfree(iddst);
                   2281:                if (iph2->sainfo == NULL) {
                   2282:                        plog(LLV_ERROR, LOCATION, NULL,
                   2283:                                "failed to get sainfo.\n");
                   2284:                        return -1;
                   2285:                        /* XXX should use the algorithm list from register message */
                   2286:                }
                   2287: 
                   2288:                plog(LLV_DEBUG, LOCATION, NULL,
                   2289:                        "selected sainfo: %s\n", sainfo2str(iph2->sainfo));
                   2290:        }
                   2291: 
                   2292:        if (set_proposal_from_policy(iph2, sp_out, sp_in) < 0) {
                   2293:                plog(LLV_ERROR, LOCATION, NULL,
                   2294:                        "failed to create saprop.\n");
                   2295:                return -1;
                   2296:        }
                   2297: 
                   2298:        return 0;
                   2299: }
                   2300: 
                   2301: 
                   2302: /*
                   2303:  * receive GETSPI from kernel.
                   2304:  */
                   2305: int
                   2306: isakmp_post_getspi(iph2)
                   2307:        struct ph2handle *iph2;
                   2308: {
                   2309: #ifdef ENABLE_STATS
                   2310:        struct timeval start, end;
                   2311: #endif
                   2312: 
                   2313:        /* don't process it because there is no suitable phase1-sa. */
                   2314:        if (iph2->ph1->status >= PHASE1ST_EXPIRED) {
                   2315:                plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
                   2316:                        "the negotiation is stopped, "
                   2317:                        "because there is no suitable ISAKMP-SA.\n");
                   2318:                return -1;
                   2319:        }
                   2320: 
                   2321: #ifdef ENABLE_STATS
                   2322:        gettimeofday(&start, NULL);
                   2323: #endif
                   2324:        if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
                   2325:                        [iph2->side]
                   2326:                        [iph2->status])(iph2, NULL) != 0)
                   2327:                return -1;
                   2328: #ifdef ENABLE_STATS
                   2329:        gettimeofday(&end, NULL);
                   2330:        syslog(LOG_NOTICE, "%s(%s): %8.6f",
                   2331:                "phase2",
                   2332:                s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
                   2333:                timedelta(&start, &end));
                   2334: #endif
                   2335: 
                   2336:        return 0;
                   2337: }
                   2338: 
                   2339: /* called by scheduler */
                   2340: void
                   2341: isakmp_chkph1there_stub(p)
                   2342:        struct sched *p;
                   2343: {
                   2344:        isakmp_chkph1there(container_of(p, struct ph2handle, sce));
                   2345: }
                   2346: 
                   2347: void
                   2348: isakmp_chkph1there(iph2)
                   2349:        struct ph2handle *iph2;
                   2350: {
                   2351:        struct ph1handle *iph1;
                   2352: 
                   2353:        iph2->retry_checkph1--;
                   2354:        if (iph2->retry_checkph1 < 0) {
                   2355:                plog(LLV_ERROR, LOCATION, iph2->dst,
                   2356:                        "phase2 negotiation failed "
                   2357:                        "due to time up waiting for phase1. %s\n",
                   2358:                        sadbsecas2str(iph2->dst, iph2->src,
                   2359:                                iph2->satype, 0, 0));
                   2360:                plog(LLV_INFO, LOCATION, NULL,
                   2361:                        "delete phase 2 handler.\n");
                   2362: 
                   2363:                /* send acquire to kernel as error */
                   2364:                pk_sendeacquire(iph2);
                   2365: 
                   2366:                remph2(iph2);
                   2367:                delph2(iph2);
                   2368: 
                   2369:                return;
                   2370:        }
                   2371: 
                   2372:        /* Search isakmp status table by address and port */
                   2373:        iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
                   2374: 
                   2375:        /* XXX Even if ph1 as responder is there, should we not start
                   2376:         * phase 2 negotiation ? */
                   2377:        if (iph1 != NULL
                   2378:         && iph1->status == PHASE1ST_ESTABLISHED) {
                   2379:                /* found isakmp-sa */
                   2380: 
                   2381:                plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: got a ph1 handler, setting ports.\n");
                   2382:                plog(LLV_DEBUG2, LOCATION, NULL, "iph1->local: %s\n", saddr2str(iph1->local));
                   2383:                plog(LLV_DEBUG2, LOCATION, NULL, "iph1->remote: %s\n", saddr2str(iph1->remote));
                   2384:                plog(LLV_DEBUG2, LOCATION, NULL, "before:\n");
                   2385:                plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
                   2386:                plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
                   2387:                set_port(iph2->src, extract_port(iph1->local));
                   2388:                set_port(iph2->dst, extract_port(iph1->remote));
                   2389:                plog(LLV_DEBUG2, LOCATION, NULL, "After:\n");
                   2390:                plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
                   2391:                plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
                   2392: 
                   2393:                /* begin quick mode */
                   2394:                (void)isakmp_ph2begin_i(iph1, iph2);
                   2395:                return;
                   2396:        }
                   2397: 
                   2398:        plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: no established ph1 handler found\n");
                   2399: 
                   2400:        /* no isakmp-sa found */
                   2401:        sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
                   2402: 
                   2403:        return;
                   2404: }
                   2405: 
                   2406: /* copy variable data into ALLOCATED buffer. */
                   2407: caddr_t
                   2408: isakmp_set_attr_v(buf, type, val, len)
                   2409:        caddr_t buf;
                   2410:        int type;
                   2411:        caddr_t val;
                   2412:        int len;
                   2413: {
                   2414:        struct isakmp_data *data;
                   2415: 
                   2416:        data = (struct isakmp_data *)buf;
                   2417:        data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
                   2418:        data->lorv = htons((u_int16_t)len);
                   2419:        memcpy(data + 1, val, len);
                   2420: 
                   2421:        return buf + sizeof(*data) + len;
                   2422: }
                   2423: 
                   2424: /* copy fixed length data into ALLOCATED buffer. */
                   2425: caddr_t
                   2426: isakmp_set_attr_l(buf, type, val)
                   2427:        caddr_t buf;
                   2428:        int type;
                   2429:        u_int32_t val;
                   2430: {
                   2431:        struct isakmp_data *data;
                   2432: 
                   2433:        data = (struct isakmp_data *)buf;
                   2434:        data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
                   2435:        data->lorv = htons((u_int16_t)val);
                   2436: 
                   2437:        return buf + sizeof(*data);
                   2438: }
                   2439: 
                   2440: /* add a variable data attribute to the buffer by reallocating it. */
                   2441: vchar_t *
                   2442: isakmp_add_attr_v(buf0, type, val, len)
                   2443:        vchar_t *buf0;
                   2444:        int type;
                   2445:        caddr_t val;
                   2446:        int len;
                   2447: {
                   2448:        vchar_t *buf = NULL;
                   2449:        struct isakmp_data *data;
                   2450:        int tlen;
                   2451:        int oldlen = 0;
                   2452: 
                   2453:        tlen = sizeof(*data) + len;
                   2454: 
                   2455:        if (buf0) {
                   2456:                oldlen = buf0->l;
                   2457:                buf = vrealloc(buf0, oldlen + tlen);
                   2458:        } else
                   2459:                buf = vmalloc(tlen);
                   2460:        if (!buf) {
                   2461:                plog(LLV_ERROR, LOCATION, NULL,
                   2462:                        "failed to get a attribute buffer.\n");
                   2463:                return NULL;
                   2464:        }
                   2465: 
                   2466:        data = (struct isakmp_data *)(buf->v + oldlen);
                   2467:        data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
                   2468:        data->lorv = htons((u_int16_t)len);
                   2469:        memcpy(data + 1, val, len);
                   2470: 
                   2471:        return buf;
                   2472: }
                   2473: 
                   2474: /* add a fixed data attribute to the buffer by reallocating it. */
                   2475: vchar_t *
                   2476: isakmp_add_attr_l(buf0, type, val)
                   2477:        vchar_t *buf0;
                   2478:        int type;
                   2479:        u_int32_t val;
                   2480: {
                   2481:        vchar_t *buf = NULL;
                   2482:        struct isakmp_data *data;
                   2483:        int tlen;
                   2484:        int oldlen = 0;
                   2485: 
                   2486:        tlen = sizeof(*data);
                   2487: 
                   2488:        if (buf0) {
                   2489:                oldlen = buf0->l;
                   2490:                buf = vrealloc(buf0, oldlen + tlen);
                   2491:        } else
                   2492:                buf = vmalloc(tlen);
                   2493:        if (!buf) {
                   2494:                plog(LLV_ERROR, LOCATION, NULL,
                   2495:                        "failed to get a attribute buffer.\n");
                   2496:                return NULL;
                   2497:        }
                   2498: 
                   2499:        data = (struct isakmp_data *)(buf->v + oldlen);
                   2500:        data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
                   2501:        data->lorv = htons((u_int16_t)val);
                   2502: 
                   2503:        return buf;
                   2504: }
                   2505: 
                   2506: /*
                   2507:  * calculate cookie and set.
                   2508:  */
                   2509: int
                   2510: isakmp_newcookie(place, remote, local)
                   2511:        caddr_t place;
                   2512:        struct sockaddr *remote;
                   2513:        struct sockaddr *local;
                   2514: {
                   2515:        vchar_t *buf = NULL, *buf2 = NULL;
                   2516:        char *p;
                   2517:        int blen;
                   2518:        int alen;
                   2519:        caddr_t sa1, sa2;
                   2520:        time_t t;
                   2521:        int error = -1;
                   2522:        u_short port;
                   2523: 
                   2524: 
                   2525:        if (remote->sa_family != local->sa_family) {
                   2526:                plog(LLV_ERROR, LOCATION, NULL,
                   2527:                        "address family mismatch, remote:%d local:%d\n",
                   2528:                        remote->sa_family, local->sa_family);
                   2529:                goto end;
                   2530:        }
                   2531:        switch (remote->sa_family) {
                   2532:        case AF_INET:
                   2533:                alen = sizeof(struct in_addr);
                   2534:                sa1 = (caddr_t)&((struct sockaddr_in *)remote)->sin_addr;
                   2535:                sa2 = (caddr_t)&((struct sockaddr_in *)local)->sin_addr;
                   2536:                break;
                   2537: #ifdef INET6
                   2538:        case AF_INET6:
                   2539:                alen = sizeof(struct in6_addr);
                   2540:                sa1 = (caddr_t)&((struct sockaddr_in6 *)remote)->sin6_addr;
                   2541:                sa2 = (caddr_t)&((struct sockaddr_in6 *)local)->sin6_addr;
                   2542:                break;
                   2543: #endif
                   2544:        default:
                   2545:                plog(LLV_ERROR, LOCATION, NULL,
                   2546:                        "invalid family: %d\n", remote->sa_family);
                   2547:                goto end;
                   2548:        }
                   2549:        blen = (alen + sizeof(u_short)) * 2
                   2550:                + sizeof(time_t) + lcconf->secret_size;
                   2551:        buf = vmalloc(blen);
                   2552:        if (buf == NULL) {
                   2553:                plog(LLV_ERROR, LOCATION, NULL,
                   2554:                        "failed to get a cookie.\n");
                   2555:                goto end;
                   2556:        }
                   2557:        p = buf->v;
                   2558: 
                   2559:        /* copy my address */
                   2560:        memcpy(p, sa1, alen);
                   2561:        p += alen;
                   2562:        port = ((struct sockaddr_in *)remote)->sin_port;
                   2563:        memcpy(p, &port, sizeof(u_short));
                   2564:        p += sizeof(u_short);
                   2565: 
                   2566:        /* copy target address */
                   2567:        memcpy(p, sa2, alen);
                   2568:        p += alen;
                   2569:        port = ((struct sockaddr_in *)local)->sin_port;
                   2570:        memcpy(p, &port, sizeof(u_short));
                   2571:        p += sizeof(u_short);
                   2572: 
                   2573:        /* copy time */
                   2574:        t = time(0);
                   2575:        memcpy(p, (caddr_t)&t, sizeof(t));
                   2576:        p += sizeof(t);
                   2577: 
                   2578:        /* copy random value */
                   2579:        buf2 = eay_set_random(lcconf->secret_size);
                   2580:        if (buf2 == NULL)
                   2581:                goto end;
                   2582:        memcpy(p, buf2->v, lcconf->secret_size);
                   2583:        p += lcconf->secret_size;
                   2584:        vfree(buf2);
                   2585: 
                   2586:        buf2 = eay_sha1_one(buf);
                   2587:        memcpy(place, buf2->v, sizeof(cookie_t));
                   2588: 
                   2589:        sa1 = val2str(place, sizeof (cookie_t));
                   2590:        plog(LLV_DEBUG, LOCATION, NULL, "new cookie:\n%s\n", sa1);
                   2591:        racoon_free(sa1);
                   2592: 
                   2593:        error = 0;
                   2594: end:
                   2595:        if (buf != NULL)
                   2596:                vfree(buf);
                   2597:        if (buf2 != NULL)
                   2598:                vfree(buf2);
                   2599:        return error;
                   2600: }
                   2601: 
                   2602: /*
                   2603:  * save partner's(payload) data into phhandle.
                   2604:  */
                   2605: int
                   2606: isakmp_p2ph(buf, gen)
                   2607:        vchar_t **buf;
                   2608:        struct isakmp_gen *gen;
                   2609: {
                   2610:        /* XXX to be checked in each functions for logging. */
                   2611:        if (*buf) {
                   2612:                plog(LLV_WARNING, LOCATION, NULL,
                   2613:                        "ignore this payload, same payload type exist.\n");
                   2614:                return -1;
                   2615:        }
                   2616: 
                   2617:        *buf = vmalloc(ntohs(gen->len) - sizeof(*gen));
                   2618:        if (*buf == NULL) {
                   2619:                plog(LLV_ERROR, LOCATION, NULL,
                   2620:                        "failed to get buffer.\n");
                   2621:                return -1;
                   2622:        }
                   2623:        memcpy((*buf)->v, gen + 1, (*buf)->l);
                   2624: 
                   2625:        return 0;
                   2626: }
                   2627: 
                   2628: u_int32_t
                   2629: isakmp_newmsgid2(iph1)
                   2630:        struct ph1handle *iph1;
                   2631: {
                   2632:        u_int32_t msgid2;
                   2633: 
                   2634:        do {
                   2635:                msgid2 = eay_random();
                   2636:        } while (getph2bymsgid(iph1, msgid2));
                   2637: 
                   2638:        return msgid2;
                   2639: }
                   2640: 
                   2641: /*
                   2642:  * set values into allocated buffer of isakmp header for phase 1
                   2643:  */
                   2644: static caddr_t
                   2645: set_isakmp_header(vbuf, iph1, nptype, etype, flags, msgid)
                   2646:        vchar_t *vbuf;
                   2647:        struct ph1handle *iph1;
                   2648:        int nptype;
                   2649:        u_int8_t etype;
                   2650:        u_int8_t flags;
                   2651:        u_int32_t msgid;
                   2652: {
                   2653:        struct isakmp *isakmp;
                   2654: 
                   2655:        if (vbuf->l < sizeof(*isakmp))
                   2656:                return NULL;
                   2657: 
                   2658:        isakmp = (struct isakmp *)vbuf->v;
                   2659: 
                   2660:        memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t));
                   2661:        memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t));
                   2662:        isakmp->np = nptype;
                   2663:        isakmp->v = iph1->version;
                   2664:        isakmp->etype = etype;
                   2665:        isakmp->flags = flags;
                   2666:        isakmp->msgid = msgid;
                   2667:        isakmp->len = htonl(vbuf->l);
                   2668: 
                   2669:        return vbuf->v + sizeof(*isakmp);
                   2670: }
                   2671: 
                   2672: /*
                   2673:  * set values into allocated buffer of isakmp header for phase 1
                   2674:  */
                   2675: caddr_t
                   2676: set_isakmp_header1(vbuf, iph1, nptype)
                   2677:        vchar_t *vbuf;
                   2678:        struct ph1handle *iph1;
                   2679:        int nptype;
                   2680: {
                   2681:        return set_isakmp_header (vbuf, iph1, nptype, iph1->etype, iph1->flags, iph1->msgid);
                   2682: }
                   2683: 
                   2684: /*
                   2685:  * set values into allocated buffer of isakmp header for phase 2
                   2686:  */
                   2687: caddr_t
                   2688: set_isakmp_header2(vbuf, iph2, nptype)
                   2689:        vchar_t *vbuf;
                   2690:        struct ph2handle *iph2;
                   2691:        int nptype;
                   2692: {
                   2693:        return set_isakmp_header (vbuf, iph2->ph1, nptype, ISAKMP_ETYPE_QUICK, iph2->flags, iph2->msgid);
                   2694: }
                   2695: 
                   2696: /*
                   2697:  * set values into allocated buffer of isakmp payload.
                   2698:  */
                   2699: caddr_t
                   2700: set_isakmp_payload(buf, src, nptype)
                   2701:        caddr_t buf;
                   2702:        vchar_t *src;
                   2703:        int nptype;
                   2704: {
                   2705:        struct isakmp_gen *gen;
                   2706:        caddr_t p = buf;
                   2707: 
                   2708:        plog(LLV_DEBUG, LOCATION, NULL, "add payload of len %zu, next type %d\n",
                   2709:            src->l, nptype);
                   2710: 
                   2711:        gen = (struct isakmp_gen *)p;
                   2712:        gen->np = nptype;
                   2713:        gen->len = htons(sizeof(*gen) + src->l);
                   2714:        p += sizeof(*gen);
                   2715:        memcpy(p, src->v, src->l);
                   2716:        p += src->l;
                   2717: 
                   2718:        return p;
                   2719: }
                   2720: 
                   2721: static int
                   2722: etypesw1(etype)
                   2723:        int etype;
                   2724: {
                   2725:        switch (etype) {
                   2726:        case ISAKMP_ETYPE_IDENT:
                   2727:                return 1;
                   2728:        case ISAKMP_ETYPE_AGG:
                   2729:                return 2;
                   2730:        case ISAKMP_ETYPE_BASE:
                   2731:                return 3;
                   2732:        default:
                   2733:                return 0;
                   2734:        }
                   2735:        /*NOTREACHED*/
                   2736: }
                   2737: 
                   2738: static int
                   2739: etypesw2(etype)
                   2740:        int etype;
                   2741: {
                   2742:        switch (etype) {
                   2743:        case ISAKMP_ETYPE_QUICK:
                   2744:                return 1;
                   2745:        default:
                   2746:                return 0;
                   2747:        }
                   2748:        /*NOTREACHED*/
                   2749: }
                   2750: 
                   2751: #ifdef HAVE_PRINT_ISAKMP_C
                   2752: /* for print-isakmp.c */
                   2753: char *snapend;
                   2754: extern void isakmp_print __P((const u_char *, u_int, const u_char *));
                   2755: 
                   2756: char *getname __P((const u_char *));
                   2757: #ifdef INET6
                   2758: char *getname6 __P((const u_char *));
                   2759: #endif
                   2760: int safeputchar __P((int));
                   2761: 
                   2762: /*
                   2763:  * Return a name for the IP address pointed to by ap.  This address
                   2764:  * is assumed to be in network byte order.
                   2765:  */
                   2766: char *
                   2767: getname(ap)
                   2768:        const u_char *ap;
                   2769: {
                   2770:        struct sockaddr_in addr;
                   2771:        static char ntop_buf[NI_MAXHOST];
                   2772: 
                   2773:        memset(&addr, 0, sizeof(addr));
                   2774: #ifndef __linux__
                   2775:        addr.sin_len = sizeof(struct sockaddr_in);
                   2776: #endif
                   2777:        addr.sin_family = AF_INET;
                   2778:        memcpy(&addr.sin_addr, ap, sizeof(addr.sin_addr));
                   2779:        if (getnameinfo((struct sockaddr *)&addr, sizeof(addr),
                   2780:                        ntop_buf, sizeof(ntop_buf), NULL, 0,
                   2781:                        NI_NUMERICHOST | niflags))
                   2782:                strlcpy(ntop_buf, "?", sizeof(ntop_buf));
                   2783: 
                   2784:        return ntop_buf;
                   2785: }
                   2786: 
                   2787: #ifdef INET6
                   2788: /*
                   2789:  * Return a name for the IP6 address pointed to by ap.  This address
                   2790:  * is assumed to be in network byte order.
                   2791:  */
                   2792: char *
                   2793: getname6(ap)
                   2794:        const u_char *ap;
                   2795: {
                   2796:        struct sockaddr_in6 addr;
                   2797:        static char ntop_buf[NI_MAXHOST];
                   2798: 
                   2799:        memset(&addr, 0, sizeof(addr));
                   2800:        addr.sin6_len = sizeof(struct sockaddr_in6);
                   2801:        addr.sin6_family = AF_INET6;
                   2802:        memcpy(&addr.sin6_addr, ap, sizeof(addr.sin6_addr));
                   2803:        if (getnameinfo((struct sockaddr *)&addr, addr.sin6_len,
                   2804:                        ntop_buf, sizeof(ntop_buf), NULL, 0,
                   2805:                        NI_NUMERICHOST | niflags))
                   2806:                strlcpy(ntop_buf, "?", sizeof(ntop_buf));
                   2807: 
                   2808:        return ntop_buf;
                   2809: }
                   2810: #endif /* INET6 */
                   2811: 
                   2812: int
                   2813: safeputchar(c)
                   2814:        int c;
                   2815: {
                   2816:        unsigned char ch;
                   2817: 
                   2818:        ch = (unsigned char)(c & 0xff);
                   2819:        if (c < 0x80 && isprint(c))
                   2820:                return printf("%c", c & 0xff);
                   2821:        else
                   2822:                return printf("\\%03o", c & 0xff);
                   2823: }
                   2824: 
                   2825: void
                   2826: isakmp_printpacket(msg, from, my, decoded)
                   2827:        vchar_t *msg;
                   2828:        struct sockaddr *from;
                   2829:        struct sockaddr *my;
                   2830:        int decoded;
                   2831: {
                   2832: #ifdef YIPS_DEBUG
                   2833:        struct timeval tv;
                   2834:        int s;
                   2835:        char hostbuf[NI_MAXHOST];
                   2836:        char portbuf[NI_MAXSERV];
                   2837:        struct isakmp *isakmp;
                   2838:        vchar_t *buf;
                   2839: #endif
                   2840: 
                   2841:        if (loglevel < LLV_DEBUG)
                   2842:                return;
                   2843: 
                   2844: #ifdef YIPS_DEBUG
                   2845:        plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
                   2846: 
                   2847:        gettimeofday(&tv, NULL);
                   2848:        s = tv.tv_sec % 3600;
                   2849:        printf("%02d:%02d.%06u ", s / 60, s % 60, (u_int32_t)tv.tv_usec);
                   2850: 
                   2851:        if (from) {
                   2852:                if (getnameinfo(from, sysdep_sa_len(from), hostbuf, sizeof(hostbuf),
                   2853:                                portbuf, sizeof(portbuf),
                   2854:                                NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
                   2855:                        strlcpy(hostbuf, "?", sizeof(hostbuf));
                   2856:                        strlcpy(portbuf, "?", sizeof(portbuf));
                   2857:                }
                   2858:                printf("%s:%s", hostbuf, portbuf);
                   2859:        } else
                   2860:                printf("?");
                   2861:        printf(" -> ");
                   2862:        if (my) {
                   2863:                if (getnameinfo(my, sysdep_sa_len(my), hostbuf, sizeof(hostbuf),
                   2864:                                portbuf, sizeof(portbuf),
                   2865:                                NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
                   2866:                        strlcpy(hostbuf, "?", sizeof(hostbuf));
                   2867:                        strlcpy(portbuf, "?", sizeof(portbuf));
                   2868:                }
                   2869:                printf("%s:%s", hostbuf, portbuf);
                   2870:        } else
                   2871:                printf("?");
                   2872:        printf(": ");
                   2873: 
                   2874:        buf = vdup(msg);
                   2875:        if (!buf) {
                   2876:                printf("(malloc fail)\n");
                   2877:                return;
                   2878:        }
                   2879:        if (decoded) {
                   2880:                isakmp = (struct isakmp *)buf->v;
                   2881:                if (isakmp->flags & ISAKMP_FLAG_E) {
                   2882: #if 0
                   2883:                        int pad;
                   2884:                        pad = *(u_char *)(buf->v + buf->l - 1);
                   2885:                        if (buf->l < pad && 2 < vflag)
                   2886:                                printf("(wrong padding)");
                   2887: #endif
                   2888:                        isakmp->flags &= ~ISAKMP_FLAG_E;
                   2889:                }
                   2890:        }
                   2891: 
                   2892:        snapend = buf->v + buf->l;
                   2893:        isakmp_print(buf->v, buf->l, NULL);
                   2894:        vfree(buf);
                   2895:        printf("\n");
                   2896:        fflush(stdout);
                   2897: 
                   2898:        return;
                   2899: #endif
                   2900: }
                   2901: #endif /*HAVE_PRINT_ISAKMP_C*/
                   2902: 
                   2903: int
                   2904: copy_ph1addresses(iph1, rmconf, remote, local)
                   2905:        struct ph1handle *iph1;
                   2906:        struct remoteconf *rmconf;
                   2907:        struct sockaddr *remote, *local;
                   2908: {
                   2909:        u_int16_t port;
                   2910: 
                   2911:        /* address portion must be grabbed from real remote address "remote" */
                   2912:        iph1->remote = dupsaddr(remote);
                   2913:        if (iph1->remote == NULL)
                   2914:                return -1;
                   2915: 
                   2916:        /*
                   2917:         * if remote has no port # (in case of initiator - from ACQUIRE msg)
                   2918:         * - if remote.conf specifies port #, use that
                   2919:         * - if remote.conf does not, use 500
                   2920:         * if remote has port # (in case of responder - from recvfrom(2))
                   2921:         * respect content of "remote".
                   2922:         */
                   2923:        if (extract_port(iph1->remote) == 0) {
                   2924:                port = 0;
                   2925:                if (rmconf != NULL)
                   2926:                        port = extract_port(rmconf->remote);
                   2927:                if (port == 0)
                   2928:                        port = PORT_ISAKMP;
                   2929:                set_port(iph1->remote, port);
                   2930:        }
                   2931: 
                   2932:        if (local == NULL)
                   2933:                iph1->local = getlocaladdr(iph1->remote);
                   2934:        else
                   2935:                iph1->local = dupsaddr(local);
                   2936:        if (iph1->local == NULL)
                   2937:                return -1;
                   2938: 
                   2939:        if (extract_port(iph1->local) == 0) {
                   2940:                port = myaddr_getsport(iph1->local);
                   2941:                if (port == 0)
                   2942:                        port = PORT_ISAKMP;
                   2943:                set_port(iph1->local, PORT_ISAKMP);
                   2944:        }
                   2945: 
                   2946: #ifdef ENABLE_NATT
                   2947:        if (extract_port(iph1->local) == lcconf->port_isakmp_natt) {
                   2948:                plog(LLV_DEBUG, LOCATION, NULL, "Marking ports as changed\n");
                   2949:                iph1->natt_flags |= NAT_ADD_NON_ESP_MARKER;
                   2950:        }
                   2951: #endif
                   2952: 
                   2953:        return 0;
                   2954: }
                   2955: 
                   2956: static int
                   2957: nostate1(iph1, msg)
                   2958:        struct ph1handle *iph1;
                   2959:        vchar_t *msg;
                   2960: {
                   2961:        plog(LLV_ERROR, LOCATION, iph1->remote, "wrong state %u.\n",
                   2962:                        iph1->status);
                   2963:        return -1;
                   2964: }
                   2965: 
                   2966: static int
                   2967: nostate2(iph2, msg)
                   2968:        struct ph2handle *iph2;
                   2969:        vchar_t *msg;
                   2970: {
                   2971:        plog(LLV_ERROR, LOCATION, iph2->ph1->remote, "wrong state %u.\n",
                   2972:                iph2->status);
                   2973:        return -1;
                   2974: }
                   2975: 
                   2976: void
                   2977: log_ph1established(iph1)
                   2978:        const struct ph1handle *iph1;
                   2979: {
                   2980:        char *src, *dst;
                   2981: 
                   2982:        src = racoon_strdup(saddr2str(iph1->local));
                   2983:        dst = racoon_strdup(saddr2str(iph1->remote));
                   2984:        STRDUP_FATAL(src);
                   2985:        STRDUP_FATAL(dst);
                   2986: 
                   2987:        plog(LLV_INFO, LOCATION, NULL,
                   2988:                "ISAKMP-SA established %s-%s spi:%s\n",
                   2989:                src, dst,
                   2990:                isakmp_pindex(&iph1->index, 0));
                   2991: 
                   2992:        evt_phase1(iph1, EVT_PHASE1_UP, NULL);
                   2993:        if(!iph1->rmconf->mode_cfg)
                   2994:                evt_phase1(iph1, EVT_PHASE1_MODE_CFG, NULL);
                   2995: 
                   2996:        racoon_free(src);
                   2997:        racoon_free(dst);
                   2998: 
                   2999:        return;
                   3000: }
                   3001: 
                   3002: struct payload_list *
                   3003: isakmp_plist_append_full (struct payload_list *plist, vchar_t *payload,
                   3004:                          u_int8_t payload_type, u_int8_t free_payload)
                   3005: {
                   3006:        if (! plist) {
                   3007:                plist = racoon_malloc (sizeof (struct payload_list));
                   3008:                plist->prev = NULL;
                   3009:        }
                   3010:        else {
                   3011:                plist->next = racoon_malloc (sizeof (struct payload_list));
                   3012:                plist->next->prev = plist;
                   3013:                plist = plist->next;
                   3014:        }
                   3015: 
                   3016:        plist->next = NULL;
                   3017:        plist->payload = payload;
                   3018:        plist->payload_type = payload_type;
                   3019:        plist->free_payload = free_payload;
                   3020: 
                   3021:        return plist;
                   3022: }
                   3023: 
                   3024: vchar_t *
                   3025: isakmp_plist_set_all (struct payload_list **plist, struct ph1handle *iph1)
                   3026: {
                   3027:        struct payload_list *ptr = *plist, *first;
                   3028:        size_t tlen = sizeof (struct isakmp), n = 0;
                   3029:        vchar_t *buf = NULL;
                   3030:        char *p;
                   3031: 
                   3032:        /* Seek to the first item.  */
                   3033:        while (ptr->prev) ptr = ptr->prev;
                   3034:        first = ptr;
                   3035: 
                   3036:        /* Compute the whole length.  */
                   3037:        while (ptr) {
                   3038:                tlen += ptr->payload->l + sizeof (struct isakmp_gen);
                   3039:                ptr = ptr->next;
                   3040:        }
                   3041: 
                   3042:        buf = vmalloc(tlen);
                   3043:        if (buf == NULL) {
                   3044:                plog(LLV_ERROR, LOCATION, NULL,
                   3045:                        "failed to get buffer to send.\n");
                   3046:                goto end;
                   3047:        }
                   3048: 
                   3049:        ptr = first;
                   3050: 
                   3051:        p = set_isakmp_header1(buf, iph1, ptr->payload_type);
                   3052:        if (p == NULL)
                   3053:                goto end;
                   3054: 
                   3055:        while (ptr)
                   3056:        {
                   3057:                p = set_isakmp_payload (p, ptr->payload, ptr->next ? ptr->next->payload_type : ISAKMP_NPTYPE_NONE);
                   3058:                first = ptr;
                   3059:                ptr = ptr->next;
                   3060:                if (first->free_payload)
                   3061:                        vfree(first->payload);
                   3062:                racoon_free (first);
                   3063:                /* ptr->prev = NULL; first = NULL; ... omitted.  */
                   3064:                n++;
                   3065:        }
                   3066: 
                   3067:        *plist = NULL;
                   3068: 
                   3069:        return buf;
                   3070: end:
                   3071:        if (buf != NULL)
                   3072:                vfree(buf);
                   3073:        return NULL;
                   3074: }
                   3075: 
                   3076: #ifdef ENABLE_FRAG
                   3077: int
                   3078: frag_handler(iph1, msg, remote, local)
                   3079:        struct ph1handle *iph1;
                   3080:        vchar_t *msg;
                   3081:        struct sockaddr *remote;
                   3082:        struct sockaddr *local;
                   3083: {
                   3084:        vchar_t *newmsg;
                   3085: 
                   3086:        if (isakmp_frag_extract(iph1, msg) == 1) {
                   3087:                if ((newmsg = isakmp_frag_reassembly(iph1)) == NULL) {
                   3088:                        plog(LLV_ERROR, LOCATION, remote,
                   3089:                            "Packet reassembly failed\n");
                   3090:                        return -1;
                   3091:                }
                   3092:                return isakmp_main(newmsg, remote, local);
                   3093:        }
                   3094: 
                   3095:        return 0;
                   3096: }
                   3097: #endif
                   3098: 
                   3099: void
                   3100: script_hook(iph1, script)
                   3101:        struct ph1handle *iph1;
                   3102:        int script;
                   3103: {
                   3104: #define IP_MAX 40
                   3105: #define PORT_MAX 6
                   3106:        char addrstr[IP_MAX];
                   3107:        char portstr[PORT_MAX];
                   3108:        char **envp = NULL;
                   3109:        int envc = 1;
                   3110:        char **c;
                   3111: 
                   3112:        if (iph1 == NULL ||
                   3113:                iph1->rmconf == NULL ||
                   3114:                iph1->rmconf->script[script] == NULL)
                   3115:                return;
                   3116: 
                   3117: #ifdef ENABLE_HYBRID
                   3118:        (void)isakmp_cfg_setenv(iph1, &envp, &envc);
                   3119: #endif
                   3120: 
                   3121:        /* local address */
                   3122:        GETNAMEINFO(iph1->local, addrstr, portstr);
                   3123: 
                   3124:        if (script_env_append(&envp, &envc, "LOCAL_ADDR", addrstr) != 0) {
                   3125:                plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_ADDR\n");
                   3126:                goto out;
                   3127:        }
                   3128: 
                   3129:        if (script_env_append(&envp, &envc, "LOCAL_PORT", portstr) != 0) {
                   3130:                plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_PORT\n");
                   3131:                goto out;
                   3132:        }
                   3133: 
                   3134:        /* Peer address */
                   3135:        if (iph1->remote != NULL) {
                   3136:                GETNAMEINFO(iph1->remote, addrstr, portstr);
                   3137: 
                   3138:                if (script_env_append(&envp, &envc, 
                   3139:                    "REMOTE_ADDR", addrstr) != 0) {
                   3140:                        plog(LLV_ERROR, LOCATION, NULL, 
                   3141:                            "Cannot set REMOTE_ADDR\n");
                   3142:                        goto out;
                   3143:                }
                   3144: 
                   3145:                if (script_env_append(&envp, &envc, 
                   3146:                    "REMOTE_PORT", portstr) != 0) {
                   3147:                        plog(LLV_ERROR, LOCATION, NULL, 
                   3148:                            "Cannot set REMOTEL_PORT\n");
                   3149:                        goto out;
                   3150:                }
                   3151:        }
                   3152: 
                   3153:        /* Peer identity. */
                   3154:        if (iph1->id_p != NULL) {
                   3155:                if (script_env_append(&envp, &envc, "REMOTE_ID",
                   3156:                                      ipsecdoi_id2str(iph1->id_p)) != 0) {
                   3157:                        plog(LLV_ERROR, LOCATION, NULL,
                   3158:                             "Cannot set REMOTE_ID\n");
                   3159:                        goto out;
                   3160:                }
                   3161:        }
                   3162: 
                   3163:        if (privsep_script_exec(iph1->rmconf->script[script]->v, 
                   3164:            script, envp) != 0) 
                   3165:                plog(LLV_ERROR, LOCATION, NULL, 
                   3166:                    "Script %s execution failed\n", script_names[script]);
                   3167: 
                   3168: out:
                   3169:        for (c = envp; *c; c++)
                   3170:                racoon_free(*c);
                   3171: 
                   3172:        racoon_free(envp);
                   3173: 
                   3174:        return;
                   3175: }
                   3176: 
                   3177: int
                   3178: script_env_append(envp, envc, name, value)
                   3179:        char ***envp;
                   3180:        int *envc;
                   3181:        char *name;
                   3182:        char *value;
                   3183: {
                   3184:        char *envitem;
                   3185:        char **newenvp;
                   3186:        int newenvc;
                   3187: 
                   3188:        envitem = racoon_malloc(strlen(name) + 1 + strlen(value) + 1);
                   3189:        if (envitem == NULL) {
                   3190:                plog(LLV_ERROR, LOCATION, NULL,
                   3191:                    "Cannot allocate memory: %s\n", strerror(errno));
                   3192:                return -1;
                   3193:        }
                   3194:        sprintf(envitem, "%s=%s", name, value);
                   3195: 
                   3196:        newenvc = (*envc) + 1;
                   3197:        newenvp = racoon_realloc(*envp, newenvc * sizeof(char *));
                   3198:        if (newenvp == NULL) {
                   3199:                plog(LLV_ERROR, LOCATION, NULL,
                   3200:                    "Cannot allocate memory: %s\n", strerror(errno));
                   3201:                racoon_free(envitem);
                   3202:                return -1;
                   3203:        }
                   3204: 
                   3205:        newenvp[newenvc - 2] = envitem;
                   3206:        newenvp[newenvc - 1] = NULL;
                   3207: 
                   3208:        *envp = newenvp;
                   3209:        *envc = newenvc;
                   3210:        return 0;
                   3211: }
                   3212: 
                   3213: int
                   3214: script_exec(script, name, envp)
                   3215:        char *script;
                   3216:        int name;
                   3217:        char *const envp[];
                   3218: {
                   3219:        char *argv[] = { NULL, NULL, NULL };
                   3220: 
                   3221:        argv[0] = script;
                   3222:        argv[1] = script_names[name];
                   3223:        argv[2] = NULL;
                   3224: 
                   3225:        switch (fork()) {
                   3226:        case 0:
                   3227:                execve(argv[0], argv, envp);
                   3228:                plog(LLV_ERROR, LOCATION, NULL,
                   3229:                    "execve(\"%s\") failed: %s\n",
                   3230:                    argv[0], strerror(errno));
                   3231:                _exit(1);
                   3232:                break;
                   3233:        case -1:
                   3234:                plog(LLV_ERROR, LOCATION, NULL,
                   3235:                    "Cannot fork: %s\n", strerror(errno));
                   3236:                return -1;
                   3237:                break;
                   3238:        default:
                   3239:                break;
                   3240:        }
                   3241:        return 0;
                   3242: 
                   3243: }
                   3244: 
                   3245: void
                   3246: purge_remote(iph1)
                   3247:        struct ph1handle *iph1;
                   3248: {
                   3249:        vchar_t *buf = NULL;
                   3250:        struct sadb_msg *msg, *next, *end;
                   3251:        struct sadb_sa *sa;
                   3252:        struct sockaddr *src, *dst;
                   3253:        caddr_t mhp[SADB_EXT_MAX + 1];
                   3254:        u_int proto_id;
                   3255:        struct ph2handle *iph2;
                   3256:        struct ph1handle *new_iph1;
                   3257: 
                   3258:        plog(LLV_INFO, LOCATION, NULL,
                   3259:                 "purging ISAKMP-SA spi=%s.\n",
                   3260:                 isakmp_pindex(&(iph1->index), iph1->msgid));
                   3261: 
                   3262:        /* Mark as expired. */
                   3263:        iph1->status = PHASE1ST_EXPIRED;
                   3264: 
                   3265:        /* Check if we have another, still valid, phase1 SA. */
                   3266:        new_iph1 = getph1(iph1, iph1->local, iph1->remote, GETPH1_F_ESTABLISHED);
                   3267: 
                   3268:        /*
                   3269:         * Delete all orphaned or binded to the deleting ph1handle phase2 SAs.
                   3270:         * Keep all others phase2 SAs.
                   3271:         */
                   3272:        buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
                   3273:        if (buf == NULL) {
                   3274:                plog(LLV_DEBUG, LOCATION, NULL,
                   3275:                        "pfkey_dump_sadb returned nothing.\n");
                   3276:                return;
                   3277:        }
                   3278: 
                   3279:        msg = (struct sadb_msg *)buf->v;
                   3280:        end = (struct sadb_msg *)(buf->v + buf->l);
                   3281: 
                   3282:        while (msg < end) {
                   3283:                if ((msg->sadb_msg_len << 3) < sizeof(*msg))
                   3284:                        break;
                   3285:                next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
                   3286:                if (msg->sadb_msg_type != SADB_DUMP) {
                   3287:                        msg = next;
                   3288:                        continue;
                   3289:                }
                   3290: 
                   3291:                if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
                   3292:                        plog(LLV_ERROR, LOCATION, NULL,
                   3293:                                "pfkey_check (%s)\n", ipsec_strerror());
                   3294:                        msg = next;
                   3295:                        continue;
                   3296:                }
                   3297: 
                   3298:                sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
                   3299:                if (!sa ||
                   3300:                    !mhp[SADB_EXT_ADDRESS_SRC] ||
                   3301:                    !mhp[SADB_EXT_ADDRESS_DST]) {
                   3302:                        msg = next;
                   3303:                        continue;
                   3304:                }
                   3305:                pk_fixup_sa_addresses(mhp);
                   3306:                src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
                   3307:                dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
                   3308: 
                   3309:                if (sa->sadb_sa_state != SADB_SASTATE_LARVAL &&
                   3310:                    sa->sadb_sa_state != SADB_SASTATE_MATURE &&
                   3311:                    sa->sadb_sa_state != SADB_SASTATE_DYING) {
                   3312:                        msg = next;
                   3313:                        continue;
                   3314:                }
                   3315: 
                   3316:                /*
                   3317:                 * check in/outbound SAs.
                   3318:                 * Select only SAs where src == local and dst == remote (outgoing)
                   3319:                 * or src == remote and dst == local (incoming).
                   3320:                 */
                   3321:                if ((cmpsaddr(iph1->local, src) != CMPSADDR_MATCH ||
                   3322:                     cmpsaddr(iph1->remote, dst) != CMPSADDR_MATCH) &&
                   3323:                    (cmpsaddr(iph1->local, dst) != CMPSADDR_MATCH ||
                   3324:                     cmpsaddr(iph1->remote, src) != CMPSADDR_MATCH)) {
                   3325:                        msg = next;
                   3326:                        continue;
                   3327:                }
                   3328: 
                   3329:                proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
                   3330:                iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
                   3331: 
                   3332:                /* Check if there is another valid ISAKMP-SA */
                   3333:                if (new_iph1 != NULL) {
                   3334: 
                   3335:                        if (iph2 == NULL) {
                   3336:                                /* No handler... still send a pfkey_delete message, but log this !*/
                   3337:                                plog(LLV_INFO, LOCATION, NULL,
                   3338:                                        "Unknown IPsec-SA spi=%u, hmmmm?\n",
                   3339:                                        ntohl(sa->sadb_sa_spi));
                   3340:                        }else{
                   3341: 
                   3342:                                /*
                   3343:                                 * If we have a new ph1, do not purge IPsec-SAs binded
                   3344:                                 *  to a different ISAKMP-SA
                   3345:                                 */
                   3346:                                if (iph2->ph1 != NULL && iph2->ph1 != iph1){
                   3347:                                        msg = next;
                   3348:                                        continue;
                   3349:                                }
                   3350: 
                   3351:                                /* If the ph2handle is established, do not purge IPsec-SA */
                   3352:                                if (iph2->status == PHASE2ST_ESTABLISHED ||
                   3353:                                        iph2->status == PHASE2ST_EXPIRED) {
                   3354: 
                   3355:                                        plog(LLV_INFO, LOCATION, NULL,
                   3356:                                                 "keeping IPsec-SA spi=%u - found valid ISAKMP-SA spi=%s.\n",
                   3357:                                                 ntohl(sa->sadb_sa_spi),
                   3358:                                                 isakmp_pindex(&(new_iph1->index), new_iph1->msgid));
                   3359:                                        msg = next;
                   3360:                                        continue;
                   3361:                                }
                   3362:                        }
                   3363:                }
                   3364: 
                   3365: 
                   3366:                pfkey_send_delete(lcconf->sock_pfkey,
                   3367:                                  msg->sadb_msg_satype,
                   3368:                                  IPSEC_MODE_ANY,
                   3369:                                  src, dst, sa->sadb_sa_spi);
                   3370: 
                   3371:                /* delete a relative phase 2 handle. */
                   3372:                if (iph2 != NULL) {
                   3373:                        delete_spd(iph2, 0);
                   3374:                        remph2(iph2);
                   3375:                        delph2(iph2);
                   3376:                }
                   3377: 
                   3378:                plog(LLV_INFO, LOCATION, NULL,
                   3379:                         "purged IPsec-SA spi=%u.\n",
                   3380:                         ntohl(sa->sadb_sa_spi));
                   3381: 
                   3382:                msg = next;
                   3383:        }
                   3384: 
                   3385:        if (buf)
                   3386:                vfree(buf);
                   3387: 
                   3388:        /* Mark the phase1 handler as EXPIRED */
                   3389:        plog(LLV_INFO, LOCATION, NULL,
                   3390:                 "purged ISAKMP-SA spi=%s.\n",
                   3391:                 isakmp_pindex(&(iph1->index), iph1->msgid));
                   3392: 
                   3393:        isakmp_ph1delete(iph1);
                   3394: }
                   3395: 
                   3396: void
                   3397: delete_spd(iph2, created)
                   3398:        struct ph2handle *iph2;
                   3399:        u_int64_t created;
                   3400: {
                   3401:        struct policyindex spidx;
                   3402:        struct sockaddr_storage addr;
                   3403:        u_int8_t pref;
                   3404:        struct sockaddr *src;
                   3405:        struct sockaddr *dst;
                   3406:        int error;
                   3407:        int idi2type = 0;/* switch whether copy IDs into id[src,dst]. */
                   3408: 
                   3409:        if (iph2 == NULL)
                   3410:                return;
                   3411: 
                   3412:        /* Delete the SPD entry if we generated it
                   3413:         */
                   3414:        if (! iph2->generated_spidx )
                   3415:                return;
                   3416: 
                   3417:        src = iph2->src;
                   3418:        dst = iph2->dst;
                   3419: 
                   3420:        plog(LLV_INFO, LOCATION, NULL,
                   3421:                 "deleting a generated policy.\n");
                   3422: 
                   3423:        memset(&spidx, 0, sizeof(spidx));
                   3424:        iph2->spidx_gen = (caddr_t )&spidx;
                   3425: 
                   3426:        /* make inbound policy */
                   3427:        iph2->src = dst;
                   3428:        iph2->dst = src;
                   3429:        spidx.dir = IPSEC_DIR_INBOUND;
                   3430:        spidx.ul_proto = 0;
                   3431: 
                   3432:        /*
                   3433:         * Note: code from get_proposal_r
                   3434:         */
                   3435: 
                   3436: #define _XIDT(d) ((struct ipsecdoi_id_b *)(d)->v)->type
                   3437: 
                   3438:        /*
                   3439:         * make destination address in spidx from either ID payload
                   3440:         * or phase 1 address into a address in spidx.
                   3441:         */
                   3442:        if (iph2->id != NULL
                   3443:                && (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
                   3444:                        || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR
                   3445:                        || _XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR_SUBNET
                   3446:                        || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
                   3447:                /* get a destination address of a policy */
                   3448:                error = ipsecdoi_id2sockaddr(iph2->id,
                   3449:                                                                         (struct sockaddr *)&spidx.dst,
                   3450:                                                                         &spidx.prefd, &spidx.ul_proto);
                   3451:                if (error)
                   3452:                        goto purge;
                   3453: 
                   3454: #ifdef INET6
                   3455:                /*
                   3456:                 * get scopeid from the SA address.
                   3457:                 * note that the phase 1 source address is used as
                   3458:                 * a destination address to search for a inbound
                   3459:                 * policy entry because rcoon is responder.
                   3460:                 */
                   3461:                if (_XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR) {
                   3462:                        if ((error =
                   3463:                                 setscopeid((struct sockaddr *)&spidx.dst,
                   3464:                                                        iph2->src)) != 0)
                   3465:                                goto purge;
                   3466:                }
                   3467: #endif
                   3468: 
                   3469:                if (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
                   3470:                        || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR)
                   3471:                        idi2type = _XIDT(iph2->id);
                   3472: 
                   3473:        } else {
                   3474: 
                   3475:                plog(LLV_DEBUG, LOCATION, NULL,
                   3476:                         "get a destination address of SP index "
                   3477:                         "from phase1 address "
                   3478:                         "due to no ID payloads found "
                   3479:                         "OR because ID type is not address.\n");
                   3480: 
                   3481:                /*
                   3482:                 * copy the SOURCE address of IKE into the
                   3483:                 * DESTINATION address of the key to search the
                   3484:                 * SPD because the direction of policy is inbound.
                   3485:                 */
                   3486:                memcpy(&spidx.dst, iph2->src, sysdep_sa_len(iph2->src));
                   3487:                switch (spidx.dst.ss_family) {
                   3488:                case AF_INET:
                   3489:                        spidx.prefd =
                   3490:                                sizeof(struct in_addr) << 3;
                   3491:                        break;
                   3492: #ifdef INET6
                   3493:                case AF_INET6:
                   3494:                        spidx.prefd =
                   3495:                                sizeof(struct in6_addr) << 3;
                   3496:                        break;
                   3497: #endif
                   3498:                default:
                   3499:                        spidx.prefd = 0;
                   3500:                        break;
                   3501:                }
                   3502:        }
                   3503: 
                   3504:                /* make source address in spidx */
                   3505:        if (iph2->id_p != NULL
                   3506:                && (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR
                   3507:                        || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR
                   3508:                        || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR_SUBNET
                   3509:                        || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
                   3510:                /* get a source address of inbound SA */
                   3511:                error = ipsecdoi_id2sockaddr(iph2->id_p,
                   3512:                                             (struct sockaddr *)&spidx.src,
                   3513:                                             &spidx.prefs, &spidx.ul_proto);
                   3514:                if (error)
                   3515:                        goto purge;
                   3516: 
                   3517: #ifdef INET6
                   3518:                /*
                   3519:                 * get scopeid from the SA address.
                   3520:                 * for more detail, see above of this function.
                   3521:                 */
                   3522:                if (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR) {
                   3523:                        error =
                   3524:                                setscopeid((struct sockaddr *)&spidx.src,
                   3525:                                                   iph2->dst);
                   3526:                        if (error)
                   3527:                                goto purge;
                   3528:                }
                   3529: #endif
                   3530: 
                   3531:                /* make sa_[src,dst] if both ID types are IP address and same */
                   3532:                if (_XIDT(iph2->id_p) == idi2type
                   3533:                        && spidx.dst.ss_family == spidx.src.ss_family) {
                   3534:                        iph2->sa_src =
                   3535:                                dupsaddr((struct sockaddr *)&spidx.dst);
                   3536:                        if (iph2->sa_src == NULL) {
                   3537:                                plog(LLV_ERROR, LOCATION, NULL,
                   3538:                                         "allocation failed\n");
                   3539:                                goto purge;
                   3540:                        }
                   3541:                        iph2->sa_dst =
                   3542:                                dupsaddr((struct sockaddr *)&spidx.src);
                   3543:                        if (iph2->sa_dst == NULL) {
                   3544:                                plog(LLV_ERROR, LOCATION, NULL,
                   3545:                                         "allocation failed\n");
                   3546:                                goto purge;
                   3547:                        }
                   3548:                }
                   3549: 
                   3550:        } else {
                   3551:                plog(LLV_DEBUG, LOCATION, NULL,
                   3552:                         "get a source address of SP index "
                   3553:                         "from phase1 address "
                   3554:                         "due to no ID payloads found "
                   3555:                         "OR because ID type is not address.\n");
                   3556: 
                   3557:                /* see above comment. */
                   3558:                memcpy(&spidx.src, iph2->dst, sysdep_sa_len(iph2->dst));
                   3559:                switch (spidx.src.ss_family) {
                   3560:                case AF_INET:
                   3561:                        spidx.prefs =
                   3562:                                sizeof(struct in_addr) << 3;
                   3563:                        break;
                   3564: #ifdef INET6
                   3565:                case AF_INET6:
                   3566:                        spidx.prefs =
                   3567:                                sizeof(struct in6_addr) << 3;
                   3568:                        break;
                   3569: #endif
                   3570:                default:
                   3571:                        spidx.prefs = 0;
                   3572:                        break;
                   3573:                }
                   3574:        }
                   3575: 
                   3576: #undef _XIDT
                   3577: 
                   3578:        plog(LLV_DEBUG, LOCATION, NULL,
                   3579:                 "get a src address from ID payload "
                   3580:                 "%s prefixlen=%u ul_proto=%u\n",
                   3581:                 saddr2str((struct sockaddr *)&spidx.src),
                   3582:                 spidx.prefs, spidx.ul_proto);
                   3583:        plog(LLV_DEBUG, LOCATION, NULL,
                   3584:                 "get dst address from ID payload "
                   3585:                 "%s prefixlen=%u ul_proto=%u\n",
                   3586:                 saddr2str((struct sockaddr *)&spidx.dst),
                   3587:                 spidx.prefd, spidx.ul_proto);
                   3588: 
                   3589:        /*
                   3590:         * convert the ul_proto if it is 0
                   3591:         * because 0 in ID payload means a wild card.
                   3592:         */
                   3593:        if (spidx.ul_proto == 0)
                   3594:                spidx.ul_proto = IPSEC_ULPROTO_ANY;
                   3595: 
                   3596: #undef _XIDT
                   3597: 
                   3598:        /* Check if the generated SPD has the same timestamp as the SA.
                   3599:         * If timestamps are different, this means that the SPD entry has been
                   3600:         * refreshed by another SA, and should NOT be deleted with the current SA.
                   3601:         */
                   3602:        if( created ){
                   3603:                struct secpolicy *p;
                   3604: 
                   3605:                p = getsp(&spidx);
                   3606:                if(p != NULL){
                   3607:                        /* just do no test if p is NULL, because this probably just means
                   3608:                         * that the policy has already be deleted for some reason.
                   3609:                         */
                   3610:                        if(p->spidx.created != created)
                   3611:                                goto purge;
                   3612:                }
                   3613:        }
                   3614: 
                   3615:        /* End of code from get_proposal_r
                   3616:         */
                   3617: 
                   3618:        if (pk_sendspddelete(iph2) < 0) {
                   3619:                plog(LLV_ERROR, LOCATION, NULL,
                   3620:                         "pfkey spddelete(inbound) failed.\n");
                   3621:        }else{
                   3622:                plog(LLV_DEBUG, LOCATION, NULL,
                   3623:                         "pfkey spddelete(inbound) sent.\n");
                   3624:        }
                   3625: 
                   3626: #ifdef HAVE_POLICY_FWD
                   3627:        /* make forward policy if required */
                   3628:        if (tunnel_mode_prop(iph2->approval)) {
                   3629:                spidx.dir = IPSEC_DIR_FWD;
                   3630:                if (pk_sendspddelete(iph2) < 0) {
                   3631:                        plog(LLV_ERROR, LOCATION, NULL,
                   3632:                                 "pfkey spddelete(forward) failed.\n");
                   3633:                }else{
                   3634:                        plog(LLV_DEBUG, LOCATION, NULL,
                   3635:                                 "pfkey spddelete(forward) sent.\n");
                   3636:                }
                   3637:        }
                   3638: #endif
                   3639: 
                   3640:        /* make outbound policy */
                   3641:        iph2->src = src;
                   3642:        iph2->dst = dst;
                   3643:        spidx.dir = IPSEC_DIR_OUTBOUND;
                   3644:        addr = spidx.src;
                   3645:        spidx.src = spidx.dst;
                   3646:        spidx.dst = addr;
                   3647:        pref = spidx.prefs;
                   3648:        spidx.prefs = spidx.prefd;
                   3649:        spidx.prefd = pref;
                   3650: 
                   3651:        if (pk_sendspddelete(iph2) < 0) {
                   3652:                plog(LLV_ERROR, LOCATION, NULL,
                   3653:                         "pfkey spddelete(outbound) failed.\n");
                   3654:        }else{
                   3655:                plog(LLV_DEBUG, LOCATION, NULL,
                   3656:                         "pfkey spddelete(outbound) sent.\n");
                   3657:        }
                   3658: purge:
                   3659:        iph2->spidx_gen=NULL;
                   3660: }
                   3661: 
                   3662: 
                   3663: #ifdef INET6
                   3664: u_int32_t
                   3665: setscopeid(sp_addr0, sa_addr0)
                   3666:        struct sockaddr *sp_addr0, *sa_addr0;
                   3667: {
                   3668:        struct sockaddr_in6 *sp_addr, *sa_addr;
                   3669: 
                   3670:        sp_addr = (struct sockaddr_in6 *)sp_addr0;
                   3671:        sa_addr = (struct sockaddr_in6 *)sa_addr0;
                   3672: 
                   3673:        if (!IN6_IS_ADDR_LINKLOCAL(&sp_addr->sin6_addr)
                   3674:         && !IN6_IS_ADDR_SITELOCAL(&sp_addr->sin6_addr)
                   3675:         && !IN6_IS_ADDR_MULTICAST(&sp_addr->sin6_addr))
                   3676:                return 0;
                   3677: 
                   3678:        /* this check should not be here ? */
                   3679:        if (sa_addr->sin6_family != AF_INET6) {
                   3680:                plog(LLV_ERROR, LOCATION, NULL,
                   3681:                        "can't get scope ID: family mismatch\n");
                   3682:                return -1;
                   3683:        }
                   3684: 
                   3685:        if (!IN6_IS_ADDR_LINKLOCAL(&sa_addr->sin6_addr)) {
                   3686:                plog(LLV_ERROR, LOCATION, NULL,
                   3687:                        "scope ID is not supported except of lladdr.\n");
                   3688:                return -1;
                   3689:        }
                   3690: 
                   3691:        sp_addr->sin6_scope_id = sa_addr->sin6_scope_id;
                   3692: 
                   3693:        return 0;
                   3694: }
                   3695: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>