diff --git a/Android.bp b/Android.bp
index 0ed452d..c4e2761 100644
--- a/Android.bp
+++ b/Android.bp
@@ -50,80 +50,6 @@
     ],
 }
 
-cc_binary {
-    name: "racoon",
-
-    srcs: [
-        "src/racoon/algorithm.c",
-        "src/racoon/crypto_openssl.c",
-        "src/racoon/genlist.c",
-        "src/racoon/handler.c",
-        "src/racoon/isakmp.c",
-        "src/racoon/isakmp_agg.c",
-        "src/racoon/isakmp_base.c",
-        "src/racoon/isakmp_cfg.c",
-        "src/racoon/isakmp_frag.c",
-        "src/racoon/isakmp_ident.c",
-        "src/racoon/isakmp_inf.c",
-        "src/racoon/isakmp_newg.c",
-        "src/racoon/isakmp_quick.c",
-        "src/racoon/isakmp_unity.c",
-        "src/racoon/isakmp_xauth.c",
-        "src/racoon/ipsec_doi.c",
-        "src/racoon/nattraversal.c",
-        "src/racoon/oakley.c",
-        "src/racoon/pfkey.c",
-        "src/racoon/policy.c",
-        "src/racoon/proposal.c",
-        "src/racoon/remoteconf.c",
-        "src/racoon/schedule.c",
-        "src/racoon/sockmisc.c",
-        "src/racoon/str2val.c",
-        "src/racoon/strnames.c",
-        "src/racoon/vendorid.c",
-        "src/racoon/vmbuf.c",
-        "main.c",
-        "setup.c",
-    ],
-
-    local_include_dirs: [
-        "src/include-glibc",
-        "src/racoon",
-        "src/racoon/missing",
-    ],
-
-    static_libs: ["libipsec"],
-
-    shared_libs: [
-        "libcutils",
-        "liblog",
-        "libcrypto",
-        "libkeystore-engine",
-        "libnetd_client",
-    ],
-
-    cflags: [
-        "-DANDROID_CHANGES",
-        "-DHAVE_CONFIG_H",
-        "-D_BSD_SOURCE=1",
-
-        "-Wno-sign-compare",
-        "-Wno-missing-field-initializers",
-        "-Wno-unused-parameter",
-        "-Wno-pointer-sign",
-        "-Werror",
-
-        // Turn off unused XXX warnings. Should be removed/fixed when syncing with upstream. b/18523687, b/18632512
-        "-Wno-unused-variable",
-        "-Wno-unused-but-set-variable",
-        "-Wno-unused-function",
-        "-Wno-unused-label",
-        "-Wno-unused-value",
-    ],
-
-    init_rc: ["racoon.rc"],
-}
-
 cc_library_static {
     name: "libipsec",
 
diff --git a/Makefile b/Makefile
deleted file mode 100644
index d8c417f..0000000
--- a/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-all:
-	gcc -O3 -Wall -o racoon -I. -Isrc/include-glibc -Isrc/libipsec \
-	-Isrc/racoon -Isrc/racoon/missing -DHAVE_CONFIG_H -lcrypto \
-	src/libipsec/pfkey.c \
-	src/libipsec/ipsec_strerror.c \
-	src/racoon/algorithm.c \
-	src/racoon/crypto_openssl.c \
-	src/racoon/genlist.c \
-	src/racoon/handler.c \
-	src/racoon/isakmp.c \
-	src/racoon/isakmp_agg.c \
-	src/racoon/isakmp_base.c \
-	src/racoon/isakmp_cfg.c \
-	src/racoon/isakmp_frag.c \
-	src/racoon/isakmp_ident.c \
-	src/racoon/isakmp_inf.c \
-	src/racoon/isakmp_newg.c \
-	src/racoon/isakmp_quick.c \
-	src/racoon/isakmp_unity.c \
-	src/racoon/isakmp_xauth.c \
-	src/racoon/ipsec_doi.c \
-	src/racoon/nattraversal.c \
-	src/racoon/oakley.c \
-	src/racoon/pfkey.c \
-	src/racoon/policy.c \
-	src/racoon/proposal.c \
-	src/racoon/remoteconf.c \
-	src/racoon/schedule.c \
-	src/racoon/sockmisc.c \
-	src/racoon/str2val.c \
-	src/racoon/strnames.c \
-	src/racoon/vendorid.c \
-	src/racoon/vmbuf.c \
-	main.c \
-	setup.c
diff --git a/README b/README
index 2e4f90a..e366133 100644
--- a/README
+++ b/README
@@ -6,7 +6,6 @@
 
 	- libipsec, a PF_KEYv2 library
 	- setkey, a tool to directly manipulate policies and SAs
-	- racoon, an IKEv1 keying daemon
 
 IPsec-tools were ported to Linux from the KAME project 
 (http://www.kame.net) by Derek Atkins  <derek@ihtfp.com>.
diff --git a/main.c b/main.c
deleted file mode 100644
index 63862c5..0000000
--- a/main.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <signal.h>
-#include <poll.h>
-#include <unistd.h>
-
-#include "config.h"
-#include "gcmalloc.h"
-#include "schedule.h"
-#include "plog.h"
-
-#ifdef ANDROID_CHANGES
-
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <linux/if.h>
-#include <linux/if_tun.h>
-
-#include <android/log.h>
-#include <cutils/sockets.h>
-#include <private/android_filesystem_config.h>
-
-static void notify_death()
-{
-    creat("/data/misc/vpn/abort", 0);
-}
-
-static int android_get_control_and_arguments(int *argc, char ***argv)
-{
-    static char *args[32];
-    int control;
-    int i;
-
-    atexit(notify_death);
-
-    if ((i = android_get_control_socket("racoon")) == -1) {
-        return -1;
-    }
-    do_plog(LLV_DEBUG, "Waiting for control socket");
-    if (listen(i, 1) == -1 || (control = accept(i, NULL, 0)) == -1) {
-        do_plog(LLV_ERROR, "Cannot get control socket");
-        exit(1);
-    }
-    close(i);
-    fcntl(control, F_SETFD, FD_CLOEXEC);
-
-    args[0] = (*argv)[0];
-    for (i = 1; i < 32; ++i) {
-        unsigned char bytes[2];
-        if (recv(control, &bytes[0], 1, 0) != 1 ||
-                recv(control, &bytes[1], 1, 0) != 1) {
-            do_plog(LLV_ERROR, "Cannot get argument length");
-            exit(1);
-        } else {
-            int length = bytes[0] << 8 | bytes[1];
-            int offset = 0;
-
-            if (length == 0xFFFF) {
-                break;
-            }
-            args[i] = malloc(length + 1);
-            while (offset < length) {
-                int n = recv(control, &args[i][offset], length - offset, 0);
-                if (n > 0) {
-                    offset += n;
-                } else {
-                    do_plog(LLV_ERROR, "Cannot get argument value");
-                    exit(1);
-                }
-            }
-            args[i][length] = 0;
-        }
-    }
-    do_plog(LLV_DEBUG, "Received %d arguments", i - 1);
-
-    *argc = i;
-    *argv = args;
-    return control;
-}
-
-const char *android_hook(char **envp)
-{
-    struct ifreq ifr = {.ifr_flags = IFF_TUN};
-    int tun = open("/dev/tun", 0);
-
-    /* Android does not support INTERNAL_WINS4_LIST, so we just use it. */
-    while (*envp && strncmp(*envp, "INTERNAL_WINS4_LIST=", 20)) {
-        ++envp;
-    }
-    if (!*envp) {
-        do_plog(LLV_ERROR, "Cannot find environment variable\n");
-        exit(1);
-    }
-    if (ioctl(tun, TUNSETIFF, &ifr)) {
-        do_plog(LLV_ERROR, "Cannot allocate TUN: %s\n", strerror(errno));
-        exit(1);
-    }
-    sprintf(*envp, "INTERFACE=%s", ifr.ifr_name);
-    return "/system/bin/ip-up-vpn";
-}
-
-#endif
-
-extern void setup(int argc, char **argv);
-extern void shutdown_session();
-
-static int monitors;
-static void (*callbacks[10])(int fd);
-static struct pollfd pollfds[10];
-
-char *pname;
-
-static void terminate(int signal)
-{
-    exit(1);
-}
-
-static void terminated()
-{
-    do_plog(LLV_INFO, "Bye\n");
-}
-
-void monitor_fd(int fd, void (*callback)(int))
-{
-    if (fd < 0 || monitors == 10) {
-        do_plog(LLV_ERROR, "Cannot monitor fd");
-        exit(1);
-    }
-    callbacks[monitors] = callback;
-    pollfds[monitors].fd = fd;
-    pollfds[monitors].events = callback ? POLLIN : 0;
-    ++monitors;
-}
-
-int main(int argc, char **argv)
-{
-#ifdef ANDROID_CHANGES
-    int control = android_get_control_and_arguments(&argc, &argv);
-
-    if (control != -1) {
-        pname = "%p";
-        monitor_fd(control, NULL);
-    }
-#endif
-
-    do_plog(LLV_INFO, "ipsec-tools 0.7.3 (http://ipsec-tools.sf.net)\n");
-
-    signal(SIGHUP, terminate);
-    signal(SIGINT, terminate);
-    signal(SIGTERM, terminate);
-    signal(SIGPIPE, SIG_IGN);
-    atexit(terminated);
-
-    setup(argc, argv);
-
-#ifdef ANDROID_CHANGES
-    shutdown(control, SHUT_WR);
-#endif
-
-    while (1) {
-        struct timeval *tv = schedular();
-        int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000 + 1;
-
-        if (poll(pollfds, monitors, timeout) > 0) {
-            int i;
-            for (i = 0; i < monitors; ++i) {
-                if (pollfds[i].revents & POLLHUP) {
-                    do_plog(LLV_INFO, "Connection is closed\n", pollfds[i].fd);
-                    shutdown_session();
-
-                    /* Wait for few seconds to consume late messages. */
-                    sleep(5);
-                    exit(1);
-                }
-                if (pollfds[i].revents & POLLIN) {
-                    callbacks[i](pollfds[i].fd);
-                }
-            }
-        }
-    }
-
-    return 0;
-}
-
-/* plog.h */
-
-void do_plog(int level, char *format, ...)
-{
-    if (level >= 0 && level <= 5) {
-#ifdef ANDROID_CHANGES
-        static int levels[6] = {
-            ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO,
-            ANDROID_LOG_INFO, ANDROID_LOG_DEBUG, ANDROID_LOG_VERBOSE
-        };
-        va_list ap;
-        va_start(ap, format);
-        __android_log_vprint(levels[level], "racoon", format, ap);
-        va_end(ap);
-#else
-        static char *levels = "EWNIDV";
-        fprintf(stderr, "%c: ", levels[level]);
-        va_list ap;
-        va_start(ap, format);
-        vfprintf(stderr, format, ap);
-        va_end(ap);
-#endif
-    }
-}
-
-char *binsanitize(char *data, size_t length)
-{
-    char *output = racoon_malloc(length + 1);
-    if (output) {
-        size_t i;
-        for (i = 0; i < length; ++i) {
-            output[i] = (data[i] < ' ' || data[i] > '~') ? '?' : data[i];
-        }
-        output[length] = '\0';
-    }
-    return output;
-}
diff --git a/racoon.rc b/racoon.rc
deleted file mode 100644
index fdb8823..0000000
--- a/racoon.rc
+++ /dev/null
@@ -1,9 +0,0 @@
-service racoon /system/bin/racoon
-    class main
-    socket racoon stream 600 system system
-    # IKE uses UDP port 500.
-    user vpn
-    group vpn inet
-    capabilities NET_ADMIN NET_BIND_SERVICE NET_RAW
-    disabled
-    oneshot
diff --git a/setup.c b/setup.c
deleted file mode 100644
index 9cbe2f9..0000000
--- a/setup.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/ip.h>
-#include <netdb.h>
-#include <fcntl.h>
-
-#include "config.h"
-#include "gcmalloc.h"
-#include "libpfkey.h"
-#include "var.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_xauth.h"
-#include "vmbuf.h"
-#include "crypto_openssl.h"
-#include "oakley.h"
-#include "ipsec_doi.h"
-#include "algorithm.h"
-#include "vendorid.h"
-#include "schedule.h"
-#include "pfkey.h"
-#include "nattraversal.h"
-#include "proposal.h"
-#include "sainfo.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "sockmisc.h"
-#include "grabmyaddr.h"
-#include "plog.h"
-#include "admin.h"
-#include "privsep.h"
-#include "throttle.h"
-#include "misc.h"
-#include "handler.h"
-
-static struct localconf localconf;
-static struct sainfo sainfo;
-static char *pre_shared_key;
-
-static struct sockaddr *targets[2];
-static struct sockaddr *source;
-static struct myaddrs myaddrs[2];
-
-struct localconf *lcconf = &localconf;
-int f_local = 0;
-
-/*****************************************************************************/
-
-static void add_sainfo_algorithm(int class, int algorithm, int length)
-{
-    struct sainfoalg *p = calloc(1, sizeof(struct sainfoalg));
-    p->alg = algorithm;
-    p->encklen = length;
-
-    if (!sainfo.algs[class]) {
-        sainfo.algs[class] = p;
-    } else {
-        struct sainfoalg *q = sainfo.algs[class];
-        while (q->next) {
-            q = q->next;
-        }
-        q->next = p;
-    }
-}
-
-static void add_sainfo() {
-    if (pk_checkalg(algclass_ipsec_auth, algtype_hmac_sha2_512, 0) == 0) {
-        add_sainfo_algorithm(algclass_ipsec_auth, IPSECDOI_ATTR_AUTH_HMAC_SHA2_512, 0);
-    } else {
-        do_plog(LLV_WARNING, "Kernel does not support SHA512, not enabling\n");
-    }
-    if (pk_checkalg(algclass_ipsec_auth, algtype_hmac_sha2_384, 0) == 0) {
-        add_sainfo_algorithm(algclass_ipsec_auth, IPSECDOI_ATTR_AUTH_HMAC_SHA2_384, 0);
-    } else {
-        do_plog(LLV_WARNING, "Kernel does not support SHA384, not enabling\n");
-    }
-    add_sainfo_algorithm(algclass_ipsec_auth, IPSECDOI_ATTR_AUTH_HMAC_SHA1, 0);
-    add_sainfo_algorithm(algclass_ipsec_auth, IPSECDOI_ATTR_AUTH_HMAC_SHA2_256, 0);
-    add_sainfo_algorithm(algclass_ipsec_auth, IPSECDOI_ATTR_AUTH_HMAC_MD5, 0);
-    add_sainfo_algorithm(algclass_ipsec_enc, IPSECDOI_ESP_AES, 256);
-    add_sainfo_algorithm(algclass_ipsec_enc, IPSECDOI_ESP_AES, 128);
-    add_sainfo_algorithm(algclass_ipsec_enc, IPSECDOI_ESP_3DES, 0);
-    add_sainfo_algorithm(algclass_ipsec_enc, IPSECDOI_ESP_DES, 0);
-}
-
-static void set_globals(char *server)
-{
-    struct addrinfo hints = {
-        .ai_flags = AI_NUMERICSERV,
-#ifndef INET6
-        .ai_family = AF_INET,
-#else
-        .ai_family = AF_UNSPEC,
-#endif
-        .ai_socktype = SOCK_DGRAM,
-    };
-    struct addrinfo *info;
-
-    if (getaddrinfo(server, "500", &hints, &info) != 0) {
-        do_plog(LLV_ERROR, "Cannot resolve address: %s\n", server);
-        exit(1);
-    }
-    if (info->ai_next) {
-        do_plog(LLV_WARNING, "Found multiple addresses. Use the first one.\n");
-    }
-    targets[0] = dupsaddr(info->ai_addr);
-    freeaddrinfo(info);
-
-    source = getlocaladdr(targets[0]);
-    if (!source) {
-        do_plog(LLV_ERROR, "Cannot get local address\n");
-        exit(1);
-    }
-    set_port(targets[0], 0);
-    set_port(source, 0);
-
-    myaddrs[0].addr = dupsaddr(source);
-    set_port(myaddrs[0].addr, PORT_ISAKMP);
-    myaddrs[0].sock = -1;
-#ifdef ENABLE_NATT
-    myaddrs[0].next = &myaddrs[1];
-    myaddrs[1].addr = dupsaddr(myaddrs[0].addr);
-    set_port(myaddrs[1].addr, PORT_ISAKMP_NATT);
-    myaddrs[1].sock = -1;
-    myaddrs[1].udp_encap = 1;
-#endif
-
-    localconf.myaddrs = &myaddrs[0];
-    localconf.port_isakmp = PORT_ISAKMP;
-    localconf.port_isakmp_natt = PORT_ISAKMP_NATT;
-    localconf.default_af = AF_INET;
-    localconf.pathinfo[LC_PATHTYPE_CERT] = "./";
-    localconf.pad_random = LC_DEFAULT_PAD_RANDOM;
-    localconf.pad_randomlen = LC_DEFAULT_PAD_RANDOM;
-    localconf.pad_strict = LC_DEFAULT_PAD_STRICT;
-    localconf.pad_excltail = LC_DEFAULT_PAD_EXCLTAIL;
-    localconf.retry_counter = 10;
-    localconf.retry_interval = 3;
-    localconf.count_persend = LC_DEFAULT_COUNT_PERSEND;
-    localconf.secret_size = LC_DEFAULT_SECRETSIZE;
-    localconf.retry_checkph1 = LC_DEFAULT_RETRY_CHECKPH1;
-    localconf.wait_ph2complete = LC_DEFAULT_WAIT_PH2COMPLETE;
-    localconf.natt_ka_interval = LC_DEFAULT_NATT_KA_INTERVAL;
-
-    sainfo.lifetime = IPSECDOI_ATTR_SA_LD_SEC_DEFAULT;
-    sainfo.lifebyte = IPSECDOI_ATTR_SA_LD_KB_MAX;
-
-    memset(script_names, 0, sizeof(script_names));
-}
-
-/*****************************************************************************/
-
-static int policy_match(struct sadb_address *address)
-{
-    if (address) {
-        struct sockaddr *addr = PFKEY_ADDR_SADDR(address);
-        return !cmpsaddrwop(addr, targets[0]) || !cmpsaddrwop(addr, targets[1]);
-    }
-    return 0;
-}
-
-/* flush; spdflush; */
-static void flush()
-{
-    struct sadb_msg *p;
-    int replies = 0;
-    int key = pfkey_open();
-
-    if (pfkey_send_dump(key, SADB_SATYPE_UNSPEC) <= 0 ||
-        pfkey_send_spddump(key) <= 0) {
-        do_plog(LLV_ERROR, "Cannot dump SAD and SPD\n");
-        exit(1);
-    }
-
-    for (p = NULL; replies < 2 && (p = pfkey_recv(key)) != NULL; free(p)) {
-        caddr_t q[SADB_EXT_MAX + 1];
-
-        if (p->sadb_msg_type != SADB_DUMP &&
-            p->sadb_msg_type != SADB_X_SPDDUMP) {
-            continue;
-        }
-        replies += !p->sadb_msg_seq;
-
-        if (p->sadb_msg_errno || pfkey_align(p, q) || pfkey_check(q)) {
-            continue;
-        }
-        if (policy_match((struct sadb_address *)q[SADB_EXT_ADDRESS_SRC]) ||
-            policy_match((struct sadb_address *)q[SADB_EXT_ADDRESS_DST])) {
-            p->sadb_msg_type = (p->sadb_msg_type == SADB_DUMP) ?
-                               SADB_DELETE : SADB_X_SPDDELETE;
-            p->sadb_msg_reserved = 0;
-            p->sadb_msg_seq = 0;
-            pfkey_send(key, p, PFKEY_UNUNIT64(p->sadb_msg_len));
-        }
-    }
-
-    pfkey_close(key);
-}
-
-/* spdadd src dst protocol -P out ipsec esp/transport//require;
- * spdadd dst src protocol -P in  ipsec esp/transport//require;
- * or
- * spdadd src any protocol -P out ipsec esp/tunnel/local-remote/require;
- * spdadd any src protocol -P in  ipsec esp/tunnel/remote-local/require; */
-static void spdadd(struct sockaddr *src, struct sockaddr *dst,
-        int protocol, struct sockaddr *local, struct sockaddr *remote)
-{
-    struct __attribute__((packed)) {
-        struct sadb_x_policy p;
-        struct sadb_x_ipsecrequest q;
-        char addresses[sizeof(struct sockaddr_storage) * 2];
-    } policy;
-
-    struct sockaddr_storage any = {
-#ifndef __linux__
-        .ss_len = src->sa_len,
-#endif
-        .ss_family = src->sa_family,
-    };
-
-    int src_prefix = (src->sa_family == AF_INET) ? 32 : 128;
-    int dst_prefix = src_prefix;
-    int length = 0;
-    int key;
-
-    /* Fill values for outbound policy. */
-    memset(&policy, 0, sizeof(policy));
-    policy.p.sadb_x_policy_exttype = SADB_X_EXT_POLICY;
-    policy.p.sadb_x_policy_type = IPSEC_POLICY_IPSEC;
-    policy.p.sadb_x_policy_dir = IPSEC_DIR_OUTBOUND;
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-    policy.p.sadb_x_policy_priority = PRIORITY_DEFAULT;
-#endif
-    policy.q.sadb_x_ipsecrequest_proto = IPPROTO_ESP;
-    policy.q.sadb_x_ipsecrequest_mode = IPSEC_MODE_TRANSPORT;
-    policy.q.sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE;
-
-    /* Deal with tunnel mode. */
-    if (!dst) {
-        int size = sysdep_sa_len(local);
-        memcpy(policy.addresses, local, size);
-        memcpy(&policy.addresses[size], remote, size);
-        length += size + size;
-
-        policy.q.sadb_x_ipsecrequest_mode = IPSEC_MODE_TUNNEL;
-        dst = (struct sockaddr *)&any;
-        dst_prefix = 0;
-
-        /* Also use the source address to filter policies. */
-        targets[1] = dupsaddr(src);
-    }
-
-    /* Fix lengths. */
-    length += sizeof(policy.q);
-    policy.q.sadb_x_ipsecrequest_len = length;
-    length += sizeof(policy.p);
-    policy.p.sadb_x_policy_len = PFKEY_UNIT64(length);
-
-    /* Always do a flush before adding new policies. */
-    flush();
-
-    /* Set outbound policy. */
-    key = pfkey_open();
-    if (pfkey_send_spdadd(key, src, src_prefix, dst, dst_prefix, protocol,
-            (caddr_t)&policy, length, 0) <= 0) {
-        do_plog(LLV_ERROR, "Cannot set outbound policy\n");
-        exit(1);
-    }
-
-    /* Flip values for inbound policy. */
-    policy.p.sadb_x_policy_dir = IPSEC_DIR_INBOUND;
-    if (!dst_prefix) {
-        int size = sysdep_sa_len(local);
-        memcpy(policy.addresses, remote, size);
-        memcpy(&policy.addresses[size], local, size);
-    }
-
-    /* Set inbound policy. */
-    if (pfkey_send_spdadd(key, dst, dst_prefix, src, src_prefix, protocol,
-            (caddr_t)&policy, length, 0) <= 0) {
-        do_plog(LLV_ERROR, "Cannot set inbound policy\n");
-        exit(1);
-    }
-
-    pfkey_close(key);
-    atexit(flush);
-}
-
-/*****************************************************************************/
-
-static void add_proposal(struct remoteconf *remoteconf,
-        int auth, int hash, int encryption, int length)
-{
-    struct isakmpsa *p = racoon_calloc(1, sizeof(struct isakmpsa));
-    p->prop_no = 1;
-    p->lifetime = OAKLEY_ATTR_SA_LD_SEC_DEFAULT;
-    p->enctype = encryption;
-    p->encklen = length;
-    p->authmethod = auth;
-    p->hashtype = hash;
-    p->dh_group = OAKLEY_ATTR_GRP_DESC_MODP1024;
-    p->vendorid = VENDORID_UNKNOWN;
-    p->rmconf = remoteconf;
-
-    if (!remoteconf->proposal) {
-      p->trns_no = 1;
-      remoteconf->proposal = p;
-    } else {
-        struct isakmpsa *q = remoteconf->proposal;
-        while (q->next) {
-            q = q->next;
-        }
-        p->trns_no = q->trns_no + 1;
-        q->next = p;
-    }
-}
-
-static vchar_t *strtovchar(char *string)
-{
-    vchar_t *vchar = string ? vmalloc(strlen(string) + 1) : NULL;
-    if (vchar) {
-        memcpy(vchar->v, string, vchar->l);
-        vchar->l -= 1;
-    }
-    return vchar;
-}
-
-static void set_pre_shared_key(struct remoteconf *remoteconf,
-        char *identifier, char *key)
-{
-    pre_shared_key = key;
-    if (identifier[0]) {
-        remoteconf->idv = strtovchar(identifier);
-        remoteconf->etypes->type = ISAKMP_ETYPE_AGG;
-
-        remoteconf->idvtype = IDTYPE_KEYID;
-        if (strchr(identifier, '.')) {
-            remoteconf->idvtype = IDTYPE_FQDN;
-            if (strchr(identifier, '@')) {
-                remoteconf->idvtype = IDTYPE_USERFQDN;
-            }
-        }
-    }
-}
-
-static void set_certificates(struct remoteconf *remoteconf,
-        char *user_private_key, char *user_certificate,
-        char *ca_certificate, char *server_certificate)
-{
-    remoteconf->myprivfile = user_private_key;
-    remoteconf->mycertfile = user_certificate;
-    if (user_certificate) {
-        remoteconf->idvtype = IDTYPE_ASN1DN;
-    }
-    if (!ca_certificate[0]) {
-        remoteconf->verify_cert = FALSE;
-    } else {
-        remoteconf->cacertfile = ca_certificate;
-    }
-    if (server_certificate[0]) {
-        remoteconf->peerscertfile = server_certificate;
-        remoteconf->getcert_method = ISAKMP_GETCERT_LOCALFILE;
-    }
-}
-
-#ifdef ENABLE_HYBRID
-
-static void set_xauth_and_more(struct remoteconf *remoteconf,
-        char *username, char *password, char *phase1_up, char *script_arg)
-{
-    struct xauth_rmconf *xauth = racoon_calloc(1, sizeof(struct xauth_rmconf));
-    xauth->login = strtovchar(username);
-    xauth->login->l += 1;
-    xauth->pass = strtovchar(password);
-    // Unlike the code that reads login, the code that reads pass does not
-    // strip trailing nulls, so don't add one here.
-    remoteconf->xauth = xauth;
-    remoteconf->mode_cfg = TRUE;
-    remoteconf->script[SCRIPT_PHASE1_UP] = strtovchar(phase1_up);
-    script_names[SCRIPT_PHASE1_UP] = script_arg;
-}
-
-#endif
-
-extern void monitor_fd(int fd, void (*callback)(int));
-
-void add_isakmp_handler(int fd, const char *interface)
-{
-    if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,
-            interface, strlen(interface))) {
-        do_plog(LLV_WARNING, "Cannot bind socket to %s\n", interface);
-    }
-    monitor_fd(fd, (void *)isakmp_handler);
-}
-
-void setup(int argc, char **argv)
-{
-    struct remoteconf *remoteconf = NULL;
-    int auth;
-
-    if (argc > 2) {
-        set_globals(argv[2]);
-
-        /* Initialize everything else. */
-        eay_init();
-        initrmconf();
-        oakley_dhinit();
-        compute_vendorids();
-        sched_init();
-        if (pfkey_init() < 0 || isakmp_init() < 0) {
-            exit(1);
-        }
-        add_sainfo();
-        monitor_fd(localconf.sock_pfkey, (void *)pfkey_handler);
-        add_isakmp_handler(myaddrs[0].sock, argv[1]);
-
-#ifdef ENABLE_NATT
-        add_isakmp_handler(myaddrs[1].sock, argv[1]);
-        natt_keepalive_init();
-#endif
-
-        /* Create remote configuration. */
-        remoteconf = newrmconf();
-        remoteconf->etypes = racoon_calloc(1, sizeof(struct etypes));
-        remoteconf->etypes->type = ISAKMP_ETYPE_IDENT;
-        remoteconf->idvtype = IDTYPE_ADDRESS;
-        remoteconf->ike_frag = TRUE;
-        remoteconf->pcheck_level = PROP_CHECK_CLAIM;
-        remoteconf->certtype = ISAKMP_CERT_X509SIGN;
-        remoteconf->gen_policy = TRUE;
-        remoteconf->nat_traversal = TRUE;
-        remoteconf->dh_group = OAKLEY_ATTR_GRP_DESC_MODP1024;
-        remoteconf->script[SCRIPT_PHASE1_UP] = strtovchar("");
-        remoteconf->script[SCRIPT_PHASE1_DOWN] = strtovchar("");
-        oakley_setdhgroup(remoteconf->dh_group, &remoteconf->dhgrp);
-        remoteconf->remote = dupsaddr(targets[0]);
-    }
-
-    /* Set authentication method and credentials. */
-    if (argc == 7 && !strcmp(argv[3], "udppsk")) {
-        set_pre_shared_key(remoteconf, argv[4], argv[5]);
-        auth = OAKLEY_ATTR_AUTH_METHOD_PSKEY;
-
-        set_port(targets[0], atoi(argv[6]));
-        spdadd(source, targets[0], IPPROTO_UDP, NULL, NULL);
-    } else if (argc == 9 && !strcmp(argv[3], "udprsa")) {
-        set_certificates(remoteconf, argv[4], argv[5], argv[6], argv[7]);
-        auth = OAKLEY_ATTR_AUTH_METHOD_RSASIG;
-
-        set_port(targets[0], atoi(argv[8]));
-        spdadd(source, targets[0], IPPROTO_UDP, NULL, NULL);
-#ifdef ENABLE_HYBRID
-    } else if (argc == 10 && !strcmp(argv[3], "xauthpsk")) {
-        set_pre_shared_key(remoteconf, argv[4], argv[5]);
-        set_xauth_and_more(remoteconf, argv[6], argv[7], argv[8], argv[9]);
-        auth = OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I;
-    } else if (argc == 12 && !strcmp(argv[3], "xauthrsa")) {
-        set_certificates(remoteconf, argv[4], argv[5], argv[6], argv[7]);
-        set_xauth_and_more(remoteconf, argv[8], argv[9], argv[10], argv[11]);
-        auth = OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I;
-    } else if (argc == 10 && !strcmp(argv[3], "hybridrsa")) {
-        set_certificates(remoteconf, NULL, NULL, argv[4], argv[5]);
-        set_xauth_and_more(remoteconf, argv[6], argv[7], argv[8], argv[9]);
-        auth = OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I;
-#endif
-    } else {
-        printf("Usage: %s <interface> <server> [...], where [...] can be:\n"
-                " udppsk    <identifier> <pre-shared-key> <port>; \n"
-                " udprsa    <user-private-key> <user-certificate> \\\n"
-                "           <ca-certificate> <server-certificate> <port>;\n"
-#ifdef ENABLE_HYBRID
-                " xauthpsk  <identifier> <pre-shared-key> \\\n"
-                "           <username> <password> <phase1-up> <script-arg>;\n"
-                " xauthrsa  <user-private-key> <user-certificate> \\\n"
-                "           <ca-certificate> <server-certificate> \\\n"
-                "           <username> <password> <phase1-up> <script-arg>;\n"
-                " hybridrsa <ca-certificate> <server-certificate> \\\n"
-                "           <username> <password> <phase1-up> <script-arg>;\n"
-#endif
-                "", argv[0]);
-        exit(0);
-    }
-
-    /* Add proposals. */
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_384, OAKLEY_ATTR_ENC_ALG_AES, 256);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_256, OAKLEY_ATTR_ENC_ALG_AES, 256);
-    // VPNs to openswan breaks when SHA2_512 is used as the first proposal.
-    // openswan supports SHA2_256 or lower hash alg. With this add_proposal
-    // order, openswan picks SHA2_256 and others pick SHA2_384
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_512, OAKLEY_ATTR_ENC_ALG_AES, 256);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA, OAKLEY_ATTR_ENC_ALG_AES, 256);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_MD5, OAKLEY_ATTR_ENC_ALG_AES, 256);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_512, OAKLEY_ATTR_ENC_ALG_AES, 128);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_384, OAKLEY_ATTR_ENC_ALG_AES, 128);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_256, OAKLEY_ATTR_ENC_ALG_AES, 128);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA, OAKLEY_ATTR_ENC_ALG_AES, 128);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_MD5, OAKLEY_ATTR_ENC_ALG_AES, 128);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_256, OAKLEY_ATTR_ENC_ALG_3DES, 0);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA, OAKLEY_ATTR_ENC_ALG_3DES, 0);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_MD5, OAKLEY_ATTR_ENC_ALG_3DES, 0);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA2_256, OAKLEY_ATTR_ENC_ALG_DES, 0);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_SHA, OAKLEY_ATTR_ENC_ALG_DES, 0);
-    add_proposal(remoteconf, auth,
-            OAKLEY_ATTR_HASH_ALG_MD5, OAKLEY_ATTR_ENC_ALG_DES, 0);
-
-    /* Install remote configuration. */
-    insrmconf(remoteconf);
-
-    /* Start phase 1 negotiation for xauth. */
-    if (remoteconf->xauth) {
-        isakmp_ph1begin_i(remoteconf, remoteconf->remote, source);
-    }
-}
-
-/*****************************************************************************/
-
-/* localconf.h */
-
-vchar_t *getpskbyaddr(struct sockaddr *addr)
-{
-    return strtovchar(pre_shared_key);
-}
-
-vchar_t *getpskbyname(vchar_t *name)
-{
-    return NULL;
-}
-
-void getpathname(char *path, int length, int type, const char *name)
-{
-    if (pname) {
-        snprintf(path, length, pname, name);
-    } else {
-        strncpy(path, name, length);
-    }
-    path[length - 1] = '\0';
-}
-
-/* grabmyaddr.h */
-
-int myaddr_getsport(struct sockaddr *addr)
-{
-    return 0;
-}
-
-int getsockmyaddr(struct sockaddr *addr)
-{
-#ifdef ENABLE_NATT
-    if (!cmpsaddrstrict(addr, myaddrs[1].addr)) {
-        return myaddrs[1].sock;
-    }
-#endif
-    if (!cmpsaddrwop(addr, myaddrs[0].addr)) {
-        return myaddrs[0].sock;
-    }
-    return -1;
-}
-
-/* privsep.h */
-
-int privsep_pfkey_open()
-{
-    return pfkey_open();
-}
-
-void privsep_pfkey_close(int key)
-{
-    pfkey_close(key);
-}
-
-vchar_t *privsep_eay_get_pkcs1privkey(char *file)
-{
-    return eay_get_pkcs1privkey(file);
-}
-
-static char *get_env(char * const *envp, char *key)
-{
-    int length = strlen(key);
-    while (*envp && (strncmp(*envp, key, length) || (*envp)[length] != '=')) {
-        ++envp;
-    }
-    return *envp ? &(*envp)[length + 1] : "";
-}
-
-static int skip_script = 0;
-extern const char *android_hook(char **envp);
-
-int privsep_script_exec(char *script, int name, char * const *envp)
-{
-    if (skip_script) {
-        return 0;
-    }
-    skip_script = 1;
-
-    if (name == SCRIPT_PHASE1_DOWN) {
-        exit(1);
-    }
-    if (script_names[SCRIPT_PHASE1_UP]) {
-        /* Racoon ignores INTERNAL_IP6_ADDRESS, so we only do IPv4. */
-        struct sockaddr *addr4 = str2saddr(get_env(envp, "INTERNAL_ADDR4"),
-                NULL);
-        struct sockaddr *local = str2saddr(get_env(envp, "LOCAL_ADDR"),
-                get_env(envp, "LOCAL_PORT"));
-        struct sockaddr *remote = str2saddr(get_env(envp, "REMOTE_ADDR"),
-                get_env(envp, "REMOTE_PORT"));
-
-        if (addr4 && local && remote) {
-#ifdef ANDROID_CHANGES
-            if (pname) {
-                script = (char *)android_hook((char **)envp);
-            }
-#endif
-            spdadd(addr4, NULL, IPPROTO_IP, local, remote);
-        } else {
-            do_plog(LLV_ERROR, "Cannot get parameters for SPD policy.\n");
-            exit(1);
-        }
-
-        racoon_free(addr4);
-        racoon_free(local);
-        racoon_free(remote);
-        return script_exec(script, name, envp);
-    }
-    return 0;
-}
-
-int privsep_accounting_system(int port, struct sockaddr *addr,
-        char *user, int status)
-{
-    return 0;
-}
-
-int privsep_xauth_login_system(char *user, char *password)
-{
-    return -1;
-}
-
-/* misc.h */
-
-int racoon_hexdump(const void *data, size_t length)
-{
-    return 0;
-}
-
-/* sainfo.h */
-
-struct sainfo *getsainfo(const vchar_t *src, const vchar_t *dst,
-        const vchar_t *peer, int remoteid)
-{
-    return &sainfo;
-}
-
-const char *sainfo2str(const struct sainfo *si)
-{
-    return "*";
-}
-
-/* throttle.h */
-
-int throttle_host(struct sockaddr *addr, int fail)
-{
-    return 0;
-}
-
-void shutdown_session()
-{
-    flushph2();
-    flushph1();
-    isakmp_close();
-    pfkey_close(localconf.sock_pfkey);
-}
diff --git a/src/racoon/MODULE_LICENSE_BSD b/src/racoon/MODULE_LICENSE_BSD
deleted file mode 100644
index e69de29..0000000
--- a/src/racoon/MODULE_LICENSE_BSD
+++ /dev/null
diff --git a/src/racoon/Makefile.am b/src/racoon/Makefile.am
deleted file mode 100644
index 202a18e..0000000
--- a/src/racoon/Makefile.am
+++ /dev/null
@@ -1,127 +0,0 @@
-# Id: Makefile.am,v 1.23 2005/07/01 08:57:50 manubsd Exp
-
-sbin_PROGRAMS = racoon racoonctl plainrsa-gen
-noinst_PROGRAMS = eaytest
-include_racoon_HEADERS = racoonctl.h var.h vmbuf.h misc.h gcmalloc.h admin.h \
-	schedule.h sockmisc.h vmbuf.h isakmp_var.h isakmp.h isakmp_xauth.h \
-	isakmp_cfg.h isakmp_unity.h ipsec_doi.h evt.h
-lib_LTLIBRARIES = libracoon.la
-
-adminsockdir=${localstatedir}/racoon
-
-BUILT_SOURCES = cfparse.h prsa_par.h
-INCLUDES = -I${srcdir}/../libipsec 
-AM_CFLAGS = -D_GNU_SOURCE @GLIBC_BUGS@ -DSYSCONFDIR=\"${sysconfdir}\" \
-	-DADMINPORTDIR=\"${adminsockdir}\"
-AM_LDFLAGS = @EXTRA_CRYPTO@ -lcrypto
-AM_YFLAGS = -d ${$*_YFLAGS}
-AM_LFLAGS = ${$*_LFLAGS}
-
-prsa_par_YFLAGS = -p prsa
-prsa_tok_LFLAGS = -Pprsa -olex.yy.c
-
-MISSING_ALGOS = \
-	missing/crypto/sha2/sha2.c \
-	missing/crypto/rijndael/rijndael-api-fst.c \
-	missing/crypto/rijndael/rijndael-alg-fst.c
-
-racoon_SOURCES = \
-	main.c session.c isakmp.c handler.c \
-	isakmp_ident.c isakmp_agg.c isakmp_base.c \
-	isakmp_quick.c isakmp_inf.c isakmp_newg.c \
-	gssapi.c dnssec.c getcertsbyname.c privsep.c \
-	pfkey.c admin.c evt.c ipsec_doi.c oakley.c grabmyaddr.c vendorid.c \
-	policy.c localconf.c remoteconf.c crypto_openssl.c algorithm.c \
-	proposal.c sainfo.c strnames.c \
-	plog.c logger.c schedule.c str2val.c \
-	safefile.c backupsa.c genlist.c rsalist.c \
-	cftoken.l cfparse.y prsa_tok.l prsa_par.y 
-EXTRA_racoon_SOURCES = isakmp_xauth.c isakmp_cfg.c isakmp_unity.c throttle.c \
-	isakmp_frag.c nattraversal.c security.c $(MISSING_ALGOS)
-racoon_LDADD = $(CRYPTOBJS) $(HYBRID_OBJS) $(NATT_OBJS) $(FRAG_OBJS) $(LEXLIB) \
-	 $(SECCTX_OBJS) vmbuf.o sockmisc.o misc.o ../libipsec/libipsec.la
-racoon_DEPENDENCIES = \
-	$(CRYPTOBJS) $(HYBRID_OBJS) $(NATT_OBJS) $(FRAG_OBJS) $(SECCTX_OBJS) \
-	vmbuf.o sockmisc.o misc.o
-
-racoonctl_SOURCES = racoonctl.c str2val.c 
-racoonctl_LDADD = libracoon.la ../libipsec/libipsec.la 
-
-libracoon_la_SOURCES = kmpstat.c vmbuf.c sockmisc.c misc.c
-
-plainrsa_gen_SOURCES = plainrsa-gen.c plog.c \
-	crypto_openssl.c logger.c 
-EXTRA_plainrsa_gen_SOURCES = $(MISSING_ALGOS)
-plainrsa_gen_LDADD = $(CRYPTOBJS) vmbuf.o misc.o
-plainrsa_gen_DEPENDENCIES = $(CRYPTOBJS) vmbuf.o misc.o
-
-eaytest_SOURCES = eaytest.c plog.c logger.c
-EXTRA_eaytest_SOURCES = missing/crypto/sha2/sha2.c
-eaytest_LDADD =	crypto_openssl_test.o vmbuf.o str2val.o misc_noplog.o \
-	$(CRYPTOBJS)
-eaytest_DEPENDENCIES = crypto_openssl_test.o vmbuf.o str2val.o \
-	misc_noplog.o $(CRYPTOBJS)
-
-noinst_HEADERS = \
-	admin.h           dnssec.h      isakmp_base.h   oakley.h      session.h \
-	admin_var.h       dump.h        isakmp_ident.h  pfkey.h       sockmisc.h \
-	algorithm.h       gcmalloc.h    isakmp_inf.h    plog.h        str2val.h \
-	backupsa.h        gnuc.h        isakmp_newg.h   policy.h      strnames.h \
-	grabmyaddr.h      isakmp_quick.h  proposal.h    var.h         evt.h \
-	gssapi.h          isakmp_var.h	vendorid.h      nattraversal.h\
-	crypto_openssl.h  handler.h     localconf.h     remoteconf.h  vmbuf.h \
-	debug.h           ipsec_doi.h   logger.h        safefile.h \
-	debugrm.h         isakmp.h      misc.h          sainfo.h \
-	dhgroup.h         isakmp_agg.h  netdb_dnssec.h  schedule.h \
-	isakmp_cfg.h      isakmp_xauth.h isakmp_unity.h isakmp_frag.h \
-	throttle.h	  privsep.h \
-	cfparse_proto.h	  cftoken_proto.h genlist.h     rsalist.h \
-	missing/crypto/sha2/sha2.h missing/crypto/rijndael/rijndael_local.h \
-	missing/crypto/rijndael/rijndael-api-fst.h \
-	missing/crypto/rijndael/rijndael-alg-fst.h \
-	missing/crypto/rijndael/rijndael.h
-
-man5_MANS = racoon.conf.5
-man8_MANS = racoon.8 racoonctl.8 plainrsa-gen.8
-
-EXTRA_DIST = \
-   ${man5_MANS} ${man8_MANS} \
-   missing/crypto/rijndael/boxes-fst.dat \
-   doc/FAQ doc/README.certificate doc/README.gssapi doc/README.plainrsa \
-   contrib/sp.pl stats.pl \
-   samples/psk.txt.sample  samples/racoon.conf.sample \
-   samples/psk.txt.in samples/racoon.conf.in \
-   samples/racoon.conf.sample-gssapi samples/racoon.conf.sample-natt \
-   samples/racoon.conf.sample-inherit samples/racoon.conf.sample-plainrsa \
-   samples/roadwarrior/README \
-   samples/roadwarrior/client/phase1-down.sh \
-   samples/roadwarrior/client/phase1-up.sh \
-   samples/roadwarrior/client/racoon.conf \
-   samples/roadwarrior/server/racoon.conf \
-   samples/roadwarrior/server/racoon.conf-radius
-
-TESTS = eaytest
-
-install-exec-local:
-	${mkinstalldirs} $(DESTDIR)${adminsockdir}
-
-# special object rules
-crypto_openssl_test.o: crypto_openssl.c
-	$(COMPILE) -DEAYDEBUG -o crypto_openssl_test.o -c $(srcdir)/crypto_openssl.c
-
-misc_noplog.o: misc.c
-	$(COMPILE) -DNOUSE_PLOG -o misc_noplog.o -c $(srcdir)/misc.c
-
-# missing/*.c
-strdup.o:	$(srcdir)/missing/strdup.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-getaddrinfo.o:	$(srcdir)/missing/getaddrinfo.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-getnameinfo.o:	$(srcdir)/missing/getnameinfo.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-rijndael-api-fst.o: $(srcdir)/missing/crypto/rijndael/rijndael-api-fst.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/rijndael/$*.c
-rijndael-alg-fst.o: $(srcdir)/missing/crypto/rijndael/rijndael-alg-fst.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/rijndael/$*.c
-sha2.o: $(srcdir)/missing/crypto/sha2/sha2.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/sha2/$*.c
diff --git a/src/racoon/Makefile.in b/src/racoon/Makefile.in
deleted file mode 100644
index 47e997b..0000000
--- a/src/racoon/Makefile.in
+++ /dev/null
@@ -1,1000 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Id: Makefile.am,v 1.23 2005/07/01 08:57:50 manubsd Exp
-
-
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-sbin_PROGRAMS = racoon$(EXEEXT) racoonctl$(EXEEXT) \
-	plainrsa-gen$(EXEEXT)
-noinst_PROGRAMS = eaytest$(EXEEXT)
-TESTS = eaytest$(EXEEXT)
-subdir = src/racoon
-DIST_COMMON = $(include_racoon_HEADERS) $(noinst_HEADERS) \
-	$(srcdir)/Makefile.am $(srcdir)/Makefile.in TODO cfparse.c \
-	cfparse.h cftoken.c prsa_par.c prsa_par.h prsa_tok.c
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/acracoon.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(sbindir)" \
-	"$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" \
-	"$(DESTDIR)$(include_racoondir)"
-libLTLIBRARIES_INSTALL = $(INSTALL)
-LTLIBRARIES = $(lib_LTLIBRARIES)
-libracoon_la_LIBADD =
-am_libracoon_la_OBJECTS = kmpstat.lo vmbuf.lo sockmisc.lo misc.lo
-libracoon_la_OBJECTS = $(am_libracoon_la_OBJECTS)
-sbinPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS)
-am_eaytest_OBJECTS = eaytest.$(OBJEXT) plog.$(OBJEXT) logger.$(OBJEXT)
-eaytest_OBJECTS = $(am_eaytest_OBJECTS)
-am__DEPENDENCIES_1 =
-am_plainrsa_gen_OBJECTS = plainrsa-gen.$(OBJEXT) plog.$(OBJEXT) \
-	crypto_openssl.$(OBJEXT) logger.$(OBJEXT)
-plainrsa_gen_OBJECTS = $(am_plainrsa_gen_OBJECTS)
-am_racoon_OBJECTS = main.$(OBJEXT) session.$(OBJEXT) isakmp.$(OBJEXT) \
-	handler.$(OBJEXT) isakmp_ident.$(OBJEXT) isakmp_agg.$(OBJEXT) \
-	isakmp_base.$(OBJEXT) isakmp_quick.$(OBJEXT) \
-	isakmp_inf.$(OBJEXT) isakmp_newg.$(OBJEXT) gssapi.$(OBJEXT) \
-	dnssec.$(OBJEXT) getcertsbyname.$(OBJEXT) privsep.$(OBJEXT) \
-	pfkey.$(OBJEXT) admin.$(OBJEXT) evt.$(OBJEXT) \
-	ipsec_doi.$(OBJEXT) oakley.$(OBJEXT) grabmyaddr.$(OBJEXT) \
-	vendorid.$(OBJEXT) policy.$(OBJEXT) localconf.$(OBJEXT) \
-	remoteconf.$(OBJEXT) crypto_openssl.$(OBJEXT) \
-	algorithm.$(OBJEXT) proposal.$(OBJEXT) sainfo.$(OBJEXT) \
-	strnames.$(OBJEXT) plog.$(OBJEXT) logger.$(OBJEXT) \
-	schedule.$(OBJEXT) str2val.$(OBJEXT) safefile.$(OBJEXT) \
-	backupsa.$(OBJEXT) genlist.$(OBJEXT) rsalist.$(OBJEXT) \
-	cftoken.$(OBJEXT) cfparse.$(OBJEXT) prsa_tok.$(OBJEXT) \
-	prsa_par.$(OBJEXT)
-racoon_OBJECTS = $(am_racoon_OBJECTS)
-am_racoonctl_OBJECTS = racoonctl.$(OBJEXT) str2val.$(OBJEXT)
-racoonctl_OBJECTS = $(am_racoonctl_OBJECTS)
-racoonctl_DEPENDENCIES = libracoon.la ../libipsec/libipsec.la
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
-LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS)
-LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS)
-YLWRAP = $(top_srcdir)/ylwrap
-YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
-LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS)
-SOURCES = $(libracoon_la_SOURCES) $(eaytest_SOURCES) \
-	$(EXTRA_eaytest_SOURCES) $(plainrsa_gen_SOURCES) \
-	$(EXTRA_plainrsa_gen_SOURCES) $(racoon_SOURCES) \
-	$(EXTRA_racoon_SOURCES) $(racoonctl_SOURCES)
-DIST_SOURCES = $(libracoon_la_SOURCES) $(eaytest_SOURCES) \
-	$(EXTRA_eaytest_SOURCES) $(plainrsa_gen_SOURCES) \
-	$(EXTRA_plainrsa_gen_SOURCES) $(racoon_SOURCES) \
-	$(EXTRA_racoon_SOURCES) $(racoonctl_SOURCES)
-man5dir = $(mandir)/man5
-man8dir = $(mandir)/man8
-NROFF = nroff
-MANS = $(man5_MANS) $(man8_MANS)
-include_racoonHEADERS_INSTALL = $(INSTALL_HEADER)
-HEADERS = $(include_racoon_HEADERS) $(noinst_HEADERS)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CONFIGURE_AMFLAGS = @CONFIGURE_AMFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CRYPTOBJS = @CRYPTOBJS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DSYMUTIL = @DSYMUTIL@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-EXTRA_CRYPTO = @EXTRA_CRYPTO@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FRAG_OBJS = @FRAG_OBJS@
-GLIBC_BUGS = @GLIBC_BUGS@
-GREP = @GREP@
-HYBRID_OBJS = @HYBRID_OBJS@
-INCLUDE_GLIBC = @INCLUDE_GLIBC@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_OPTS = @INSTALL_OPTS@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-KERNEL_INCLUDE = @KERNEL_INCLUDE@
-KRB5_CONFIG = @KRB5_CONFIG@
-LDFLAGS = @LDFLAGS@
-LEX = @LEX@
-LEXLIB = @LEXLIB@
-LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-NATT_OBJS = @NATT_OBJS@
-NMEDIT = @NMEDIT@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-RPM = @RPM@
-SECCTX_OBJS = @SECCTX_OBJS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-YACC = @YACC@
-YFLAGS = @YFLAGS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-include_racoondir = @include_racoondir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-include_racoon_HEADERS = racoonctl.h var.h vmbuf.h misc.h gcmalloc.h admin.h \
-	schedule.h sockmisc.h vmbuf.h isakmp_var.h isakmp.h isakmp_xauth.h \
-	isakmp_cfg.h isakmp_unity.h ipsec_doi.h evt.h
-
-lib_LTLIBRARIES = libracoon.la
-adminsockdir = ${localstatedir}/racoon
-BUILT_SOURCES = cfparse.h prsa_par.h
-INCLUDES = -I${srcdir}/../libipsec 
-AM_CFLAGS = -D_GNU_SOURCE @GLIBC_BUGS@ -DSYSCONFDIR=\"${sysconfdir}\" \
-	-DADMINPORTDIR=\"${adminsockdir}\"
-
-AM_LDFLAGS = @EXTRA_CRYPTO@ -lcrypto
-AM_YFLAGS = -d ${$*_YFLAGS}
-AM_LFLAGS = ${$*_LFLAGS}
-prsa_par_YFLAGS = -p prsa
-prsa_tok_LFLAGS = -Pprsa -olex.yy.c
-MISSING_ALGOS = \
-	missing/crypto/sha2/sha2.c \
-	missing/crypto/rijndael/rijndael-api-fst.c \
-	missing/crypto/rijndael/rijndael-alg-fst.c
-
-racoon_SOURCES = \
-	main.c session.c isakmp.c handler.c \
-	isakmp_ident.c isakmp_agg.c isakmp_base.c \
-	isakmp_quick.c isakmp_inf.c isakmp_newg.c \
-	gssapi.c dnssec.c getcertsbyname.c privsep.c \
-	pfkey.c admin.c evt.c ipsec_doi.c oakley.c grabmyaddr.c vendorid.c \
-	policy.c localconf.c remoteconf.c crypto_openssl.c algorithm.c \
-	proposal.c sainfo.c strnames.c \
-	plog.c logger.c schedule.c str2val.c \
-	safefile.c backupsa.c genlist.c rsalist.c \
-	cftoken.l cfparse.y prsa_tok.l prsa_par.y 
-
-EXTRA_racoon_SOURCES = isakmp_xauth.c isakmp_cfg.c isakmp_unity.c throttle.c \
-	isakmp_frag.c nattraversal.c security.c $(MISSING_ALGOS)
-
-racoon_LDADD = $(CRYPTOBJS) $(HYBRID_OBJS) $(NATT_OBJS) $(FRAG_OBJS) $(LEXLIB) \
-	 $(SECCTX_OBJS) vmbuf.o sockmisc.o misc.o ../libipsec/libipsec.la
-
-racoon_DEPENDENCIES = \
-	$(CRYPTOBJS) $(HYBRID_OBJS) $(NATT_OBJS) $(FRAG_OBJS) $(SECCTX_OBJS) \
-	vmbuf.o sockmisc.o misc.o
-
-racoonctl_SOURCES = racoonctl.c str2val.c 
-racoonctl_LDADD = libracoon.la ../libipsec/libipsec.la 
-libracoon_la_SOURCES = kmpstat.c vmbuf.c sockmisc.c misc.c
-plainrsa_gen_SOURCES = plainrsa-gen.c plog.c \
-	crypto_openssl.c logger.c 
-
-EXTRA_plainrsa_gen_SOURCES = $(MISSING_ALGOS)
-plainrsa_gen_LDADD = $(CRYPTOBJS) vmbuf.o misc.o
-plainrsa_gen_DEPENDENCIES = $(CRYPTOBJS) vmbuf.o misc.o
-eaytest_SOURCES = eaytest.c plog.c logger.c
-EXTRA_eaytest_SOURCES = missing/crypto/sha2/sha2.c
-eaytest_LDADD = crypto_openssl_test.o vmbuf.o str2val.o misc_noplog.o \
-	$(CRYPTOBJS)
-
-eaytest_DEPENDENCIES = crypto_openssl_test.o vmbuf.o str2val.o \
-	misc_noplog.o $(CRYPTOBJS)
-
-noinst_HEADERS = \
-	admin.h           dnssec.h      isakmp_base.h   oakley.h      session.h \
-	admin_var.h       dump.h        isakmp_ident.h  pfkey.h       sockmisc.h \
-	algorithm.h       gcmalloc.h    isakmp_inf.h    plog.h        str2val.h \
-	backupsa.h        gnuc.h        isakmp_newg.h   policy.h      strnames.h \
-	grabmyaddr.h      isakmp_quick.h  proposal.h    var.h         evt.h \
-	gssapi.h          isakmp_var.h	vendorid.h      nattraversal.h\
-	crypto_openssl.h  handler.h     localconf.h     remoteconf.h  vmbuf.h \
-	debug.h           ipsec_doi.h   logger.h        safefile.h \
-	debugrm.h         isakmp.h      misc.h          sainfo.h \
-	dhgroup.h         isakmp_agg.h  netdb_dnssec.h  schedule.h \
-	isakmp_cfg.h      isakmp_xauth.h isakmp_unity.h isakmp_frag.h \
-	throttle.h	  privsep.h \
-	cfparse_proto.h	  cftoken_proto.h genlist.h     rsalist.h \
-	missing/crypto/sha2/sha2.h missing/crypto/rijndael/rijndael_local.h \
-	missing/crypto/rijndael/rijndael-api-fst.h \
-	missing/crypto/rijndael/rijndael-alg-fst.h \
-	missing/crypto/rijndael/rijndael.h
-
-man5_MANS = racoon.conf.5
-man8_MANS = racoon.8 racoonctl.8 plainrsa-gen.8
-EXTRA_DIST = \
-   ${man5_MANS} ${man8_MANS} \
-   missing/crypto/rijndael/boxes-fst.dat \
-   doc/FAQ doc/README.certificate doc/README.gssapi doc/README.plainrsa \
-   contrib/sp.pl stats.pl \
-   samples/psk.txt.sample  samples/racoon.conf.sample \
-   samples/psk.txt.in samples/racoon.conf.in \
-   samples/racoon.conf.sample-gssapi samples/racoon.conf.sample-natt \
-   samples/racoon.conf.sample-inherit samples/racoon.conf.sample-plainrsa \
-   samples/roadwarrior/README \
-   samples/roadwarrior/client/phase1-down.sh \
-   samples/roadwarrior/client/phase1-up.sh \
-   samples/roadwarrior/client/racoon.conf \
-   samples/roadwarrior/server/racoon.conf \
-   samples/roadwarrior/server/racoon.conf-radius
-
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .l .lo .o .obj .y
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  src/racoon/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign  src/racoon/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f=$(am__strip_dir) \
-	    echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
-	    $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
-	  else :; fi; \
-	done
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  p=$(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" != "$$p" || dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libracoon.la: $(libracoon_la_OBJECTS) $(libracoon_la_DEPENDENCIES) 
-	$(LINK) -rpath $(libdir) $(libracoon_la_OBJECTS) $(libracoon_la_LIBADD) $(LIBS)
-
-clean-noinstPROGRAMS:
-	@list='$(noinst_PROGRAMS)'; for p in $$list; do \
-	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  echo " rm -f $$p $$f"; \
-	  rm -f $$p $$f ; \
-	done
-install-sbinPROGRAMS: $(sbin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	     || test -f $$p1 \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(sbinPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(sbinPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(sbindir)/$$f" || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-sbinPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(sbindir)/$$f"; \
-	done
-
-clean-sbinPROGRAMS:
-	@list='$(sbin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  echo " rm -f $$p $$f"; \
-	  rm -f $$p $$f ; \
-	done
-eaytest$(EXEEXT): $(eaytest_OBJECTS) $(eaytest_DEPENDENCIES) 
-	@rm -f eaytest$(EXEEXT)
-	$(LINK) $(eaytest_OBJECTS) $(eaytest_LDADD) $(LIBS)
-plainrsa-gen$(EXEEXT): $(plainrsa_gen_OBJECTS) $(plainrsa_gen_DEPENDENCIES) 
-	@rm -f plainrsa-gen$(EXEEXT)
-	$(LINK) $(plainrsa_gen_OBJECTS) $(plainrsa_gen_LDADD) $(LIBS)
-cfparse.h: cfparse.c
-	@if test ! -f $@; then \
-	  rm -f cfparse.c; \
-	  $(MAKE) $(AM_MAKEFLAGS) cfparse.c; \
-	else :; fi
-prsa_par.h: prsa_par.c
-	@if test ! -f $@; then \
-	  rm -f prsa_par.c; \
-	  $(MAKE) $(AM_MAKEFLAGS) prsa_par.c; \
-	else :; fi
-racoon$(EXEEXT): $(racoon_OBJECTS) $(racoon_DEPENDENCIES) 
-	@rm -f racoon$(EXEEXT)
-	$(LINK) $(racoon_OBJECTS) $(racoon_LDADD) $(LIBS)
-racoonctl$(EXEEXT): $(racoonctl_OBJECTS) $(racoonctl_DEPENDENCIES) 
-	@rm -f racoonctl$(EXEEXT)
-	$(LINK) $(racoonctl_OBJECTS) $(racoonctl_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/admin.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/algorithm.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backupsa.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfparse.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cftoken.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto_openssl.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dnssec.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eaytest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genlist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcertsbyname.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grabmyaddr.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handler.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipsec_doi.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_agg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_base.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_cfg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_frag.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_ident.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_inf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_newg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_quick.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_unity.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isakmp_xauth.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kmpstat.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localconf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logger.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nattraversal.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oakley.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pfkey.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plainrsa-gen.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plog.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privsep.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proposal.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prsa_par.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prsa_tok.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/racoonctl.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remoteconf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-alg-fst.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael-api-fst.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsalist.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safefile.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sainfo.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schedule.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/security.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/session.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha2.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockmisc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str2val.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnames.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throttle.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vendorid.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vmbuf.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $<
-
-sha2.obj: missing/crypto/sha2/sha2.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sha2.obj -MD -MP -MF $(DEPDIR)/sha2.Tpo -c -o sha2.obj `if test -f 'missing/crypto/sha2/sha2.c'; then $(CYGPATH_W) 'missing/crypto/sha2/sha2.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/sha2/sha2.c'; fi`
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/sha2.Tpo $(DEPDIR)/sha2.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='missing/crypto/sha2/sha2.c' object='sha2.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sha2.obj `if test -f 'missing/crypto/sha2/sha2.c'; then $(CYGPATH_W) 'missing/crypto/sha2/sha2.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/sha2/sha2.c'; fi`
-
-rijndael-api-fst.obj: missing/crypto/rijndael/rijndael-api-fst.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rijndael-api-fst.obj -MD -MP -MF $(DEPDIR)/rijndael-api-fst.Tpo -c -o rijndael-api-fst.obj `if test -f 'missing/crypto/rijndael/rijndael-api-fst.c'; then $(CYGPATH_W) 'missing/crypto/rijndael/rijndael-api-fst.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/rijndael/rijndael-api-fst.c'; fi`
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/rijndael-api-fst.Tpo $(DEPDIR)/rijndael-api-fst.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='missing/crypto/rijndael/rijndael-api-fst.c' object='rijndael-api-fst.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rijndael-api-fst.obj `if test -f 'missing/crypto/rijndael/rijndael-api-fst.c'; then $(CYGPATH_W) 'missing/crypto/rijndael/rijndael-api-fst.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/rijndael/rijndael-api-fst.c'; fi`
-
-rijndael-alg-fst.obj: missing/crypto/rijndael/rijndael-alg-fst.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT rijndael-alg-fst.obj -MD -MP -MF $(DEPDIR)/rijndael-alg-fst.Tpo -c -o rijndael-alg-fst.obj `if test -f 'missing/crypto/rijndael/rijndael-alg-fst.c'; then $(CYGPATH_W) 'missing/crypto/rijndael/rijndael-alg-fst.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/rijndael/rijndael-alg-fst.c'; fi`
-@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/rijndael-alg-fst.Tpo $(DEPDIR)/rijndael-alg-fst.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='missing/crypto/rijndael/rijndael-alg-fst.c' object='rijndael-alg-fst.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rijndael-alg-fst.obj `if test -f 'missing/crypto/rijndael/rijndael-alg-fst.c'; then $(CYGPATH_W) 'missing/crypto/rijndael/rijndael-alg-fst.c'; else $(CYGPATH_W) '$(srcdir)/missing/crypto/rijndael/rijndael-alg-fst.c'; fi`
-
-.l.c:
-	$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
-
-.y.c:
-	$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-man5: $(man5_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)"
-	@list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.5*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    5*) ;; \
-	    *) ext='5' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \
-	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst"; \
-	done
-uninstall-man5:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man5_MANS) $(dist_man5_MANS) $(nodist_man5_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.5*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    5*) ;; \
-	    *) ext='5' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f '$(DESTDIR)$(man5dir)/$$inst'"; \
-	  rm -f "$(DESTDIR)$(man5dir)/$$inst"; \
-	done
-install-man8: $(man8_MANS) $(man_MANS)
-	@$(NORMAL_INSTALL)
-	test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)"
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-	  else file=$$i; fi; \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \
-	  $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst"; \
-	done
-uninstall-man8:
-	@$(NORMAL_UNINSTALL)
-	@list='$(man8_MANS) $(dist_man8_MANS) $(nodist_man8_MANS)'; \
-	l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
-	for i in $$l2; do \
-	  case "$$i" in \
-	    *.8*) list="$$list $$i" ;; \
-	  esac; \
-	done; \
-	for i in $$list; do \
-	  ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-	  case "$$ext" in \
-	    8*) ;; \
-	    *) ext='8' ;; \
-	  esac; \
-	  inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-	  inst=`echo $$inst | sed -e 's/^.*\///'`; \
-	  inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-	  echo " rm -f '$(DESTDIR)$(man8dir)/$$inst'"; \
-	  rm -f "$(DESTDIR)$(man8dir)/$$inst"; \
-	done
-install-include_racoonHEADERS: $(include_racoon_HEADERS)
-	@$(NORMAL_INSTALL)
-	test -z "$(include_racoondir)" || $(MKDIR_P) "$(DESTDIR)$(include_racoondir)"
-	@list='$(include_racoon_HEADERS)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(include_racoonHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(include_racoondir)/$$f'"; \
-	  $(include_racoonHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(include_racoondir)/$$f"; \
-	done
-
-uninstall-include_racoonHEADERS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(include_racoon_HEADERS)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(include_racoondir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(include_racoondir)/$$f"; \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
-	      END { if (nonempty) { for (i in files) print i; }; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-check-TESTS: $(TESTS)
-	@failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[	 ]'; \
-	srcdir=$(srcdir); export srcdir; \
-	list=' $(TESTS) '; \
-	if test -n "$$list"; then \
-	  for tst in $$list; do \
-	    if test -f ./$$tst; then dir=./; \
-	    elif test -f $$tst; then dir=; \
-	    else dir="$(srcdir)/"; fi; \
-	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *$$ws$$tst$$ws*) \
-		xpass=`expr $$xpass + 1`; \
-		failed=`expr $$failed + 1`; \
-		echo "XPASS: $$tst"; \
-	      ;; \
-	      *) \
-		echo "PASS: $$tst"; \
-	      ;; \
-	      esac; \
-	    elif test $$? -ne 77; then \
-	      all=`expr $$all + 1`; \
-	      case " $(XFAIL_TESTS) " in \
-	      *$$ws$$tst$$ws*) \
-		xfail=`expr $$xfail + 1`; \
-		echo "XFAIL: $$tst"; \
-	      ;; \
-	      *) \
-		failed=`expr $$failed + 1`; \
-		echo "FAIL: $$tst"; \
-	      ;; \
-	      esac; \
-	    else \
-	      skip=`expr $$skip + 1`; \
-	      echo "SKIP: $$tst"; \
-	    fi; \
-	  done; \
-	  if test "$$failed" -eq 0; then \
-	    if test "$$xfail" -eq 0; then \
-	      banner="All $$all tests passed"; \
-	    else \
-	      banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
-	    fi; \
-	  else \
-	    if test "$$xpass" -eq 0; then \
-	      banner="$$failed of $$all tests failed"; \
-	    else \
-	      banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
-	    fi; \
-	  fi; \
-	  dashes="$$banner"; \
-	  skipped=""; \
-	  if test "$$skip" -ne 0; then \
-	    skipped="($$skip tests were not run)"; \
-	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$skipped"; \
-	  fi; \
-	  report=""; \
-	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
-	    report="Please report to $(PACKAGE_BUGREPORT)"; \
-	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
-	      dashes="$$report"; \
-	  fi; \
-	  dashes=`echo "$$dashes" | sed s/./=/g`; \
-	  echo "$$dashes"; \
-	  echo "$$banner"; \
-	  test -z "$$skipped" || echo "$$skipped"; \
-	  test -z "$$report" || echo "$$report"; \
-	  echo "$$dashes"; \
-	  test "$$failed" -eq 0; \
-	else :; fi
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS)
-installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(include_racoondir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-rm -f cfparse.c
-	-rm -f cfparse.h
-	-rm -f cftoken.c
-	-rm -f prsa_par.c
-	-rm -f prsa_par.h
-	-rm -f prsa_tok.c
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS clean-sbinPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am: install-include_racoonHEADERS install-man
-
-install-dvi: install-dvi-am
-
-install-exec-am: install-exec-local install-libLTLIBRARIES \
-	install-sbinPROGRAMS
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man: install-man5 install-man8
-
-install-pdf: install-pdf-am
-
-install-ps: install-ps-am
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-include_racoonHEADERS uninstall-libLTLIBRARIES \
-	uninstall-man uninstall-sbinPROGRAMS
-
-uninstall-man: uninstall-man5 uninstall-man8
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
-	clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-noinstPROGRAMS clean-sbinPROGRAMS ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-exec-local \
-	install-html install-html-am install-include_racoonHEADERS \
-	install-info install-info-am install-libLTLIBRARIES \
-	install-man install-man5 install-man8 install-pdf \
-	install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags uninstall uninstall-am \
-	uninstall-include_racoonHEADERS uninstall-libLTLIBRARIES \
-	uninstall-man uninstall-man5 uninstall-man8 \
-	uninstall-sbinPROGRAMS
-
-
-install-exec-local:
-	${mkinstalldirs} $(DESTDIR)${adminsockdir}
-
-# special object rules
-crypto_openssl_test.o: crypto_openssl.c
-	$(COMPILE) -DEAYDEBUG -o crypto_openssl_test.o -c $(srcdir)/crypto_openssl.c
-
-misc_noplog.o: misc.c
-	$(COMPILE) -DNOUSE_PLOG -o misc_noplog.o -c $(srcdir)/misc.c
-
-# missing/*.c
-strdup.o:	$(srcdir)/missing/strdup.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-getaddrinfo.o:	$(srcdir)/missing/getaddrinfo.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-getnameinfo.o:	$(srcdir)/missing/getnameinfo.c
-	$(COMPILE) -c $(srcdir)/missing/$*.c
-rijndael-api-fst.o: $(srcdir)/missing/crypto/rijndael/rijndael-api-fst.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/rijndael/$*.c
-rijndael-alg-fst.o: $(srcdir)/missing/crypto/rijndael/rijndael-alg-fst.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/rijndael/$*.c
-sha2.o: $(srcdir)/missing/crypto/sha2/sha2.c
-	$(COMPILE) -c $(srcdir)/missing/crypto/sha2/$*.c
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/racoon/NOTICE b/src/racoon/NOTICE
deleted file mode 100644
index b07098f..0000000
--- a/src/racoon/NOTICE
+++ /dev/null
@@ -1,325 +0,0 @@
-Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 2004 Emmanuel Dreyfus
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 2004-2006 Emmanuel Dreyfus
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 2000 WIDE Project.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-Copyright (C) 2004-2005 Emmanuel Dreyfus
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 2000, 2001 WIDE Project.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
-Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 and 2003 WIDE Project.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-Copyright 2000 Wasabi Systems, Inc.
-All rights reserved.
-
-This software was written by Frank van der Linden of Wasabi Systems
-for Zembu Labs, Inc. http://www.zembu.com/
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. The name of Wasabi Systems, Inc. may not be used to endorse
-   or promote products derived from this software without specific prior
-   written permission.
-
-THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-
-
-Copyright (C) 2005 International Business Machines Corporation
-Copyright (c) 2005 by Trusted Computer Solutions, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the project nor the names of its contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-
-
-sha2.h
-
-Version 1.0.0beta1
-
-Written by Aaron D. Gifford <me@aarongifford.com>
-
-Copyright 2000 Aaron D. Gifford.  All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-3. Neither the name of the copyright holder nor the names of contributors
-   may be used to endorse or promote products derived from this software
-   without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
diff --git a/src/racoon/TODO b/src/racoon/TODO
deleted file mode 100644
index 1507167..0000000
--- a/src/racoon/TODO
+++ /dev/null
@@ -1,131 +0,0 @@
-$KAME: TODO,v 1.36 2001/09/19 09:41:39 sakane Exp $
-
-Please send any questions or bug reports to snap-users@kame.net.
-
-TODO list
-
-URGENT
-o The documents for users convenience.
-o split log file based on client.  printf-like config directive, i.e.
-  "logfile racoon.%s.log", should be useful here.
-  -> beware of possible security issue, don't use sprintf() directly!
-     make validation before giving a string to sprintf().
-o save decrypted IKE packet in tcpdump format
-o IPComp SA with wellknown CPI in CPI field.  how to handle it?
-o better rekey
-
-MUST
-o multiple certificate payload handling.
-o To consider the use with certificate infrastructure.  PXIX ???
-o kmstat should be improved.
-o Informational Exchange processing properly.
-o require less configuration.  phase 2 is easier (as kernel presents racoon
-  some hints), phase 1 is harder.  for example,
-  - grab phase 2 lifetime and algorith configuration from sadb_comb payloads in
-    ACQUIRE message.
-  - give reasonable default behavior when no configuration file is present.
-  - difficult items:
-	how to guess a reasonable phase 1 SA lifetime
-		(hardcoded default?  guess from phase 2 lifetime?)
-	guess what kind of ID payload to use
-	guess what kind of authentication to be used
-	guess phase 1 DH group (for aggressive mode, we cannot negotiate it)
-	guess if we need phase 2 PFS or not (we cannot negotiate it. so
-		we may need to pick from "no PFS" or "same as phase 1 DH group")
-	guess how we should negotiate lifetime
-		(is "strict" a reasonable default?)
-	guess which mode to use for phase 1 negotiation (is main mode useful?
-		is base mode popular enough?)
-o more acceptable check.
-
-SHOULD
-o psk.txt should be a database? (psk.db?)  psk_mkdb?
-o Dynamically retry to exchange and resend the packet per nodes.
-o To make the list of supported algorithm by sadb_supported payload
-  in the SADB_REGISTER message which happens asynchronously.
-o fix the structure of ph2handle.
-  We can handle the below case.
-
-  node A                            node B
-    +--------------SA1----------------+
-    +--------------SA2----------------+
-
-  at node A:
-  kernel
-    acquire(A-B) ------> ph2handle(A=B) -----> ph1handle
-                              |
-                            policy
-                             A=B
-                             A=B
-
-  But we can not handle the below case because there is no x?handle.
-
-  node A                            node B                           node C
-    +--------------SA1----------------+
-    +------------------------------------------------SA2---------------+
-
-  at node A:
-  kernel
-    acquire(A-C) ---+---> x?handle ---+---> ph2handle(A=B) -------> ph1handle
-                    |        |        |
-    acquire(A-B) ---+      policy     +---> ph2handle(A=C) -------> ph1handle
-                            A=B
-                            A=C
-
-o consistency of function name.
-o deep copy configuration entry to hander.  It's easy to reload configuration.
-o don't keep to hold keymat values, do it ?
-o local address's field in isakmpsa handler must be kicked out to rmconf.
-o responder policy and initiator policy should be separated.
-o for lifetime and key length, something like this should be useful.
-  - propose N
-  - accept between X and Y
-o wildcard "accept any proposal" policy should be allowed.
-o replay prevention
-  - limited total number of session
-  - limited session per peer
-  - number of proposal
-o full support for variable length SPI.  quickhack support for IPComp is done.
-
-MAY
-o Effective code.
-o interaction between IKE/IPsec and socket layer.
-  at this moment, IKE/IPsec failure is modeled as total packet loss to other
-  part of network subsystem, including socket layer.  this presents the
-  following behaviors:
-  - annoyingly long timeouts on tcp connection attempt, and IKE failure;
-    need to wait till tcp socket timeouts.
-  - blackhole if there's mismatching SAs.
-  we may be able to give socket layer some feedback from IKE/IPsec layer.
-  still not sure if those make sense or not.
-  for example:
-  - send PRU_HOSTDEAD to sockets if IKE negotiation failed
-    (sys/netkey/key.c:key_acquire2)
-    to do this, we need to remember which ACQUIRE was caused by which socket,
-    possibly into larval SAs.
-  - PRU_QUENCH on "no SA found on output"
-  - kick tcp retransmission timer on first SA establishment
-o IKE daemon should handle situations where peer does not run IKE daemon
-  (UDP port unreach for port 500) better.
-  should use connected UDP sockets for sending IKE datagrams.
-o rate-limit log messages from kernel IPsec errors, like "no SA found".
-
-TO BE TESTED.
-o IKE retransmit behavior
-	see, draft-*-ipsec-rekeying*.txt
-o Reboot recovery (peer reboot losing it's security associations)
-	see, draft-*-ipsec-rekeying*.txt
-o Scenarios
-	- End-to-End transport long lived security associations
-	  (over night, data transfer >1Gb) with frequent dynamic rekey
-	- End-to-GW tunnel long lived security associations
-	  (over night, data transfer >1Gb) with frequent dynamic rekey
-	- Policy change events while under SA load
-	- End-to-End SA through IPsec tunnels, initiation both ways
-	- Client End-to-End through client-to-GW tunnel SA, initiate from
-	  client for tunnel, then initiation both ways for end-to-end
-	- Client-to-GW transport SA for secure management
-o behavior to receive multiple auth method proposals and AND proposal
-
-and to be written many many.
-
diff --git a/src/racoon/admin.c b/src/racoon/admin.c
deleted file mode 100644
index b56dd2c..0000000
--- a/src/racoon/admin.c
+++ /dev/null
@@ -1,628 +0,0 @@
-/*	$NetBSD: admin.c,v 1.17.6.3 2009/04/20 13:32:57 tteras Exp $	*/
-
-/* Id: admin.c,v 1.25 2006/04/06 14:31:04 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/signal.h>
-#include <sys/stat.h>
-#include <sys/un.h>
-
-#include <net/pfkeyv2.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "schedule.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "grabmyaddr.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "oakley.h"
-#include "handler.h"
-#include "evt.h"
-#include "pfkey.h"
-#include "ipsec_doi.h"
-#include "admin.h"
-#include "admin_var.h"
-#include "isakmp_inf.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_cfg.h"
-#endif
-#include "session.h"
-#include "gcmalloc.h"
-
-#ifdef ENABLE_ADMINPORT
-char *adminsock_path = ADMINSOCK_PATH;
-uid_t adminsock_owner = 0;
-gid_t adminsock_group = 0;
-mode_t adminsock_mode = 0600;
-
-static struct sockaddr_un sunaddr;
-static int admin_process __P((int, char *));
-static int admin_reply __P((int, struct admin_com *, vchar_t *));
-
-int
-admin_handler()
-{
-	int so2;
-	struct sockaddr_storage from;
-	socklen_t fromlen = sizeof(from);
-	struct admin_com com;
-	char *combuf = NULL;
-	int len, error = -1;
-
-	so2 = accept(lcconf->sock_admin, (struct sockaddr *)&from, &fromlen);
-	if (so2 < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to accept admin command: %s\n",
-			strerror(errno));
-		return -1;
-	}
-
-	/* get buffer length */
-	while ((len = recv(so2, (char *)&com, sizeof(com), MSG_PEEK)) < 0) {
-		if (errno == EINTR)
-			continue;
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to recv admin command: %s\n",
-			strerror(errno));
-		goto end;
-	}
-
-	/* sanity check */
-	if (len < sizeof(com)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid header length of admin command\n");
-		goto end;
-	}
-
-	/* get buffer to receive */
-	if ((combuf = racoon_malloc(com.ac_len)) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to alloc buffer for admin command\n");
-		goto end;
-	}
-
-	/* get real data */
-	while ((len = recv(so2, combuf, com.ac_len, 0)) < 0) {
-		if (errno == EINTR)
-			continue;
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to recv admin command: %s\n",
-			strerror(errno));
-		goto end;
-	}
-
-	if (com.ac_cmd == ADMIN_RELOAD_CONF) {
-		/* reload does not work at all! */
-		signal_handler(SIGHUP);
-		goto end;
-	}
-
-	error = admin_process(so2, combuf);
-
-    end:
-	(void)close(so2);
-	if (combuf)
-		racoon_free(combuf);
-
-	return error;
-}
-
-/*
- * main child's process.
- */
-static int
-admin_process(so2, combuf)
-	int so2;
-	char *combuf;
-{
-	struct admin_com *com = (struct admin_com *)combuf;
-	vchar_t *buf = NULL;
-	vchar_t *id = NULL;
-	vchar_t *key = NULL;
-	int idtype = 0;
-	int error = -1;
-
-	com->ac_errno = 0;
-
-	switch (com->ac_cmd) {
-	case ADMIN_RELOAD_CONF:
-		/* don't entered because of proccessing it in other place. */
-		plog(LLV_ERROR, LOCATION, NULL, "should never reach here\n");
-		goto out;
-
-	case ADMIN_SHOW_SCHED:
-	{
-		caddr_t p = NULL;
-		int len;
-
-		com->ac_errno = -1;
-
-		if (sched_dump(&p, &len) == -1)
-			goto out2;
-
-		if ((buf = vmalloc(len)) == NULL)
-			goto out2;
-
-		memcpy(buf->v, p, len);
-
-		com->ac_errno = 0;
-out2:
-		racoon_free(p);
-		break;
-	}
-
-	case ADMIN_SHOW_EVT:
-		/* It's not really an error, don't force racoonctl to quit */
-		if ((buf = evt_dump()) == NULL)
-			com->ac_errno = 0; 
-		break;
-
-	case ADMIN_SHOW_SA:
-	case ADMIN_FLUSH_SA:
-	    {
-		switch (com->ac_proto) {
-		case ADMIN_PROTO_ISAKMP:
-			switch (com->ac_cmd) {
-			case ADMIN_SHOW_SA:
-				buf = dumpph1();
-				if (buf == NULL)
-					com->ac_errno = -1;
-				break;
-			case ADMIN_FLUSH_SA:
-				flushph1();
-				break;
-			}
-			break;
-		case ADMIN_PROTO_IPSEC:
-		case ADMIN_PROTO_AH:
-		case ADMIN_PROTO_ESP:
-			switch (com->ac_cmd) {
-			case ADMIN_SHOW_SA:
-			    {
-				u_int p;
-				p = admin2pfkey_proto(com->ac_proto);
-				if (p == -1)
-					goto out;
-				buf = pfkey_dump_sadb(p);
-				if (buf == NULL)
-					com->ac_errno = -1;
-			    }
-				break;
-			case ADMIN_FLUSH_SA:
-				pfkey_flush_sadb(com->ac_proto);
-				break;
-			}
-			break;
-
-		case ADMIN_PROTO_INTERNAL:
-			switch (com->ac_cmd) {
-			case ADMIN_SHOW_SA:
-				buf = NULL; /*XXX dumpph2(&error);*/
-				if (buf == NULL)
-					com->ac_errno = error;
-				break;
-			case ADMIN_FLUSH_SA:
-				/*XXX flushph2();*/
-				com->ac_errno = 0;
-				break;
-			}
-			break;
-
-		default:
-			/* ignore */
-			com->ac_errno = -1;
-		}
-	    }
-		break;
-
-	case ADMIN_DELETE_SA: {
-		struct ph1handle *iph1;
-		struct sockaddr *dst;
-		struct sockaddr *src;
-		char *loc, *rem;
-
-		src = (struct sockaddr *)
-			&((struct admin_com_indexes *)
-			    ((caddr_t)com + sizeof(*com)))->src;
-		dst = (struct sockaddr *)
-			&((struct admin_com_indexes *)
-			    ((caddr_t)com + sizeof(*com)))->dst;
-
-		loc = racoon_strdup(saddrwop2str(src));
-		rem = racoon_strdup(saddrwop2str(dst));
-		STRDUP_FATAL(loc);
-		STRDUP_FATAL(rem);
-
-		if ((iph1 = getph1byaddrwop(src, dst)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "phase 1 for %s -> %s not found\n", loc, rem);
-		} else {
-			if (iph1->status == PHASE1ST_ESTABLISHED)
-				isakmp_info_send_d1(iph1);
-			purge_remote(iph1);
-		}
-
-		racoon_free(loc);
-		racoon_free(rem);
-
-		break;
-	}
-
-#ifdef ENABLE_HYBRID
-	case ADMIN_LOGOUT_USER: {
-		struct ph1handle *iph1;
-		char user[LOGINLEN+1];
-		int found = 0, len = com->ac_len - sizeof(com);
-
-		if (len > LOGINLEN) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "malformed message (login too long)\n");
-			break;
-		}
-
-		memcpy(user, (char *)(com + 1), len);
-		user[len] = 0;
-
-		found = purgeph1bylogin(user);
-		plog(LLV_INFO, LOCATION, NULL, 
-		    "deleted %d SA for user \"%s\"\n", found, user);
-
-		break;
-	}
-#endif
-
-	case ADMIN_DELETE_ALL_SA_DST: {
-		struct ph1handle *iph1;
-		struct sockaddr *dst;
-		char *loc, *rem;
-
-		dst = (struct sockaddr *)
-			&((struct admin_com_indexes *)
-			    ((caddr_t)com + sizeof(*com)))->dst;
-
-		rem = racoon_strdup(saddrwop2str(dst));
-		STRDUP_FATAL(rem);
-
-		plog(LLV_INFO, LOCATION, NULL, 
-		    "Flushing all SAs for peer %s\n", rem);
-
-		while ((iph1 = getph1bydstaddrwop(dst)) != NULL) {
-			loc = racoon_strdup(saddrwop2str(iph1->local));
-			STRDUP_FATAL(loc);
-
-			if (iph1->status == PHASE1ST_ESTABLISHED)
-				isakmp_info_send_d1(iph1);
-			purge_remote(iph1);
-
-			racoon_free(loc);
-		}
-		
-		racoon_free(rem);
-
-		break;
-	}
-
-	case ADMIN_ESTABLISH_SA_PSK: {
-		struct admin_com_psk *acp;
-		char *data;
-
-		com->ac_cmd = ADMIN_ESTABLISH_SA;
-
-		acp = (struct admin_com_psk *)
-		    ((char *)com + sizeof(*com) + 
-		    sizeof(struct admin_com_indexes));
-
-		idtype = acp->id_type;
-
-		if ((id = vmalloc(acp->id_len)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "cannot allocate memory: %s\n", 
-			    strerror(errno));
-			break;
-		}
-		data = (char *)(acp + 1);
-		memcpy(id->v, data, id->l);
-
-		if ((key = vmalloc(acp->key_len)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "cannot allocate memory: %s\n", 
-			    strerror(errno));
-			vfree(id);
-			id = NULL;
-			break;
-		}
-		data = (char *)(data + acp->id_len);
-		memcpy(key->v, data, key->l);
-	}
-	/* FALLTHROUGH */
-	case ADMIN_ESTABLISH_SA:
-	    {
-		struct sockaddr *dst;
-		struct sockaddr *src;
-		src = (struct sockaddr *)
-			&((struct admin_com_indexes *)
-			    ((caddr_t)com + sizeof(*com)))->src;
-		dst = (struct sockaddr *)
-			&((struct admin_com_indexes *)
-			    ((caddr_t)com + sizeof(*com)))->dst;
-
-		switch (com->ac_proto) {
-		case ADMIN_PROTO_ISAKMP: {
-			struct remoteconf *rmconf;
-			struct sockaddr *remote = NULL;
-			struct sockaddr *local = NULL;
-			u_int16_t port;
-
-			com->ac_errno = -1;
-
-			/* search appropreate configuration */
-			rmconf = getrmconf(dst);
-			if (rmconf == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no configuration found "
-					"for %s\n", saddrwop2str(dst));
-				goto out1;
-			}
-
-			/* get remote IP address and port number. */
-			if ((remote = dupsaddr(dst)) == NULL)
-				goto out1;
-
-			port = extract_port(rmconf->remote);
-			if (set_port(remote, port) == NULL)
-				goto out1;
-
-			/* get local address */
-			if ((local = dupsaddr(src)) == NULL)
-				goto out1;
-
-			port = getmyaddrsport(local);
-			if (set_port(local, port) == NULL)
-				goto out1;
-
-#ifdef ENABLE_HYBRID
-			/* Set the id and key */
-			if (id && key) {
-				if (xauth_rmconf_used(&rmconf->xauth) == -1)
-					goto out1;
-
-				if (rmconf->xauth->login != NULL) {
-					vfree(rmconf->xauth->login);
-					rmconf->xauth->login = NULL;
-				}
-				if (rmconf->xauth->pass != NULL) {
-					vfree(rmconf->xauth->pass);
-					rmconf->xauth->pass = NULL;
-				}
-
-				rmconf->xauth->login = id;
-				rmconf->xauth->pass = key;
-			}
-#endif
- 
-			plog(LLV_INFO, LOCATION, NULL,
-				"accept a request to establish IKE-SA: "
-				"%s\n", saddrwop2str(remote));
-
-			/* begin ident mode */
-			if (isakmp_ph1begin_i(rmconf, remote, local) < 0)
-				goto out1;
-
-			com->ac_errno = 0;
-out1:
-			if (local != NULL)
-				racoon_free(local);
-			if (remote != NULL)
-				racoon_free(remote);
-			break;
-		}
-		case ADMIN_PROTO_AH:
-		case ADMIN_PROTO_ESP:
-			break;
-		default:
-			/* ignore */
-			com->ac_errno = -1;
-		}
-	    }
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid command: %d\n", com->ac_cmd);
-		com->ac_errno = -1;
-	}
-
-	if ((error = admin_reply(so2, com, buf)) != 0)
-		goto out;
-
-	error = 0;
-out:
-	if (buf != NULL)
-		vfree(buf);
-
-	return error;
-}
-
-static int
-admin_reply(so, combuf, buf)
-	int so;
-	struct admin_com *combuf;
-	vchar_t *buf;
-{
-	int tlen;
-	char *retbuf = NULL;
-
-	if (buf != NULL)
-		tlen = sizeof(*combuf) + buf->l;
-	else
-		tlen = sizeof(*combuf);
-
-	retbuf = racoon_calloc(1, tlen);
-	if (retbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate admin buffer\n");
-		return -1;
-	}
-
-	memcpy(retbuf, combuf, sizeof(*combuf));
-	((struct admin_com *)retbuf)->ac_len = tlen;
-
-	if (buf != NULL)
-		memcpy(retbuf + sizeof(*combuf), buf->v, buf->l);
-
-	tlen = send(so, retbuf, tlen, 0);
-	racoon_free(retbuf);
-	if (tlen < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to send admin command: %s\n",
-			strerror(errno));
-		return -1;
-	}
-
-	return 0;
-}
-
-/* ADMIN_PROTO -> SADB_SATYPE */
-int
-admin2pfkey_proto(proto)
-	u_int proto;
-{
-	switch (proto) {
-	case ADMIN_PROTO_IPSEC:
-		return SADB_SATYPE_UNSPEC;
-	case ADMIN_PROTO_AH:
-		return SADB_SATYPE_AH;
-	case ADMIN_PROTO_ESP:
-		return SADB_SATYPE_ESP;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unsupported proto for admin: %d\n", proto);
-		return -1;
-	}
-	/*NOTREACHED*/
-}
-
-int
-admin_init()
-{
-	if (adminsock_path == NULL) {
-		lcconf->sock_admin = -1;
-		return 0;
-	}
-
-	memset(&sunaddr, 0, sizeof(sunaddr));
-	sunaddr.sun_family = AF_UNIX;
-	snprintf(sunaddr.sun_path, sizeof(sunaddr.sun_path),
-		"%s", adminsock_path);
-
-	lcconf->sock_admin = socket(AF_UNIX, SOCK_STREAM, 0);
-	if (lcconf->sock_admin == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"socket: %s\n", strerror(errno));
-		return -1;
-	}
-
-	unlink(sunaddr.sun_path);
-	if (bind(lcconf->sock_admin, (struct sockaddr *)&sunaddr,
-			sizeof(sunaddr)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"bind(sockname:%s): %s\n",
-			sunaddr.sun_path, strerror(errno));
-		(void)close(lcconf->sock_admin);
-		return -1;
-	}
-
-	if (chown(sunaddr.sun_path, adminsock_owner, adminsock_group) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "chown(%s, %d, %d): %s\n", 
-		    sunaddr.sun_path, adminsock_owner, 
-		    adminsock_group, strerror(errno));
-		(void)close(lcconf->sock_admin);
-		return -1;
-	}
-
-	if (chmod(sunaddr.sun_path, adminsock_mode) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "chmod(%s, 0%03o): %s\n", 
-		    sunaddr.sun_path, adminsock_mode, strerror(errno));
-		(void)close(lcconf->sock_admin);
-		return -1;
-	}
-
-	if (listen(lcconf->sock_admin, 5) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"listen(sockname:%s): %s\n",
-			sunaddr.sun_path, strerror(errno));
-		(void)close(lcconf->sock_admin);
-		return -1;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"open %s as racoon management.\n", sunaddr.sun_path);
-
-	return 0;
-}
-
-int
-admin_close()
-{
-	close(lcconf->sock_admin);
-	return 0;
-}
-#endif
-
diff --git a/src/racoon/admin.h b/src/racoon/admin.h
deleted file mode 100644
index cbc19e8..0000000
--- a/src/racoon/admin.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*	$NetBSD: admin.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: admin.h,v 1.11 2005/06/19 22:37:47 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ADMIN_H
-#define _ADMIN_H
-
-#define ADMINSOCK_PATH ADMINPORTDIR "/racoon.sock"
-
-extern char *adminsock_path;
-extern uid_t adminsock_owner;
-extern gid_t adminsock_group;
-extern mode_t adminsock_mode;
-
-/* command for administration. */
-/* NOTE: host byte order. */
-struct admin_com {
-	u_int16_t ac_len;	/* total packet length including data */
-	u_int16_t ac_cmd;
-	int16_t ac_errno;
-	u_int16_t ac_proto;
-};
-
-/*
- * No data follows as the data.
- * These don't use proto field.
- */
-#define ADMIN_RELOAD_CONF	0x0001
-#define ADMIN_SHOW_SCHED	0x0002
-#define ADMIN_SHOW_EVT		0x0003
-
-/*
- * No data follows as the data.
- * These use proto field.
- */
-#define ADMIN_SHOW_SA		0x0101
-#define ADMIN_FLUSH_SA		0x0102
-
-/*
- * The admin_com_indexes follows, see below.
- */
-#define ADMIN_DELETE_SA		0x0201
-#define ADMIN_ESTABLISH_SA	0x0202
-#define ADMIN_DELETE_ALL_SA_DST	0x0204	/* All SA for a given peer */
-
-/*
- * The admin_com_indexes and admin_com_psk follow, see below.
- */
-#define ADMIN_ESTABLISH_SA_PSK	0x0203
-
-/*
- * user login follows
- */
-#define ADMIN_LOGOUT_USER	0x0205  /* Delete SA for a given Xauth user */
-
-/*
- * Range 0x08xx is reserved for privilege separation, see privsep.h 
- */
-
-/* the value of proto */
-#define ADMIN_PROTO_ISAKMP	0x01ff
-#define ADMIN_PROTO_IPSEC	0x02ff
-#define ADMIN_PROTO_AH		0x0201
-#define ADMIN_PROTO_ESP		0x0202
-#define ADMIN_PROTO_INTERNAL	0x0301
-
-struct admin_com_indexes {
-	u_int8_t prefs;
-	u_int8_t prefd;
-	u_int8_t ul_proto;
-	u_int8_t reserved;
-	struct sockaddr_storage src;
-	struct sockaddr_storage dst;
-};
-
-struct admin_com_psk { 
-	int id_type;
-	size_t id_len;
-	size_t key_len;
-	/* Followed by id and key */
-}; 
-
-extern int admin2pfkey_proto __P((u_int));
-
-#endif /* _ADMIN_H */
diff --git a/src/racoon/admin_var.h b/src/racoon/admin_var.h
deleted file mode 100644
index 6d7ba81..0000000
--- a/src/racoon/admin_var.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*	$NetBSD: admin_var.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: admin_var.h,v 1.7 2004/12/30 00:08:30 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ADMIN_VAR_H
-#define _ADMIN_VAR_H
-
-extern int admin_handler __P((void));
-extern int admin_init __P((void));
-extern int admin_close __P((void));
-
-#endif /* _ADMIN_VAR_H */
diff --git a/src/racoon/algorithm.c b/src/racoon/algorithm.c
deleted file mode 100644
index 3fd50f6..0000000
--- a/src/racoon/algorithm.c
+++ /dev/null
@@ -1,957 +0,0 @@
-/*	$NetBSD: algorithm.c,v 1.8 2006/10/06 12:02:27 manu Exp $	*/
-
-/* Id: algorithm.c,v 1.15 2006/05/23 20:23:09 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <stdlib.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "crypto_openssl.h"
-#include "dhgroup.h"
-#include "algorithm.h"
-#include "oakley.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "gcmalloc.h"
-
-static struct hash_algorithm oakley_hashdef[] = {
-{ "md5",	algtype_md5,		OAKLEY_ATTR_HASH_ALG_MD5,
-		eay_md5_init,		eay_md5_update,
-		eay_md5_final,		eay_md5_hashlen,
-		eay_md5_one, },
-{ "sha1",	algtype_sha1,		OAKLEY_ATTR_HASH_ALG_SHA,
-		eay_sha1_init,		eay_sha1_update,
-		eay_sha1_final,		eay_sha1_hashlen,
-		eay_sha1_one, },
-#ifdef WITH_SHA2
-{ "sha2_256",	algtype_sha2_256,	OAKLEY_ATTR_HASH_ALG_SHA2_256,
-		eay_sha2_256_init,	eay_sha2_256_update,
-		eay_sha2_256_final,	eay_sha2_256_hashlen,
-		eay_sha2_256_one, },
-{ "sha2_384",	algtype_sha2_384,	OAKLEY_ATTR_HASH_ALG_SHA2_384,
-		eay_sha2_384_init,	eay_sha2_384_update,
-		eay_sha2_384_final,	eay_sha2_384_hashlen,
-		eay_sha2_384_one, },
-{ "sha2_512",	algtype_sha2_512,	OAKLEY_ATTR_HASH_ALG_SHA2_512,
-		eay_sha2_512_init,	eay_sha2_512_update,
-		eay_sha2_512_final,	eay_sha2_512_hashlen,
-		eay_sha2_512_one, },
-#endif
-};
-
-static struct hmac_algorithm oakley_hmacdef[] = {
-{ "hmac_md5",	algtype_md5,		OAKLEY_ATTR_HASH_ALG_MD5,
-		eay_hmacmd5_init,	eay_hmacmd5_update,
-		eay_hmacmd5_final,	NULL,
-		eay_hmacmd5_one, },
-{ "hmac_sha1",	algtype_sha1,		OAKLEY_ATTR_HASH_ALG_SHA,
-		eay_hmacsha1_init,	eay_hmacsha1_update,
-		eay_hmacsha1_final,	NULL,
-		eay_hmacsha1_one, },
-#ifdef WITH_SHA2
-{ "hmac_sha2_256",	algtype_sha2_256,	OAKLEY_ATTR_HASH_ALG_SHA2_256,
-		eay_hmacsha2_256_init,	eay_hmacsha2_256_update,
-		eay_hmacsha2_256_final,	NULL,
-		eay_hmacsha2_256_one, },
-{ "hmac_sha2_384",	algtype_sha2_384,	OAKLEY_ATTR_HASH_ALG_SHA2_384,
-		eay_hmacsha2_384_init,	eay_hmacsha2_384_update,
-		eay_hmacsha2_384_final,	NULL,
-		eay_hmacsha2_384_one, },
-{ "hmac_sha2_512",	algtype_sha2_512,	OAKLEY_ATTR_HASH_ALG_SHA2_512,
-		eay_hmacsha2_512_init,	eay_hmacsha2_512_update,
-		eay_hmacsha2_512_final,	NULL,
-		eay_hmacsha2_512_one, },
-#endif
-};
-
-static struct enc_algorithm oakley_encdef[] = {
-{ "des",	algtype_des,		OAKLEY_ATTR_ENC_ALG_DES,	8,
-		eay_des_encrypt,	eay_des_decrypt,
-		eay_des_weakkey,	eay_des_keylen, },
-#ifdef HAVE_OPENSSL_IDEA_H
-{ "idea",	algtype_idea,		OAKLEY_ATTR_ENC_ALG_IDEA,	8,
-		eay_idea_encrypt,	eay_idea_decrypt,
-		eay_idea_weakkey,	eay_idea_keylen, },
-#endif
-{ "blowfish",	algtype_blowfish,	OAKLEY_ATTR_ENC_ALG_BLOWFISH,	8,
-		eay_bf_encrypt,		eay_bf_decrypt,
-		eay_bf_weakkey,		eay_bf_keylen, },
-#ifdef HAVE_OPENSSL_RC5_H
-{ "rc5",	algtype_rc5,		OAKLEY_ATTR_ENC_ALG_RC5,	8,
-		eay_rc5_encrypt,	eay_rc5_decrypt,
-		eay_rc5_weakkey,	eay_rc5_keylen, },
-#endif
-{ "3des",	algtype_3des,		OAKLEY_ATTR_ENC_ALG_3DES,	8,
-		eay_3des_encrypt,	eay_3des_decrypt,
-		eay_3des_weakkey,	eay_3des_keylen, },
-{ "cast",	algtype_cast128,	OAKLEY_ATTR_ENC_ALG_CAST,	8,
-		eay_cast_encrypt,	eay_cast_decrypt,
-		eay_cast_weakkey,	eay_cast_keylen, },
-{ "aes",	algtype_aes,	OAKLEY_ATTR_ENC_ALG_AES,	16,
-		eay_aes_encrypt,	eay_aes_decrypt,
-		eay_aes_weakkey,	eay_aes_keylen, },
-#ifdef HAVE_OPENSSL_CAMELLIA_H
-{ "camellia",	algtype_camellia,	OAKLEY_ATTR_ENC_ALG_CAMELLIA,	16,
-		eay_camellia_encrypt,	eay_camellia_decrypt,
-		eay_camellia_weakkey,	eay_camellia_keylen, },
-#endif
-};
-
-static struct enc_algorithm ipsec_encdef[] = {
-{ "des-iv64",	algtype_des_iv64,	IPSECDOI_ESP_DES_IV64,		8,
-		NULL,			NULL,
-		NULL,			eay_des_keylen, },
-{ "des",	algtype_des,		IPSECDOI_ESP_DES,		8,
-		NULL,			NULL,
-		NULL,			eay_des_keylen, },
-{ "3des",	algtype_3des,		IPSECDOI_ESP_3DES,		8,
-		NULL,			NULL,
-		NULL,			eay_3des_keylen, },
-#ifdef HAVE_OPENSSL_RC5_H
-{ "rc5",	algtype_rc5,		IPSECDOI_ESP_RC5,		8,
-		NULL,			NULL,
-		NULL,			eay_rc5_keylen, },
-#endif
-{ "cast",	algtype_cast128,	IPSECDOI_ESP_CAST,		8,
-		NULL,			NULL,
-		NULL,			eay_cast_keylen, },
-{ "blowfish",	algtype_blowfish,	IPSECDOI_ESP_BLOWFISH,		8,
-		NULL,			NULL,
-		NULL,			eay_bf_keylen, },
-{ "des-iv32",	algtype_des_iv32,	IPSECDOI_ESP_DES_IV32,		8,
-		NULL,			NULL,
-		NULL,			eay_des_keylen, },
-{ "null",	algtype_null_enc,	IPSECDOI_ESP_NULL,		8,
-		NULL,			NULL,
-		NULL,			eay_null_keylen, },
-{ "aes",	algtype_aes,		IPSECDOI_ESP_AES,		16,
-		NULL,			NULL,
-		NULL,			eay_aes_keylen, },
-{ "twofish",	algtype_twofish,	IPSECDOI_ESP_TWOFISH,		16,
-		NULL,			NULL,
-		NULL,			eay_twofish_keylen, },
-#ifdef HAVE_OPENSSL_IDEA_H
-{ "3idea",	algtype_3idea,		IPSECDOI_ESP_3IDEA,		8,
-		NULL,			NULL,
-		NULL,			NULL, },
-{ "idea",	algtype_idea,		IPSECDOI_ESP_IDEA,		8,
-		NULL,			NULL,
-		NULL,			NULL, },
-#endif
-{ "rc4",	algtype_rc4,		IPSECDOI_ESP_RC4,		8,
-		NULL,			NULL,
-		NULL,			NULL, },
-#ifdef HAVE_OPENSSL_CAMELLIA_H
-{ "camellia",	algtype_camellia,	IPSECDOI_ESP_CAMELLIA,		16,
-		NULL,			NULL,
-		NULL,			eay_camellia_keylen, },
-#endif
-};
-
-static struct hmac_algorithm ipsec_hmacdef[] = {
-{ "md5",	algtype_hmac_md5,	IPSECDOI_ATTR_AUTH_HMAC_MD5,
-		NULL,			NULL,
-		NULL,			eay_md5_hashlen,
-		NULL, },
-{ "sha1",	algtype_hmac_sha1,	IPSECDOI_ATTR_AUTH_HMAC_SHA1,
-		NULL,			NULL,
-		NULL,			eay_sha1_hashlen,
-		NULL, },
-{ "kpdk",	algtype_kpdk,		IPSECDOI_ATTR_AUTH_KPDK,
-		NULL,			NULL,
-		NULL,			eay_kpdk_hashlen,
-		NULL, },
-{ "null",	algtype_non_auth,	IPSECDOI_ATTR_AUTH_NONE,
-		NULL,			NULL,
-		NULL,			eay_null_hashlen,
-		NULL, },
-#ifdef WITH_SHA2
-{ "hmac_sha2_256",	algtype_hmac_sha2_256,IPSECDOI_ATTR_AUTH_HMAC_SHA2_256,
-		NULL,			NULL,
-		NULL,			eay_sha2_256_hashlen,
-		NULL, },
-{ "hmac_sha2_384",	algtype_hmac_sha2_384,IPSECDOI_ATTR_AUTH_HMAC_SHA2_384,
-		NULL,			NULL,
-		NULL,			eay_sha2_384_hashlen,
-		NULL, },
-{ "hmac_sha2_512",	algtype_hmac_sha2_512,IPSECDOI_ATTR_AUTH_HMAC_SHA2_512,
-		NULL,			NULL,
-		NULL,			eay_sha2_512_hashlen,
-		NULL, },
-#endif
-};
-
-static struct misc_algorithm ipsec_compdef[] = {
-{ "oui",	algtype_oui,		IPSECDOI_IPCOMP_OUI, },
-{ "deflate",	algtype_deflate,	IPSECDOI_IPCOMP_DEFLATE, },
-{ "lzs",	algtype_lzs,		IPSECDOI_IPCOMP_LZS, },
-};
-
-/*
- * In case of asymetric modes (hybrid xauth), what's racoon mode of
- * operations ; it seems that the proposal should always use the
- * initiator half (unless a server initiates a connection, which is
- * not handled, and probably not useful).
- */
-static struct misc_algorithm oakley_authdef[] = {
-{ "pre_shared_key",	algtype_psk,	OAKLEY_ATTR_AUTH_METHOD_PSKEY, },
-{ "dsssig",		algtype_dsssig,	OAKLEY_ATTR_AUTH_METHOD_DSSSIG, },
-{ "rsasig",		algtype_rsasig,	OAKLEY_ATTR_AUTH_METHOD_RSASIG, },
-{ "rsaenc",		algtype_rsaenc,	OAKLEY_ATTR_AUTH_METHOD_RSAENC, },
-{ "rsarev",		algtype_rsarev,	OAKLEY_ATTR_AUTH_METHOD_RSAREV, },
-
-{ "gssapi_krb",		algtype_gssapikrb,
-    OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB, },
-
-#ifdef ENABLE_HYBRID
-{ "hybrid_rsa_server",	algtype_hybrid_rsa_s,	
-    OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R, },
-
-{ "hybrid_dss_server",	algtype_hybrid_dss_s,	
-    OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R, },
-
-{ "xauth_psk_server", 	algtype_xauth_psk_s,	
-    OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R, },
-
-{ "xauth_rsa_server", 	algtype_xauth_rsa_s,	
-    OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R, },
-
-{ "hybrid_rsa_client",	algtype_hybrid_rsa_c,	
-    OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I, },
-
-{ "hybrid_dss_client",	algtype_hybrid_dss_c,	
-    OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I, },
-
-{ "xauth_psk_client",	algtype_xauth_psk_c,	
-    OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I, },
-
-{ "xauth_rsa_client",	algtype_xauth_rsa_c,	
-    OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I, },
-#endif
-};
-
-static struct dh_algorithm oakley_dhdef[] = {
-{ "modp768",	algtype_modp768,	OAKLEY_ATTR_GRP_DESC_MODP768,
-		&dh_modp768, },
-{ "modp1024",	algtype_modp1024,	OAKLEY_ATTR_GRP_DESC_MODP1024,
-		&dh_modp1024, },
-{ "modp1536",	algtype_modp1536,	OAKLEY_ATTR_GRP_DESC_MODP1536,
-		&dh_modp1536, },
-{ "modp2048",	algtype_modp2048,	OAKLEY_ATTR_GRP_DESC_MODP2048,
-		&dh_modp2048, },
-{ "modp3072",	algtype_modp3072,	OAKLEY_ATTR_GRP_DESC_MODP3072,
-		&dh_modp3072, },
-{ "modp4096",	algtype_modp4096,	OAKLEY_ATTR_GRP_DESC_MODP4096,
-		&dh_modp4096, },
-{ "modp6144",	algtype_modp6144,	OAKLEY_ATTR_GRP_DESC_MODP6144,
-		&dh_modp6144, },
-{ "modp8192",	algtype_modp8192,	OAKLEY_ATTR_GRP_DESC_MODP8192,
-		&dh_modp8192, },
-};
-
-static struct hash_algorithm *alg_oakley_hashdef __P((int));
-static struct hmac_algorithm *alg_oakley_hmacdef __P((int));
-static struct enc_algorithm *alg_oakley_encdef __P((int));
-static struct enc_algorithm *alg_ipsec_encdef __P((int));
-static struct hmac_algorithm *alg_ipsec_hmacdef __P((int));
-static struct dh_algorithm *alg_oakley_dhdef __P((int));
-
-/* oakley hash algorithm */
-static struct hash_algorithm *
-alg_oakley_hashdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(oakley_hashdef); i++)
-		if (doi == oakley_hashdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "hash(%s)\n",
-				oakley_hashdef[i].name);
-			return &oakley_hashdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_oakley_hashdef_ok(doi)
-	int doi;
-{
-	struct hash_algorithm *f;
-
-	f = alg_oakley_hashdef(doi);
-	if (f == NULL)
-		return 0;
-
-	return 1;
-}
-
-int
-alg_oakley_hashdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(oakley_hashdef); i++)
-		if (type == oakley_hashdef[i].type) {
-			res = oakley_hashdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-int
-alg_oakley_hashdef_hashlen(doi)
-	int doi;
-{
-	struct hash_algorithm *f;
-
-	f = alg_oakley_hashdef(doi);
-	if (f == NULL || f->hashlen == NULL)
-		return 0;
-
-	return (f->hashlen)();
-}
-
-const char *
-alg_oakley_hashdef_name (doi)
-	int doi;
-{
-	struct hash_algorithm *f;
-
-	f = alg_oakley_hashdef(doi);
-	if (f == NULL)
-		return "*UNKNOWN*";
-
-	return f->name;
-}
-
-vchar_t *
-alg_oakley_hashdef_one(doi, buf)
-	int doi;
-	vchar_t *buf;
-{
-	struct hash_algorithm *f;
-
-	f = alg_oakley_hashdef(doi);
-	if (f == NULL || f->hashlen == NULL)
-		return NULL;
-
-	return (f->one)(buf);
-}
-
-/* oakley hmac algorithm */
-static struct hmac_algorithm *
-alg_oakley_hmacdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(oakley_hmacdef); i++)
-		if (doi == oakley_hmacdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "hmac(%s)\n",
-				oakley_hmacdef[i].name);
-			return &oakley_hmacdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_oakley_hmacdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(oakley_hmacdef); i++)
-		if (type == oakley_hmacdef[i].type) {
-			res = oakley_hmacdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-vchar_t *
-alg_oakley_hmacdef_one(doi, key, buf)
-	int doi;
-	vchar_t *key, *buf;
-{
-	struct hmac_algorithm *f;
-	vchar_t *res;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	f = alg_oakley_hmacdef(doi);
-	if (f == NULL || f->one == NULL)
-		return NULL;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	res = (f->one)(key, buf);
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s size=%zu): %8.6f", __func__,
-		f->name, buf->l, timedelta(&start, &end));
-#endif
-
-	return res;
-}
-
-/* oakley encryption algorithm */
-static struct enc_algorithm *
-alg_oakley_encdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(oakley_encdef); i++)
-		if (doi == oakley_encdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "encryption(%s)\n",
-				oakley_encdef[i].name);
-			return &oakley_encdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_oakley_encdef_ok(doi)
-	int doi;
-{
-	struct enc_algorithm *f;
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL)
-		return 0;
-
-	return 1;
-}
-
-int
-alg_oakley_encdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(oakley_encdef); i++)
-		if (type == oakley_encdef[i].type) {
-			res = oakley_encdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-int
-alg_oakley_encdef_keylen(doi, len)
-	int doi, len;
-{
-	struct enc_algorithm *f;
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL || f->keylen == NULL)
-		return -1;
-
-	return (f->keylen)(len);
-}
-
-int
-alg_oakley_encdef_blocklen(doi)
-	int doi;
-{
-	struct enc_algorithm *f;
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL)
-		return -1;
-
-	return f->blocklen;
-}
-
-const char *
-alg_oakley_encdef_name (doi)
-	int doi;
-{
-	struct enc_algorithm *f;
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL)
-		return "*UNKNOWN*";
-
-	return f->name;
-}
-
-vchar_t *
-alg_oakley_encdef_decrypt(doi, buf, key, iv)
-	int doi;
-	vchar_t *buf, *key, *iv;
-{
-	vchar_t *res;
-	struct enc_algorithm *f;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL || f->decrypt == NULL)
-		return NULL;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	res = (f->decrypt)(buf, key, iv);
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s klen=%zu size=%zu): %8.6f", __func__,
-		f->name, key->l << 3, buf->l, timedelta(&start, &end));
-#endif
-	return res;
-}
-
-vchar_t *
-alg_oakley_encdef_encrypt(doi, buf, key, iv)
-	int doi;
-	vchar_t *buf, *key, *iv;
-{
-	vchar_t *res;
-	struct enc_algorithm *f;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	f = alg_oakley_encdef(doi);
-	if (f == NULL || f->encrypt == NULL)
-		return NULL;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	res = (f->encrypt)(buf, key, iv);
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s klen=%zu size=%zu): %8.6f", __func__,
-		f->name, key->l << 3, buf->l, timedelta(&start, &end));
-#endif
-	return res;
-}
-
-/* ipsec encryption algorithm */
-static struct enc_algorithm *
-alg_ipsec_encdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(ipsec_encdef); i++)
-		if (doi == ipsec_encdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "encryption(%s)\n",
-				ipsec_encdef[i].name);
-			return &ipsec_encdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_ipsec_encdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(ipsec_encdef); i++)
-		if (type == ipsec_encdef[i].type) {
-			res = ipsec_encdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-int
-alg_ipsec_encdef_keylen(doi, len)
-	int doi, len;
-{
-	struct enc_algorithm *f;
-
-	f = alg_ipsec_encdef(doi);
-	if (f == NULL || f->keylen == NULL)
-		return -1;
-
-	return (f->keylen)(len);
-}
-
-/* ipsec hmac algorithm */
-static struct hmac_algorithm *
-alg_ipsec_hmacdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(ipsec_hmacdef); i++)
-		if (doi == ipsec_hmacdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "hmac(%s)\n",
-				ipsec_hmacdef[i].name);
-			return &ipsec_hmacdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_ipsec_hmacdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(ipsec_hmacdef); i++)
-		if (type == ipsec_hmacdef[i].type) {
-			res = ipsec_hmacdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-int
-alg_ipsec_hmacdef_hashlen(doi)
-	int doi;
-{
-	struct hmac_algorithm *f;
-
-	f = alg_ipsec_hmacdef(doi);
-	if (f == NULL || f->hashlen == NULL)
-		return -1;
-
-	return (f->hashlen)();
-}
-
-/* ip compression */
-int
-alg_ipsec_compdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(ipsec_compdef); i++)
-		if (type == ipsec_compdef[i].type) {
-			res = ipsec_compdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-/* dh algorithm */
-static struct dh_algorithm *
-alg_oakley_dhdef(doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(oakley_dhdef); i++)
-		if (doi == oakley_dhdef[i].doi) {
-			plog(LLV_DEBUG, LOCATION, NULL, "hmac(%s)\n",
-				oakley_dhdef[i].name);
-			return &oakley_dhdef[i];
-		}
-	return NULL;
-}
-
-int
-alg_oakley_dhdef_ok(doi)
-	int doi;
-{
-	struct dh_algorithm *f;
-
-	f = alg_oakley_dhdef(doi);
-	if (f == NULL)
-		return 0;
-
-	return 1;
-}
-
-int
-alg_oakley_dhdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(oakley_dhdef); i++)
-		if (type == oakley_dhdef[i].type) {
-			res = oakley_dhdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-struct dhgroup *
-alg_oakley_dhdef_group(doi)
-	int doi;
-{
-	struct dh_algorithm *f;
-
-	f = alg_oakley_dhdef(doi);
-	if (f == NULL || f->dhgroup == NULL)
-		return NULL;
-
-	return f->dhgroup;
-}
-
-const char *
-alg_oakley_dhdef_name (doi)
-	int doi;
-{
-	struct dh_algorithm *f;
-	
-	f = alg_oakley_dhdef(doi);
-	if (f == NULL)
-		return "*UNKNOWN*";
-	return f->name;
-}
-
-/* authentication method */
-int
-alg_oakley_authdef_doi(type)
-	int type;
-{
-	int i, res = -1;
-
-	for (i = 0; i < ARRAYLEN(oakley_authdef); i++)
-		if (type == oakley_authdef[i].type) {
-			res = oakley_authdef[i].doi;
-			break;
-		}
-	return res;
-}
-
-const char *
-alg_oakley_authdef_name (doi)
-	int doi;
-{
-	int i;
-
-	for (i = 0; i < ARRAYLEN(oakley_authdef); i++)
-		if (doi == oakley_authdef[i].doi) {
-			return oakley_authdef[i].name;
-		}
-	return "*UNKNOWN*";
-}
-
-/*
- * give the default key length
- * OUT:	-1:		NG
- *	0:		fixed key cipher, key length not allowed
- *	positive:	default key length
- */
-int
-default_keylen(class, type)
-	int class, type;
-{
-
-	switch (class) {
-	case algclass_isakmp_enc:
-	case algclass_ipsec_enc:
-		break;
-	default:
-		return 0;
-	}
-
-	switch (type) {
-	case algtype_blowfish:
-	case algtype_rc5:
-	case algtype_cast128:
-	case algtype_aes:
-	case algtype_twofish:
-	case algtype_camellia:
-		return 128;
-	default:
-		return 0;
-	}
-}
-
-/*
- * check key length
- * OUT:	-1:	NG
- *	0:	OK
- */
-int
-check_keylen(class, type, len)
-	int class, type, len;
-{
-	int badrange;
-
-	switch (class) {
-	case algclass_isakmp_enc:
-	case algclass_ipsec_enc:
-		break;
-	default:
-		/* unknown class, punt */
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unknown algclass %d\n", class);
-		return -1;
-	}
-
-	/* key length must be multiple of 8 bytes - RFC2451 2.2 */
-	switch (type) {
-	case algtype_blowfish:
-	case algtype_rc5:
-	case algtype_cast128:
-	case algtype_aes:
-	case algtype_twofish:
-	case algtype_camellia:
-		if (len % 8 != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"key length %d is not multiple of 8\n", len);
-			return -1;
-		}
-		break;
-	}
-
-	/* key length range */
-	badrange = 0;
-	switch (type) {
-	case algtype_blowfish:
-		if (len < 40 || 448 < len)
-			badrange++;
-		break;
-	case algtype_rc5:
-		if (len < 40 || 2040 < len)
-			badrange++;
-		break;
-	case algtype_cast128:
-		if (len < 40 || 128 < len)
-			badrange++;
-		break;
-	case algtype_aes:
-		if (!(len == 128 || len == 192 || len == 256))
-			badrange++;
-		break;
-	case algtype_twofish:
-		if (len < 40 || 256 < len)
-			badrange++;
-		break;
-	case algtype_camellia:
-		if (!(len == 128 || len == 192 || len == 256))
-			badrange++;
-		break;
-	default:
-		if (len) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"key length is not allowed");
-			return -1;
-		}
-		break;
-	}
-	if (badrange) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"key length out of range\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * convert algorithm type to DOI value.
- * OUT	-1   : NG
- *	other: converted.
- */
-int
-algtype2doi(class, type)
-	int class, type;
-{
-	int res = -1;
-
-	switch (class) {
-	case algclass_ipsec_enc:
-		res = alg_ipsec_encdef_doi(type);
-		break;
-	case algclass_ipsec_auth:
-		res = alg_ipsec_hmacdef_doi(type);
-		break;
-	case algclass_ipsec_comp:
-		res = alg_ipsec_compdef_doi(type);
-		break;
-	case algclass_isakmp_enc:
-		res =  alg_oakley_encdef_doi(type);
-		break;
-	case algclass_isakmp_hash:
-		res = alg_oakley_hashdef_doi(type);
-		break;
-	case algclass_isakmp_dh:
-		res = alg_oakley_dhdef_doi(type);
-		break;
-	case algclass_isakmp_ameth:
-		res = alg_oakley_authdef_doi(type);
-		break;
-	}
-	return res;
-}
-
-/*
- * convert algorithm class to DOI value.
- * OUT	-1   : NG
- *	other: converted.
- */
-int
-algclass2doi(class)
-	int class;
-{
-	switch (class) {
-	case algclass_ipsec_enc:
-		return IPSECDOI_PROTO_IPSEC_ESP;
-	case algclass_ipsec_auth:
-		return IPSECDOI_ATTR_AUTH;
-	case algclass_ipsec_comp:
-		return IPSECDOI_PROTO_IPCOMP;
-	case algclass_isakmp_enc:
-		return OAKLEY_ATTR_ENC_ALG;
-	case algclass_isakmp_hash:
-		return OAKLEY_ATTR_HASH_ALG;
-	case algclass_isakmp_dh:
-		return OAKLEY_ATTR_GRP_DESC;
-	case algclass_isakmp_ameth:
-		return OAKLEY_ATTR_AUTH_METHOD;
-	default:
-		return -1;
-	}
-	/*NOTREACHED*/
-	return -1;
-}
diff --git a/src/racoon/algorithm.h b/src/racoon/algorithm.h
deleted file mode 100644
index 8b631b6..0000000
--- a/src/racoon/algorithm.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*	$NetBSD: algorithm.h,v 1.5 2006/10/06 12:02:27 manu Exp $	*/
-
-/* Id: algorithm.h,v 1.10 2005/04/09 16:25:23 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ALGORITHM_H
-#define _ALGORITHM_H
-
-#include <gnuc.h>
-
-/* algorithm class */
-enum {
-	algclass_ipsec_enc,
-	algclass_ipsec_auth,
-	algclass_ipsec_comp,
-	algclass_isakmp_enc,
-	algclass_isakmp_hash,
-	algclass_isakmp_dh,
-	algclass_isakmp_ameth,	/* authentication method. */
-#define MAXALGCLASS	7
-};
-
-#define ALG_DEFAULT_KEYLEN	64
-
-#define ALGTYPE_NOTHING		0
-
-/* algorithm type */
-enum algtype {
-	algtype_nothing = 0,
-
-	/* enc */
-	algtype_des_iv64,
-	algtype_des,
-	algtype_3des,
-	algtype_rc5,
-	algtype_idea,
-	algtype_cast128,
-	algtype_blowfish,
-	algtype_3idea,
-	algtype_des_iv32,
-	algtype_rc4,
-	algtype_null_enc,
-	algtype_aes,
-	algtype_twofish,
-	algtype_camellia,
-
-	/* ipsec auth */
-	algtype_hmac_md5,
-	algtype_hmac_sha1,
-	algtype_des_mac,
-	algtype_kpdk,
-	algtype_non_auth,
-	algtype_hmac_sha2_256,
-	algtype_hmac_sha2_384,
-	algtype_hmac_sha2_512,
-
-	/* ipcomp */
-	algtype_oui,
-	algtype_deflate,
-	algtype_lzs,
-
-	/* hash */
-	algtype_md5,
-	algtype_sha1,
-	algtype_tiger,
-	algtype_sha2_256,
-	algtype_sha2_384,
-	algtype_sha2_512,
-
-	/* dh_group */
-	algtype_modp768,
-	algtype_modp1024,
-	algtype_ec2n155,
-	algtype_ec2n185,
-	algtype_modp1536,
-	algtype_modp2048,
-	algtype_modp3072,
-	algtype_modp4096,
-	algtype_modp6144,
-	algtype_modp8192,
-
-	/* authentication method. */
-	algtype_psk,
-	algtype_dsssig,
-	algtype_rsasig,
-	algtype_rsaenc,
-	algtype_rsarev,
-	algtype_gssapikrb,
-#ifdef ENABLE_HYBRID
-	algtype_hybrid_rsa_s,
-	algtype_hybrid_dss_s,
-	algtype_hybrid_rsa_c,
-	algtype_hybrid_dss_c,
-	algtype_xauth_psk_s,
-	algtype_xauth_psk_c,
-	algtype_xauth_rsa_s,
-	algtype_xauth_rsa_c,
-#endif
-};
-
-struct hmac_algorithm {
-	char *name;
-	int type;
-	int doi;
-	caddr_t (*init) __P((vchar_t *));
-	void (*update) __P((caddr_t, vchar_t *));
-	vchar_t *(*final) __P((caddr_t));
-	int (*hashlen) __P((void));
-	vchar_t *(*one) __P((vchar_t *, vchar_t *));
-};
-
-struct hash_algorithm {
-	char *name;
-	int type;
-	int doi;
-	caddr_t (*init) __P((void));
-	void (*update) __P((caddr_t, vchar_t *));
-	vchar_t *(*final) __P((caddr_t));
-	int (*hashlen) __P((void));
-	vchar_t *(*one) __P((vchar_t *));
-};
-
-struct enc_algorithm {
-	char *name;
-	int type;
-	int doi;
-	int blocklen;
-	vchar_t *(*encrypt) __P((vchar_t *, vchar_t *, vchar_t *));
-	vchar_t *(*decrypt) __P((vchar_t *, vchar_t *, vchar_t *));
-	int (*weakkey) __P((vchar_t *));
-	int (*keylen) __P((int));
-};
-
-/* dh group */
-struct dh_algorithm {
-	char *name;
-	int type;
-	int doi;
-	struct dhgroup *dhgroup;
-};
-
-/* ipcomp, auth meth, dh group */
-struct misc_algorithm {
-	char *name;
-	int type;
-	int doi;
-};
-
-extern int alg_oakley_hashdef_ok __P((int));
-extern int alg_oakley_hashdef_doi __P((int));
-extern int alg_oakley_hashdef_hashlen __P((int));
-extern vchar_t *alg_oakley_hashdef_one __P((int, vchar_t *));
-
-extern int alg_oakley_hmacdef_doi __P((int));
-extern vchar_t *alg_oakley_hmacdef_one __P((int, vchar_t *, vchar_t *));
-
-extern int alg_oakley_encdef_ok __P((int));
-extern int alg_oakley_encdef_doi __P((int));
-extern int alg_oakley_encdef_keylen __P((int, int));
-extern int alg_oakley_encdef_blocklen __P((int));
-extern vchar_t *alg_oakley_encdef_decrypt __P((int, vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *alg_oakley_encdef_encrypt __P((int, vchar_t *, vchar_t *, vchar_t *));
-
-extern int alg_ipsec_encdef_doi __P((int));
-extern int alg_ipsec_encdef_keylen __P((int, int));
-
-extern int alg_ipsec_hmacdef_doi __P((int));
-extern int alg_ipsec_hmacdef_hashlen __P((int));
-
-extern int alg_ipsec_compdef_doi __P((int));
-
-extern int alg_oakley_dhdef_doi __P((int));
-extern int alg_oakley_dhdef_ok __P((int));
-extern struct dhgroup *alg_oakley_dhdef_group __P((int));
-
-extern int alg_oakley_authdef_doi __P((int));
-
-extern int default_keylen __P((int, int));
-extern int check_keylen __P((int, int, int));
-extern int algtype2doi __P((int, int));
-extern int algclass2doi __P((int));
-
-extern const char *alg_oakley_encdef_name __P((int));
-extern const char *alg_oakley_hashdef_name __P((int));
-extern const char *alg_oakley_dhdef_name __P((int));
-extern const char *alg_oakley_authdef_name __P((int));
-
-#endif /* _ALGORITHM_H */
diff --git a/src/racoon/backupsa.c b/src/racoon/backupsa.c
deleted file mode 100644
index 9496000..0000000
--- a/src/racoon/backupsa.c
+++ /dev/null
@@ -1,468 +0,0 @@
-/*	$NetBSD: backupsa.c,v 1.8.4.1 2007/08/01 11:52:19 vanhu Exp $	*/
-
-/*	$KAME: backupsa.c,v 1.16 2001/12/31 20:13:40 thorpej Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "str2val.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "sockmisc.h"
-#include "safefile.h"
-#include "backupsa.h"
-#include "libpfkey.h"
-
-/*
- * (time string)%(sa parameter)
- * (time string) := ex. Nov 24 18:22:48 1986
- * (sa parameter) :=
- *    src dst satype spi mode reqid wsize \
- *    e_type e_keylen a_type a_keylen flags \
- *    l_alloc l_bytes l_addtime l_usetime seq keymat
- */
-static char *format = "%b %d %T %Y";	/* time format */
-static char *strmon[12] = {
-        "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-};
-
-static char *str2tmx __P((char *, struct tm *));
-static int str2num __P((char *, int));
-
-/*
- * output the sa parameter.
- */
-int
-backupsa_to_file(sa_args)
-	struct pfkey_send_sa_args *sa_args;
-{
-	char buf[1024];
-	struct tm *tm;
-	time_t t;
-	char *p, *k;
-	int len, l, i;
-	FILE *fp;
-
-	p = buf;
-	len = sizeof(buf);
-
-	t = time(NULL);
-	tm = localtime(&t);
-	l = strftime(p, len, format, tm);
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-	l = snprintf(p, len, "%%");
-	if (l < 0 || l >= len)
-		goto err;
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-        i = getnameinfo(sa_args->src, sysdep_sa_len(sa_args->src), p, len, NULL, 0, NIFLAGS);
-	if (i != 0)
-		goto err;
-	l = strlen(p);
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-	l = snprintf(p, len, " ");
-	if (l < 0 || l >= len)
-		goto err;
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-        i = getnameinfo(sa_args->dst, sysdep_sa_len(sa_args->dst), p, len, NULL, 0, NIFLAGS);
-	if (i != 0)
-		goto err;
-	l = strlen(p);
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-	l = snprintf(p, len,
-		" %u %lu %u %u %u "
-		"%u %u %u %u %u "
-		"%u %llu %llu %llu %u",
-		sa_args->satype, (unsigned long)ntohl(sa_args->spi), 
-		sa_args->mode, sa_args->reqid, sa_args->wsize, sa_args->e_type, 
-		sa_args->e_keylen, sa_args->a_type, sa_args->a_keylen, 
-		sa_args->flags, sa_args->l_alloc, 
-		(unsigned long long)sa_args->l_bytes, 
-		(unsigned long long)sa_args->l_addtime, 
-		(unsigned long long)sa_args->l_usetime, sa_args->seq);
-
-	if (l < 0 || l >= len)
-		goto err;
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-	k = val2str(sa_args->keymat, sa_args->e_keylen + sa_args->a_keylen);
-	l = snprintf(p, len, " %s", k);
-	racoon_free(k);
-	if (l < 0 || l >= len)
-		goto err;
-	p += l;
-	len -= l;
-	if (len < 0)
-		goto err;
-
-	/* open the file and write the SA parameter */
-	if (safefile(lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], 1) != 0 ||
-	    (fp = fopen(lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], "a")) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to open the backup file %s.\n",
-			lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]);
-		return -1;
-	}
-	fprintf(fp, "%s\n", buf);
-	fclose(fp);
-
-	return 0;
-
-err:
-	plog(LLV_ERROR, LOCATION, NULL,
-		"SA cannot be saved to a file.\n");
-	return -1;
-}
-
-int
-backupsa_from_file()
-{
-	FILE *fp;
-	char buf[512];
-	struct tm tm;
-	time_t created, current;
-	char *p, *q;
-	size_t keymatlen;
-	int line;
-	struct pfkey_send_sa_args sa_args;
-
-	memset(&sa_args, 0, sizeof(sa_args));
-
-	if (safefile(lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], 1) == 0)
-		fp = fopen(lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], "r");
-	else
-		fp = NULL;
-	if (fp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to open the backup file %s.\n",
-			lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]);
-		return -1;
-	}
-
-	current = time(NULL);
-
-	for(line = 1; fgets(buf, sizeof(buf), fp) != NULL; line++) {
-		/* comment line */
-		if (buf[0] == '#')
-			continue;
-
-		memset(&tm, 0, sizeof(tm));
-		p = str2tmx(buf, &tm);
-		if (*p != '%') {
-	err:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"illegal format line#%d in %s: %s\n",
-				line, lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], 
-				buf);
-			goto next;
-		}
-		created = mktime(&tm);
-		p++;
-
-		for (q = p; *q != '\0' && !isspace((int)*q); q++)
-			;
-		*q = '\0';
-		if ((sa_args.src = str2saddr(p, NULL)) == NULL)
-			goto next;
-		p = q + 1;
-
-		for (q = p; *q != '\0' && !isspace((int)*q); q++)
-			;
-		*q = '\0';
-		if ((sa_args.dst = str2saddr(p, NULL)) == NULL)
-			goto next;
-		p = q + 1;
-
-#define GETNEXTNUM(value, function) 				\
-do { 								\
-	char *y; 						\
-	for (q = p; *q != '\0' && !isspace((int)*q); q++) 	\
-		; 						\
-	*q = '\0'; 						\
-	(value) = function(p, &y, 10); 				\
-	if ((value) == 0 && *y != '\0') 			\
-		goto next; 					\
-	p = q + 1; 						\
-} while (/*CONSTCOND*/0);
-
-		GETNEXTNUM(sa_args.satype, strtoul);
-		GETNEXTNUM(sa_args.spi, strtoul);
-		sa_args.spi = ntohl(sa_args.spi);
-		GETNEXTNUM(sa_args.mode, strtoul);
-		GETNEXTNUM(sa_args.reqid, strtoul);
-		GETNEXTNUM(sa_args.wsize, strtoul);
-		GETNEXTNUM(sa_args.e_type, strtoul);
-		GETNEXTNUM(sa_args.e_keylen, strtoul);
-		GETNEXTNUM(sa_args.a_type, strtoul);
-		GETNEXTNUM(sa_args.a_keylen, strtoul);
-		GETNEXTNUM(sa_args.flags, strtoul);
-		GETNEXTNUM(sa_args.l_alloc, strtoul);
-		GETNEXTNUM(sa_args.l_bytes, strtouq);
-		GETNEXTNUM(sa_args.l_addtime, strtouq);
-		GETNEXTNUM(sa_args.l_usetime, strtouq);
-		GETNEXTNUM(sa_args.seq, strtoul);
-
-#undef GETNEXTNUM
-
-		sa_args.keymat = str2val(p, 16, &keymatlen);
-		if (sa_args.keymat == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"illegal format(keymat) line#%d in %s: %s\n",
-				line, lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], 
-				buf);
-			goto next;
-		}
-
-		if (created + sa_args.l_addtime < current) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"ignore this line#%d in %s due to expiration\n",
-				line, lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]);
-			goto next;
-		}
-		sa_args.l_addtime -= current - created;
-
-		if (pfkey_send_add2(&sa_args) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"restore SA failed line#%d in %s: %s\n",
-				line, lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], 
-				ipsec_strerror());
-		}
-
-next:
-	 	if (sa_args.src != NULL) {
-			racoon_free(sa_args.src);
-			sa_args.src = NULL;
-		}
-		if (sa_args.dst != NULL) {
-			racoon_free(sa_args.dst);
-			sa_args.dst = NULL;
-		}
-		if (sa_args.keymat != NULL) {
-			racoon_free(sa_args.keymat);
-			sa_args.keymat = NULL;
-		}
-	}
-
-	fclose(fp);
-
-	/*
-	 * There is a possibility that an abnormal system down will happen
-	 * again before new negotiation will be started.  so racoon clears
-	 * the backup file here.  it's ok that old SAs are remained in the
-	 * file.  any old SA will not be installed because racoon checks the
-	 * lifetime and compare with current time.
-	 */
-
-	return 0;
-}
-
-int
-backupsa_clean()
-{
-	FILE *fp;
-
-	/* simply return if the file is not defined. */
-	if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA])
-		return 0;
-
-	fp = fopen(lcconf->pathinfo[LC_PATHTYPE_BACKUPSA], "w+");
-	if (fp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to clean the backup file %s.\n",
-			lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]);
-		return -1;
-	}
-	fclose(fp);
-	return 0;
-}
-
-/*
- * convert fixed string into the tm structure.
- * The fixed string is like 'Nov 24 18:22:48 1986'.
- * static char *format = "%b %d %T %Y";
- */
-static char *
-str2tmx(char *p, struct tm *tm)
-{
-	int i, len;
-
-	/* Month */
-        for (i = 0; i < sizeof(strmon)/sizeof(strmon[0]); i++) {
-		if (strncasecmp(p, strmon[i], strlen(strmon[i])) == 0) {
-			tm->tm_mon = i;
-			break;
-		}
-	}
-	if (i == sizeof(strmon)/sizeof(strmon[0]))
-		return 0;
-	p += strlen(strmon[i]);
-	if (*p++ != ' ')
-		return 0;
-
-	/* Day */
-	len = 2;
-	tm->tm_mday = str2num(p, len);
-	if (tm->tm_mday == -1 || tm->tm_mday > 31)
-		return 0;
-	p += len;
-	if (*p++ != ' ')
-		return 0;
-
-	/* Hour */
-	len = 2;
-	tm->tm_hour = str2num(p, len);
-	if (tm->tm_hour == -1 || tm->tm_hour > 24)
-		return 0;
-	p += len;
-	if (*p++ != ':')
-		return 0;
-
-	/* Min */
-	len = 2;
-	tm->tm_min = str2num(p, len);
-	if (tm->tm_min == -1 || tm->tm_min > 60)
-		return 0;
-	p += len;
-	if (*p++ != ':')
-		return 0;
-
-	/* Sec */
-	len = 2;
-	tm->tm_sec = str2num(p, len);
-	if (tm->tm_sec == -1 || tm->tm_sec > 60)
-		return 0;
-	p += len;
-	if (*p++ != ' ')
-		return 0;
-
-	/* Year */
-	len = 4;
-	tm->tm_year = str2num(p, len);
-	if (tm->tm_year == -1 || tm->tm_year < 1900)
-		return 0;
-	tm->tm_year -= 1900;
-	p += len;
-
-	return p;
-}
-
-static int
-str2num(p, len)
-	char *p;
-	int len;
-{
-	int res, i;
-
-	res = 0;
-        for (i = len; i > 0; i--) {
-		if (!isdigit((int)*p))
-			return -1;
-		res *= 10;
-		res += *p - '0';
-		p++;
-	}
-
-	return res;
-}
-
-#ifdef TEST
-#include <stdio.h>
-int
-main()
-{
-	struct tm tm;
-	time_t t;
-	char *buf = "Nov 24 18:22:48 1986 ";
-	char *p;
-
-	memset(&tm, 0, sizeof(tm));
-	p = str2tmx(buf, &tm);
-	printf("[%x]\n", *p);
-	t = mktime(&tm);
-	if (t == -1)
-		printf("mktime failed.");
-	p = ctime(&t);
-	printf("[%s]\n", p);
-
-	exit(0);
-}
-#endif
diff --git a/src/racoon/backupsa.h b/src/racoon/backupsa.h
deleted file mode 100644
index e563791..0000000
--- a/src/racoon/backupsa.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*	$NetBSD: backupsa.h,v 1.5 2006/12/09 05:52:57 manu Exp $	*/
-
-/* Id: backupsa.h,v 1.3 2004/06/11 16:00:15 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _BACKUPSA_H
-#define _BACKUPSA_H
-
-extern int backupsa_to_file __P((struct pfkey_send_sa_args *));
-extern int backupsa_from_file __P((void));
-extern int backupsa_clean __P((void));
-
-#endif /* _BACKUPSA_H */
diff --git a/src/racoon/cfparse.h b/src/racoon/cfparse.h
deleted file mode 100644
index 2946b3e..0000000
--- a/src/racoon/cfparse.h
+++ /dev/null
@@ -1,392 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     PRIVSEP = 258,
-     USER = 259,
-     GROUP = 260,
-     CHROOT = 261,
-     PATH = 262,
-     PATHTYPE = 263,
-     INCLUDE = 264,
-     IDENTIFIER = 265,
-     VENDORID = 266,
-     LOGGING = 267,
-     LOGLEV = 268,
-     PADDING = 269,
-     PAD_RANDOMIZE = 270,
-     PAD_RANDOMIZELEN = 271,
-     PAD_MAXLEN = 272,
-     PAD_STRICT = 273,
-     PAD_EXCLTAIL = 274,
-     LISTEN = 275,
-     X_ISAKMP = 276,
-     X_ISAKMP_NATT = 277,
-     X_ADMIN = 278,
-     STRICT_ADDRESS = 279,
-     ADMINSOCK = 280,
-     DISABLED = 281,
-     LDAPCFG = 282,
-     LDAP_HOST = 283,
-     LDAP_PORT = 284,
-     LDAP_PVER = 285,
-     LDAP_BASE = 286,
-     LDAP_BIND_DN = 287,
-     LDAP_BIND_PW = 288,
-     LDAP_SUBTREE = 289,
-     LDAP_ATTR_USER = 290,
-     LDAP_ATTR_ADDR = 291,
-     LDAP_ATTR_MASK = 292,
-     LDAP_ATTR_GROUP = 293,
-     LDAP_ATTR_MEMBER = 294,
-     MODECFG = 295,
-     CFG_NET4 = 296,
-     CFG_MASK4 = 297,
-     CFG_DNS4 = 298,
-     CFG_NBNS4 = 299,
-     CFG_DEFAULT_DOMAIN = 300,
-     CFG_AUTH_SOURCE = 301,
-     CFG_AUTH_GROUPS = 302,
-     CFG_SYSTEM = 303,
-     CFG_RADIUS = 304,
-     CFG_PAM = 305,
-     CFG_LDAP = 306,
-     CFG_LOCAL = 307,
-     CFG_NONE = 308,
-     CFG_GROUP_SOURCE = 309,
-     CFG_ACCOUNTING = 310,
-     CFG_CONF_SOURCE = 311,
-     CFG_MOTD = 312,
-     CFG_POOL_SIZE = 313,
-     CFG_AUTH_THROTTLE = 314,
-     CFG_SPLIT_NETWORK = 315,
-     CFG_SPLIT_LOCAL = 316,
-     CFG_SPLIT_INCLUDE = 317,
-     CFG_SPLIT_DNS = 318,
-     CFG_PFS_GROUP = 319,
-     CFG_SAVE_PASSWD = 320,
-     RETRY = 321,
-     RETRY_COUNTER = 322,
-     RETRY_INTERVAL = 323,
-     RETRY_PERSEND = 324,
-     RETRY_PHASE1 = 325,
-     RETRY_PHASE2 = 326,
-     NATT_KA = 327,
-     ALGORITHM_CLASS = 328,
-     ALGORITHMTYPE = 329,
-     STRENGTHTYPE = 330,
-     SAINFO = 331,
-     FROM = 332,
-     REMOTE = 333,
-     ANONYMOUS = 334,
-     INHERIT = 335,
-     EXCHANGE_MODE = 336,
-     EXCHANGETYPE = 337,
-     DOI = 338,
-     DOITYPE = 339,
-     SITUATION = 340,
-     SITUATIONTYPE = 341,
-     CERTIFICATE_TYPE = 342,
-     CERTTYPE = 343,
-     PEERS_CERTFILE = 344,
-     CA_TYPE = 345,
-     VERIFY_CERT = 346,
-     SEND_CERT = 347,
-     SEND_CR = 348,
-     IDENTIFIERTYPE = 349,
-     IDENTIFIERQUAL = 350,
-     MY_IDENTIFIER = 351,
-     PEERS_IDENTIFIER = 352,
-     VERIFY_IDENTIFIER = 353,
-     DNSSEC = 354,
-     CERT_X509 = 355,
-     CERT_PLAINRSA = 356,
-     NONCE_SIZE = 357,
-     DH_GROUP = 358,
-     KEEPALIVE = 359,
-     PASSIVE = 360,
-     INITIAL_CONTACT = 361,
-     NAT_TRAVERSAL = 362,
-     REMOTE_FORCE_LEVEL = 363,
-     PROPOSAL_CHECK = 364,
-     PROPOSAL_CHECK_LEVEL = 365,
-     GENERATE_POLICY = 366,
-     GENERATE_LEVEL = 367,
-     SUPPORT_PROXY = 368,
-     PROPOSAL = 369,
-     EXEC_PATH = 370,
-     EXEC_COMMAND = 371,
-     EXEC_SUCCESS = 372,
-     EXEC_FAILURE = 373,
-     GSS_ID = 374,
-     GSS_ID_ENC = 375,
-     GSS_ID_ENCTYPE = 376,
-     COMPLEX_BUNDLE = 377,
-     DPD = 378,
-     DPD_DELAY = 379,
-     DPD_RETRY = 380,
-     DPD_MAXFAIL = 381,
-     PH1ID = 382,
-     XAUTH_LOGIN = 383,
-     WEAK_PHASE1_CHECK = 384,
-     PREFIX = 385,
-     PORT = 386,
-     PORTANY = 387,
-     UL_PROTO = 388,
-     ANY = 389,
-     IKE_FRAG = 390,
-     ESP_FRAG = 391,
-     MODE_CFG = 392,
-     PFS_GROUP = 393,
-     LIFETIME = 394,
-     LIFETYPE_TIME = 395,
-     LIFETYPE_BYTE = 396,
-     STRENGTH = 397,
-     REMOTEID = 398,
-     SCRIPT = 399,
-     PHASE1_UP = 400,
-     PHASE1_DOWN = 401,
-     NUMBER = 402,
-     SWITCH = 403,
-     BOOLEAN = 404,
-     HEXSTRING = 405,
-     QUOTEDSTRING = 406,
-     ADDRSTRING = 407,
-     ADDRRANGE = 408,
-     UNITTYPE_BYTE = 409,
-     UNITTYPE_KBYTES = 410,
-     UNITTYPE_MBYTES = 411,
-     UNITTYPE_TBYTES = 412,
-     UNITTYPE_SEC = 413,
-     UNITTYPE_MIN = 414,
-     UNITTYPE_HOUR = 415,
-     EOS = 416,
-     BOC = 417,
-     EOC = 418,
-     COMMA = 419
-   };
-#endif
-/* Tokens.  */
-#define PRIVSEP 258
-#define USER 259
-#define GROUP 260
-#define CHROOT 261
-#define PATH 262
-#define PATHTYPE 263
-#define INCLUDE 264
-#define IDENTIFIER 265
-#define VENDORID 266
-#define LOGGING 267
-#define LOGLEV 268
-#define PADDING 269
-#define PAD_RANDOMIZE 270
-#define PAD_RANDOMIZELEN 271
-#define PAD_MAXLEN 272
-#define PAD_STRICT 273
-#define PAD_EXCLTAIL 274
-#define LISTEN 275
-#define X_ISAKMP 276
-#define X_ISAKMP_NATT 277
-#define X_ADMIN 278
-#define STRICT_ADDRESS 279
-#define ADMINSOCK 280
-#define DISABLED 281
-#define LDAPCFG 282
-#define LDAP_HOST 283
-#define LDAP_PORT 284
-#define LDAP_PVER 285
-#define LDAP_BASE 286
-#define LDAP_BIND_DN 287
-#define LDAP_BIND_PW 288
-#define LDAP_SUBTREE 289
-#define LDAP_ATTR_USER 290
-#define LDAP_ATTR_ADDR 291
-#define LDAP_ATTR_MASK 292
-#define LDAP_ATTR_GROUP 293
-#define LDAP_ATTR_MEMBER 294
-#define MODECFG 295
-#define CFG_NET4 296
-#define CFG_MASK4 297
-#define CFG_DNS4 298
-#define CFG_NBNS4 299
-#define CFG_DEFAULT_DOMAIN 300
-#define CFG_AUTH_SOURCE 301
-#define CFG_AUTH_GROUPS 302
-#define CFG_SYSTEM 303
-#define CFG_RADIUS 304
-#define CFG_PAM 305
-#define CFG_LDAP 306
-#define CFG_LOCAL 307
-#define CFG_NONE 308
-#define CFG_GROUP_SOURCE 309
-#define CFG_ACCOUNTING 310
-#define CFG_CONF_SOURCE 311
-#define CFG_MOTD 312
-#define CFG_POOL_SIZE 313
-#define CFG_AUTH_THROTTLE 314
-#define CFG_SPLIT_NETWORK 315
-#define CFG_SPLIT_LOCAL 316
-#define CFG_SPLIT_INCLUDE 317
-#define CFG_SPLIT_DNS 318
-#define CFG_PFS_GROUP 319
-#define CFG_SAVE_PASSWD 320
-#define RETRY 321
-#define RETRY_COUNTER 322
-#define RETRY_INTERVAL 323
-#define RETRY_PERSEND 324
-#define RETRY_PHASE1 325
-#define RETRY_PHASE2 326
-#define NATT_KA 327
-#define ALGORITHM_CLASS 328
-#define ALGORITHMTYPE 329
-#define STRENGTHTYPE 330
-#define SAINFO 331
-#define FROM 332
-#define REMOTE 333
-#define ANONYMOUS 334
-#define INHERIT 335
-#define EXCHANGE_MODE 336
-#define EXCHANGETYPE 337
-#define DOI 338
-#define DOITYPE 339
-#define SITUATION 340
-#define SITUATIONTYPE 341
-#define CERTIFICATE_TYPE 342
-#define CERTTYPE 343
-#define PEERS_CERTFILE 344
-#define CA_TYPE 345
-#define VERIFY_CERT 346
-#define SEND_CERT 347
-#define SEND_CR 348
-#define IDENTIFIERTYPE 349
-#define IDENTIFIERQUAL 350
-#define MY_IDENTIFIER 351
-#define PEERS_IDENTIFIER 352
-#define VERIFY_IDENTIFIER 353
-#define DNSSEC 354
-#define CERT_X509 355
-#define CERT_PLAINRSA 356
-#define NONCE_SIZE 357
-#define DH_GROUP 358
-#define KEEPALIVE 359
-#define PASSIVE 360
-#define INITIAL_CONTACT 361
-#define NAT_TRAVERSAL 362
-#define REMOTE_FORCE_LEVEL 363
-#define PROPOSAL_CHECK 364
-#define PROPOSAL_CHECK_LEVEL 365
-#define GENERATE_POLICY 366
-#define GENERATE_LEVEL 367
-#define SUPPORT_PROXY 368
-#define PROPOSAL 369
-#define EXEC_PATH 370
-#define EXEC_COMMAND 371
-#define EXEC_SUCCESS 372
-#define EXEC_FAILURE 373
-#define GSS_ID 374
-#define GSS_ID_ENC 375
-#define GSS_ID_ENCTYPE 376
-#define COMPLEX_BUNDLE 377
-#define DPD 378
-#define DPD_DELAY 379
-#define DPD_RETRY 380
-#define DPD_MAXFAIL 381
-#define PH1ID 382
-#define XAUTH_LOGIN 383
-#define WEAK_PHASE1_CHECK 384
-#define PREFIX 385
-#define PORT 386
-#define PORTANY 387
-#define UL_PROTO 388
-#define ANY 389
-#define IKE_FRAG 390
-#define ESP_FRAG 391
-#define MODE_CFG 392
-#define PFS_GROUP 393
-#define LIFETIME 394
-#define LIFETYPE_TIME 395
-#define LIFETYPE_BYTE 396
-#define STRENGTH 397
-#define REMOTEID 398
-#define SCRIPT 399
-#define PHASE1_UP 400
-#define PHASE1_DOWN 401
-#define NUMBER 402
-#define SWITCH 403
-#define BOOLEAN 404
-#define HEXSTRING 405
-#define QUOTEDSTRING 406
-#define ADDRSTRING 407
-#define ADDRRANGE 408
-#define UNITTYPE_BYTE 409
-#define UNITTYPE_KBYTES 410
-#define UNITTYPE_MBYTES 411
-#define UNITTYPE_TBYTES 412
-#define UNITTYPE_SEC 413
-#define UNITTYPE_MIN 414
-#define UNITTYPE_HOUR 415
-#define EOS 416
-#define BOC 417
-#define EOC 418
-#define COMMA 419
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 174 "cfparse.y"
-{
-	unsigned long num;
-	vchar_t *val;
-	struct remoteconf *rmconf;
-	struct sockaddr *saddr;
-	struct sainfoalg *alg;
-}
-/* Line 1489 of yacc.c.  */
-#line 385 "cfparse.h"
-	YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE yylval;
-
diff --git a/src/racoon/cfparse.y b/src/racoon/cfparse.y
deleted file mode 100644
index 540c400..0000000
--- a/src/racoon/cfparse.y
+++ /dev/null
@@ -1,2599 +0,0 @@
-/*	$NetBSD: cfparse.y,v 1.18.4.7 2008/07/21 20:45:32 tteras Exp $	*/
-
-/* Id: cfparse.y,v 1.66 2006/08/22 18:17:17 manubsd Exp */
-
-%{
-/*
- * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 and 2003 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#ifdef ENABLE_HYBRID
-#include <arpa/inet.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <netdb.h>
-#include <pwd.h>
-#include <grp.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "str2val.h"
-#include "genlist.h"
-#include "debug.h"
-
-#include "admin.h"
-#include "privsep.h"
-#include "cfparse_proto.h"
-#include "cftoken_proto.h"
-#include "algorithm.h"
-#include "localconf.h"
-#include "policy.h"
-#include "sainfo.h"
-#include "oakley.h"
-#include "pfkey.h"
-#include "remoteconf.h"
-#include "grabmyaddr.h"
-#include "isakmp_var.h"
-#include "handler.h"
-#include "isakmp.h"
-#include "nattraversal.h"
-#include "isakmp_frag.h"
-#ifdef ENABLE_HYBRID
-#include "resolv.h"
-#include "isakmp_unity.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-#include "ipsec_doi.h"
-#include "strnames.h"
-#include "gcmalloc.h"
-#ifdef HAVE_GSSAPI
-#include "gssapi.h"
-#endif
-#include "vendorid.h"
-#include "rsalist.h"
-
-struct proposalspec {
-	time_t lifetime;		/* for isakmp/ipsec */
-	int lifebyte;			/* for isakmp/ipsec */
-	struct secprotospec *spspec;	/* the head is always current spec. */
-	struct proposalspec *next;	/* the tail is the most prefered. */
-	struct proposalspec *prev;
-};
-
-struct secprotospec {
-	int prop_no;
-	int trns_no;
-	int strength;		/* for isakmp/ipsec */
-	int encklen;		/* for isakmp/ipsec */
-	time_t lifetime;	/* for isakmp */
-	int lifebyte;		/* for isakmp */
-	int proto_id;		/* for ipsec (isakmp?) */
-	int ipsec_level;	/* for ipsec */
-	int encmode;		/* for ipsec */
-	int vendorid;		/* for isakmp */
-	char *gssid;
-	struct sockaddr *remote;
-	int algclass[MAXALGCLASS];
-
-	struct secprotospec *next;	/* the tail is the most prefiered. */
-	struct secprotospec *prev;
-	struct proposalspec *back;
-};
-
-static int num2dhgroup[] = {
-	0,
-	OAKLEY_ATTR_GRP_DESC_MODP768,
-	OAKLEY_ATTR_GRP_DESC_MODP1024,
-	OAKLEY_ATTR_GRP_DESC_EC2N155,
-	OAKLEY_ATTR_GRP_DESC_EC2N185,
-	OAKLEY_ATTR_GRP_DESC_MODP1536,
-	0,
-	0,
-	0,
-	0,
-	0,
-	0,
-	0,
-	0,
-	OAKLEY_ATTR_GRP_DESC_MODP2048,
-	OAKLEY_ATTR_GRP_DESC_MODP3072,
-	OAKLEY_ATTR_GRP_DESC_MODP4096,
-	OAKLEY_ATTR_GRP_DESC_MODP6144,
-	OAKLEY_ATTR_GRP_DESC_MODP8192
-};
-
-static struct remoteconf *cur_rmconf;
-static int tmpalgtype[MAXALGCLASS];
-static struct sainfo *cur_sainfo;
-static int cur_algclass;
-static int oldloglevel = LLV_BASE;
-
-static struct proposalspec *newprspec __P((void));
-static void insprspec __P((struct proposalspec *, struct proposalspec **));
-static struct secprotospec *newspspec __P((void));
-static void insspspec __P((struct secprotospec *, struct proposalspec **));
-static void adminsock_conf __P((vchar_t *, vchar_t *, vchar_t *, int));
-
-static int set_isakmp_proposal
-	__P((struct remoteconf *, struct proposalspec *));
-static void clean_tmpalgtype __P((void));
-static int expand_isakmpspec __P((int, int, int *,
-	int, int, time_t, int, int, int, char *, struct remoteconf *));
-static int listen_addr __P((struct sockaddr *addr, int udp_encap));
-
-void freeetypes (struct etypes **etypes);
-
-#if 0
-static int fix_lifebyte __P((u_long));
-#endif
-%}
-
-%union {
-	unsigned long num;
-	vchar_t *val;
-	struct remoteconf *rmconf;
-	struct sockaddr *saddr;
-	struct sainfoalg *alg;
-}
-
-	/* privsep */
-%token PRIVSEP USER GROUP CHROOT
-	/* path */
-%token PATH PATHTYPE
-	/* include */
-%token INCLUDE
-	/* self information */
-%token IDENTIFIER VENDORID
-	/* logging */
-%token LOGGING LOGLEV
-	/* padding */
-%token PADDING PAD_RANDOMIZE PAD_RANDOMIZELEN PAD_MAXLEN PAD_STRICT PAD_EXCLTAIL
-	/* listen */
-%token LISTEN X_ISAKMP X_ISAKMP_NATT X_ADMIN STRICT_ADDRESS ADMINSOCK DISABLED
-	/* ldap config */
-%token LDAPCFG LDAP_HOST LDAP_PORT LDAP_PVER LDAP_BASE LDAP_BIND_DN LDAP_BIND_PW LDAP_SUBTREE
-%token LDAP_ATTR_USER LDAP_ATTR_ADDR LDAP_ATTR_MASK LDAP_ATTR_GROUP LDAP_ATTR_MEMBER
-	/* modecfg */
-%token MODECFG CFG_NET4 CFG_MASK4 CFG_DNS4 CFG_NBNS4 CFG_DEFAULT_DOMAIN
-%token CFG_AUTH_SOURCE CFG_AUTH_GROUPS CFG_SYSTEM CFG_RADIUS CFG_PAM CFG_LDAP CFG_LOCAL CFG_NONE
-%token CFG_GROUP_SOURCE CFG_ACCOUNTING CFG_CONF_SOURCE CFG_MOTD CFG_POOL_SIZE CFG_AUTH_THROTTLE
-%token CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL CFG_SPLIT_INCLUDE CFG_SPLIT_DNS
-%token CFG_PFS_GROUP CFG_SAVE_PASSWD
-
-	/* timer */
-%token RETRY RETRY_COUNTER RETRY_INTERVAL RETRY_PERSEND
-%token RETRY_PHASE1 RETRY_PHASE2 NATT_KA
-	/* algorithm */
-%token ALGORITHM_CLASS ALGORITHMTYPE STRENGTHTYPE
-	/* sainfo */
-%token SAINFO FROM
-	/* remote */
-%token REMOTE ANONYMOUS INHERIT
-%token EXCHANGE_MODE EXCHANGETYPE DOI DOITYPE SITUATION SITUATIONTYPE
-%token CERTIFICATE_TYPE CERTTYPE PEERS_CERTFILE CA_TYPE
-%token VERIFY_CERT SEND_CERT SEND_CR
-%token IDENTIFIERTYPE IDENTIFIERQUAL MY_IDENTIFIER 
-%token PEERS_IDENTIFIER VERIFY_IDENTIFIER
-%token DNSSEC CERT_X509 CERT_PLAINRSA
-%token NONCE_SIZE DH_GROUP KEEPALIVE PASSIVE INITIAL_CONTACT
-%token NAT_TRAVERSAL REMOTE_FORCE_LEVEL
-%token PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL
-%token GENERATE_POLICY GENERATE_LEVEL SUPPORT_PROXY
-%token PROPOSAL
-%token EXEC_PATH EXEC_COMMAND EXEC_SUCCESS EXEC_FAILURE
-%token GSS_ID GSS_ID_ENC GSS_ID_ENCTYPE
-%token COMPLEX_BUNDLE
-%token DPD DPD_DELAY DPD_RETRY DPD_MAXFAIL
-%token PH1ID
-%token XAUTH_LOGIN WEAK_PHASE1_CHECK
-
-%token PREFIX PORT PORTANY UL_PROTO ANY IKE_FRAG ESP_FRAG MODE_CFG
-%token PFS_GROUP LIFETIME LIFETYPE_TIME LIFETYPE_BYTE STRENGTH REMOTEID
-
-%token SCRIPT PHASE1_UP PHASE1_DOWN
-
-%token NUMBER SWITCH BOOLEAN
-%token HEXSTRING QUOTEDSTRING ADDRSTRING ADDRRANGE
-%token UNITTYPE_BYTE UNITTYPE_KBYTES UNITTYPE_MBYTES UNITTYPE_TBYTES
-%token UNITTYPE_SEC UNITTYPE_MIN UNITTYPE_HOUR
-%token EOS BOC EOC COMMA
-
-%type <num> NUMBER BOOLEAN SWITCH keylength
-%type <num> PATHTYPE IDENTIFIERTYPE IDENTIFIERQUAL LOGLEV GSS_ID_ENCTYPE 
-%type <num> ALGORITHM_CLASS dh_group_num
-%type <num> ALGORITHMTYPE STRENGTHTYPE
-%type <num> PREFIX prefix PORT port ike_port
-%type <num> ul_proto UL_PROTO
-%type <num> EXCHANGETYPE DOITYPE SITUATIONTYPE
-%type <num> CERTTYPE CERT_X509 CERT_PLAINRSA PROPOSAL_CHECK_LEVEL REMOTE_FORCE_LEVEL GENERATE_LEVEL
-%type <num> unittype_time unittype_byte
-%type <val> QUOTEDSTRING HEXSTRING ADDRSTRING ADDRRANGE sainfo_id
-%type <val> identifierstring
-%type <saddr> remote_index ike_addrinfo_port
-%type <alg> algorithm
-
-%%
-
-statements
-	:	/* nothing */
-	|	statements statement
-	;
-statement
-	:	privsep_statement
-	|	path_statement
-	|	include_statement
-	|	gssenc_statement
-	|	identifier_statement
-	|	logging_statement
-	|	padding_statement
-	|	listen_statement
-	|	ldapcfg_statement
-	|	modecfg_statement
-	|	timer_statement
-	|	sainfo_statement
-	|	remote_statement
-	|	special_statement
-	;
-
-	/* privsep */
-privsep_statement
-	:	PRIVSEP BOC privsep_stmts EOC
-	;
-privsep_stmts
-	:	/* nothing */
-	|	privsep_stmts privsep_stmt
-	;
-privsep_stmt
-	:	USER QUOTEDSTRING
-		{
-			struct passwd *pw;
-
-			if ((pw = getpwnam($2->v)) == NULL) {
-				yyerror("unknown user \"%s\"", $2->v);
-				return -1;
-			}
-			lcconf->uid = pw->pw_uid;
-		} 
-		EOS
-	|	USER NUMBER { lcconf->uid = $2; } EOS
-	|	GROUP QUOTEDSTRING
-		{
-			struct group *gr;
-
-			if ((gr = getgrnam($2->v)) == NULL) {
-				yyerror("unknown group \"%s\"", $2->v);
-				return -1;
-			}
-			lcconf->gid = gr->gr_gid;
-		}
-		EOS
-	|	GROUP NUMBER { lcconf->gid = $2; } EOS
-	|	CHROOT QUOTEDSTRING { lcconf->chroot = $2->v; } EOS
-	;
-
-	/* path */
-path_statement
-	:	PATH PATHTYPE QUOTEDSTRING
-		{
-			if ($2 >= LC_PATHTYPE_MAX) {
-				yyerror("invalid path type %d", $2);
-				return -1;
-			}
-
-			/* free old pathinfo */
-			if (lcconf->pathinfo[$2])
-				racoon_free(lcconf->pathinfo[$2]);
-
-			/* set new pathinfo */
-			lcconf->pathinfo[$2] = racoon_strdup($3->v);
-			STRDUP_FATAL(lcconf->pathinfo[$2]);
-			vfree($3);
-		}
-		EOS
-	;
-
-	/* special */
-special_statement
-	:	COMPLEX_BUNDLE SWITCH { lcconf->complex_bundle = $2; } EOS
-	;
-
-	/* include */
-include_statement
-	:	INCLUDE QUOTEDSTRING EOS
-		{
-			char path[MAXPATHLEN];
-
-			getpathname(path, sizeof(path),
-				LC_PATHTYPE_INCLUDE, $2->v);
-			vfree($2);
-			if (yycf_switch_buffer(path) != 0)
-				return -1;
-		}
-	;
-
-	/* gss_id_enc */
-gssenc_statement
-	:	GSS_ID_ENC GSS_ID_ENCTYPE EOS
-		{
-			if ($2 >= LC_GSSENC_MAX) {
-				yyerror("invalid GSS ID encoding %d", $2);
-				return -1;
-			}
-			lcconf->gss_id_enc = $2;
-		}
-	;
-
-	/* self information */
-identifier_statement
-	:	IDENTIFIER identifier_stmt
-	;
-identifier_stmt
-	:	VENDORID
-		{
-			/*XXX to be deleted */
-		}
-		QUOTEDSTRING EOS
-	|	IDENTIFIERTYPE QUOTEDSTRING
-		{
-			/*XXX to be deleted */
-			$2->l--;	/* nuke '\0' */
-			lcconf->ident[$1] = $2;
-			if (lcconf->ident[$1] == NULL) {
-				yyerror("failed to set my ident: %s",
-					strerror(errno));
-				return -1;
-			}
-		}
-		EOS
-	;
-
-	/* logging */
-logging_statement
-	:	LOGGING log_level EOS
-	;
-log_level
-	:	HEXSTRING
-		{
-			/*
-			 * XXX ignore it because this specification
-			 * will be obsoleted.
-			 */
-			yywarn("see racoon.conf(5), such a log specification will be obsoleted.");
-			vfree($1);
-		}
-	|	LOGLEV
-		{
-			/*
-			 * set the loglevel to the value specified
-			 * in the configuration file plus the number
-			 * of -d options specified on the command line
-			 */
-			loglevel += $1 - oldloglevel;
-			oldloglevel = $1;
-		}
-	;
-
-	/* padding */
-padding_statement
-	:	PADDING BOC padding_stmts EOC
-	;
-padding_stmts
-	:	/* nothing */
-	|	padding_stmts padding_stmt
-	;
-padding_stmt
-	:	PAD_RANDOMIZE SWITCH { lcconf->pad_random = $2; } EOS
-	|	PAD_RANDOMIZELEN SWITCH { lcconf->pad_randomlen = $2; } EOS
-	|	PAD_MAXLEN NUMBER { lcconf->pad_maxsize = $2; } EOS
-	|	PAD_STRICT SWITCH { lcconf->pad_strict = $2; } EOS
-	|	PAD_EXCLTAIL SWITCH { lcconf->pad_excltail = $2; } EOS
-	;
-
-	/* listen */
-listen_statement
-	:	LISTEN BOC listen_stmts EOC
-	;
-listen_stmts
-	:	/* nothing */
-	|	listen_stmts listen_stmt
-	;
-listen_stmt
-	:	X_ISAKMP ike_addrinfo_port
-		{
-			listen_addr ($2, 0);
-		}
-		EOS
-	|	X_ISAKMP_NATT ike_addrinfo_port
-		{
-#ifdef ENABLE_NATT
-			listen_addr ($2, 1);
-#else
-			yyerror("NAT-T support not compiled in.");
-#endif
-		}
-		EOS
-	|	X_ADMIN
-		{
-			yyerror("admin directive is obsoleted.");
-		}
-		PORT EOS
-	|	ADMINSOCK QUOTEDSTRING QUOTEDSTRING QUOTEDSTRING NUMBER 
-		{
-#ifdef ENABLE_ADMINPORT
-			adminsock_conf($2, $3, $4, $5);
-#else
-			yywarn("admin port support not compiled in");
-#endif
-		}
-		EOS
-	|	ADMINSOCK QUOTEDSTRING
-		{
-#ifdef ENABLE_ADMINPORT
-			adminsock_conf($2, NULL, NULL, -1);
-#else
-			yywarn("admin port support not compiled in");
-#endif
-		}
-		EOS
-	|	ADMINSOCK DISABLED
-		{
-#ifdef ENABLE_ADMINPORT
-			adminsock_path = NULL;
-#else
-			yywarn("admin port support not compiled in");
-#endif
-		}
-		EOS
-	|	STRICT_ADDRESS { lcconf->strict_address = TRUE; } EOS
-	;
-ike_addrinfo_port
-	:	ADDRSTRING ike_port
-		{
-			char portbuf[10];
-
-			snprintf(portbuf, sizeof(portbuf), "%ld", $2);
-			$$ = str2saddr($1->v, portbuf);
-			vfree($1);
-			if (!$$)
-				return -1;
-		}
-	;
-ike_port
-	:	/* nothing */	{ $$ = PORT_ISAKMP; }
-	|	PORT		{ $$ = $1; }
-	;
-
-	/* ldap configuration */
-ldapcfg_statement
-	:	LDAPCFG {
-#ifndef ENABLE_HYBRID
-			yyerror("racoon not configured with --enable-hybrid");
-			return -1;
-#endif
-#ifndef HAVE_LIBLDAP
-			yyerror("racoon not configured with --with-libldap");
-			return -1;
-#endif
-		} BOC ldapcfg_stmts EOC
-	;
-ldapcfg_stmts
-	:	/* nothing */
-	|	ldapcfg_stmts ldapcfg_stmt
-	;
-ldapcfg_stmt
-	:	LDAP_PVER NUMBER
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (($2<2)||($2>3))
-				yyerror("invalid ldap protocol version (2|3)");
-			xauth_ldap_config.pver = $2;
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_HOST QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.host != NULL)
-				vfree(xauth_ldap_config.host);
-			xauth_ldap_config.host = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_PORT NUMBER
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			xauth_ldap_config.port = $2;
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_BASE QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.base != NULL)
-				vfree(xauth_ldap_config.base);
-			xauth_ldap_config.base = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_SUBTREE SWITCH
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			xauth_ldap_config.subtree = $2;
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_BIND_DN QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.bind_dn != NULL)
-				vfree(xauth_ldap_config.bind_dn);
-			xauth_ldap_config.bind_dn = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_BIND_PW QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.bind_pw != NULL)
-				vfree(xauth_ldap_config.bind_pw);
-			xauth_ldap_config.bind_pw = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_ATTR_USER QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.attr_user != NULL)
-				vfree(xauth_ldap_config.attr_user);
-			xauth_ldap_config.attr_user = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_ATTR_ADDR QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.attr_addr != NULL)
-				vfree(xauth_ldap_config.attr_addr);
-			xauth_ldap_config.attr_addr = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_ATTR_MASK QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.attr_mask != NULL)
-				vfree(xauth_ldap_config.attr_mask);
-			xauth_ldap_config.attr_mask = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_ATTR_GROUP QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.attr_group != NULL)
-				vfree(xauth_ldap_config.attr_group);
-			xauth_ldap_config.attr_group = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	|	LDAP_ATTR_MEMBER QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			if (xauth_ldap_config.attr_member != NULL)
-				vfree(xauth_ldap_config.attr_member);
-			xauth_ldap_config.attr_member = vdup($2);
-#endif
-#endif
-		}
-		EOS
-	;
-
-	/* modecfg */
-modecfg_statement
-	:	MODECFG BOC modecfg_stmts EOC
-	;
-modecfg_stmts
-	:	/* nothing */
-	|	modecfg_stmts modecfg_stmt
-	;
-modecfg_stmt
-	:	CFG_NET4 ADDRSTRING
-		{
-#ifdef ENABLE_HYBRID
-			if (inet_pton(AF_INET, $2->v,
-			     &isakmp_cfg_config.network4) != 1)
-				yyerror("bad IPv4 network address.");
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_MASK4 ADDRSTRING
-		{
-#ifdef ENABLE_HYBRID
-			if (inet_pton(AF_INET, $2->v,
-			    &isakmp_cfg_config.netmask4) != 1)
-				yyerror("bad IPv4 netmask address.");
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_DNS4 addrdnslist
-		EOS
-	|	CFG_NBNS4 addrwinslist
-		EOS
-	|	CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL splitnetlist
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.splitnet_type = UNITY_LOCAL_LAN;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_SPLIT_NETWORK CFG_SPLIT_INCLUDE splitnetlist
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.splitnet_type = UNITY_SPLIT_INCLUDE;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_SPLIT_DNS splitdnslist
-		{
-#ifndef ENABLE_HYBRID
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_DEFAULT_DOMAIN QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-			strncpy(&isakmp_cfg_config.default_domain[0], 
-			    $2->v, MAXPATHLEN);
-			isakmp_cfg_config.default_domain[MAXPATHLEN] = '\0';
-			vfree($2);
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_AUTH_SOURCE CFG_SYSTEM
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_SYSTEM;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_AUTH_SOURCE CFG_RADIUS
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBRADIUS
-			isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_RADIUS;
-#else /* HAVE_LIBRADIUS */
-			yyerror("racoon not configured with --with-libradius");
-#endif /* HAVE_LIBRADIUS */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_AUTH_SOURCE CFG_PAM
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBPAM
-			isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_PAM;
-#else /* HAVE_LIBPAM */
-			yyerror("racoon not configured with --with-libpam");
-#endif /* HAVE_LIBPAM */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_AUTH_SOURCE CFG_LDAP
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_LDAP;
-#else /* HAVE_LIBLDAP */
-			yyerror("racoon not configured with --with-libldap");
-#endif /* HAVE_LIBLDAP */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_AUTH_GROUPS authgrouplist
-		{
-#ifndef ENABLE_HYBRID
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_GROUP_SOURCE CFG_SYSTEM
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_SYSTEM;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_GROUP_SOURCE CFG_LDAP
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_LDAP;
-#else /* HAVE_LIBLDAP */
-			yyerror("racoon not configured with --with-libldap");
-#endif /* HAVE_LIBLDAP */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_ACCOUNTING CFG_NONE
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_NONE;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_ACCOUNTING CFG_SYSTEM
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_SYSTEM;
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	CFG_ACCOUNTING CFG_RADIUS
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBRADIUS
-			isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_RADIUS;
-#else /* HAVE_LIBRADIUS */
-			yyerror("racoon not configured with --with-libradius");
-#endif /* HAVE_LIBRADIUS */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_ACCOUNTING CFG_PAM
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBPAM
-			isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_PAM;
-#else /* HAVE_LIBPAM */
-			yyerror("racoon not configured with --with-libpam");
-#endif /* HAVE_LIBPAM */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_POOL_SIZE NUMBER
-		{
-#ifdef ENABLE_HYBRID
-			if (isakmp_cfg_resize_pool($2) != 0)
-				yyerror("cannot allocate memory for pool");
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_PFS_GROUP NUMBER
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.pfs_group = $2;
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_SAVE_PASSWD SWITCH
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.save_passwd = $2;
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_AUTH_THROTTLE NUMBER
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.auth_throttle = $2;
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_CONF_SOURCE CFG_LOCAL
-		{
-#ifdef ENABLE_HYBRID
-			isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LOCAL;
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_CONF_SOURCE CFG_RADIUS
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBRADIUS
-			isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_RADIUS;
-#else /* HAVE_LIBRADIUS */
-			yyerror("racoon not configured with --with-libradius");
-#endif /* HAVE_LIBRADIUS */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_CONF_SOURCE CFG_LDAP
-		{
-#ifdef ENABLE_HYBRID
-#ifdef HAVE_LIBLDAP
-			isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LDAP;
-#else /* HAVE_LIBLDAP */
-			yyerror("racoon not configured with --with-libldap");
-#endif /* HAVE_LIBLDAP */
-#else /* ENABLE_HYBRID */
-			yyerror("racoon not configured with --enable-hybrid");
-#endif /* ENABLE_HYBRID */
-		}
-		EOS
-	|	CFG_MOTD QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-			strncpy(&isakmp_cfg_config.motd[0], $2->v, MAXPATHLEN);
-			isakmp_cfg_config.motd[MAXPATHLEN] = '\0';
-			vfree($2);
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	;
-
-addrdnslist
-	:	addrdns
-	|	addrdns COMMA addrdnslist
-	;
-addrdns
-	:	ADDRSTRING
-		{
-#ifdef ENABLE_HYBRID
-			struct isakmp_cfg_config *icc = &isakmp_cfg_config;
-
-			if (icc->dns4_index > MAXNS)
-				yyerror("No more than %d DNS", MAXNS);
-			if (inet_pton(AF_INET, $1->v,
-			    &icc->dns4[icc->dns4_index++]) != 1)
-				yyerror("bad IPv4 DNS address.");
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-	;
-
-addrwinslist
-	:	addrwins
-	|	addrwins COMMA addrwinslist
-	;
-addrwins
-	:	ADDRSTRING
-		{
-#ifdef ENABLE_HYBRID
-			struct isakmp_cfg_config *icc = &isakmp_cfg_config;
-
-			if (icc->nbns4_index > MAXWINS)
-				yyerror("No more than %d WINS", MAXWINS);
-			if (inet_pton(AF_INET, $1->v,
-			    &icc->nbns4[icc->nbns4_index++]) != 1)
-				yyerror("bad IPv4 WINS address.");
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-	;
-
-splitnetlist
-	:	splitnet
-	|	splitnetlist COMMA splitnet
-	;
-splitnet
-	:	ADDRSTRING PREFIX
-		{
-#ifdef ENABLE_HYBRID
-			struct isakmp_cfg_config *icc = &isakmp_cfg_config;
-			struct unity_network network;
-			memset(&network,0,sizeof(network));
-
-			if (inet_pton(AF_INET, $1->v, &network.addr4) != 1)
-				yyerror("bad IPv4 SPLIT address.");
-
-			/* Turn $2 (the prefix) into a subnet mask */
-			network.mask4.s_addr = ($2) ? htonl(~((1 << (32 - $2)) - 1)) : 0;
-
-			/* add the network to our list */ 
-			if (splitnet_list_add(&icc->splitnet_list, &network,&icc->splitnet_count))
-				yyerror("Unable to allocate split network");
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-	;
-
-authgrouplist
-	:	authgroup
-	|	authgroup COMMA authgrouplist
-	;
-authgroup
-	:	QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-			char * groupname = NULL;
-			char ** grouplist = NULL;
-			struct isakmp_cfg_config *icc = &isakmp_cfg_config;
-
-			grouplist = racoon_realloc(icc->grouplist,
-					sizeof(char**)*(icc->groupcount+1));
-			if (grouplist == NULL)
-				yyerror("unable to allocate auth group list");
-
-			groupname = racoon_malloc($1->l+1);
-			if (groupname == NULL)
-				yyerror("unable to allocate auth group name");
-
-			memcpy(groupname,$1->v,$1->l);
-			groupname[$1->l]=0;
-			grouplist[icc->groupcount]=groupname;
-			icc->grouplist = grouplist;
-			icc->groupcount++;
-
-			vfree($1);
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-	;
-
-splitdnslist
-	:	splitdns
-	|	splitdns COMMA splitdnslist
-	;
-splitdns
-	:	QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-			struct isakmp_cfg_config *icc = &isakmp_cfg_config;
-
-			if (!icc->splitdns_len)
-			{
-				icc->splitdns_list = racoon_malloc($1->l);
-				if(icc->splitdns_list == NULL)
-					yyerror("error allocating splitdns list buffer");
-				memcpy(icc->splitdns_list,$1->v,$1->l);
-				icc->splitdns_len = $1->l;
-			}
-			else
-			{
-				int len = icc->splitdns_len + $1->l + 1;
-				icc->splitdns_list = racoon_realloc(icc->splitdns_list,len);
-				if(icc->splitdns_list == NULL)
-					yyerror("error allocating splitdns list buffer");
-				icc->splitdns_list[icc->splitdns_len] = ',';
-				memcpy(icc->splitdns_list + icc->splitdns_len + 1, $1->v, $1->l);
-				icc->splitdns_len = len;
-			}
-			vfree($1);
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-	;
-
-
-	/* timer */
-timer_statement
-	:	RETRY BOC timer_stmts EOC
-	;
-timer_stmts
-	:	/* nothing */
-	|	timer_stmts timer_stmt
-	;
-timer_stmt
-	:	RETRY_COUNTER NUMBER
-		{
-			lcconf->retry_counter = $2;
-		}
-		EOS
-	|	RETRY_INTERVAL NUMBER unittype_time
-		{
-			lcconf->retry_interval = $2 * $3;
-		}
-		EOS
-	|	RETRY_PERSEND NUMBER
-		{
-			lcconf->count_persend = $2;
-		}
-		EOS
-	|	RETRY_PHASE1 NUMBER unittype_time
-		{
-			lcconf->retry_checkph1 = $2 * $3;
-		}
-		EOS
-	|	RETRY_PHASE2 NUMBER unittype_time
-		{
-			lcconf->wait_ph2complete = $2 * $3;
-		}
-		EOS
-	|	NATT_KA NUMBER unittype_time
-		{
-#ifdef ENABLE_NATT
-        		if (libipsec_opt & LIBIPSEC_OPT_NATT)
-				lcconf->natt_ka_interval = $2 * $3;
-			else
-                		yyerror("libipsec lacks NAT-T support");
-#else
-			yyerror("NAT-T support not compiled in.");
-#endif
-		}
-		EOS
-	;
-
-	/* sainfo */
-sainfo_statement
-	:	SAINFO
-		{
-			cur_sainfo = newsainfo();
-			if (cur_sainfo == NULL) {
-				yyerror("failed to allocate sainfo");
-				return -1;
-			}
-		}
-		sainfo_name sainfo_param BOC sainfo_specs
-		{
-			struct sainfo *check;
-
-			/* default */
-			if (cur_sainfo->algs[algclass_ipsec_enc] == 0) {
-				yyerror("no encryption algorithm at %s",
-					sainfo2str(cur_sainfo));
-				return -1;
-			}
-			if (cur_sainfo->algs[algclass_ipsec_auth] == 0) {
-				yyerror("no authentication algorithm at %s",
-					sainfo2str(cur_sainfo));
-				return -1;
-			}
-			if (cur_sainfo->algs[algclass_ipsec_comp] == 0) {
-				yyerror("no compression algorithm at %s",
-					sainfo2str(cur_sainfo));
-				return -1;
-			}
-
-			/* duplicate check */
-			check = getsainfo(cur_sainfo->idsrc,
-					  cur_sainfo->iddst,
-					  cur_sainfo->id_i,
-					  cur_sainfo->remoteid);
-			if (check && (!check->idsrc && !cur_sainfo->idsrc)) {
-				yyerror("duplicated sainfo: %s",
-					sainfo2str(cur_sainfo));
-				return -1;
-			}
-			inssainfo(cur_sainfo);
-		}
-		EOC
-	;
-sainfo_name
-	:	ANONYMOUS
-		{
-			cur_sainfo->idsrc = NULL;
-			cur_sainfo->iddst = NULL;
-		}
-	|	ANONYMOUS sainfo_id
-		{
-			cur_sainfo->idsrc = NULL;
-			cur_sainfo->iddst = $2;
-		}
-	|	sainfo_id ANONYMOUS
-		{
-			cur_sainfo->idsrc = $1;
-			cur_sainfo->iddst = NULL;
-		}
-	|	sainfo_id sainfo_id
-		{
-			cur_sainfo->idsrc = $1;
-			cur_sainfo->iddst = $2;
-		}
-	;
-sainfo_id
-	:	IDENTIFIERTYPE ADDRSTRING prefix port ul_proto
-		{
-			char portbuf[10];
-			struct sockaddr *saddr;
-
-			if (($5 == IPPROTO_ICMP || $5 == IPPROTO_ICMPV6)
-			 && ($4 != IPSEC_PORT_ANY || $4 != IPSEC_PORT_ANY)) {
-				yyerror("port number must be \"any\".");
-				return -1;
-			}
-
-			snprintf(portbuf, sizeof(portbuf), "%lu", $4);
-			saddr = str2saddr($2->v, portbuf);
-			vfree($2);
-			if (saddr == NULL)
-				return -1;
-
-			switch (saddr->sa_family) {
-			case AF_INET:
-				if ($5 == IPPROTO_ICMPV6) {
-					yyerror("upper layer protocol mismatched.\n");
-					racoon_free(saddr);
-					return -1;
-				}
-				$$ = ipsecdoi_sockaddr2id(saddr,
-										  $3 == ~0 ? (sizeof(struct in_addr) << 3): $3,
-										  $5);
-				break;
-#ifdef INET6
-			case AF_INET6:
-				if ($5 == IPPROTO_ICMP) {
-					yyerror("upper layer protocol mismatched.\n");
-					racoon_free(saddr);
-					return -1;
-				}
-				$$ = ipsecdoi_sockaddr2id(saddr, 
-										  $3 == ~0 ? (sizeof(struct in6_addr) << 3): $3,
-										  $5);
-				break;
-#endif
-			default:
-				yyerror("invalid family: %d", saddr->sa_family);
-				$$ = NULL;
-				break;
-			}
-			racoon_free(saddr);
-			if ($$ == NULL)
-				return -1;
-		}
-	|	IDENTIFIERTYPE ADDRSTRING ADDRRANGE prefix port ul_proto
-		{
-			char portbuf[10];
-			struct sockaddr *laddr = NULL, *haddr = NULL;
-			char *cur = NULL;
-
-			if (($6 == IPPROTO_ICMP || $6 == IPPROTO_ICMPV6)
-			 && ($5 != IPSEC_PORT_ANY || $5 != IPSEC_PORT_ANY)) {
-				yyerror("port number must be \"any\".");
-				return -1;
-			}
-
-			snprintf(portbuf, sizeof(portbuf), "%lu", $5);
-			
-			laddr = str2saddr($2->v, portbuf);
-			if (laddr == NULL) {
-			    return -1;
-			}
-			vfree($2);
-			haddr = str2saddr($3->v, portbuf);
-			if (haddr == NULL) {
-			    racoon_free(laddr);
-			    return -1;
-			}
-			vfree($3);
-
-			switch (laddr->sa_family) {
-			case AF_INET:
-				if ($6 == IPPROTO_ICMPV6) {
-				    yyerror("upper layer protocol mismatched.\n");
-				    if (laddr)
-					racoon_free(laddr);
-				    if (haddr)
-					racoon_free(haddr);
-				    return -1;
-				}
-                                $$ = ipsecdoi_sockrange2id(laddr, haddr, 
-							   $6);
-				break;
-#ifdef INET6
-			case AF_INET6:
-				if ($6 == IPPROTO_ICMP) {
-					yyerror("upper layer protocol mismatched.\n");
-					if (laddr)
-					    racoon_free(laddr);
-					if (haddr)
-					    racoon_free(haddr);
-					return -1;
-				}
-				$$ = ipsecdoi_sockrange2id(laddr, haddr, 
-							       $6);
-				break;
-#endif
-			default:
-				yyerror("invalid family: %d", laddr->sa_family);
-				$$ = NULL;
-				break;
-			}
-			if (laddr)
-			    racoon_free(laddr);
-			if (haddr)
-			    racoon_free(haddr);
-			if ($$ == NULL)
-				return -1;
-		}
-	|	IDENTIFIERTYPE QUOTEDSTRING
-		{
-			struct ipsecdoi_id_b *id_b;
-
-			if ($1 == IDTYPE_ASN1DN) {
-				yyerror("id type forbidden: %d", $1);
-				$$ = NULL;
-				return -1;
-			}
-
-			$2->l--;
-
-			$$ = vmalloc(sizeof(*id_b) + $2->l);
-			if ($$ == NULL) {
-				yyerror("failed to allocate identifier");
-				return -1;
-			}
-
-			id_b = (struct ipsecdoi_id_b *)$$->v;
-			id_b->type = idtype2doi($1);
-
-			id_b->proto_id = 0;
-			id_b->port = 0;
-
-			memcpy($$->v + sizeof(*id_b), $2->v, $2->l);
-		}
-	;
-sainfo_param
-	:	/* nothing */
-		{
-			cur_sainfo->id_i = NULL;
-		}
-	|	FROM IDENTIFIERTYPE identifierstring
-		{
-			struct ipsecdoi_id_b *id_b;
-			vchar_t *idv;
-
-			if (set_identifier(&idv, $2, $3) != 0) {
-				yyerror("failed to set identifer.\n");
-				return -1;
-			}
-			cur_sainfo->id_i = vmalloc(sizeof(*id_b) + idv->l);
-			if (cur_sainfo->id_i == NULL) {
-				yyerror("failed to allocate identifier");
-				return -1;
-			}
-
-			id_b = (struct ipsecdoi_id_b *)cur_sainfo->id_i->v;
-			id_b->type = idtype2doi($2);
-
-			id_b->proto_id = 0;
-			id_b->port = 0;
-
-			memcpy(cur_sainfo->id_i->v + sizeof(*id_b),
-			       idv->v, idv->l);
-			vfree(idv);
-		}
-	|	GROUP QUOTEDSTRING
-		{
-#ifdef ENABLE_HYBRID
-			if ((cur_sainfo->group = vdup($2)) == NULL) {
-				yyerror("failed to set sainfo xauth group.\n");
-				return -1;
-			}
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-			return -1;
-#endif
- 		}
-	;
-sainfo_specs
-	:	/* nothing */
-	|	sainfo_specs sainfo_spec
-	;
-sainfo_spec
-	:	PFS_GROUP dh_group_num
-		{
-			cur_sainfo->pfs_group = $2;
-		}
-		EOS
-	|	REMOTEID NUMBER
-		{
-			cur_sainfo->remoteid = $2;
-		}
-		EOS
-	|	LIFETIME LIFETYPE_TIME NUMBER unittype_time
-		{
-			cur_sainfo->lifetime = $3 * $4;
-		}
-		EOS
-	|	LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
-		{
-#if 1
-			yyerror("byte lifetime support is deprecated");
-			return -1;
-#else
-			cur_sainfo->lifebyte = fix_lifebyte($3 * $4);
-			if (cur_sainfo->lifebyte == 0)
-				return -1;
-#endif
-		}
-		EOS
-	|	ALGORITHM_CLASS {
-			cur_algclass = $1;
-		}
-		algorithms EOS
-	|	IDENTIFIER IDENTIFIERTYPE
-		{
-			yyerror("it's deprecated to specify a identifier in phase 2");
-		}
-		EOS
-	|	MY_IDENTIFIER IDENTIFIERTYPE QUOTEDSTRING
-		{
-			yyerror("it's deprecated to specify a identifier in phase 2");
-		}
-		EOS
-	;
-
-algorithms
-	:	algorithm
-		{
-			inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
-		}
-	|	algorithm
-		{
-			inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
-		}
-		COMMA algorithms
-	;
-algorithm
-	:	ALGORITHMTYPE keylength
-		{
-			int defklen;
-
-			$$ = newsainfoalg();
-			if ($$ == NULL) {
-				yyerror("failed to get algorithm allocation");
-				return -1;
-			}
-
-			$$->alg = algtype2doi(cur_algclass, $1);
-			if ($$->alg == -1) {
-				yyerror("algorithm mismatched");
-				racoon_free($$);
-				$$ = NULL;
-				return -1;
-			}
-
-			defklen = default_keylen(cur_algclass, $1);
-			if (defklen == 0) {
-				if ($2) {
-					yyerror("keylen not allowed");
-					racoon_free($$);
-					$$ = NULL;
-					return -1;
-				}
-			} else {
-				if ($2 && check_keylen(cur_algclass, $1, $2) < 0) {
-					yyerror("invalid keylen %d", $2);
-					racoon_free($$);
-					$$ = NULL;
-					return -1;
-				}
-			}
-
-			if ($2)
-				$$->encklen = $2;
-			else
-				$$->encklen = defklen;
-
-			/* check if it's supported algorithm by kernel */
-			if (!(cur_algclass == algclass_ipsec_auth && $1 == algtype_non_auth)
-			 && pk_checkalg(cur_algclass, $1, $$->encklen)) {
-				int a = algclass2doi(cur_algclass);
-				int b = algtype2doi(cur_algclass, $1);
-				if (a == IPSECDOI_ATTR_AUTH)
-					a = IPSECDOI_PROTO_IPSEC_AH;
-				yyerror("algorithm %s not supported by the kernel (missing module?)",
-					s_ipsecdoi_trns(a, b));
-				racoon_free($$);
-				$$ = NULL;
-				return -1;
-			}
-		}
-	;
-prefix
-	:	/* nothing */ { $$ = ~0; }
-	|	PREFIX { $$ = $1; }
-	;
-port
-	:	/* nothing */ { $$ = IPSEC_PORT_ANY; }
-	|	PORT { $$ = $1; }
-	|	PORTANY { $$ = IPSEC_PORT_ANY; }
-	;
-ul_proto
-	:	NUMBER { $$ = $1; }
-	|	UL_PROTO { $$ = $1; }
-	|	ANY { $$ = IPSEC_ULPROTO_ANY; }
-	;
-keylength
-	:	/* nothing */ { $$ = 0; }
-	|	NUMBER { $$ = $1; }
-	;
-
-	/* remote */
-remote_statement
-	:	REMOTE remote_index INHERIT remote_index
-		{
-			struct remoteconf *new;
-			struct proposalspec *prspec;
-
-			new = copyrmconf($4);
-			if (new == NULL) {
-				yyerror("failed to get remoteconf for %s.", saddr2str ($4));
-				return -1;
-			}
-
-			new->remote = $2;
-			new->inherited_from = getrmconf_strict($4, 1);
-			new->proposal = NULL;
-			new->prhead = NULL;
-			cur_rmconf = new;
-
-			prspec = newprspec();
-			if (prspec == NULL || !cur_rmconf->inherited_from 
-				|| !cur_rmconf->inherited_from->proposal)
-				return -1;
-			prspec->lifetime = cur_rmconf->inherited_from->proposal->lifetime;
-			prspec->lifebyte = cur_rmconf->inherited_from->proposal->lifebyte;
-			insprspec(prspec, &cur_rmconf->prhead);
-		}
-		remote_specs_block
-	|	REMOTE remote_index
-		{
-			struct remoteconf *new;
-			struct proposalspec *prspec;
-
-			new = newrmconf();
-			if (new == NULL) {
-				yyerror("failed to get new remoteconf.");
-				return -1;
-			}
-
-			new->remote = $2;
-			cur_rmconf = new;
-
-			prspec = newprspec();
-			if (prspec == NULL)
-				return -1;
-			prspec->lifetime = oakley_get_defaultlifetime();
-			insprspec(prspec, &cur_rmconf->prhead);
-		}
-		remote_specs_block
-	;
-
-remote_specs_block
-	:	BOC remote_specs EOC
-		{
-			/* check a exchange mode */
-			if (cur_rmconf->etypes == NULL) {
-				yyerror("no exchange mode specified.\n");
-				return -1;
-			}
-
-			if (cur_rmconf->idvtype == IDTYPE_UNDEFINED)
-				cur_rmconf->idvtype = IDTYPE_ADDRESS;
-
-
-			if (cur_rmconf->idvtype == IDTYPE_ASN1DN) {
-				if (cur_rmconf->mycertfile) {
-					if (cur_rmconf->idv)
-						yywarn("Both CERT and ASN1 ID "
-						       "are set. Hope this is OK.\n");
-					/* TODO: Preparse the DN here */
-				} else if (cur_rmconf->idv) {
-					/* OK, using asn1dn without X.509. */
-				} else {
-					yyerror("ASN1 ID not specified "
-						"and no CERT defined!\n");
-					return -1;
-				}
-			}
-			
-			if (cur_rmconf->prhead->spspec == NULL
-				&& cur_rmconf->inherited_from
-				&& cur_rmconf->inherited_from->prhead) {
-				cur_rmconf->prhead->spspec = cur_rmconf->inherited_from->prhead->spspec;
-			}
-			if (set_isakmp_proposal(cur_rmconf, cur_rmconf->prhead) != 0)
-				return -1;
-
-			/* DH group settting if aggressive mode is there. */
-			if (check_etypeok(cur_rmconf, ISAKMP_ETYPE_AGG) != NULL) {
-				struct isakmpsa *p;
-				int b = 0;
-
-				/* DH group */
-				for (p = cur_rmconf->proposal; p; p = p->next) {
-					if (b == 0 || (b && b == p->dh_group)) {
-						b = p->dh_group;
-						continue;
-					}
-					yyerror("DH group must be equal "
-						"in all proposals "
-						"when aggressive mode is "
-						"used.\n");
-					return -1;
-				}
-				cur_rmconf->dh_group = b;
-
-				if (cur_rmconf->dh_group == 0) {
-					yyerror("DH group must be set in the proposal.\n");
-					return -1;
-				}
-
-				/* DH group settting if PFS is required. */
-				if (oakley_setdhgroup(cur_rmconf->dh_group,
-						&cur_rmconf->dhgrp) < 0) {
-					yyerror("failed to set DH value.\n");
-					return -1;
-				}
-			}
-
-			insrmconf(cur_rmconf);
-		}
-	;
-remote_index
-	:	ANONYMOUS ike_port
-		{
-			$$ = newsaddr(sizeof(struct sockaddr));
-			$$->sa_family = AF_UNSPEC;
-			((struct sockaddr_in *)$$)->sin_port = htons($2);
-		}
-	|	ike_addrinfo_port
-		{
-			$$ = $1;
-			if ($$ == NULL) {
-				yyerror("failed to allocate sockaddr");
-				return -1;
-			}
-		}
-	;
-remote_specs
-	:	/* nothing */
-	|	remote_specs remote_spec
-	;
-remote_spec
-	:	EXCHANGE_MODE
-		{
-			cur_rmconf->etypes = NULL;
-		}
-		exchange_types EOS
-	|	DOI DOITYPE { cur_rmconf->doitype = $2; } EOS
-	|	SITUATION SITUATIONTYPE { cur_rmconf->sittype = $2; } EOS
-	|	CERTIFICATE_TYPE cert_spec
-	|	PEERS_CERTFILE QUOTEDSTRING
-		{
-			yywarn("This directive without certtype will be removed!\n");
-			yywarn("Please use 'peers_certfile x509 \"%s\";' instead\n", $2->v);
-			cur_rmconf->getcert_method = ISAKMP_GETCERT_LOCALFILE;
-
-			if (cur_rmconf->peerscertfile != NULL)
-				racoon_free(cur_rmconf->peerscertfile);
-			cur_rmconf->peerscertfile = racoon_strdup($2->v);
-			STRDUP_FATAL(cur_rmconf->peerscertfile);
-			vfree($2);
-		}
-		EOS
-	|	CA_TYPE CERT_X509 QUOTEDSTRING
-		{
-			cur_rmconf->cacerttype = $2;
-			cur_rmconf->getcacert_method = ISAKMP_GETCERT_LOCALFILE;
-			if (cur_rmconf->cacertfile != NULL)
-				racoon_free(cur_rmconf->cacertfile);
-			cur_rmconf->cacertfile = racoon_strdup($3->v);
-			STRDUP_FATAL(cur_rmconf->cacertfile);
-			vfree($3);
-		}
-		EOS
-	|	PEERS_CERTFILE CERT_X509 QUOTEDSTRING
-		{
-			cur_rmconf->getcert_method = ISAKMP_GETCERT_LOCALFILE;
-			if (cur_rmconf->peerscertfile != NULL)
-				racoon_free(cur_rmconf->peerscertfile);
-			cur_rmconf->peerscertfile = racoon_strdup($3->v);
-			STRDUP_FATAL(cur_rmconf->peerscertfile);
-			vfree($3);
-		}
-		EOS
-	|	PEERS_CERTFILE CERT_PLAINRSA QUOTEDSTRING
-		{
-			char path[MAXPATHLEN];
-			int ret = 0;
-
-			getpathname(path, sizeof(path),
-				LC_PATHTYPE_CERT, $3->v);
-			vfree($3);
-
-			if (cur_rmconf->getcert_method == ISAKMP_GETCERT_DNS) {
-				yyerror("Different peers_certfile method "
-					"already defined: %d!\n",
-					cur_rmconf->getcert_method);
-				return -1;
-			}
-			cur_rmconf->getcert_method = ISAKMP_GETCERT_LOCALFILE;
-			if (rsa_parse_file(cur_rmconf->rsa_public, path, RSA_TYPE_PUBLIC)) {
-				yyerror("Couldn't parse keyfile.\n", path);
-				return -1;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL, "Public PlainRSA keyfile parsed: %s\n", path);
-		}
-		EOS
-	|	PEERS_CERTFILE DNSSEC
-		{
-			if (cur_rmconf->getcert_method) {
-				yyerror("Different peers_certfile method already defined!\n");
-				return -1;
-			}
-			cur_rmconf->getcert_method = ISAKMP_GETCERT_DNS;
-			cur_rmconf->peerscertfile = NULL;
-		}
-		EOS
-	|	VERIFY_CERT SWITCH { cur_rmconf->verify_cert = $2; } EOS
-	|	SEND_CERT SWITCH { cur_rmconf->send_cert = $2; } EOS
-	|	SEND_CR SWITCH { cur_rmconf->send_cr = $2; } EOS
-	|	MY_IDENTIFIER IDENTIFIERTYPE identifierstring
-		{
-			if (set_identifier(&cur_rmconf->idv, $2, $3) != 0) {
-				yyerror("failed to set identifer.\n");
-				return -1;
-			}
-			cur_rmconf->idvtype = $2;
-		}
-		EOS
-	|	MY_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
-		{
-			if (set_identifier_qual(&cur_rmconf->idv, $2, $4, $3) != 0) {
-				yyerror("failed to set identifer.\n");
-				return -1;
-			}
-			cur_rmconf->idvtype = $2;
-		}
-		EOS
-	|	XAUTH_LOGIN identifierstring
-		{
-#ifdef ENABLE_HYBRID
-			/* formerly identifier type login */
-			if (xauth_rmconf_used(&cur_rmconf->xauth) == -1) {
-				yyerror("failed to allocate xauth state\n");
-				return -1;
-			}
-			if ((cur_rmconf->xauth->login = vdup($2)) == NULL) {
-				yyerror("failed to set identifer.\n");
-				return -1;
-			}
-#else
-			yyerror("racoon not configured with --enable-hybrid");
-#endif
-		}
-		EOS
-	|	PEERS_IDENTIFIER IDENTIFIERTYPE identifierstring
-		{
-			struct idspec  *id;
-			id = newidspec();
-			if (id == NULL) {
-				yyerror("failed to allocate idspec");
-				return -1;
-			}
-			if (set_identifier(&id->id, $2, $3) != 0) {
-				yyerror("failed to set identifer.\n");
-				racoon_free(id);
-				return -1;
-			}
-			id->idtype = $2;
-			genlist_append (cur_rmconf->idvl_p, id);
-		}
-		EOS
-	|	PEERS_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
-		{
-			struct idspec  *id;
-			id = newidspec();
-			if (id == NULL) {
-				yyerror("failed to allocate idspec");
-				return -1;
-			}
-			if (set_identifier_qual(&id->id, $2, $4, $3) != 0) {
-				yyerror("failed to set identifer.\n");
-				racoon_free(id);
-				return -1;
-			}
-			id->idtype = $2;
-			genlist_append (cur_rmconf->idvl_p, id);
-		}
-		EOS
-	|	VERIFY_IDENTIFIER SWITCH { cur_rmconf->verify_identifier = $2; } EOS
-	|	NONCE_SIZE NUMBER { cur_rmconf->nonce_size = $2; } EOS
-	|	DH_GROUP
-		{
-			yyerror("dh_group cannot be defined here.");
-			return -1;
-		}
-		dh_group_num EOS
-	|	PASSIVE SWITCH { cur_rmconf->passive = $2; } EOS
-	|	IKE_FRAG SWITCH { cur_rmconf->ike_frag = $2; } EOS
-	|	IKE_FRAG REMOTE_FORCE_LEVEL { cur_rmconf->ike_frag = ISAKMP_FRAG_FORCE; } EOS
-	|	ESP_FRAG NUMBER { 
-#ifdef SADB_X_EXT_NAT_T_FRAG
-        		if (libipsec_opt & LIBIPSEC_OPT_FRAG)
-				cur_rmconf->esp_frag = $2; 
-			else
-                		yywarn("libipsec lacks IKE frag support");
-#else
-			yywarn("Your kernel does not support esp_frag");
-#endif
-		} EOS
-	|	SCRIPT QUOTEDSTRING PHASE1_UP { 
-			if (cur_rmconf->script[SCRIPT_PHASE1_UP] != NULL)
-				vfree(cur_rmconf->script[SCRIPT_PHASE1_UP]);
-
-			cur_rmconf->script[SCRIPT_PHASE1_UP] = 
-			    script_path_add(vdup($2));
-		} EOS
-	|	SCRIPT QUOTEDSTRING PHASE1_DOWN { 
-			if (cur_rmconf->script[SCRIPT_PHASE1_DOWN] != NULL)
-				vfree(cur_rmconf->script[SCRIPT_PHASE1_DOWN]);
-
-			cur_rmconf->script[SCRIPT_PHASE1_DOWN] = 
-			    script_path_add(vdup($2));
-		} EOS
-	|	MODE_CFG SWITCH { cur_rmconf->mode_cfg = $2; } EOS
-	|	WEAK_PHASE1_CHECK SWITCH {
-			cur_rmconf->weak_phase1_check = $2;
-		} EOS
-	|	GENERATE_POLICY SWITCH { cur_rmconf->gen_policy = $2; } EOS
-	|	GENERATE_POLICY GENERATE_LEVEL { cur_rmconf->gen_policy = $2; } EOS
-	|	SUPPORT_PROXY SWITCH { cur_rmconf->support_proxy = $2; } EOS
-	|	INITIAL_CONTACT SWITCH { cur_rmconf->ini_contact = $2; } EOS
-	|	NAT_TRAVERSAL SWITCH
-		{
-#ifdef ENABLE_NATT
-        		if (libipsec_opt & LIBIPSEC_OPT_NATT)
-				cur_rmconf->nat_traversal = $2;
-			else
-                		yyerror("libipsec lacks NAT-T support");
-#else
-			yyerror("NAT-T support not compiled in.");
-#endif
-		} EOS
-	|	NAT_TRAVERSAL REMOTE_FORCE_LEVEL
-		{
-#ifdef ENABLE_NATT
-			if (libipsec_opt & LIBIPSEC_OPT_NATT)
-				cur_rmconf->nat_traversal = NATT_FORCE;
-			else
-                		yyerror("libipsec lacks NAT-T support");
-#else
-			yyerror("NAT-T support not compiled in.");
-#endif
-		} EOS
-	|	DPD SWITCH
-		{
-#ifdef ENABLE_DPD
-			cur_rmconf->dpd = $2;
-#else
-			yyerror("DPD support not compiled in.");
-#endif
-		} EOS
-	|	DPD_DELAY NUMBER
-		{
-#ifdef ENABLE_DPD
-			cur_rmconf->dpd_interval = $2;
-#else
-			yyerror("DPD support not compiled in.");
-#endif
-		}
-		EOS
-	|	DPD_RETRY NUMBER
-		{
-#ifdef ENABLE_DPD
-			cur_rmconf->dpd_retry = $2;
-#else
-			yyerror("DPD support not compiled in.");
-#endif
-		}
-		EOS
-	|	DPD_MAXFAIL NUMBER
-		{
-#ifdef ENABLE_DPD
-			cur_rmconf->dpd_maxfails = $2;
-#else
-			yyerror("DPD support not compiled in.");
-#endif
-		}
-		EOS
-	|	PH1ID NUMBER
-		{
-			cur_rmconf->ph1id = $2;
-		}
-		EOS
-	|	LIFETIME LIFETYPE_TIME NUMBER unittype_time
-		{
-			cur_rmconf->prhead->lifetime = $3 * $4;
-		}
-		EOS
-	|	PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL { cur_rmconf->pcheck_level = $2; } EOS
-	|	LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
-		{
-#if 1
-			yyerror("byte lifetime support is deprecated in Phase1");
-			return -1;
-#else
-			yywarn("the lifetime of bytes in phase 1 "
-				"will be ignored at the moment.");
-			cur_rmconf->prhead->lifebyte = fix_lifebyte($3 * $4);
-			if (cur_rmconf->prhead->lifebyte == 0)
-				return -1;
-#endif
-		}
-		EOS
-	|	PROPOSAL
-		{
-			struct secprotospec *spspec;
-
-			spspec = newspspec();
-			if (spspec == NULL)
-				return -1;
-			insspspec(spspec, &cur_rmconf->prhead);
-		}
-		BOC isakmpproposal_specs EOC
-	;
-exchange_types
-	:	/* nothing */
-	|	exchange_types EXCHANGETYPE
-		{
-			struct etypes *new;
-			new = racoon_malloc(sizeof(struct etypes));
-			if (new == NULL) {
-				yyerror("failed to allocate etypes");
-				return -1;
-			}
-			new->type = $2;
-			new->next = NULL;
-			if (cur_rmconf->etypes == NULL)
-				cur_rmconf->etypes = new;
-			else {
-				struct etypes *p;
-				for (p = cur_rmconf->etypes;
-				     p->next != NULL;
-				     p = p->next)
-					;
-				p->next = new;
-			}
-		}
-	;
-cert_spec
-	:	CERT_X509 QUOTEDSTRING QUOTEDSTRING
-		{
-			cur_rmconf->certtype = $1;
-			if (cur_rmconf->mycertfile != NULL)
-				racoon_free(cur_rmconf->mycertfile);
-			cur_rmconf->mycertfile = racoon_strdup($2->v);
-			STRDUP_FATAL(cur_rmconf->mycertfile);
-			vfree($2);
-			if (cur_rmconf->myprivfile != NULL)
-				racoon_free(cur_rmconf->myprivfile);
-			cur_rmconf->myprivfile = racoon_strdup($3->v);
-			STRDUP_FATAL(cur_rmconf->myprivfile);
-			vfree($3);
-		}
-		EOS
-	|	CERT_PLAINRSA QUOTEDSTRING
-		{
-			char path[MAXPATHLEN];
-			int ret = 0;
-
-			getpathname(path, sizeof(path),
-				LC_PATHTYPE_CERT, $2->v);
-			vfree($2);
-
-			cur_rmconf->certtype = $1;
-			cur_rmconf->send_cr = FALSE;
-			cur_rmconf->send_cert = FALSE;
-			cur_rmconf->verify_cert = FALSE;
-			if (rsa_parse_file(cur_rmconf->rsa_private, path, RSA_TYPE_PRIVATE)) {
-				yyerror("Couldn't parse keyfile.\n", path);
-				return -1;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL, "Private PlainRSA keyfile parsed: %s\n", path);
-		}
-		EOS
-	;
-dh_group_num
-	:	ALGORITHMTYPE
-		{
-			$$ = algtype2doi(algclass_isakmp_dh, $1);
-			if ($$ == -1) {
-				yyerror("must be DH group");
-				return -1;
-			}
-		}
-	|	NUMBER
-		{
-			if (ARRAYLEN(num2dhgroup) > $1 && num2dhgroup[$1] != 0) {
-				$$ = num2dhgroup[$1];
-			} else {
-				yyerror("must be DH group");
-				$$ = 0;
-				return -1;
-			}
-		}
-	;
-identifierstring
-	:	/* nothing */ { $$ = NULL; }
-	|	ADDRSTRING { $$ = $1; }
-	|	QUOTEDSTRING { $$ = $1; }
-	;
-isakmpproposal_specs
-	:	/* nothing */
-	|	isakmpproposal_specs isakmpproposal_spec
-	;
-isakmpproposal_spec
-	:	STRENGTH
-		{
-			yyerror("strength directive is obsoleted.");
-		} STRENGTHTYPE EOS
-	|	LIFETIME LIFETYPE_TIME NUMBER unittype_time
-		{
-			cur_rmconf->prhead->spspec->lifetime = $3 * $4;
-		}
-		EOS
-	|	LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
-		{
-#if 1
-			yyerror("byte lifetime support is deprecated");
-			return -1;
-#else
-			cur_rmconf->prhead->spspec->lifebyte = fix_lifebyte($3 * $4);
-			if (cur_rmconf->prhead->spspec->lifebyte == 0)
-				return -1;
-#endif
-		}
-		EOS
-	|	DH_GROUP dh_group_num
-		{
-			cur_rmconf->prhead->spspec->algclass[algclass_isakmp_dh] = $2;
-		}
-		EOS
-	|	GSS_ID QUOTEDSTRING
-		{
-			if (cur_rmconf->prhead->spspec->vendorid != VENDORID_GSSAPI) {
-				yyerror("wrong Vendor ID for gssapi_id");
-				return -1;
-			}
-			if (cur_rmconf->prhead->spspec->gssid != NULL)
-				racoon_free(cur_rmconf->prhead->spspec->gssid);
-			cur_rmconf->prhead->spspec->gssid = 
-			    racoon_strdup($2->v);
-			STRDUP_FATAL(cur_rmconf->prhead->spspec->gssid);
-		}
-		EOS
-	|	ALGORITHM_CLASS ALGORITHMTYPE keylength
-		{
-			int doi;
-			int defklen;
-
-			doi = algtype2doi($1, $2);
-			if (doi == -1) {
-				yyerror("algorithm mismatched 1");
-				return -1;
-			}
-
-			switch ($1) {
-			case algclass_isakmp_enc:
-			/* reject suppressed algorithms */
-#ifndef HAVE_OPENSSL_RC5_H
-				if ($2 == algtype_rc5) {
-					yyerror("algorithm %s not supported",
-					    s_attr_isakmp_enc(doi));
-					return -1;
-				}
-#endif
-#ifndef HAVE_OPENSSL_IDEA_H
-				if ($2 == algtype_idea) {
-					yyerror("algorithm %s not supported",
-					    s_attr_isakmp_enc(doi));
-					return -1;
-				}
-#endif
-
-				cur_rmconf->prhead->spspec->algclass[algclass_isakmp_enc] = doi;
-				defklen = default_keylen($1, $2);
-				if (defklen == 0) {
-					if ($3) {
-						yyerror("keylen not allowed");
-						return -1;
-					}
-				} else {
-					if ($3 && check_keylen($1, $2, $3) < 0) {
-						yyerror("invalid keylen %d", $3);
-						return -1;
-					}
-				}
-				if ($3)
-					cur_rmconf->prhead->spspec->encklen = $3;
-				else
-					cur_rmconf->prhead->spspec->encklen = defklen;
-				break;
-			case algclass_isakmp_hash:
-				cur_rmconf->prhead->spspec->algclass[algclass_isakmp_hash] = doi;
-				break;
-			case algclass_isakmp_ameth:
-				cur_rmconf->prhead->spspec->algclass[algclass_isakmp_ameth] = doi;
-				/*
-				 * We may have to set the Vendor ID for the
-				 * authentication method we're using.
-				 */
-				switch ($2) {
-				case algtype_gssapikrb:
-					if (cur_rmconf->prhead->spspec->vendorid !=
-					    VENDORID_UNKNOWN) {
-						yyerror("Vendor ID mismatch "
-						    "for auth method");
-						return -1;
-					}
-					/*
-					 * For interoperability with Win2k,
-					 * we set the Vendor ID to "GSSAPI".
-					 */
-					cur_rmconf->prhead->spspec->vendorid =
-					    VENDORID_GSSAPI;
-					break;
-				case algtype_rsasig:
-					if (cur_rmconf->certtype == ISAKMP_CERT_PLAINRSA) {
-						if (rsa_list_count(cur_rmconf->rsa_private) == 0) {
-							yyerror ("Private PlainRSA key not set. "
-								"Use directive 'certificate_type plainrsa ...'\n");
-							return -1;
-						}
-						if (rsa_list_count(cur_rmconf->rsa_public) == 0) {
-							yyerror ("Public PlainRSA keys not set. "
-								"Use directive 'peers_certfile plainrsa ...'\n");
-							return -1;
-						}
-					}
-					break;
-				default:
-					break;
-				}
-				break;
-			default:
-				yyerror("algorithm mismatched 2");
-				return -1;
-			}
-		}
-		EOS
-	;
-
-unittype_time
-	:	UNITTYPE_SEC	{ $$ = 1; }
-	|	UNITTYPE_MIN	{ $$ = 60; }
-	|	UNITTYPE_HOUR	{ $$ = (60 * 60); }
-	;
-unittype_byte
-	:	UNITTYPE_BYTE	{ $$ = 1; }
-	|	UNITTYPE_KBYTES	{ $$ = 1024; }
-	|	UNITTYPE_MBYTES	{ $$ = (1024 * 1024); }
-	|	UNITTYPE_TBYTES	{ $$ = (1024 * 1024 * 1024); }
-	;
-%%
-
-static struct proposalspec *
-newprspec()
-{
-	struct proposalspec *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		yyerror("failed to allocate proposal");
-
-	return new;
-}
-
-/*
- * insert into head of list.
- */
-static void
-insprspec(prspec, head)
-	struct proposalspec *prspec;
-	struct proposalspec **head;
-{
-	if (*head != NULL)
-		(*head)->prev = prspec;
-	prspec->next = *head;
-	*head = prspec;
-}
-
-static struct secprotospec *
-newspspec()
-{
-	struct secprotospec *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL) {
-		yyerror("failed to allocate spproto");
-		return NULL;
-	}
-
-	new->encklen = 0;	/*XXX*/
-
-	/*
-	 * Default to "uknown" vendor -- we will override this
-	 * as necessary.  When we send a Vendor ID payload, an
-	 * "unknown" will be translated to a KAME/racoon ID.
-	 */
-	new->vendorid = VENDORID_UNKNOWN;
-
-	return new;
-}
-
-/*
- * insert into head of list.
- */
-static void
-insspspec(spspec, head)
-	struct secprotospec *spspec;
-	struct proposalspec **head;
-{
-	spspec->back = *head;
-
-	if ((*head)->spspec != NULL)
-		(*head)->spspec->prev = spspec;
-	spspec->next = (*head)->spspec;
-	(*head)->spspec = spspec;
-}
-
-/* set final acceptable proposal */
-static int
-set_isakmp_proposal(rmconf, prspec)
-	struct remoteconf *rmconf;
-	struct proposalspec *prspec;
-{
-	struct proposalspec *p;
-	struct secprotospec *s;
-	int prop_no = 1; 
-	int trns_no = 1;
-	int32_t types[MAXALGCLASS];
-
-	p = prspec;
-	if (p->next != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"multiple proposal definition.\n");
-		return -1;
-	}
-
-	/* mandatory check */
-	if (p->spspec == NULL) {
-		yyerror("no remote specification found: %s.\n",
-			saddr2str(rmconf->remote));
-		return -1;
-	}
-	for (s = p->spspec; s != NULL; s = s->next) {
-		/* XXX need more to check */
-		if (s->algclass[algclass_isakmp_enc] == 0) {
-			yyerror("encryption algorithm required.");
-			return -1;
-		}
-		if (s->algclass[algclass_isakmp_hash] == 0) {
-			yyerror("hash algorithm required.");
-			return -1;
-		}
-		if (s->algclass[algclass_isakmp_dh] == 0) {
-			yyerror("DH group required.");
-			return -1;
-		}
-		if (s->algclass[algclass_isakmp_ameth] == 0) {
-			yyerror("authentication method required.");
-			return -1;
-		}
-	}
-
-	/* skip to last part */
-	for (s = p->spspec; s->next != NULL; s = s->next)
-		;
-
-	while (s != NULL) {
-		plog(LLV_DEBUG2, LOCATION, NULL,
-			"lifetime = %ld\n", (long)
-			(s->lifetime ? s->lifetime : p->lifetime));
-		plog(LLV_DEBUG2, LOCATION, NULL,
-			"lifebyte = %d\n",
-			s->lifebyte ? s->lifebyte : p->lifebyte);
-		plog(LLV_DEBUG2, LOCATION, NULL,
-			"encklen=%d\n", s->encklen);
-
-		memset(types, 0, ARRAYLEN(types));
-		types[algclass_isakmp_enc] = s->algclass[algclass_isakmp_enc];
-		types[algclass_isakmp_hash] = s->algclass[algclass_isakmp_hash];
-		types[algclass_isakmp_dh] = s->algclass[algclass_isakmp_dh];
-		types[algclass_isakmp_ameth] =
-		    s->algclass[algclass_isakmp_ameth];
-
-		/* expanding spspec */
-		clean_tmpalgtype();
-		trns_no = expand_isakmpspec(prop_no, trns_no, types,
-				algclass_isakmp_enc, algclass_isakmp_ameth + 1,
-				s->lifetime ? s->lifetime : p->lifetime,
-				s->lifebyte ? s->lifebyte : p->lifebyte,
-				s->encklen, s->vendorid, s->gssid,
-				rmconf);
-		if (trns_no == -1) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to expand isakmp proposal.\n");
-			return -1;
-		}
-
-		s = s->prev;
-	}
-
-	if (rmconf->proposal == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no proposal found.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static void
-clean_tmpalgtype()
-{
-	int i;
-	for (i = 0; i < MAXALGCLASS; i++)
-		tmpalgtype[i] = 0;	/* means algorithm undefined. */
-}
-
-static int
-expand_isakmpspec(prop_no, trns_no, types,
-		class, last, lifetime, lifebyte, encklen, vendorid, gssid,
-		rmconf)
-	int prop_no, trns_no;
-	int *types, class, last;
-	time_t lifetime;
-	int lifebyte;
-	int encklen;
-	int vendorid;
-	char *gssid;
-	struct remoteconf *rmconf;
-{
-	struct isakmpsa *new;
-
-	/* debugging */
-    {
-	int j;
-	char tb[10];
-	plog(LLV_DEBUG2, LOCATION, NULL,
-		"p:%d t:%d\n", prop_no, trns_no);
-	for (j = class; j < MAXALGCLASS; j++) {
-		snprintf(tb, sizeof(tb), "%d", types[j]);
-		plog(LLV_DEBUG2, LOCATION, NULL,
-			"%s%s%s%s\n",
-			s_algtype(j, types[j]),
-			types[j] ? "(" : "",
-			tb[0] == '0' ? "" : tb,
-			types[j] ? ")" : "");
-	}
-	plog(LLV_DEBUG2, LOCATION, NULL, "\n");
-    }
-
-#define TMPALGTYPE2STR(n) \
-	s_algtype(algclass_isakmp_##n, types[algclass_isakmp_##n])
-		/* check mandatory values */
-		if (types[algclass_isakmp_enc] == 0
-		 || types[algclass_isakmp_ameth] == 0
-		 || types[algclass_isakmp_hash] == 0
-		 || types[algclass_isakmp_dh] == 0) {
-			yyerror("few definition of algorithm "
-				"enc=%s ameth=%s hash=%s dhgroup=%s.\n",
-				TMPALGTYPE2STR(enc),
-				TMPALGTYPE2STR(ameth),
-				TMPALGTYPE2STR(hash),
-				TMPALGTYPE2STR(dh));
-			return -1;
-		}
-#undef TMPALGTYPE2STR
-
-	/* set new sa */
-	new = newisakmpsa();
-	if (new == NULL) {
-		yyerror("failed to allocate isakmp sa");
-		return -1;
-	}
-	new->prop_no = prop_no;
-	new->trns_no = trns_no++;
-	new->lifetime = lifetime;
-	new->lifebyte = lifebyte;
-	new->enctype = types[algclass_isakmp_enc];
-	new->encklen = encklen;
-	new->authmethod = types[algclass_isakmp_ameth];
-	new->hashtype = types[algclass_isakmp_hash];
-	new->dh_group = types[algclass_isakmp_dh];
-	new->vendorid = vendorid;
-#ifdef HAVE_GSSAPI
-	if (new->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
-		if (gssid != NULL) {
-			if ((new->gssid = vmalloc(strlen(gssid))) == NULL) {
-				racoon_free(new);
-				yyerror("failed to allocate gssid");
-				return -1;
-			}
-			memcpy(new->gssid->v, gssid, new->gssid->l);
-			racoon_free(gssid);
-#ifdef ENABLE_HYBRID
-		} else if (rmconf->xauth == NULL) {
-#else
-		} else {
-#endif
-			/*
-			 * Allocate the default ID so that it gets put
-			 * into a GSS ID attribute during the Phase 1
-			 * exchange.
-			 */
-			new->gssid = gssapi_get_default_gss_id();
-		}
-	}
-#endif
-	insisakmpsa(new, rmconf);
-
-	return trns_no;
-}
-
-static int
-listen_addr (struct sockaddr *addr, int udp_encap)
-{
-	struct myaddrs *p;
-
-	p = newmyaddr();
-	if (p == NULL) {
-		yyerror("failed to allocate myaddrs");
-		return -1;
-	}
-	p->addr = addr;
-	if (p->addr == NULL) {
-		yyerror("failed to copy sockaddr ");
-		delmyaddr(p);
-		return -1;
-	}
-	p->udp_encap = udp_encap;
-
-	insmyaddr(p, &lcconf->myaddrs);
-
-	lcconf->autograbaddr = 0;
-	return 0;
-}
-
-#if 0
-/*
- * fix lifebyte.
- * Must be more than 1024B because its unit is kilobytes.
- * That is defined RFC2407.
- */
-static int
-fix_lifebyte(t)
-	unsigned long t;
-{
-	if (t < 1024) {
-		yyerror("byte size should be more than 1024B.");
-		return 0;
-	}
-
-	return(t / 1024);
-}
-#endif
-
-int
-cfparse()
-{
-	int error;
-
-	yycf_init_buffer();
-
-	if (yycf_switch_buffer(lcconf->racoon_conf) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "could not read configuration file \"%s\"\n", 
-		    lcconf->racoon_conf);
-		return -1;
-	}
-
-	error = yyparse();
-	if (error != 0) {
-		if (yyerrorcount) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"fatal parse failure (%d errors)\n",
-				yyerrorcount);
-		} else {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"fatal parse failure.\n");
-		}
-		return -1;
-	}
-
-	if (error == 0 && yyerrorcount) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"parse error is nothing, but yyerrorcount is %d.\n",
-				yyerrorcount);
-		exit(1);
-	}
-
-	yycf_clean_buffer();
-
-	plog(LLV_DEBUG2, LOCATION, NULL, "parse successed.\n");
-
-	return 0;
-}
-
-int
-cfreparse()
-{
-	flushph2();
-	flushph1();
-	flushrmconf();
-	flushsainfo();
-	clean_tmpalgtype();
-	return(cfparse());
-}
-
-#ifdef ENABLE_ADMINPORT
-static void
-adminsock_conf(path, owner, group, mode_dec)
-	vchar_t *path;
-	vchar_t *owner;
-	vchar_t *group;
-	int mode_dec;
-{
-	struct passwd *pw = NULL;
-	struct group *gr = NULL;
-	mode_t mode = 0;
-	uid_t uid;
-	gid_t gid;
-	int isnum;
-
-	adminsock_path = path->v;
-
-	if (owner == NULL)
-		return;
-
-	errno = 0;
-	uid = atoi(owner->v);
-	isnum = !errno;
-	if (((pw = getpwnam(owner->v)) == NULL) && !isnum)
-		yyerror("User \"%s\" does not exist", owner->v);
-
-	if (pw)
-		adminsock_owner = pw->pw_uid;
-	else
-		adminsock_owner = uid;
-
-	if (group == NULL)
-		return;
-
-	errno = 0;
-	gid = atoi(group->v);
-	isnum = !errno;
-	if (((gr = getgrnam(group->v)) == NULL) && !isnum)
-		yyerror("Group \"%s\" does not exist", group->v);
-
-	if (gr)
-		adminsock_group = gr->gr_gid;
-	else
-		adminsock_group = gid;
-
-	if (mode_dec == -1)
-		return;
-
-	if (mode_dec > 777)
-		yyerror("Mode 0%03o is invalid", mode_dec);
-	if (mode_dec >= 400) { mode += 0400; mode_dec -= 400; }
-	if (mode_dec >= 200) { mode += 0200; mode_dec -= 200; }
-	if (mode_dec >= 100) { mode += 0200; mode_dec -= 100; }
-
-	if (mode_dec > 77)
-		yyerror("Mode 0%03o is invalid", mode_dec);
-	if (mode_dec >= 40) { mode += 040; mode_dec -= 40; }
-	if (mode_dec >= 20) { mode += 020; mode_dec -= 20; }
-	if (mode_dec >= 10) { mode += 020; mode_dec -= 10; }
-
-	if (mode_dec > 7)
-		yyerror("Mode 0%03o is invalid", mode_dec);
-	if (mode_dec >= 4) { mode += 04; mode_dec -= 4; }
-	if (mode_dec >= 2) { mode += 02; mode_dec -= 2; }
-	if (mode_dec >= 1) { mode += 02; mode_dec -= 1; }
-	
-	adminsock_mode = mode;
-
-	return;
-}
-#endif
diff --git a/src/racoon/cfparse_proto.h b/src/racoon/cfparse_proto.h
deleted file mode 100644
index 139520c..0000000
--- a/src/racoon/cfparse_proto.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*	$NetBSD: cfparse_proto.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: cfparse_proto.h,v 1.3 2004/06/11 16:00:15 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _CFPARSE_PROTO_H
-#define _CFPARSE_PROTO_H
-
-/* cfparse.y */
-extern int yyparse __P((void));
-extern int cfparse __P((void));
-extern int cfreparse __P((void));
-
-#endif /* _CFPARSE_PROTO_H */
diff --git a/src/racoon/cftoken.l b/src/racoon/cftoken.l
deleted file mode 100644
index 9950d49..0000000
--- a/src/racoon/cftoken.l
+++ /dev/null
@@ -1,795 +0,0 @@
-/*	$NetBSD: cftoken.l,v 1.11.4.2 2007/09/03 18:07:29 mgrooms Exp $	*/
-
-/* Id: cftoken.l,v 1.53 2006/08/22 18:17:17 manubsd Exp */
-
-%{
-/*
- * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 and 2003 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <ctype.h>
-#include <glob.h>
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "algorithm.h"
-#include "cfparse_proto.h"
-#include "cftoken_proto.h"
-#include "localconf.h"
-#include "oakley.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "policy.h"
-#include "proposal.h"
-#include "remoteconf.h"
-#ifdef GC
-#include "gcmalloc.h"
-#endif
-
-#include "cfparse.h"
-
-int yyerrorcount = 0;
-
-#if defined(YIPS_DEBUG)
-#  define YYDB plog(LLV_DEBUG2, LOCATION, NULL,                                \
-		"begin <%d>%s\n", yy_start, yytext);
-#  define YYD {                                                                \
-	plog(LLV_DEBUG2, LOCATION, NULL, "<%d>%s",                             \
-	    yy_start, loglevel >= LLV_DEBUG2 ? "\n" : "");                     \
-}
-#else
-#  define YYDB
-#  define YYD
-#endif /* defined(YIPS_DEBUG) */
-
-#define MAX_INCLUDE_DEPTH 10
-
-static struct include_stack {
-	char *path;
-	FILE *fp;
-	YY_BUFFER_STATE prevstate;
-	int lineno;
-	glob_t matches;
-	int matchon;
-} incstack[MAX_INCLUDE_DEPTH];
-static int incstackp = 0;
-
-static int yy_first_time = 1;
-%}
-
-/* common seciton */
-nl		\n
-ws		[ \t]+
-digit		[0-9]
-letter		[A-Za-z]
-hexdigit	[0-9A-Fa-f]
-/*octet		(([01]?{digit}?{digit})|((2([0-4]{digit}))|(25[0-5]))) */
-special		[()+\|\?\*]
-comma		\,
-dot		\.
-slash		\/
-bcl		\{
-ecl		\}
-blcl		\[
-elcl		\]
-hyphen          \-
-percent		\%
-semi		\;
-comment		\#.*
-ccomment	"/*"
-bracketstring	\<[^>]*\>
-quotedstring	\"[^"]*\"
-addrstring	[a-fA-F0-9:]([a-fA-F0-9:\.]*|[a-fA-F0-9:\.]*%[a-zA-Z0-9]*)
-decstring	{digit}+
-hexstring	0x{hexdigit}+
-
-%s S_INI S_PRIV S_PTH S_INF S_LOG S_PAD S_LST S_RTRY S_CFG S_LDAP
-%s S_ALGST S_ALGCL
-%s S_SAINF S_SAINFS
-%s S_RMT S_RMTS S_RMTP
-%s S_SA
-%s S_GSSENC
-
-%%
-%{
-	if (yy_first_time) {
-		BEGIN S_INI;
-		yy_first_time = 0;
-	}
-%}
-
-	/* privsep */
-<S_INI>privsep		{ BEGIN S_PRIV; YYDB; return(PRIVSEP); }
-<S_PRIV>{bcl}		{ return(BOC); }
-<S_PRIV>user		{ YYD; return(USER); }
-<S_PRIV>group		{ YYD; return(GROUP); }
-<S_PRIV>chroot		{ YYD; return(CHROOT); }
-<S_PRIV>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* path */
-<S_INI>path		{ BEGIN S_PTH; YYDB; return(PATH); }
-<S_PTH>include		{ YYD; yylval.num = LC_PATHTYPE_INCLUDE;
-				return(PATHTYPE); }
-<S_PTH>pre_shared_key	{ YYD; yylval.num = LC_PATHTYPE_PSK;
-				return(PATHTYPE); }
-<S_PTH>certificate	{ YYD; yylval.num = LC_PATHTYPE_CERT;
-				return(PATHTYPE); }
-<S_PTH>script		{ YYD; yylval.num = LC_PATHTYPE_SCRIPT;
-				return(PATHTYPE); }
-<S_PTH>backupsa		{ YYD; yylval.num = LC_PATHTYPE_BACKUPSA;
-				return(PATHTYPE); }
-<S_PTH>pidfile		{ YYD; yylval.num = LC_PATHTYPE_PIDFILE;
-				return(PATHTYPE); }
-<S_PTH>{semi}		{ BEGIN S_INI; YYDB; return(EOS); }
-
-	/* include */
-<S_INI>include		{ YYDB; return(INCLUDE); }
-
-	/* self information */
-<S_INI>identifier	{ BEGIN S_INF; YYDB; yywarn("it is obsoleted.  use \"my_identifier\" in each remote directives."); return(IDENTIFIER); }
-<S_INF>{semi}		{ BEGIN S_INI; return(EOS); }
-
-	/* special */
-<S_INI>complex_bundle	{ YYDB; return(COMPLEX_BUNDLE); }
-
-	/* logging */
-<S_INI>log		{ BEGIN S_LOG; YYDB; return(LOGGING); }
-<S_LOG>error		{ YYD; yylval.num = LLV_ERROR; return(LOGLEV); }
-<S_LOG>warning		{ YYD; yylval.num = LLV_WARNING; return(LOGLEV); }
-<S_LOG>notify		{ YYD; yylval.num = LLV_NOTIFY; return(LOGLEV); }
-<S_LOG>info		{ YYD; yylval.num = LLV_INFO; return(LOGLEV); }
-<S_LOG>debug		{ YYD; yylval.num = LLV_DEBUG; return(LOGLEV); }
-<S_LOG>debug2		{ YYD; yylval.num = LLV_DEBUG2; return(LOGLEV); }
-<S_LOG>debug3		{ YYD; yywarn("it is obsoleted.  use \"debug2\""); yylval.num = LLV_DEBUG2; return(LOGLEV); }
-<S_LOG>debug4		{ YYD; yywarn("it is obsoleted.  use \"debug2\""); yylval.num = LLV_DEBUG2; return(LOGLEV); }
-<S_LOG>{semi}		{ BEGIN S_INI; return(EOS); }
-
-	/* padding */
-<S_INI>padding		{ BEGIN S_PAD; YYDB; return(PADDING); }
-<S_PAD>{bcl}		{ return(BOC); }
-<S_PAD>randomize	{ YYD; return(PAD_RANDOMIZE); }
-<S_PAD>randomize_length	{ YYD; return(PAD_RANDOMIZELEN); }
-<S_PAD>maximum_length	{ YYD; return(PAD_MAXLEN); }
-<S_PAD>strict_check	{ YYD; return(PAD_STRICT); }
-<S_PAD>exclusive_tail	{ YYD; return(PAD_EXCLTAIL); }
-<S_PAD>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* listen */
-<S_INI>listen		{ BEGIN S_LST; YYDB; return(LISTEN); }
-<S_LST>{bcl}		{ return(BOC); }
-<S_LST>isakmp		{ YYD; return(X_ISAKMP); }
-<S_LST>isakmp_natt	{ YYD; return(X_ISAKMP_NATT); }
-<S_LST>admin		{ YYD; return(X_ADMIN); }
-<S_LST>adminsock	{ YYD; return(ADMINSOCK); }
-<S_LST>disabled		{ YYD; return(DISABLED); }
-<S_LST>strict_address	{ YYD; return(STRICT_ADDRESS); }
-<S_LST>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* ldap config */
-<S_INI>ldapcfg		{ BEGIN S_LDAP; YYDB; return(LDAPCFG); }
-<S_LDAP>{bcl}		{ return(BOC); }
-<S_LDAP>version		{ YYD; return(LDAP_PVER); }
-<S_LDAP>host		{ YYD; return(LDAP_HOST); }
-<S_LDAP>port		{ YYD; return(LDAP_PORT); }
-<S_LDAP>base		{ YYD; return(LDAP_BASE); }
-<S_LDAP>subtree		{ YYD; return(LDAP_SUBTREE); }
-<S_LDAP>bind_dn		{ YYD; return(LDAP_BIND_DN); }
-<S_LDAP>bind_pw		{ YYD; return(LDAP_BIND_PW); }
-<S_LDAP>attr_user	{ YYD; return(LDAP_ATTR_USER); }
-<S_LDAP>attr_addr	{ YYD; return(LDAP_ATTR_ADDR); }
-<S_LDAP>attr_mask	{ YYD; return(LDAP_ATTR_MASK); }
-<S_LDAP>attr_group	{ YYD; return(LDAP_ATTR_GROUP); }
-<S_LDAP>attr_member	{ YYD; return(LDAP_ATTR_MEMBER); }
-<S_LDAP>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* mode_cfg */
-<S_INI>mode_cfg		{ BEGIN S_CFG; YYDB; return(MODECFG); }
-<S_CFG>{bcl}		{ return(BOC); }
-<S_CFG>network4		{ YYD; return(CFG_NET4); }
-<S_CFG>netmask4		{ YYD; return(CFG_MASK4); }
-<S_CFG>dns4		{ YYD; return(CFG_DNS4); }
-<S_CFG>nbns4		{ YYD; return(CFG_NBNS4); }
-<S_CFG>wins4		{ YYD; return(CFG_NBNS4); }
-<S_CFG>default_domain	{ YYD; return(CFG_DEFAULT_DOMAIN); }
-<S_CFG>auth_source	{ YYD; return(CFG_AUTH_SOURCE); }
-<S_CFG>auth_groups	{ YYD; return(CFG_AUTH_GROUPS); }
-<S_CFG>group_source	{ YYD; return(CFG_GROUP_SOURCE); }
-<S_CFG>conf_source	{ YYD; return(CFG_CONF_SOURCE); }
-<S_CFG>accounting	{ YYD; return(CFG_ACCOUNTING); }
-<S_CFG>system		{ YYD; return(CFG_SYSTEM); }
-<S_CFG>local		{ YYD; return(CFG_LOCAL); }
-<S_CFG>none		{ YYD; return(CFG_NONE); }
-<S_CFG>radius		{ YYD; return(CFG_RADIUS); }
-<S_CFG>pam		{ YYD; return(CFG_PAM); }
-<S_CFG>ldap		{ YYD; return(CFG_LDAP); }
-<S_CFG>pool_size	{ YYD; return(CFG_POOL_SIZE); }
-<S_CFG>banner		{ YYD; return(CFG_MOTD); }
-<S_CFG>auth_throttle	{ YYD; return(CFG_AUTH_THROTTLE); }
-<S_CFG>split_network	{ YYD; return(CFG_SPLIT_NETWORK); }
-<S_CFG>local_lan	{ YYD; return(CFG_SPLIT_LOCAL); }
-<S_CFG>include		{ YYD; return(CFG_SPLIT_INCLUDE); }
-<S_CFG>split_dns	{ YYD; return(CFG_SPLIT_DNS); }
-<S_CFG>pfs_group	{ YYD; return(CFG_PFS_GROUP); }
-<S_CFG>save_passwd	{ YYD; return(CFG_SAVE_PASSWD); }
-<S_CFG>{comma}		{ YYD; return(COMMA); }
-<S_CFG>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* timer */
-<S_INI>timer		{ BEGIN S_RTRY; YYDB; return(RETRY); }
-<S_RTRY>{bcl}		{ return(BOC); }
-<S_RTRY>counter		{ YYD; return(RETRY_COUNTER); }
-<S_RTRY>interval	{ YYD; return(RETRY_INTERVAL); }
-<S_RTRY>persend		{ YYD; return(RETRY_PERSEND); }
-<S_RTRY>phase1		{ YYD; return(RETRY_PHASE1); }
-<S_RTRY>phase2		{ YYD; return(RETRY_PHASE2); }
-<S_RTRY>natt_keepalive	{ YYD; return(NATT_KA); }
-<S_RTRY>{ecl}		{ BEGIN S_INI; return(EOC); }
-
-	/* sainfo */
-<S_INI>sainfo		{ BEGIN S_SAINF; YYDB; return(SAINFO); }
-<S_SAINF>anonymous	{ YYD; return(ANONYMOUS); }
-<S_SAINF>{blcl}any{elcl}	{ YYD; return(PORTANY); }
-<S_SAINF>any		{ YYD; return(ANY); }
-<S_SAINF>from		{ YYD; return(FROM); }
-<S_SAINF>group		{ YYD; return(GROUP); }
-	/* sainfo spec */
-<S_SAINF>{bcl}		{ BEGIN S_SAINFS; return(BOC); }
-<S_SAINF>{semi}		{ BEGIN S_INI; return(EOS); }
-<S_SAINFS>{ecl}		{ BEGIN S_INI; return(EOC); }
-<S_SAINFS>pfs_group	{ YYD; return(PFS_GROUP); }
-<S_SAINFS>remoteid	{ YYD; return(REMOTEID); }
-<S_SAINFS>identifier	{ YYD; yywarn("it is obsoleted.  use \"my_identifier\"."); return(IDENTIFIER); }
-<S_SAINFS>my_identifier	{ YYD; return(MY_IDENTIFIER); }
-<S_SAINFS>lifetime	{ YYD; return(LIFETIME); }
-<S_SAINFS>time		{ YYD; return(LIFETYPE_TIME); }
-<S_SAINFS>byte		{ YYD; return(LIFETYPE_BYTE); }
-<S_SAINFS>encryption_algorithm { YYD; yylval.num = algclass_ipsec_enc; return(ALGORITHM_CLASS); }
-<S_SAINFS>authentication_algorithm { YYD; yylval.num = algclass_ipsec_auth; return(ALGORITHM_CLASS); }
-<S_SAINFS>compression_algorithm	{ YYD; yylval.num = algclass_ipsec_comp; return(ALGORITHM_CLASS); }
-<S_SAINFS>{comma}	{ YYD; return(COMMA); }
-
-	/* remote */
-<S_INI>remote		{ BEGIN S_RMT; YYDB; return(REMOTE); }
-<S_RMT>anonymous	{ YYD; return(ANONYMOUS); }
-<S_RMT>inherit		{ YYD; return(INHERIT); }
-	/* remote spec */
-<S_RMT>{bcl}		{ BEGIN S_RMTS; return(BOC); }
-<S_RMTS>{ecl}		{ BEGIN S_INI; return(EOC); }
-<S_RMTS>exchange_mode	{ YYD; return(EXCHANGE_MODE); }
-<S_RMTS>{comma}		{ YYD; /* XXX ignored, but to be handled. */ ; }
-<S_RMTS>base		{ YYD; yylval.num = ISAKMP_ETYPE_BASE; return(EXCHANGETYPE); }
-<S_RMTS>main		{ YYD; yylval.num = ISAKMP_ETYPE_IDENT; return(EXCHANGETYPE); }
-<S_RMTS>aggressive	{ YYD; yylval.num = ISAKMP_ETYPE_AGG; return(EXCHANGETYPE); }
-<S_RMTS>doi		{ YYD; return(DOI); }
-<S_RMTS>ipsec_doi	{ YYD; yylval.num = IPSEC_DOI; return(DOITYPE); }
-<S_RMTS>situation	{ YYD; return(SITUATION); }
-<S_RMTS>identity_only	{ YYD; yylval.num = IPSECDOI_SIT_IDENTITY_ONLY; return(SITUATIONTYPE); }
-<S_RMTS>secrecy		{ YYD; yylval.num = IPSECDOI_SIT_SECRECY; return(SITUATIONTYPE); }
-<S_RMTS>integrity	{ YYD; yylval.num = IPSECDOI_SIT_INTEGRITY; return(SITUATIONTYPE); }
-<S_RMTS>identifier	{ YYD; yywarn("it is obsoleted.  use \"my_identifier\"."); return(IDENTIFIER); }
-<S_RMTS>my_identifier	{ YYD; return(MY_IDENTIFIER); }
-<S_RMTS>xauth_login	{ YYD; return(XAUTH_LOGIN); /* formerly identifier type login */ }
-<S_RMTS>peers_identifier	{ YYD; return(PEERS_IDENTIFIER); }
-<S_RMTS>verify_identifier	{ YYD; return(VERIFY_IDENTIFIER); }
-<S_RMTS>certificate_type	{ YYD; return(CERTIFICATE_TYPE); }
-<S_RMTS>ca_type		{ YYD; return(CA_TYPE); }
-<S_RMTS>x509		{ YYD; yylval.num = ISAKMP_CERT_X509SIGN; return(CERT_X509); }
-<S_RMTS>plain_rsa	{ YYD; yylval.num = ISAKMP_CERT_PLAINRSA; return(CERT_PLAINRSA); }
-<S_RMTS>peers_certfile	{ YYD; return(PEERS_CERTFILE); }
-<S_RMTS>dnssec		{ YYD; return(DNSSEC); }
-<S_RMTS>verify_cert	{ YYD; return(VERIFY_CERT); }
-<S_RMTS>send_cert	{ YYD; return(SEND_CERT); }
-<S_RMTS>send_cr		{ YYD; return(SEND_CR); }
-<S_RMTS>dh_group	{ YYD; return(DH_GROUP); }
-<S_RMTS>nonce_size	{ YYD; return(NONCE_SIZE); }
-<S_RMTS>generate_policy	{ YYD; return(GENERATE_POLICY); }
-<S_RMTS>unique		{ YYD; yylval.num = GENERATE_POLICY_UNIQUE; return(GENERATE_LEVEL); }
-<S_RMTS>require		{ YYD; yylval.num = GENERATE_POLICY_REQUIRE; return(GENERATE_LEVEL); }
-<S_RMTS>support_mip6	{ YYD; yywarn("it is obsoleted.  use \"support_proxy\"."); return(SUPPORT_PROXY); }
-<S_RMTS>support_proxy	{ YYD; return(SUPPORT_PROXY); }
-<S_RMTS>initial_contact	{ YYD; return(INITIAL_CONTACT); }
-<S_RMTS>nat_traversal	{ YYD; return(NAT_TRAVERSAL); }
-<S_RMTS>force		{ YYD; return(REMOTE_FORCE_LEVEL); }
-<S_RMTS>proposal_check	{ YYD; return(PROPOSAL_CHECK); }
-<S_RMTS>obey		{ YYD; yylval.num = PROP_CHECK_OBEY; return(PROPOSAL_CHECK_LEVEL); }
-<S_RMTS>strict		{ YYD; yylval.num = PROP_CHECK_STRICT; return(PROPOSAL_CHECK_LEVEL); }
-<S_RMTS>exact		{ YYD; yylval.num = PROP_CHECK_EXACT; return(PROPOSAL_CHECK_LEVEL); }
-<S_RMTS>claim		{ YYD; yylval.num = PROP_CHECK_CLAIM; return(PROPOSAL_CHECK_LEVEL); }
-<S_RMTS>keepalive	{ YYD; return(KEEPALIVE); }
-<S_RMTS>passive		{ YYD; return(PASSIVE); }
-<S_RMTS>lifetime	{ YYD; return(LIFETIME); }
-<S_RMTS>time		{ YYD; return(LIFETYPE_TIME); }
-<S_RMTS>byte		{ YYD; return(LIFETYPE_BYTE); }
-<S_RMTS>dpd			{ YYD; return(DPD); }
-<S_RMTS>dpd_delay	{ YYD; return(DPD_DELAY); }
-<S_RMTS>dpd_retry	{ YYD; return(DPD_RETRY); }
-<S_RMTS>dpd_maxfail	{ YYD; return(DPD_MAXFAIL); }
-<S_RMTS>ph1id		{ YYD; return(PH1ID); }
-<S_RMTS>ike_frag	{ YYD; return(IKE_FRAG); }
-<S_RMTS>esp_frag	{ YYD; return(ESP_FRAG); }
-<S_RMTS>script		{ YYD; return(SCRIPT); }
-<S_RMTS>phase1_up	{ YYD; return(PHASE1_UP); }
-<S_RMTS>phase1_down	{ YYD; return(PHASE1_DOWN); }
-<S_RMTS>mode_cfg	{ YYD; return(MODE_CFG); }
-<S_RMTS>weak_phase1_check { YYD; return(WEAK_PHASE1_CHECK); }
-	/* remote proposal */
-<S_RMTS>proposal	{ BEGIN S_RMTP; YYDB; return(PROPOSAL); }
-<S_RMTP>{bcl}		{ return(BOC); }
-<S_RMTP>{ecl}		{ BEGIN S_RMTS; return(EOC); }
-<S_RMTP>lifetime	{ YYD; return(LIFETIME); }
-<S_RMTP>time		{ YYD; return(LIFETYPE_TIME); }
-<S_RMTP>byte		{ YYD; return(LIFETYPE_BYTE); }
-<S_RMTP>encryption_algorithm { YYD; yylval.num = algclass_isakmp_enc; return(ALGORITHM_CLASS); }
-<S_RMTP>authentication_method { YYD; yylval.num = algclass_isakmp_ameth; return(ALGORITHM_CLASS); }
-<S_RMTP>hash_algorithm	{ YYD; yylval.num = algclass_isakmp_hash; return(ALGORITHM_CLASS); }
-<S_RMTP>dh_group	{ YYD; return(DH_GROUP); }
-<S_RMTP>gss_id		{ YYD; return(GSS_ID); }
-<S_RMTP>gssapi_id	{ YYD; return(GSS_ID); } /* for back compatibility */
-
-	/* GSS ID encoding type (global) */
-<S_INI>gss_id_enc	{ BEGIN S_GSSENC; YYDB; return(GSS_ID_ENC); }
-<S_GSSENC>latin1	{ YYD; yylval.num = LC_GSSENC_LATIN1;
-				return(GSS_ID_ENCTYPE); }
-<S_GSSENC>utf-16le	{ YYD; yylval.num = LC_GSSENC_UTF16LE;
-				return(GSS_ID_ENCTYPE); }
-<S_GSSENC>{semi}	{ BEGIN S_INI; YYDB; return(EOS); }
-
-	/* parameter */
-on		{ YYD; yylval.num = TRUE; return(SWITCH); }
-off		{ YYD; yylval.num = FALSE; return(SWITCH); }
-
-	/* prefix */
-{slash}{digit}{1,3} {
-			YYD;
-			yytext++;
-			yylval.num = atoi(yytext);
-			return(PREFIX);
-		}
-
-	/* port number */
-{blcl}{decstring}{elcl}	{
-			char *p = yytext;
-			YYD;
-			while (*++p != ']') ;
-			*p = 0;
-			yytext++;
-			yylval.num = atoi(yytext);
-			return(PORT);
-		}
-
-	/* address range */
-{hyphen}{addrstring} {
-                        YYD;
-                        yytext++;
-			yylval.val = vmalloc(yyleng + 1);
-			if (yylval.val == NULL) {
-				yyerror("vmalloc failed");
-				return -1;
-			}
-			memcpy(yylval.val->v, yytext, yylval.val->l);
-                        return(ADDRRANGE);
-                } 
-
-	/* upper protocol */
-esp		{ YYD; yylval.num = IPPROTO_ESP; return(UL_PROTO); }
-ah		{ YYD; yylval.num = IPPROTO_AH; return(UL_PROTO); }
-ipcomp		{ YYD; yylval.num = IPPROTO_IPCOMP; return(UL_PROTO); }
-icmp		{ YYD; yylval.num = IPPROTO_ICMP; return(UL_PROTO); }
-icmp6		{ YYD; yylval.num = IPPROTO_ICMPV6; return(UL_PROTO); }
-tcp		{ YYD; yylval.num = IPPROTO_TCP; return(UL_PROTO); }
-udp		{ YYD; yylval.num = IPPROTO_UDP; return(UL_PROTO); }
-
-	/* algorithm type */
-des_iv64	{ YYD; yylval.num = algtype_des_iv64;	return(ALGORITHMTYPE); }
-des		{ YYD; yylval.num = algtype_des;	return(ALGORITHMTYPE); }
-3des		{ YYD; yylval.num = algtype_3des;	return(ALGORITHMTYPE); }
-rc5		{ YYD; yylval.num = algtype_rc5;	return(ALGORITHMTYPE); }
-idea 		{ YYD; yylval.num = algtype_idea;	return(ALGORITHMTYPE); }
-cast128		{ YYD; yylval.num = algtype_cast128;	return(ALGORITHMTYPE); }
-blowfish	{ YYD; yylval.num = algtype_blowfish;	return(ALGORITHMTYPE); }
-3idea		{ YYD; yylval.num = algtype_3idea;	return(ALGORITHMTYPE); }
-des_iv32	{ YYD; yylval.num = algtype_des_iv32;	return(ALGORITHMTYPE); }
-rc4 		{ YYD; yylval.num = algtype_rc4;	return(ALGORITHMTYPE); }
-null_enc	{ YYD; yylval.num = algtype_null_enc;	return(ALGORITHMTYPE); }
-null		{ YYD; yylval.num = algtype_null_enc;	return(ALGORITHMTYPE); }
-aes		{ YYD; yylval.num = algtype_aes;	return(ALGORITHMTYPE); }
-rijndael	{ YYD; yylval.num = algtype_aes;	return(ALGORITHMTYPE); }
-twofish		{ YYD; yylval.num = algtype_twofish;	return(ALGORITHMTYPE); }
-camellia	{ YYD; yylval.num = algtype_camellia;	return(ALGORITHMTYPE); }
-non_auth	{ YYD; yylval.num = algtype_non_auth;	return(ALGORITHMTYPE); }
-hmac_md5	{ YYD; yylval.num = algtype_hmac_md5;	return(ALGORITHMTYPE); }
-hmac_sha1	{ YYD; yylval.num = algtype_hmac_sha1;	return(ALGORITHMTYPE); }
-hmac_sha2_256	{ YYD; yylval.num = algtype_hmac_sha2_256;	return(ALGORITHMTYPE); }
-hmac_sha256	{ YYD; yylval.num = algtype_hmac_sha2_256;	return(ALGORITHMTYPE); }
-hmac_sha2_384	{ YYD; yylval.num = algtype_hmac_sha2_384;	return(ALGORITHMTYPE); }
-hmac_sha384	{ YYD; yylval.num = algtype_hmac_sha2_384;	return(ALGORITHMTYPE); }
-hmac_sha2_512	{ YYD; yylval.num = algtype_hmac_sha2_512;	return(ALGORITHMTYPE); }
-hmac_sha512	{ YYD; yylval.num = algtype_hmac_sha2_512;	return(ALGORITHMTYPE); }
-des_mac		{ YYD; yylval.num = algtype_des_mac;	return(ALGORITHMTYPE); }
-kpdk		{ YYD; yylval.num = algtype_kpdk;	return(ALGORITHMTYPE); }
-md5		{ YYD; yylval.num = algtype_md5;	return(ALGORITHMTYPE); }
-sha1		{ YYD; yylval.num = algtype_sha1;	return(ALGORITHMTYPE); }
-tiger		{ YYD; yylval.num = algtype_tiger;	return(ALGORITHMTYPE); }
-sha2_256	{ YYD; yylval.num = algtype_sha2_256;	return(ALGORITHMTYPE); }
-sha256		{ YYD; yylval.num = algtype_sha2_256;	return(ALGORITHMTYPE); }
-sha2_384	{ YYD; yylval.num = algtype_sha2_384;	return(ALGORITHMTYPE); }
-sha384		{ YYD; yylval.num = algtype_sha2_384;	return(ALGORITHMTYPE); }
-sha2_512	{ YYD; yylval.num = algtype_sha2_512;	return(ALGORITHMTYPE); }
-sha512		{ YYD; yylval.num = algtype_sha2_512;	return(ALGORITHMTYPE); }
-oui		{ YYD; yylval.num = algtype_oui;	return(ALGORITHMTYPE); }
-deflate		{ YYD; yylval.num = algtype_deflate;	return(ALGORITHMTYPE); }
-lzs		{ YYD; yylval.num = algtype_lzs;	return(ALGORITHMTYPE); }
-modp768		{ YYD; yylval.num = algtype_modp768;	return(ALGORITHMTYPE); }
-modp1024	{ YYD; yylval.num = algtype_modp1024;	return(ALGORITHMTYPE); }
-modp1536	{ YYD; yylval.num = algtype_modp1536;	return(ALGORITHMTYPE); }
-ec2n155		{ YYD; yylval.num = algtype_ec2n155;	return(ALGORITHMTYPE); }
-ec2n185		{ YYD; yylval.num = algtype_ec2n185;	return(ALGORITHMTYPE); }
-modp2048	{ YYD; yylval.num = algtype_modp2048;	return(ALGORITHMTYPE); }
-modp3072	{ YYD; yylval.num = algtype_modp3072;	return(ALGORITHMTYPE); }
-modp4096	{ YYD; yylval.num = algtype_modp4096;	return(ALGORITHMTYPE); }
-modp6144	{ YYD; yylval.num = algtype_modp6144;	return(ALGORITHMTYPE); }
-modp8192	{ YYD; yylval.num = algtype_modp8192;	return(ALGORITHMTYPE); }
-pre_shared_key	{ YYD; yylval.num = algtype_psk;	return(ALGORITHMTYPE); }
-rsasig		{ YYD; yylval.num = algtype_rsasig;	return(ALGORITHMTYPE); }
-dsssig		{ YYD; yylval.num = algtype_dsssig;	return(ALGORITHMTYPE); }
-rsaenc		{ YYD; yylval.num = algtype_rsaenc;	return(ALGORITHMTYPE); }
-rsarev		{ YYD; yylval.num = algtype_rsarev;	return(ALGORITHMTYPE); }
-gssapi_krb	{ YYD; yylval.num = algtype_gssapikrb;	return(ALGORITHMTYPE); }
-hybrid_rsa_server {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_hybrid_rsa_s; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-hybrid_dss_server {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_hybrid_dss_s; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-hybrid_rsa_client {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_hybrid_rsa_c; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-hybrid_dss_client {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_hybrid_dss_c; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-xauth_psk_server {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_xauth_psk_s; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-xauth_psk_client {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_xauth_psk_c; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-xauth_rsa_server {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_xauth_rsa_s; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-xauth_rsa_client {
-#ifdef ENABLE_HYBRID
-	YYD; yylval.num = algtype_xauth_rsa_c; return(ALGORITHMTYPE);
-#else
-	yyerror("racoon not configured with --enable-hybrid");
-#endif
-}
-
-
-	/* identifier type */
-vendor_id	{ YYD; yywarn("it is obsoleted."); return(VENDORID); }
-user_fqdn	{ YYD; yylval.num = IDTYPE_USERFQDN; return(IDENTIFIERTYPE); }
-fqdn		{ YYD; yylval.num = IDTYPE_FQDN; return(IDENTIFIERTYPE); }
-keyid		{ YYD; yylval.num = IDTYPE_KEYID; return(IDENTIFIERTYPE); }
-address		{ YYD; yylval.num = IDTYPE_ADDRESS; return(IDENTIFIERTYPE); }
-subnet		{ YYD; yylval.num = IDTYPE_SUBNET; return(IDENTIFIERTYPE); }
-asn1dn		{ YYD; yylval.num = IDTYPE_ASN1DN; return(IDENTIFIERTYPE); }
-certname	{ YYD; yywarn("certname will be obsoleted in near future."); yylval.num = IDTYPE_ASN1DN; return(IDENTIFIERTYPE); }
-
-	/* identifier qualifier */
-tag		{ YYD; yylval.num = IDQUAL_TAG;  return(IDENTIFIERQUAL); }
-file		{ YYD; yylval.num = IDQUAL_FILE; return(IDENTIFIERQUAL); }
-
-	/* units */
-B|byte|bytes		{ YYD; return(UNITTYPE_BYTE); }
-KB			{ YYD; return(UNITTYPE_KBYTES); }
-MB			{ YYD; return(UNITTYPE_MBYTES); }
-TB			{ YYD; return(UNITTYPE_TBYTES); }
-sec|secs|second|seconds	{ YYD; return(UNITTYPE_SEC); }
-min|mins|minute|minutes	{ YYD; return(UNITTYPE_MIN); }
-hour|hours		{ YYD; return(UNITTYPE_HOUR); }
-
-	/* boolean */
-yes		{ YYD; yylval.num = TRUE; return(BOOLEAN); }
-no		{ YYD; yylval.num = FALSE; return(BOOLEAN); }
-
-{decstring}	{
-			char *bp;
-
-			YYD;
-			yylval.num = strtol(yytext, &bp, 10);
-			return(NUMBER);
-		}
-
-{hexstring}	{
-			char *p;
-
-			YYD; 
-			yylval.val = vmalloc(yyleng + (yyleng & 1) + 1);
-			if (yylval.val == NULL) {
-				yyerror("vmalloc failed");
-				return -1;
-			}
-
-			p = yylval.val->v;
-			*p++ = '0';
-			*p++ = 'x';
-
-			/* fixed string if length is odd. */
-			if (yyleng & 1)
-				*p++ = '0';
-			memcpy(p, &yytext[2], yyleng - 1);
-
-			return(HEXSTRING);
-		}
-
-{quotedstring}	{
-			char *p = yytext;
-
-			YYD;
-			while (*++p != '"') ;
-			*p = '\0';
-
-			yylval.val = vmalloc(yyleng - 1);
-			if (yylval.val == NULL) {
-				yyerror("vmalloc failed");
-				return -1;
-			}
-			memcpy(yylval.val->v, &yytext[1], yylval.val->l);
-
-			return(QUOTEDSTRING);
-		}
-
-{addrstring}	{
-			YYD;
-
-			yylval.val = vmalloc(yyleng + 1);
-			if (yylval.val == NULL) {
-				yyerror("vmalloc failed");
-				return -1;
-			}
-			memcpy(yylval.val->v, yytext, yylval.val->l);
-
-			return(ADDRSTRING);
-		}
-
-<<EOF>>		{
-			yy_delete_buffer(YY_CURRENT_BUFFER);
-			incstackp--;
-    nextfile:
-			if (incstack[incstackp].matchon <
-			    incstack[incstackp].matches.gl_pathc) {
-				char* filepath = incstack[incstackp].matches.gl_pathv[incstack[incstackp].matchon];
-				incstack[incstackp].matchon++;
-				incstackp++;
-				if (yycf_set_buffer(filepath) != 0) {
-					incstackp--;
-					goto nextfile;
-				}
-				yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-				BEGIN(S_INI);
-			} else {
-				globfree(&incstack[incstackp].matches);
-				if (incstackp == 0)
-					yyterminate();
-				else
-					yy_switch_to_buffer(incstack[incstackp].prevstate);
-			}
-		}
-
-	/* ... */
-{ws}		{ ; }
-{nl}		{ incstack[incstackp].lineno++; }
-{comment}	{ YYD; }
-{semi}		{ return(EOS); }
-.		{ yymore(); }
-
-%%
-
-void
-yyerror(char *s, ...)
-{
-	char fmt[512];
-
-	va_list ap;
-#ifdef HAVE_STDARG_H
-	va_start(ap, s);
-#else
-	va_start(ap);
-#endif
-	snprintf(fmt, sizeof(fmt), "%s:%d: \"%s\" %s\n",
-		incstack[incstackp].path, incstack[incstackp].lineno,
-		yytext, s);
-	plogv(LLV_ERROR, LOCATION, NULL, fmt, ap);
-	va_end(ap);
-
-	yyerrorcount++;
-}
-
-void
-yywarn(char *s, ...)
-{
-	char fmt[512];
-
-	va_list ap;
-#ifdef HAVE_STDARG_H
-	va_start(ap, s);
-#else
-	va_start(ap);
-#endif
-	snprintf(fmt, sizeof(fmt), "%s:%d: \"%s\" %s\n",
-		incstack[incstackp].path, incstack[incstackp].lineno,
-		yytext, s);
-	plogv(LLV_WARNING, LOCATION, NULL, fmt, ap);
-	va_end(ap);
-}
-
-int
-yycf_switch_buffer(path)
-	char *path;
-{
-	char *filepath = NULL;
-
-	/* got the include file name */
-	if (incstackp >= MAX_INCLUDE_DEPTH) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Includes nested too deeply");
-		return -1;
-	}
-
-	if (glob(path, GLOB_TILDE, NULL, &incstack[incstackp].matches) != 0 ||
-	    incstack[incstackp].matches.gl_pathc == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"glob found no matches for path \"%s\"\n", path);
-		return -1;
-	}
-	incstack[incstackp].matchon = 0;
-	incstack[incstackp].prevstate = YY_CURRENT_BUFFER;
-
-    nextmatch:
-	if (incstack[incstackp].matchon >= incstack[incstackp].matches.gl_pathc)
-		return -1;
-	filepath =
-	    incstack[incstackp].matches.gl_pathv[incstack[incstackp].matchon];
-	incstack[incstackp].matchon++;
-	incstackp++;
-
-	if (yycf_set_buffer(filepath) != 0) {
-	      incstackp--;
-	      goto nextmatch;
-	}
-
-	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-
-	BEGIN(S_INI);
-
-	return 0;
-}
-
-int
-yycf_set_buffer(path)
-	char *path;
-{
-	yyin = fopen(path, "r");
-	if (yyin == NULL) {
-		fprintf(stderr, "failed to open file %s (%s)\n",
-			path, strerror(errno));
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to open file %s (%s)\n",
-			path, strerror(errno));
-		return -1;
-	}
-
-	/* initialize */
-	incstack[incstackp].fp = yyin;
-	if (incstack[incstackp].path != NULL)
-		racoon_free(incstack[incstackp].path);
-	incstack[incstackp].path = racoon_strdup(path);
-	STRDUP_FATAL(incstack[incstackp].path);
-	incstack[incstackp].lineno = 1;
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"reading config file %s\n", path);
-
-	return 0;
-}
-
-void
-yycf_init_buffer()
-{
-	int i;
-
-	for (i = 0; i < MAX_INCLUDE_DEPTH; i++)
-		memset(&incstack[i], 0, sizeof(incstack[i]));
-	incstackp = 0;
-}
-
-void
-yycf_clean_buffer()
-{
-	int i;
-
-	for (i = 0; i < MAX_INCLUDE_DEPTH; i++) {
-		if (incstack[i].path != NULL) {
-			fclose(incstack[i].fp);
-			racoon_free(incstack[i].path);
-			incstack[i].path = NULL;
-		}
-	}
-}
-
diff --git a/src/racoon/cftoken_proto.h b/src/racoon/cftoken_proto.h
deleted file mode 100644
index 41cb939..0000000
--- a/src/racoon/cftoken_proto.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*	$NetBSD: cftoken_proto.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: cftoken_proto.h,v 1.3 2004/06/11 16:00:15 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _CFTOKEN_PROTO_H
-#define _CFTOKEN_PROTO_H
-
-extern int yyerrorcount;
-
-extern int yylex __P((void));
-extern void yyerror __P((char *, ...));
-extern void yywarn __P((char *, ...));
-
-extern int yycf_switch_buffer __P((char *));
-extern int yycf_set_buffer __P((char *));
-extern void yycf_init_buffer __P((void));
-extern void yycf_clean_buffer __P((void));
-
-#endif /* _CFTOKEN_PROTO_H */
diff --git a/src/racoon/contrib/sp.pl b/src/racoon/contrib/sp.pl
deleted file mode 100644
index d1f9caf..0000000
--- a/src/racoon/contrib/sp.pl
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /usr/pkg/bin/perl
-
-die "insufficient arguments" if (scalar(@ARGV) < 2);
-$src = $ARGV[0];
-$dst = $ARGV[1];
-$mode = 'transport';
-if (scalar(@ARGV) > 2) {
-	$mode = $ARGV[2];
-}
-
-open(OUT, "|setkey -c");
-if ($mode eq 'transport') {
-	print STDERR "install esp transport mode: $src -> $dst\n";
-	print OUT "spdadd $src $dst any -P out ipsec esp/transport//require;\n";
-	print OUT "spdadd $dst $src any -P in ipsec esp/transport//require;\n";
-} elsif ($mode eq 'delete') {
-	print STDERR "delete policy: $src -> $dst\n";
-	print OUT "spddelete $src $dst any -P out;\n";
-	print OUT "spddelete $dst $src any -P in;\n";
-}
-close(OUT);
diff --git a/src/racoon/crypto_openssl.c b/src/racoon/crypto_openssl.c
deleted file mode 100644
index b34b6dd..0000000
--- a/src/racoon/crypto_openssl.c
+++ /dev/null
@@ -1,2852 +0,0 @@
-/*	$NetBSD: crypto_openssl.c,v 1.11.6.6 2009/04/29 10:50:25 tteras Exp $	*/
-
-/* Id: crypto_openssl.c,v 1.47 2006/05/06 20:42:09 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <limits.h>
-#include <string.h>
-
-/* get openssl/ssleay version number */
-#include <openssl/opensslv.h>
-
-#if !defined(OPENSSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x0090602fL)
-#error OpenSSL version 0.9.6 or later required.
-#endif
-
-#include <openssl/pem.h>
-#include <openssl/evp.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-#include <openssl/x509_vfy.h>
-#include <openssl/bn.h>
-#include <openssl/dh.h>
-#include <openssl/md5.h>
-#include <openssl/sha.h>
-#include <openssl/hmac.h>
-#include <openssl/des.h>
-#include <openssl/crypto.h>
-#ifdef HAVE_OPENSSL_ENGINE_H
-#include <openssl/engine.h>
-#endif
-#ifndef ANDROID_CHANGES
-#include <openssl/blowfish.h>
-#include <openssl/cast.h>
-#else
-#define EVP_bf_cbc()    NULL
-#define EVP_cast5_cbc() NULL
-#endif
-#include <openssl/err.h>
-#ifdef HAVE_OPENSSL_RC5_H
-#include <openssl/rc5.h>
-#endif
-#ifdef HAVE_OPENSSL_IDEA_H
-#include <openssl/idea.h>
-#endif
-#if defined(HAVE_OPENSSL_AES_H)
-#include <openssl/aes.h>
-#elif defined(HAVE_OPENSSL_RIJNDAEL_H)
-#include <openssl/rijndael.h>
-#else
-#include "crypto/rijndael/rijndael-api-fst.h"
-#endif
-#if defined(HAVE_OPENSSL_CAMELLIA_H)
-#include <openssl/camellia.h>
-#endif
-#ifdef WITH_SHA2
-#ifdef HAVE_OPENSSL_SHA2_H
-#include <openssl/sha2.h>
-#else
-#include "crypto/sha2/sha2.h"
-#endif
-#endif
-#include "plog.h"
-
-/* 0.9.7 stuff? */
-#if OPENSSL_VERSION_NUMBER < 0x0090700fL
-typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES;
-#else
-#define USE_NEW_DES_API
-#endif
-
-#define OpenSSL_BUG()	do { plog(LLV_ERROR, LOCATION, NULL, "OpenSSL function failed\n"); } while(0)
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "crypto_openssl.h"
-#include "debug.h"
-#include "gcmalloc.h"
-
-#if defined(OPENSSL_IS_BORINGSSL)
-/* HMAC_cleanup is deprecated wrapper in OpenSSL and has been removed in
- * BoringSSL. */
-#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx)
-#endif
-
-/*
- * I hate to cast every parameter to des_xx into void *, but it is
- * necessary for SSLeay/OpenSSL portability.  It sucks.
- */
-
-static int cb_check_cert_local __P((int, X509_STORE_CTX *));
-static int cb_check_cert_remote __P((int, X509_STORE_CTX *));
-static X509 *mem2x509 __P((vchar_t *));
-
-static caddr_t eay_hmac_init __P((vchar_t *, const EVP_MD *));
-
-/* X509 Certificate */
-/*
- * convert the string of the subject name into DER
- * e.g. str = "C=JP, ST=Kanagawa";
- */
-vchar_t *
-eay_str2asn1dn(str, len)
-	const char *str;
-	int len;
-{
-	X509_NAME *name;
-	char *buf;
-	char *field, *value;
-	int i, j;
-	vchar_t *ret = NULL;
-	caddr_t p;
-
-	if (len == -1)
-		len = strlen(str);
-
-	buf = racoon_malloc(len + 1);
-	if (!buf) {
-		plog(LLV_WARNING, LOCATION, NULL,"failed to allocate buffer\n");
-		return NULL;
-	}
-	memcpy(buf, str, len);
-
-	name = X509_NAME_new();
-
-	field = &buf[0];
-	value = NULL;
-	for (i = 0; i < len; i++) {
-		if (!value && buf[i] == '=') {
-			buf[i] = '\0';
-			value = &buf[i + 1];
-			continue;
-		} else if (buf[i] == ',' || buf[i] == '/') {
-			buf[i] = '\0';
-
-			plog(LLV_DEBUG, LOCATION, NULL, "DN: %s=%s\n",
-			     field, value);
-
-			if (!value) goto err;
-			if (!X509_NAME_add_entry_by_txt(name, field,
-					(value[0] == '*' && value[1] == 0) ? 
-						V_ASN1_PRINTABLESTRING : MBSTRING_ASC,
-					(unsigned char *) value, -1, -1, 0)) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				     "Invalid DN field: %s=%s\n",
-				     field, value);
-				plog(LLV_ERROR, LOCATION, NULL, 
-				     "%s\n", eay_strerror());
-				goto err;
-			}
-			for (j = i + 1; j < len; j++) {
-				if (buf[j] != ' ')
-					break;
-			}
-			field = &buf[j];
-			value = NULL;
-			continue;
-		}
-	}
-	buf[len] = '\0';
-
-	plog(LLV_DEBUG, LOCATION, NULL, "DN: %s=%s\n",
-	     field, value);
-
-	if (!value) goto err;
-	if (!X509_NAME_add_entry_by_txt(name, field,
-			(value[0] == '*' && value[1] == 0) ? 
-				V_ASN1_PRINTABLESTRING : MBSTRING_ASC,
-			(unsigned char *) value, -1, -1, 0)) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		     "Invalid DN field: %s=%s\n",
-		     field, value);
-		plog(LLV_ERROR, LOCATION, NULL, 
-		     "%s\n", eay_strerror());
-		goto err;
-	}
-
-	i = i2d_X509_NAME(name, NULL);
-	if (!i)
-		goto err;
-	ret = vmalloc(i);
-	if (!ret)
-		goto err;
-	p = ret->v;
-	i = i2d_X509_NAME(name, (void *)&p);
-	if (!i)
-		goto err;
-
-	return ret;
-
-    err:
-	if (buf)
-		racoon_free(buf);
-	if (name)
-		X509_NAME_free(name);
-	if (ret)
-		vfree(ret);
-	return NULL;
-}
-
-/*
- * convert the hex string of the subject name into DER
- */
-vchar_t *
-eay_hex2asn1dn(const char *hex, int len)
-{
-	BIGNUM *bn = BN_new();
-	char *binbuf;
-	size_t binlen;
-	vchar_t *ret = NULL;
-	
-	if (len == -1)
-		len = strlen(hex);
-
-	if (BN_hex2bn(&bn, hex) != len) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		     "conversion of Hex-encoded ASN1 string to binary failed: %s\n",
-		     eay_strerror());
-		goto out;
-	}
-	
-	binlen = BN_num_bytes(bn);
-	ret = vmalloc(binlen);
-	if (!ret) {
-		plog(LLV_WARNING, LOCATION, NULL,"failed to allocate buffer\n");
-		return NULL;
-	}
-	binbuf = ret->v;
-
-	BN_bn2bin(bn, (unsigned char *) binbuf);
-
-out:
-	BN_free(bn);
-
-	return ret;
-}
-
-/*
- * The following are derived from code in crypto/x509/x509_cmp.c
- * in OpenSSL0.9.7c:
- * X509_NAME_wildcmp() adds wildcard matching to the original
- * X509_NAME_cmp(), nocase_cmp() and nocase_spacenorm_cmp() are as is.
- */
-#include <ctype.h>
-/* Case insensitive string comparision */
-static int nocase_cmp(const ASN1_STRING *a, const ASN1_STRING *b)
-{
-	int i;
-
-	int a_length = ASN1_STRING_length(a);
-	int b_length = ASN1_STRING_length(b);
-	if (a_length != b_length)
-		return (a_length - b_length);
-
-	const unsigned char *a_data = ASN1_STRING_get0_data(a);
-	const unsigned char *b_data = ASN1_STRING_get0_data(b);
-	for (i=0; i<a_length; i++)
-	{
-		int ca, cb;
-
-		ca = tolower(a_data[i]);
-		cb = tolower(b_data[i]);
-
-		if (ca != cb)
-			return(ca-cb);
-	}
-	return 0;
-}
-
-/* Case insensitive string comparision with space normalization 
- * Space normalization - ignore leading, trailing spaces, 
- *       multiple spaces between characters are replaced by single space  
- */
-static int nocase_spacenorm_cmp(const ASN1_STRING *a, const ASN1_STRING *b)
-{
-	const unsigned char *pa = NULL, *pb = NULL;
-	int la, lb;
-	
-	la = ASN1_STRING_length(a);
-	lb = ASN1_STRING_length(b);
-	pa = ASN1_STRING_get0_data(a);
-	pb = ASN1_STRING_get0_data(b);
-
-	/* skip leading spaces */
-	while (la > 0 && isspace(*pa))
-	{
-		la--;
-		pa++;
-	}
-	while (lb > 0 && isspace(*pb))
-	{
-		lb--;
-		pb++;
-	}
-
-	/* skip trailing spaces */
-	while (la > 0 && isspace(pa[la-1]))
-		la--;
-	while (lb > 0 && isspace(pb[lb-1]))
-		lb--;
-
-	/* compare strings with space normalization */
-	while (la > 0 && lb > 0)
-	{
-		int ca, cb;
-
-		/* compare character */
-		ca = tolower(*pa);
-		cb = tolower(*pb);
-		if (ca != cb)
-			return (ca - cb);
-
-		pa++; pb++;
-		la--; lb--;
-
-		if (la <= 0 || lb <= 0)
-			break;
-
-		/* is white space next character ? */
-		if (isspace(*pa) && isspace(*pb))
-		{
-			/* skip remaining white spaces */
-			while (la > 0 && isspace(*pa))
-			{
-				la--;
-				pa++;
-			}
-			while (lb > 0 && isspace(*pb))
-			{
-				lb--;
-				pb++;
-			}
-		}
-	}
-	if (la > 0 || lb > 0)
-		return la - lb;
-
-	return 0;
-}
-
-static int X509_NAME_wildcmp(const X509_NAME *a, const X509_NAME *b)
-{
-    int i,j;
-    X509_NAME_ENTRY *na,*nb;
-
-    if (X509_NAME_entry_count(a)
-	!= X509_NAME_entry_count(b))
-	    return X509_NAME_entry_count(a)
-	      -X509_NAME_entry_count(b);
-    for (i=X509_NAME_entry_count(a)-1; i>=0; i--)
-    {
-	    na=X509_NAME_get_entry(a,i);
-	    nb=X509_NAME_get_entry(b,i);
-	    j=OBJ_cmp(X509_NAME_ENTRY_get_object(na),X509_NAME_ENTRY_get_object(nb));
-	    if (j) return(j);
-	    const ASN1_STRING *na_value=X509_NAME_ENTRY_get_data(na);
-	    const ASN1_STRING *nb_value=X509_NAME_ENTRY_get_data(nb);
-	    if ((ASN1_STRING_length(na_value) == 1 && ASN1_STRING_get0_data(na_value)[0] == '*')
-	     || (ASN1_STRING_length(nb_value) == 1 && ASN1_STRING_get0_data(nb_value)[0] == '*'))
-		    continue;
-	    j=ASN1_STRING_type(na_value)-ASN1_STRING_type(nb_value);
-	    if (j) return(j);
-	    if (ASN1_STRING_type(na_value) == V_ASN1_PRINTABLESTRING)
-		    j=nocase_spacenorm_cmp(na_value, nb_value);
-	    else if (ASN1_STRING_type(na_value) == V_ASN1_IA5STRING
-		    && OBJ_obj2nid(X509_NAME_ENTRY_get_object(na)) == NID_pkcs9_emailAddress)
-		    j=nocase_cmp(na_value, nb_value);
-	    else
-		    {
-		    j=ASN1_STRING_length(na_value)-ASN1_STRING_length(nb_value);
-		    if (j) return(j);
-		    j=memcmp(ASN1_STRING_get0_data(na_value),ASN1_STRING_get0_data(nb_value),
-			    ASN1_STRING_length(na_value));
-		    }
-	    if (j) return(j);
-	    j=X509_NAME_ENTRY_set(na)-X509_NAME_ENTRY_set(nb);
-	    if (j) return(j);
-    }
-
-    return(0);
-}
-
-/*
- * compare two subjectNames.
- * OUT:        0: equal
- *	positive:
- *	      -1: other error.
- */
-int
-eay_cmp_asn1dn(n1, n2)
-	vchar_t *n1, *n2;
-{
-	X509_NAME *a = NULL, *b = NULL;
-	caddr_t p;
-	int i = -1;
-
-	p = n1->v;
-	if (!d2i_X509_NAME(&a, (void *)&p, n1->l))
-		goto end;
-	p = n2->v;
-	if (!d2i_X509_NAME(&b, (void *)&p, n2->l))
-		goto end;
-
-	i = X509_NAME_wildcmp(a, b);
-
-    end:
-	if (a)
-		X509_NAME_free(a);
-	if (b)
-		X509_NAME_free(b);
-	return i;
-}
-
-#ifdef ANDROID_CHANGES
-
-static BIO *BIO_from_android(char *path)
-{       
-	void *data;
-	if (sscanf(path, pname, &data) == 1) {
-		return BIO_new_mem_buf(data, -1);
-	}
-	return NULL;
-}
-
-#endif
-
-/*
- * this functions is derived from apps/verify.c in OpenSSL0.9.5
- */
-int
-eay_check_x509cert(cert, CApath, CAfile, local)
-	vchar_t *cert;
-	char *CApath;
-	char *CAfile;
-	int local;
-{
-	X509_STORE *cert_ctx = NULL;
-	X509_LOOKUP *lookup = NULL;
-	X509 *x509 = NULL;
-	X509_STORE_CTX *csc;
-	int error = -1;
-
-	cert_ctx = X509_STORE_new();
-	if (cert_ctx == NULL)
-		goto end;
-
-	if (local)
-		X509_STORE_set_verify_cb_func(cert_ctx, cb_check_cert_local);
-	else 
-		X509_STORE_set_verify_cb_func(cert_ctx, cb_check_cert_remote);
-
-#ifdef ANDROID_CHANGES
-	if (pname) {
-		BIO *bio = BIO_from_android(CAfile);
-		STACK_OF(X509_INFO) *stack;
-		X509_INFO *info;
-		int i;
-
-		if (!bio) {
-			goto end;
-		}
-		stack = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL);
-		BIO_free(bio);
-		if (!stack) {
-			goto end;
-		}
-		for (i = 0; i < sk_X509_INFO_num(stack); ++i) {
-			info = sk_X509_INFO_value(stack, i);
-			if (info->x509) {
-				X509_STORE_add_cert(cert_ctx, info->x509);
-			}
-			if (info->crl) {
-				X509_STORE_add_crl(cert_ctx, info->crl);
-			}
-		}
-		sk_X509_INFO_pop_free(stack, X509_INFO_free);
-	} else {
-#endif
-	lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file());
-	if (lookup == NULL)
-		goto end;
-
-	X509_LOOKUP_load_file(lookup, CAfile, 
-	    (CAfile == NULL) ? X509_FILETYPE_DEFAULT : X509_FILETYPE_PEM);
-
-	lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_hash_dir());
-	if (lookup == NULL)
-		goto end;
-	error = X509_LOOKUP_add_dir(lookup, CApath, X509_FILETYPE_PEM);
-	if(!error) {
-		error = -1;
-		goto end;
-	}
-	error = -1;	/* initialized */
-#ifdef ANDROID_CHANGES
-	}
-#endif
-
-	/* read the certificate to be verified */
-	x509 = mem2x509(cert);
-	if (x509 == NULL)
-		goto end;
-
-	csc = X509_STORE_CTX_new();
-	if (csc == NULL)
-		goto end;
-	X509_STORE_CTX_init(csc, cert_ctx, x509, NULL);
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
-	X509_STORE_CTX_set_flags (csc, X509_V_FLAG_CRL_CHECK);
-	X509_STORE_CTX_set_flags (csc, X509_V_FLAG_CRL_CHECK_ALL);
-#endif
-	error = X509_verify_cert(csc);
-	X509_STORE_CTX_free(csc);
-
-	/*
-	 * if x509_verify_cert() is successful then the value of error is
-	 * set non-zero.
-	 */
-	error = error ? 0 : -1;
-
-end:
-	if (error)
-		plog(LLV_WARNING, LOCATION, NULL,"%s\n", eay_strerror());
-	if (cert_ctx != NULL)
-		X509_STORE_free(cert_ctx);
-	if (x509 != NULL)
-		X509_free(x509);
-
-	return(error);
-}
-
-/*
- * callback function for verifing certificate.
- * this function is derived from cb() in openssl/apps/s_server.c
- */
-static int
-cb_check_cert_local(ok, ctx)
-	int ok;
-	X509_STORE_CTX *ctx;
-{
-	char buf[256];
-	int log_tag;
-
-	if (!ok) {
-		X509_NAME_oneline(
-				X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)),
-				buf,
-				256);
-		/*
-		 * since we are just checking the certificates, it is
-		 * ok if they are self signed. But we should still warn
-		 * the user.
- 		 */
-		int error = X509_STORE_CTX_get_error(ctx);
-		switch (error) {
-		case X509_V_ERR_CERT_HAS_EXPIRED:
-		case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
-		case X509_V_ERR_INVALID_CA:
-		case X509_V_ERR_PATH_LENGTH_EXCEEDED:
-		case X509_V_ERR_INVALID_PURPOSE:
-		case X509_V_ERR_UNABLE_TO_GET_CRL:
-			ok = 1;
-			log_tag = LLV_WARNING;
-			break;
-		default:
-			log_tag = LLV_ERROR;
-		}
-		plog(log_tag, LOCATION, NULL,
-			"%s(%d) at depth:%d SubjectName:%s\n",
-			X509_verify_cert_error_string(error),
-			error,
-			X509_STORE_CTX_get_error_depth(ctx),
-			buf);
-	}
-	ERR_clear_error();
-
-	return ok;
-}
-
-/*
- * callback function for verifing remote certificates.
- * this function is derived from cb() in openssl/apps/s_server.c
- */
-static int
-cb_check_cert_remote(ok, ctx)
-	int ok;
-	X509_STORE_CTX *ctx;
-{
-	char buf[256];
-	int log_tag;
-
-	if (!ok) {
-		X509_NAME_oneline(
-				X509_get_subject_name(X509_STORE_CTX_get_current_cert(ctx)),
-				buf,
-				256);
-		int error = X509_STORE_CTX_get_error(ctx);
-		switch (error) {
-		case X509_V_ERR_UNABLE_TO_GET_CRL:
-			ok = 1;
-			log_tag = LLV_WARNING;
-			break;
-		default:
-			log_tag = LLV_ERROR;
-		}
-		plog(log_tag, LOCATION, NULL,
-			"%s(%d) at depth:%d SubjectName:%s\n",
-			X509_verify_cert_error_string(error),
-			error,
-			X509_STORE_CTX_get_error_depth(ctx),
-			buf);
-	}
-	ERR_clear_error();
-
-	return ok;
-}
-
-/*
- * get a subjectAltName from X509 certificate.
- */
-vchar_t *
-eay_get_x509asn1subjectname(cert)
-	vchar_t *cert;
-{
-	X509 *x509 = NULL;
-	u_char *bp;
-	vchar_t *name = NULL;
-	int len;
-
-	bp = (unsigned char *) cert->v;
-
-	x509 = mem2x509(cert);
-	if (x509 == NULL)
-		goto error;
-
-	/* get the length of the name */
-	len = i2d_X509_NAME(X509_get_subject_name(x509), NULL);
-	name = vmalloc(len);
-	if (!name)
-		goto error;
-	/* get the name */
-	bp = (unsigned char *) name->v;
-	len = i2d_X509_NAME(X509_get_subject_name(x509), &bp);
-
-	X509_free(x509);
-
-	return name;
-
-error:
-	plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-
-	if (name != NULL) 
-		vfree(name);
-
-	if (x509 != NULL)
-		X509_free(x509);
-
-	return NULL;
-}
-
-/*
- * get the subjectAltName from X509 certificate.
- * the name must be terminated by '\0'.
- */
-int
-eay_get_x509subjectaltname(cert, altname, type, pos)
-	vchar_t *cert;
-	char **altname;
-	int *type;
-	int pos;
-{
-	X509 *x509 = NULL;
-	GENERAL_NAMES *gens = NULL;
-	GENERAL_NAME *gen;
-	int len;
-	int error = -1;
-
-	*altname = NULL;
-	*type = GENT_OTHERNAME;
-
-	x509 = mem2x509(cert);
-	if (x509 == NULL)
-		goto end;
-
-	gens = X509_get_ext_d2i(x509, NID_subject_alt_name, NULL, NULL);
-	if (gens == NULL)
-		goto end;
-
-	/* there is no data at "pos" */
-	if (pos > sk_GENERAL_NAME_num(gens))
-		goto end;
-
-	gen = sk_GENERAL_NAME_value(gens, pos - 1);
-
-	/* read DNSName / Email */
-	if (gen->type == GEN_DNS	||
-		gen->type == GEN_EMAIL	||
-		gen->type == GEN_URI )
-	{
-		/* make sure if the data is terminated by '\0'. */
-		if (ASN1_STRING_get0_data(gen->d.ia5)[ASN1_STRING_length(gen->d.ia5)] != '\0')
-		{
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "data is not terminated by NUL.");
-			racoon_hexdump(ASN1_STRING_get0_data(gen->d.ia5), ASN1_STRING_length(gen->d.ia5) + 1);
-			goto end;
-		}
-		
-		len = ASN1_STRING_length(gen->d.ia5) + 1;
-		*altname = racoon_malloc(len);
-		if (!*altname)
-			goto end;
-		
-		strlcpy(*altname, (const char *) ASN1_STRING_get0_data(gen->d.ia5), len);
-		*type = gen->type;
-		error = 0;
-	}
-	/* read IP address */
-	else if (gen->type == GEN_IPADD)
-	{
-		const unsigned char *ip;
-		
-		/* only support IPv4 */
-		if (ASN1_STRING_length(gen->d.ip) != 4)
-			goto end;
-		
-		/* convert Octet String to String
-		 * XXX ???????
-		 */
-		/*i2d_ASN1_OCTET_STRING(gen->d.ip,&ip);*/
-		ip = ASN1_STRING_get0_data(gen->d.ip);
-
-		/* XXX Magic, enough for an IPv4 address
-		 */
-		*altname = racoon_malloc(20);
-		if (!*altname)
-			goto end;
-		
-		sprintf(*altname, "%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
-		*type = gen->type;
-		error = 0;
-	}
-	/* XXX other possible types ?
-	 * For now, error will be -1 if unsupported type
-	 */
-
-end:
-	if (error) {
-		if (*altname) {
-			racoon_free(*altname);
-			*altname = NULL;
-		}
-		plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-	}
-	if (x509)
-		X509_free(x509);
-	if (gens)
-		/* free the whole stack. */
-		sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);
-
-	return error;
-}
-
-
-/*
- * decode a X509 certificate and make a readable text terminated '\n'.
- * return the buffer allocated, so must free it later.
- */
-char *
-eay_get_x509text(cert)
-	vchar_t *cert;
-{
-	X509 *x509 = NULL;
-	BIO *bio = NULL;
-	char *text = NULL;
-	u_char *bp = NULL;
-	int len = 0;
-	int error = -1;
-
-	x509 = mem2x509(cert);
-	if (x509 == NULL)
-		goto end;
-
-	bio = BIO_new(BIO_s_mem());
-	if (bio == NULL)
-		goto end;
-
-	error = X509_print(bio, x509);
-	if (error != 1) {
-		error = -1;
-		goto end;
-	}
-
-#if defined(ANDROID_CHANGES)
-	len = BIO_get_mem_data(bio, (char**) &bp);
-#else
-	len = BIO_get_mem_data(bio, &bp);
-#endif
-	text = racoon_malloc(len + 1);
-	if (text == NULL)
-		goto end;
-	memcpy(text, bp, len);
-	text[len] = '\0';
-
-	error = 0;
-
-    end:
-	if (error) {
-		if (text) {
-			racoon_free(text);
-			text = NULL;
-		}
-		plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-	}
-	if (bio)
-		BIO_free(bio);
-	if (x509)
-		X509_free(x509);
-
-	return text;
-}
-
-/* get X509 structure from buffer. */
-static X509 *
-mem2x509(cert)
-	vchar_t *cert;
-{
-	X509 *x509;
-
-#ifndef EAYDEBUG
-    {
-	u_char *bp;
-
-	bp = (unsigned char *) cert->v;
-
-	x509 = d2i_X509(NULL, (void *)&bp, cert->l);
-    }
-#else
-    {
-	BIO *bio;
-	int len;
-
-	bio = BIO_new(BIO_s_mem());
-	if (bio == NULL)
-		return NULL;
-	len = BIO_write(bio, cert->v, cert->l);
-	if (len == -1)
-		return NULL;
-	x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
-	BIO_free(bio);
-    }
-#endif
-	return x509;
-}
-
-/*
- * get a X509 certificate from local file.
- * a certificate must be PEM format.
- * Input:
- *	path to a certificate.
- * Output:
- *	NULL if error occured
- *	other is the cert.
- */
-vchar_t *
-eay_get_x509cert(path)
-	char *path;
-{
-	FILE *fp;
-	X509 *x509;
-	vchar_t *cert;
-	u_char *bp;
-	int len;
-	int error;
-
-#ifdef ANDROID_CHANGES
-	if (pname) {
-		BIO *bio = BIO_from_android(path);
-		if (!bio) {
-			return NULL;
-		}
-		x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
-		BIO_free(bio);
-	} else {
-#endif
-	/* Read private key */
-	fp = fopen(path, "r");
-	if (fp == NULL)
-		return NULL;
-	x509 = PEM_read_X509(fp, NULL, NULL, NULL);
-	fclose (fp);
-#ifdef ANDROID_CHANGES
-	}
-#endif
-
-	if (x509 == NULL)
-		return NULL;
-
-	len = i2d_X509(x509, NULL);
-	cert = vmalloc(len);
-	if (cert == NULL) {
-		X509_free(x509);
-		return NULL;
-	}
-	bp = (unsigned char *) cert->v;
-	error = i2d_X509(x509, &bp);
-	X509_free(x509);
-
-	if (error == 0) {
-		vfree(cert);
-		return NULL;
-	}
-
-	return cert;
-}
-
-/*
- * check a X509 signature
- *	XXX: to be get hash type from my cert ?
- *		to be handled EVP_dss().
- * OUT: return -1 when error.
- *	0
- */
-int
-eay_check_x509sign(source, sig, cert)
-	vchar_t *source;
-	vchar_t *sig;
-	vchar_t *cert;
-{
-	X509 *x509;
-	u_char *bp;
-	EVP_PKEY *evp;
-	int res;
-
-	bp = (unsigned char *) cert->v;
-
-	x509 = d2i_X509(NULL, (void *)&bp, cert->l);
-	if (x509 == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "d2i_X509(): %s\n", eay_strerror());
-		return -1;
-	}
-
-	evp = X509_get_pubkey(x509);
-	if (! evp) {
-		plog(LLV_ERROR, LOCATION, NULL, "X509_get_pubkey(): %s\n", eay_strerror());
-		X509_free(x509);
-		return -1;
-	}
-
-	res = eay_rsa_verify(source, sig, EVP_PKEY_get0_RSA(evp));
-
-	EVP_PKEY_free(evp);
-	X509_free(x509);
-
-	return res;
-}
-
-/*
- * check RSA signature
- * OUT: return -1 when error.
- *	0 on success
- */
-int
-eay_check_rsasign(source, sig, rsa)
-	vchar_t *source;
-	vchar_t *sig;
-	RSA *rsa;
-{
-	return eay_rsa_verify(source, sig, rsa);
-}
-
-/*
- * get PKCS#1 Private Key of PEM format from local file.
- */
-vchar_t *
-eay_get_pkcs1privkey(path)
-	char *path;
-{
-	FILE *fp;
-	EVP_PKEY *evp = NULL;
-	vchar_t *pkey = NULL;
-	u_char *bp;
-	int pkeylen;
-	int error = -1;
-
-#ifdef ANDROID_CHANGES
-	if (pname) {
-		BIO *bio = BIO_from_android(path);
-		if (!bio) {
-			return NULL;
-		}
-		evp = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
-		BIO_free(bio);
-	} else {
-#endif
-	/* Read private key */
-	fp = fopen(path, "r");
-	if (fp == NULL)
-		return NULL;
-
-	evp = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
-
-	fclose (fp);
-#ifdef ANDROID_CHANGES
-	}
-#endif
-
-	if (evp == NULL)
-		return NULL;
-
-	pkeylen = i2d_PrivateKey(evp, NULL);
-	if (pkeylen == 0)
-		goto end;
-	pkey = vmalloc(pkeylen);
-	if (pkey == NULL)
-		goto end;
-	bp = (unsigned char *) pkey->v;
-	pkeylen = i2d_PrivateKey(evp, &bp);
-	if (pkeylen == 0)
-		goto end;
-
-	error = 0;
-
-end:
-	if (evp != NULL)
-		EVP_PKEY_free(evp);
-	if (error != 0 && pkey != NULL) {
-		vfree(pkey);
-		pkey = NULL;
-	}
-
-	return pkey;
-}
-
-/*
- * get PKCS#1 Public Key of PEM format from local file.
- */
-vchar_t *
-eay_get_pkcs1pubkey(path)
-	char *path;
-{
-	FILE *fp;
-	EVP_PKEY *evp = NULL;
-	vchar_t *pkey = NULL;
-	X509 *x509 = NULL;
-	u_char *bp;
-	int pkeylen;
-	int error = -1;
-
-	/* Read private key */
-	fp = fopen(path, "r");
-	if (fp == NULL)
-		return NULL;
-
-	x509 = PEM_read_X509(fp, NULL, NULL, NULL);
-
-	fclose (fp);
-
-	if (x509 == NULL)
-		return NULL;
-  
-	/* Get public key - eay */
-	evp = X509_get_pubkey(x509);
-	if (evp == NULL)
-		return NULL;
-
-	pkeylen = i2d_PublicKey(evp, NULL);
-	if (pkeylen == 0)
-		goto end;
-	pkey = vmalloc(pkeylen);
-	if (pkey == NULL)
-		goto end;
-	bp = (unsigned char *) pkey->v;
-	pkeylen = i2d_PublicKey(evp, &bp);
-	if (pkeylen == 0)
-		goto end;
-
-	error = 0;
-end:
-	if (evp != NULL)
-		EVP_PKEY_free(evp);
-	if (error != 0 && pkey != NULL) {
-		vfree(pkey);
-		pkey = NULL;
-	}
-
-	return pkey;
-}
-
-vchar_t *
-eay_get_x509sign(src, privkey)
-	vchar_t *src, *privkey;
-{
-	EVP_PKEY *evp;
-	u_char *bp = (unsigned char *) privkey->v;
-	vchar_t *sig = NULL;
-	int len;
-	int pad = RSA_PKCS1_PADDING;
-
-	/* XXX to be handled EVP_PKEY_DSA */
-	evp = d2i_PrivateKey(EVP_PKEY_RSA, NULL, (void *)&bp, privkey->l);
-	if (evp == NULL)
-		return NULL;
-
-	sig = eay_rsa_sign(src, EVP_PKEY_get0_RSA(evp));
-
-	EVP_PKEY_free(evp);
-
-	return sig;
-}
-
-vchar_t *
-eay_get_rsasign(src, rsa)
-	vchar_t *src;
-	RSA *rsa;
-{
-	return eay_rsa_sign(src, rsa);
-}
-
-vchar_t *
-eay_rsa_sign(vchar_t *src, RSA *rsa)
-{
-	int len;
-	vchar_t *sig = NULL;
-	int pad = RSA_PKCS1_PADDING;
-
-	len = RSA_size(rsa);
-
-	sig = vmalloc(len);
-	if (sig == NULL)
-		return NULL;
-
-	len = RSA_private_encrypt(src->l, (unsigned char *) src->v, 
-			(unsigned char *) sig->v, rsa, pad);
-
-	if (len == 0 || len != sig->l) {
-		vfree(sig);
-		sig = NULL;
-	}
-
-	return sig;
-}
-
-int
-eay_rsa_verify(src, sig, rsa)
-	vchar_t *src, *sig;
-	RSA *rsa;
-{
-	vchar_t *xbuf = NULL;
-	int pad = RSA_PKCS1_PADDING;
-	int len = 0;
-	int error;
-
-	len = RSA_size(rsa);
-	xbuf = vmalloc(len);
-	if (xbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-		return -1;
-	}
-
-	len = RSA_public_decrypt(sig->l, (unsigned char *) sig->v, 
-			(unsigned char *) xbuf->v, rsa, pad);
-	if (len == 0 || len != src->l) {
-		plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-		vfree(xbuf);
-		return -1;
-	}
-
-	error = memcmp(src->v, xbuf->v, src->l);
-	vfree(xbuf);
-	if (error != 0)
-		return -1;
-
-	return 0;
-}
-
-/*
- * get error string
- * MUST load ERR_load_crypto_strings() first.
- */
-char *
-eay_strerror()
-{
-	static char ebuf[512];
-	int len = 0, n;
-	unsigned long l;
-	char buf[200];
-	const char *file, *data;
-	int line, flags;
-	unsigned long es;
-
-#if defined(ANDROID_CHANGES)
-	es = 0;
-#else
-	es = CRYPTO_thread_id();
-#endif
-
-	while ((l = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0){
-		n = snprintf(ebuf + len, sizeof(ebuf) - len,
-				"%lu:%s:%s:%d:%s ",
-				es, ERR_error_string(l, buf), file, line,
-				(flags & ERR_TXT_STRING) ? data : "");
-		if (n < 0 || n >= sizeof(ebuf) - len)
-			break;
-		len += n;
-		if (sizeof(ebuf) < len)
-			break;
-	}
-
-	return ebuf;
-}
-
-vchar_t *
-evp_crypt(vchar_t *data, vchar_t *key, vchar_t *iv, const EVP_CIPHER *e, int enc)
-{
-	vchar_t *res;
-	EVP_CIPHER_CTX ctx;
-
-	if (!e)
-		return NULL;
-
-	if (data->l % EVP_CIPHER_block_size(e))
-		return NULL;
-
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	EVP_CIPHER_CTX_init(&ctx);
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-	switch(EVP_CIPHER_nid(e)){
-	case NID_bf_cbc:
-	case NID_bf_ecb:
-	case NID_bf_cfb64:
-	case NID_bf_ofb64:
-	case NID_cast5_cbc:
-	case NID_cast5_ecb:
-	case NID_cast5_cfb64:
-	case NID_cast5_ofb64:
-		/* XXX: can we do that also for algos with a fixed key size ?
-		 */
-		/* init context without key/iv
-         */
-        if (!EVP_CipherInit(&ctx, e, NULL, NULL, enc))
-        {
-            OpenSSL_BUG();
-            vfree(res);
-            return NULL;
-        }
-		
-        /* update key size
-         */
-        if (!EVP_CIPHER_CTX_set_key_length(&ctx, key->l))
-        {
-            OpenSSL_BUG();
-            vfree(res);
-            return NULL;
-        }
-
-        /* finalize context init with desired key size
-         */
-        if (!EVP_CipherInit(&ctx, NULL, (u_char *) key->v,
-							(u_char *) iv->v, enc))
-        {
-            OpenSSL_BUG();
-            vfree(res);
-            return NULL;
-		}
-		break;
-	default:
-#endif  /* OPENSSL_IS_BORINGSSL */
-		if (!EVP_CipherInit(&ctx, e, (u_char *) key->v, 
-							(u_char *) iv->v, enc)) {
-			OpenSSL_BUG();
-			vfree(res);
-			return NULL;
-		}
-#if !defined(OPENSSL_IS_BORINGSSL)
-	}
-#endif
-
-	/* disable openssl padding */
-	EVP_CIPHER_CTX_set_padding(&ctx, 0); 
-	
-	if (!EVP_Cipher(&ctx, (u_char *) res->v, (u_char *) data->v, data->l)) {
-		OpenSSL_BUG();
-		vfree(res);
-		return NULL;
-	}
-
-	EVP_CIPHER_CTX_cleanup(&ctx);
-
-	return res;
-}
-
-int
-evp_weakkey(vchar_t *key, const EVP_CIPHER *e)
-{
-	return 0;
-}
-
-int
-evp_keylen(int len, const EVP_CIPHER *e)
-{
-	if (!e)
-		return -1;
-	/* EVP functions return lengths in bytes, ipsec-tools
-	 * uses lengths in bits, therefore conversion is required. --AK
-	 */
-	if (len != 0 && len != (EVP_CIPHER_key_length(e) << 3))
-		return -1;
-	
-	return EVP_CIPHER_key_length(e) << 3;
-}
-
-/*
- * DES-CBC
- */
-vchar_t *
-eay_des_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_des_cbc(), 1);
-}
-
-vchar_t *
-eay_des_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_des_cbc(), 0);
-}
-
-#if defined(OPENSSL_IS_BORINGSSL)
-/* BoringSSL doesn't implement DES_is_weak_key because the concept is nonsense.
- * Thankfully, ipsec-tools never actually uses the result of this function. */
-static int
-DES_is_weak_key(const DES_cblock *key)
-{
-	return 0;
-}
-#endif  /* OPENSSL_IS_BORINGSSL */
-
-int
-eay_des_weakkey(key)
-	vchar_t *key;
-{
-#ifdef USE_NEW_DES_API
-	return DES_is_weak_key((void *)key->v);
-#else
-	return des_is_weak_key((void *)key->v);
-#endif
-}
-
-int
-eay_des_keylen(len)
-	int len;
-{
-	return evp_keylen(len, EVP_des_cbc());
-}
-
-#ifdef HAVE_OPENSSL_IDEA_H
-/*
- * IDEA-CBC
- */
-vchar_t *
-eay_idea_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	IDEA_KEY_SCHEDULE ks;
-
-	idea_set_encrypt_key((unsigned char *)key->v, &ks);
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* decryption data */
-	idea_cbc_encrypt((unsigned char *)data->v, (unsigned char *)res->v, data->l,
-			&ks, (unsigned char *)iv->v, IDEA_ENCRYPT);
-
-	return res;
-}
-
-vchar_t *
-eay_idea_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	IDEA_KEY_SCHEDULE ks, dks;
-
-	idea_set_encrypt_key((unsigned char *)key->v, &ks);
-	idea_set_decrypt_key(&ks, &dks);
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* decryption data */
-	idea_cbc_encrypt((unsigned char *)data->v, (unsigned char *)res->v, data->l,
-			&dks, (unsigned char *)iv->v, IDEA_DECRYPT);
-
-	return res;
-}
-
-int
-eay_idea_weakkey(key)
-	vchar_t *key;
-{
-	return 0;       /* XXX */
-}
-
-int
-eay_idea_keylen(len)
-	int len;
-{
-	if (len != 0 && len != 128)
-		return -1;
-	return 128;
-}
-#endif
-
-/*
- * BLOWFISH-CBC
- */
-vchar_t *
-eay_bf_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_bf_cbc(), 1);
-}
-
-vchar_t *
-eay_bf_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_bf_cbc(), 0);
-}
-
-int
-eay_bf_weakkey(key)
-	vchar_t *key;
-{
-	return 0;	/* XXX to be done. refer to RFC 2451 */
-}
-
-int
-eay_bf_keylen(len)
-	int len;
-{
-	if (len == 0)
-		return 448;
-	if (len < 40 || len > 448)
-		return -1;
-	return len;
-}
-
-#ifdef HAVE_OPENSSL_RC5_H
-/*
- * RC5-CBC
- */
-vchar_t *
-eay_rc5_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	RC5_32_KEY ks;
-
-	/* in RFC 2451, there is information about the number of round. */
-	RC5_32_set_key(&ks, key->l, (unsigned char *)key->v, 16);
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* decryption data */
-	RC5_32_cbc_encrypt((unsigned char *)data->v, (unsigned char *)res->v, data->l,
-		&ks, (unsigned char *)iv->v, RC5_ENCRYPT);
-
-	return res;
-}
-
-vchar_t *
-eay_rc5_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	RC5_32_KEY ks;
-
-	/* in RFC 2451, there is information about the number of round. */
-	RC5_32_set_key(&ks, key->l, (unsigned char *)key->v, 16);
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* decryption data */
-	RC5_32_cbc_encrypt((unsigned char *)data->v, (unsigned char *)res->v, data->l,
-		&ks, (unsigned char *)iv->v, RC5_DECRYPT);
-
-	return res;
-}
-
-int
-eay_rc5_weakkey(key)
-	vchar_t *key;
-{
-	return 0;       /* No known weak keys when used with 16 rounds. */
-
-}
-
-int
-eay_rc5_keylen(len)
-	int len;
-{
-	if (len == 0)
-		return 128;
-	if (len < 40 || len > 2040)
-		return -1;
-	return len;
-}
-#endif
-
-/*
- * 3DES-CBC
- */
-vchar_t *
-eay_3des_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_des_ede3_cbc(), 1);
-}
-
-vchar_t *
-eay_3des_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_des_ede3_cbc(), 0);
-}
-
-int
-eay_3des_weakkey(key)
-	vchar_t *key;
-{
-#ifdef USE_NEW_DES_API
-	return (DES_is_weak_key((void *)key->v) ||
-	    DES_is_weak_key((void *)(key->v + 8)) ||
-	    DES_is_weak_key((void *)(key->v + 16)));
-#else
-	if (key->l < 24)
-		return 0;
-
-	return (des_is_weak_key((void *)key->v) ||
-	    des_is_weak_key((void *)(key->v + 8)) ||
-	    des_is_weak_key((void *)(key->v + 16)));
-#endif
-}
-
-int
-eay_3des_keylen(len)
-	int len;
-{
-	if (len != 0 && len != 192)
-		return -1;
-	return 192;
-}
-
-/*
- * CAST-CBC
- */
-vchar_t *
-eay_cast_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_cast5_cbc(), 1);
-}
-
-vchar_t *
-eay_cast_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, EVP_cast5_cbc(), 0);
-}
-
-int
-eay_cast_weakkey(key)
-	vchar_t *key;
-{
-	return 0;	/* No known weak keys. */
-}
-
-int
-eay_cast_keylen(len)
-	int len;
-{
-	if (len == 0)
-		return 128;
-	if (len < 40 || len > 128)
-		return -1;
-	return len;
-}
-
-/*
- * AES(RIJNDAEL)-CBC
- */
-#ifndef HAVE_OPENSSL_AES_H
-vchar_t *
-eay_aes_encrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	keyInstance k;
-	cipherInstance c;
-
-	memset(&k, 0, sizeof(k));
-	if (rijndael_makeKey(&k, DIR_ENCRYPT, key->l << 3, key->v) < 0)
-		return NULL;
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* encryption data */
-	memset(&c, 0, sizeof(c));
-	if (rijndael_cipherInit(&c, MODE_CBC, iv->v) < 0){
-		vfree(res);
-		return NULL;
-	}
-	if (rijndael_blockEncrypt(&c, &k, data->v, data->l << 3, res->v) < 0){
-		vfree(res);
-		return NULL;
-	}
-
-	return res;
-}
-
-vchar_t *
-eay_aes_decrypt(data, key, iv)
-	vchar_t *data, *key, *iv;
-{
-	vchar_t *res;
-	keyInstance k;
-	cipherInstance c;
-
-	memset(&k, 0, sizeof(k));
-	if (rijndael_makeKey(&k, DIR_DECRYPT, key->l << 3, key->v) < 0)
-		return NULL;
-
-	/* allocate buffer for result */
-	if ((res = vmalloc(data->l)) == NULL)
-		return NULL;
-
-	/* decryption data */
-	memset(&c, 0, sizeof(c));
-	if (rijndael_cipherInit(&c, MODE_CBC, iv->v) < 0){
-		vfree(res);
-		return NULL;
-	}
-	if (rijndael_blockDecrypt(&c, &k, data->v, data->l << 3, res->v) < 0){
-		vfree(res);
-		return NULL;
-	}
-
-	return res;
-}
-#else
-static inline const EVP_CIPHER *
-aes_evp_by_keylen(int keylen)
-{
-	switch(keylen) {
-		case 16:
-		case 128:
-			return EVP_aes_128_cbc();
-#if !defined(ANDROID_CHANGES)
-		case 24:
-		case 192:
-			return EVP_aes_192_cbc();
-#endif
-		case 32:
-		case 256:
-			return EVP_aes_256_cbc();
-		default:
-			return NULL;
-	}
-}
-
-vchar_t *
-eay_aes_encrypt(data, key, iv)
-       vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, aes_evp_by_keylen(key->l), 1);
-}
-
-vchar_t *
-eay_aes_decrypt(data, key, iv)
-       vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, aes_evp_by_keylen(key->l), 0);
-}
-#endif
-
-int
-eay_aes_weakkey(key)
-	vchar_t *key;
-{
-	return 0;
-}
-
-int
-eay_aes_keylen(len)
-	int len;
-{
-	if (len == 0)
-		return 128;
-	if (len != 128 && len != 192 && len != 256)
-		return -1;
-	return len;
-}
-
-#if defined(HAVE_OPENSSL_CAMELLIA_H)
-/*
- * CAMELLIA-CBC
- */
-static inline const EVP_CIPHER *
-camellia_evp_by_keylen(int keylen)
-{
-	switch(keylen) {
-		case 16:
-		case 128:
-			return EVP_camellia_128_cbc();
-		case 24:
-		case 192:
-			return EVP_camellia_192_cbc();
-		case 32:
-		case 256:
-			return EVP_camellia_256_cbc();
-		default:
-			return NULL;
-	}
-}
-
-vchar_t *
-eay_camellia_encrypt(data, key, iv)
-       vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, camellia_evp_by_keylen(key->l), 1);
-}
-
-vchar_t *
-eay_camellia_decrypt(data, key, iv)
-       vchar_t *data, *key, *iv;
-{
-	return evp_crypt(data, key, iv, camellia_evp_by_keylen(key->l), 0);
-}
-
-int
-eay_camellia_weakkey(key)
-	vchar_t *key;
-{
-	return 0;
-}
-
-int
-eay_camellia_keylen(len)
-	int len;
-{
-	if (len == 0)
-		return 128;
-	if (len != 128 && len != 192 && len != 256)
-		return -1;
-	return len;
-}
-
-#endif
-
-/* for ipsec part */
-int
-eay_null_hashlen()
-{
-	return 0;
-}
-
-int
-eay_kpdk_hashlen()
-{
-	return 0;
-}
-
-int
-eay_twofish_keylen(len)
-	int len;
-{
-	if (len < 0 || len > 256)
-		return -1;
-	return len;
-}
-
-int
-eay_null_keylen(len)
-	int len;
-{
-	return 0;
-}
-
-/*
- * HMAC functions
- */
-static caddr_t
-eay_hmac_init(key, md)
-	vchar_t *key;
-	const EVP_MD *md;
-{
-	HMAC_CTX *c = racoon_malloc(sizeof(*c));
-
-	HMAC_Init(c, key->v, key->l, md);
-
-	return (caddr_t)c;
-}
-
-#ifdef WITH_SHA2
-/*
- * HMAC SHA2-512
- */
-vchar_t *
-eay_hmacsha2_512_one(key, data)
-	vchar_t *key, *data;
-{
-	vchar_t *res;
-	caddr_t ctx;
-
-	ctx = eay_hmacsha2_512_init(key);
-	eay_hmacsha2_512_update(ctx, data);
-	res = eay_hmacsha2_512_final(ctx);
-
-	return(res);
-}
-
-caddr_t
-eay_hmacsha2_512_init(key)
-	vchar_t *key;
-{
-	return eay_hmac_init(key, EVP_sha2_512());
-}
-
-void
-eay_hmacsha2_512_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	HMAC_Update((HMAC_CTX *)c, (unsigned char *) data->v, data->l);
-}
-
-vchar_t *
-eay_hmacsha2_512_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-	unsigned int l;
-
-	if ((res = vmalloc(SHA512_DIGEST_LENGTH)) == 0)
-		return NULL;
-
-	HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l);
-	res->l = l;
-	HMAC_cleanup((HMAC_CTX *)c);
-	(void)racoon_free(c);
-
-	if (SHA512_DIGEST_LENGTH != res->l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"hmac sha2_512 length mismatch %zd.\n", res->l);
-		vfree(res);
-		return NULL;
-	}
-
-	return(res);
-}
-
-/*
- * HMAC SHA2-384
- */
-vchar_t *
-eay_hmacsha2_384_one(key, data)
-	vchar_t *key, *data;
-{
-	vchar_t *res;
-	caddr_t ctx;
-
-	ctx = eay_hmacsha2_384_init(key);
-	eay_hmacsha2_384_update(ctx, data);
-	res = eay_hmacsha2_384_final(ctx);
-
-	return(res);
-}
-
-caddr_t
-eay_hmacsha2_384_init(key)
-	vchar_t *key;
-{
-	return eay_hmac_init(key, EVP_sha2_384());
-}
-
-void
-eay_hmacsha2_384_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	HMAC_Update((HMAC_CTX *)c, (unsigned char *) data->v, data->l);
-}
-
-vchar_t *
-eay_hmacsha2_384_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-	unsigned int l;
-
-	if ((res = vmalloc(SHA384_DIGEST_LENGTH)) == 0)
-		return NULL;
-
-	HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l);
-	res->l = l;
-	HMAC_cleanup((HMAC_CTX *)c);
-	(void)racoon_free(c);
-
-	if (SHA384_DIGEST_LENGTH != res->l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"hmac sha2_384 length mismatch %zd.\n", res->l);
-		vfree(res);
-		return NULL;
-	}
-
-	return(res);
-}
-
-/*
- * HMAC SHA2-256
- */
-vchar_t *
-eay_hmacsha2_256_one(key, data)
-	vchar_t *key, *data;
-{
-	vchar_t *res;
-	caddr_t ctx;
-
-	ctx = eay_hmacsha2_256_init(key);
-	eay_hmacsha2_256_update(ctx, data);
-	res = eay_hmacsha2_256_final(ctx);
-
-	return(res);
-}
-
-caddr_t
-eay_hmacsha2_256_init(key)
-	vchar_t *key;
-{
-	return eay_hmac_init(key, EVP_sha2_256());
-}
-
-void
-eay_hmacsha2_256_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	HMAC_Update((HMAC_CTX *)c, (unsigned char *) data->v, data->l);
-}
-
-vchar_t *
-eay_hmacsha2_256_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-	unsigned int l;
-
-	if ((res = vmalloc(SHA256_DIGEST_LENGTH)) == 0)
-		return NULL;
-
-	HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l);
-	res->l = l;
-	HMAC_cleanup((HMAC_CTX *)c);
-	(void)racoon_free(c);
-
-	if (SHA256_DIGEST_LENGTH != res->l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"hmac sha2_256 length mismatch %zd.\n", res->l);
-		vfree(res);
-		return NULL;
-	}
-
-	return(res);
-}
-#endif	/* WITH_SHA2 */
-
-/*
- * HMAC SHA1
- */
-vchar_t *
-eay_hmacsha1_one(key, data)
-	vchar_t *key, *data;
-{
-	vchar_t *res;
-	caddr_t ctx;
-
-	ctx = eay_hmacsha1_init(key);
-	eay_hmacsha1_update(ctx, data);
-	res = eay_hmacsha1_final(ctx);
-
-	return(res);
-}
-
-caddr_t
-eay_hmacsha1_init(key)
-	vchar_t *key;
-{
-	return eay_hmac_init(key, EVP_sha1());
-}
-
-void
-eay_hmacsha1_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	HMAC_Update((HMAC_CTX *)c, (unsigned char *) data->v, data->l);
-}
-
-vchar_t *
-eay_hmacsha1_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-	unsigned int l;
-
-	if ((res = vmalloc(SHA_DIGEST_LENGTH)) == 0)
-		return NULL;
-
-	HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l);
-	res->l = l;
-	HMAC_cleanup((HMAC_CTX *)c);
-	(void)racoon_free(c);
-
-	if (SHA_DIGEST_LENGTH != res->l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"hmac sha1 length mismatch %zd.\n", res->l);
-		vfree(res);
-		return NULL;
-	}
-
-	return(res);
-}
-
-/*
- * HMAC MD5
- */
-vchar_t *
-eay_hmacmd5_one(key, data)
-	vchar_t *key, *data;
-{
-	vchar_t *res;
-	caddr_t ctx;
-
-	ctx = eay_hmacmd5_init(key);
-	eay_hmacmd5_update(ctx, data);
-	res = eay_hmacmd5_final(ctx);
-
-	return(res);
-}
-
-caddr_t
-eay_hmacmd5_init(key)
-	vchar_t *key;
-{
-	return eay_hmac_init(key, EVP_md5());
-}
-
-void
-eay_hmacmd5_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	HMAC_Update((HMAC_CTX *)c, (unsigned char *) data->v, data->l);
-}
-
-vchar_t *
-eay_hmacmd5_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-	unsigned int l;
-
-	if ((res = vmalloc(MD5_DIGEST_LENGTH)) == 0)
-		return NULL;
-
-	HMAC_Final((HMAC_CTX *)c, (unsigned char *) res->v, &l);
-	res->l = l;
-	HMAC_cleanup((HMAC_CTX *)c);
-	(void)racoon_free(c);
-
-	if (MD5_DIGEST_LENGTH != res->l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"hmac md5 length mismatch %zd.\n", res->l);
-		vfree(res);
-		return NULL;
-	}
-
-	return(res);
-}
-
-#ifdef WITH_SHA2
-/*
- * SHA2-512 functions
- */
-caddr_t
-eay_sha2_512_init()
-{
-	SHA512_CTX *c = racoon_malloc(sizeof(*c));
-
-	SHA512_Init(c);
-
-	return((caddr_t)c);
-}
-
-void
-eay_sha2_512_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	SHA512_Update((SHA512_CTX *)c, (unsigned char *) data->v, data->l);
-
-	return;
-}
-
-vchar_t *
-eay_sha2_512_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-
-	if ((res = vmalloc(SHA512_DIGEST_LENGTH)) == 0)
-		return(0);
-
-	SHA512_Final((unsigned char *) res->v, (SHA512_CTX *)c);
-	(void)racoon_free(c);
-
-	return(res);
-}
-
-vchar_t *
-eay_sha2_512_one(data)
-	vchar_t *data;
-{
-	caddr_t ctx;
-	vchar_t *res;
-
-	ctx = eay_sha2_512_init();
-	eay_sha2_512_update(ctx, data);
-	res = eay_sha2_512_final(ctx);
-
-	return(res);
-}
-
-int
-eay_sha2_512_hashlen()
-{
-	return SHA512_DIGEST_LENGTH << 3;
-}
-#endif
-
-#ifdef WITH_SHA2
-/*
- * SHA2-384 functions
- */
-caddr_t
-eay_sha2_384_init()
-{
-	SHA384_CTX *c = racoon_malloc(sizeof(*c));
-
-	SHA384_Init(c);
-
-	return((caddr_t)c);
-}
-
-void
-eay_sha2_384_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	SHA384_Update((SHA384_CTX *)c, (unsigned char *) data->v, data->l);
-
-	return;
-}
-
-vchar_t *
-eay_sha2_384_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-
-	if ((res = vmalloc(SHA384_DIGEST_LENGTH)) == 0)
-		return(0);
-
-	SHA384_Final((unsigned char *) res->v, (SHA384_CTX *)c);
-	(void)racoon_free(c);
-
-	return(res);
-}
-
-vchar_t *
-eay_sha2_384_one(data)
-	vchar_t *data;
-{
-	caddr_t ctx;
-	vchar_t *res;
-
-	ctx = eay_sha2_384_init();
-	eay_sha2_384_update(ctx, data);
-	res = eay_sha2_384_final(ctx);
-
-	return(res);
-}
-
-int
-eay_sha2_384_hashlen()
-{
-	return SHA384_DIGEST_LENGTH << 3;
-}
-#endif
-
-#ifdef WITH_SHA2
-/*
- * SHA2-256 functions
- */
-caddr_t
-eay_sha2_256_init()
-{
-	SHA256_CTX *c = racoon_malloc(sizeof(*c));
-
-	SHA256_Init(c);
-
-	return((caddr_t)c);
-}
-
-void
-eay_sha2_256_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	SHA256_Update((SHA256_CTX *)c, (unsigned char *) data->v, data->l);
-
-	return;
-}
-
-vchar_t *
-eay_sha2_256_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-
-	if ((res = vmalloc(SHA256_DIGEST_LENGTH)) == 0)
-		return(0);
-
-	SHA256_Final((unsigned char *) res->v, (SHA256_CTX *)c);
-	(void)racoon_free(c);
-
-	return(res);
-}
-
-vchar_t *
-eay_sha2_256_one(data)
-	vchar_t *data;
-{
-	caddr_t ctx;
-	vchar_t *res;
-
-	ctx = eay_sha2_256_init();
-	eay_sha2_256_update(ctx, data);
-	res = eay_sha2_256_final(ctx);
-
-	return(res);
-}
-
-int
-eay_sha2_256_hashlen()
-{
-	return SHA256_DIGEST_LENGTH << 3;
-}
-#endif
-
-/*
- * SHA functions
- */
-caddr_t
-eay_sha1_init()
-{
-	SHA_CTX *c = racoon_malloc(sizeof(*c));
-
-	SHA1_Init(c);
-
-	return((caddr_t)c);
-}
-
-void
-eay_sha1_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	SHA1_Update((SHA_CTX *)c, data->v, data->l);
-
-	return;
-}
-
-vchar_t *
-eay_sha1_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-
-	if ((res = vmalloc(SHA_DIGEST_LENGTH)) == 0)
-		return(0);
-
-	SHA1_Final((unsigned char *) res->v, (SHA_CTX *)c);
-	(void)racoon_free(c);
-
-	return(res);
-}
-
-vchar_t *
-eay_sha1_one(data)
-	vchar_t *data;
-{
-	caddr_t ctx;
-	vchar_t *res;
-
-	ctx = eay_sha1_init();
-	eay_sha1_update(ctx, data);
-	res = eay_sha1_final(ctx);
-
-	return(res);
-}
-
-int
-eay_sha1_hashlen()
-{
-	return SHA_DIGEST_LENGTH << 3;
-}
-
-/*
- * MD5 functions
- */
-caddr_t
-eay_md5_init()
-{
-	MD5_CTX *c = racoon_malloc(sizeof(*c));
-
-	MD5_Init(c);
-
-	return((caddr_t)c);
-}
-
-void
-eay_md5_update(c, data)
-	caddr_t c;
-	vchar_t *data;
-{
-	MD5_Update((MD5_CTX *)c, data->v, data->l);
-
-	return;
-}
-
-vchar_t *
-eay_md5_final(c)
-	caddr_t c;
-{
-	vchar_t *res;
-
-	if ((res = vmalloc(MD5_DIGEST_LENGTH)) == 0)
-		return(0);
-
-	MD5_Final((unsigned char *) res->v, (MD5_CTX *)c);
-	(void)racoon_free(c);
-
-	return(res);
-}
-
-vchar_t *
-eay_md5_one(data)
-	vchar_t *data;
-{
-	caddr_t ctx;
-	vchar_t *res;
-
-	ctx = eay_md5_init();
-	eay_md5_update(ctx, data);
-	res = eay_md5_final(ctx);
-
-	return(res);
-}
-
-int
-eay_md5_hashlen()
-{
-	return MD5_DIGEST_LENGTH << 3;
-}
-
-/*
- * eay_set_random
- *   size: number of bytes.
- */
-vchar_t *
-eay_set_random(size)
-	u_int32_t size;
-{
-	BIGNUM *r = NULL;
-	vchar_t *res = 0;
-
-	if ((r = BN_new()) == NULL)
-		goto end;
-	BN_rand(r, size * 8, 0, 0);
-	eay_bn2v(&res, r);
-
-end:
-	if (r)
-		BN_free(r);
-	return(res);
-}
-
-/* DH */
-int
-eay_dh_generate(prime, g, publen, pub, priv)
-	vchar_t *prime, **pub, **priv;
-	u_int publen;
-	u_int32_t g;
-{
-	BIGNUM *p = NULL, *g_bn = NULL;
-	DH *dh = NULL;
-	int error = -1;
-
-	/* initialize */
-	/* pre-process to generate number */
-	if (eay_v2bn(&p, prime) < 0)
-		goto end;
-
-	if ((dh = DH_new()) == NULL)
-		goto end;
-	if ((g_bn = BN_new()) == NULL)
-		goto end;
-	if (!BN_set_word(g_bn, g))
-		goto end;
-	if (!DH_set0_pqg(dh, p, NULL, g_bn))
-		goto end;
-	/* DH_set0_pqg takes ownership on success. */
-	p = NULL;
-	g_bn = NULL;
-
-	if (publen != 0) {
-		DH_set_length(dh, publen);
-	}
-
-	/* generate public and private number */
-	if (!DH_generate_key(dh))
-		goto end;
-
-	/* copy results to buffers */
-	if (eay_bn2v(pub, DH_get0_pub_key(dh)) < 0)
-		goto end;
-	if (eay_bn2v(priv, DH_get0_priv_key(dh)) < 0) {
-		vfree(*pub);
-		goto end;
-	}
-
-	error = 0;
-
-end:
-	if (dh != NULL)
-		DH_free(dh);
-	if (p != NULL)
-		BN_free(p);
-	if (g_bn != NULL)
-		BN_free(g_bn);
-	return(error);
-}
-
-int
-eay_dh_compute(prime, g, pub, priv, pub2, key)
-	vchar_t *prime, *pub, *priv, *pub2, **key;
-	u_int32_t g;
-{
-	BIGNUM *dh_pub = NULL;
-	BIGNUM *dh_pub2 = NULL;
-	BIGNUM *dh_priv = NULL;
-	BIGNUM *dh_p = NULL;
-	BIGNUM *dh_g = NULL;
-	DH *dh = NULL;
-	int l;
-	unsigned char *v = NULL;
-	int error = -1;
-
-	/* make public number to compute */
-	if (eay_v2bn(&dh_pub2, pub2) < 0)
-		goto end;
-
-	/* make DH structure */
-	if ((dh = DH_new()) == NULL)
-		goto end;
-	if (eay_v2bn(&dh_p, prime) < 0)
-		goto end;
-	if (eay_v2bn(&dh_pub, pub) < 0)
-		goto end;
-	if (eay_v2bn(&dh_priv, priv) < 0)
-		goto end;
-	DH_set_length(dh, pub2->l * 8);
-
-	if ((dh_g = BN_new()) == NULL)
-		goto end;
-	if (!BN_set_word(dh_g, g))
-		goto end;
-	if (!DH_set0_pqg(dh, dh_p, NULL, dh_g))
-		goto end;
-	/* DH_set0_pqg takes ownership on success. */
-	dh_p = NULL;
-	dh_g = NULL;
-	if (!DH_set0_key(dh, dh_pub, dh_priv))
-		goto end;
-	/* DH_set0_key takes ownership on success. */
-	dh_pub = NULL;
-	dh_priv = NULL;
-
-	if ((v = racoon_calloc(prime->l, sizeof(u_char))) == NULL)
-		goto end;
-	if ((l = DH_compute_key(v, dh_pub2, dh)) == -1)
-		goto end;
-	memcpy((*key)->v + (prime->l - l), v, l);
-
-	error = 0;
-
-end:
-	if (dh_pub != NULL)
-		BN_free(dh_pub);
-	if (dh_pub2 != NULL)
-		BN_free(dh_pub2);
-	if (dh_priv != NULL)
-		BN_free(dh_priv);
-	if (dh_p != NULL)
-		BN_free(dh_p);
-	if (dh_g != NULL)
-		BN_free(dh_g);
-	if (dh != NULL)
-		DH_free(dh);
-	if (v != NULL)
-		racoon_free(v);
-	return(error);
-}
-
-/*
- * convert vchar_t <-> BIGNUM.
- *
- * vchar_t: unit is u_char, network endian, most significant byte first.
- * BIGNUM: unit is BN_ULONG, each of BN_ULONG is in host endian,
- *	least significant BN_ULONG must come first.
- *
- * hex value of "0x3ffe050104" is represented as follows:
- *	vchar_t: 3f fe 05 01 04
- *	BIGNUM (BN_ULONG = u_int8_t): 04 01 05 fe 3f
- *	BIGNUM (BN_ULONG = u_int16_t): 0x0104 0xfe05 0x003f
- *	BIGNUM (BN_ULONG = u_int32_t_t): 0xfe050104 0x0000003f
- */
-int
-eay_v2bn(bn, var)
-	BIGNUM **bn;
-	vchar_t *var;
-{
-	if ((*bn = BN_bin2bn((unsigned char *) var->v, var->l, NULL)) == NULL)
-		return -1;
-
-	return 0;
-}
-
-int
-eay_bn2v(var, bn)
-	vchar_t **var;
-	const BIGNUM *bn;
-{
-#if defined(ANDROID_CHANGES)
-	*var = vmalloc(BN_num_bytes(bn));
-#else
-	*var = vmalloc(bn->top * BN_BYTES);
-#endif
-	if (*var == NULL)
-		return(-1);
-
-	(*var)->l = BN_bn2bin(bn, (unsigned char *) (*var)->v);
-
-	return 0;
-}
-
-void
-eay_init()
-{
-	OpenSSL_add_all_algorithms();
-	ERR_load_crypto_strings();
-#ifdef HAVE_OPENSSL_ENGINE_H
-	ENGINE_load_builtin_engines();
-	ENGINE_register_all_complete();
-#endif
-}
-
-vchar_t *
-base64_decode(char *in, long inlen)
-{
-#if defined(OPENSSL_IS_BORINGSSL)
-	vchar_t *res;
-	size_t decoded_size;
-
-	if (!EVP_DecodedLength(&decoded_size, inlen)) {
-		return NULL;
-	}
-	res = vmalloc(decoded_size);
-	if (res == NULL) {
-		return NULL;
-	}
-	if (!EVP_DecodeBase64((uint8_t*) res->v, &res->l, decoded_size, (uint8_t*) in, inlen)) {
-		vfree(res);
-		return NULL;
-	}
-	return res;
-#else
-	BIO *bio=NULL, *b64=NULL;
-	vchar_t *res = NULL;
-	char *outb;
-	long outlen;
-
-	outb = malloc(inlen * 2);
-	if (outb == NULL)
-		goto out;
-	bio = BIO_new_mem_buf(in, inlen);
-	b64 = BIO_new(BIO_f_base64());
-	BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-	bio = BIO_push(b64, bio);
-
-	outlen = BIO_read(bio, outb, inlen * 2);
-	if (outlen <= 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "%s\n", eay_strerror());
-		goto out;
-	}
-
-	res = vmalloc(outlen);
-	if (!res)
-		goto out;
-
-	memcpy(res->v, outb, outlen);
-
-out:
-	if (outb)
-		free(outb);
-	if (bio)
-		BIO_free_all(bio);
-
-	return res;
-#endif
-}
-
-vchar_t *
-base64_encode(char *in, long inlen)
-{
-#if defined(OPENSSL_IS_BORINGSSL)
-	vchar_t *res;
-	size_t encoded_size;
-
-	if (!EVP_EncodedLength(&encoded_size, inlen)) {
-		return NULL;
-	}
-	res = vmalloc(encoded_size+1);
-	if (res == NULL) {
-		return NULL;
-	}
-	EVP_EncodeBlock((uint8_t*) res->v, (uint8_t*) in, inlen);
-	res->v[encoded_size] = 0;
-	return res;
-#else
-	BIO *bio=NULL, *b64=NULL;
-	char *ptr;
-	long plen = -1;
-	vchar_t *res = NULL;
-
-	bio = BIO_new(BIO_s_mem());
-	b64 = BIO_new(BIO_f_base64());
-	BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
-	bio = BIO_push(b64, bio);
-
-	BIO_write(bio, in, inlen);
-	BIO_flush(bio);
-
-	plen = BIO_get_mem_data(bio, &ptr);
-	res = vmalloc(plen+1);
-	if (!res)
-		goto out;
-	
-	memcpy (res->v, ptr, plen);
-	res->v[plen] = '\0';
-
-out:	
-	if (bio)
-		BIO_free_all(bio);
-
-	return res;
-#endif
-}
-
-static RSA *
-binbuf_pubkey2rsa(vchar_t *binbuf)
-{
-	BIGNUM *exp, *mod;
-	RSA *rsa_pub = NULL;
-
-	if (binbuf->v[0] > binbuf->l - 1) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey format error: decoded string doesn't make sense.\n");
-		goto out;
-	}
-
-	exp = BN_bin2bn((unsigned char *) (binbuf->v + 1), binbuf->v[0], NULL);
-	mod = BN_bin2bn((unsigned char *) (binbuf->v + binbuf->v[0] + 1), 
-			binbuf->l - binbuf->v[0] - 1, NULL);
-	rsa_pub = RSA_new();
-
-	if (!exp || !mod || !rsa_pub || !RSA_set0_key(rsa_pub, mod, exp, NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey parsing error: %s\n", eay_strerror());
-		if (exp)
-			BN_free(exp);
-		if (mod)
-			BN_free(exp);
-		if (rsa_pub)
-			RSA_free(rsa_pub);
-		rsa_pub = NULL;
-		goto out;
-	}
-	/* RSA_set0_key takes ownership of mod and exp on success. */
-	
-out:
-	return rsa_pub;
-}
-
-RSA *
-base64_pubkey2rsa(char *in)
-{
-	BIGNUM *exp, *mod;
-	RSA *rsa_pub = NULL;
-	vchar_t *binbuf;
-
-	if (strncmp(in, "0s", 2) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey format error: doesn't start with '0s'\n");
-		return NULL;
-	}
-
-	binbuf = base64_decode(in + 2, strlen(in + 2));
-	if (!binbuf) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey format error: Base64 decoding failed.\n");
-		return NULL;
-	}
-	
-	if (binbuf->v[0] > binbuf->l - 1) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey format error: decoded string doesn't make sense.\n");
-		goto out;
-	}
-
-	rsa_pub = binbuf_pubkey2rsa(binbuf);
-
-out:
-	if (binbuf)
-		vfree(binbuf);
-
-	return rsa_pub;
-}
-
-RSA *
-bignum_pubkey2rsa(BIGNUM *in)
-{
-	RSA *rsa_pub = NULL;
-	vchar_t *binbuf;
-
-	binbuf = vmalloc(BN_num_bytes(in));
-	if (!binbuf) {
-		plog(LLV_ERROR, LOCATION, NULL, "Plain RSA pubkey conversion: memory allocation failed..\n");
-		return NULL;
-	}
-	
-	BN_bn2bin(in, (unsigned char *) binbuf->v);
-
-	rsa_pub = binbuf_pubkey2rsa(binbuf);
-
-out:
-	if (binbuf)
-		vfree(binbuf);
-
-	return rsa_pub;
-}
-
-u_int32_t
-eay_random()
-{
-	u_int32_t result;
-	vchar_t *vrand;
-
-	vrand = eay_set_random(sizeof(result));
-	memcpy(&result, vrand->v, sizeof(result));
-	vfree(vrand);
-
-	return result;
-}
-
-const char *
-eay_version()
-{
-#if defined(OPENSSL_IS_BORINGSSL)
-	return "(BoringSSL)";
-#else
-	return SSLeay_version(SSLEAY_VERSION);
-#endif
-}
diff --git a/src/racoon/crypto_openssl.h b/src/racoon/crypto_openssl.h
deleted file mode 100644
index 983ffe5..0000000
--- a/src/racoon/crypto_openssl.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*	$NetBSD: crypto_openssl.h,v 1.5 2006/10/06 12:02:27 manu Exp $	*/
-
-/* Id: crypto_openssl.h,v 1.11 2004/11/13 11:28:01 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _CRYPTO_OPENSSL_H
-#define _CRYPTO_OPENSSL_H
-
-#include "crypto_openssl.h"
-
-#include <openssl/x509v3.h>
-#include <openssl/rsa.h>
-
-#define GENT_OTHERNAME	GEN_OTHERNAME
-#define GENT_EMAIL	GEN_EMAIL
-#define GENT_DNS	GEN_DNS
-#define GENT_X400	GEN_X400
-#define GENT_DIRNAME	GEN_DIRNAME
-#define GENT_EDIPARTY	GEN_EDIPARTY
-#define GENT_URI	GEN_URI
-#define GENT_IPADD	GEN_IPADD
-#define GENT_RID	GEN_RID
-
-extern vchar_t *eay_str2asn1dn __P((const char *, int));
-extern vchar_t *eay_hex2asn1dn __P((const char *, int));
-extern int eay_cmp_asn1dn __P((vchar_t *, vchar_t *));
-extern int eay_check_x509cert __P((vchar_t *, char *, char *, int));
-extern vchar_t *eay_get_x509asn1subjectname __P((vchar_t *));
-extern int eay_get_x509subjectaltname __P((vchar_t *, char **, int *, int));
-extern char *eay_get_x509text __P((vchar_t *));
-extern vchar_t *eay_get_x509cert __P((char *));
-extern vchar_t *eay_get_x509sign __P((vchar_t *, vchar_t *));
-extern int eay_check_x509sign __P((vchar_t *, vchar_t *, vchar_t *));
-
-extern int eay_check_rsasign __P((vchar_t *, vchar_t *, RSA *));
-extern vchar_t *eay_get_rsasign __P((vchar_t *, RSA *));
-
-/* RSA */
-extern vchar_t *eay_rsa_sign __P((vchar_t *, RSA *));
-extern int eay_rsa_verify __P((vchar_t *, vchar_t *, RSA *));
-
-/* ASN.1 */
-extern vchar_t *eay_get_pkcs1privkey __P((char *));
-extern vchar_t *eay_get_pkcs1pubkey __P((char *));
-
-/* string error */
-extern char *eay_strerror __P((void));
-
-/* OpenSSL initialization */
-extern void eay_init __P((void));
-
-/* Generic EVP */
-extern vchar_t *evp_crypt __P((vchar_t *data, vchar_t *key, vchar_t *iv,
-			       const EVP_CIPHER *e, int enc));
-extern int evp_weakkey __P((vchar_t *key, const EVP_CIPHER *e));
-extern int evp_keylen __P((int len, const EVP_CIPHER *e));
-
-/* DES */
-extern vchar_t *eay_des_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_des_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_des_weakkey __P((vchar_t *));
-extern int eay_des_keylen __P((int));
-
-/* IDEA */
-extern vchar_t *eay_idea_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_idea_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_idea_weakkey __P((vchar_t *));
-extern int eay_idea_keylen __P((int));
-
-/* blowfish */
-extern vchar_t *eay_bf_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_bf_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_bf_weakkey __P((vchar_t *));
-extern int eay_bf_keylen __P((int));
-
-/* RC5 */
-extern vchar_t *eay_rc5_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_rc5_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_rc5_weakkey __P((vchar_t *));
-extern int eay_rc5_keylen __P((int));
-
-/* 3DES */
-extern vchar_t *eay_3des_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_3des_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_3des_weakkey __P((vchar_t *));
-extern int eay_3des_keylen __P((int));
-
-/* CAST */
-extern vchar_t *eay_cast_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_cast_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_cast_weakkey __P((vchar_t *));
-extern int eay_cast_keylen __P((int));
-
-/* AES(RIJNDAEL) */
-extern vchar_t *eay_aes_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_aes_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_aes_weakkey __P((vchar_t *));
-extern int eay_aes_keylen __P((int));
-
-#if defined(HAVE_OPENSSL_CAMELLIA_H)
-/* Camellia */
-extern vchar_t *eay_camellia_encrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *eay_camellia_decrypt __P((vchar_t *, vchar_t *, vchar_t *));
-extern int eay_camellia_weakkey __P((vchar_t *));
-extern int eay_camellia_keylen __P((int));
-#endif
-
-/* misc */
-extern int eay_null_keylen __P((int));
-extern int eay_null_hashlen __P((void));
-extern int eay_kpdk_hashlen __P((void));
-extern int eay_twofish_keylen __P((int));
-
-/* hash */
-#if defined(WITH_SHA2)
-/* HMAC SHA2 */
-extern vchar_t *eay_hmacsha2_512_one __P((vchar_t *, vchar_t *));
-extern caddr_t eay_hmacsha2_512_init __P((vchar_t *));
-extern void eay_hmacsha2_512_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_hmacsha2_512_final __P((caddr_t));
-extern vchar_t *eay_hmacsha2_384_one __P((vchar_t *, vchar_t *));
-extern caddr_t eay_hmacsha2_384_init __P((vchar_t *));
-extern void eay_hmacsha2_384_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_hmacsha2_384_final __P((caddr_t));
-extern vchar_t *eay_hmacsha2_256_one __P((vchar_t *, vchar_t *));
-extern caddr_t eay_hmacsha2_256_init __P((vchar_t *));
-extern void eay_hmacsha2_256_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_hmacsha2_256_final __P((caddr_t));
-#endif
-/* HMAC SHA1 */
-extern vchar_t *eay_hmacsha1_one __P((vchar_t *, vchar_t *));
-extern caddr_t eay_hmacsha1_init __P((vchar_t *));
-extern void eay_hmacsha1_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_hmacsha1_final __P((caddr_t));
-/* HMAC MD5 */
-extern vchar_t *eay_hmacmd5_one __P((vchar_t *, vchar_t *));
-extern caddr_t eay_hmacmd5_init __P((vchar_t *));
-extern void eay_hmacmd5_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_hmacmd5_final __P((caddr_t));
-
-#if defined(WITH_SHA2)
-/* SHA2 functions */
-extern caddr_t eay_sha2_512_init __P((void));
-extern void eay_sha2_512_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_sha2_512_final __P((caddr_t));
-extern vchar_t *eay_sha2_512_one __P((vchar_t *));
-#endif
-extern int eay_sha2_512_hashlen __P((void));
-
-#if defined(WITH_SHA2)
-extern caddr_t eay_sha2_384_init __P((void));
-extern void eay_sha2_384_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_sha2_384_final __P((caddr_t));
-extern vchar_t *eay_sha2_384_one __P((vchar_t *));
-#endif
-extern int eay_sha2_384_hashlen __P((void));
-
-#if defined(WITH_SHA2)
-extern caddr_t eay_sha2_256_init __P((void));
-extern void eay_sha2_256_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_sha2_256_final __P((caddr_t));
-extern vchar_t *eay_sha2_256_one __P((vchar_t *));
-#endif
-extern int eay_sha2_256_hashlen __P((void));
-
-/* SHA functions */
-extern caddr_t eay_sha1_init __P((void));
-extern void eay_sha1_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_sha1_final __P((caddr_t));
-extern vchar_t *eay_sha1_one __P((vchar_t *));
-extern int eay_sha1_hashlen __P((void));
-
-/* MD5 functions */
-extern caddr_t eay_md5_init __P((void));
-extern void eay_md5_update __P((caddr_t, vchar_t *));
-extern vchar_t *eay_md5_final __P((caddr_t));
-extern vchar_t *eay_md5_one __P((vchar_t *));
-extern int eay_md5_hashlen __P((void));
-
-/* RNG */
-extern vchar_t *eay_set_random __P((u_int32_t));
-extern u_int32_t eay_random __P((void));
-
-/* DH */
-extern int eay_dh_generate __P((vchar_t *, u_int32_t, u_int, vchar_t **, vchar_t **));
-extern int eay_dh_compute __P((vchar_t *, u_int32_t, vchar_t *, vchar_t *, vchar_t *, vchar_t **));
-
-/* Base 64 */
-vchar_t *base64_encode(char *in, long inlen);
-vchar_t *base64_decode(char *in, long inlen);
-
-RSA *base64_pubkey2rsa(char *in);
-RSA *bignum_pubkey2rsa(BIGNUM *in);
-
-/* misc */
-extern int eay_revbnl __P((vchar_t *));
-#include <openssl/bn.h>
-extern int eay_v2bn __P((BIGNUM **, vchar_t *));
-extern int eay_bn2v __P((vchar_t **, const BIGNUM *));
-
-extern const char *eay_version __P((void));
-
-#define CBC_BLOCKLEN 8
-#define IPSEC_ENCRYPTKEYLEN 8
-
-#endif /* _CRYPTO_OPENSSL_H */
diff --git a/src/racoon/debug.h b/src/racoon/debug.h
deleted file mode 100644
index 47c2641..0000000
--- a/src/racoon/debug.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*	$NetBSD: debug.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: debug.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _DEBUG_H
-#define _DEBUG_H
-
-/* define by main.c */
-extern int f_local;
-extern int vflag;
-
-#endif /* _DEBUG_H */
diff --git a/src/racoon/debugrm.h b/src/racoon/debugrm.h
deleted file mode 100644
index 6a2f411..0000000
--- a/src/racoon/debugrm.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*	$NetBSD: debugrm.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: debugrm.h,v 1.4 2006/04/06 14:00:06 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _DEBUGRM_H
-#define _DEBUGRM_H
-
-#define DRMDUMPFILE	"/var/tmp/debugrm.dump"
-
-#ifdef NONEED_DRM
-#ifndef racoon_malloc
-#define	racoon_malloc(sz)	malloc((sz))
-#endif
-#ifndef racoon_calloc
-#define	racoon_calloc(cnt, sz)	calloc((cnt), (sz))
-#endif
-#ifndef racoon_realloc
-#define	racoon_realloc(old, sz)	realloc((old), (sz))
-#endif
-#ifndef racoon_free
-#define	racoon_free(p)		free((p))
-#endif
-#ifndef racoon_strdup
-#define	racoon_strdup(p)	strdup((p))
-#endif
-#else /*!NONEED_DRM*/
-#ifndef racoon_malloc
-#define	racoon_malloc(sz)	\
-	DRM_malloc(__FILE__, __LINE__, __func__, (sz))
-#endif
-#ifndef racoon_calloc
-#define	racoon_calloc(cnt, sz)	\
-	DRM_calloc(__FILE__, __LINE__, __func__, (cnt), (sz))
-#endif
-#ifndef racoon_realloc
-#define	racoon_realloc(old, sz)	\
-	DRM_realloc(__FILE__, __LINE__, __func__, (old), (sz))
-#endif
-#ifndef racoon_free
-#define	racoon_free(p)		\
-	DRM_free(__FILE__, __LINE__, __func__, (p))
-#endif
-#ifndef racoon_strdup
-#define	racoon_strdup(p)	\
-	DRM_strdup(__FILE__, __LINE__, __func__, (p))
-#endif
-#endif /*NONEED_DRM*/
-
-extern void DRM_init __P((void));
-extern void DRM_dump __P((void));
-extern void *DRM_malloc __P((char *, int, char *, size_t));
-extern void *DRM_calloc __P((char *, int, char *, size_t, size_t));
-extern void *DRM_realloc __P((char *, int, char *, void *, size_t));
-extern void DRM_free __P((char *, int, char *, void *));
-extern char *DRM_strdup __P((char *, int, char *, const char *));
-
-#ifndef NONEED_DRM
-#define	vmalloc(sz)	\
-	DRM_vmalloc(__FILE__, __LINE__, __func__, (sz))
-#define	vdup(old)	\
-	DRM_vdup(__FILE__, __LINE__, __func__, (old))
-#define	vrealloc(old, sz)	\
-	DRM_vrealloc(__FILE__, __LINE__, __func__, (old), (sz))
-#define	vfree(p)		\
-	DRM_vfree(__FILE__, __LINE__, __func__, (p))
-#endif
-
-extern void *DRM_vmalloc __P((char *, int, char *, size_t));
-extern void *DRM_vrealloc __P((char *, int, char *, void *, size_t));
-extern void DRM_vfree __P((char *, int, char *, void *));
-extern void *DRM_vdup __P((char *, int, char *, void *));
-
-#endif /* _DEBUGRM_H */
diff --git a/src/racoon/dhgroup.h b/src/racoon/dhgroup.h
deleted file mode 100644
index 54d7eeb..0000000
--- a/src/racoon/dhgroup.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*	$NetBSD: dhgroup.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: dhgroup.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _DHGROUP_H
-#define _DHGROUP_H
-
-#define OAKLEY_PRIME_MODP768 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP1024 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381" \
-	"FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP1536 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF"
-
-/* RFC 3526 */
-#define OAKLEY_PRIME_MODP2048 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \
-	"E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \
-	"DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \
-	"15728E5A 8AACAA68 FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP3072 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \
-	"E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \
-	"DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \
-	"15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \
-	"ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \
-	"ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \
-	"F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \
-	"BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \
-	"43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP4096 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \
-	"E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \
-	"DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \
-	"15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \
-	"ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \
-	"ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \
-	"F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \
-	"BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \
-	"43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \
-	"88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \
-	"2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \
-	"287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \
-	"1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \
-	"93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199" \
-	"FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP6144 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \
-	"E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \
-	"DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \
-	"15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \
-	"ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \
-	"ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \
-	"F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \
-	"BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \
-	"43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \
-	"88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \
-	"2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \
-	"287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \
-	"1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \
-	"93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \
-	"36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \
-	"F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \
-	"179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \
-	"DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \
-	"5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \
-	"D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \
-	"23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \
-	"CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \
-	"06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \
-	"DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \
-	"12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF"
-
-#define OAKLEY_PRIME_MODP8192 \
-	"FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \
-	"29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \
-	"EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \
-	"E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \
-	"EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \
-	"C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \
-	"83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \
-	"670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \
-	"E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \
-	"DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \
-	"15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \
-	"ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \
-	"ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \
-	"F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \
-	"BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \
-	"43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \
-	"88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \
-	"2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \
-	"287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \
-	"1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \
-	"93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \
-	"36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \
-	"F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \
-	"179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \
-	"DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \
-	"5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \
-	"D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \
-	"23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \
-	"CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \
-	"06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \
-	"DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \
-	"12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4" \
-	"38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300" \
-	"741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568" \
-	"3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9" \
-	"22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B" \
-	"4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A" \
-	"062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36" \
-	"4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1" \
-	"B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92" \
-	"4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47" \
-	"9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71" \
-	"60C980DD 98EDD3DF FFFFFFFF FFFFFFFF"
-
-extern struct dhgroup dh_modp768;
-extern struct dhgroup dh_modp1024;
-extern struct dhgroup dh_modp1536;
-extern struct dhgroup dh_modp2048;
-extern struct dhgroup dh_modp3072;
-extern struct dhgroup dh_modp4096;
-extern struct dhgroup dh_modp6144;
-extern struct dhgroup dh_modp8192;
-
-#endif /* _DHGROUP_H */
diff --git a/src/racoon/dnssec.c b/src/racoon/dnssec.c
deleted file mode 100644
index 1fc0bd1..0000000
--- a/src/racoon/dnssec.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*	$NetBSD: dnssec.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: dnssec.c,v 1.2 2001/08/05 18:46:07 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "var.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "netdb_dnssec.h"
-#include "strnames.h"
-#include "dnssec.h"
-#include "gcmalloc.h"
-
-extern int h_errno;
-
-cert_t *
-dnssec_getcert(id)
-	vchar_t *id;
-{
-	cert_t *cert = NULL;
-	struct certinfo *res = NULL;
-	struct ipsecdoi_id_b *id_b;
-	int type;
-	char *name = NULL;
-	int namelen;
-	int error;
-
-	id_b = (struct ipsecdoi_id_b *)id->v;
-
-	namelen = id->l - sizeof(*id_b);
-	name = racoon_malloc(namelen + 1);
-	if (!name) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer.\n");
-		return NULL;
-	}
-	memcpy(name, id_b + 1, namelen);
-	name[namelen] = '\0';
-
-	switch (id_b->type) {
-	case IPSECDOI_ID_FQDN:
-		error = getcertsbyname(name, &res);
-		if (error != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"getcertsbyname(\"%s\") failed.\n", name);
-			goto err;
-		}
-		break;
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR:
-		/* XXX should be processed to query PTR ? */
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inpropper ID type passed %s "
-			"though getcert method is dnssec.\n",
-			s_ipsecdoi_ident(id_b->type));
-		goto err;
-	}
-
-	/* check response */
-	if (res->ci_next != NULL) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"not supported multiple CERT RR.\n");
-	}
-	switch (res->ci_type) {
-	case DNSSEC_TYPE_PKIX:
-		/* XXX is it enough condition to set this type ? */
-		type = ISAKMP_CERT_X509SIGN;
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not supported CERT RR type %d.\n", res->ci_type);
-		goto err;
-	}
-
-	/* create cert holder */
-	cert = oakley_newcert();
-	if (cert == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cert buffer.\n");
-		goto err;
-	}
-	cert->pl = vmalloc(res->ci_certlen + 1);
-	if (cert->pl == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cert buffer.\n");
-		goto err;
-	}
-	memcpy(cert->pl->v + 1, res->ci_cert, res->ci_certlen);
-	cert->pl->v[0] = type;
-	cert->cert.v = cert->pl->v + 1;
-	cert->cert.l = cert->pl->l - 1;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "created CERT payload:\n");
-	plogdump(LLV_DEBUG, cert->pl->v, cert->pl->l);
-
-end:
-	if (res)
-		freecertinfo(res);
-
-	return cert;
-
-err:
-	if (name)
-		racoon_free(name);
-	if (cert) {
-		oakley_delcert(cert);
-		cert = NULL;
-	}
-
-	goto end;
-}
diff --git a/src/racoon/dnssec.h b/src/racoon/dnssec.h
deleted file mode 100644
index fb1c931..0000000
--- a/src/racoon/dnssec.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*	$NetBSD: dnssec.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: dnssec.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _DNSSEC_H
-#define _DNSSEC_H
-
-extern cert_t *dnssec_getcert __P((vchar_t *));
-
-#endif /* _DNSSEC_H */
diff --git a/src/racoon/doc/FAQ b/src/racoon/doc/FAQ
deleted file mode 100644
index 0ab49f0..0000000
--- a/src/racoon/doc/FAQ
+++ /dev/null
@@ -1,114 +0,0 @@
-This document is derived from the KAME racoon FAQ. Some answers do not
-apply to ipsec-tools (they are obsolete or not up to date). They are
-tagged [KAME]
-
-Q: With what other IKE/IPsec implementation racoon is known to be interoperable?
-
-A: [KAME]
-	See "IMPLEMENTATION" document supplied with KAME kit, or:
-	http://www.kame.net/dev/cvsweb.cgi/kame/IMPLEMENTATION
-	As we have tested/got test reports in the past, and our end and
-	the other end may have changed their implemenations, we are not sure
-	if we can interoperate with them today (we hope them to interoperate,
-	but we are not sure).
-	Also note that, IKE interoperability highly depends on configuration
-	on both ends.  You must configure both ends exactly the same.
-
-Q: How can I make racoon interoperate with <IKE/IPsec implementation>?
-
-A:
-	Configure both ends exactly the same.  With just a tiny little
-	differnce, you will be in trouble.
-
-Q: How to build racoon on my platform?
-
-A: 
-	As usual: configure && make && make install
-	ipsec-tools is also available as a package in the NetBSD pkgsrc
-
-Q: Describe me the options to "configure".
-
-A:
-	--enable-adminport:
-		Lets racoon to listen to racoon admin port, which is to
-		be contacted by racoonctl(8).
-	--enable-natt:
-		Enable NAT-Traversal. This needs kernel support, which is
-		available on Linux. On NetBSD, NAT-Traversal kernel support
-		has not been integrated yet, you can get it from here:
-		http://ipsec-tools.sourceforge.net/netbsd_nat-t.diff
-		If you live in a country where software patents are legal,
-		using NAT-Traversal might infringe a patent. 
-	--enable-broken-natt:
-		When ipsec-tools is built with --enable-natt, racoon 
-		sets IKE ports in SAD and SPD so that the kernel is 
-		able to ditinguish peers hidden behind the same NAT.
-		Some kernel will not cope with that ports. Use that
-		option to force the ports to 0 in SAD ans SPD. Of 
-		course this means that you cannot have multiple peers
-		behind the same NAT.
-	--enable-frag:
-		Enable IKE fragmentation, which is a workaround for 
-		broken routers that drop fragmented packets
-	--enable-hybrid:
-		Enable hybrid authentication, and ISAKMP mode config and
-		Xauth as well. Note that plain Xauth (without hybrid auth)
-		is not implemented.
-	--with-libradius:
-		Enable the use of RADIUS with hybrid authentication on the
-		server side. RADIUS is used for authentication, configuration
-		and accounting.
-	--with-libpam:
-		Enable the use of PAM with hybrid authentication on the 
-		server side. PAM can be used for authentication and accounting.
-	--enable-gssapi:
-		Enable GSS-API, for Kerberos V support.
-	--enable-stats:	
-		Enable statistics logging function.
-	--enable-samode-unspec:	
-		Enable to use unspecified a mode of SA.
-	--enable-ipv6:
-		Enable IPv6 support.
-	--with-kernel-headers:
-		Supply the location of Linux kernel headers.
-	--with-readline:
-		Support readline input (yes by default).
-	--with-openssl:
-		Specify OpenSSL directory.
-	--sysconfdir:
-		Where racoon config file goes. Default is /etc, which means
-		that racoon will look for /etc/racoon.conf
-	--localstatedir:
-		Where is the directory where racoon stores the control socket
-		(when using --enable-adminport). Default is /var, which 
-		means racoon will use /var/racoon/racoon.sock
-	--prefix:
-		Where racoon gets installed. 
-
-Q: How can I get help?
-
-A: 
-	Always identify your operating system platforms, the versions you are
-	using (like "ipsec-tools-0.5"), and information to repeat the
-	problem.  The more revelant information you supply, the better your 
-	chances of getting help are. Useful informations include, depending
-	of the problem: 
-	- version identification
-	- trace from racoon, taken by "racoon -d 0xffffffff"
-		(maximum debug level)
-	- configuration file you are using
-	- probabaly, tcpdump trace
-	http://orange.kame.net/dev/send-pr.html has the guideline.
-
-	If your question is not confidential, send your questions to:
-	<ipsec-tools-devel@lists.sourceforge.net>
-
-	If your question is confidential, send your questions to:
-	<ipsec-tools-core@lists.sourceforge.net>
-
-Q: Other documents to look at?
-
-A:
-	http://www.netbsd.org/Documentation/network/ipsec/
-	http://www.kame.net/
-	http://www.kame.net/newsletter/
diff --git a/src/racoon/doc/README.certificate b/src/racoon/doc/README.certificate
deleted file mode 100644
index a8bbfa2..0000000
--- a/src/racoon/doc/README.certificate
+++ /dev/null
@@ -1 +0,0 @@
-See http://www.kame.net/newsletter/20001119b/
diff --git a/src/racoon/doc/README.gssapi b/src/racoon/doc/README.gssapi
deleted file mode 100644
index 9cb3fbb..0000000
--- a/src/racoon/doc/README.gssapi
+++ /dev/null
@@ -1,106 +0,0 @@
-The gss-api authentication mechanism implementation for racoon was
-based on the ietf draft draft-ietf-ipsec-isakmp-gss-auth-06.txt.
-
-The implementation uses the Heimdal gss-api library, i.e. gss-api
-on top of Kerberos 5. The Heimdal gss-api library had to be modified
-to meet the requirements of using gss-api in a daemon. More specifically,
-the gss_acquire_cred() call did not work for other cases than
-GSS_C_NO_CREDENTIAL ("use default creds"). Daemons are often started
-as root, and have no Kerberos 5 credentials, so racoon explicitly
-needs to acquire its credentials. The usual method (already used
-by login authentication daemons) in these situations is to add
-a set of special credentials to be used. For example, authentication
-by daemons concerned with login credentials, uses 'host/fqdn' as
-its credential, where fqdn is the hostname on the interface that
-is being used. These special credentials need to be extracted into
-a local keytab from the kdc. The default value used in racoon
-is 'ike/fqdn', but it can be overridden in the racoon config file.
-
-The modification to the Heimdal gss-api library implements the
-mechanism above. If a credential other than GSS_C_NO_CREDENTIAL
-is specified to gss_acquire_cred(), it first looks in the default
-credential cache if it its principal matches the desired credential.
-If not, it extracts it from the default keytab file, and stores
-it in a memory-based credential cache, part of the gss credential
-structure.
-
-
-
-The modifcations to racoon itself are as follows:
-
-	* The racoon.conf config file accepts a new keyword, "gssapi_id",
-	  to be used inside a proposal specification. It specifies
-	  a string (a Kerberos 5 principal in this case), specifying the
-	  credential that racoon will try to acquire. The default value
-	  is 'ike/fqdn', where fqdn is the hostname for the interface
-	  being used for the exchange. If the id is not specified, no
-	  GSS endpoint attribute will be specified in the first SA sent.
-	  However, if the initiator does specify a GSS endpoint attribute,
-	  racoon will always respond with its own GSS endpoint name
-	  in the SA (the default one if not specified by this option).
-
-	* The racoon.conf file accepts "gssapi_krb" as authentication
-	  method inside a proposal specification. The number used
-	  for this method is 65001, which is a temporary number as
-	  specified in the draft.
-
-	* The cftoken.l and cfparse.y source files were modified to
-	  pick up the configuration options. The original sources
-	  stored algorithms in bitmask, which unfortunately meant
-	  that the maximum value was 32, clearly not enough for 65001.
-	  After consulting with the author (sakane@kame.net), it turned
-	  out that method was a leftover, and no longer needed. I replaced
-	  it with plain integers.
-
-	* The gss-api specific code was concentrated as much as possible
-	  in gssapi.c and gssapi.h. The code to call functions defined
-	  in these files is conditional on HAVE_GSSAPI, except for the
-	  config scan code. Specifying this flag on the compiler commandline
-	  is conditional on the --enable-gssapi option to the configure
-	  script.
-
-	* Racoon seems to want to send accepted SA proposals back to
-	  the initiator in a verbatim fashion, leaving no room to
-	  insert the (variable-length) GSS endpoint name attribute.
-	  I worked around this by re-assembling the extracted SA
-	  into a new SA if the gssapi_krb method is used, and the
-	  initiator sent the name attribute. This scheme should
-	  possibly be re-examined by the racoon maintainers, storing
-	  the SAs (the transformations, to be more precise) in a different
-	  fashion to allow for variable-length attributes to be
-	  re-inserted would be a good change, but I considered it to be
-	  beyond the scope of this project.
-
-	* The various state functions for aggressive and main mode
-	  (in isakmp_agg.c and isakmp_ident.c respectively) were
-	  changed to conditionally change their behavior if the
-	  gssapi_krb method is specified.
-
-
-This implementation tried to follow the specification in the ietf draft
-as close as possible. However, it has not been tested against other
-IKE daemon implementations. The only other one I know of is Windows 2000,
-and it has some caveats. I attempted to be Windows 2000 compatible.
-Should racoon be tried against Windows 2000, the gssapi_id option in
-the config file must be used, as Windows 2000 expects the GSS endpoint
-name to be sent at all times. I have my doubts as to the W2K compatibility,
-because the spec describes the GSS endpoint name sent by W2K as
-an unicode string 'xxx@domain', which doesn't seem to match the
-required standard for gss-api + kerberos 5 (i.e. I am fairly certain
-that such a string will be rejected by the Heimdal gss-api library, as it
-is not a valid Kerberos 5 principal).
-
-With the Heimdal gss-api implementation, the gssapi_krb authentication
-method will only work in main mode. Aggressive mode does not allow
-for the extra round-trips needed by gss_init_sec_context and
-gss_accept_sec_context when mutual authentication is requested.
-The draft specifies that the a fallback should be done to main mode,
-through the return of INVALID-EXCHANGE-TYPE if it turns out that
-the gss-api mechanisms needs more roundtrips. This is implemented.
-Unfortunately, racoon does not seem to properly fall back to
-its next mode, and this is not specific to the gssapi_krb method.
-So, to avoid problems, only specify main mode in the config file.
-
-
-	-- Frank van der Linden <fvdl@wasabisystems.com>
-
diff --git a/src/racoon/doc/README.plainrsa b/src/racoon/doc/README.plainrsa
deleted file mode 100644
index 36de09c..0000000
--- a/src/racoon/doc/README.plainrsa
+++ /dev/null
@@ -1,109 +0,0 @@
-HOW-TO use plainrsa auth, contributed by Simon Chang <simonychang@gmail.com>
-
-Before you begin, you should understand that the RSA authentication
-mechanism hinges upon the idea of a split cryptographic key:  one used
-by the public, the other readable only to you.  Any data that is
-encrypted by a public key can be decrypted only by the corresponding
-private key, so that the private key user can be assured that the
-content of the transmission has not been examined by unauthorized
-parties.  Similarly, any data encrypted by the private key can be
-decrypted by the public key so that the public knows that this
-transmission came from this user and nobody else (this idea is called
-non-repudiation).  Also, the longer the key length, the more difficult
-it would be for potential attacker to conduct brute-force discovery of
-the keys.  So, what all this means for the security administrator is
-that the setup needs a pair of reasonably long keys for each host that
-wishes to authenticate in this manner.
-
-With this in mind, it should be relatively straightforward to set up
-RSA authentication.  For the purpose of this document, we assume that
-we are setting up RSA authentication between two networked hosts
-called Boston and Chicago.  Unless otherwise noted, all steps should
-be performed on both hosts with corresponding key names.  Here are the
-steps:
-
-1)  Included in each default installation of ipsec-tools is a binary
-called plainrsa-gen.  This executable is used to generate a pair of
-RSA keys for the host.  There are only two parameters that you should
-be concerned about: -b, which sets the number of bits for the keys,
-and -f, which specifies the output file for plainrsa-gen to send the
-results.  On an ordinary Pentium-II with 128 MB of RAM, it takes only
-seconds to generate keys that are 2048 bits long, and only slightly
-longer to generate 4096-bit keys.  Either key length should be
-sufficient; any longer key length actually reduces performance and
-does not increase security significantly.  You should therefore run it
-as:
-
-	plainrsa-gen -b 2048 -f /var/tmp/boston.keys
-
-2)  When the process completes, you should have a text file that
-includes both public and private keys.  GUARD THIS FILE CAREFULLY,
-because once a private key is compromised it is no longer any good,
-and you must generate a new pair from scratch.  Reading the file
-itself, you should see several very long lines of alphanumeric data.
-The only line you should be concerned with is the line towards the top
-of the output file that begins with "# pubkey=0sAQPAmBdT/" or
-something to that effect.  This line is your public key, which should
-be made available to the other host that you are setting up.  Copy
-this line to a separate file called "boston.pub" and change the
-beginning of the line so that it reads ": PUB 0sAQPAmBdT/".
-Alternatively, you can also grab the first line of the boston.keys
-file and uncomment the line so that it reads the same as above.  Now
-rename the file you generated initially to "boston.priv".
-
-3)  You should now have two files, boston.priv and boston.pub
-(chicago.priv and chicago.pub on Chicago).  The first file contains
-your private key and the second file your public key.  Next you should
-find a way to get the public key over to the other host involved.
-Boston should have (1) its own key pair, and (2) Chicago's public key
-ONLY.  Do not copy Chicago's private key over to Boston, because (a)
-it is not necessary, and (b) you would now have two potential places
-for losing control of your private key.
-
-4)  You should now configure the racoon.conf configuration file for
-each host to (a) turn on RSA authentication, and (b) designate each
-host's private key and the remote host(s)'s public key(s).  Take all
-your keys and place it in one directory and use the global directive
-"path certificate" to specify the location of the keys.  This step is
-especially important if you are running racoon with privilege
-separation, because if racoon cannot find the keys inside the
-directory you have just specified it will fail the authentication
-process.  So, write the directive like the following:
-
-	path certificate "/etc/racoon";
-
-Next, you need to specify the host's own private key and the public
-keys of all the remote peers involved. For your local private key and 
-remote public key(s), you should use the following directives:
-
-	certificate_type plain_rsa "/etc/racoon/boston.priv";
-	peers_certfile plain_rsa "/etc/racoon/chicago.pub";
-
-Notice the option "plain_rsa" for both directives.
-
-Finally, under the "proposal" statement section, you should specify
-the "rsasig" option for "authentication_method".
-
-5)  You have finished configuring the host for RSA authentication.
-Now use racoonctl to reload the configuration or simply restart the
-machine and you should be all set.
-
-TROUBLESHOOTING
-
-In the event that the hosts fail to communicate, first go back to the
-instructions above and make sure that:
-
-1)  You have placed all the keys in the directory that is specified by
-the "path certificate" directive.  Keep in mind that privilege
-separation will force racoon to look into that directory and nowhere
-else.
-2)  You have specified correctly the host's own private key and the
-remote peer's public key.
-3)  You have specified the "rsasig" method for authentication in the
-proposal statement.
-
-If you run into any further problems, you should try to use "racoon
--v" to debug the setup, and send a copy of the debug messages to the
-mailing list so that we can help you determine what the problem is.
-
-Last modified: $Date: 2006/12/10 05:51:14 $
diff --git a/src/racoon/dump.h b/src/racoon/dump.h
deleted file mode 100644
index 3e8a5df..0000000
--- a/src/racoon/dump.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*	$NetBSD: dump.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: dump.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 2000 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _DUMP_H
-#define _DUMP_H
-
-extern int isakmp_dump_open __P((char *));
-extern int isakmp_dump_close __P((void));
-extern int isakmp_dump __P((vchar_t *, struct sockaddr *, struct sockaddr *));
-
-#endif /* _DUMP_H */
diff --git a/src/racoon/eaytest.c b/src/racoon/eaytest.c
deleted file mode 100644
index 323ecef..0000000
--- a/src/racoon/eaytest.c
+++ /dev/null
@@ -1,1068 +0,0 @@
-/*	$NetBSD: eaytest.c,v 1.7.6.2 2008/07/15 00:55:48 mgrooms Exp $	*/
-
-/* Id: eaytest.c,v 1.22 2005/06/19 18:02:54 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <err.h>
-
-#include <openssl/bio.h>
-#include <openssl/pem.h>
-
-#include "var.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "debug.h"
-#include "str2val.h"
-#include "plog.h"
-
-#include "oakley.h"
-#include "dhgroup.h"
-#include "crypto_openssl.h"
-#include "gnuc.h"
-
-#include "package_version.h"
-
-#define PVDUMP(var) racoon_hexdump((var)->v, (var)->l)
-
-/*#define CERTTEST_BROKEN */
-
-/* prototype */
-
-static vchar_t *pem_read_buf __P((char *));
-void Usage __P((void));
-
-int rsatest __P((int, char **));
-int ciphertest __P((int, char **));
-int hmactest __P((int, char **));
-int sha1test __P((int, char **));
-int md5test __P((int, char **));
-int dhtest __P((int, char **));
-int bntest __P((int, char **));
-#ifndef CERTTEST_BROKEN
-static char **getcerts __P((char *));
-int certtest __P((int, char **));
-#endif
-
-/* test */
-
-static int
-rsa_verify_with_pubkey(src, sig, pubkey_txt)
-	vchar_t *src, *sig;
-	char *pubkey_txt;
-{
-	BIO *bio;
-	EVP_PKEY *evp;
-	int error;
-
-	bio = BIO_new_mem_buf(pubkey_txt, strlen(pubkey_txt));
-	evp = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
-	if (! evp) {
-		printf ("PEM_read_PUBKEY(): %s\n", eay_strerror());
-		return -1;
-	}
-	error = eay_check_rsasign(src, sig, evp->pkey.rsa);
-
-	return error;
-}
-
-int
-rsatest(ac, av)
-	int ac;
-	char **av;
-{
-	char *text = "this is test.";
-	vchar_t src;
-	vchar_t *priv, *sig;
-	int loglevel_saved;
-
-	char *pkcs1 =
-"-----BEGIN RSA PRIVATE KEY-----\n"
-"MIICXQIBAAKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9oLv50PeuEfQojhakY+OH8A3Q\n"
-"M8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFyP3kyd2yXHIZ/MN8g1nh4FsB0\n"
-"iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCMt8vO+NFHZYKAQeynyQIDAQAB\n"
-"AoGAOfDcnCHxjhDGrwyoNNWl6Yqi7hAtQm67YAbrH14UO7nnmxAENM9MyNgpFLaW\n"
-"07v5m8IZQIcradcDXAJOUwNBN8E06UflwEYCaScIwndvr5UpVlN3e2NC6Wyg2yC7\n"
-"GarxQput3zj35XNR5bK42UneU0H6zDxpHWqI1SwE+ToAHu0CQQDNl9gUJTpg0L09\n"
-"HkbE5jeb8bA5I20nKqBOBP0v5tnzpwu41umQwk9I7Ru0ucD7j+DW4k8otadW+FnI\n"
-"G1M1MpSjAkEAyRMt4bN8otfpOpsOQWzw4jQtouohOxRFCrQTntHhU20PrQnQLZWs\n"
-"pOVzqCjRytYtkPEUA1z8QK5gGcVPcOQsowJBALmt2rwPB1NrEo5Bat7noO+Zb3Ob\n"
-"WDiYWeE8xkHd95gDlSWiC53ur9aINo6ZeP556jGIgL+el/yHHecJLrQL84sCQH48\n"
-"zUxq/C/cb++8UzneJGlPqusiJNTLiAENR1gpmlZfHT1c8Nb9phMsfu0vG29GAfuC\n"
-"bzchVLljALCNQK+2gRMCQQCNIgN+R9mRWZhFAcC1sq++YnuSBlw4VwdL/fd1Yg9e\n"
-"Ul+U98yPl/NXt8Rs4TRBFcOZjkFI8xv0hQtevTgTmgz+\n"
-"-----END RSA PRIVATE KEY-----\n\n";
-	char *pubkey =
-"-----BEGIN PUBLIC KEY-----\n"
-"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9\n"
-"oLv50PeuEfQojhakY+OH8A3QM8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFy\n"
-"P3kyd2yXHIZ/MN8g1nh4FsB0iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCM\n"
-"t8vO+NFHZYKAQeynyQIDAQAB\n"
-"-----END PUBLIC KEY-----\n\n";
-	char *pubkey_wrong = 
-"-----BEGIN PUBLIC KEY-----\n"
-"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwDncG2tSokRBhK8la1mO\n"
-"QnUpxg6KvpoFUjEyRiIE1GRap5V6jCCEOmA9ZAz4Oa/97oxewwMWtchIxSBZVCia\n"
-"H9oGasbOFzrtSR+MKl6Cb/Ow3Fu+PKbHTsnfTk/nOOWyaQh91PRD7fdwHe8L9P7w\n"
-"2kFPmDW6+RNKIR4OErhXf1O0eSShPe0TO3vx43O7dWqhmh3Kgr4Jq7zAGqHtwu0B\n"
-"RFZnmsocOnVZb2yAHndp51/Mk1H37ThHwN7qMx7RqrS3ru3XtchpJd9IQJPBIRfY\n"
-"VYQ68u5ix/Z80Y6VkRf0qnAvel8B6D3N3Zyq5u7G60PfvvtCybeMn7nVrSMxqMW/\n"
-"xwIDAQAB\n"
-"-----END PUBLIC KEY-----\n\n";
-
-	printf ("%s", pkcs1);
-	printf ("%s", pubkey);
-	priv = pem_read_buf(pkcs1);
-
-	src.v = text;
-	src.l = strlen(text);
-
-	/* sign */
-	sig = eay_get_x509sign(&src, priv);
-	if (sig == NULL) {
-		printf("sign failed. %s\n", eay_strerror());
-		return -1;
-	}
-
-	printf("RSA signed data.\n");
-	PVDUMP(sig);
-
-	printf("Verification with correct pubkey: ");
-	if (rsa_verify_with_pubkey (&src, sig, pubkey) != 0) {
-		printf ("Failed.\n");
-		return -1;
-	}
-	else
-		printf ("Verified. Good.\n");
-
-	loglevel_saved = loglevel;
-	loglevel = 0;
-	printf("Verification with wrong pubkey: ");
-	if (rsa_verify_with_pubkey (&src, sig, pubkey_wrong) != 0)
-		printf ("Not verified. Good.\n");
-	else {
-		printf ("Verified. This is bad...\n");
-		loglevel = loglevel_saved;
-		return -1;
-	}
-	loglevel = loglevel_saved;
-
-	return 0;
-}
-
-static vchar_t *
-pem_read_buf(buf)
-	char *buf;
-{
-	BIO *bio;
-	char *nm = NULL, *header = NULL;
-	unsigned char *data = NULL;
-	long len;
-	vchar_t *ret;
-	int error;
-
-	bio = BIO_new_mem_buf(buf, strlen(buf));
-	error = PEM_read_bio(bio, &nm, &header, &data, &len);
-	if (error == 0)
-		errx(1, "%s", eay_strerror());
-	ret = vmalloc(len);
-	if (ret == NULL)
-		err(1, "vmalloc");
-	memcpy(ret->v, data, len);
-
-	return ret;
-}
-
-#ifndef CERTTEST_BROKEN
-int
-certtest(ac, av)
-	int ac;
-	char **av;
-{
-	char *certpath;
-	char **certs;
-	int type;
-	int error;
-
-	printf("\n**Test for Certificate.**\n");
-
-    {
-	vchar_t *asn1dn = NULL, asn1dn0;
-#ifdef ORIG_DN
-	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane/Email=sakane@kame.net";
-	char *dnstr_w1 = NULL;
-	char *dnstr_w2 = NULL;
-	char dn0[] = {
-		0x30,0x81,0x9a,0x31,0x0b,0x30,0x09,0x06,
-		0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50,
-		0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,
-		0x08,0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,
-		0x61,0x77,0x61,0x31,0x11,0x30,0x0f,0x06,
-		0x03,0x55,0x04,0x07,0x13,0x08,0x46,0x75,
-		0x6a,0x69,0x73,0x61,0x77,0x61,0x31,0x15,
-		0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,
-		0x0c,0x57,0x49,0x44,0x45,0x20,0x50,0x72,
-		0x6f,0x6a,0x65,0x63,0x74,0x31,0x15,0x30,
-		0x13,0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,
-		0x4b,0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,
-		0x6a,0x65,0x63,0x74,0x31,0x17,0x30,0x15,
-		0x06,0x03,0x55,0x04,0x03,0x13,0x0e,0x53,
-		0x68,0x6f,0x69,0x63,0x68,0x69,0x20,0x53,
-		0x61,0x6b,0x61,0x6e,0x65,0x31,0x1e,0x30,
-		0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,
-		0x0d,0x01,0x09,0x01,
-		0x0c,	/* <== XXX */
-		0x0f,0x73,0x61,
-		0x6b,0x61,0x6e,0x65,0x40,0x6b,0x61,0x6d,
-		0x65,0x2e,0x6e,0x65,0x74,
-	};
-#else /* not ORIG_DN */
-	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane";
-	char dnstr_w1[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=*, CN=Shoichi Sakane";
-	char dnstr_w2[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=*";
-	char dn0[] = {
-		0x30,0x7a,0x31,0x0b,0x30,0x09,0x06,0x03,
-		0x55,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,
-		0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x08,
-		0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,0x61,
-		0x77,0x61,0x31,0x11,0x30,0x0f,0x06,0x03,
-		0x55,0x04,0x07,0x13,0x08,0x46,0x75,0x6a,
-		0x69,0x73,0x61,0x77,0x61,0x31,0x15,0x30,
-		0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,
-		0x57,0x49,0x44,0x45,0x20,0x50,0x72,0x6f,
-		0x6a,0x65,0x63,0x74,0x31,0x15,0x30,0x13,
-		0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,0x4b,
-		0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,0x6a,
-		0x65,0x63,0x74,0x31,0x17,0x30,0x15,0x06,
-		0x03,0x55,0x04,0x03,0x13,0x0e,0x53,0x68,
-		0x6f,0x69,0x63,0x68,0x69,0x20,0x53,0x61,
-		0x6b,0x61,0x6e,0x65,
-	};
-#endif /* ORIG_DN */
-
-	printf("check to convert the string into subjectName.\n");
-	printf("%s\n", dnstr);
-
-	asn1dn0.v = dn0;
-	asn1dn0.l = sizeof(dn0);
-
-	asn1dn = eay_str2asn1dn(dnstr, strlen(dnstr));
-	if (asn1dn == NULL || asn1dn->l != asn1dn0.l)
-#ifdef OUTPUT_VALID_ASN1DN
-	{
-		unsigned char *cp; int  i;
-		printf("asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
-		for (cp = asn1dn->v, i = 0; i < asn1dn->l; i++)
-		    printf ("0x%02x,", *cp++);
-		exit (1);
-	}
-#else
-		errx(1, "asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
-#endif
-
-	/*
-	 * NOTE: The value pointed by "<==" above is different from the
-	 * return of eay_str2asn1dn().  but eay_cmp_asn1dn() can distinguish
-	 * both of the names are same name.
-	 */
-	if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
-		errx(1, "asn1dn mismatched.\n");
-	vfree(asn1dn);
-
-	printf("exact match: succeed.\n");
-
-	if (dnstr_w1 != NULL) {
-		asn1dn = eay_str2asn1dn(dnstr_w1, strlen(dnstr_w1));
-		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
-			errx(1, "asn1dn length wrong for wildcard 1\n");
-		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
-			errx(1, "asn1dn mismatched for wildcard 1.\n");
-		vfree(asn1dn);
-		printf("wildcard 1 match: succeed.\n");
-	}
-
-	if (dnstr_w1 != NULL) {
-		asn1dn = eay_str2asn1dn(dnstr_w2, strlen(dnstr_w2));
-		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
-			errx(1, "asn1dn length wrong for wildcard 2\n");
-		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
-			errx(1, "asn1dn mismatched for wildcard 2.\n");
-		vfree(asn1dn);
-		printf("wildcard 2 match: succeed.\n");
-	}
-
-    }
-	eay_init();
-
-	/* get certs */
-	if (ac > 1) {
-		certpath = *(av + 1);
-		certs = getcerts(certpath);
-	} else {
-#ifdef ORIG_DN
-		printf("\nCAUTION: These certificates are probably invalid "
-			"on your environment because you don't have their "
-			"issuer's certs in your environment.\n\n");
-
-		certpath = "/usr/local/openssl/certs";
-		certs = getcerts(NULL);
-#else
-		printf("\nWARNING: The main certificates are probably invalid "
-			"on your environment\nbecause you don't have their "
-			"issuer's certs in your environment\nso not doing "
-			"this test.\n\n");
-		return (0);
-#endif
-	}
-
-	while (*certs != NULL) {
-
-		vchar_t c;
-		char *str;
-		vchar_t *vstr;
-
-		printf("===CERT===\n");
-
-		c.v = *certs;
-		c.l = strlen(*certs);
-
-		/* print text */
-		str = eay_get_x509text(&c);
-		printf("%s", str);
-		racoon_free(str);
-
-		/* print ASN.1 of subject name */
-		vstr = eay_get_x509asn1subjectname(&c);
-		if (!vstr)
-			return 0;
-		PVDUMP(vstr);
-		printf("\n");
-		vfree(vstr);
-
-		/* print subject alt name */
-	    {
-		int pos;
-		for (pos = 1; ; pos++) {
-			error = eay_get_x509subjectaltname(&c, &str, &type, pos);
-			if (error) {
-				printf("no subjectaltname found.\n");
-				break;
-			}
-			if (!str)
-				break;
-			printf("SubjectAltName: %d: %s\n", type, str);
-			racoon_free(str);
-		}
-	    }
-
-		/* NULL => name of the certificate file */
-		error = eay_check_x509cert(&c, certpath, NULL, 1);
-		if (error)
-			printf("ERROR: cert is invalid.\n");
-		printf("\n");
-
-		certs++;
-	}
-	return 0;
-}
-
-static char **
-getcerts(path)
-	char *path;
-{
-	char **certs = NULL, **p;
-	DIR *dirp;
-	struct dirent *dp;
-	struct stat sb;
-	char buf[512];
-	int len;
-	int n;
-	int fd;
-
-	static char *samplecerts[] = {
-/* self signed */
-"-----BEGIN CERTIFICATE-----\n"
-"MIICpTCCAg4CAQAwDQYJKoZIhvcNAQEEBQAwgZoxCzAJBgNVBAYTAkpQMREwDwYD\n"
-"VQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUg\n"
-"UHJvamVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hp\n"
-"IFNha2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MB4XDTAwMDgy\n"
-"NDAxMzc0NFoXDTAwMDkyMzAxMzc0NFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
-"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
-"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
-"a2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
-"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
-"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
-"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
-"twIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACKs6X/BYycuHI3iop403R3XWMHHnNBN\n"
-"5XTHVWiWgR1cMWkq/dp51gn+nPftpdAaYGpqGkiHGhZcXLoBaX9uON3p+7av+sQN\n"
-"plXwnvUf2Zsgu+fojskS0gKcDlYiq1O8TOaBgJouFZgr1q6PiYjVEJGogAP28+HN\n"
-"M4o+GBFbFoqK\n"
-"-----END CERTIFICATE-----\n\n",
-/* signed by SSH testing CA + CA1 + CA2 */
-"-----BEGIN X509 CERTIFICATE-----\n"
-"MIICtTCCAj+gAwIBAgIEOaR8NjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJG\n"
-"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
-"EwhXZWIgdGVzdDEbMBkGA1UEAxMSVGVzdCBDQSAxIHN1YiBjYSAyMB4XDTAwMDgy\n"
-"NDAwMDAwMFoXDTAwMTAwMTAwMDAwMFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
-"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
-"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
-"a2FuZTEeMBwGCSqGSIb3DQEJAQwPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
-"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
-"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
-"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
-"twIDAQABo18wXTALBgNVHQ8EBAMCBaAwGgYDVR0RBBMwEYEPc2FrYW5lQGthbWUu\n"
-"bmV0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2Nh\n"
-"MS0yLmNybDANBgkqhkiG9w0BAQUFAANhADtaqual41OWshF/rwCTuR6zySBJysGp\n"
-"+qjkp5efCiYKhAu1L4WXlMsV/SNdzspui5tHasPBvUw8gzFsU/VW/B2zuQZkimf1\n"
-"u6ZPjUb/vt8vLOPScP5MeH7xrTk9iigsqQ==\n"
-"-----END X509 CERTIFICATE-----\n\n",
-/* VP100 */
-"-----BEGIN CERTIFICATE-----\n"
-"MIICXzCCAcigAwIBAgIEOXGBIzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJG\n"
-"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
-"EwhXZWIgdGVzdDESMBAGA1UEAxMJVGVzdCBDQSAxMB4XDTAwMDcxNjAwMDAwMFoX\n"
-"DTAwMDkwMTAwMDAwMFowNTELMAkGA1UEBhMCanAxETAPBgNVBAoTCHRhaGl0ZXN0\n"
-"MRMwEQYDVQQDEwpmdXJ1a2F3YS0xMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKB\n"
-"gQDUmI2RaAuoLvtRDbASwRhbkj/Oq0BBIKgAqbFknc/EanJSQwZQu82gD88nf7gG\n"
-"VEioWmKPLDuEjz5JCuM+k5f7HYHI1wWmz1KFr7UA+avZm4Kp6YKnhuH7soZp7kBL\n"
-"hTiZEpL0jdmCWLW3ZXoro55rmPrBsCd+bt8VU6tRZm5dUwIBKaNZMFcwCwYDVR0P\n"
-"BAQDAgWgMBYGA1UdEQQPMA2CBVZQMTAwhwQKFIaFMDAGA1UdHwQpMCcwJaAjoCGG\n"
-"H2h0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2NhMS5jcmwwDQYJKoZIhvcNAQEFBQAD\n"
-"gYEAKJ/2Co/KYW65mwpGG3CBvsoRL8xyUMHGt6gQpFLHiiHuAdix1ADTL6uoFuYi\n"
-"4sE5omQm1wKVv2ZhS03zDtUfKoVEv0HZ7IY3AU/FZT/M5gQvbt43Dki/ma3ock2I\n"
-"PPhbLsvXm+GCVh3jvkYGk1zr7VERVeTPtmT+hW63lcxfFp4=\n"
-"-----END CERTIFICATE-----\n\n",
-/* IKED */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIEFTCCA7+gAwIBAgIKYU5X6AAAAAAACTANBgkqhkiG9w0BAQUFADCBljEpMCcG\n"
-"CSqGSIb3DQEJARYaeS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYT\n"
-"AkpQMREwDwYDVQQIEwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNV\n"
-"BAoTB0hJVEFDSEkxDDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBD\n"
-"QTAeFw0wMDA3MTUwMjUxNDdaFw0wMTA3MTUwMzAxNDdaMEUxCzAJBgNVBAYTAkpQ\n"
-"MREwDwYDVQQIEwhLQU5BR0FXQTEQMA4GA1UEChMHSElUQUNISTERMA8GA1UEAxMI\n"
-"V0FUQU5BQkUwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA6Wja5A7Ldzrtx+rMWHEB\n"
-"Cyt+/ZoG0qdFQbuuUiU1vOSq+1f+ZSCYAdTq13Lrr6Xfz3jDVFEZLPID9PSTFwq+\n"
-"yQIDAQABo4ICPTCCAjkwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF\n"
-"CAICMB0GA1UdDgQWBBTkv7/MH5Ra+S1zBAmnUIH5w8ZTUTCB0gYDVR0jBIHKMIHH\n"
-"gBQsF2qoaTl5F3GFLKrttaxPJ8j4faGBnKSBmTCBljEpMCcGCSqGSIb3DQEJARYa\n"
-"eS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
-"EwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNVBAoTB0hJVEFDSEkx\n"
-"DDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBDQYIQeccIf4GYDIBA\n"
-"rS6HSUt8XjB7BgNVHR8EdDByMDagNKAyhjBodHRwOi8vZmxvcmEyMjAvQ2VydEVu\n"
-"cm9sbC9JUHNlYyUyMFRlc3QlMjBDQS5jcmwwOKA2oDSGMmZpbGU6Ly9cXGZsb3Jh\n"
-"MjIwXENlcnRFbnJvbGxcSVBzZWMlMjBUZXN0JTIwQ0EuY3JsMIGgBggrBgEFBQcB\n"
-"AQSBkzCBkDBFBggrBgEFBQcwAoY5aHR0cDovL2Zsb3JhMjIwL0NlcnRFbnJvbGwv\n"
-"ZmxvcmEyMjBfSVBzZWMlMjBUZXN0JTIwQ0EuY3J0MEcGCCsGAQUFBzAChjtmaWxl\n"
-"Oi8vXFxmbG9yYTIyMFxDZXJ0RW5yb2xsXGZsb3JhMjIwX0lQc2VjJTIwVGVzdCUy\n"
-"MENBLmNydDANBgkqhkiG9w0BAQUFAANBAG8yZAWHb6g3zba453Hw5loojVDZO6fD\n"
-"9lCsyaxeo9/+7x1JEEcdZ6qL7KKqe7ZBwza+hIN0ITkp2WEWo22gTz4=\n"
-"-----END CERTIFICATE-----\n\n",
-/* From Entrust */
-"-----BEGIN CERTIFICATE-----\n"
-"MIIDXTCCAsagAwIBAgIEOb6khTANBgkqhkiG9w0BAQUFADA4MQswCQYDVQQGEwJV\n"
-"UzEQMA4GA1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8wHhcN\n"
-"MDAwOTE4MjMwMDM3WhcNMDMwOTE4MjMzMDM3WjBTMQswCQYDVQQGEwJVUzEQMA4G\n"
-"A1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8xGTAXBgNVBAMT\n"
-"EFNob2ljaGkgU2FrYW5lIDIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKj3\n"
-"eXSt1qXxFXzpa265B/NQYk5BZN7pNJg0tlTKBTVV3UgpQ92Bx5DoNfZh11oIv0Sw\n"
-"6YnG5p9F9ma36U9HDoD3hVTjAvQKy4ssCsnU1y6v5XOU1QvYQo6UTzgsXUTaIau4\n"
-"Lrccl+nyoiNzy3lG51tLR8CxuA+3OOAK9xPjszClAgMBAAGjggFXMIIBUzBABgNV\n"
-"HREEOTA3gQ9zYWthbmVAa2FtZS5uZXSHBM6vIHWCHjIwNi0xNzUtMzItMTE3LnZw\n"
-"bndvcmtzaG9wLmNvbTATBgNVHSUEDDAKBggrBgEFBQgCAjALBgNVHQ8EBAMCAKAw\n"
-"KwYDVR0QBCQwIoAPMjAwMDA5MTgyMzAwMzdagQ8yMDAyMTAyNTExMzAzN1owWgYD\n"
-"VR0fBFMwUTBPoE2gS6RJMEcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0\n"
-"MRcwFQYDVQQLEw5WUE4gSW50ZXJvcCBSTzENMAsGA1UEAxMEQ1JMMTAfBgNVHSME\n"
-"GDAWgBTzVmhu0tBoWKwkZE5mXpooE9630DAdBgNVHQ4EFgQUEgBHPtXggJqei5Xz\n"
-"92CrWXTJxfAwCQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWNS4wAwIEsDAN\n"
-"BgkqhkiG9w0BAQUFAAOBgQCIFriNGMUE8GH5LuDrTJfA8uGx8vLy2seljuo694TR\n"
-"et/ojp9QnfOJ1PF9iAdGaEaSLfkwhY4fZNZzxic5HBoHLeo9BXLP7i7FByXjvOZC\n"
-"Y8++0dC8NVvendIILcJBM5nbDq1TqIbb8K3SP80XhO5JLVJkoZiQftAMjo0peZPO\n"
-"EQ==\n"
-"-----END CERTIFICATE-----\n\n",
-	NULL,
-	};
-
-	if (path == NULL)
-		return (char **)&samplecerts;
-
-	stat(path, &sb);
-	if (!(sb.st_mode & S_IFDIR)) {
-		printf("ERROR: %s is not directory.\n", path);
-		exit(0);
-	}
-
-	dirp = opendir(path);
-	if (dirp == NULL) {
-		printf("opendir failed.\n");
-		exit(0);
-	}
-
-	n = 0;
-	while ((dp = readdir(dirp)) != NULL) {
-		if (dp->d_type != DT_REG)
-			continue;
-		if (strcmp(dp->d_name + strlen(dp->d_name) - 4, "cert"))
-			continue;
-		snprintf(buf, sizeof(buf), "%s/%s", path, dp->d_name);
-		stat(buf, &sb);
-
-		p = (char **)realloc(certs, (n + 1) * sizeof(certs));
-		if (p == NULL)
-			err(1, "realloc");
-		certs = p;
-
-		certs[n] = malloc(sb.st_size + 1);
-		if (certs[n] == NULL)
-			err(1, "malloc");
-
-		fd = open(buf, O_RDONLY);
-		if (fd == -1)
-			err(1, "open");
-		len = read(fd, certs[n], sb.st_size);
-		if (len == -1)
-			err(1, "read");
-		if (len != sb.st_size)
-			errx(1, "read: length mismatch");
-		certs[n][sb.st_size] = '\0';
-		close(fd);
-
-		printf("%s: %d\n", dp->d_name, (int)sb.st_size);
-
-		n++;
-	}
-
-	p = (char **)realloc(certs, (n + 1) * sizeof(certs));
-	if (p == NULL)
-		err(1, "realloc");
-	certs = p;
-	certs[n] = NULL;
-
-	return certs;
-}
-#endif /* CERTTEST_BROKEN */
-
-typedef vchar_t* (eay_func) (vchar_t *, vchar_t *, vchar_t *);
-
-static int 
-ciphertest_1 (const char *name,
-	      vchar_t *data,
-	      size_t data_align,
-	      vchar_t *key,
-	      size_t min_keysize,
-	      vchar_t *iv0,
-	      size_t iv_length,
-	      eay_func encrypt,
-	      eay_func decrypt)
-{
-	int padlen;
-	vchar_t *buf, *iv, *res1, *res2;
-	iv = vmalloc(iv_length);
-	
-	printf("Test for cipher %s\n", name);
-	printf("data:\n");
-	PVDUMP(data);
-
-	if (data_align <= 1 || (data->l % data_align) == 0)
-	  padlen = 0;
-	else
-	  padlen = data_align - data->l % data_align;
-
-	buf = vmalloc(data->l + padlen);
-	memcpy(buf->v, data->v, data->l);
-
-	memcpy(iv->v, iv0->v, iv_length);
-	res1 = (encrypt)(buf, key, iv);
-	if (res1 == NULL) {
-		printf("%s encryption failed.\n", name);
-		return -1;
-	}
-	printf("encrypted:\n");
-	PVDUMP(res1);
-
-	memcpy(iv->v, iv0->v, iv_length);
-	res2 = (decrypt)(res1, key, iv);
-	if (res2 == NULL) {
-		printf("%s decryption failed.\n", name);
-		return -1;
-	}
-	printf("decrypted:\n");
-	PVDUMP(res2);
-
-	if (memcmp(data->v, res2->v, data->l)) {
-		printf("XXXX NG (%s) XXXX\n", name);
-		return -1;
-	}
-	else
-		printf("%s cipher verified.\n", name);
-	vfree(res1);
-	vfree(res2);
-	vfree(buf);
-	vfree(iv);
-
-	return 0;
-}
-
-int
-ciphertest(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t data;
-	vchar_t key;
-	vchar_t iv0;
-
-	printf("\n**Testing CIPHERS**\n");
-
-	data.v = str2val("\
-06000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
-04f05a90 \
-	", 16, &data.l);
-	key.v = str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key.l);
-	iv0.v = str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0.l);
-
-	if (ciphertest_1 ("DES", 
-			  &data, 8, 
-			  &key, 8, 
-			  &iv0, 8, 
-			  eay_des_encrypt, eay_des_decrypt) < 0)
-	  return -1;
-	
-	if (ciphertest_1 ("3DES",
-			  &data, 8,
-			  &key, 24,
-			  &iv0, 8,
-			  eay_3des_encrypt, eay_3des_decrypt) < 0)
-	  return -1;
-	
-	if (ciphertest_1 ("AES",
-			  &data, 16,
-			  &key, key.l,
-			  &iv0, 16,
-			  eay_aes_encrypt, eay_aes_decrypt) < 0)
-	  return -1;
-
-	if (ciphertest_1 ("BLOWFISH",
-			  &data, 8,
-			  &key, key.l,
-			  &iv0, 8,
-			  eay_bf_encrypt, eay_bf_decrypt) < 0)
-	  return -1;
-
-	if (ciphertest_1 ("CAST",
-			  &data, 8,
-			  &key, key.l,
-			  &iv0, 8,
-			  eay_cast_encrypt, eay_cast_decrypt) < 0)
-	  return -1;
-	
-#ifdef HAVE_OPENSSL_IDEA_H
-	if (ciphertest_1 ("IDEA",
-			  &data, 8,
-			  &key, key.l,
-			  &iv0, 8,
-			  eay_idea_encrypt, eay_idea_decrypt) < 0)
-	  return -1;
-#endif
-
-#ifdef HAVE_OPENSSL_RC5_H
-	if (ciphertest_1 ("RC5",
-			  &data, 8,
-			  &key, key.l,
-			  &iv0, 8,
-			  eay_rc5_encrypt, eay_rc5_decrypt) < 0)
-	  return -1;
-#endif
-#if defined(HAVE_OPENSSL_CAMELLIA_H)
-	if (ciphertest_1 ("CAMELLIA",
-			  &data, 16,
-			  &key, key.l,
-			  &iv0, 16,
-			  eay_camellia_encrypt, eay_camellia_decrypt) < 0)
-	  return -1;
-#endif
-	return 0;
-}
-
-int
-hmactest(ac, av)
-	int ac;
-	char **av;
-{
-	char *keyword = "hehehe test secret!";
-	char *object  = "d7e6a6c1876ef0488bb74958b9fee94e";
-	char *object1 = "d7e6a6c1876ef048";
-	char *object2 =                 "8bb74958b9fee94e";
-	char *r_hmd5  = "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
-	char *r_hsha1 = "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
-#ifdef WITH_SHA2
-	char *r_hsha2 = "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
-#endif
-	vchar_t *key, *data, *data1, *data2, *res;
-	vchar_t mod;
-	caddr_t ctx;
-
-#ifdef WITH_SHA2
-	printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
-#else
-	printf("\n**Test for HMAC MD5 & SHA1.**\n");
-#endif
-
-	key = vmalloc(strlen(keyword));
-	memcpy(key->v, keyword, key->l);
-
-	data = vmalloc(strlen(object));
-	data1 = vmalloc(strlen(object1));
-	data2 = vmalloc(strlen(object2));
-	memcpy(data->v, object, data->l);
-	memcpy(data1->v, object1, data1->l);
-	memcpy(data2->v, object2, data2->l);
-
-	/* HMAC MD5 */
-	printf("HMAC MD5 by eay_hmacmd5_one()\n");
-	res = eay_hmacmd5_one(key, data);
-	PVDUMP(res);
-	mod.v = str2val(r_hmd5, 16, &mod.l);
-	if (memcmp(res->v, mod.v, mod.l)) {
-		printf(" XXX NG XXX\n");
-		return -1;
-	}
-	free(mod.v);
-	vfree(res);
-
-	/* HMAC MD5 */
-	printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
-	ctx = eay_hmacmd5_init(key);
-	eay_hmacmd5_update(ctx, data1);
-	eay_hmacmd5_update(ctx, data2);
-	res = eay_hmacmd5_final(ctx);
-	PVDUMP(res);
-	mod.v = str2val(r_hmd5, 16, &mod.l);
-	if (memcmp(res->v, mod.v, mod.l)) {
-		printf(" XXX NG XXX\n");
-		return -1;
-	}
-	free(mod.v);
-	vfree(res);
-
-	/* HMAC SHA1 */
-	printf("HMAC SHA1 by eay_hmacsha1_one()\n");
-	res = eay_hmacsha1_one(key, data);
-	PVDUMP(res);
-	mod.v = str2val(r_hsha1, 16, &mod.l);
-	if (memcmp(res->v, mod.v, mod.l)) {
-		printf(" XXX NG XXX\n");
-		return -1;
-	}
-	free(mod.v);
-	vfree(res);
-
-	/* HMAC SHA1 */
-	printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
-	ctx = eay_hmacsha1_init(key);
-	eay_hmacsha1_update(ctx, data1);
-	eay_hmacsha1_update(ctx, data2);
-	res = eay_hmacsha1_final(ctx);
-	PVDUMP(res);
-	mod.v = str2val(r_hsha1, 16, &mod.l);
-	if (memcmp(res->v, mod.v, mod.l)) {
-		printf(" XXX NG XXX\n");
-		return -1;
-	}
-	free(mod.v);
-	vfree(res);
-
-#ifdef WITH_SHA2
-	/* HMAC SHA2 */
-	printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
-	res = eay_hmacsha2_256_one(key, data);
-	PVDUMP(res);
-	mod.v = str2val(r_hsha2, 16, &mod.l);
-	if (memcmp(res->v, mod.v, mod.l)) {
-		printf(" XXX NG XXX\n");
-		return -1;
-	}
-	free(mod.v);
-	vfree(res);
-#endif
-
-	vfree(data);
-	vfree(data1);
-	vfree(data2);
-	vfree(key);
-
-	return 0;
-}
-
-int
-sha1test(ac, av)
-	int ac;
-	char **av;
-{
-	char *word1 = "1234567890", *word2 = "12345678901234567890";
-	caddr_t ctx;
-	vchar_t *buf, *res;
-
-	printf("\n**Test for SHA1.**\n");
-
-	ctx = eay_sha1_init();
-	buf = vmalloc(strlen(word1));
-	memcpy(buf->v, word1, buf->l);
-	eay_sha1_update(ctx, buf);
-	eay_sha1_update(ctx, buf);
-	res = eay_sha1_final(ctx);
-	PVDUMP(res);
-	vfree(res);
-	vfree(buf);
-
-	ctx = eay_sha1_init();
-	buf = vmalloc(strlen(word2));
-	memcpy(buf->v, word2, buf->l);
-	eay_sha1_update(ctx, buf);
-	res = eay_sha1_final(ctx);
-	PVDUMP(res);
-	vfree(res);
-
-	res = eay_sha1_one(buf);
-	PVDUMP(res);
-	vfree(res);
-	vfree(buf);
-
-	return 0;
-}
-
-int
-md5test(ac, av)
-	int ac;
-	char **av;
-{
-	char *word1 = "1234567890", *word2 = "12345678901234567890";
-	caddr_t ctx;
-	vchar_t *buf, *res;
-
-	printf("\n**Test for MD5.**\n");
-
-	ctx = eay_md5_init();
-	buf = vmalloc(strlen(word1));
-	memcpy(buf->v, word1, buf->l);
-	eay_md5_update(ctx, buf);
-	eay_md5_update(ctx, buf);
-	res = eay_md5_final(ctx);
-	PVDUMP(res);
-	vfree(res);
-	vfree(buf);
-
-	ctx = eay_md5_init();
-	buf = vmalloc(strlen(word2));
-	memcpy(buf->v, word2, buf->l);
-	eay_md5_update(ctx, buf);
-	res = eay_md5_final(ctx);
-	PVDUMP(res);
-	vfree(res);
-
-	res = eay_md5_one(buf);
-	PVDUMP(res);
-	vfree(res);
-	vfree(buf);
-
-	return 0;
-}
-
-int
-dhtest(ac, av)
-	int ac;
-	char **av;
-{
-	static struct {
-		char *name;
-		char *p;
-	} px[] = {
-		{ "modp768",	OAKLEY_PRIME_MODP768, },
-		{ "modp1024",	OAKLEY_PRIME_MODP1024, },
-		{ "modp1536",	OAKLEY_PRIME_MODP1536, },
-		{ "modp2048",	OAKLEY_PRIME_MODP2048, },
-		{ "modp3072",	OAKLEY_PRIME_MODP3072, },
-		{ "modp4096",	OAKLEY_PRIME_MODP4096, },
-		{ "modp6144",	OAKLEY_PRIME_MODP6144, },
-		{ "modp8192",	OAKLEY_PRIME_MODP8192, },
-	};
-	vchar_t p1, *pub1, *priv1, *gxy1;
-	vchar_t p2, *pub2, *priv2, *gxy2;
-	int i;
-
-	printf("\n**Test for DH.**\n");
-
-	for (i = 0; i < sizeof(px)/sizeof(px[0]); i++) {
-		printf("\n**Test for DH %s.**\n", px[i].name);
-
-		p1.v = str2val(px[i].p, 16, &p1.l);
-		p2.v = str2val(px[i].p, 16, &p2.l);
-		printf("prime number = \n"); PVDUMP(&p1);
-
-		if (eay_dh_generate(&p1, 2, 96, &pub1, &priv1) < 0) {
-			printf("error\n");
-			return -1;
-		}
-		printf("private key for user 1 = \n"); PVDUMP(priv1);
-		printf("public key for user 1  = \n"); PVDUMP(pub1);
-
-		if (eay_dh_generate(&p2, 2, 96, &pub2, &priv2) < 0) {
-			printf("error\n");
-			return -1;
-		}
-		printf("private key for user 2 = \n"); PVDUMP(priv2);
-		printf("public key for user 2  = \n"); PVDUMP(pub2);
-
-		/* process to generate key for user 1 */
-		gxy1 = vmalloc(p1.l);
-		memset(gxy1->v, 0, gxy1->l);
-		eay_dh_compute(&p1, 2, pub1, priv1, pub2, &gxy1);
-		printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1);
-
-		/* process to generate key for user 2 */
-		gxy2 = vmalloc(p1.l);
-		memset(gxy2->v, 0, gxy2->l);
-		eay_dh_compute(&p2, 2, pub2, priv2, pub1, &gxy2);
-		printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2);
-
-		if (memcmp(gxy1->v, gxy2->v, gxy1->l)) {
-			printf("ERROR: sharing gxy mismatched.\n");
-			return -1;
-		}
-
-		vfree(pub1);
-		vfree(pub2);
-		vfree(priv1);
-		vfree(priv2);
-		vfree(gxy1);
-		vfree(gxy2);
-	}
-
-	return 0;
-}
-
-int
-bntest(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *rn;
-
-	printf("\n**Test for generate a random number.**\n");
-
-	rn = eay_set_random((u_int32_t)96);
-	PVDUMP(rn);
-	vfree(rn);
-
-	return 0;
-}
-
-struct {
-	char *name;
-	int (*func) __P((int, char **));
-} func[] = {
-	{ "random", bntest, },
-	{ "dh", dhtest, },
-	{ "md5", md5test, },
-	{ "sha1", sha1test, },
-	{ "hmac", hmactest, },
-	{ "cipher", ciphertest, },
-#ifndef CERTTEST_BROKEN
-	{ "cert", certtest, },
-#endif
-	{ "rsa", rsatest, },
-};
-
-int
-main(ac, av)
-	int ac;
-	char **av;
-{
-	int i;
-	int len = sizeof(func)/sizeof(func[0]);
-
-	f_foreground = 1;
-	ploginit();
-
-	printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING, eay_version());
-
-	if (strcmp(*av, "-h") == 0)
-		Usage();
-
-	ac--;
-	av++;
-
-	for (i = 0; i < len; i++) {
-		if ((ac == 0) || (strcmp(*av, func[i].name) == 0)) {
-			if ((func[i].func)(ac, av) != 0) {
-				printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func[i].name);
-				exit(1);
-			}
-			if (ac)
-				break;
-		}
-	}
-	if (ac && i == len)
-		Usage();
-
-	printf ("\n===== All tests passed =====\n\n");
-	exit(0);
-}
-
-void
-Usage()
-{
-	int i;
-	int len = sizeof(func)/sizeof(func[0]);
-
-	printf("Usage: eaytest [");
-	for (i = 0; i < len; i++)
-		printf("%s%s", func[i].name, (i<len-1)?"|":"");
-	printf("]\n");
-#ifndef CERTTEST_BROKEN
-	printf("       eaytest cert [cert_directory]\n");
-#endif
-	exit(1);
-}
-
diff --git a/src/racoon/evt.c b/src/racoon/evt.c
deleted file mode 100644
index fc65b20..0000000
--- a/src/racoon/evt.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*	$NetBSD: evt.c,v 1.5 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: evt.c,v 1.5 2006/06/22 20:11:35 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <time.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-
-#include "vmbuf.h"
-#include "plog.h"
-#include "misc.h"
-#include "admin.h"
-#include "gcmalloc.h"
-#include "evt.h"
-
-#ifdef ENABLE_ADMINPORT
-struct evtlist evtlist = TAILQ_HEAD_INITIALIZER(evtlist);
-int evtlist_len = 0;
-
-void
-evt_push(src, dst, type, optdata)
-	struct sockaddr *src;
-	struct sockaddr *dst;
-	int type;
-	vchar_t *optdata;
-{
-	struct evtdump *evtdump;
-	struct evt *evt;
-	size_t len;
-
-	/* If admin socket is disabled, silently discard anything */
-	if (adminsock_path == NULL)
-		return;
-
-	/* If we are above the limit, don't record anything */
-	if (evtlist_len > EVTLIST_MAX) {
-		plog(LLV_DEBUG, LOCATION, NULL, 
-		    "Cannot record event: event queue overflowed\n");
-		return;
-	}
-
-	/* If we hit the limit, record an overflow event instead */
-	if (evtlist_len == EVTLIST_MAX) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot record event: event queue overflow\n");
-		src = NULL;
-		dst = NULL;
-		type = EVTT_OVERFLOW;
-		optdata = NULL;
-	}
-
-	len = sizeof(*evtdump);
-	if (optdata)
-		len += optdata->l;
-
-	if ((evtdump = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot record event: %s\n",
-		    strerror(errno));
-		return;
-	}
-
-	if ((evt = racoon_malloc(sizeof(*evt))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot record event: %s\n",
-		    strerror(errno));
-		racoon_free(evtdump);
-		return;
-	}
-
-	if (src)
-		memcpy(&evtdump->src, src, sysdep_sa_len(src));
-	if (dst)
-		memcpy(&evtdump->dst, dst, sysdep_sa_len(dst));
-	evtdump->len = len;
-	evtdump->type = type;
-	time(&evtdump->timestamp);
-
-	if (optdata)
-		memcpy(evtdump + 1, optdata->v, optdata->l);
-
-	evt->dump = evtdump;
-	TAILQ_INSERT_TAIL(&evtlist, evt, next);
-
-	evtlist_len++;
-
-	return;
-}
-
-struct evtdump *
-evt_pop(void) {
-	struct evtdump *evtdump;
-	struct evt *evt;
-
-	if ((evt = TAILQ_FIRST(&evtlist)) == NULL)
-		return NULL;
-
-	evtdump = evt->dump;
-	TAILQ_REMOVE(&evtlist, evt, next);
-	racoon_free(evt);
-	evtlist_len--;
-
-	return evtdump;
-}
-
-vchar_t *
-evt_dump(void) {
-	struct evtdump *evtdump;
-	vchar_t *buf = NULL;
-
-	if ((evtdump = evt_pop()) != NULL) {
-		if ((buf = vmalloc(evtdump->len)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "evt_dump failed: %s\n", strerror(errno));
-			return NULL;
-		}
-		memcpy(buf->v, evtdump, evtdump->len);	
-		racoon_free(evtdump);
-	}
-
-	return buf;
-}
-
-#endif /* ENABLE_ADMINPORT */
diff --git a/src/racoon/evt.h b/src/racoon/evt.h
deleted file mode 100644
index 88ee366..0000000
--- a/src/racoon/evt.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*	$NetBSD: evt.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: evt.h,v 1.5 2006/01/19 10:24:09 fredsen Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _EVT_H
-#define _EVT_H
-
-struct evtdump {
-	size_t len;	
-	struct sockaddr_storage src;
-	struct sockaddr_storage dst;
-	time_t timestamp;
-	int type;
-	/* 
-	 * Optionnal list of struct isakmp_data 
-	 * for type EVTT_ISAKMP_CFG_DONE
-	 */
-};
-
-/* type */
-#define EVTT_UNSEPC		0
-#define EVTT_PHASE1_UP		1
-#define EVTT_PHASE1_DOWN	2
-#define EVTT_XAUTH_SUCCESS	3
-#define EVTT_ISAKMP_CFG_DONE	4
-#define EVTT_PHASE2_UP		5
-#define EVTT_PHASE2_DOWN	6
-#define EVTT_DPD_TIMEOUT	7
-#define EVTT_PEER_NO_RESPONSE	8
-#define EVTT_PEER_DELETE	9
-#define EVTT_RACOON_QUIT	10
-#define EVTT_XAUTH_FAILED	11
-#define EVTT_OVERFLOW		12	/* Event queue overflowed */
-#define EVTT_PEERPH1AUTH_FAILED	13
-#define EVTT_PEERPH1_NOPROP	14	/* NO_PROPOSAL_CHOSEN & friends */
-#define EVTT_NO_ISAKMP_CFG	15	/* no need to wait for mode_cfg */
-
-struct evt {
-	struct evtdump *dump;
-	TAILQ_ENTRY(evt) next;
-};
-
-TAILQ_HEAD(evtlist, evt);
-
-#define EVTLIST_MAX	32
-
-#ifdef ENABLE_ADMINPORT
-struct evtdump *evt_pop(void);
-vchar_t *evt_dump(void);
-void evt_push(struct sockaddr *, struct sockaddr *, int, vchar_t *);
-#endif
-
-#ifdef ENABLE_ADMINPORT
-#define EVT_PUSH(src, dst, type, optdata) evt_push(src, dst, type, optdata);
-#else
-#define EVT_PUSH(src, dst, type, optdata) ;
-#endif
-
-#endif /* _EVT_H */
diff --git a/src/racoon/gcmalloc.h b/src/racoon/gcmalloc.h
deleted file mode 100644
index acdf7fa..0000000
--- a/src/racoon/gcmalloc.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*	$NetBSD: gcmalloc.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: gcmalloc.h,v 1.4 2001/11/16 04:34:57 sakane Exp $	*/
-
-/*
- * Copyright (C) 2000, 2001 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Debugging malloc glue for Racoon.
- */
-
-#ifndef _GCMALLOC_H_DEFINED
-#define _GCMALLOC_H_DEFINED
-
-/* ElectricFence needs no special handling. */
-
-/*
- * Boehm-GC provides GC_malloc(), GC_realloc(), GC_free() functions,
- * but not the traditional entry points.  So what we do is provide  
- * malloc(), calloc(), realloc(), and free() entry points in the main
- * program and letting the linker do the rest.
- */
-#ifdef GC
-#define GC_DEBUG
-#include <gc.h>
-
-#ifdef RACOON_MAIN_PROGRAM
-void *
-malloc(size_t size)
-{
-
-	return (GC_MALLOC(size));
-}
-
-void *
-calloc(size_t number, size_t size)
-{
-
-	/* GC_malloc() clears the storage. */
-	return (GC_MALLOC(number * size));
-}
-
-void *
-realloc(void *ptr, size_t size)
-{
-
-	return (GC_REALLOC(ptr, size));
-}
-
-void
-free(void *ptr)
-{
-
-	GC_FREE(ptr);
-}
-
-char *
-strdup(const char *str)
-{
-
-	return (GC_STRDUP(str));
-}
-#endif /* RACOON_MAIN_PROGRAM */
-
-#define	racoon_malloc(sz)	GC_debug_malloc(sz, GC_EXTRAS)
-#define	racoon_calloc(cnt, sz)	GC_debug_malloc(cnt * sz, GC_EXTRAS)
-#define	racoon_realloc(old, sz)	GC_debug_realloc(old, sz, GC_EXTRAS)
-#define	racoon_free(p)		GC_debug_free(p)
-#define	racoon_strdup(str)	GC_debug_strdup(str)
-
-#endif /* GC */
-
-/*
- * Dmalloc only requires that you pull in a header file and link
- * against libdmalloc.
- */
-#ifdef DMALLOC
-#include <dmalloc.h>
-#endif /* DMALLOC */
-
-#ifdef DEBUG_RECORD_MALLOCATION
-#include <debugrm.h>
-#else
-#ifndef racoon_malloc
-#define	racoon_malloc(sz)	malloc((sz))
-#endif
-#ifndef racoon_calloc
-#define	racoon_calloc(cnt, sz)	calloc((cnt), (sz))
-#endif
-#ifndef racoon_realloc
-#define	racoon_realloc(old, sz)	realloc((old), (sz))
-#endif
-#ifndef racoon_free
-#define	racoon_free(p)		free((p))
-#endif
-#ifndef racoon_strdup
-#define	racoon_strdup(s)	strdup((s))
-#endif
-#endif /* DEBUG_RECORD_MALLOCATION */
-
-#endif /* _GCMALLOC_H_DEFINED */
diff --git a/src/racoon/genlist.c b/src/racoon/genlist.c
deleted file mode 100644
index b5204c0..0000000
--- a/src/racoon/genlist.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/*	$NetBSD: genlist.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: genlist.c,v 1.2 2004/07/12 20:43:50 ludvigm Exp */
-
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/queue.h>
-
-#include "genlist.h"
-
-struct genlist *
-genlist_init (void)
-{
-	struct genlist *new = calloc(sizeof(struct genlist), 1);
-	TAILQ_INIT(new);
-	return new;
-}
-
-struct genlist_entry *
-genlist_insert (struct genlist *head, void *data)
-{
-	struct genlist_entry *entry = calloc(sizeof(struct genlist_entry), 1);
-	entry->data = data;
-	TAILQ_INSERT_HEAD(head, entry, chain);
-	return entry;
-}
-
-struct genlist_entry *
-genlist_append (struct genlist *head, void *data)
-{
-	struct genlist_entry *entry = calloc(sizeof(struct genlist_entry), 1);
-	entry->data = data;
-	TAILQ_INSERT_TAIL(head, entry, chain);
-	return entry;
-}
-
-void *
-genlist_foreach (struct genlist *head, genlist_func_t func, void *arg)
-{
-	struct genlist_entry *p;
-	void *ret = NULL;
-	TAILQ_FOREACH(p, head, chain) {
-		ret = (*func)(p->data, arg);
-		if (ret)
-			break;
-	}
-
-	return ret;
-}
-
-void *
-genlist_next (struct genlist *head, struct genlist_entry **buf)
-{
-	struct genlist_entry *p;
-
-	if (head)
-		p = TAILQ_FIRST(head);
-	else
-		p = (buf && *buf) ? TAILQ_NEXT(*buf, chain) : NULL;
-	if (buf)
-		*buf = p;
-	return (p ? p->data : NULL);
-}
-
-void
-genlist_free (struct genlist *head, genlist_freedata_t func)
-{
-	struct genlist_entry *p;
-
-	while ((p = TAILQ_LAST(head, genlist)) != NULL) {
-		TAILQ_REMOVE(head, p, chain);
-		if (func)
-			func(p->data);
-		free(p);
-	}
-	free(head);
-}
-
-
-#if 0
-/* Here comes the example... */
-struct conf {
-	struct genlist	*l1, *l2;
-};
-
-void *
-print_entry(void *entry, void *arg)
-{
-	if (!entry)
-		return NULL;
-	printf("%s\n", (char *)entry);
-	return NULL;
-}
-
-void
-dump_list(struct genlist *head)
-{
-	genlist_foreach(head, print_entry, NULL);
-}
-
-void
-free_data(void *data)
-{
-	printf ("removing %s\n", (char *)data);
-}
-
-int main()
-{
-	struct conf *cf;
-	char *cp;
-	struct genlist_entry *gpb;
-
-	cf = calloc(sizeof(struct conf), 1);
-	cf->l1 = genlist_init();
-	cf->l2 = genlist_init();
-	
-	genlist_insert(cf->l1, "Ahoj");
-	genlist_insert(cf->l1, "Cau");
-	genlist_insert(cf->l1, "Nazdar");
-	genlist_insert(cf->l1, "Te buch");
-
-	genlist_append(cf->l2, "Curak");
-	genlist_append(cf->l2, "Kozy");
-	genlist_append(cf->l2, "Pica");
-	genlist_append(cf->l2, "Prdel");
-
-	printf("List 2\n");
-	dump_list(cf->l2);
-	printf("\nList 1\n");
-	dump_list(cf->l1);
-
-	printf("\nList 2 - using genlist_next()\n");
-	for (cp = genlist_next (cf->l2, &gpb); cp; cp = genlist_next (0, &gpb))
-	    printf("%s\n", cp);
-
-	printf("\nFreeing List 1\n");
-	/* the data here isn't actually alloc'd so we would really call
-	 * genlist_free (cf->l1, 0);    but to illustrate the idea */
-	genlist_free (cf->l1, free_data);
-	cf->l1 = 0;
-
-	return 0;
-}
-#endif
diff --git a/src/racoon/genlist.h b/src/racoon/genlist.h
deleted file mode 100644
index ee15392..0000000
--- a/src/racoon/genlist.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*	$NetBSD: genlist.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: genlist.h,v 1.2 2004/07/12 20:43:50 ludvigm Exp */
-
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _GENLIST_H
-#define _GENLIST_H
-
-#include <sys/queue.h>
-
-/* See the bottom of genlist.c for example use. */
-
-/* This declares 'struct genlist' */
-TAILQ_HEAD(genlist, genlist_entry);
-
-/* This is where the data are actually stored. */
-struct genlist_entry {
-	void *data;
-	TAILQ_ENTRY(genlist_entry) chain;
-};
-
-/* This function returns an initialized list head. */
-struct genlist *genlist_init (void);
-
-/* Insert an entry at the beginning/end og the list. */
-struct genlist_entry *genlist_insert (struct genlist *head, void *data);
-struct genlist_entry *genlist_append (struct genlist *head, void *data);
-
-/* Create a function with this prototype for use with genlist_foreach().
- * See genlist_foreach() description below for details. */
-typedef void *(genlist_func_t)(void *entry, void *arg);
-
-/* Traverse the list and call 'func' for each entry.  As long as func() returns
- * NULL the list traversal continues, once it returns non-NULL (usually the
- * 'entry' arg), the list traversal exits and the return value is returned
- * further from genlist_foreach(). Optional 'arg' may be passed to func(), e.g.
- * for some lookup purposes, etc. */
-void *genlist_foreach (struct genlist *head, genlist_func_t func, void *arg);
-
-/* Get first entry in list if head is not NULL, otherwise get next
- * entry based on saved position in list from previous call as stored in buf.
- * If buf is NULL no position is saved */
-void *genlist_next (struct genlist *head, struct genlist_entry **buf);
-
-/* Create a function with this prototype for use with genlist_free()
- * to free any storage associated with genlist_entry.data */
-typedef void (genlist_freedata_t)(void *entry);
-
-/* Free all storage associated with list at head using func to free any
- * alloc()d data in data field of genlist_entry */
-void genlist_free (struct genlist *head, genlist_freedata_t func);
-
-#endif /* _GENLIST_H */
diff --git a/src/racoon/getcertsbyname.c b/src/racoon/getcertsbyname.c
deleted file mode 100644
index 1ce7c62..0000000
--- a/src/racoon/getcertsbyname.c
+++ /dev/null
@@ -1,418 +0,0 @@
-/*	$NetBSD: getcertsbyname.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: getcertsbyname.c,v 1.7 2001/11/16 04:12:59 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#if (defined(__APPLE__) && defined(__MACH__))
-# include <nameser8_compat.h>
-#endif
-#include <resolv.h>
-#ifdef HAVE_LWRES_GETRRSETBYNAME
-#include <lwres/netdb.h>
-#include <lwres/lwres.h>
-#else
-#include <netdb.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#ifdef DNSSEC_DEBUG
-#include <stdio.h>
-#include <strings.h>
-#endif
-
-#include "netdb_dnssec.h"
-
-/* XXX should it use ci_errno to hold errno instead of h_errno ? */
-extern int h_errno;
-
-static struct certinfo *getnewci __P((int, int, int, int, int, 
-			unsigned char *));
-
-static struct certinfo *
-getnewci(qtype, keytag, algorithm, flags, certlen, cert)
-	int qtype, keytag, algorithm, flags, certlen;
-	unsigned char *cert;
-{
-	struct certinfo *res;
-
-	res = malloc(sizeof(*res));
-	if (!res)
-		return NULL;
-
-	memset(res, 0, sizeof(*res));
-	res->ci_type = qtype;
-	res->ci_keytag = keytag;
-	res->ci_algorithm = algorithm;
-	res->ci_flags = flags;
-	res->ci_certlen = certlen;
-	res->ci_cert = malloc(certlen);
-	if (!res->ci_cert) {
-		free(res);
-		return NULL;
-	}
-	memcpy(res->ci_cert, cert, certlen);
-
-	return res;
-}
-
-void
-freecertinfo(ci)
-	struct certinfo *ci;
-{
-	struct certinfo *next;
-
-	do {
-		next = ci->ci_next;
-		if (ci->ci_cert)
-			free(ci->ci_cert);
-		free(ci);
-		ci = next;
-	} while (ci);
-}
-
-/*
- * get CERT RR by FQDN and create certinfo structure chain.
- */
-#ifdef HAVE_LWRES_GETRRSETBYNAME
-#define getrrsetbyname lwres_getrrsetbyname
-#define freerrset lwres_freerrset
-#define hstrerror lwres_hstrerror
-#endif
-#if defined(HAVE_LWRES_GETRRSETBYNAME) || defined(AHVE_GETRRSETBYNAME)
-int
-getcertsbyname(name, res)
-	char *name;
-	struct certinfo **res;
-{
-	int rdlength;
-	char *cp;
-	int type, keytag, algorithm;
-	struct certinfo head, *cur;
-	struct rrsetinfo *rr = NULL;
-	int i;
-	int error = -1;
-
-	/* initialize res */
-	*res = NULL;
-
-	memset(&head, 0, sizeof(head));
-	cur = &head;
-
-	error = getrrsetbyname(name, C_IN, T_CERT, 0, &rr);
-	if (error) {
-#ifdef DNSSEC_DEBUG
-		printf("getrrsetbyname: %s\n", hstrerror(error));
-#endif
-		h_errno = NO_RECOVERY;
-		goto end;
-	}
-
-	if (rr->rri_rdclass != C_IN
-	 || rr->rri_rdtype != T_CERT
-	 || rr->rri_nrdatas == 0) {
-#ifdef DNSSEC_DEBUG
-		printf("getrrsetbyname: %s", hstrerror(error));
-#endif
-		h_errno = NO_RECOVERY;
-		goto end;
-	}
-#ifdef DNSSEC_DEBUG
-	if (!(rr->rri_flags & LWRDATA_VALIDATED))
-		printf("rr is not valid");
-#endif
-
-	for (i = 0; i < rr->rri_nrdatas; i++) {
-		rdlength = rr->rri_rdatas[i].rdi_length;
-		cp = rr->rri_rdatas[i].rdi_data;
-
-		GETSHORT(type, cp);	/* type */
-		rdlength -= INT16SZ;
-		GETSHORT(keytag, cp);	/* key tag */
-		rdlength -= INT16SZ;
-		algorithm = *cp++;	/* algorithm */
-		rdlength -= 1;
-
-#ifdef DNSSEC_DEBUG
-		printf("type=%d keytag=%d alg=%d len=%d\n",
-			type, keytag, algorithm, rdlength);
-#endif
-
-		/* create new certinfo */
-		cur->ci_next = getnewci(type, keytag, algorithm,
-					rr->rri_flags, rdlength, cp);
-		if (!cur->ci_next) {
-#ifdef DNSSEC_DEBUG
-			printf("getnewci: %s", strerror(errno));
-#endif
-			h_errno = NO_RECOVERY;
-			goto end;
-		}
-		cur = cur->ci_next;
-	}
-
-	*res = head.ci_next;
-	error = 0;
-
-end:
-	if (rr)
-		freerrset(rr);
-	if (error && head.ci_next)
-		freecertinfo(head.ci_next);
-
-	return error;
-}
-#else	/*!HAVE_LWRES_GETRRSETBYNAME*/
-int
-getcertsbyname(name, res)
-	char *name;
-	struct certinfo **res;
-{
-	unsigned char *answer = NULL, *p;
-	int buflen, anslen, len;
-	HEADER *hp;
-	int qdcount, ancount, rdlength;
-	unsigned char *cp, *eom;
-	char hostbuf[1024];	/* XXX */
-	int qtype, qclass, keytag, algorithm;
-	struct certinfo head, *cur;
-	int error = -1;
-
-	/* initialize res */
-	*res = NULL;
-
-	memset(&head, 0, sizeof(head));
-	cur = &head;
-
-	/* get CERT RR */
-	buflen = 512;
-	do {
-
-		buflen *= 2;
-		p = realloc(answer, buflen);
-		if (!p) {
-#ifdef DNSSEC_DEBUG
-			printf("realloc: %s", strerror(errno));
-#endif
-			h_errno = NO_RECOVERY;
-			goto end;
-		}
-		answer = p;
-
-		anslen = res_query(name,  C_IN, T_CERT, answer, buflen);
-		if (anslen == -1)
-			goto end;
-
-	} while (buflen < anslen);
-
-#ifdef DNSSEC_DEBUG
-	printf("get a DNS packet len=%d\n", anslen);
-#endif
-
-	/* parse CERT RR */
-	eom = answer + anslen;
-
-	hp = (HEADER *)answer;
-	qdcount = ntohs(hp->qdcount);
-	ancount = ntohs(hp->ancount);
-
-	/* question section */
-	if (qdcount != 1) {
-#ifdef DNSSEC_DEBUG
-		printf("query count is not 1.\n");
-#endif
-		h_errno = NO_RECOVERY;
-		goto end;
-	}
-	cp = (unsigned char *)(hp + 1);
-	len = dn_expand(answer, eom, cp, hostbuf, sizeof(hostbuf));
-	if (len < 0) {
-#ifdef DNSSEC_DEBUG
-		printf("dn_expand failed.\n");
-#endif
-		goto end;
-	}
-	cp += len;
-	GETSHORT(qtype, cp);		/* QTYPE */
-	GETSHORT(qclass, cp);		/* QCLASS */
-
-	/* answer section */
-	while (ancount-- && cp < eom) {
-		len = dn_expand(answer, eom, cp, hostbuf, sizeof(hostbuf));
-		if (len < 0) {
-#ifdef DNSSEC_DEBUG
-			printf("dn_expand failed.\n");
-#endif
-			goto end;
-		}
-		cp += len;
-		GETSHORT(qtype, cp);	/* TYPE */
-		GETSHORT(qclass, cp);	/* CLASS */
-		cp += INT32SZ;		/* TTL */
-		GETSHORT(rdlength, cp);	/* RDLENGTH */
-
-		/* CERT RR */
-		if (qtype != T_CERT) {
-#ifdef DNSSEC_DEBUG
-			printf("not T_CERT\n");
-#endif
-			h_errno = NO_RECOVERY;
-			goto end;
-		}
-		GETSHORT(qtype, cp);	/* type */
-		rdlength -= INT16SZ;
-		GETSHORT(keytag, cp);	/* key tag */
-		rdlength -= INT16SZ;
-		algorithm = *cp++;	/* algorithm */
-		rdlength -= 1;
-		if (cp + rdlength > eom) {
-#ifdef DNSSEC_DEBUG
-			printf("rdlength is too long.\n");
-#endif
-			h_errno = NO_RECOVERY;
-			goto end;
-		}
-#ifdef DNSSEC_DEBUG
-		printf("type=%d keytag=%d alg=%d len=%d\n",
-			qtype, keytag, algorithm, rdlength);
-#endif
-
-		/* create new certinfo */
-		cur->ci_next = getnewci(qtype, keytag, algorithm,
-					0, rdlength, cp);
-		if (!cur->ci_next) {
-#ifdef DNSSEC_DEBUG
-			printf("getnewci: %s", strerror(errno));
-#endif
-			h_errno = NO_RECOVERY;
-			goto end;
-		}
-		cur = cur->ci_next;
-
-		cp += rdlength;
-	}
-
-	*res = head.ci_next;
-	error = 0;
-
-end:
-	if (answer)
-		free(answer);
-	if (error && head.ci_next)
-		freecertinfo(head.ci_next);
-
-	return error;
-}
-#endif
-
-#ifdef DNSSEC_DEBUG
-int
-b64encode(p, len)
-	char *p;
-	int len;
-{
-	static const char b64t[] =
-		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-		"abcdefghijklmnopqrstuvwxyz"
-		"0123456789+/=";
-
-	while (len > 2) {
-                printf("%c", b64t[(p[0] >> 2) & 0x3f]);
-                printf("%c", b64t[((p[0] << 4) & 0x30) | ((p[1] >> 4) & 0x0f)]);
-                printf("%c", b64t[((p[1] << 2) & 0x3c) | ((p[2] >> 6) & 0x03)]);
-                printf("%c", b64t[p[2] & 0x3f]);
-		len -= 3;
-		p += 3;
-	}
-
-	if (len == 2) {
-                printf("%c", b64t[(p[0] >> 2) & 0x3f]);
-                printf("%c", b64t[((p[0] << 4) & 0x30)| ((p[1] >> 4) & 0x0f)]);
-                printf("%c", b64t[((p[1] << 2) & 0x3c)]);
-                printf("%c", '=');
-        } else if (len == 1) {
-                printf("%c", b64t[(p[0] >> 2) & 0x3f]);
-                printf("%c", b64t[((p[0] << 4) & 0x30)]);
-                printf("%c", '=');
-                printf("%c", '=');
-	}
-
-	return 0;
-}
-
-int
-main(ac, av)
-	int ac;
-	char **av;
-{
-	struct certinfo *res, *p;
-	int i;
-
-	if (ac < 2) {
-		printf("Usage: a.out (FQDN)\n");
-		exit(1);
-	}
-
-	i = getcertsbyname(*(av + 1), &res);
-	if (i != 0) {
-		herror("getcertsbyname");
-		exit(1);
-	}
-	printf("getcertsbyname succeeded.\n");
-
-	i = 0;
-	for (p = res; p; p = p->ci_next) {
-		printf("certinfo[%d]:\n", i);
-		printf("\tci_type=%d\n", p->ci_type);
-		printf("\tci_keytag=%d\n", p->ci_keytag);
-		printf("\tci_algorithm=%d\n", p->ci_algorithm);
-		printf("\tci_flags=%d\n", p->ci_flags);
-		printf("\tci_certlen=%d\n", p->ci_certlen);
-		printf("\tci_cert: ");
-		b64encode(p->ci_cert, p->ci_certlen);
-		printf("\n");
-		i++;
-	}
-
-	freecertinfo(res);
-
-	exit(0);
-}
-#endif
diff --git a/src/racoon/gnuc.h b/src/racoon/gnuc.h
deleted file mode 100644
index 8537ad2..0000000
--- a/src/racoon/gnuc.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*	$NetBSD: gnuc.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: gnuc.h,v 1.4 2004/11/18 15:14:44 ludvigm Exp */
-
-/* Define __P() macro, if necessary */
-#undef __P
-#ifndef __P
-#if __STDC__
-#define __P(protos) protos
-#else
-#define __P(protos) ()
-#endif
-#endif
-
-/* inline foo */
-#ifdef __GNUC__
-#define inline __inline
-#else
-#define inline
-#endif
-
-/*
- * Handle new and old "dead" routine prototypes
- *
- * For example:
- *
- *	__dead void foo(void) __attribute__((volatile));
- *
- */
-#ifdef __GNUC__
-#ifndef __dead
-#define __dead volatile
-#endif
-#if __GNUC__ < 2  || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
-#ifndef __attribute__
-#define __attribute__(args)
-#endif
-#endif
-#else
-#ifndef __dead
-#define __dead
-#endif
-#ifndef __attribute__
-#define __attribute__(args)
-#endif
-#endif
diff --git a/src/racoon/grabmyaddr.c b/src/racoon/grabmyaddr.c
deleted file mode 100644
index dae4690..0000000
--- a/src/racoon/grabmyaddr.c
+++ /dev/null
@@ -1,938 +0,0 @@
-/*	$NetBSD: grabmyaddr.c,v 1.4.6.3 2008/06/18 07:30:18 mgrooms Exp $	*/
-
-/* Id: grabmyaddr.c,v 1.27 2006/04/06 16:27:05 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-
-#include <net/if.h>
-#if defined(__FreeBSD__) && __FreeBSD__ >= 3
-#include <net/if_var.h>
-#endif
-#if defined(__NetBSD__) || defined(__FreeBSD__) ||	\
-  (defined(__APPLE__) && defined(__MACH__))
-#include <netinet/in.h>
-#include <netinet6/in6_var.h>
-#endif
-#include <net/route.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <netdb.h>
-#ifdef HAVE_GETIFADDRS
-#include <ifaddrs.h>
-#include <net/if.h>
-#endif 
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "handler.h"
-#include "grabmyaddr.h"
-#include "sockmisc.h"
-#include "isakmp_var.h"
-#include "gcmalloc.h"
-#include "nattraversal.h"
-
-#ifdef __linux__
-#include <linux/types.h>
-#include <linux/rtnetlink.h>
-#ifndef HAVE_GETIFADDRS
-#define HAVE_GETIFADDRS
-#define NEED_LINUX_GETIFADDRS
-#endif
-#endif
-
-#ifdef ANDROID_CHANGES
-#include "NetdClient.h"
-#endif
-
-#ifndef HAVE_GETIFADDRS
-static unsigned int if_maxindex __P((void));
-#endif
-static struct myaddrs *find_myaddr __P((struct myaddrs *, struct myaddrs *));
-static int suitable_ifaddr __P((const char *, const struct sockaddr *));
-#ifdef INET6
-static int suitable_ifaddr6 __P((const char *, const struct sockaddr *));
-#endif
-
-#ifdef NEED_LINUX_GETIFADDRS
-
-/* We could do this _much_ better. kame racoon in its current form
- * will esentially die at frequent changes of address configuration.
- */
-
-struct ifaddrs
-{
-	struct ifaddrs *ifa_next;
-	char		ifa_name[16];
-	int		ifa_ifindex;
-	struct sockaddr *ifa_addr;
-	struct sockaddr_storage ifa_addrbuf;
-};
-
-static int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
-{
-	while (RTA_OK(rta, len)) {
-		if (rta->rta_type <= max)
-			tb[rta->rta_type] = rta;
-		rta = RTA_NEXT(rta,len);
-	}
-	return 0;
-}
-
-static void recvaddrs(int fd, struct ifaddrs **ifa, __u32 seq)
-{
-	char	buf[8192];
-	struct sockaddr_nl nladdr;
-	struct iovec iov = { buf, sizeof(buf) };
-	struct ifaddrmsg *m;
-	struct rtattr * rta_tb[IFA_MAX+1];
-	struct ifaddrs *I;
-
-	while (1) {
-		int status;
-		struct nlmsghdr *h;
-
-		struct msghdr msg = {
-			(void*)&nladdr, sizeof(nladdr),
-			&iov,	1,
-			NULL,	0,
-			0
-		};
-
-		status = recvmsg(fd, &msg, 0);
-
-		if (status < 0)
-			continue;
-
-		if (status == 0)
-			return;
-
-		if (nladdr.nl_pid) /* Message not from kernel */
-			continue;
-
-		h = (struct nlmsghdr*)buf;
-		while (NLMSG_OK(h, status)) {
-			if (h->nlmsg_seq != seq)
-				goto skip_it;
-
-			if (h->nlmsg_type == NLMSG_DONE)
-				return;
-
-			if (h->nlmsg_type == NLMSG_ERROR)
-				return;
-
-			if (h->nlmsg_type != RTM_NEWADDR)
-				goto skip_it;
-
-			m = NLMSG_DATA(h);
-
-			if (m->ifa_family != AF_INET &&
-			    m->ifa_family != AF_INET6)
-				goto skip_it;
-
-			if (m->ifa_flags&IFA_F_TENTATIVE)
-				goto skip_it;
-
-			memset(rta_tb, 0, sizeof(rta_tb));
-			parse_rtattr(rta_tb, IFA_MAX, IFA_RTA(m), h->nlmsg_len - NLMSG_LENGTH(sizeof(*m)));
-
-			if (rta_tb[IFA_LOCAL] == NULL)
-				rta_tb[IFA_LOCAL] = rta_tb[IFA_ADDRESS];
-			if (rta_tb[IFA_LOCAL] == NULL)
-				goto skip_it;
-			
-			I = malloc(sizeof(struct ifaddrs));
-			if (!I)
-				return;
-			memset(I, 0, sizeof(*I));
-
-			I->ifa_ifindex = m->ifa_index;
-			I->ifa_addr = (struct sockaddr*)&I->ifa_addrbuf;
-			I->ifa_addr->sa_family = m->ifa_family;
-			if (m->ifa_family == AF_INET) {
-				struct sockaddr_in *sin = (void*)I->ifa_addr;
-				memcpy(&sin->sin_addr, RTA_DATA(rta_tb[IFA_LOCAL]), 4);
-			} else {
-				struct sockaddr_in6 *sin = (void*)I->ifa_addr;
-				memcpy(&sin->sin6_addr, RTA_DATA(rta_tb[IFA_LOCAL]), 16);
-				if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr))
-					sin->sin6_scope_id = I->ifa_ifindex;
-			}
-			I->ifa_next = *ifa;
-			*ifa = I;
-
-skip_it:
-			h = NLMSG_NEXT(h, status);
-		}
-		if (msg.msg_flags & MSG_TRUNC)
-			continue;
-	}
-	return;
-}
-
-static int getifaddrs(struct ifaddrs **ifa0)
-{
-	struct {
-		struct nlmsghdr nlh;
-		struct rtgenmsg g;
-	} req;
-	struct sockaddr_nl nladdr;
-	static __u32 seq;
-	struct ifaddrs *i;
-	int fd;
-
-	fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
-	if (fd < 0)
-		return -1;
-
-	memset(&nladdr, 0, sizeof(nladdr));
-	nladdr.nl_family = AF_NETLINK;
-
-	req.nlh.nlmsg_len = sizeof(req);
-	req.nlh.nlmsg_type = RTM_GETADDR;
-	req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
-	req.nlh.nlmsg_pid = 0;
-	req.nlh.nlmsg_seq = ++seq;
-	req.g.rtgen_family = AF_UNSPEC;
-
-	if (sendto(fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)) < 0) {
-		close(fd);
-		return -1;
-	}
-
-	*ifa0 = NULL;
-
-	recvaddrs(fd, ifa0, seq);
-
-	close(fd);
-
-	fd = socket(AF_INET, SOCK_DGRAM, 0);
-
-	for (i=*ifa0; i; i = i->ifa_next) {
-		struct ifreq ifr;
-		ifr.ifr_ifindex = i->ifa_ifindex;
-		ioctl(fd, SIOCGIFNAME, (void*)&ifr);
-		memcpy(i->ifa_name, ifr.ifr_name, 16);
-	}
-	close(fd);
-
-	return 0;
-}
-
-static void freeifaddrs(struct ifaddrs *ifa0)
-{
-        struct ifaddrs *i;
-
-        while (ifa0) {
-                i = ifa0;
-                ifa0 = i->ifa_next;
-                free(i);
-        }
-}
-
-#endif
-
-#ifndef HAVE_GETIFADDRS
-static unsigned int
-if_maxindex()
-{
-	struct if_nameindex *p, *p0;
-	unsigned int max = 0;
-
-	p0 = if_nameindex();
-	for (p = p0; p && p->if_index && p->if_name; p++) {
-		if (max < p->if_index)
-			max = p->if_index;
-	}
-	if_freenameindex(p0);
-	return max;
-}
-#endif
-
-void
-clear_myaddr(db)
-	struct myaddrs **db;
-{
-	struct myaddrs *p;
-
-	while (*db) {
-		p = (*db)->next;
-		delmyaddr(*db);
-		*db = p;
-	}
-}
-  
-static struct myaddrs *
-find_myaddr(db, p)
-	struct myaddrs *db;
-	struct myaddrs *p;
-{
-	struct myaddrs *q;
-	char h1[NI_MAXHOST], h2[NI_MAXHOST];
-
-	if (getnameinfo(p->addr, sysdep_sa_len(p->addr), h1, sizeof(h1), NULL, 0,
-	    NI_NUMERICHOST | niflags) != 0)
-		return NULL;
-
-	for (q = db; q; q = q->next) {
-		if (p->addr->sa_family != q->addr->sa_family)
-			continue;
-		if (getnameinfo(q->addr, sysdep_sa_len(q->addr), h2, sizeof(h2),
-		    NULL, 0, NI_NUMERICHOST | niflags) != 0)
-			return NULL;
-		if (strcmp(h1, h2) == 0)
-			return q;
-	}
-
-	return NULL;
-}
-
-void
-grab_myaddrs()
-{
-#ifdef HAVE_GETIFADDRS
-	struct myaddrs *p, *q, *old;
-	struct ifaddrs *ifa0, *ifap;
-#ifdef INET6
-	struct sockaddr_in6 *sin6;
-#endif
-
-	char addr1[NI_MAXHOST];
-
-	if (getifaddrs(&ifa0)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getifaddrs failed: %s\n", strerror(errno));
-		exit(1);
-		/*NOTREACHED*/
-	}
-
-	old = lcconf->myaddrs;
-
-	for (ifap = ifa0; ifap; ifap = ifap->ifa_next) {
-		if (! ifap->ifa_addr)
-			continue;
-
-		if (ifap->ifa_addr->sa_family != AF_INET
-#ifdef INET6
-		 && ifap->ifa_addr->sa_family != AF_INET6
-#endif
-		)
-			continue;
-
-		if (!suitable_ifaddr(ifap->ifa_name, ifap->ifa_addr)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"unsuitable address: %s %s\n",
-				ifap->ifa_name,
-				saddrwop2str(ifap->ifa_addr));
-			continue;
-		}
-
-		p = newmyaddr();
-		if (p == NULL) {
-			exit(1);
-			/*NOTREACHED*/
-		}
-		p->addr = dupsaddr(ifap->ifa_addr);
-		if (p->addr == NULL) {
-			exit(1);
-			/*NOTREACHED*/
-		}
-#ifdef INET6
-#ifdef __KAME__
-		if (ifap->ifa_addr->sa_family == AF_INET6) {
-			sin6 = (struct sockaddr_in6 *)p->addr;
-			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)
-			 || IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) {
-				sin6->sin6_scope_id =
-					ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
-				sin6->sin6_addr.s6_addr[2] = 0;
-				sin6->sin6_addr.s6_addr[3] = 0;
-			}
-		}
-#else /* !__KAME__ */
-		if (ifap->ifa_addr->sa_family == AF_INET6) {
-			sin6 = (struct sockaddr_in6 *)p->addr;
-			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)
-			 || IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) {
-				sin6->sin6_scope_id =
-					if_nametoindex(ifap->ifa_name);
-			}
-		}
-				
-#endif
-#endif
-		if (getnameinfo(p->addr, sysdep_sa_len(p->addr),
-				addr1, sizeof(addr1),
-				NULL, 0,
-				NI_NUMERICHOST | niflags))
-		strlcpy(addr1, "(invalid)", sizeof(addr1));
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"my interface: %s (%s)\n",
-			addr1, ifap->ifa_name);
-		q = find_myaddr(old, p);
-#ifdef ANDROID_CHANGES
-		if (q) {
-			protectFromVpn(q->sock);
-		}
-#endif
-		if (q)
-			p->sock = q->sock;
-		else
-			p->sock = -1;
-		p->next = lcconf->myaddrs;
-		lcconf->myaddrs = p;
-	}
-
-	freeifaddrs(ifa0);
-
-	clear_myaddr(&old);
-
-#else /*!HAVE_GETIFADDRS*/
-	int s;
-	unsigned int maxif;
-	int len;
-	struct ifreq *iflist;
-	struct ifconf ifconf;
-	struct ifreq *ifr, *ifr_end;
-	struct myaddrs *p, *q, *old;
-#ifdef INET6
-#ifdef __KAME__
-	struct sockaddr_in6 *sin6;
-#endif
-#endif
-
-	char addr1[NI_MAXHOST];
-
-	maxif = if_maxindex() + 1;
-	len = maxif * sizeof(struct sockaddr_storage) * 4; /* guess guess */
-
-	iflist = (struct ifreq *)racoon_malloc(len);
-	if (!iflist) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer\n");
-		exit(1);
-		/*NOTREACHED*/
-	}
-
-	if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"socket(SOCK_DGRAM) failed: %s\n",
-			strerror(errno));
-		exit(1);
-		/*NOTREACHED*/
-	}
-#ifdef ANDROID_CHANGES
-	protectFromVpn(s);
-#endif
-
-	memset(&ifconf, 0, sizeof(ifconf));
-	ifconf.ifc_req = iflist;
-	ifconf.ifc_len = len;
-	if (ioctl(s, SIOCGIFCONF, &ifconf) < 0) {
-		close(s);
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ioctl(SIOCGIFCONF) failed: %s\n",
-			strerror(errno));
-		exit(1);
-		/*NOTREACHED*/
-	}
-	close(s);
-
-	old = lcconf->myaddrs;
-
-	/* Look for this interface in the list */
-	ifr_end = (struct ifreq *) (ifconf.ifc_buf + ifconf.ifc_len);
-
-#define _IFREQ_LEN(p) \
-  (sizeof((p)->ifr_name) + sysdep_sa_len(&(p)->ifr_addr) > sizeof(struct ifreq) \
-    ? sizeof((p)->ifr_name) + sysdep_sa_len(&(p)->ifr_addr) : sizeof(struct ifreq))
-
-	for (ifr = ifconf.ifc_req;
-	     ifr < ifr_end;
-	     ifr = (struct ifreq *)((caddr_t)ifr + _IFREQ_LEN(ifr))) {
-
-		switch (ifr->ifr_addr.sa_family) {
-		case AF_INET:
-#ifdef INET6
-		case AF_INET6:
-#endif
-			if (!suitable_ifaddr(ifr->ifr_name, &ifr->ifr_addr)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"unsuitable address: %s %s\n",
-					ifr->ifr_name,
-					saddrwop2str(&ifr->ifr_addr));
-				continue;
-			}
-
-			p = newmyaddr();
-			if (p == NULL) {
-				exit(1);
-				/*NOTREACHED*/
-			}
-			p->addr = dupsaddr(&ifr->ifr_addr);
-			if (p->addr == NULL) {
-				exit(1);
-				/*NOTREACHED*/
-			}
-#ifdef INET6
-#ifdef __KAME__
-			sin6 = (struct sockaddr_in6 *)p->addr;
-			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)
-			 || IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr)) {
-				sin6->sin6_scope_id =
-					ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]);
-				sin6->sin6_addr.s6_addr[2] = 0;
-				sin6->sin6_addr.s6_addr[3] = 0;
-			}
-#endif
-#endif
-			if (getnameinfo(p->addr, sysdep_sa_len(p->addr),
-					addr1, sizeof(addr1),
-					NULL, 0,
-					NI_NUMERICHOST | niflags))
-			strlcpy(addr1, "(invalid)", sizeof(addr1));
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"my interface: %s (%s)\n",
-				addr1, ifr->ifr_name);
-			q = find_myaddr(old, p);
-#ifdef ANDROID_CHANGES
-			if (q) {
-				protectFromVpn(q->sock);
-			}
-#endif
-			if (q)
-				p->sock = q->sock;
-			else
-				p->sock = -1;
-			p->next = lcconf->myaddrs;
-			lcconf->myaddrs = p;
-			break;
-		default:
-			break;
-		}
-	}
-
-	clear_myaddr(&old);
-
-	racoon_free(iflist);
-#endif /*HAVE_GETIFADDRS*/
-}
-
-/*
- * check the interface is suitable or not
- */
-static int
-suitable_ifaddr(ifname, ifaddr)
-	const char *ifname;
-	const struct sockaddr *ifaddr;
-{
-#ifdef ENABLE_HYBRID
-	/* Exclude any address we got through ISAKMP mode config */
-	if (exclude_cfg_addr(ifaddr) == 0)
-		return 0;
-#endif
-	switch(ifaddr->sa_family) {
-	case AF_INET:
-		return 1;
-#ifdef INET6
-	case AF_INET6:
-		return suitable_ifaddr6(ifname, ifaddr);
-#endif
-	default:
-		return 0;
-	}
-	/*NOTREACHED*/
-}
-
-#ifdef INET6
-static int
-suitable_ifaddr6(ifname, ifaddr)
-	const char *ifname;
-	const struct sockaddr *ifaddr;
-{
-#ifndef __linux__
-	struct in6_ifreq ifr6;
-	int s;
-#endif
-
-	if (ifaddr->sa_family != AF_INET6)
-		return 0;
-
-#ifndef __linux__
-	s = socket(PF_INET6, SOCK_DGRAM, 0);
-	if (s == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"socket(SOCK_DGRAM) failed:%s\n", strerror(errno));
-		return 0;
-	}
-#ifdef ANDROID_CHANGES
-	protectFromVpn(s);
-#endif
-
-	memset(&ifr6, 0, sizeof(ifr6));
-	strncpy(ifr6.ifr_name, ifname, strlen(ifname));
-
-	ifr6.ifr_addr = *(const struct sockaddr_in6 *)ifaddr;
-
-	if (ioctl(s, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ioctl(SIOCGIFAFLAG_IN6) failed:%s\n", strerror(errno));
-		close(s);
-		return 0;
-	}
-
-	close(s);
-
-	if (ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_DUPLICATED
-	 || ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_DETACHED
-	 || ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_ANYCAST)
-		return 0;
-#endif
-
-	/* suitable */
-	return 1;
-}
-#endif
-
-int
-update_myaddrs()
-{
-#ifdef __linux__
-	char msg[BUFSIZ];
-	int len;
-	struct nlmsghdr *h = (void*)msg;
-	len = read(lcconf->rtsock, msg, sizeof(msg));
-	if (len < 0)
-		return errno == ENOBUFS;
-	if (len < sizeof(*h))
-		return 0;
-	if (h->nlmsg_pid) /* not from kernel! */
-		return 0;
-	if (h->nlmsg_type == RTM_NEWLINK)
-		return 0;
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"netlink signals update interface address list\n");
-	return 1;
-#else
-	char msg[BUFSIZ];
-	int len;
-	struct rt_msghdr *rtm;
-
-	len = read(lcconf->rtsock, msg, sizeof(msg));
-	if (len < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"read(PF_ROUTE) failed: %s\n",
-			strerror(errno));
-		return 0;
-	}
-	rtm = (struct rt_msghdr *)msg;
-	if (len < rtm->rtm_msglen) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"read(PF_ROUTE) short read\n");
-		return 0;
-	}
-	if (rtm->rtm_version != RTM_VERSION) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"routing socket version mismatch\n");
-		close(lcconf->rtsock);
-		lcconf->rtsock = -1;
-		return 0;
-	}
-	switch (rtm->rtm_type) {
-	case RTM_NEWADDR:
-	case RTM_DELADDR:
-	case RTM_DELETE:
-	case RTM_IFINFO:
-		break;
-	case RTM_MISS:
-		/* ignore this message silently */
-		return 0;
-	default:
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"msg %d not interesting\n", rtm->rtm_type);
-		return 0;
-	}
-	/* XXX more filters here? */
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"caught rtm:%d, need update interface address list\n",
-		rtm->rtm_type);
-	return 1;
-#endif /* __linux__ */
-}
-
-/*
- * initialize default port for ISAKMP to send, if no "listen"
- * directive is specified in config file.
- *
- * DO NOT listen to wildcard addresses.  if you receive packets to
- * wildcard address, you'll be in trouble (DoS attack possible by
- * broadcast storm).
- */
-int
-autoconf_myaddrsport()
-{
-	struct myaddrs *p;
-	int n;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"configuring default isakmp port.\n");
-
-#ifdef ENABLE_NATT
-	if (natt_enabled_in_rmconf ()) {
-		plog(LLV_NOTIFY, LOCATION, NULL, "NAT-T is enabled, autoconfiguring ports\n");
-		for (p = lcconf->myaddrs; p; p = p->next) {
-			struct myaddrs *new;
-			if (! p->udp_encap) {
-				new = dupmyaddr(p);
-				new->udp_encap = 1;
-			}
-		}
-	}
-#endif
-
-	for (p = lcconf->myaddrs, n = 0; p; p = p->next, n++) {
-		set_port (p->addr, p->udp_encap ? lcconf->port_isakmp_natt : lcconf->port_isakmp);
-	}
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"%d addrs are configured successfully\n", n);
-
-	return 0;
-}
-
-/*
- * get a port number to which racoon binded.
- */
-u_short
-getmyaddrsport(local)
-	struct sockaddr *local;
-{
-	struct myaddrs *p, *bestmatch = NULL;
-	u_short bestmatch_port = PORT_ISAKMP;
-
-	/* get a relative port */
-	for (p = lcconf->myaddrs; p; p = p->next) {
-		if (!p->addr)
-			continue;
-		if (cmpsaddrwop(local, p->addr))
-			continue;
-
-		/* use first matching address regardless of port */
-		if (!bestmatch) {
-			bestmatch = p;
-			continue;
-		}
-
-		/* matching address with port PORT_ISAKMP */
-		if (extract_port(p->addr) == PORT_ISAKMP) {
-			bestmatch = p;
-			bestmatch_port = PORT_ISAKMP;
-		}
-	}
-
-	return bestmatch_port;
-}
-
-struct myaddrs *
-newmyaddr()
-{
-	struct myaddrs *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer for myaddrs.\n");
-		return NULL;
-	}
-
-	new->next = NULL;
-	new->addr = NULL;
-
-	return new;
-}
-
-struct myaddrs *
-dupmyaddr(struct myaddrs *old)
-{
-	struct myaddrs *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer for myaddrs.\n");
-		return NULL;
-	}
-
-	/* Copy the whole structure and set the differences.  */
-	memcpy (new, old, sizeof (*new));
-	new->addr = dupsaddr (old->addr);
-	if (new->addr == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer for myaddrs.\n");
-		racoon_free(new);
-		return NULL;
-	}
-	new->next = old->next;
-	old->next = new;
-
-	return new;
-}
-
-void
-insmyaddr(new, head)
-	struct myaddrs *new;
-	struct myaddrs **head;
-{
-	new->next = *head;
-	*head = new;
-}
-
-void
-delmyaddr(myaddr)
-	struct myaddrs *myaddr;
-{
-	if (myaddr->addr)
-		racoon_free(myaddr->addr);
-	racoon_free(myaddr);
-}
-
-int
-initmyaddr()
-{
-	/* initialize routing socket */
-	lcconf->rtsock = socket(PF_ROUTE, SOCK_RAW, PF_UNSPEC);
-	if (lcconf->rtsock < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"socket(PF_ROUTE) failed: %s",
-			strerror(errno));
-		return -1;
-	}
-
-#ifdef __linux__
-   {
-	struct sockaddr_nl nl;
-	u_int addr_len;
-
-	memset(&nl, 0, sizeof(nl));
-	nl.nl_family = AF_NETLINK;
-	nl.nl_groups = RTMGRP_IPV4_IFADDR|RTMGRP_LINK|RTMGRP_IPV6_IFADDR;
-
-	if (bind(lcconf->rtsock, (struct sockaddr*)&nl, sizeof(nl)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "bind(PF_NETLINK) failed: %s\n",
-		     strerror(errno));
-		return -1;
-	}
-	addr_len = sizeof(nl);
-	if (getsockname(lcconf->rtsock, (struct sockaddr*)&nl, &addr_len) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "getsockname(PF_NETLINK) failed: %s\n",
-		     strerror(errno));
-		return -1;
-	}
-   }
-#endif
-
-	if (lcconf->myaddrs == NULL && lcconf->autograbaddr == 1) {
-		grab_myaddrs();
-
-		if (autoconf_myaddrsport() < 0)
-			return -1;
-	}
-
-	return 0;
-}
-
-/* select the socket to be sent */
-/* should implement other method. */
-int
-getsockmyaddr(my)
-	struct sockaddr *my;
-{
-	struct myaddrs *p, *lastresort = NULL;
-#if defined(INET6) && defined(__linux__)
-	struct myaddrs *match_wo_scope_id = NULL;
-	int check_wo_scope_id = (my->sa_family == AF_INET6) && 
-		IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)my)->sin6_addr);
-#endif
-
-	for (p = lcconf->myaddrs; p; p = p->next) {
-		if (p->addr == NULL)
-			continue;
-		if (my->sa_family == p->addr->sa_family) {
-			lastresort = p;
-		} else continue;
-		if (sysdep_sa_len(my) == sysdep_sa_len(p->addr)
-		 && memcmp(my, p->addr, sysdep_sa_len(my)) == 0) {
-			break;
-		}
-#if defined(INET6) && defined(__linux__)
-		if (check_wo_scope_id && IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)p->addr)->sin6_addr) &&
-			/* XXX: this depends on sin6_scope_id to be last
-			 * item in struct sockaddr_in6 */
-			memcmp(my, p->addr, 
-				sysdep_sa_len(my) - sizeof(uint32_t)) == 0) {
-			match_wo_scope_id = p;
-		}
-#endif
-	}
-#if defined(INET6) && defined(__linux__)
-	if (!p)
-		p = match_wo_scope_id;
-#endif
-	if (!p)
-		p = lastresort;
-	if (!p) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no socket matches address family %d\n",
-			my->sa_family);
-		return -1;
-	}
-
-	return p->sock;
-}
diff --git a/src/racoon/grabmyaddr.h b/src/racoon/grabmyaddr.h
deleted file mode 100644
index ac74b46..0000000
--- a/src/racoon/grabmyaddr.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*	$NetBSD: grabmyaddr.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: grabmyaddr.h,v 1.5 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _GRABMYADDR_H
-#define _GRABMYADDR_H
-
-struct myaddrs {
-	struct myaddrs *next;
-	struct sockaddr *addr;
-	int sock;
-	int udp_encap;
-};
-
-extern void clear_myaddr __P((struct myaddrs **));
-extern void grab_myaddrs __P((void));
-extern int update_myaddrs __P((void));
-extern int autoconf_myaddrsport __P((void));
-extern u_short getmyaddrsport __P((struct sockaddr *));
-extern struct myaddrs *newmyaddr __P((void));
-extern struct myaddrs *dupmyaddr __P((struct myaddrs *));
-extern void insmyaddr __P((struct myaddrs *, struct myaddrs **));
-extern void delmyaddr __P((struct myaddrs *));
-extern int initmyaddr __P((void));
-extern int getsockmyaddr __P((struct sockaddr *));
-
-#endif /* _GRABMYADDR_H */
diff --git a/src/racoon/gssapi.c b/src/racoon/gssapi.c
deleted file mode 100644
index e64b201..0000000
--- a/src/racoon/gssapi.c
+++ /dev/null
@@ -1,749 +0,0 @@
-/*	$NetBSD: gssapi.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: gssapi.c,v 1.19 2001/04/03 15:51:55 thorpej Exp $	*/
-
-/*
- * Copyright 2000 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * This software was written by Frank van der Linden of Wasabi Systems
- * for Zembu Labs, Inc. http://www.zembu.com/
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of Wasabi Systems, Inc. may not be used to endorse
- *    or promote products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#ifdef HAVE_GSSAPI
-
-#include <sys/types.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <unistd.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "oakley.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "isakmp_ident.h"
-#include "isakmp_inf.h"
-#include "vendorid.h"
-#include "gcmalloc.h"
-
-#include "gssapi.h"
-
-static void
-gssapi_error(OM_uint32 status_code, const char *where,
-	     const char *fmt, ...)
-{
-	OM_uint32 message_context, maj_stat, min_stat;
-	gss_buffer_desc status_string;
-	va_list ap;
-
-	va_start(ap, fmt);
-	plogv(LLV_ERROR, where, NULL, fmt, ap);
-	va_end(ap);
-
-	message_context = 0;
-
-	do {
-		maj_stat = gss_display_status(&min_stat, status_code,
-		    GSS_C_MECH_CODE, GSS_C_NO_OID, &message_context,
-		    &status_string);
-		if (GSS_ERROR(maj_stat))
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "UNABLE TO GET GSSAPI ERROR CODE\n");
-		else {
-			plog(LLV_ERROR, where, NULL,
-			    "%s\n", (char *)status_string.value);
-			gss_release_buffer(&min_stat, &status_string);
-		}
-	} while (message_context != 0);
-}
-
-/*
- * vmbufs and gss_buffer_descs are really just the same on NetBSD, but
- * this is to be portable.
- */
-static int
-gssapi_vm2gssbuf(vchar_t *vmbuf, gss_buffer_t gsstoken)
-{
-
-	gsstoken->value = racoon_malloc(vmbuf->l);
-	if (gsstoken->value == NULL)
-		return -1;
-	memcpy(gsstoken->value, vmbuf->v, vmbuf->l);
-	gsstoken->length = vmbuf->l;
-
-	return 0;
-}
-
-static int
-gssapi_gss2vmbuf(gss_buffer_t gsstoken, vchar_t **vmbuf)
-{
-
-	*vmbuf = vmalloc(gsstoken->length);
-	if (*vmbuf == NULL)
-		return -1;
-	memcpy((*vmbuf)->v, gsstoken->value, gsstoken->length);
-	(*vmbuf)->l = gsstoken->length;
-
-	return 0;
-}
-
-vchar_t *
-gssapi_get_default_gss_id(void)
-{
-	char name[NI_MAXHOST];
-	vchar_t *gssid;
-
-	if (gethostname(name, sizeof(name)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "gethostname failed: %s\n",
-		    strerror(errno));
-		return (NULL);
-	}
-	name[sizeof(name) - 1] = '\0';
-
-	gssid = racoon_malloc(sizeof(*gssid));
-	gssid->l = asprintf(&gssid->v, "%s/%s", GSSAPI_DEF_NAME, name);
-
-	return (gssid);
-}
-
-static int
-gssapi_get_default_name(struct ph1handle *iph1, int remote, gss_name_t *service)
-{
-	char name[NI_MAXHOST];
-	struct sockaddr *sa;
-	char* buf = NULL;
-	gss_buffer_desc name_token;
-	OM_uint32 min_stat, maj_stat;
-
-	sa = remote ? iph1->remote : iph1->local;
-
-	if (getnameinfo(sa, sysdep_sa_len(sa), name, NI_MAXHOST, NULL, 0, 0) != 0)
-		return -1;
-
-	name_token.length = asprintf(&buf, "%s@%s", GSSAPI_DEF_NAME, name);
-	name_token.value = buf;
-
-	maj_stat = gss_import_name(&min_stat, &name_token,
-	    GSS_C_NT_HOSTBASED_SERVICE, service);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "import name\n");
-		maj_stat = gss_release_buffer(&min_stat, &name_token);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION, "release name_token");
-		return -1;
-	}
-	maj_stat = gss_release_buffer(&min_stat, &name_token);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release name_token");
-
-	return 0;
-}
-
-static int
-gssapi_init(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-	gss_buffer_desc id_token, cred_token;
-	gss_buffer_t cred = &cred_token;
-	gss_name_t princ, canon_princ;
-	OM_uint32 maj_stat, min_stat;
-
-	gps = racoon_calloc(1, sizeof (struct gssapi_ph1_state));
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "racoon_calloc failed\n");
-		return -1;
-	}
-	gps->gss_context = GSS_C_NO_CONTEXT;
-	gps->gss_cred = GSS_C_NO_CREDENTIAL;
-
-	gssapi_set_state(iph1, gps);
-
-	if (iph1->rmconf->proposal->gssid != NULL) {
-		id_token.length = iph1->rmconf->proposal->gssid->l;
-		id_token.value = iph1->rmconf->proposal->gssid->v;
-		maj_stat = gss_import_name(&min_stat, &id_token, GSS_C_NO_OID,
-		    &princ);
-		if (GSS_ERROR(maj_stat)) {
-			gssapi_error(min_stat, LOCATION, "import name\n");
-			gssapi_free_state(iph1);
-			return -1;
-		}
-	} else
-		gssapi_get_default_name(iph1, 0, &princ);
-
-	maj_stat = gss_canonicalize_name(&min_stat, princ, GSS_C_NO_OID,
-	    &canon_princ);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "canonicalize name\n");
-		maj_stat = gss_release_name(&min_stat, &princ);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION, "release princ\n");
-		gssapi_free_state(iph1);
-		return -1;
-	}
-	maj_stat = gss_release_name(&min_stat, &princ);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release princ\n");
-
-	maj_stat = gss_export_name(&min_stat, canon_princ, cred);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "export name\n");
-		maj_stat = gss_release_name(&min_stat, &canon_princ);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release canon_princ\n");
-		gssapi_free_state(iph1);
-		return -1;
-	}
-
-#if 0
-	/*
-	 * XXXJRT Did this debug message ever work?  This is a GSS name
-	 * blob at this point.
-	 */
-	plog(LLV_DEBUG, LOCATION, NULL, "will try to acquire '%.*s' creds\n",
-	    cred->length, cred->value);
-#endif
-
-	maj_stat = gss_release_buffer(&min_stat, cred);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release cred buffer\n");
-
-	maj_stat = gss_acquire_cred(&min_stat, canon_princ, GSS_C_INDEFINITE,
-	    GSS_C_NO_OID_SET, GSS_C_BOTH, &gps->gss_cred, NULL, NULL);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "acquire cred\n");
-		maj_stat = gss_release_name(&min_stat, &canon_princ);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release canon_princ\n");
-		gssapi_free_state(iph1);
-		return -1;
-	}
-	maj_stat = gss_release_name(&min_stat, &canon_princ);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release canon_princ\n");
-
-	return 0;
-}
-
-int
-gssapi_get_itoken(struct ph1handle *iph1, int *lenp)
-{
-	struct gssapi_ph1_state *gps;
-	gss_buffer_desc empty, name_token;
-	gss_buffer_t itoken, rtoken, dummy;
-	OM_uint32 maj_stat, min_stat;
-	gss_name_t partner;
-
-	if (gssapi_get_state(iph1) == NULL && gssapi_init(iph1) < 0)
-		return -1;
-
-	gps = gssapi_get_state(iph1);
-
-	empty.length = 0;
-	empty.value = NULL;
-	dummy = &empty;
-
-	if (iph1->approval != NULL && iph1->approval->gssid != NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-		    "using provided service '%.*s'\n",
-		    (int)iph1->approval->gssid->l, iph1->approval->gssid->v);
-		name_token.length = iph1->approval->gssid->l;
-		name_token.value = iph1->approval->gssid->v;
-		maj_stat = gss_import_name(&min_stat, &name_token,
-		    GSS_C_NO_OID, &partner);
-		if (GSS_ERROR(maj_stat)) {
-			gssapi_error(min_stat, LOCATION, "import of %.*s\n",
-			    name_token.length, name_token.value);
-			return -1;
-		}
-	} else
-		if (gssapi_get_default_name(iph1, 1, &partner) < 0)
-			return -1;
-
-	rtoken = gps->gsscnt_p == 0 ? dummy : &gps->gss_p[gps->gsscnt_p - 1];
-	itoken = &gps->gss[gps->gsscnt];
-
-	gps->gss_status = gss_init_sec_context(&min_stat, gps->gss_cred,
-	    &gps->gss_context, partner, GSS_C_NO_OID,
-	    GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG |
-		GSS_C_CONF_FLAG | GSS_C_INTEG_FLAG,
-	    0, GSS_C_NO_CHANNEL_BINDINGS, rtoken, NULL,
-	    itoken, NULL, NULL);
-
-	if (GSS_ERROR(gps->gss_status)) {
-		gssapi_error(min_stat, LOCATION, "init_sec_context\n");
-		maj_stat = gss_release_name(&min_stat, &partner);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION, "release name\n");
-		return -1;
-	}
-	maj_stat = gss_release_name(&min_stat, &partner);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release name\n");
-
-	plog(LLV_DEBUG, LOCATION, NULL, "gss_init_sec_context status %x\n",
-	    gps->gss_status);
-
-	if (lenp)
-		*lenp = itoken->length;
-
-	if (itoken->length != 0)
-		gps->gsscnt++;
-
-	return 0;
-}
-
-/*
- * Call gss_accept_context, with token just read from the wire.
- */
-int
-gssapi_get_rtoken(struct ph1handle *iph1, int *lenp)
-{
-	struct gssapi_ph1_state *gps;
-	gss_buffer_desc name_token;
-	gss_buffer_t itoken, rtoken;
-	OM_uint32 min_stat, maj_stat;
-	gss_name_t client_name;
-
-	if (gssapi_get_state(iph1) == NULL && gssapi_init(iph1) < 0)
-		return -1;
-
-	gps = gssapi_get_state(iph1);
-
-	rtoken = &gps->gss_p[gps->gsscnt_p - 1];
-	itoken = &gps->gss[gps->gsscnt];
-
-	gps->gss_status = gss_accept_sec_context(&min_stat, &gps->gss_context,
-	    gps->gss_cred, rtoken, GSS_C_NO_CHANNEL_BINDINGS, &client_name,
-	    NULL, itoken, NULL, NULL, NULL);
-
-	if (GSS_ERROR(gps->gss_status)) {
-		gssapi_error(min_stat, LOCATION, "accept_sec_context\n");
-		return -1;
-	}
-
-	maj_stat = gss_display_name(&min_stat, client_name, &name_token, NULL);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "gss_display_name\n");
-		maj_stat = gss_release_name(&min_stat, &client_name);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release client_name\n");
-		return -1;
-	}
-	maj_stat = gss_release_name(&min_stat, &client_name);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release client_name\n");
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"gss_accept_sec_context: other side is %s\n",
-		(char *)name_token.value);
-	maj_stat = gss_release_buffer(&min_stat, &name_token);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release name buffer\n");
-
-	if (itoken->length != 0)
-		gps->gsscnt++;
-
-	if (lenp)
-		*lenp = itoken->length;
-
-	return 0;
-}
-
-int
-gssapi_save_received_token(struct ph1handle *iph1, vchar_t *token)
-{
-	struct gssapi_ph1_state *gps;
-	gss_buffer_t gsstoken;
-	int ret;
-
-	if (gssapi_get_state(iph1) == NULL && gssapi_init(iph1) < 0)
-		return -1;
-
-	gps = gssapi_get_state(iph1);
-
-	gsstoken = &gps->gss_p[gps->gsscnt_p];
-
-	ret = gssapi_vm2gssbuf(token, gsstoken);
-	if (ret < 0)
-		return ret;
-	gps->gsscnt_p++;
-
-	return 0;
-}
-
-int
-gssapi_get_token_to_send(struct ph1handle *iph1, vchar_t **token)
-{
-	struct gssapi_ph1_state *gps;
-	gss_buffer_t gsstoken;
-	int ret;
-
-	gps = gssapi_get_state(iph1);
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi not yet initialized?\n");
-		return -1;
-	}
-	gsstoken = &gps->gss[gps->gsscnt - 1];
-	ret = gssapi_gss2vmbuf(gsstoken, token);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-int
-gssapi_get_itokens(struct ph1handle *iph1, vchar_t **tokens)
-{
-	struct gssapi_ph1_state *gps;
-	int len, i;
-	vchar_t *toks;
-	char *p;
-
-	gps = gssapi_get_state(iph1);
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi not yet initialized?\n");
-		return -1;
-	}
-
-	for (i = len = 0; i < gps->gsscnt; i++)
-		len += gps->gss[i].length;
-
-	toks = vmalloc(len);
-	if (toks == 0)
-		return -1;
-	p = (char *)toks->v;
-	for (i = 0; i < gps->gsscnt; i++) {
-		memcpy(p, gps->gss[i].value, gps->gss[i].length);
-		p += gps->gss[i].length;
-	}
-
-	*tokens = toks;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"%d itokens of length %zu\n", gps->gsscnt, (*tokens)->l);
-
-	return 0;
-}
-
-int
-gssapi_get_rtokens(struct ph1handle *iph1, vchar_t **tokens)
-{
-	struct gssapi_ph1_state *gps;
-	int len, i;
-	vchar_t *toks;
-	char *p;
-
-	gps = gssapi_get_state(iph1);
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi not yet initialized?\n");
-		return -1;
-	}
-
-	if (gssapi_more_tokens(iph1)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi roundtrips not complete\n");
-		return -1;
-	}
-
-	for (i = len = 0; i < gps->gsscnt_p; i++)
-		len += gps->gss_p[i].length;
-
-	toks = vmalloc(len);
-	if (toks == 0)
-		return -1;
-	p = (char *)toks->v;
-	for (i = 0; i < gps->gsscnt_p; i++) {
-		memcpy(p, gps->gss_p[i].value, gps->gss_p[i].length);
-		p += gps->gss_p[i].length;
-	}
-
-	*tokens = toks;
-
-	return 0;
-}
-
-vchar_t *
-gssapi_wraphash(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-	OM_uint32 maj_stat, min_stat;
-	gss_buffer_desc hash_in_buf, hash_out_buf;
-	gss_buffer_t hash_in = &hash_in_buf, hash_out = &hash_out_buf;
-	vchar_t *outbuf;
-
-	gps = gssapi_get_state(iph1);
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi not yet initialized?\n");
-		return NULL;
-	}
-
-	if (gssapi_more_tokens(iph1)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi roundtrips not complete\n");
-		return NULL;
-	}
-
-	if (gssapi_vm2gssbuf(iph1->hash, hash_in) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "vm2gssbuf failed\n");
-		return NULL;
-	}
-
-	maj_stat = gss_wrap(&min_stat, gps->gss_context, 1, GSS_C_QOP_DEFAULT,
-	    hash_in, NULL, hash_out);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "wrapping hash value\n");
-		maj_stat = gss_release_buffer(&min_stat, hash_in);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release hash_in buffer\n");
-		return NULL;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "wrapped HASH, ilen %zu olen %zu\n",
-	    hash_in->length, hash_out->length);
-
-	maj_stat = gss_release_buffer(&min_stat, hash_in);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release hash_in buffer\n");
-
-	if (gssapi_gss2vmbuf(hash_out, &outbuf) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "gss2vmbuf failed\n");
-		maj_stat = gss_release_buffer(&min_stat, hash_out);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release hash_out buffer\n");
-		return NULL;
-	}
-	maj_stat = gss_release_buffer(&min_stat, hash_out);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release hash_out buffer\n");
-
-	return outbuf;
-}
-
-vchar_t *
-gssapi_unwraphash(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-	OM_uint32 maj_stat, min_stat;
-	gss_buffer_desc hashbuf, hash_outbuf;
-	gss_buffer_t hash_in = &hashbuf, hash_out = &hash_outbuf;
-	vchar_t *outbuf;
-
-	gps = gssapi_get_state(iph1);
-	if (gps == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "gssapi not yet initialized?\n");
-		return NULL;
-	}
-
-
-	hashbuf.length = ntohs(iph1->pl_hash->h.len) - sizeof(*iph1->pl_hash);
-	hashbuf.value = (char *)(iph1->pl_hash + 1);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "unwrapping HASH of len %zu\n",
-	    hashbuf.length);
-
-	maj_stat = gss_unwrap(&min_stat, gps->gss_context, hash_in, hash_out,
-	    NULL, NULL);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "unwrapping hash value\n");
-		return NULL;
-	}
-
-	if (gssapi_gss2vmbuf(hash_out, &outbuf) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "gss2vmbuf failed\n");
-		maj_stat = gss_release_buffer(&min_stat, hash_out);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release hash_out buffer\n");
-		return NULL;
-	}
-	maj_stat = gss_release_buffer(&min_stat, hash_out);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release hash_out buffer\n");
-
-	return outbuf;
-}
-
-void
-gssapi_set_id_sent(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-
-	gps = gssapi_get_state(iph1);
-
-	gps->gss_flags |= GSSFLAG_ID_SENT;
-}
-
-int
-gssapi_id_sent(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-
-	gps = gssapi_get_state(iph1);
-
-	return (gps->gss_flags & GSSFLAG_ID_SENT) != 0;
-}
-
-void
-gssapi_set_id_rcvd(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-
-	gps = gssapi_get_state(iph1);
-
-	gps->gss_flags |= GSSFLAG_ID_RCVD;
-}
-
-int
-gssapi_id_rcvd(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-
-	gps = gssapi_get_state(iph1);
-
-	return (gps->gss_flags & GSSFLAG_ID_RCVD) != 0;
-}
-
-void
-gssapi_free_state(struct ph1handle *iph1)
-{
-	struct gssapi_ph1_state *gps;
-	OM_uint32 maj_stat, min_stat;
-
-	gps = gssapi_get_state(iph1);
-
-	if (gps == NULL)
-		return;
-
-	gssapi_set_state(iph1, NULL);
-
-	if (gps->gss_cred != GSS_C_NO_CREDENTIAL) {
-		maj_stat = gss_release_cred(&min_stat, &gps->gss_cred);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "releasing credentials\n");
-	}
-	racoon_free(gps);
-}
-
-vchar_t *
-gssapi_get_id(struct ph1handle *iph1)
-{
-	gss_buffer_desc id_buffer;
-	gss_buffer_t id = &id_buffer;
-	gss_name_t defname, canon_name;
-	OM_uint32 min_stat, maj_stat;
-	vchar_t *vmbuf;
-
-	if (iph1->rmconf->proposal->gssid != NULL)
-		return (vdup(iph1->rmconf->proposal->gssid));
-
-	if (gssapi_get_default_name(iph1, 0, &defname) < 0)
-		return NULL;
-
-	maj_stat = gss_canonicalize_name(&min_stat, defname, GSS_C_NO_OID,
-	    &canon_name);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "canonicalize name\n");
-		maj_stat = gss_release_name(&min_stat, &defname);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release default name\n");
-		return NULL;
-	}
-	maj_stat = gss_release_name(&min_stat, &defname);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release default name\n");
-
-	maj_stat = gss_export_name(&min_stat, canon_name, id);
-	if (GSS_ERROR(maj_stat)) {
-		gssapi_error(min_stat, LOCATION, "export name\n");
-		maj_stat = gss_release_name(&min_stat, &canon_name);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION,
-			    "release canonical name\n");
-		return NULL;
-	}
-	maj_stat = gss_release_name(&min_stat, &canon_name);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release canonical name\n");
-
-#if 0
-	/*
-	 * XXXJRT Did this debug message ever work?  This is a GSS name
-	 * blob at this point.
-	 */
-	plog(LLV_DEBUG, LOCATION, NULL, "will try to acquire '%.*s' creds\n",
-	    id->length, id->value);
-#endif
-
-	if (gssapi_gss2vmbuf(id, &vmbuf) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "gss2vmbuf failed\n");
-		maj_stat = gss_release_buffer(&min_stat, id);
-		if (GSS_ERROR(maj_stat))
-			gssapi_error(min_stat, LOCATION, "release id buffer\n");
-		return NULL;
-	}
-	maj_stat = gss_release_buffer(&min_stat, id);
-	if (GSS_ERROR(maj_stat))
-		gssapi_error(min_stat, LOCATION, "release id buffer\n");
-
-	return vmbuf;
-}
-#else
-int __gssapi_dUmMy;
-#endif
diff --git a/src/racoon/gssapi.h b/src/racoon/gssapi.h
deleted file mode 100644
index 25c6c48..0000000
--- a/src/racoon/gssapi.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*	$NetBSD: gssapi.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: gssapi.h,v 1.5 2005/02/11 06:59:01 manubsd Exp */
-
-/*
- * Copyright 2000 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * This software was written by Frank van der Linden of Wasabi Systems
- * for Zembu Labs, Inc. http://www.zembu.com/
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of Wasabi Systems, Inc. may not be used to endorse
- *    or promote products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifdef __FreeBSD__
-#include "/usr/include/gssapi.h"
-#else
-#include <gssapi/gssapi.h>
-#endif
-
-#define GSSAPI_DEF_NAME         "host"
-
-struct ph1handle;
-struct isakmpsa;
-
-struct gssapi_ph1_state {
-	int gsscnt;			/* # of token we're working on */
-	int gsscnt_p;			/* # of token we're working on */
-
-	gss_buffer_desc gss[3];		/* gss-api tokens. */
-					/* NOTE: XXX this restricts the max # */
-					/* to 3. More should never happen */
-
-	gss_buffer_desc gss_p[3];
-
-	gss_ctx_id_t gss_context;	/* context for gss_init_sec_context */
-
-	OM_uint32 gss_status;		/* retval from gss_init_sec_context */
-	gss_cred_id_t gss_cred;		/* acquired credentials */
-
-	int gss_flags;
-#define GSSFLAG_ID_SENT		0x0001
-#define GSSFLAG_ID_RCVD		0x0001
-};
-
-#define	gssapi_get_state(ph)						\
-	((struct gssapi_ph1_state *)((ph)->gssapi_state))
-
-#define	gssapi_set_state(ph, st)					\
-	(ph)->gssapi_state = (st)
-
-#define	gssapi_more_tokens(ph)						\
-	((gssapi_get_state(ph)->gss_status & GSS_S_CONTINUE_NEEDED) != 0)
-
-int gssapi_get_itoken __P((struct ph1handle *, int *));
-int gssapi_get_rtoken __P((struct ph1handle *, int *));
-int gssapi_save_received_token __P((struct ph1handle *, vchar_t *));
-int gssapi_get_token_to_send __P((struct ph1handle *, vchar_t **));
-int gssapi_get_itokens __P((struct ph1handle *, vchar_t **));
-int gssapi_get_rtokens __P((struct ph1handle *, vchar_t **));
-vchar_t *gssapi_wraphash __P((struct ph1handle *));
-vchar_t *gssapi_unwraphash __P((struct ph1handle *));
-void gssapi_set_id_sent __P((struct ph1handle *));
-int gssapi_id_sent __P((struct ph1handle *));
-void gssapi_set_id_rcvd __P((struct ph1handle *));
-int gssapi_id_rcvd __P((struct ph1handle *));
-void gssapi_free_state __P((struct ph1handle *));
-vchar_t *gssapi_get_id __P((struct ph1handle *));
-vchar_t *gssapi_get_default_gss_id __P((void));
diff --git a/src/racoon/handler.c b/src/racoon/handler.c
deleted file mode 100644
index b643256..0000000
--- a/src/racoon/handler.c
+++ /dev/null
@@ -1,1571 +0,0 @@
-/*	$NetBSD: handler.c,v 1.9.6.8 2009/04/20 13:25:27 tteras Exp $	*/
-
-/* Id: handler.c,v 1.28 2006/05/26 12:17:29 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "schedule.h"
-#include "grabmyaddr.h"
-#include "algorithm.h"
-#include "crypto_openssl.h"
-#include "policy.h"
-#include "proposal.h"
-#include "isakmp_var.h"
-#include "evt.h"
-#include "isakmp.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"  
-#include "isakmp_cfg.h"
-#endif
-#include "isakmp_inf.h"
-#include "oakley.h"
-#include "remoteconf.h"
-#include "localconf.h"
-#include "handler.h"
-#include "gcmalloc.h"
-#include "nattraversal.h"
-
-#include "sainfo.h"
-
-#ifdef HAVE_GSSAPI
-#include "gssapi.h"
-#endif
-
-static LIST_HEAD(_ph1tree_, ph1handle) ph1tree;
-static LIST_HEAD(_ph2tree_, ph2handle) ph2tree;
-static LIST_HEAD(_ctdtree_, contacted) ctdtree;
-static LIST_HEAD(_rcptree_, recvdpkt) rcptree;
-
-static void del_recvdpkt __P((struct recvdpkt *));
-static void rem_recvdpkt __P((struct recvdpkt *));
-static void sweep_recvdpkt __P((void *));
-
-/*
- * functions about management of the isakmp status table
- */
-/* %%% management phase 1 handler */
-/*
- * search for isakmpsa handler with isakmp index.
- */
-
-extern caddr_t val2str(const char *, size_t);
-
-struct ph1handle *
-getph1byindex(index)
-	isakmp_index *index;
-{
-	struct ph1handle *p;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-		if (memcmp(&p->index, index, sizeof(*index)) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-
-/*
- * search for isakmp handler by i_ck in index.
- */
-struct ph1handle *
-getph1byindex0(index)
-	isakmp_index *index;
-{
-	struct ph1handle *p;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-		if (memcmp(&p->index, index, sizeof(cookie_t)) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * search for isakmpsa handler by source and remote address.
- * don't use port number to search because this function search
- * with phase 2's destinaion.
- */
-struct ph1handle *
-getph1byaddr(local, remote, established)
-	struct sockaddr *local, *remote;
-	int established;
-{
-	struct ph1handle *p;
-
-	plog(LLV_DEBUG2, LOCATION, NULL, "getph1byaddr: start\n");
-	plog(LLV_DEBUG2, LOCATION, NULL, "local: %s\n", saddr2str(local));
-	plog(LLV_DEBUG2, LOCATION, NULL, "remote: %s\n", saddr2str(remote));
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-		plog(LLV_DEBUG2, LOCATION, NULL, "p->local: %s\n", saddr2str(p->local));
-		plog(LLV_DEBUG2, LOCATION, NULL, "p->remote: %s\n", saddr2str(p->remote));
-
-		if(established && p->status != PHASE1ST_ESTABLISHED){
-			plog(LLV_DEBUG2, LOCATION, NULL, "status %d, skipping\n", p->status);
-			continue;
-		}
-		if (CMPSADDR(local, p->local) == 0
-			&& CMPSADDR(remote, p->remote) == 0){
-			plog(LLV_DEBUG2, LOCATION, NULL, "matched\n");
-			return p;
-		}
-	}
-
-	plog(LLV_DEBUG2, LOCATION, NULL, "no match\n");
-
-	return NULL;
-}
-
-struct ph1handle *
-getph1byaddrwop(local, remote)
-	struct sockaddr *local, *remote;
-{
-	struct ph1handle *p;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-		if (cmpsaddrwop(local, p->local) == 0
-		 && cmpsaddrwop(remote, p->remote) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * search for isakmpsa handler by remote address.
- * don't use port number to search because this function search
- * with phase 2's destinaion.
- */
-struct ph1handle *
-getph1bydstaddrwop(remote)
-	struct sockaddr *remote;
-{
-	struct ph1handle *p;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-		if (cmpsaddrwop(remote, p->remote) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * dump isakmp-sa
- */
-vchar_t *
-dumpph1()
-{
-	struct ph1handle *iph1;
-	struct ph1dump *pd;
-	int cnt = 0;
-	vchar_t *buf;
-
-	/* get length of buffer */
-	LIST_FOREACH(iph1, &ph1tree, chain)
-		cnt++;
-
-	buf = vmalloc(cnt * sizeof(struct ph1dump));
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer\n");
-		return NULL;
-	}
-	pd = (struct ph1dump *)buf->v;
-
-	LIST_FOREACH(iph1, &ph1tree, chain) {
-		memcpy(&pd->index, &iph1->index, sizeof(iph1->index));
-		pd->status = iph1->status;
-		pd->side = iph1->side;
-		memcpy(&pd->remote, iph1->remote, sysdep_sa_len(iph1->remote));
-		memcpy(&pd->local, iph1->local, sysdep_sa_len(iph1->local));
-		pd->version = iph1->version;
-		pd->etype = iph1->etype;
-		pd->created = iph1->created;
-		pd->ph2cnt = iph1->ph2cnt;
-		pd++;
-	}
-
-	return buf;
-}
-
-/*
- * create new isakmp Phase 1 status record to handle isakmp in Phase1
- */
-struct ph1handle *
-newph1()
-{
-	struct ph1handle *iph1;
-
-	/* create new iph1 */
-	iph1 = racoon_calloc(1, sizeof(*iph1));
-	if (iph1 == NULL)
-		return NULL;
-
-	iph1->status = PHASE1ST_SPAWN;
-
-#ifdef ENABLE_DPD
-	iph1->dpd_support = 0;
-	iph1->dpd_lastack = 0;
-	iph1->dpd_seq = 0;
-	iph1->dpd_fails = 0;
-	iph1->dpd_r_u = NULL;
-#endif
-
-	return iph1;
-}
-
-/*
- * delete new isakmp Phase 1 status record to handle isakmp in Phase1
- */
-void
-delph1(iph1)
-	struct ph1handle *iph1;
-{
-	if (iph1 == NULL)
-		return;
-
-	/* SA down shell script hook */
-	script_hook(iph1, SCRIPT_PHASE1_DOWN);
-
-	EVT_PUSH(iph1->local, iph1->remote, EVTT_PHASE1_DOWN, NULL);
-
-#ifdef ENABLE_NATT
-	if (iph1->natt_flags & NAT_KA_QUEUED)
-		natt_keepalive_remove (iph1->local, iph1->remote);
-
-	if (iph1->natt_options) {
-		racoon_free(iph1->natt_options);
-		iph1->natt_options = NULL;
-	}
-#endif
-
-#ifdef ENABLE_HYBRID
-	if (iph1->mode_cfg)
-		isakmp_cfg_rmstate(iph1);
-#endif
-
-#ifdef ENABLE_DPD
-	SCHED_KILL(iph1->dpd_r_u);
-#endif
-
-	if (iph1->remote) {
-		racoon_free(iph1->remote);
-		iph1->remote = NULL;
-	}
-	if (iph1->local) {
-		racoon_free(iph1->local);
-		iph1->local = NULL;
-	}
-	if (iph1->approval) {
-		delisakmpsa(iph1->approval);
-		iph1->approval = NULL;
-	}
-
-	VPTRINIT(iph1->authstr);
-
-	sched_scrub_param(iph1);
-	iph1->sce = NULL;
-	iph1->scr = NULL;
-
-	VPTRINIT(iph1->sendbuf);
-
-	VPTRINIT(iph1->dhpriv);
-	VPTRINIT(iph1->dhpub);
-	VPTRINIT(iph1->dhpub_p);
-	VPTRINIT(iph1->dhgxy);
-	VPTRINIT(iph1->nonce);
-	VPTRINIT(iph1->nonce_p);
-	VPTRINIT(iph1->skeyid);
-	VPTRINIT(iph1->skeyid_d);
-	VPTRINIT(iph1->skeyid_a);
-	VPTRINIT(iph1->skeyid_e);
-	VPTRINIT(iph1->key);
-	VPTRINIT(iph1->hash);
-	VPTRINIT(iph1->sig);
-	VPTRINIT(iph1->sig_p);
-	oakley_delcert(iph1->cert);
-	iph1->cert = NULL;
-	oakley_delcert(iph1->cert_p);
-	iph1->cert_p = NULL;
-	oakley_delcert(iph1->crl_p);
-	iph1->crl_p = NULL;
-	oakley_delcert(iph1->cr_p);
-	iph1->cr_p = NULL;
-	VPTRINIT(iph1->id);
-	VPTRINIT(iph1->id_p);
-
-	if(iph1->approval != NULL)
-		delisakmpsa(iph1->approval);
-
-	if (iph1->ivm) {
-		oakley_delivm(iph1->ivm);
-		iph1->ivm = NULL;
-	}
-
-	VPTRINIT(iph1->sa);
-	VPTRINIT(iph1->sa_ret);
-
-#ifdef HAVE_GSSAPI
-	VPTRINIT(iph1->gi_i);
-	VPTRINIT(iph1->gi_r);
-
-	gssapi_free_state(iph1);
-#endif
-
-	racoon_free(iph1);
-}
-
-/*
- * create new isakmp Phase 1 status record to handle isakmp in Phase1
- */
-int
-insph1(iph1)
-	struct ph1handle *iph1;
-{
-	/* validity check */
-	if (iph1->remote == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid isakmp SA handler. no remote address.\n");
-		return -1;
-	}
-	LIST_INSERT_HEAD(&ph1tree, iph1, chain);
-
-	return 0;
-}
-
-void
-remph1(iph1)
-	struct ph1handle *iph1;
-{
-	LIST_REMOVE(iph1, chain);
-}
-
-/*
- * flush isakmp-sa
- */
-void
-flushph1()
-{
-	struct ph1handle *p, *next;
-
-	for (p = LIST_FIRST(&ph1tree); p; p = next) {
-		next = LIST_NEXT(p, chain);
-
-		/* send delete information */
-		if (p->status == PHASE1ST_ESTABLISHED) 
-			isakmp_info_send_d1(p);
-
-		remph1(p);
-		delph1(p);
-	}
-}
-
-void
-initph1tree()
-{
-	LIST_INIT(&ph1tree);
-}
-
-/* %%% management phase 2 handler */
-/*
- * search ph2handle with policy id.
- */
-struct ph2handle *
-getph2byspid(spid)
-      u_int32_t spid;
-{
-	struct ph2handle *p;
-
-	LIST_FOREACH(p, &ph2tree, chain) {
-		/*
-		 * there are ph2handle independent on policy
-		 * such like informational exchange.
-		 */
-		if (p->spid == spid)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * search ph2handle with sequence number.
- */
-struct ph2handle *
-getph2byseq(seq)
-	u_int32_t seq;
-{
-	struct ph2handle *p;
-
-	LIST_FOREACH(p, &ph2tree, chain) {
-		if (p->seq == seq)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * search ph2handle with message id.
- */
-struct ph2handle *
-getph2bymsgid(iph1, msgid)
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-{
-	struct ph2handle *p;
-
-	LIST_FOREACH(p, &ph2tree, chain) {
-		if (p->msgid == msgid && p->ph1 == iph1)
-			return p;
-	}
-
-	return NULL;
-}
-
-struct ph2handle *
-getph2byid(src, dst, spid)
-	struct sockaddr *src, *dst;
-	u_int32_t spid;
-{
-	struct ph2handle *p;
-
-	LIST_FOREACH(p, &ph2tree, chain) {
-		if (spid == p->spid &&
-		    CMPSADDR(src, p->src) == 0 &&
-		    CMPSADDR(dst, p->dst) == 0){
-			/* Sanity check to detect zombie handlers
-			 * XXX Sould be done "somewhere" more interesting,
-			 * because we have lots of getph2byxxxx(), but this one
-			 * is called by pk_recvacquire(), so is the most important.
-			 */
-			if(p->status < PHASE2ST_ESTABLISHED &&
-			   p->retry_counter == 0
-			   && p->sce == NULL && p->scr == NULL){
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Zombie ph2 found, expiring it\n");
-				isakmp_ph2expire(p);
-			}else
-				return p;
-		}
-	}
-
-	return NULL;
-}
-
-struct ph2handle *
-getph2bysaddr(src, dst)
-	struct sockaddr *src, *dst;
-{
-	struct ph2handle *p;
-
-	LIST_FOREACH(p, &ph2tree, chain) {
-		if (cmpsaddrstrict(src, p->src) == 0 &&
-		    cmpsaddrstrict(dst, p->dst) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * call by pk_recvexpire().
- */
-struct ph2handle *
-getph2bysaidx(src, dst, proto_id, spi)
-	struct sockaddr *src, *dst;
-	u_int proto_id;
-	u_int32_t spi;
-{
-	struct ph2handle *iph2;
-	struct saproto *pr;
-
-	LIST_FOREACH(iph2, &ph2tree, chain) {
-		if (iph2->proposal == NULL && iph2->approval == NULL)
-			continue;
-		if (iph2->approval != NULL) {
-			for (pr = iph2->approval->head; pr != NULL;
-			     pr = pr->next) {
-				if (proto_id != pr->proto_id)
-					break;
-				if (spi == pr->spi || spi == pr->spi_p)
-					return iph2;
-			}
-		} else if (iph2->proposal != NULL) {
-			for (pr = iph2->proposal->head; pr != NULL;
-			     pr = pr->next) {
-				if (proto_id != pr->proto_id)
-					break;
-				if (spi == pr->spi)
-					return iph2;
-			}
-		}
-	}
-
-	return NULL;
-}
-
-/*
- * create new isakmp Phase 2 status record to handle isakmp in Phase2
- */
-struct ph2handle *
-newph2()
-{
-	struct ph2handle *iph2 = NULL;
-
-	/* create new iph2 */
-	iph2 = racoon_calloc(1, sizeof(*iph2));
-	if (iph2 == NULL)
-		return NULL;
-
-	iph2->status = PHASE1ST_SPAWN;
-
-	return iph2;
-}
-
-/*
- * initialize ph2handle
- * NOTE: don't initialize src/dst.
- *       SPI in the proposal is cleared.
- */
-void
-initph2(iph2)
-	struct ph2handle *iph2;
-{
-	sched_scrub_param(iph2);
-	iph2->sce = NULL;
-	iph2->scr = NULL;
-
-	VPTRINIT(iph2->sendbuf);
-	VPTRINIT(iph2->msg1);
-
-	/* clear spi, keep variables in the proposal */
-	if (iph2->proposal) {
-		struct saproto *pr;
-		for (pr = iph2->proposal->head; pr != NULL; pr = pr->next)
-			pr->spi = 0;
-	}
-
-	/* clear approval */
-	if (iph2->approval) {
-		flushsaprop(iph2->approval);
-		iph2->approval = NULL;
-	}
-
-	/* clear the generated policy */
-	if (iph2->spidx_gen) {
-		delsp_bothdir((struct policyindex *)iph2->spidx_gen);
-		racoon_free(iph2->spidx_gen);
-		iph2->spidx_gen = NULL;
-	}
-
-	if (iph2->pfsgrp) {
-		oakley_dhgrp_free(iph2->pfsgrp);
-		iph2->pfsgrp = NULL;
-	}
-
-	VPTRINIT(iph2->dhpriv);
-	VPTRINIT(iph2->dhpub);
-	VPTRINIT(iph2->dhpub_p);
-	VPTRINIT(iph2->dhgxy);
-	VPTRINIT(iph2->id);
-	VPTRINIT(iph2->id_p);
-	VPTRINIT(iph2->nonce);
-	VPTRINIT(iph2->nonce_p);
-	VPTRINIT(iph2->sa);
-	VPTRINIT(iph2->sa_ret);
-
-	if (iph2->ivm) {
-		oakley_delivm(iph2->ivm);
-		iph2->ivm = NULL;
-	}
-}
-
-/*
- * delete new isakmp Phase 2 status record to handle isakmp in Phase2
- */
-void
-delph2(iph2)
-	struct ph2handle *iph2;
-{
-	initph2(iph2);
-
-	if (iph2->src) {
-		racoon_free(iph2->src);
-		iph2->src = NULL;
-	}
-	if (iph2->dst) {
-		racoon_free(iph2->dst);
-		iph2->dst = NULL;
-	}
-	if (iph2->src_id) {
-	      racoon_free(iph2->src_id);
-	      iph2->src_id = NULL;
-	}
-	if (iph2->dst_id) {
-	      racoon_free(iph2->dst_id);
-	      iph2->dst_id = NULL;
-	}
-
-	if (iph2->proposal) {
-		flushsaprop(iph2->proposal);
-		iph2->proposal = NULL;
-	}
-
-	racoon_free(iph2);
-}
-
-/*
- * create new isakmp Phase 2 status record to handle isakmp in Phase2
- */
-int
-insph2(iph2)
-	struct ph2handle *iph2;
-{
-	LIST_INSERT_HEAD(&ph2tree, iph2, chain);
-
-	return 0;
-}
-
-void
-remph2(iph2)
-	struct ph2handle *iph2;
-{
-	LIST_REMOVE(iph2, chain);
-}
-
-void
-initph2tree()
-{
-	LIST_INIT(&ph2tree);
-}
-
-void
-flushph2()
-{
-	struct ph2handle *p, *next;
-
-	plog(LLV_DEBUG2, LOCATION, NULL,
-		 "flushing all ph2 handlers...\n");
-
-	for (p = LIST_FIRST(&ph2tree); p; p = next) {
-		next = LIST_NEXT(p, chain);
-
-		/* send delete information */
-		if (p->status == PHASE2ST_ESTABLISHED){
-			plog(LLV_DEBUG2, LOCATION, NULL,
-				 "got a ph2 handler to flush...\n");
-			isakmp_info_send_d2(p);
-		}else{
-			plog(LLV_DEBUG2, LOCATION, NULL,
-				 "skipping ph2 handler (state %d)\n", p->status);
-		}
-
-		delete_spd(p, 0);
-		unbindph12(p);
-		remph2(p);
-		delph2(p);
-	}
-}
-
-/*
- * Delete all Phase 2 handlers for this src/dst/proto.  This
- * is used during INITIAL-CONTACT processing (so no need to
- * send a message to the peer).
- */
-void
-deleteallph2(src, dst, proto_id)
-	struct sockaddr *src, *dst;
-	u_int proto_id;
-{
-	struct ph2handle *iph2, *next;
-	struct saproto *pr;
-
-	for (iph2 = LIST_FIRST(&ph2tree); iph2 != NULL; iph2 = next) {
-		next = LIST_NEXT(iph2, chain);
-		if (iph2->proposal == NULL && iph2->approval == NULL)
-			continue;
-		if (iph2->approval != NULL) {
-			for (pr = iph2->approval->head; pr != NULL;
-			     pr = pr->next) {
-				if (proto_id == pr->proto_id)
-					goto zap_it;
-			}
-		} else if (iph2->proposal != NULL) {
-			for (pr = iph2->proposal->head; pr != NULL;
-			     pr = pr->next) {
-				if (proto_id == pr->proto_id)
-					goto zap_it;
-			}
-		}
-		continue;
- zap_it:
-		unbindph12(iph2);
-		remph2(iph2);
-		delph2(iph2);
-	}
-}
-
-/* %%% */
-void
-bindph12(iph1, iph2)
-	struct ph1handle *iph1;
-	struct ph2handle *iph2;
-{
-	iph2->ph1 = iph1;
-	LIST_INSERT_HEAD(&iph1->ph2tree, iph2, ph1bind);
-}
-
-void
-unbindph12(iph2)
-	struct ph2handle *iph2;
-{
-	if (iph2->ph1 != NULL) {
-		iph2->ph1 = NULL;
-		LIST_REMOVE(iph2, ph1bind);
-	}
-}
-
-/* %%% management contacted list */
-/*
- * search contacted list.
- */
-struct contacted *
-getcontacted(remote)
-	struct sockaddr *remote;
-{
-	struct contacted *p;
-
-	LIST_FOREACH(p, &ctdtree, chain) {
-		if (cmpsaddrstrict(remote, p->remote) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * create new isakmp Phase 2 status record to handle isakmp in Phase2
- */
-int
-inscontacted(remote)
-	struct sockaddr *remote;
-{
-	struct contacted *new;
-
-	/* create new iph2 */
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return -1;
-
-	new->remote = dupsaddr(remote);
-	if (new->remote == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		racoon_free(new);
-		return -1;
-	}
-
-	LIST_INSERT_HEAD(&ctdtree, new, chain);
-
-	return 0;
-}
-
-void
-initctdtree()
-{
-	LIST_INIT(&ctdtree);
-}
-
-/*
- * check the response has been sent to the peer.  when not, simply reply
- * the buffered packet to the peer.
- * OUT:
- *	 0:	the packet is received at the first time.
- *	 1:	the packet was processed before.
- *	 2:	the packet was processed before, but the address mismatches.
- *	-1:	error happened.
- */
-int
-check_recvdpkt(remote, local, rbuf)
-	struct sockaddr *remote, *local;
-	vchar_t *rbuf;
-{
-	vchar_t *hash;
-	struct recvdpkt *r;
-	time_t t;
-	int len, s;
-
-	/* set current time */
-	t = time(NULL);
-
-	hash = eay_md5_one(rbuf);
-	if (!hash) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		return -1;
-	}
-
-	LIST_FOREACH(r, &rcptree, chain) {
-		if (memcmp(hash->v, r->hash->v, r->hash->l) == 0)
-			break;
-	}
-	vfree(hash);
-
-	/* this is the first time to receive the packet */
-	if (r == NULL)
-		return 0;
-
-	/*
-	 * the packet was processed before, but the remote address mismatches.
-	 */
-	if (cmpsaddrstrict(remote, r->remote) != 0)
-		return 2;
-
-	/*
-	 * it should not check the local address because the packet
-	 * may arrive at other interface.
-	 */
-
-	/* check the previous time to send */
-	if (t - r->time_send < 1) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"the packet retransmitted in a short time from %s\n",
-			saddr2str(remote));
-		/*XXX should it be error ? */
-	}
-
-	/* select the socket to be sent */
-	s = getsockmyaddr(r->local);
-	if (s == -1)
-		return -1;
-
-	/* resend the packet if needed */
-	len = sendfromto(s, r->sendbuf->v, r->sendbuf->l,
-			r->local, r->remote, lcconf->count_persend);
-	if (len == -1) {
-		plog(LLV_ERROR, LOCATION, NULL, "sendfromto failed\n");
-		return -1;
-	}
-
-	/* check the retry counter */
-	r->retry_counter--;
-	if (r->retry_counter <= 0) {
-		rem_recvdpkt(r);
-		del_recvdpkt(r);
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"deleted the retransmission packet to %s.\n",
-			saddr2str(remote));
-	} else
-		r->time_send = t;
-
-	return 1;
-}
-
-/*
- * adding a hash of received packet into the received list.
- */
-int
-add_recvdpkt(remote, local, sbuf, rbuf)
-	struct sockaddr *remote, *local;
-	vchar_t *sbuf, *rbuf;
-{
-	struct recvdpkt *new = NULL;
-
-	if (lcconf->retry_counter == 0) {
-		/* no need to add it */
-		return 0;
-	}
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (!new) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		return -1;
-	}
-
-	new->hash = eay_md5_one(rbuf);
-	if (!new->hash) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		del_recvdpkt(new);
-		return -1;
-	}
-	new->remote = dupsaddr(remote);
-	if (new->remote == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		del_recvdpkt(new);
-		return -1;
-	}
-	new->local = dupsaddr(local);
-	if (new->local == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		del_recvdpkt(new);
-		return -1;
-	}
-	new->sendbuf = vdup(sbuf);
-	if (new->sendbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		del_recvdpkt(new);
-		return -1;
-	}
-
-	new->retry_counter = lcconf->retry_counter;
-	new->time_send = 0;
-	new->created = time(NULL);
-
-	LIST_INSERT_HEAD(&rcptree, new, chain);
-
-	return 0;
-}
-
-void
-del_recvdpkt(r)
-	struct recvdpkt *r;
-{
-	if (r->remote)
-		racoon_free(r->remote);
-	if (r->local)
-		racoon_free(r->local);
-	if (r->hash)
-		vfree(r->hash);
-	if (r->sendbuf)
-		vfree(r->sendbuf);
-	racoon_free(r);
-}
-
-void
-rem_recvdpkt(r)
-	struct recvdpkt *r;
-{
-	LIST_REMOVE(r, chain);
-}
-
-void
-sweep_recvdpkt(dummy)
-	void *dummy;
-{
-	struct recvdpkt *r, *next;
-	time_t t, lt;
-
-	/* set current time */
-	t = time(NULL);
-
-	/* set the lifetime of the retransmission */
-	lt = lcconf->retry_counter * lcconf->retry_interval;
-
-	for (r = LIST_FIRST(&rcptree); r; r = next) {
-		next = LIST_NEXT(r, chain);
-
-		if (t - r->created > lt) {
-			rem_recvdpkt(r);
-			del_recvdpkt(r);
-		}
-	}
-
-	sched_new(lt, sweep_recvdpkt, NULL);
-}
-
-void
-init_recvdpkt()
-{
-	time_t lt = lcconf->retry_counter * lcconf->retry_interval;
-
-	LIST_INIT(&rcptree);
-
-	sched_new(lt, sweep_recvdpkt, NULL);
-}
-
-#ifdef ENABLE_HYBRID
-/* 
- * Retruns 0 if the address was obtained by ISAKMP mode config, 1 otherwise
- * This should be in isakmp_cfg.c but ph1tree being private, it must be there
- */
-int
-exclude_cfg_addr(addr)
-	const struct sockaddr *addr;
-{
-	struct ph1handle *p;
-	struct sockaddr_in *sin;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if ((p->mode_cfg != NULL) &&
-		    (p->mode_cfg->flags & ISAKMP_CFG_GOT_ADDR4) &&
-		    (addr->sa_family == AF_INET)) {
-			sin = (struct sockaddr_in *)addr;
-			if (sin->sin_addr.s_addr == p->mode_cfg->addr4.s_addr)
-				return 0;
-		}
-	}
-
-	return 1;
-}
-#endif
-
-
-
-/* 
- * Reload conf code
- */
-static int revalidate_ph2(struct ph2handle *iph2){
-	struct sainfoalg *alg;
-	int found, check_level;
-	struct sainfo *sainfo;
-	struct saprop *approval;
-	struct ph1handle *iph1;
-
-	/* 
-	 * Get the new sainfo using values of the old one
-	 */
-	if (iph2->sainfo != NULL) {
-		iph2->sainfo = getsainfo(iph2->sainfo->idsrc, 
-					  iph2->sainfo->iddst, iph2->sainfo->id_i,
-					  iph2->sainfo->remoteid);
-	}
-	approval = iph2->approval;
-	sainfo = iph2->sainfo;
-
-	if (sainfo == NULL) {
-		/* 
-		 * Sainfo has been removed
-		 */
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: No sainfo for ph2\n");
-		return 0;
-	}
-
-	if (approval == NULL) {
-		/*
-		 * XXX why do we have a NULL approval sometimes ???
-		 */
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "No approval found !\n");
-		return 0;
-	}	
-
-	/*
-	 * Don't care about proposals, should we do something ?
-	 * We have to keep iph2->proposal valid at least for initiator,
-	 * for pk_sendgetspi()
-	 */
-
-	plog(LLV_DEBUG, LOCATION, NULL, "active single bundle:\n");
-	printsaprop0(LLV_DEBUG, approval);
-
-	/*
-	 * Validate approval against sainfo
-	 * Note: we must have an updated ph1->rmconf before doing that,
-	 * we'll set check_level to EXACT if we don't have a ph1
-	 * XXX try tu find the new remote section to get the new check level ?
-	 * XXX lifebyte
-	 */
-	if (iph2->ph1 != NULL)
-		iph1=iph2->ph1;
-	else
-		iph1=getph1byaddr(iph2->src, iph2->dst, 0);
-
-	if(iph1 != NULL && iph1->rmconf != NULL) {
-		check_level = iph1->rmconf->pcheck_level;
-	} else {
-		if(iph1 != NULL)
-			plog(LLV_DEBUG, LOCATION, NULL, "No phase1 rmconf found !\n");
-		else
-			plog(LLV_DEBUG, LOCATION, NULL, "No phase1 found !\n");
-		check_level = PROP_CHECK_EXACT;
-	}
-
-	switch (check_level) {
-	case PROP_CHECK_OBEY:
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: OBEY for ph2, ok\n");
-		return 1;
-		break;
-
-	case PROP_CHECK_STRICT:
-		/* FALLTHROUGH */
-	case PROP_CHECK_CLAIM:
-		if (sainfo->lifetime < approval->lifetime) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: lifetime mismatch\n");
-			return 0;
-		}
-
-#if 0
-		/* Lifebyte is deprecated, just ignore it
-		 */
-		if (sainfo->lifebyte < approval->lifebyte) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: lifebyte mismatch\n");
-			return 0;
-		}
-#endif
-
-		if (sainfo->pfs_group &&
-		   sainfo->pfs_group != approval->pfs_group) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: PFS group mismatch\n");
-			return 0;
-		}
-		break;
-
-	case PROP_CHECK_EXACT:
-		if (sainfo->lifetime != approval->lifetime ||
-#if 0
-			/* Lifebyte is deprecated, just ignore it
-			 */
-		    sainfo->lifebyte != approval->lifebyte ||
-#endif
-		    sainfo->pfs_group != iph2->approval->pfs_group) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-			    "Reload: lifetime | pfs mismatch\n");
-			return 0;
-		}
-		break;
-
-	default:
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: Shouldn't be here !\n");
-		return 0;
-		break;
-	}
-
-	for (alg = sainfo->algs[algclass_ipsec_auth]; alg; alg = alg->next) {
-		if (alg->alg == approval->head->head->authtype)
-			break;
-	}
-	if (alg == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: alg == NULL (auth)\n");
-		return 0;
-	}
-
-	found = 0;
-	for (alg = sainfo->algs[algclass_ipsec_enc]; 
-	    (found == 0 && alg != NULL); alg = alg->next) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: next ph2 enc alg...\n");
-
-		if (alg->alg != approval->head->head->trns_id){
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: encmode mismatch (%d / %d)\n",
-				 alg->alg, approval->head->head->trns_id);
-			continue;
-		}
-
-		switch (check_level){
-		/* PROP_CHECK_STRICT cannot happen here */
-		case PROP_CHECK_EXACT:
-			if (alg->encklen != approval->head->head->encklen) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: enclen mismatch\n");
-				continue;
-			}
-			break;
-
-		case PROP_CHECK_CLAIM:
-			/* FALLTHROUGH */
-		case PROP_CHECK_STRICT:
-			if (alg->encklen > approval->head->head->encklen) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: enclen mismatch\n");
-				continue;
-			}
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "unexpected check_level\n");
-			continue;
-			break;
-		}
-		found = 1;
-	}
-
-	if (!found){
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: No valid enc\n");
-		return 0;
-	}
-
-	/*
-	 * XXX comp
-	 */
-	plog(LLV_DEBUG, LOCATION, NULL,
-		 "Reload: ph2 check ok\n");
-
-	return 1;
-}
-
-
-static void 
-remove_ph2(struct ph2handle *iph2)
-{
-	u_int32_t spis[2];
-
-	if(iph2 == NULL)
-		return;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		 "Deleting a Ph2...\n");
-
-	if (iph2->status == PHASE2ST_ESTABLISHED)
-		isakmp_info_send_d2(iph2);
-
-	if(iph2->approval != NULL && iph2->approval->head != NULL){
-		spis[0]=iph2->approval->head->spi;
-		spis[1]=iph2->approval->head->spi_p;
-
-		/* purge_ipsec_spi() will do all the work:
-		 * - delete SPIs in kernel
-		 * - delete generated SPD
-		 * - unbind / rem / del ph2
-		 */
-		purge_ipsec_spi(iph2->dst, iph2->approval->head->proto_id,
-						spis, 2);
-	}else{
-		unbindph12(iph2);
-		remph2(iph2);
-		delph2(iph2);
-	}
-}
-
-static void remove_ph1(struct ph1handle *iph1){
-	struct ph2handle *iph2, *iph2_next;
-
-	if(iph1 == NULL)
-		return;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		 "Removing PH1...\n");
-
-	if (iph1->status == PHASE1ST_ESTABLISHED){
-		for (iph2 = LIST_FIRST(&iph1->ph2tree); iph2; iph2 = iph2_next) {
-			iph2_next = LIST_NEXT(iph2, chain);
-			remove_ph2(iph2);
-		}
-		isakmp_info_send_d1(iph1);
-	}
-	iph1->status = PHASE1ST_EXPIRED;
-	iph1->sce = sched_new(1, isakmp_ph1delete_stub, iph1);
-}
-
-
-static int revalidate_ph1tree_rmconf(void){
-	struct ph1handle *p, *next;
-	struct remoteconf *newrmconf;
-
-	for (p = LIST_FIRST(&ph1tree); p; p = next) {
-		next = LIST_NEXT(p, chain);
-
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-
-		newrmconf=getrmconf(p->remote);
-		if(newrmconf == NULL){
-			p->rmconf = NULL;
-			remove_ph1(p);
-		}else{
-			/* Do not free old rmconf, it is just a pointer to an entry in rmtree
-			 */
-			p->rmconf=newrmconf;
-			if(p->approval != NULL){
-				struct isakmpsa *tmpsa;
-
-				tmpsa=dupisakmpsa(p->approval);
-				if(tmpsa != NULL){
-					delisakmpsa(p->approval);
-					p->approval=tmpsa;
-					p->approval->rmconf=newrmconf;
-				}
-			}
-		}
-	}
-
-	return 1;
-}
-
-
-/* rmconf is already updated here
- */
-static int revalidate_ph1(struct ph1handle *iph1){
-	struct isakmpsa *p, *approval;
-	struct etypes *e;
-
-	if(iph1 == NULL ||
-	   iph1->approval == NULL ||
-		iph1->rmconf == NULL)
-		return 0;
-
-	approval=iph1->approval;
-
-	for (e = iph1->rmconf->etypes; e != NULL; e = e->next){
-		if (iph1->etype == e->type)
-			break;
-	}
-
-	if (e == NULL){
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: Exchange type mismatch\n");
-		return 0;
-	}
-
-	if (iph1->etype == ISAKMP_ETYPE_AGG &&
-	   approval->dh_group != iph1->rmconf->dh_group){
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: DH mismatch\n");
-		return 0;
-	}
-
-	for (p=iph1->rmconf->proposal; p != NULL; p=p->next){
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "Reload: Trying next proposal...\n");
-
-		if(approval->authmethod != p->authmethod){
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: Authmethod mismatch\n");
-			continue;
-		}
-
-		if(approval->enctype != p->enctype){
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: enctype mismatch\n");
-			continue;
-		}
-
-		switch (iph1->rmconf->pcheck_level) {
-		case PROP_CHECK_OBEY:
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: OBEY pcheck level, ok...\n");
-			return 1;
-			break;
-
-		case PROP_CHECK_CLAIM:
-			/* FALLTHROUGH */
-		case PROP_CHECK_STRICT:
-			if (approval->encklen < p->encklen) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: encklen mismatch\n");
-				continue;
-			}
-
-			if (approval->lifetime > p->lifetime) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: lifetime mismatch\n");
-				continue;
-			}
-
-#if 0
-			/* Lifebyte is deprecated, just ignore it
-			 */
-			if (approval->lifebyte > p->lifebyte) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: lifebyte mismatch\n");
-				continue;
-			}
-#endif
-			break;
-
-		case PROP_CHECK_EXACT:
-			if (approval->encklen != p->encklen) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: encklen mismatch\n");
-				continue;
-			}
-
-			if (approval->lifetime != p->lifetime) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: lifetime mismatch\n");
-				continue;
-			}
-
-#if 0
-			/* Lifebyte is deprecated, just ignore it
-			 */
-			if (approval->lifebyte != p->lifebyte) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					 "Reload: lifebyte mismatch\n");
-				continue;
-			}
-#endif
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "unexpected check_level\n");
-			continue;
-			break;
-		}
-
-		if (approval->hashtype != p->hashtype) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: hashtype mismatch\n");
-			continue;
-		}
-
-		if (iph1->etype != ISAKMP_ETYPE_AGG &&
-		    approval->dh_group != p->dh_group) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "Reload: dhgroup mismatch\n");
-			continue;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL, "Reload: Conf ok\n");
-		return 1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "Reload: No valid conf found\n");
-	return 0;
-}
-
-
-static int revalidate_ph1tree(void){
-	struct ph1handle *p, *next;
-
-	for (p = LIST_FIRST(&ph1tree); p; p = next) {
-		next = LIST_NEXT(p, chain);
-
-		if (p->status == PHASE1ST_EXPIRED)
-			continue;
-
-		if(!revalidate_ph1(p))
-			remove_ph1(p);
-	}
-
-	return 1;
-}
-
-static int revalidate_ph2tree(void){
-	struct ph2handle *p, *next;
-
-	for (p = LIST_FIRST(&ph2tree); p; p = next) {
-		next = LIST_NEXT(p, chain);
-
-		if (p->status == PHASE2ST_EXPIRED)
-			continue;
-
-		if(!revalidate_ph2(p)){
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "PH2 not validated, removing it\n");
-			remove_ph2(p);
-		}
-	}
-
-	return 1;
-}
-
-int 
-revalidate_ph12(void)
-{
-
-	revalidate_ph1tree_rmconf();
-
-	revalidate_ph2tree();
-	revalidate_ph1tree();
-
-	return 1;
-}
-
-#ifdef ENABLE_HYBRID
-struct ph1handle *
-getph1bylogin(login)
-	char *login;
-{
-	struct ph1handle *p;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->mode_cfg == NULL)
-			continue;
-		if (strncmp(p->mode_cfg->login, login, LOGINLEN) == 0)
-			return p;
-	}
-
-	return NULL;
-}
-
-int
-purgeph1bylogin(login)
-	char *login;
-{
-	struct ph1handle *p;
-	int found = 0;
-
-	LIST_FOREACH(p, &ph1tree, chain) {
-		if (p->mode_cfg == NULL)
-			continue;
-		if (strncmp(p->mode_cfg->login, login, LOGINLEN) == 0) {
-			if (p->status == PHASE1ST_ESTABLISHED)
-				isakmp_info_send_d1(p);
-			purge_remote(p);
-			found++;
-		}
-	}
-
-	return found;
-}
-#endif
diff --git a/src/racoon/handler.h b/src/racoon/handler.h
deleted file mode 100644
index a52dc6c..0000000
--- a/src/racoon/handler.h
+++ /dev/null
@@ -1,483 +0,0 @@
-/*	$NetBSD: handler.h,v 1.9.6.1 2008/01/11 14:12:01 vanhu Exp $	*/
-
-/* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _HANDLER_H
-#define _HANDLER_H
-
-#include <sys/queue.h>
-#include <openssl/rsa.h>
-
-#include <sys/time.h>
-
-#include "isakmp_var.h"
-#include "oakley.h"
-
-/* Phase 1 handler */
-/*
- * main mode:
- *      initiator               responder
- *  0   (---)                   (---)
- *  1   start                   start (1st msg received)
- *  2   (---)                   1st valid msg received
- *  3   1st msg sent	        1st msg sent
- *  4   1st valid msg received  2st valid msg received
- *  5   2nd msg sent            2nd msg sent
- *  6   2nd valid msg received  3rd valid msg received
- *  7   3rd msg sent            3rd msg sent
- *  8   3rd valid msg received  (---)
- *  9   SA established          SA established
- *
- * aggressive mode:
- *      initiator               responder
- *  0   (---)                   (---)
- *  1   start                   start (1st msg received)
- *  2   (---)                   1st valid msg received
- *  3   1st msg sent	        1st msg sent
- *  4   1st valid msg received  2st valid msg received
- *  5   (---)                   (---)
- *  6   (---)                   (---)
- *  7   (---)                   (---)
- *  8   (---)                   (---)
- *  9   SA established          SA established
- *
- * base mode:
- *      initiator               responder
- *  0   (---)                   (---)
- *  1   start                   start (1st msg received)
- *  2   (---)                   1st valid msg received
- *  3   1st msg sent	        1st msg sent
- *  4   1st valid msg received  2st valid msg received
- *  5   2nd msg sent            (---)
- *  6   (---)                   (---)
- *  7   (---)                   (---)
- *  8   (---)                   (---)
- *  9   SA established          SA established
- */
-#define PHASE1ST_SPAWN			0
-#define PHASE1ST_START			1
-#define PHASE1ST_MSG1RECEIVED		2
-#define PHASE1ST_MSG1SENT		3
-#define PHASE1ST_MSG2RECEIVED		4
-#define PHASE1ST_MSG2SENT		5
-#define PHASE1ST_MSG3RECEIVED		6
-#define PHASE1ST_MSG3SENT		7
-#define PHASE1ST_MSG4RECEIVED		8
-#define PHASE1ST_ESTABLISHED		9
-#define PHASE1ST_EXPIRED		10
-#define PHASE1ST_MAX			11
-
-/* About address semantics in each case.
- *			initiator(addr=I)	responder(addr=R)
- *			src	dst		src	dst
- *			(local)	(remote)	(local)	(remote)
- * phase 1 handler	I	R		R	I
- * phase 2 handler	I	R		R	I
- * getspi msg		R	I		I	R
- * acquire msg		I	R
- * ID payload		I	R		I	R
- */
-#ifdef ENABLE_HYBRID
-struct isakmp_cfg_state;
-#endif
-struct ph1handle {
-	isakmp_index index;
-
-	int status;			/* status of this SA */
-	int side;			/* INITIATOR or RESPONDER */
-
-	struct sockaddr *remote;	/* remote address to negosiate ph1 */
-	struct sockaddr *local;		/* local address to negosiate ph1 */
-			/* XXX copy from rmconf due to anonymous configuration.
-			 * If anonymous will be forbidden, we do delete them. */
-
-	struct remoteconf *rmconf;	/* pointer to remote configuration */
-
-	struct isakmpsa *approval;	/* pointer to SA(s) approved. */
-	vchar_t *authstr;		/* place holder of string for auth. */
-					/* for example pre-shared key */
-
-	u_int8_t version;		/* ISAKMP version */
-	u_int8_t etype;			/* Exchange type actually for use */
-	u_int8_t flags;			/* Flags */
-	u_int32_t msgid;		/* message id */
-
-#ifdef ENABLE_NATT
-	struct ph1natt_options *natt_options;	/* Selected NAT-T IKE version */
-	u_int32_t natt_flags;		/* NAT-T related flags */
-#endif
-#ifdef ENABLE_FRAG
-	int frag;			/* IKE phase 1 fragmentation */
-	struct isakmp_frag_item *frag_chain;	/* Received fragments */
-#endif
-
-	struct sched *sce;		/* schedule for expire */
-
-	struct sched *scr;		/* schedule for resend */
-	int retry_counter;		/* for resend. */
-	vchar_t *sendbuf;		/* buffer for re-sending */
-
-	vchar_t *dhpriv;		/* DH; private value */
-	vchar_t *dhpub;			/* DH; public value */
-	vchar_t *dhpub_p;		/* DH; partner's public value */
-	vchar_t *dhgxy;			/* DH; shared secret */
-	vchar_t *nonce;			/* nonce value */
-	vchar_t *nonce_p;		/* partner's nonce value */
-	vchar_t *skeyid;		/* SKEYID */
-	vchar_t *skeyid_d;		/* SKEYID_d */
-	vchar_t *skeyid_a;		/* SKEYID_a, i.e. hash */
-	vchar_t *skeyid_e;		/* SKEYID_e, i.e. encryption */
-	vchar_t *key;			/* cipher key */
-	vchar_t *hash;			/* HASH minus general header */
-	vchar_t *sig;			/* SIG minus general header */
-	vchar_t *sig_p;			/* peer's SIG minus general header */
-	cert_t *cert;			/* CERT minus general header */
-	cert_t *cert_p;			/* peer's CERT minus general header */
-	cert_t *crl_p;			/* peer's CRL minus general header */
-	cert_t *cr_p;			/* peer's CR not including general */
-	RSA *rsa;			/* my RSA key */
-	RSA *rsa_p;			/* peer's RSA key */
-	struct genlist *rsa_candidates;	/* possible candidates for peer's RSA key */
-	vchar_t *id;			/* ID minus gen header */
-	vchar_t *id_p;			/* partner's ID minus general header */
-					/* i.e. struct ipsecdoi_id_b*. */
-	struct isakmp_ivm *ivm;		/* IVs */
-
-	vchar_t *sa;			/* whole SA payload to send/to be sent*/
-					/* to calculate HASH */
-					/* NOT INCLUDING general header. */
-
-	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
-					/* NOT INCLUDING general header. */
-					/* NOTE: Should be release after use. */
-
-#ifdef HAVE_GSSAPI
-	void *gssapi_state;		/* GSS-API specific state. */
-					/* Allocated when needed */
-	vchar_t *gi_i;			/* optional initiator GSS id */
-	vchar_t *gi_r;			/* optional responder GSS id */
-#endif
-
-	struct isakmp_pl_hash *pl_hash;	/* pointer to hash payload */
-
-	time_t created;			/* timestamp for establish */
-#ifdef ENABLE_STATS
-	struct timeval start;
-	struct timeval end;
-#endif
-
-#ifdef ENABLE_DPD
-	int		dpd_support;	/* Does remote supports DPD ? */
-	time_t		dpd_lastack;	/* Last ack received */
-	u_int16_t	dpd_seq;		/* DPD seq number to receive */
-	u_int8_t	dpd_fails;		/* number of failures */
-	struct sched	*dpd_r_u;
-#endif
-
-	u_int32_t msgid2;		/* msgid counter for Phase 2 */
-	int ph2cnt;	/* the number which is negotiated by this phase 1 */
-	LIST_HEAD(_ph2ofph1_, ph2handle) ph2tree;
-
-	LIST_ENTRY(ph1handle) chain;
-#ifdef ENABLE_HYBRID
-	struct isakmp_cfg_state *mode_cfg;	/* ISAKMP mode config state */
-#endif       
-
-};
-
-/* Phase 2 handler */
-/* allocated per a SA or SA bundles of a pair of peer's IP addresses. */
-/*
- *      initiator               responder
- *  0   (---)                   (---)
- *  1   start                   start (1st msg received)
- *  2   acquire msg get         1st valid msg received
- *  3   getspi request sent     getspi request sent
- *  4   getspi done             getspi done
- *  5   1st msg sent            1st msg sent
- *  6   1st valid msg received  2nd valid msg received
- *  7   (commit bit)            (commit bit)
- *  8   SAs added               SAs added
- *  9   SAs established         SAs established
- * 10   SAs expired             SAs expired
- */
-#define PHASE2ST_SPAWN		0
-#define PHASE2ST_START		1
-#define PHASE2ST_STATUS2	2
-#define PHASE2ST_GETSPISENT	3
-#define PHASE2ST_GETSPIDONE	4
-#define PHASE2ST_MSG1SENT	5
-#define PHASE2ST_STATUS6	6
-#define PHASE2ST_COMMIT		7
-#define PHASE2ST_ADDSA		8
-#define PHASE2ST_ESTABLISHED	9
-#define PHASE2ST_EXPIRED	10
-#define PHASE2ST_MAX		11
-
-struct ph2handle {
-	struct sockaddr *src;		/* my address of SA. */
-	struct sockaddr *dst;		/* peer's address of SA. */
-
-		/*
-		 * copy ip address from ID payloads when ID type is ip address.
-		 * In other case, they must be null.
-		 */
-	struct sockaddr *src_id;
-	struct sockaddr *dst_id;
-
-	u_int32_t spid;			/* policy id by kernel */
-
-	int status;			/* ipsec sa status */
-	u_int8_t side;			/* INITIATOR or RESPONDER */
-
-	struct sched *sce;		/* schedule for expire */
-	struct sched *scr;		/* schedule for resend */
-	int retry_counter;		/* for resend. */
-	vchar_t *sendbuf;		/* buffer for re-sending */
-	vchar_t *msg1;			/* buffer for re-sending */
-				/* used for responder's first message */
-
-	int retry_checkph1;		/* counter to wait phase 1 finished. */
-					/* NOTE: actually it's timer. */
-
-	u_int32_t seq;			/* sequence number used by PF_KEY */
-			/*
-			 * NOTE: In responder side, we can't identify each SAs
-			 * with same destination address for example, when
-			 * socket based SA is required.  So we set a identifier
-			 * number to "seq", and sent kernel by pfkey.
-			 */
-	u_int8_t satype;		/* satype in PF_KEY */
-			/*
-			 * saved satype in the original PF_KEY request from
-			 * the kernel in order to reply a error.
-			 */
-
-	u_int8_t flags;			/* Flags for phase 2 */
-	u_int32_t msgid;		/* msgid for phase 2 */
-
-	struct sainfo *sainfo;		/* place holder of sainfo */
-	struct saprop *proposal;	/* SA(s) proposal. */
-	struct saprop *approval;	/* SA(s) approved. */
-	caddr_t spidx_gen;		/* policy from peer's proposal */
-
-	struct dhgroup *pfsgrp;		/* DH; prime number */
-	vchar_t *dhpriv;		/* DH; private value */
-	vchar_t *dhpub;			/* DH; public value */
-	vchar_t *dhpub_p;		/* DH; partner's public value */
-	vchar_t *dhgxy;			/* DH; shared secret */
-	vchar_t *id;			/* ID minus gen header */
-	vchar_t *id_p;			/* peer's ID minus general header */
-	vchar_t *nonce;			/* nonce value in phase 2 */
-	vchar_t *nonce_p;		/* partner's nonce value in phase 2 */
-
-	vchar_t *sa;			/* whole SA payload to send/to be sent*/
-					/* to calculate HASH */
-					/* NOT INCLUDING general header. */
-
-	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
-					/* NOT INCLUDING general header. */
-					/* NOTE: Should be release after use. */
-
-	struct isakmp_ivm *ivm;		/* IVs */
-
-	int generated_spidx;	/* mark handlers whith generated policy */
-
-#ifdef ENABLE_STATS
-	struct timeval start;
-	struct timeval end;
-#endif
-	struct ph1handle *ph1;	/* back pointer to isakmp status */
-
-	LIST_ENTRY(ph2handle) chain;
-	LIST_ENTRY(ph2handle) ph1bind;	/* chain to ph1handle */
-};
-
-/*
- * for handling initial contact.
- */
-struct contacted {
-	struct sockaddr *remote;	/* remote address to negosiate ph1 */
-	LIST_ENTRY(contacted) chain;
-};
-
-/*
- * for checking a packet retransmited.
- */
-struct recvdpkt {
-	struct sockaddr *remote;	/* the remote address */
-	struct sockaddr *local;		/* the local address */
-	vchar_t *hash;			/* hash of the received packet */
-	vchar_t *sendbuf;		/* buffer for the response */
-	int retry_counter;		/* how many times to send */
-	time_t time_send;		/* timestamp to send a packet */
-	time_t created;			/* timestamp to create a queue */
-
-	struct sched *scr;		/* schedule for resend, may not used */
-
-	LIST_ENTRY(recvdpkt) chain;
-};
-
-/* for parsing ISAKMP header. */
-struct isakmp_parse_t {
-	u_char type;		/* payload type of mine */
-	int len;		/* ntohs(ptr->len) */
-	struct isakmp_gen *ptr;
-};
-
-/*
- * for IV management.
- *
- * - normal case
- * initiator                                     responder
- * -------------------------                     --------------------------
- * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
- * encode by ive(A).
- * save to iv(B).            ---[packet(B)]-->   save to ive(B).
- *                                               decode by iv(A).
- *                                               packet consistency.
- *                                               sync iv(B) with ive(B).
- *                                               check auth, integrity.
- *                                               encode by ive(B).
- * save to ive(C).          <--[packet(C)]---    save to iv(C).
- * decoded by iv(B).
- *      :
- *
- * - In the case that a error is found while cipher processing,
- * initiator                                     responder
- * -------------------------                     --------------------------
- * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
- * encode by ive(A).
- * save to iv(B).            ---[packet(B)]-->   save to ive(B).
- *                                               decode by iv(A).
- *                                               packet consistency.
- *                                               sync iv(B) with ive(B).
- *                                               check auth, integrity.
- *                                               error found.
- *                                               create notify.
- *                                               get ive2(X) from iv(B).
- *                                               encode by ive2(X).
- * get iv2(X) from iv(B).   <--[packet(Y)]---    save to iv2(Y).
- * save to ive2(Y).
- * decoded by iv2(X).
- *      :
- *
- * The reason why the responder synchronizes iv with ive after checking the
- * packet consistency is that it is required to leave the IV for decoding
- * packet.  Because there is a potential of error while checking the packet
- * consistency.  Also the reason why that is before authentication and
- * integirty check is that the IV for informational exchange has to be made
- * by the IV which is after packet decoded and checking the packet consistency.
- * Otherwise IV mismatched happens between the intitiator and the responder.
- */
-struct isakmp_ivm {
-	vchar_t *iv;	/* for decoding packet */
-			/* if phase 1, it's for computing phase2 iv */
-	vchar_t *ive;	/* for encoding packet */
-};
-
-/* for dumping */
-struct ph1dump {
-	isakmp_index index;
-	int status;
-	int side;
-	struct sockaddr_storage remote;
-	struct sockaddr_storage local;
-	u_int8_t version;
-	u_int8_t etype;	
-	time_t created;
-	int ph2cnt;
-};
-
-struct sockaddr;
-struct ph1handle;
-struct ph2handle;
-struct policyindex;
-
-extern struct ph1handle *getph1byindex __P((isakmp_index *));
-extern struct ph1handle *getph1byindex0 __P((isakmp_index *));
-extern struct ph1handle *getph1byaddr __P((struct sockaddr *,
-										   struct sockaddr *, int));
-extern struct ph1handle *getph1byaddrwop __P((struct sockaddr *,
-	struct sockaddr *));
-extern struct ph1handle *getph1bydstaddrwop __P((struct sockaddr *));
-#ifdef ENABLE_HYBRID
-struct ph1handle *getph1bylogin __P((char *));
-int purgeph1bylogin __P((char *));
-#endif
-extern vchar_t *dumpph1 __P((void));
-extern struct ph1handle *newph1 __P((void));
-extern void delph1 __P((struct ph1handle *));
-extern int insph1 __P((struct ph1handle *));
-extern void remph1 __P((struct ph1handle *));
-extern void flushph1 __P((void));
-extern void initph1tree __P((void));
-
-extern struct ph2handle *getph2byspidx __P((struct policyindex *));
-extern struct ph2handle *getph2byspid __P((u_int32_t));
-extern struct ph2handle *getph2byseq __P((u_int32_t));
-extern struct ph2handle *getph2bysaddr __P((struct sockaddr *,
-	struct sockaddr *));
-extern struct ph2handle *getph2bymsgid __P((struct ph1handle *, u_int32_t));
-extern struct ph2handle *getph2byid __P((struct sockaddr *,
-	struct sockaddr *, u_int32_t));
-extern struct ph2handle *getph2bysaidx __P((struct sockaddr *,
-	struct sockaddr *, u_int, u_int32_t));
-extern struct ph2handle *newph2 __P((void));
-extern void initph2 __P((struct ph2handle *));
-extern void delph2 __P((struct ph2handle *));
-extern int insph2 __P((struct ph2handle *));
-extern void remph2 __P((struct ph2handle *));
-extern void flushph2 __P((void));
-extern void deleteallph2 __P((struct sockaddr *, struct sockaddr *, u_int));
-extern void initph2tree __P((void));
-
-extern void bindph12 __P((struct ph1handle *, struct ph2handle *));
-extern void unbindph12 __P((struct ph2handle *));
-
-extern struct contacted *getcontacted __P((struct sockaddr *));
-extern int inscontacted __P((struct sockaddr *));
-extern void initctdtree __P((void));
-
-extern int check_recvdpkt __P((struct sockaddr *,
-	struct sockaddr *, vchar_t *));
-extern int add_recvdpkt __P((struct sockaddr *, struct sockaddr *,
-	vchar_t *, vchar_t *));
-extern void init_recvdpkt __P((void));
-
-#ifdef ENABLE_HYBRID
-extern int exclude_cfg_addr __P((const struct sockaddr *));
-#endif
-
-extern int revalidate_ph12(void);
-
-#endif /* _HANDLER_H */
diff --git a/src/racoon/ipsec_doi.c b/src/racoon/ipsec_doi.c
deleted file mode 100644
index 9a59135..0000000
--- a/src/racoon/ipsec_doi.c
+++ /dev/null
@@ -1,4949 +0,0 @@
-/*	$NetBSD: ipsec_doi.c,v 1.23.4.10 2009/06/19 07:32:52 tteras Exp $	*/
-
-/* Id: ipsec_doi.c,v 1.55 2006/08/17 09:20:41 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <netdb.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "var.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "cfparse_proto.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "remoteconf.h"
-#include "localconf.h"
-#include "sockmisc.h"
-#include "handler.h"
-#include "policy.h"
-#include "algorithm.h"
-#include "sainfo.h"
-#include "proposal.h"
-#include "crypto_openssl.h"
-#include "strnames.h"
-#include "gcmalloc.h"
-
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-#ifdef ENABLE_HYBRID
-static int switch_authmethod(int);
-#endif
-
-#ifdef HAVE_GSSAPI
-#include <iconv.h>
-#include "gssapi.h"
-#ifdef HAVE_ICONV_2ND_CONST
-#define __iconv_const const
-#else
-#define __iconv_const
-#endif
-#endif
-
-int verbose_proposal_check = 1;
-
-static vchar_t *get_ph1approval __P((struct ph1handle *, struct prop_pair **));
-static struct isakmpsa *get_ph1approvalx __P((struct prop_pair *,
-	struct isakmpsa *, struct isakmpsa *, int));
-static void print_ph1mismatched __P((struct prop_pair *, struct isakmpsa *));
-static int t2isakmpsa __P((struct isakmp_pl_t *, struct isakmpsa *));
-static int cmp_aproppair_i __P((struct prop_pair *, struct prop_pair *));
-static struct prop_pair *get_ph2approval __P((struct ph2handle *,
-	struct prop_pair **));
-static struct prop_pair *get_ph2approvalx __P((struct ph2handle *,
-	struct prop_pair *));
-static void free_proppair0 __P((struct prop_pair *));
-
-static int get_transform
-	__P((struct isakmp_pl_p *, struct prop_pair **, int *));
-static u_int32_t ipsecdoi_set_ld __P((vchar_t *));
-
-static int check_doi __P((u_int32_t));
-static int check_situation __P((u_int32_t));
-
-static int check_prot_main __P((int));
-static int check_prot_quick __P((int));
-static int (*check_protocol[]) __P((int)) = {
-	check_prot_main,	/* IPSECDOI_TYPE_PH1 */
-	check_prot_quick,	/* IPSECDOI_TYPE_PH2 */
-};
-
-static int check_spi_size __P((int, int));
-
-static int check_trns_isakmp __P((int));
-static int check_trns_ah __P((int));
-static int check_trns_esp __P((int));
-static int check_trns_ipcomp __P((int));
-static int (*check_transform[]) __P((int)) = {
-	0,
-	check_trns_isakmp,	/* IPSECDOI_PROTO_ISAKMP */
-	check_trns_ah,		/* IPSECDOI_PROTO_IPSEC_AH */
-	check_trns_esp,		/* IPSECDOI_PROTO_IPSEC_ESP */
-	check_trns_ipcomp,	/* IPSECDOI_PROTO_IPCOMP */
-};
-
-static int check_attr_isakmp __P((struct isakmp_pl_t *));
-static int check_attr_ah __P((struct isakmp_pl_t *));
-static int check_attr_esp __P((struct isakmp_pl_t *));
-static int check_attr_ipsec __P((int, struct isakmp_pl_t *));
-static int check_attr_ipcomp __P((struct isakmp_pl_t *));
-static int (*check_attributes[]) __P((struct isakmp_pl_t *)) = {
-	0,
-	check_attr_isakmp,	/* IPSECDOI_PROTO_ISAKMP */
-	check_attr_ah,		/* IPSECDOI_PROTO_IPSEC_AH */
-	check_attr_esp,		/* IPSECDOI_PROTO_IPSEC_ESP */
-	check_attr_ipcomp,	/* IPSECDOI_PROTO_IPCOMP */
-};
-
-static int setph1prop __P((struct isakmpsa *, caddr_t));
-static int setph1trns __P((struct isakmpsa *, caddr_t));
-static int setph1attr __P((struct isakmpsa *, caddr_t));
-static vchar_t *setph2proposal0 __P((const struct ph2handle *,
-	const struct saprop *, const struct saproto *));
-
-static vchar_t *getidval __P((int, vchar_t *));
-
-#ifdef HAVE_GSSAPI
-static struct isakmpsa *fixup_initiator_sa __P((struct isakmpsa *,
-	struct isakmpsa *));
-#endif
-
-/*%%%*/
-/*
- * check phase 1 SA payload.
- * make new SA payload to be replyed not including general header.
- * the pointer to one of isakmpsa in proposal is set into iph1->approval.
- * OUT:
- *	positive: the pointer to new buffer of SA payload.
- *		  network byte order.
- *	NULL	: error occurd.
- */
-int
-ipsecdoi_checkph1proposal(sa, iph1)
-	vchar_t *sa;
-	struct ph1handle *iph1;
-{
-	vchar_t *newsa;		/* new SA payload approved. */
-	struct prop_pair **pair;
-
-	/* get proposal pair */
-	pair = get_proppair(sa, IPSECDOI_TYPE_PH1);
-	if (pair == NULL)
-		return -1;
-
-	/* check and get one SA for use */
-	newsa = get_ph1approval(iph1, pair);
-	
-	free_proppair(pair);
-
-	if (newsa == NULL)
-		return -1;
-
-	iph1->sa_ret = newsa;
-
-	return 0;
-}
-
-/*
- * acceptable check for remote configuration.
- * return a new SA payload to be reply to peer.
- */
-static vchar_t *
-get_ph1approval(iph1, pair)
-	struct ph1handle *iph1;
-	struct prop_pair **pair;
-{
-	vchar_t *newsa;
-	struct isakmpsa *sa, tsa;
-	struct prop_pair *s, *p;
-	int prophlen;
-	int i;
-
-	if (iph1->approval) {
-		delisakmpsa(iph1->approval);
-		iph1->approval = NULL;
-	}
-
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		if (pair[i] == NULL)
-			continue;
-		for (s = pair[i]; s; s = s->next) {
-			prophlen = 
-			    sizeof(struct isakmp_pl_p) + s->prop->spi_size;
-
-			/* compare proposal and select one */
-			for (p = s; p; p = p->tnext) {
-				if ((sa = get_ph1approvalx(p, 
-				    iph1->rmconf->proposal, &tsa, 
-				    iph1->rmconf->pcheck_level)) != NULL)
-					goto found;
-			}
-		}
-	}
-
-	/*
-	 * if there is no suitable proposal, racoon complains about all of
-	 * mismatched items in those proposal.
-	 */
-	if (verbose_proposal_check) {
-		for (i = 0; i < MAXPROPPAIRLEN; i++) {
-			if (pair[i] == NULL)
-				continue;
-			for (s = pair[i]; s; s = s->next) {
-				prophlen = sizeof(struct isakmp_pl_p)
-						+ s->prop->spi_size;
-				for (p = s; p; p = p->tnext) {
-					print_ph1mismatched(p,
-						iph1->rmconf->proposal);
-				}
-			}
-		}
-	}
-	plog(LLV_ERROR, LOCATION, NULL, "no suitable proposal found.\n");
-
-	return NULL;
-
-found:
-	plog(LLV_DEBUG, LOCATION, NULL, "an acceptable proposal found.\n");
-
-	/* check DH group settings */
-	if (sa->dhgrp) {
-		if (sa->dhgrp->prime && sa->dhgrp->gen1) {
-			/* it's ok */
-			goto saok;
-		}
-		plog(LLV_WARNING, LOCATION, NULL,
-			"invalid DH parameter found, use default.\n");
-		oakley_dhgrp_free(sa->dhgrp);
-		sa->dhgrp=NULL;
-	}
-
-	if (oakley_setdhgroup(sa->dh_group, &sa->dhgrp) == -1) {
-		sa->dhgrp = NULL;
-		racoon_free(sa);
-		return NULL;
-	}
-
-saok:
-#ifdef HAVE_GSSAPI
-	if (sa->gssid != NULL)
-		plog(LLV_DEBUG, LOCATION, NULL, "gss id in new sa '%.*s'\n",
-		    (int)sa->gssid->l, sa->gssid->v);
-	if (iph1-> side == INITIATOR) {
-		if (iph1->rmconf->proposal->gssid != NULL)
-			iph1->gi_i = vdup(iph1->rmconf->proposal->gssid);
-		if (tsa.gssid != NULL)
-			iph1->gi_r = vdup(tsa.gssid);
-		iph1->approval = fixup_initiator_sa(sa, &tsa);
-	} else {
-		if (tsa.gssid != NULL) {
-			iph1->gi_r = vdup(tsa.gssid);
-			iph1->gi_i = gssapi_get_id(iph1);
-			if (sa->gssid == NULL && iph1->gi_i != NULL)
-				sa->gssid = vdup(iph1->gi_i);
-		}
-		iph1->approval = sa;
-	}
-	if (iph1->gi_i != NULL)
-		plog(LLV_DEBUG, LOCATION, NULL, "GIi is %.*s\n",
-		    (int)iph1->gi_i->l, iph1->gi_i->v);
-	if (iph1->gi_r != NULL)
-		plog(LLV_DEBUG, LOCATION, NULL, "GIr is %.*s\n",
-		    (int)iph1->gi_r->l, iph1->gi_r->v);
-#else
-	iph1->approval = sa;
-#endif
-	if(iph1->approval) {
-		plog(LLV_DEBUG, LOCATION, NULL, "agreed on %s auth.\n",
-		    s_oakley_attr_method(iph1->approval->authmethod));
-	}
-
-	newsa = get_sabyproppair(p, iph1);
-	if (newsa == NULL){
-		delisakmpsa(iph1->approval);
-		iph1->approval = NULL;
-	}
-
-	return newsa;
-}
-
-/*
- * compare peer's single proposal and all of my proposal.
- * and select one if suiatable.
- * p       : one of peer's proposal.
- * proposal: my proposals.
- */
-static struct isakmpsa *
-get_ph1approvalx(p, proposal, sap, check_level)
-	struct prop_pair *p;
-	struct isakmpsa *proposal, *sap;
-	int check_level;
-{
-	struct isakmp_pl_p *prop = p->prop;
-	struct isakmp_pl_t *trns = p->trns;
-	struct isakmpsa sa, *s, *tsap;
-	int authmethod;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-       		"prop#=%d, prot-id=%s, spi-size=%d, #trns=%d\n",
-		prop->p_no, s_ipsecdoi_proto(prop->proto_id),
-		prop->spi_size, prop->num_t);
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"trns#=%d, trns-id=%s\n",
-		trns->t_no,
-		s_ipsecdoi_trns(prop->proto_id, trns->t_id));
-
-	tsap = sap != NULL ? sap : &sa;
-
-	memset(tsap, 0, sizeof(*tsap));
-	if (t2isakmpsa(trns, tsap) < 0)
-		return NULL;
-	for (s = proposal; s != NULL; s = s->next) {
-#ifdef ENABLE_HYBRID
-		authmethod = switch_authmethod(s->authmethod);
-#else
-		authmethod = s->authmethod;
-#endif
-		plog(LLV_DEBUG, LOCATION, NULL, "Compared: DB:Peer\n");
-		plog(LLV_DEBUG, LOCATION, NULL, "(lifetime = %ld:%ld)\n",
-			(long)s->lifetime, (long)tsap->lifetime);
-		plog(LLV_DEBUG, LOCATION, NULL, "(lifebyte = %zu:%zu)\n",
-			s->lifebyte, tsap->lifebyte);
-		plog(LLV_DEBUG, LOCATION, NULL, "enctype = %s:%s\n",
-			s_oakley_attr_v(OAKLEY_ATTR_ENC_ALG,
-					s->enctype),
-			s_oakley_attr_v(OAKLEY_ATTR_ENC_ALG,
-					tsap->enctype));
-		plog(LLV_DEBUG, LOCATION, NULL, "(encklen = %d:%d)\n",
-			s->encklen, tsap->encklen);
-		plog(LLV_DEBUG, LOCATION, NULL, "hashtype = %s:%s\n",
-			s_oakley_attr_v(OAKLEY_ATTR_HASH_ALG,
-					s->hashtype),
-			s_oakley_attr_v(OAKLEY_ATTR_HASH_ALG,
-					tsap->hashtype));
-		plog(LLV_DEBUG, LOCATION, NULL, "authmethod = %s:%s\n",
-			s_oakley_attr_v(OAKLEY_ATTR_AUTH_METHOD,
-					s->authmethod),
-			s_oakley_attr_v(OAKLEY_ATTR_AUTH_METHOD,
-					tsap->authmethod));
-		plog(LLV_DEBUG, LOCATION, NULL, "dh_group = %s:%s\n",
-			s_oakley_attr_v(OAKLEY_ATTR_GRP_DESC,
-					s->dh_group),
-			s_oakley_attr_v(OAKLEY_ATTR_GRP_DESC,
-					tsap->dh_group));
-#if 0
-		/* XXX to be considered ? */
-		if (tsap->lifebyte > s->lifebyte) ;
-#endif
-		/*
-		 * if responder side and peer's key length in proposal
-		 * is bigger than mine, it might be accepted.
-		 */
-		if(tsap->enctype == s->enctype &&
-		    tsap->authmethod == authmethod &&
-		    tsap->hashtype == s->hashtype &&
-		    tsap->dh_group == s->dh_group &&
-		    tsap->encklen == s->encklen) {
-			switch(check_level) {
-			case PROP_CHECK_OBEY:
-				goto found;
-				break;
-
-			case PROP_CHECK_STRICT:
-				if ((tsap->lifetime > s->lifetime) ||
-				    (tsap->lifebyte > s->lifebyte))
-					continue;
-				goto found;
-				break;
-
-			case PROP_CHECK_CLAIM:
-				if (tsap->lifetime < s->lifetime)
-					s->lifetime = tsap->lifetime;
-				if (tsap->lifebyte < s->lifebyte)
-					s->lifebyte = tsap->lifebyte;
-				goto found;
-				break;
-
-			case PROP_CHECK_EXACT:
-				if ((tsap->lifetime != s->lifetime) ||
-				    (tsap->lifebyte != s->lifebyte))
-					continue;
-				goto found;
-				break;
-
-			default:
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Unexpected proposal_check value\n");
-				continue;
-				break;
-			}
-		}
-	}
-
-found:
-	if (tsap->dhgrp != NULL){
-		oakley_dhgrp_free(tsap->dhgrp);
-		tsap->dhgrp = NULL;
-	}
-
-	if ((s = dupisakmpsa(s)) != NULL) {
-		switch(check_level) {
-		case PROP_CHECK_OBEY:
-			s->lifetime = tsap->lifetime;
-			s->lifebyte = tsap->lifebyte;
-			break;
-
-		case PROP_CHECK_STRICT:
-			s->lifetime = tsap->lifetime;
-			s->lifebyte = tsap->lifebyte;
-			break;
-
-		case PROP_CHECK_CLAIM:
-			if (tsap->lifetime < s->lifetime)
-				s->lifetime = tsap->lifetime;
-			if (tsap->lifebyte < s->lifebyte)
-				s->lifebyte = tsap->lifebyte;
-			break;
-
-		default:
-			break;
-		}
-	}
-	return s;
-}
-
-/*
- * print all of items in peer's proposal which are mismatched to my proposal.
- * p       : one of peer's proposal.
- * proposal: my proposals.
- */
-static void
-print_ph1mismatched(p, proposal)
-	struct prop_pair *p;
-	struct isakmpsa *proposal;
-{
-	struct isakmpsa sa, *s;
-
-	memset(&sa, 0, sizeof(sa));
-	if (t2isakmpsa(p->trns, &sa) < 0)
-		return;
-	for (s = proposal; s ; s = s->next) {
-		if (sa.enctype != s->enctype) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"rejected enctype: "
-				"DB(prop#%d:trns#%d):Peer(prop#%d:trns#%d) = "
-				"%s:%s\n",
-				s->prop_no, s->trns_no,
-				p->prop->p_no, p->trns->t_no,
-				s_oakley_attr_v(OAKLEY_ATTR_ENC_ALG,
-					s->enctype),
-				s_oakley_attr_v(OAKLEY_ATTR_ENC_ALG,
-					sa.enctype));
-		}
-		if (sa.authmethod != s->authmethod) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"rejected authmethod: "
-				"DB(prop#%d:trns#%d):Peer(prop#%d:trns#%d) = "
-				"%s:%s\n",
-				s->prop_no, s->trns_no,
-				p->prop->p_no, p->trns->t_no,
-				s_oakley_attr_v(OAKLEY_ATTR_AUTH_METHOD,
-					s->authmethod),
-				s_oakley_attr_v(OAKLEY_ATTR_AUTH_METHOD,
-					sa.authmethod));
-		}
-		if (sa.hashtype != s->hashtype) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"rejected hashtype: "
-				"DB(prop#%d:trns#%d):Peer(prop#%d:trns#%d) = "
-				"%s:%s\n",
-				s->prop_no, s->trns_no,
-				p->prop->p_no, p->trns->t_no,
-				s_oakley_attr_v(OAKLEY_ATTR_HASH_ALG,
-					s->hashtype),
-				s_oakley_attr_v(OAKLEY_ATTR_HASH_ALG,
-					sa.hashtype));
-		}
-		if (sa.dh_group != s->dh_group) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"rejected dh_group: "
-				"DB(prop#%d:trns#%d):Peer(prop#%d:trns#%d) = "
-				"%s:%s\n",
-				s->prop_no, s->trns_no,
-				p->prop->p_no, p->trns->t_no,
-				s_oakley_attr_v(OAKLEY_ATTR_GRP_DESC,
-					s->dh_group),
-				s_oakley_attr_v(OAKLEY_ATTR_GRP_DESC,
-					sa.dh_group));
-		}
-	}
-
-	if (sa.dhgrp != NULL){
-		oakley_dhgrp_free(sa.dhgrp);
-		sa.dhgrp=NULL;
-	}
-}
-
-/*
- * get ISAKMP data attributes
- */
-static int
-t2isakmpsa(trns, sa)
-	struct isakmp_pl_t *trns;
-	struct isakmpsa *sa;
-{
-	struct isakmp_data *d, *prev;
-	int flag, type;
-	int error = -1;
-	int life_t;
-	int keylen = 0;
-	vchar_t *val = NULL;
-	int len, tlen;
-	u_char *p;
-
-	tlen = ntohs(trns->h.len) - sizeof(*trns);
-	prev = (struct isakmp_data *)NULL;
-	d = (struct isakmp_data *)(trns + 1);
-
-	/* default */
-	life_t = OAKLEY_ATTR_SA_LD_TYPE_DEFAULT;
-	sa->lifetime = OAKLEY_ATTR_SA_LD_SEC_DEFAULT;
-	sa->lifebyte = 0;
-	sa->dhgrp = racoon_calloc(1, sizeof(struct dhgroup));
-	if (!sa->dhgrp)
-		goto err;
-
-	while (tlen > 0) {
-
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"type=%s, flag=0x%04x, lorv=%s\n",
-			s_oakley_attr(type), flag,
-			s_oakley_attr_v(type, ntohs(d->lorv)));
-
-		/* get variable-sized item */
-		switch (type) {
-		case OAKLEY_ATTR_GRP_PI:
-		case OAKLEY_ATTR_GRP_GEN_ONE:
-		case OAKLEY_ATTR_GRP_GEN_TWO:
-		case OAKLEY_ATTR_GRP_CURVE_A:
-		case OAKLEY_ATTR_GRP_CURVE_B:
-		case OAKLEY_ATTR_SA_LD:
-		case OAKLEY_ATTR_GRP_ORDER:
-			if (flag) {	/*TV*/
-				len = 2;
-				p = (u_char *)&d->lorv;
-			} else {	/*TLV*/
-				len = ntohs(d->lorv);
-				p = (u_char *)(d + 1);
-			}
-			val = vmalloc(len);
-			if (!val)
-				return -1;
-			memcpy(val->v, p, len);
-			break;
-
-		default:
-			break;
-		}
-
-		switch (type) {
-		case OAKLEY_ATTR_ENC_ALG:
-			sa->enctype = (u_int16_t)ntohs(d->lorv);
-			break;
-
-		case OAKLEY_ATTR_HASH_ALG:
-			sa->hashtype = (u_int16_t)ntohs(d->lorv);
-			break;
-
-		case OAKLEY_ATTR_AUTH_METHOD:
-			sa->authmethod = ntohs(d->lorv);
-			break;
-
-		case OAKLEY_ATTR_GRP_DESC:
-			sa->dh_group = (u_int16_t)ntohs(d->lorv);
-			break;
-
-		case OAKLEY_ATTR_GRP_TYPE:
-		{
-			int type = (int)ntohs(d->lorv);
-			if (type == OAKLEY_ATTR_GRP_TYPE_MODP)
-				sa->dhgrp->type = type;
-			else
-				return -1;
-			break;
-		}
-		case OAKLEY_ATTR_GRP_PI:
-			sa->dhgrp->prime = val;
-			break;
-
-		case OAKLEY_ATTR_GRP_GEN_ONE:
-			vfree(val);
-			if (!flag)
-				sa->dhgrp->gen1 = ntohs(d->lorv);
-			else {
-				int len = ntohs(d->lorv);
-				sa->dhgrp->gen1 = 0;
-				if (len > 4)
-					return -1;
-				memcpy(&sa->dhgrp->gen1, d + 1, len);
-				sa->dhgrp->gen1 = ntohl(sa->dhgrp->gen1);
-			}
-			break;
-
-		case OAKLEY_ATTR_GRP_GEN_TWO:
-			vfree(val);
-			if (!flag)
-				sa->dhgrp->gen2 = ntohs(d->lorv);
-			else {
-				int len = ntohs(d->lorv);
-				sa->dhgrp->gen2 = 0;
-				if (len > 4)
-					return -1;
-				memcpy(&sa->dhgrp->gen2, d + 1, len);
-				sa->dhgrp->gen2 = ntohl(sa->dhgrp->gen2);
-			}
-			break;
-
-		case OAKLEY_ATTR_GRP_CURVE_A:
-			sa->dhgrp->curve_a = val;
-			break;
-
-		case OAKLEY_ATTR_GRP_CURVE_B:
-			sa->dhgrp->curve_b = val;
-			break;
-
-		case OAKLEY_ATTR_SA_LD_TYPE:
-		{
-			int type = (int)ntohs(d->lorv);
-			switch (type) {
-			case OAKLEY_ATTR_SA_LD_TYPE_SEC:
-			case OAKLEY_ATTR_SA_LD_TYPE_KB:
-				life_t = type;
-				break;
-			default:
-				life_t = OAKLEY_ATTR_SA_LD_TYPE_DEFAULT;
-				break;
-			}
-			break;
-		}
-		case OAKLEY_ATTR_SA_LD:
-			if (!prev
-			 || (ntohs(prev->type) & ~ISAKMP_GEN_MASK) !=
-					OAKLEY_ATTR_SA_LD_TYPE) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "life duration must follow ltype\n");
-				break;
-			}
-
-			switch (life_t) {
-			case IPSECDOI_ATTR_SA_LD_TYPE_SEC:
-				sa->lifetime = ipsecdoi_set_ld(val);
-				vfree(val);
-				if (sa->lifetime == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid life duration.\n");
-					goto err;
-				}
-				break;
-			case IPSECDOI_ATTR_SA_LD_TYPE_KB:
-				sa->lifebyte = ipsecdoi_set_ld(val);
-				vfree(val);
-				if (sa->lifebyte == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid life duration.\n");
-					goto err;
-				}
-				break;
-			default:
-				vfree(val);
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid life type: %d\n", life_t);
-				goto err;
-			}
-			break;
-
-		case OAKLEY_ATTR_KEY_LEN:
-		{
-			int len = ntohs(d->lorv);
-			if (len % 8 != 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"keylen %d: not multiple of 8\n",
-					len);
-				goto err;
-			}
-			sa->encklen = (u_int16_t)len;
-			keylen++;
-			break;
-		}
-		case OAKLEY_ATTR_PRF:
-		case OAKLEY_ATTR_FIELD_SIZE:
-			/* unsupported */
-			break;
-
-		case OAKLEY_ATTR_GRP_ORDER:
-			sa->dhgrp->order = val;
-			break;
-#ifdef HAVE_GSSAPI
-		case OAKLEY_ATTR_GSS_ID:
-		{
-			int error = -1;
-			iconv_t cd = (iconv_t) -1;
-			size_t srcleft, dstleft, rv;
-			__iconv_const char *src;
-			char *dst;
-			int len = ntohs(d->lorv);
-
-			/*
-			 * Older verions of racoon just placed the
-			 * ISO-Latin-1 string on the wire directly.
-			 * Check to see if we are configured to be
-			 * compatible with this behavior.
-			 */
-			if (lcconf->gss_id_enc == LC_GSSENC_LATIN1) {
-				if ((sa->gssid = vmalloc(len)) == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "failed to allocate memory\n");
-					goto out;
-				}
-				memcpy(sa->gssid->v, d + 1, len);
-				plog(LLV_DEBUG, LOCATION, NULL,
-				    "received old-style gss "
-				    "id '%.*s' (len %zu)\n",
-				    (int)sa->gssid->l, sa->gssid->v, 
-				    sa->gssid->l);
-				error = 0;
-				goto out;
-			}
-
-			/*
-			 * For Windows 2000 compatibility, we expect
-			 * the GSS ID attribute on the wire to be
-			 * encoded in UTF-16LE.  Internally, we work
-			 * in ISO-Latin-1.  Therefore, we should need
-			 * 1/2 the specified length, which should always
-			 * be a multiple of 2 octets.
-			 */
-			cd = iconv_open("latin1", "utf-16le");
-			if (cd == (iconv_t) -1) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "unable to initialize utf-16le -> latin1 "
-				    "conversion descriptor: %s\n",
-				    strerror(errno));
-				goto out;
-			}
-
-			if ((sa->gssid = vmalloc(len / 2)) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "failed to allocate memory\n");
-				goto out;
-			}
-
-			src = (__iconv_const char *)(d + 1);
-			srcleft = len;
-
-			dst = sa->gssid->v;
-			dstleft = len / 2;
-
-			rv = iconv(cd, (__iconv_const char **)&src, &srcleft, 
-				   &dst, &dstleft);
-			if (rv != 0) {
-				if (rv == -1) {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "unable to convert GSS ID from "
-					    "utf-16le -> latin1: %s\n",
-					    strerror(errno));
-				} else {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "%zd character%s in GSS ID cannot "
-					    "be represented in latin1\n",
-					    rv, rv == 1 ? "" : "s");
-				}
-				goto out;
-			}
-
-			/* XXX dstleft should always be 0; assert it? */
-			sa->gssid->l = (len / 2) - dstleft;
-
-			plog(LLV_DEBUG, LOCATION, NULL,
-			    "received gss id '%.*s' (len %zu)\n",
-			    (int)sa->gssid->l, sa->gssid->v, sa->gssid->l);
-
-			error = 0;
-out:
-			if (cd != (iconv_t)-1)
-				(void)iconv_close(cd);
-
-			if ((error != 0) && (sa->gssid != NULL)) {
-				vfree(sa->gssid);
-				sa->gssid = NULL;
-			}
-			break;
-		}
-#endif /* HAVE_GSSAPI */
-
-		default:
-			break;
-		}
-
-		prev = d;
-		if (flag) {
-			tlen -= sizeof(*d);
-			d = (struct isakmp_data *)((char *)d + sizeof(*d));
-		} else {
-			tlen -= (sizeof(*d) + ntohs(d->lorv));
-			d = (struct isakmp_data *)((char *)d + sizeof(*d) + ntohs(d->lorv));
-		}
-	}
-
-	/* key length must not be specified on some algorithms */
-	if (keylen) {
-		if (sa->enctype == OAKLEY_ATTR_ENC_ALG_DES
-#ifdef HAVE_OPENSSL_IDEA_H
-		 || sa->enctype == OAKLEY_ATTR_ENC_ALG_IDEA
-#endif
-		 || sa->enctype == OAKLEY_ATTR_ENC_ALG_3DES) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"keylen must not be specified "
-				"for encryption algorithm %d\n",
-				sa->enctype);
-			return -1;
-		}
-	}
-
-	return 0;
-err:
-	return error;
-}
-
-/*%%%*/
-/*
- * check phase 2 SA payload and select single proposal.
- * make new SA payload to be replyed not including general header.
- * This function is called by responder only.
- * OUT:
- *	0: succeed.
- *	-1: error occured.
- */
-int
-ipsecdoi_selectph2proposal(iph2)
-	struct ph2handle *iph2;
-{
-	struct prop_pair **pair;
-	struct prop_pair *ret;
-
-	/* get proposal pair */
-	pair = get_proppair(iph2->sa, IPSECDOI_TYPE_PH2);
-	if (pair == NULL)
-		return -1;
-
-	/* check and select a proposal. */
-	ret = get_ph2approval(iph2, pair);
-	free_proppair(pair);
-	if (ret == NULL)
-		return -1;
-
-	/* make a SA to be replayed. */
-	/* SPI must be updated later. */
-	iph2->sa_ret = get_sabyproppair(ret, iph2->ph1);
-	free_proppair0(ret);
-	if (iph2->sa_ret == NULL)
-		return -1;
-
-	return 0;
-}
-
-/*
- * check phase 2 SA payload returned from responder.
- * This function is called by initiator only.
- * OUT:
- *	0: valid.
- *	-1: invalid.
- */
-int
-ipsecdoi_checkph2proposal(iph2)
-	struct ph2handle *iph2;
-{
-	struct prop_pair **rpair = NULL, **spair = NULL;
-	struct prop_pair *p;
-	int i, n, num;
-	int error = -1;
-	vchar_t *sa_ret = NULL;
-
-	/* get proposal pair of SA sent. */
-	spair = get_proppair(iph2->sa, IPSECDOI_TYPE_PH2);
-	if (spair == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get prop pair.\n");
-		goto end;
-	}
-
-	/* XXX should check the number of transform */
-
-	/* get proposal pair of SA replayed */
-	rpair = get_proppair(iph2->sa_ret, IPSECDOI_TYPE_PH2);
-	if (rpair == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get prop pair.\n");
-		goto end;
-	}
-
-	/* check proposal is only one ? */
-	n = 0;
-	num = 0;
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		if (rpair[i]) {
-			n = i;
-			num++;
-		}
-	}
-	if (num == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no proposal received.\n");
-		goto end;
-	}
-	if (num != 1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"some proposals received.\n");
-		goto end;
-	}
-
-	if (spair[n] == NULL) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"invalid proposal number:%d received.\n", i);
-	}
-	
-
-	if (rpair[n]->tnext != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"multi transforms replyed.\n");
-		goto end;
-	}
-
-	if (cmp_aproppair_i(rpair[n], spair[n])) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"proposal mismathed.\n");
-		goto end;
-	}
-
-	/*
-	 * check and select a proposal.
-	 * ensure that there is no modification of the proposal by
-	 * cmp_aproppair_i()
-	 */
-	p = get_ph2approval(iph2, rpair);
-	if (p == NULL)
-		goto end;
-
-	/* make a SA to be replayed. */
-	sa_ret = iph2->sa_ret;
-	iph2->sa_ret = get_sabyproppair(p, iph2->ph1);
-	free_proppair0(p);
-	if (iph2->sa_ret == NULL)
-		goto end;
-
-	error = 0;
-
-end:
-	if (rpair)
-		free_proppair(rpair);
-	if (spair)
-		free_proppair(spair);
-	if (sa_ret)
-		vfree(sa_ret);
-
-	return error;
-}
-
-/*
- * compare two prop_pair which is assumed to have same proposal number.
- * the case of bundle or single SA, NOT multi transforms.
- * a: a proposal that is multi protocols and single transform, usually replyed.
- * b: a proposal that is multi protocols and multi transform, usually sent.
- * NOTE: this function is for initiator.
- * OUT
- *	0: equal
- *	1: not equal
- * XXX cannot understand the comment!
- */
-static int
-cmp_aproppair_i(a, b)
-	struct prop_pair *a, *b;
-{
-	struct prop_pair *p, *q, *r;
-	int len;
-
-	for (p = a, q = b; p && q; p = p->next, q = q->next) {
-		for (r = q; r; r = r->tnext) {
-			/* compare trns */
-			if (p->trns->t_no == r->trns->t_no)
-				break;
-		}
-		if (!r) {
-			/* no suitable transform found */
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no suitable transform found.\n");
-			return -1;
-		}
-
-		/* compare prop */
-		if (p->prop->p_no != r->prop->p_no) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"proposal #%d mismatched, "
-				"expected #%d.\n",
-				r->prop->p_no, p->prop->p_no);
-			/*FALLTHROUGH*/
-		}
-
-		if (p->prop->proto_id != r->prop->proto_id) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"proto_id mismathed: my:%d peer:%d\n",
-				r->prop->proto_id, p->prop->proto_id);
-			return -1;
-		}
-
-		if (p->prop->spi_size != r->prop->spi_size) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid spi size: %d.\n",
-				p->prop->spi_size);
-			return -1;
-		}
-
-		/* check #of transforms */
-		if (p->prop->num_t != 1) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"#of transform is %d, "
-				"but expected 1.\n", p->prop->num_t);
-			/*FALLTHROUGH*/
-		}
-
-		if (p->trns->t_id != r->trns->t_id) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"transform number has been modified.\n");
-			/*FALLTHROUGH*/
-		}
-		if (p->trns->reserved != r->trns->reserved) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"reserved field should be zero.\n");
-			/*FALLTHROUGH*/
-		}
-
-		/* compare attribute */
-		len = ntohs(r->trns->h.len) - sizeof(*p->trns);
-		if (memcmp(p->trns + 1, r->trns + 1, len) != 0) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"attribute has been modified.\n");
-			/*FALLTHROUGH*/
-		}
-	}
-	if ((p && !q) || (!p && q)) {
-		/* # of protocols mismatched */
-		plog(LLV_ERROR, LOCATION, NULL,
-			"#of protocols mismatched.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * acceptable check for policy configuration.
- * return a new SA payload to be reply to peer.
- */
-static struct prop_pair *
-get_ph2approval(iph2, pair)
-	struct ph2handle *iph2;
-	struct prop_pair **pair;
-{
-	struct prop_pair *ret;
-	int i;
-
-	iph2->approval = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"begin compare proposals.\n");
-
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		if (pair[i] == NULL)
-			continue;
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pair[%d]: %p\n", i, pair[i]);
-		print_proppair(LLV_DEBUG, pair[i]);;
-
-		/* compare proposal and select one */
-		ret = get_ph2approvalx(iph2, pair[i]);
-		if (ret != NULL) {
-			/* found */
-			return ret;
-		}
-	}
-
-	plog(LLV_ERROR, LOCATION, NULL, "no suitable policy found.\n");
-
-	return NULL;
-}
-
-/*
- * compare my proposal and peers just one proposal.
- * set a approval.
- */
-static struct prop_pair *
-get_ph2approvalx(iph2, pp)
-	struct ph2handle *iph2;
-	struct prop_pair *pp;
-{
-	struct prop_pair *ret = NULL;
-	struct saprop *pr0, *pr = NULL;
-	struct saprop *q1, *q2;
-
-	pr0 = aproppair2saprop(pp);
-	if (pr0 == NULL)
-		return NULL;
-
-	for (q1 = pr0; q1; q1 = q1->next) {
-		for (q2 = iph2->proposal; q2; q2 = q2->next) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"peer's single bundle:\n");
-			printsaprop0(LLV_DEBUG, q1);
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"my single bundle:\n");
-			printsaprop0(LLV_DEBUG, q2);
-
-			pr = cmpsaprop_alloc(iph2->ph1, q1, q2, iph2->side);
-			if (pr != NULL)
-				goto found;
-
-			plog(LLV_ERROR, LOCATION, NULL,
-				"not matched\n");
-		}
-	}
-	/* no proposal matching */
-err:
-	flushsaprop(pr0);
-	return NULL;
-
-found:
-	flushsaprop(pr0);
-	plog(LLV_DEBUG, LOCATION, NULL, "matched\n");
-	iph2->approval = pr;
-
-    {
-	struct saproto *sp;
-	struct prop_pair *p, *x;
-	struct prop_pair *n = NULL;
-
-	ret = NULL;
-
-	for (p = pp; p; p = p->next) {
-		/*
-		 * find a proposal with matching proto_id.
-		 * we have analyzed validity already, in cmpsaprop_alloc().
-		 */
-		for (sp = pr->head; sp; sp = sp->next) {
-			if (sp->proto_id == p->prop->proto_id)
-				break;
-		}
-		if (!sp)
-			goto err;
-		if (sp->head->next)
-			goto err;	/* XXX */
-
-		for (x = p; x; x = x->tnext)
-			if (sp->head->trns_no == x->trns->t_no)
-				break;
-		if (!x)
-			goto err;	/* XXX */
-
-		n = racoon_calloc(1, sizeof(struct prop_pair));
-		if (n == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get buffer.\n");
-			goto err;
-		}
-
-		n->prop = x->prop;
-		n->trns = x->trns;
-
-		/* need to preserve the order */
-		for (x = ret; x && x->next; x = x->next)
-			;
-		if (x && x->prop == n->prop) {
-			for (/*nothing*/; x && x->tnext; x = x->tnext)
-				;
-			x->tnext = n;
-		} else {
-			if (x)
-				x->next = n;
-			else {
-				ret = n;
-			}
-		}
-
-		/* #of transforms should be updated ? */
-	}
-    }
-
-	return ret;
-}
-
-void
-free_proppair(pair)
-	struct prop_pair **pair;
-{
-	int i;
-
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		free_proppair0(pair[i]);
-		pair[i] = NULL;
-	}
-	racoon_free(pair);
-}
-
-static void
-free_proppair0(pair)
-	struct prop_pair *pair;
-{
-	struct prop_pair *p, *q, *r, *s;
-
-	p = pair;
-	while (p) {
-		q = p->next;
-		r = p;
-		while (r) {
-			s = r->tnext;
-			racoon_free(r);
-			r = s;
-		}
-		p = q;
-	}
-}
-
-/*
- * get proposal pairs from SA payload.
- * tiny check for proposal payload.
- */
-struct prop_pair **
-get_proppair(sa, mode)
-	vchar_t *sa;
-	int mode;
-{
-	struct prop_pair **pair = NULL;
-	int num_p = 0;			/* number of proposal for use */
-	int tlen;
-	caddr_t bp;
-	int i;
-	struct ipsecdoi_sa_b *sab = (struct ipsecdoi_sa_b *)sa->v;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "total SA len=%zu\n", sa->l);
-	plogdump(LLV_DEBUG, sa->v, sa->l);
-
-	/* check SA payload size */
-	if (sa->l < sizeof(*sab)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid SA length = %zu.\n", sa->l);
-		goto bad;
-	}
-
-	/* check DOI */
-	if (check_doi(ntohl(sab->doi)) < 0)
-		goto bad;
-
-	/* check SITUATION */
-	if (check_situation(ntohl(sab->sit)) < 0)
-		goto bad;
-
-	pair = racoon_calloc(1, MAXPROPPAIRLEN * sizeof(*pair));
-	if (pair == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer.\n");
-		goto bad;
-	}
-#if defined(ANDROID_CHANGES)
-	memset(pair, 0, MAXPROPPAIRLEN * sizeof(*pair));
-#else
-	memset(pair, 0, sizeof(pair));
-#endif
-
-	bp = (caddr_t)(sab + 1);
-	tlen = sa->l - sizeof(*sab);
-
-    {
-	struct isakmp_pl_p *prop;
-	int proplen;
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-
-	pbuf = isakmp_parsewoh(ISAKMP_NPTYPE_P, (struct isakmp_gen *)bp, tlen);
-	if (pbuf == NULL)
-		goto bad;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-		/* check the value of next payload */
-		if (pa->type != ISAKMP_NPTYPE_P) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Invalid payload type=%u\n", pa->type);
-			vfree(pbuf);
-			goto bad;
-		}
-
-		prop = (struct isakmp_pl_p *)pa->ptr;
-		proplen = pa->len;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"proposal #%u len=%d\n", prop->p_no, proplen);
-
-		if (proplen == 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proposal with length %d\n", proplen);
-			vfree(pbuf);
-			goto bad;
-		}
-
-		/* check Protocol ID */
-		if (!check_protocol[mode]) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"unsupported mode %d\n", mode);
-			continue;
-		}
-
-		if (check_protocol[mode](prop->proto_id) < 0)
-			continue;
-
-		/* check SPI length when IKE. */
-		if (check_spi_size(prop->proto_id, prop->spi_size) < 0)
-			continue;
-
-		/* get transform */
-		if (get_transform(prop, pair, &num_p) < 0) {
-			vfree(pbuf);
-			goto bad;
-		}
-	}
-	vfree(pbuf);
-	pbuf = NULL;
-    }
-
-    {
-	int notrans, nprop;
-	struct prop_pair *p, *q;
-
-	/* check for proposals with no transforms */
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		if (!pair[i])
-			continue;
-
-		plog(LLV_DEBUG, LOCATION, NULL, "pair %d:\n", i);
-		print_proppair(LLV_DEBUG, pair[i]);
-
-		notrans = nprop = 0;
-		for (p = pair[i]; p; p = p->next) {
-			if (p->trns == NULL) {
-				notrans++;
-				break;
-			}
-			for (q = p; q; q = q->tnext)
-				nprop++;
-		}
-
-#if 0
-		/*
-		 * XXX at this moment, we cannot accept proposal group
-		 * with multiple proposals.  this should be fixed.
-		 */
-		if (pair[i]->next) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"proposal #%u ignored "
-				"(multiple proposal not supported)\n",
-				pair[i]->prop->p_no);
-			notrans++;
-		}
-#endif
-
-		if (notrans) {
-			for (p = pair[i]; p; p = q) {
-				q = p->next;
-				racoon_free(p);
-			}
-			pair[i] = NULL;
-			num_p--;
-		} else {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"proposal #%u: %d transform\n",
-				pair[i]->prop->p_no, nprop);
-		}
-	}
-    }
-
-	/* bark if no proposal is found. */
-	if (num_p <= 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no Proposal found.\n");
-		goto bad;
-	}
-
-	return pair;
-bad:
-	if (pair != NULL)
-		racoon_free(pair);
-	return NULL;
-}
-
-/*
- * check transform payload.
- * OUT:
- *	positive: return the pointer to the payload of valid transform.
- *	0	: No valid transform found.
- */
-static int
-get_transform(prop, pair, num_p)
-	struct isakmp_pl_p *prop;
-	struct prop_pair **pair;
-	int *num_p;
-{
-	int tlen; /* total length of all transform in a proposal */
-	caddr_t bp;
-	struct isakmp_pl_t *trns;
-	int trnslen;
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	struct prop_pair *p = NULL, *q;
-	int num_t;
-
-	bp = (caddr_t)prop + sizeof(struct isakmp_pl_p) + prop->spi_size;
-	tlen = ntohs(prop->h.len)
-		- (sizeof(struct isakmp_pl_p) + prop->spi_size);
-	pbuf = isakmp_parsewoh(ISAKMP_NPTYPE_T, (struct isakmp_gen *)bp, tlen);
-	if (pbuf == NULL)
-		return -1;
-
-	/* check and get transform for use */
-	num_t = 0;
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		num_t++;
-
-		/* check the value of next payload */
-		if (pa->type != ISAKMP_NPTYPE_T) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Invalid payload type=%u\n", pa->type);
-			break;
-		}
-
-		trns = (struct isakmp_pl_t *)pa->ptr;
-		trnslen = pa->len;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"transform #%u len=%u\n", trns->t_no, trnslen);
-
-		/* check transform ID */
-		if (prop->proto_id >= ARRAYLEN(check_transform)) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"unsupported proto_id %u\n",
-				prop->proto_id);
-			continue;
-		}
-		if (prop->proto_id >= ARRAYLEN(check_attributes)) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"unsupported proto_id %u\n",
-				prop->proto_id);
-			continue;
-		}
-
-		if (!check_transform[prop->proto_id]
-		 || !check_attributes[prop->proto_id]) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"unsupported proto_id %u\n",
-				prop->proto_id);
-			continue;
-		}
-		if (check_transform[prop->proto_id](trns->t_id) < 0)
-			continue;
-
-		/* check data attributes */
-		if (check_attributes[prop->proto_id](trns) != 0)
-			continue;
-
-		p = racoon_calloc(1, sizeof(*p));
-		if (p == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get buffer.\n");
-			vfree(pbuf);
-			return -1;
-		}
-		p->prop = prop;
-		p->trns = trns;
-
-		/* need to preserve the order */
-		for (q = pair[prop->p_no]; q && q->next; q = q->next)
-			;
-		if (q && q->prop == p->prop) {
-			for (/*nothing*/; q && q->tnext; q = q->tnext)
-				;
-			q->tnext = p;
-		} else {
-			if (q)
-				q->next = p;
-			else {
-				pair[prop->p_no] = p;
-				(*num_p)++;
-			}
-		}
-	}
-
-	vfree(pbuf);
-
-	return 0;
-}
-
-/*
- * make a new SA payload from prop_pair.
- * NOTE: this function make spi value clear.
- */
-vchar_t *
-get_sabyproppair(pair, iph1)
-	struct prop_pair *pair;
-	struct ph1handle *iph1;
-{
-	vchar_t *newsa;
-	int newtlen;
-	u_int8_t *np_p = NULL;
-	struct prop_pair *p;
-	int prophlen, trnslen;
-	caddr_t bp;
-
-	newtlen = sizeof(struct ipsecdoi_sa_b);
-	for (p = pair; p; p = p->next) {
-		newtlen += sizeof(struct isakmp_pl_p);
-		newtlen += p->prop->spi_size;
-		newtlen += ntohs(p->trns->h.len);
-	}
-
-	newsa = vmalloc(newtlen);
-	if (newsa == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "failed to get newsa.\n");
-		return NULL;
-	}
-	bp = newsa->v;
-
-	((struct isakmp_gen *)bp)->len = htons(newtlen);
-
-	/* update some of values in SA header */
-	((struct ipsecdoi_sa_b *)bp)->doi = htonl(iph1->rmconf->doitype);
-	((struct ipsecdoi_sa_b *)bp)->sit = htonl(iph1->rmconf->sittype);
-	bp += sizeof(struct ipsecdoi_sa_b);
-
-	/* create proposal payloads */
-	for (p = pair; p; p = p->next) {
-		prophlen = sizeof(struct isakmp_pl_p)
-				+ p->prop->spi_size;
-		trnslen = ntohs(p->trns->h.len);
-
-		if (np_p)
-			*np_p = ISAKMP_NPTYPE_P;
-
-		/* create proposal */
-
-		memcpy(bp, p->prop, prophlen);
-		((struct isakmp_pl_p *)bp)->h.np = ISAKMP_NPTYPE_NONE;
-		((struct isakmp_pl_p *)bp)->h.len = htons(prophlen + trnslen);
-		((struct isakmp_pl_p *)bp)->num_t = 1;
-		np_p = &((struct isakmp_pl_p *)bp)->h.np;
-		memset(bp + sizeof(struct isakmp_pl_p), 0, p->prop->spi_size);
-		bp += prophlen;
-
-		/* create transform */
-		memcpy(bp, p->trns, trnslen);
-		((struct isakmp_pl_t *)bp)->h.np = ISAKMP_NPTYPE_NONE;
-		((struct isakmp_pl_t *)bp)->h.len = htons(trnslen);
-		bp += trnslen;
-	}
-
-	return newsa;
-}
-
-/*
- * update responder's spi
- */
-int
-ipsecdoi_updatespi(iph2)
-	struct ph2handle *iph2;
-{
-	struct prop_pair **pair, *p;
-	struct saprop *pp;
-	struct saproto *pr;
-	int i;
-	int error = -1;
-	u_int8_t *spi;
-
-	pair = get_proppair(iph2->sa_ret, IPSECDOI_TYPE_PH2);
-	if (pair == NULL)
-		return -1;
-	for (i = 0; i < MAXPROPPAIRLEN; i++) {
-		if (pair[i])
-			break;
-	}
-	if (i == MAXPROPPAIRLEN || pair[i]->tnext) {
-		/* multiple transform must be filtered by selectph2proposal.*/
-		goto end;
-	}
-
-	pp = iph2->approval;
-
-	/* create proposal payloads */
-	for (p = pair[i]; p; p = p->next) {
-		/*
-		 * find a proposal/transform with matching proto_id/t_id.
-		 * we have analyzed validity already, in cmpsaprop_alloc().
-		 */
-		for (pr = pp->head; pr; pr = pr->next) {
-			if (p->prop->proto_id == pr->proto_id &&
-			    p->trns->t_id == pr->head->trns_id) {
-				break;
-			}
-		}
-		if (!pr)
-			goto end;
-
-		/*
-		 * XXX SPI bits are left-filled, for use with IPComp.
-		 * we should be switching to variable-length spi field...
-		 */
-		spi = (u_int8_t *)&pr->spi;
-		spi += sizeof(pr->spi);
-		spi -= pr->spisize;
-		memcpy((caddr_t)p->prop + sizeof(*p->prop), spi, pr->spisize);
-	}
-
-	error = 0;
-end:
-	free_proppair(pair);
-	return error;
-}
-
-/*
- * make a new SA payload from prop_pair.
- */
-vchar_t *
-get_sabysaprop(pp0, sa0)
-	struct saprop *pp0;
-	vchar_t *sa0;
-{
-	struct prop_pair **pair = NULL;
-	vchar_t *newsa = NULL;
-	int newtlen;
-	u_int8_t *np_p = NULL;
-	struct prop_pair *p = NULL;
-	struct saprop *pp;
-	struct saproto *pr;
-	struct satrns *tr;
-	int prophlen, trnslen;
-	caddr_t bp;
-	int error = -1;
-
-	/* get proposal pair */
-	pair = get_proppair(sa0, IPSECDOI_TYPE_PH2);
-	if (pair == NULL)
-		goto out;
-
-	newtlen = sizeof(struct ipsecdoi_sa_b);
-	for (pp = pp0; pp; pp = pp->next) {
-
-		if (pair[pp->prop_no] == NULL)
-			goto out;
-
-		for (pr = pp->head; pr; pr = pr->next) {
-			newtlen += (sizeof(struct isakmp_pl_p)
-				+ pr->spisize);
-
-			for (tr = pr->head; tr; tr = tr->next) {
-				for (p = pair[pp->prop_no]; p; p = p->tnext) {
-					if (tr->trns_no == p->trns->t_no)
-						break;
-				}
-				if (p == NULL)
-					goto out;
-
-				newtlen += ntohs(p->trns->h.len);
-			}
-		}
-	}
-
-	newsa = vmalloc(newtlen);
-	if (newsa == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "failed to get newsa.\n");
-		goto out;
-	}
-	bp = newsa->v;
-
-	/* some of values of SA must be updated in the out of this function */
-	((struct isakmp_gen *)bp)->len = htons(newtlen);
-	bp += sizeof(struct ipsecdoi_sa_b);
-
-	/* create proposal payloads */
-	for (pp = pp0; pp; pp = pp->next) {
-
-		for (pr = pp->head; pr; pr = pr->next) {
-			prophlen = sizeof(struct isakmp_pl_p)
-					+ p->prop->spi_size;
-
-			for (tr = pr->head; tr; tr = tr->next) {
-				for (p = pair[pp->prop_no]; p; p = p->tnext) {
-					if (tr->trns_no == p->trns->t_no)
-						break;
-				}
-				if (p == NULL)
-					goto out;
-
-				trnslen = ntohs(p->trns->h.len);
-
-				if (np_p)
-					*np_p = ISAKMP_NPTYPE_P;
-
-				/* create proposal */
-
-				memcpy(bp, p->prop, prophlen);
-				((struct isakmp_pl_p *)bp)->h.np = ISAKMP_NPTYPE_NONE;
-				((struct isakmp_pl_p *)bp)->h.len = htons(prophlen + trnslen);
-				((struct isakmp_pl_p *)bp)->num_t = 1;
-				np_p = &((struct isakmp_pl_p *)bp)->h.np;
-				bp += prophlen;
-
-				/* create transform */
-				memcpy(bp, p->trns, trnslen);
-				((struct isakmp_pl_t *)bp)->h.np = ISAKMP_NPTYPE_NONE;
-				((struct isakmp_pl_t *)bp)->h.len = htons(trnslen);
-				bp += trnslen;
-			}
-		}
-	}
-
-	error = 0;
-out:
-	if (pair != NULL)
-		racoon_free(pair);
-
-	if (error != 0) {
-		if (newsa != NULL) {
-			vfree(newsa);
-			newsa = NULL;
-		}
-	}
-
-	return newsa;
-}
-
-/*
- * If some error happens then return 0.  Although 0 means that lifetime is zero,
- * such a value should not be accepted.
- * Also 0 of lifebyte should not be included in a packet although 0 means not
- * to care of it.
- */
-static u_int32_t
-ipsecdoi_set_ld(buf)
-	vchar_t *buf;
-{
-	u_int32_t ld;
-
-	if (buf == 0)
-		return 0;
-
-	switch (buf->l) {
-	case 2:
-		ld = ntohs(*(u_int16_t *)buf->v);
-		break;
-	case 4:
-		ld = ntohl(*(u_int32_t *)buf->v);
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"length %zu of life duration "
-			"isn't supported.\n", buf->l);
-		return 0;
-	}
-
-	return ld;
-}
-
-/*%%%*/
-/*
- * check DOI
- */
-static int
-check_doi(doi)
-	u_int32_t doi;
-{
-	switch (doi) {
-	case IPSEC_DOI:
-		return 0;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid value of DOI 0x%08x.\n", doi);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check situation
- */
-static int
-check_situation(sit)
-	u_int32_t sit;
-{
-	switch (sit) {
-	case IPSECDOI_SIT_IDENTITY_ONLY:
-		return 0;
-
-	case IPSECDOI_SIT_SECRECY:
-	case IPSECDOI_SIT_INTEGRITY:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"situation 0x%08x unsupported yet.\n", sit);
-		return -1;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid situation 0x%08x.\n", sit);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check protocol id in main mode
- */
-static int
-check_prot_main(proto_id)
-	int proto_id;
-{
-	switch (proto_id) {
-	case IPSECDOI_PROTO_ISAKMP:
-		return 0;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Illegal protocol id=%u.\n", proto_id);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check protocol id in quick mode
- */
-static int
-check_prot_quick(proto_id)
-	int proto_id;
-{
-	switch (proto_id) {
-	case IPSECDOI_PROTO_IPSEC_AH:
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		return 0;
-
-	case IPSECDOI_PROTO_IPCOMP:
-		return 0;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid protocol id %d.\n", proto_id);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-static int
-check_spi_size(proto_id, size)
-	int proto_id, size;
-{
-	switch (proto_id) {
-	case IPSECDOI_PROTO_ISAKMP:
-		if (size != 0) {
-			/* WARNING */
-			plog(LLV_WARNING, LOCATION, NULL,
-				"SPI size isn't zero, but IKE proposal.\n");
-		}
-		return 0;
-
-	case IPSECDOI_PROTO_IPSEC_AH:
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		if (size != 4) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid SPI size=%d for IPSEC proposal.\n",
-				size);
-			return -1;
-		}
-		return 0;
-
-	case IPSECDOI_PROTO_IPCOMP:
-		if (size != 2 && size != 4) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid SPI size=%d for IPCOMP proposal.\n",
-				size);
-			return -1;
-		}
-		return 0;
-
-	default:
-		/* ??? */
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check transform ID in ISAKMP.
- */
-static int
-check_trns_isakmp(t_id)
-	int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_KEY_IKE:
-		return 0;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid transform-id=%u in proto_id=%u.\n",
-			t_id, IPSECDOI_KEY_IKE);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check transform ID in AH.
- */
-static int
-check_trns_ah(t_id)
-	int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_AH_MD5:
-	case IPSECDOI_AH_SHA:
-	case IPSECDOI_AH_SHA256:
-	case IPSECDOI_AH_SHA384:
-	case IPSECDOI_AH_SHA512:
-		return 0;
-	case IPSECDOI_AH_DES:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not support transform-id=%u in AH.\n", t_id);
-		return -1;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid transform-id=%u in AH.\n", t_id);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check transform ID in ESP.
- */
-static int
-check_trns_esp(t_id)
-	int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_ESP_DES:
-	case IPSECDOI_ESP_3DES:
-	case IPSECDOI_ESP_NULL:
-	case IPSECDOI_ESP_RC5:
-	case IPSECDOI_ESP_CAST:
-	case IPSECDOI_ESP_BLOWFISH:
-	case IPSECDOI_ESP_AES:
-	case IPSECDOI_ESP_TWOFISH:
-	case IPSECDOI_ESP_CAMELLIA:
-		return 0;
-	case IPSECDOI_ESP_DES_IV32:
-	case IPSECDOI_ESP_DES_IV64:
-	case IPSECDOI_ESP_IDEA:
-	case IPSECDOI_ESP_3IDEA:
-	case IPSECDOI_ESP_RC4:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not support transform-id=%u in ESP.\n", t_id);
-		return -1;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid transform-id=%u in ESP.\n", t_id);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check transform ID in IPCOMP.
- */
-static int
-check_trns_ipcomp(t_id)
-	int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_IPCOMP_OUI:
-	case IPSECDOI_IPCOMP_DEFLATE:
-	case IPSECDOI_IPCOMP_LZS:
-		return 0;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid transform-id=%u in IPCOMP.\n", t_id);
-		return -1;
-	}
-	/* NOT REACHED */
-}
-
-/*
- * check data attributes in IKE.
- */
-static int
-check_attr_isakmp(trns)
-	struct isakmp_pl_t *trns;
-{
-	struct isakmp_data *d;
-	int tlen;
-	int flag, type;
-	u_int16_t lorv;
-
-	tlen = ntohs(trns->h.len) - sizeof(struct isakmp_pl_t);
-	d = (struct isakmp_data *)((caddr_t)trns + sizeof(struct isakmp_pl_t));
-
-	while (tlen > 0) {
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-		lorv = ntohs(d->lorv);
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"type=%s, flag=0x%04x, lorv=%s\n",
-			s_oakley_attr(type), flag,
-			s_oakley_attr_v(type, lorv));
-
-		/*
-		 * some of the attributes must be encoded in TV.
-		 * see RFC2409 Appendix A "Attribute Classes".
-		 */
-		switch (type) {
-		case OAKLEY_ATTR_ENC_ALG:
-		case OAKLEY_ATTR_HASH_ALG:
-		case OAKLEY_ATTR_AUTH_METHOD:
-		case OAKLEY_ATTR_GRP_DESC:
-		case OAKLEY_ATTR_GRP_TYPE:
-		case OAKLEY_ATTR_SA_LD_TYPE:
-		case OAKLEY_ATTR_PRF:
-		case OAKLEY_ATTR_KEY_LEN:
-		case OAKLEY_ATTR_FIELD_SIZE:
-			if (!flag) {	/* TLV*/
-				plog(LLV_ERROR, LOCATION, NULL,
-					"oakley attribute %d must be TV.\n",
-					type);
-				return -1;
-			}
-			break;
-		}
-
-		/* sanity check for TLV.  length must be specified. */
-		if (!flag && lorv == 0) {	/*TLV*/
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid length %d for TLV attribute %d.\n",
-				lorv, type);
-			return -1;
-		}
-
-		switch (type) {
-		case OAKLEY_ATTR_ENC_ALG:
-			if (!alg_oakley_encdef_ok(lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalied encryption algorithm=%d.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_HASH_ALG:
-			if (!alg_oakley_hashdef_ok(lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalied hash algorithm=%d.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_AUTH_METHOD:
-			switch (lorv) {
-			case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-			case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-#if 0 /* Clashes with OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB */
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I:
-#endif
-#endif
-			case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-				break;
-			case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-#ifdef ENABLE_HYBRID
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-			case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-			case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"auth method %s isn't supported.\n",
-					s_oakley_attr_method(lorv));
-				return -1;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid auth method %d.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_GRP_DESC:
-			if (!alg_oakley_dhdef_ok(lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid DH group %d.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_GRP_TYPE:
-			switch (lorv) {
-			case OAKLEY_ATTR_GRP_TYPE_MODP:
-				break;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"unsupported DH group type %d.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_GRP_PI:
-		case OAKLEY_ATTR_GRP_GEN_ONE:
-			/* sanity checks? */
-			break;
-
-		case OAKLEY_ATTR_GRP_GEN_TWO:
-		case OAKLEY_ATTR_GRP_CURVE_A:
-		case OAKLEY_ATTR_GRP_CURVE_B:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"attr type=%u isn't supported.\n", type);
-			return -1;
-
-		case OAKLEY_ATTR_SA_LD_TYPE:
-			switch (lorv) {
-			case OAKLEY_ATTR_SA_LD_TYPE_SEC:
-			case OAKLEY_ATTR_SA_LD_TYPE_KB:
-				break;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid life type %d.\n", lorv);
-				return -1;
-			}
-			break;
-
-		case OAKLEY_ATTR_SA_LD:
-			/* should check the value */
-			break;
-
-		case OAKLEY_ATTR_PRF:
-		case OAKLEY_ATTR_KEY_LEN:
-			break;
-
-		case OAKLEY_ATTR_FIELD_SIZE:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"attr type=%u isn't supported.\n", type);
-			return -1;
-
-		case OAKLEY_ATTR_GRP_ORDER:
-			break;
-
-		case OAKLEY_ATTR_GSS_ID:
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid attribute type %d.\n", type);
-			return -1;
-		}
-
-		if (flag) {
-			tlen -= sizeof(*d);
-			d = (struct isakmp_data *)((char *)d
-				+ sizeof(*d));
-		} else {
-			tlen -= (sizeof(*d) + lorv);
-			d = (struct isakmp_data *)((char *)d
-				+ sizeof(*d) + lorv);
-		}
-	}
-
-	return 0;
-}
-
-/*
- * check data attributes in IPSEC AH/ESP.
- */
-static int
-check_attr_ah(trns)
-	struct isakmp_pl_t *trns;
-{
-	return check_attr_ipsec(IPSECDOI_PROTO_IPSEC_AH, trns);
-}
-
-static int
-check_attr_esp(trns)
-	struct isakmp_pl_t *trns;
-{
-	return check_attr_ipsec(IPSECDOI_PROTO_IPSEC_ESP, trns);
-}
-
-static int
-check_attr_ipsec(proto_id, trns)
-	int proto_id;
-	struct isakmp_pl_t *trns;
-{
-	struct isakmp_data *d;
-	int tlen;
-	int flag, type = 0;
-	u_int16_t lorv;
-	int attrseen[16];	/* XXX magic number */
-
-	tlen = ntohs(trns->h.len) - sizeof(struct isakmp_pl_t);
-	d = (struct isakmp_data *)((caddr_t)trns + sizeof(struct isakmp_pl_t));
-	memset(attrseen, 0, sizeof(attrseen));
-
-	while (tlen > 0) {
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-		lorv = ntohs(d->lorv);
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"type=%s, flag=0x%04x, lorv=%s\n",
-			s_ipsecdoi_attr(type), flag,
-			s_ipsecdoi_attr_v(type, lorv));
-
-		if (type < sizeof(attrseen)/sizeof(attrseen[0]))
-			attrseen[type]++;
-
-		switch (type) {
-		case IPSECDOI_ATTR_ENC_MODE:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when ENC_MODE.\n");
-				return -1;
-			}
-
-			switch (lorv) {
-			case IPSECDOI_ATTR_ENC_MODE_TUNNEL:
-			case IPSECDOI_ATTR_ENC_MODE_TRNS:
-				break;
-#ifdef ENABLE_NATT
-			case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT:
-				plog(LLV_DEBUG, LOCATION, NULL,
-				     "UDP encapsulation requested\n");
-				break;
-#endif
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid encryption mode=%u.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_AUTH:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when AUTH.\n");
-				return -1;
-			}
-
-			switch (lorv) {
-			case IPSECDOI_ATTR_AUTH_HMAC_MD5:
-				if (proto_id == IPSECDOI_PROTO_IPSEC_AH &&
-				    trns->t_id != IPSECDOI_AH_MD5) {
-ahmismatch:
-					plog(LLV_ERROR, LOCATION, NULL,
-						"auth algorithm %u conflicts "
-						"with transform %u.\n",
-						lorv, trns->t_id);
-					return -1;
-				}
-				break;
-			case IPSECDOI_ATTR_AUTH_HMAC_SHA1:
-				if (proto_id == IPSECDOI_PROTO_IPSEC_AH) {
-					if (trns->t_id != IPSECDOI_AH_SHA)
-						goto ahmismatch;
-				}
-				break;
- 			case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256:
- 				if (proto_id == IPSECDOI_PROTO_IPSEC_AH) {
- 					if (trns->t_id != IPSECDOI_AH_SHA256)
- 						goto ahmismatch;
- 				}	
- 				break;
- 			case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384:
- 				if (proto_id == IPSECDOI_PROTO_IPSEC_AH) {
- 					if (trns->t_id != IPSECDOI_AH_SHA384)
- 						goto ahmismatch;
- 				}
- 				break;
- 			case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512:
- 				if (proto_id == IPSECDOI_PROTO_IPSEC_AH) {
- 					if (trns->t_id != IPSECDOI_AH_SHA512)
- 					goto ahmismatch;
- 				}
- 				break;
-			case IPSECDOI_ATTR_AUTH_DES_MAC:
-			case IPSECDOI_ATTR_AUTH_KPDK:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"auth algorithm %u isn't supported.\n",
-					lorv);
-				return -1;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid auth algorithm=%u.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_SA_LD_TYPE:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when LD_TYPE.\n");
-				return -1;
-			}
-
-			switch (lorv) {
-			case IPSECDOI_ATTR_SA_LD_TYPE_SEC:
-			case IPSECDOI_ATTR_SA_LD_TYPE_KB:
-				break;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid life type %d.\n", lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_SA_LD:
-			if (flag) {
-				/* i.e. ISAKMP_GEN_TV */
-				plog(LLV_DEBUG, LOCATION, NULL,
-					"life duration was in TLV.\n");
-			} else {
-				/* i.e. ISAKMP_GEN_TLV */
-				if (lorv == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid length of LD\n");
-					return -1;
-				}
-			}
-			break;
-
-		case IPSECDOI_ATTR_GRP_DESC:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when GRP_DESC.\n");
-				return -1;
-			}
-
-			if (!alg_oakley_dhdef_ok(lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid group description=%u.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_KEY_LENGTH:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when KEY_LENGTH.\n");
-				return -1;
-			}
-			break;
-
-#ifdef HAVE_SECCTX
-		case IPSECDOI_ATTR_SECCTX:
-			if (flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"SECCTX must be in TLV.\n");
-				return -1;
-			}
-		break;
-#endif
-
-		case IPSECDOI_ATTR_KEY_ROUNDS:
-		case IPSECDOI_ATTR_COMP_DICT_SIZE:
-		case IPSECDOI_ATTR_COMP_PRIVALG:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"attr type=%u isn't supported.\n", type);
-			return -1;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid attribute type %d.\n", type);
-			return -1;
-		}
-
-		if (flag) {
-			tlen -= sizeof(*d);
-			d = (struct isakmp_data *)((char *)d
-				+ sizeof(*d));
-		} else {
-			tlen -= (sizeof(*d) + lorv);
-			d = (struct isakmp_data *)((caddr_t)d
-				+ sizeof(*d) + lorv);
-		}
-	}
-
-	if (proto_id == IPSECDOI_PROTO_IPSEC_AH &&
-	    !attrseen[IPSECDOI_ATTR_AUTH]) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"attr AUTH must be present for AH.\n");
-		return -1;
-	}
-
-	if (proto_id == IPSECDOI_PROTO_IPSEC_ESP &&
-	    trns->t_id == IPSECDOI_ESP_NULL &&
-	    !attrseen[IPSECDOI_ATTR_AUTH]) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "attr AUTH must be present for ESP NULL encryption.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-check_attr_ipcomp(trns)
-	struct isakmp_pl_t *trns;
-{
-	struct isakmp_data *d;
-	int tlen;
-	int flag, type = 0;
-	u_int16_t lorv;
-	int attrseen[16];	/* XXX magic number */
-
-	tlen = ntohs(trns->h.len) - sizeof(struct isakmp_pl_t);
-	d = (struct isakmp_data *)((caddr_t)trns + sizeof(struct isakmp_pl_t));
-	memset(attrseen, 0, sizeof(attrseen));
-
-	while (tlen > 0) {
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-		lorv = ntohs(d->lorv);
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"type=%d, flag=0x%04x, lorv=0x%04x\n",
-			type, flag, lorv);
-
-		if (type < sizeof(attrseen)/sizeof(attrseen[0]))
-			attrseen[type]++;
-
-		switch (type) {
-		case IPSECDOI_ATTR_ENC_MODE:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when ENC_MODE.\n");
-				return -1;
-			}
-
-			switch (lorv) {
-			case IPSECDOI_ATTR_ENC_MODE_TUNNEL:
-			case IPSECDOI_ATTR_ENC_MODE_TRNS:
-				break;
-#ifdef ENABLE_NATT
-			case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT:
-			case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT:
-				plog(LLV_DEBUG, LOCATION, NULL,
-				     "UDP encapsulation requested\n");
-				break;
-#endif
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid encryption mode=%u.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_SA_LD_TYPE:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when LD_TYPE.\n");
-				return -1;
-			}
-
-			switch (lorv) {
-			case IPSECDOI_ATTR_SA_LD_TYPE_SEC:
-			case IPSECDOI_ATTR_SA_LD_TYPE_KB:
-				break;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid life type %d.\n", lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_SA_LD:
-			if (flag) {
-				/* i.e. ISAKMP_GEN_TV */
-				plog(LLV_DEBUG, LOCATION, NULL,
-					"life duration was in TLV.\n");
-			} else {
-				/* i.e. ISAKMP_GEN_TLV */
-				if (lorv == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid length of LD\n");
-					return -1;
-				}
-			}
-			break;
-
-		case IPSECDOI_ATTR_GRP_DESC:
-			if (! flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"must be TV when GRP_DESC.\n");
-				return -1;
-			}
-
-			if (!alg_oakley_dhdef_ok(lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid group description=%u.\n",
-					lorv);
-				return -1;
-			}
-			break;
-
-		case IPSECDOI_ATTR_AUTH:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid attr type=%u.\n", type);
-			return -1;
-
-		case IPSECDOI_ATTR_KEY_LENGTH:
-		case IPSECDOI_ATTR_KEY_ROUNDS:
-		case IPSECDOI_ATTR_COMP_DICT_SIZE:
-		case IPSECDOI_ATTR_COMP_PRIVALG:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"attr type=%u isn't supported.\n", type);
-			return -1;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid attribute type %d.\n", type);
-			return -1;
-		}
-
-		if (flag) {
-			tlen -= sizeof(*d);
-			d = (struct isakmp_data *)((char *)d
-				+ sizeof(*d));
-		} else {
-			tlen -= (sizeof(*d) + lorv);
-			d = (struct isakmp_data *)((caddr_t)d
-				+ sizeof(*d) + lorv);
-		}
-	}
-
-#if 0
-	if (proto_id == IPSECDOI_PROTO_IPCOMP &&
-	    !attrseen[IPSECDOI_ATTR_AUTH]) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"attr AUTH must be present for AH.\n", type);
-		return -1;
-	}
-#endif
-
-	return 0;
-}
-
-/* %%% */
-/*
- * create phase1 proposal from remote configuration.
- * NOT INCLUDING isakmp general header of SA payload
- */
-vchar_t *
-ipsecdoi_setph1proposal(props)
-	struct isakmpsa *props;
-{
-	vchar_t *mysa;
-	int sablen;
-
-	/* count total size of SA minus isakmp general header */
-	/* not including isakmp general header of SA payload */
-	sablen = sizeof(struct ipsecdoi_sa_b);
-	sablen += setph1prop(props, NULL);
-
-	mysa = vmalloc(sablen);
-	if (mysa == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate my sa buffer\n");
-		return NULL;
-	}
-
-	/* create SA payload */
-	/* not including isakmp general header */
-	((struct ipsecdoi_sa_b *)mysa->v)->doi = htonl(props->rmconf->doitype);
-	((struct ipsecdoi_sa_b *)mysa->v)->sit = htonl(props->rmconf->sittype);
-
-	(void)setph1prop(props, mysa->v + sizeof(struct ipsecdoi_sa_b));
-
-	return mysa;
-}
-
-static int
-setph1prop(props, buf)
-	struct isakmpsa *props;
-	caddr_t buf;
-{
-	struct isakmp_pl_p *prop = NULL;
-	struct isakmpsa *s = NULL;
-	int proplen, trnslen;
-	u_int8_t *np_t; /* pointer next trns type in previous header */
-	int trns_num;
-	caddr_t p = buf;
-
-	proplen = sizeof(*prop);
-	if (buf) {
-		/* create proposal */
-		prop = (struct isakmp_pl_p *)p;
-		prop->h.np = ISAKMP_NPTYPE_NONE;
-		prop->p_no = props->prop_no;
-		prop->proto_id = IPSECDOI_PROTO_ISAKMP;
-		prop->spi_size = 0;
-		p += sizeof(*prop);
-	}
-
-	np_t = NULL;
-	trns_num = 0;
-
-	for (s = props; s != NULL; s = s->next) {
-		if (np_t)
-			*np_t = ISAKMP_NPTYPE_T;
-
-		trnslen = setph1trns(s, p);
-		proplen += trnslen;
-		if (buf) {
-			/* save buffer to pre-next payload */
-			np_t = &((struct isakmp_pl_t *)p)->h.np;
-			p += trnslen;
-
-			/* count up transform length */
-			trns_num++;
-		}
-	}
-
-	/* update proposal length */
-	if (buf) {
-		prop->h.len = htons(proplen);
-		prop->num_t = trns_num;
-	}
-
-	return proplen;
-}
-
-static int
-setph1trns(sa, buf)
-	struct isakmpsa *sa;
-	caddr_t buf;
-{
-	struct isakmp_pl_t *trns = NULL;
-	int trnslen, attrlen;
-	caddr_t p = buf;
-
-	trnslen = sizeof(*trns);
-	if (buf) {
-		/* create transform */
-		trns = (struct isakmp_pl_t *)p;
-		trns->h.np  = ISAKMP_NPTYPE_NONE;
-		trns->t_no  = sa->trns_no;
-		trns->t_id  = IPSECDOI_KEY_IKE;
-		p += sizeof(*trns);
-	}
-
-	attrlen = setph1attr(sa, p);
-	trnslen += attrlen;
-	if (buf)
-		p += attrlen;
-
-	if (buf)
-		trns->h.len = htons(trnslen);
-
-	return trnslen;
-}
-
-static int
-setph1attr(sa, buf)
-	struct isakmpsa *sa;
-	caddr_t buf;
-{
-	caddr_t p = buf;
-	int attrlen = 0;
-
-	if (sa->lifetime) {
-		u_int32_t lifetime = htonl((u_int32_t)sa->lifetime);
-
-		attrlen += sizeof(struct isakmp_data)
-			+ sizeof(struct isakmp_data);
-		if (sa->lifetime > 0xffff)
-			attrlen += sizeof(lifetime);
-		if (buf) {
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_SA_LD_TYPE,
-						OAKLEY_ATTR_SA_LD_TYPE_SEC);
-			if (sa->lifetime > 0xffff) {
-				p = isakmp_set_attr_v(p, OAKLEY_ATTR_SA_LD,
-						(caddr_t)&lifetime, 
-						sizeof(lifetime));
-			} else {
-				p = isakmp_set_attr_l(p, OAKLEY_ATTR_SA_LD,
-							sa->lifetime);
-			}
-		}
-	}
-
-	if (sa->lifebyte) {
-		u_int32_t lifebyte = htonl((u_int32_t)sa->lifebyte);
-		
-		attrlen += sizeof(struct isakmp_data)
-			+ sizeof(struct isakmp_data);
-		if (sa->lifebyte > 0xffff)
-			attrlen += sizeof(lifebyte);
-		if (buf) {
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_SA_LD_TYPE,
-						OAKLEY_ATTR_SA_LD_TYPE_KB);
-			if (sa->lifebyte > 0xffff) {
-				p = isakmp_set_attr_v(p, OAKLEY_ATTR_SA_LD,
-							(caddr_t)&lifebyte,
-							sizeof(lifebyte));
-			} else {
-				p = isakmp_set_attr_l(p, OAKLEY_ATTR_SA_LD,
-							sa->lifebyte);
-			}
-		}
-	}
-
-	if (sa->enctype) {
-		attrlen += sizeof(struct isakmp_data);
-		if (buf)
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_ENC_ALG, sa->enctype);
-	}
-	if (sa->encklen) {
-		attrlen += sizeof(struct isakmp_data);
-		if (buf)
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_KEY_LEN, sa->encklen);
-	}
-	if (sa->authmethod) {
-		int authmethod;
-
-#ifdef ENABLE_HYBRID
-		authmethod = switch_authmethod(sa->authmethod);
-#else
-		authmethod = sa->authmethod;
-#endif
-		attrlen += sizeof(struct isakmp_data);
-		if (buf)
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_AUTH_METHOD, authmethod);
-	}
-	if (sa->hashtype) {
-		attrlen += sizeof(struct isakmp_data);
-		if (buf)
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_HASH_ALG, sa->hashtype);
-	}
-	switch (sa->dh_group) {
-	case OAKLEY_ATTR_GRP_DESC_MODP768:
-	case OAKLEY_ATTR_GRP_DESC_MODP1024:
-	case OAKLEY_ATTR_GRP_DESC_MODP1536:
-	case OAKLEY_ATTR_GRP_DESC_MODP2048:
-	case OAKLEY_ATTR_GRP_DESC_MODP3072:
-	case OAKLEY_ATTR_GRP_DESC_MODP4096:
-	case OAKLEY_ATTR_GRP_DESC_MODP6144:
-	case OAKLEY_ATTR_GRP_DESC_MODP8192:
-		/* don't attach group type for known groups */
-		attrlen += sizeof(struct isakmp_data);
-		if (buf) {
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_GRP_DESC,
-				sa->dh_group);
-		}
-		break;
-	case OAKLEY_ATTR_GRP_DESC_EC2N155:
-	case OAKLEY_ATTR_GRP_DESC_EC2N185:
-		/* don't attach group type for known groups */
-		attrlen += sizeof(struct isakmp_data);
-		if (buf) {
-			p = isakmp_set_attr_l(p, OAKLEY_ATTR_GRP_TYPE,
-				OAKLEY_ATTR_GRP_TYPE_EC2N);
-		}
-		break;
-	case 0:
-	default:
-		break;
-	}
-
-#ifdef HAVE_GSSAPI
-	if (sa->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB &&
-	    sa->gssid != NULL) {
-		attrlen += sizeof(struct isakmp_data);
-		/*
-		 * Older versions of racoon just placed the ISO-Latin-1
-		 * string on the wire directly.  Check to see if we are
-		 * configured to be compatible with this behavior.  Otherwise,
-		 * we encode the GSS ID as UTF-16LE for Windows 2000
-		 * compatibility, which requires twice the number of octets.
-		 */
-		if (lcconf->gss_id_enc == LC_GSSENC_LATIN1)
-			attrlen += sa->gssid->l;
-		else
-			attrlen += sa->gssid->l * 2;
-		if (buf) {
-			plog(LLV_DEBUG, LOCATION, NULL, "gss id attr: len %zu, "
-			    "val '%.*s'\n", sa->gssid->l, (int)sa->gssid->l,
-			    sa->gssid->v);
-			if (lcconf->gss_id_enc == LC_GSSENC_LATIN1) {
-				p = isakmp_set_attr_v(p, OAKLEY_ATTR_GSS_ID,
-					(caddr_t)sa->gssid->v,
-					sa->gssid->l);
-			} else {
-				size_t dstleft = sa->gssid->l * 2;
-				size_t srcleft = sa->gssid->l;
-				const char *src = (const char *)sa->gssid->v;
-				char *odst, *dst = racoon_malloc(dstleft);
-				iconv_t cd;
-				size_t rv;
-
-				cd = iconv_open("utf-16le", "latin1");
-				if (cd == (iconv_t) -1) {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "unable to initialize "
-					    "latin1 -> utf-16le "
-					    "converstion descriptor: %s\n",
-					    strerror(errno));
-					attrlen -= sa->gssid->l * 2;
-					goto gssid_done;
-				}
-				odst = dst;
-				rv = iconv(cd, (__iconv_const char **)&src, 
-				    &srcleft, &dst, &dstleft);
-				if (rv != 0) {
-					if (rv == -1) {
-						plog(LLV_ERROR, LOCATION, NULL,
-						    "unable to convert GSS ID "
-						    "from latin1 -> utf-16le: "
-						    "%s\n", strerror(errno));
-					} else {
-						/* should never happen */
-						plog(LLV_ERROR, LOCATION, NULL,
-						    "%zd character%s in GSS ID "
-						    "cannot be represented "
-						    "in utf-16le\n",
-						    rv, rv == 1 ? "" : "s");
-					}
-					(void) iconv_close(cd);
-					attrlen -= sa->gssid->l * 2;
-					goto gssid_done;
-				}
-				(void) iconv_close(cd);
-
-				/* XXX Check srcleft and dstleft? */
-
-				p = isakmp_set_attr_v(p, OAKLEY_ATTR_GSS_ID,
-					odst, sa->gssid->l * 2);
-
-				racoon_free(odst);
-			}
-		}
-	}
- gssid_done:
-#endif /* HAVE_GSSAPI */
-
-	return attrlen;
-}
-
-static vchar_t *
-setph2proposal0(iph2, pp, pr)
-	const struct ph2handle *iph2;
-	const struct saprop *pp;
-	const struct saproto *pr;
-{
-	vchar_t *p;
-	struct isakmp_pl_p *prop;
-	struct isakmp_pl_t *trns;
-	struct satrns *tr;
-	int attrlen;
-	size_t trnsoff;
-	caddr_t x0, x;
-	u_int8_t *np_t; /* pointer next trns type in previous header */
-	const u_int8_t *spi;
-#ifdef HAVE_SECCTX
-	int truectxlen = 0;
-#endif
-
-	p = vmalloc(sizeof(*prop) + sizeof(pr->spi));
-	if (p == NULL)
-		return NULL;
-
-	/* create proposal */
-	prop = (struct isakmp_pl_p *)p->v;
-	prop->h.np = ISAKMP_NPTYPE_NONE;
-	prop->p_no = pp->prop_no;
-	prop->proto_id = pr->proto_id;
-	prop->num_t = 1;
-
-	spi = (const u_int8_t *)&pr->spi;
-	switch (pr->proto_id) {
-	case IPSECDOI_PROTO_IPCOMP:
-		/*
-		 * draft-shacham-ippcp-rfc2393bis-05.txt:
-		 * construct 16bit SPI (CPI).
-		 * XXX we may need to provide a configuration option to
-		 * generate 32bit SPI.  otherwise we cannot interoeprate
-		 * with nodes that uses 32bit SPI, in case we are initiator.
-		 */
-		prop->spi_size = sizeof(u_int16_t);
-		spi += sizeof(pr->spi) - sizeof(u_int16_t);
-		p->l -= sizeof(pr->spi);
-		p->l += sizeof(u_int16_t);
-		break;
-	default:
-		prop->spi_size = sizeof(pr->spi);
-		break;
-	}
-	memcpy(prop + 1, spi, prop->spi_size);
-
-	/* create transform */
-	trnsoff = sizeof(*prop) + prop->spi_size;
-	np_t = NULL;
-
-	for (tr = pr->head; tr; tr = tr->next) {
-	
-		switch (pr->proto_id) {
-		case IPSECDOI_PROTO_IPSEC_ESP:
-			/*
-			 * don't build a null encryption
-			 * with no authentication transform.
-			 */
-			if (tr->trns_id == IPSECDOI_ESP_NULL &&
-			    tr->authtype == IPSECDOI_ATTR_AUTH_NONE)
-				continue;
-			break;
-		}
-
-		if (np_t) {
-			*np_t = ISAKMP_NPTYPE_T;
-			prop->num_t++;
-		}
-
-		/* get attribute length */
-		attrlen = 0;
-		if (pp->lifetime) {
-			attrlen += sizeof(struct isakmp_data)
-				+ sizeof(struct isakmp_data);
-			if (pp->lifetime > 0xffff)
-				attrlen += sizeof(u_int32_t);
-		}
-		if (pp->lifebyte && pp->lifebyte != IPSECDOI_ATTR_SA_LD_KB_MAX) {
-			attrlen += sizeof(struct isakmp_data)
-				+ sizeof(struct isakmp_data);
-			if (pp->lifebyte > 0xffff)
-				attrlen += sizeof(u_int32_t);
-		}
-		attrlen += sizeof(struct isakmp_data);	/* enc mode */
-		if (tr->encklen)
-			attrlen += sizeof(struct isakmp_data);
-
-		switch (pr->proto_id) {
-		case IPSECDOI_PROTO_IPSEC_ESP:
-			/* non authentication mode ? */
-			if (tr->authtype != IPSECDOI_ATTR_AUTH_NONE)
-				attrlen += sizeof(struct isakmp_data);
-			break;
-		case IPSECDOI_PROTO_IPSEC_AH:
-			if (tr->authtype == IPSECDOI_ATTR_AUTH_NONE) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no authentication algorithm found "
-					"but protocol is AH.\n");
-				vfree(p);
-				return NULL;
-			}
-			attrlen += sizeof(struct isakmp_data);
-			break;
-		case IPSECDOI_PROTO_IPCOMP:
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid protocol: %d\n", pr->proto_id);
-			vfree(p);
-			return NULL;
-		}
-
-		if (alg_oakley_dhdef_ok(iph2->sainfo->pfs_group))
-			attrlen += sizeof(struct isakmp_data);
-
-#ifdef HAVE_SECCTX
-		/* ctx_str is defined as char ctx_str[MAX_CTXSTR_SIZ].
-		 * The string may be smaller than MAX_CTXSTR_SIZ.
-		 */
-		if (*pp->sctx.ctx_str) {
-			truectxlen = sizeof(struct security_ctx) -
-				     (MAX_CTXSTR_SIZE - pp->sctx.ctx_strlen);
-			attrlen += sizeof(struct isakmp_data) + truectxlen;
-		}
-#endif /* HAVE_SECCTX */
-
-		p = vrealloc(p, p->l + sizeof(*trns) + attrlen);
-		if (p == NULL)
-			return NULL;
-		prop = (struct isakmp_pl_p *)p->v;
-
-		/* set transform's values */
-		trns = (struct isakmp_pl_t *)(p->v + trnsoff);
-		trns->h.np  = ISAKMP_NPTYPE_NONE;
-		trns->t_no  = tr->trns_no;
-		trns->t_id  = tr->trns_id;
-
-		/* set attributes */
-		x = x0 = p->v + trnsoff + sizeof(*trns);
-
-		if (pp->lifetime) {
-			x = isakmp_set_attr_l(x, IPSECDOI_ATTR_SA_LD_TYPE,
-						IPSECDOI_ATTR_SA_LD_TYPE_SEC);
-			if (pp->lifetime > 0xffff) {
-				u_int32_t v = htonl((u_int32_t)pp->lifetime);
-				x = isakmp_set_attr_v(x, IPSECDOI_ATTR_SA_LD,
-							(caddr_t)&v, sizeof(v));
-			} else {
-				x = isakmp_set_attr_l(x, IPSECDOI_ATTR_SA_LD,
-							pp->lifetime);
-			}
-		}
-
-		if (pp->lifebyte && pp->lifebyte != IPSECDOI_ATTR_SA_LD_KB_MAX) {
-			x = isakmp_set_attr_l(x, IPSECDOI_ATTR_SA_LD_TYPE,
-						IPSECDOI_ATTR_SA_LD_TYPE_KB);
-			if (pp->lifebyte > 0xffff) {
-				u_int32_t v = htonl((u_int32_t)pp->lifebyte);
-				x = isakmp_set_attr_v(x, IPSECDOI_ATTR_SA_LD,
-							(caddr_t)&v, sizeof(v));
-			} else {
-				x = isakmp_set_attr_l(x, IPSECDOI_ATTR_SA_LD,
-							pp->lifebyte);
-			}
-		}
-
-		x = isakmp_set_attr_l(x, IPSECDOI_ATTR_ENC_MODE, pr->encmode);
-
-		if (tr->encklen)
-			x = isakmp_set_attr_l(x, IPSECDOI_ATTR_KEY_LENGTH, tr->encklen);
-
-		/* mandatory check has done above. */
-		if ((pr->proto_id == IPSECDOI_PROTO_IPSEC_ESP && tr->authtype != IPSECDOI_ATTR_AUTH_NONE)
-		 || pr->proto_id == IPSECDOI_PROTO_IPSEC_AH)
-			x = isakmp_set_attr_l(x, IPSECDOI_ATTR_AUTH, tr->authtype);
-
-		if (alg_oakley_dhdef_ok(iph2->sainfo->pfs_group))
-			x = isakmp_set_attr_l(x, IPSECDOI_ATTR_GRP_DESC,
-				iph2->sainfo->pfs_group);
-
-#ifdef HAVE_SECCTX
-		if (*pp->sctx.ctx_str) {
-			struct security_ctx secctx;
-			secctx = pp->sctx;
-			secctx.ctx_strlen = htons(pp->sctx.ctx_strlen);
-			x = isakmp_set_attr_v(x, IPSECDOI_ATTR_SECCTX,
-					     (caddr_t)&secctx, truectxlen);
-		}
-#endif
-		/* update length of this transform. */
-		trns = (struct isakmp_pl_t *)(p->v + trnsoff);
-		trns->h.len = htons(sizeof(*trns) + attrlen);
-
-		/* save buffer to pre-next payload */
-		np_t = &trns->h.np;
-
-		trnsoff += (sizeof(*trns) + attrlen);
-	}
-
-	if (np_t == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no suitable proposal was created.\n");
-		return NULL;
-	}
-
-	/* update length of this protocol. */
-	prop->h.len = htons(p->l);
-
-	return p;
-}
-
-/*
- * create phase2 proposal from policy configuration.
- * NOT INCLUDING isakmp general header of SA payload.
- * This function is called by initiator only.
- */
-int
-ipsecdoi_setph2proposal(iph2)
-	struct ph2handle *iph2;
-{
-	struct saprop *proposal, *a;
-	struct saproto *b = NULL;
-	vchar_t *q;
-	struct ipsecdoi_sa_b *sab;
-	struct isakmp_pl_p *prop;
-	size_t propoff;	/* for previous field of type of next payload. */
-
-	proposal = iph2->proposal;
-
-	iph2->sa = vmalloc(sizeof(*sab));
-	if (iph2->sa == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate my sa buffer\n");
-		return -1;
-	}
-
-	/* create SA payload */
-	sab = (struct ipsecdoi_sa_b *)iph2->sa->v;
-	sab->doi = htonl(IPSEC_DOI);
-	sab->sit = htonl(IPSECDOI_SIT_IDENTITY_ONLY);	/* XXX configurable ? */
-
-	prop = NULL;
-	propoff = 0;
-	for (a = proposal; a; a = a->next) {
-		for (b = a->head; b; b = b->next) {
-#ifdef ENABLE_NATT
-			if (iph2->ph1->natt_flags & NAT_DETECTED) {
-			  int udp_diff = iph2->ph1->natt_options->mode_udp_diff;
-			  plog (LLV_INFO, LOCATION, NULL,
-				"NAT detected -> UDP encapsulation "
-				"(ENC_MODE %d->%d).\n",
-				b->encmode,
-				b->encmode+udp_diff);
-			  /* Tunnel -> UDP-Tunnel, Transport -> UDP_Transport */
-			  b->encmode += udp_diff;
-			  b->udp_encap = 1;
-			}
-#endif
-
-			q = setph2proposal0(iph2, a, b);
-			if (q == NULL) {
-				VPTRINIT(iph2->sa);
-				return -1;
-			}
-
-			iph2->sa = vrealloc(iph2->sa, iph2->sa->l + q->l);
-			if (iph2->sa == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate my sa buffer\n");
-				if (q)
-					vfree(q);
-				return -1;
-			}
-			memcpy(iph2->sa->v + iph2->sa->l - q->l, q->v, q->l);
-			if (propoff != 0) {
-				prop = (struct isakmp_pl_p *)(iph2->sa->v +
-					propoff);
-				prop->h.np = ISAKMP_NPTYPE_P;
-			}
-			propoff = iph2->sa->l - q->l;
-
-			vfree(q);
-		}
-	}
-
-	return 0;
-}
-
-/*
- * return 1 if all of the given protocols are transport mode.
- */
-int
-ipsecdoi_transportmode(pp)
-	struct saprop *pp;
-{
-	struct saproto *pr = NULL;
-
-	for (; pp; pp = pp->next) {
-		for (pr = pp->head; pr; pr = pr->next) {
-			if (pr->encmode != IPSECDOI_ATTR_ENC_MODE_TRNS)
-				return 0;
-		}
-	}
-
-	return 1;
-}
-
-int
-ipsecdoi_get_defaultlifetime()
-{
-	return IPSECDOI_ATTR_SA_LD_SEC_DEFAULT;
-}
-
-int
-ipsecdoi_checkalgtypes(proto_id, enc, auth, comp)
-	int proto_id, enc, auth, comp;
-{
-#define TMPALGTYPE2STR(n) s_algtype(algclass_ipsec_##n, n)
-	switch (proto_id) {
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		if (enc == 0 || comp != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"illegal algorithm defined "
-				"ESP enc=%s auth=%s comp=%s.\n",
-				TMPALGTYPE2STR(enc),
-				TMPALGTYPE2STR(auth),
-				TMPALGTYPE2STR(comp));
-			return -1;
-		}
-		break;
-	case IPSECDOI_PROTO_IPSEC_AH:
-		if (enc != 0 || auth == 0 || comp != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"illegal algorithm defined "
-				"AH enc=%s auth=%s comp=%s.\n",
-				TMPALGTYPE2STR(enc),
-				TMPALGTYPE2STR(auth),
-				TMPALGTYPE2STR(comp));
-			return -1;
-		}
-		break;
-	case IPSECDOI_PROTO_IPCOMP:
-		if (enc != 0 || auth != 0 || comp == 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"illegal algorithm defined "
-				"IPcomp enc=%s auth=%s comp=%s.\n",
-				TMPALGTYPE2STR(enc),
-				TMPALGTYPE2STR(auth),
-				TMPALGTYPE2STR(comp));
-			return -1;
-		}
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid ipsec protocol %d\n", proto_id);
-		return -1;
-	}
-#undef TMPALGTYPE2STR
-	return 0;
-}
-
-int
-ipproto2doi(proto)
-	int proto;
-{
-	switch (proto) {
-	case IPPROTO_AH:
-		return IPSECDOI_PROTO_IPSEC_AH;
-	case IPPROTO_ESP:
-		return IPSECDOI_PROTO_IPSEC_ESP;
-	case IPPROTO_IPCOMP:
-		return IPSECDOI_PROTO_IPCOMP;
-	}
-	return -1;	/* XXX */
-}
-
-int
-doi2ipproto(proto)
-	int proto;
-{
-	switch (proto) {
-	case IPSECDOI_PROTO_IPSEC_AH:
-		return IPPROTO_AH;
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		return IPPROTO_ESP;
-	case IPSECDOI_PROTO_IPCOMP:
-		return IPPROTO_IPCOMP;
-	}
-	return -1;	/* XXX */
-}
-
-/*
- * Check if a subnet id is valid for comparison
- * with an address id ( address length mask )
- * and compare them
- * Return value
- * =  0 for match
- * =  1 for mismatch
- */
-
-int
-ipsecdoi_subnetisaddr_v4( subnet, address )
-	const vchar_t *subnet;
-	const vchar_t *address;
-{
-	struct in_addr *mask;
-
-	if (address->l != sizeof(struct in_addr))
-		return 1;
-
-	if (subnet->l != (sizeof(struct in_addr)*2))
-		return 1;
-
-	mask = (struct in_addr*)(subnet->v + sizeof(struct in_addr));
-
-	if (mask->s_addr!=0xffffffff)
-		return 1;
-
-	return memcmp(subnet->v,address->v,address->l);
-}
-
-#ifdef INET6
-
-int
-ipsecdoi_subnetisaddr_v6( subnet, address )
-	const vchar_t *subnet;
-	const vchar_t *address;
-{
-	struct in6_addr *mask;
-	int i;
-
-	if (address->l != sizeof(struct in6_addr))
-		return 1;
-
-	if (subnet->l != (sizeof(struct in6_addr)*2))
-		return 1;
-
-	mask = (struct in6_addr*)(subnet->v + sizeof(struct in6_addr));
-
-	for (i=0; i<16; i++)
-		if(mask->s6_addr[i]!=0xff)
-			return 1;
-
-	return memcmp(subnet->v,address->v,address->l);
-}
-
-#endif
-
-/*
- * Check and Compare two IDs
- * - specify 0 for exact if wildcards are allowed
- * Return value
- * =  0 for match
- * =  1 for misatch
- * = -1 for integrity error
- */
-
-int
-ipsecdoi_chkcmpids( idt, ids, exact )
-	const vchar_t *idt; /* id cmp target */
-	const vchar_t *ids; /* id cmp source */
-	int exact;
-{
-	struct ipsecdoi_id_b *id_bt;
-	struct ipsecdoi_id_b *id_bs;
-	vchar_t ident_t;
-	vchar_t ident_s;
-	int result;
-
-	/* handle wildcard IDs */
-
-	if (idt == NULL || ids == NULL)
-	{
-		if( !exact )
-		{
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"check and compare ids : values matched (ANONYMOUS)\n" );
-			return 0;
-		}
-		else
-		{
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"check and compare ids : value mismatch (ANONYMOUS)\n" );
-			return -1;
-		}
-	}
-
-	/* make sure the ids are of the same type */
-
-	id_bt = (struct ipsecdoi_id_b *) idt->v;
-	id_bs = (struct ipsecdoi_id_b *) ids->v;
-
-	ident_t.v = idt->v + sizeof(*id_bt);
-	ident_t.l = idt->l - sizeof(*id_bt);
-	ident_s.v = ids->v + sizeof(*id_bs);
-	ident_s.l = ids->l - sizeof(*id_bs);
-
-	if (id_bs->type != id_bt->type)
-	{
-		/*
-		 * special exception for comparing
-                 * address to subnet id types when
-                 * the netmask is address length
-                 */
-
-		if ((id_bs->type == IPSECDOI_ID_IPV4_ADDR)&&
-		    (id_bt->type == IPSECDOI_ID_IPV4_ADDR_SUBNET)) {
-			result = ipsecdoi_subnetisaddr_v4(&ident_t,&ident_s);
-			goto cmpid_result;
-		}
-
-		if ((id_bs->type == IPSECDOI_ID_IPV4_ADDR_SUBNET)&&
-		    (id_bt->type == IPSECDOI_ID_IPV4_ADDR)) {
-			result = ipsecdoi_subnetisaddr_v4(&ident_s,&ident_t);
-			goto cmpid_result;
-		}
-
-#ifdef INET6
-		if ((id_bs->type == IPSECDOI_ID_IPV6_ADDR)&&
-		    (id_bt->type == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
-			result = ipsecdoi_subnetisaddr_v6(&ident_t,&ident_s);
-			goto cmpid_result;
-		}
-
-		if ((id_bs->type == IPSECDOI_ID_IPV6_ADDR_SUBNET)&&
-		    (id_bt->type == IPSECDOI_ID_IPV6_ADDR)) {
-			result = ipsecdoi_subnetisaddr_v6(&ident_s,&ident_t);
-			goto cmpid_result;
-		}
-#endif
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"check and compare ids : id type mismatch %s != %s\n",
-			s_ipsecdoi_ident(id_bs->type),
-			s_ipsecdoi_ident(id_bt->type));
-
-		return 1;
-	}
-
-	if(id_bs->proto_id != id_bt->proto_id){
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"check and compare ids : proto_id mismatch %d != %d\n",
-			id_bs->proto_id, id_bt->proto_id);
-
-		return 1;
-	}
-
-	/* compare the ID data. */
-
-	switch (id_bt->type) {
-	        case IPSECDOI_ID_DER_ASN1_DN:
-        	case IPSECDOI_ID_DER_ASN1_GN:
-			/* compare asn1 ids */
-			result = eay_cmp_asn1dn(&ident_t, &ident_s);
-			goto cmpid_result;
-
-		case IPSECDOI_ID_IPV4_ADDR:
-			/* validate lengths */
-			if ((ident_t.l != sizeof(struct in_addr))||
-			    (ident_s.l != sizeof(struct in_addr)))
-				goto cmpid_invalid;
-			break;
-
-		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-		case IPSECDOI_ID_IPV4_ADDR_RANGE:
-			/* validate lengths */
-			if ((ident_t.l != (sizeof(struct in_addr)*2))||
-			    (ident_s.l != (sizeof(struct in_addr)*2)))
-				goto cmpid_invalid;
-			break;
-
-#ifdef INET6
-		case IPSECDOI_ID_IPV6_ADDR:
-			/* validate lengths */
-			if ((ident_t.l != sizeof(struct in6_addr))||
-			    (ident_s.l != sizeof(struct in6_addr)))
-				goto cmpid_invalid;
-			break;
-
-		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-		case IPSECDOI_ID_IPV6_ADDR_RANGE:
-			/* validate lengths */
-			if ((ident_t.l != (sizeof(struct in6_addr)*2))||
-			    (ident_s.l != (sizeof(struct in6_addr)*2)))
-				goto cmpid_invalid;
-			break;
-#endif
-		case IPSECDOI_ID_FQDN:
-		case IPSECDOI_ID_USER_FQDN:
-		case IPSECDOI_ID_KEY_ID:
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Unhandled id type %i specified for comparison\n",
-				id_bt->type);
-			return -1;
-	}
-
-	/* validate matching data and length */
-	if (ident_t.l == ident_s.l)
-		result = memcmp(ident_t.v,ident_s.v,ident_t.l);
-	else
-		result = 1;
-
-cmpid_result:
-
-	/* debug level output */
-	if(loglevel >= LLV_DEBUG) {
-		char *idstrt = ipsecdoi_id2str(idt);
-		char *idstrs = ipsecdoi_id2str(ids);
-
-		if (!result)
-	 		plog(LLV_DEBUG, LOCATION, NULL,
-				"check and compare ids : values matched (%s)\n",
-				 s_ipsecdoi_ident(id_bs->type) );
-		else
- 			plog(LLV_DEBUG, LOCATION, NULL,
-				"check and compare ids : value mismatch (%s)\n",
-				 s_ipsecdoi_ident(id_bs->type));
-
-		plog(LLV_DEBUG, LOCATION, NULL, "cmpid target: \'%s\'\n", idstrt );
-		plog(LLV_DEBUG, LOCATION, NULL, "cmpid source: \'%s\'\n", idstrs );
-
-		racoon_free(idstrs);
-		racoon_free(idstrt);
-	}
-
-	/* return result */
-	if( !result )
-		return 0;
-	else
-		return 1;
-
-cmpid_invalid:
-
-	/* id integrity error */
-	plog(LLV_DEBUG, LOCATION, NULL, "check and compare ids : %s integrity error\n",
-		s_ipsecdoi_ident(id_bs->type));
-	plog(LLV_DEBUG, LOCATION, NULL, "cmpid target: length = \'%zu\'\n", ident_t.l );
-	plog(LLV_DEBUG, LOCATION, NULL, "cmpid source: length = \'%zu\'\n", ident_s.l );
-
-	return -1;
-}
-
-/*
- * check the following:
- * - In main mode with pre-shared key, only address type can be used.
- * - if proper type for phase 1 ?
- * - if phase 1 ID payload conformed RFC2407 4.6.2.
- *   (proto, port) must be (0, 0), (udp, 500) or (udp, [specified]).
- * - if ID payload sent from peer is equal to the ID expected by me.
- *
- * both of "id" and "id_p" should be ID payload without general header,
- */
-int
-ipsecdoi_checkid1(iph1)
-	struct ph1handle *iph1;
-{
-	struct ipsecdoi_id_b *id_b;
-	struct sockaddr *sa;
-	caddr_t sa1, sa2;
-
-	if (iph1->id_p == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid iph1 passed id_p == NULL\n");
-		return ISAKMP_INTERNAL_ERROR;
-	}
-	if (iph1->id_p->l < sizeof(*id_b)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid value passed as \"ident\" (len=%lu)\n",
-			(u_long)iph1->id_p->l);
-		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-	}
-
-	id_b = (struct ipsecdoi_id_b *)iph1->id_p->v;
-
-#ifndef ANDROID_PATCHED
-	/* In main mode with pre-shared key, only address type can be used. */
-	if (iph1->etype == ISAKMP_ETYPE_IDENT &&
-	    iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_PSKEY) {
-		 if (id_b->type != IPSECDOI_ID_IPV4_ADDR
-		  && id_b->type != IPSECDOI_ID_IPV6_ADDR) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Expecting IP address type in main mode, "
-				"but %s.\n", s_ipsecdoi_ident(id_b->type));
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-	}
-#endif
-
-	/* if proper type for phase 1 ? */
-	switch (id_b->type) {
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV4_ADDR_RANGE:
-	case IPSECDOI_ID_IPV6_ADDR_RANGE:
-		plog(LLV_WARNING, LOCATION, NULL,
-			"such ID type %s is not proper.\n",
-			s_ipsecdoi_ident(id_b->type));
-		/*FALLTHROUGH*/
-	}
-
-	/* if phase 1 ID payload conformed RFC2407 4.6.2. */
-	if (id_b->type == IPSECDOI_ID_IPV4_ADDR ||
-	    id_b->type == IPSECDOI_ID_IPV6_ADDR) {
-
-		if (id_b->proto_id == 0 && ntohs(id_b->port) != 0) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				"protocol ID and Port mismatched. "
-				"proto_id:%d port:%d\n",
-				id_b->proto_id, ntohs(id_b->port));
-			/*FALLTHROUGH*/
-
-		} else if (id_b->proto_id == IPPROTO_UDP) {
-			/*
-			 * copmaring with expecting port.
-			 * always permit if port is equal to PORT_ISAKMP
-			 */
-			if (ntohs(id_b->port) != PORT_ISAKMP) {
-				u_int16_t port;
-
-				port = extract_port(iph1->remote);
-				if (ntohs(id_b->port) != port) {
-					plog(LLV_WARNING, LOCATION, NULL,
-						"port %d expected, but %d\n",
-						port, ntohs(id_b->port));
-					/*FALLTHROUGH*/
-				}
-			}
-		}
-	}
-
-	/* compare with the ID if specified. */
-	if (genlist_next(iph1->rmconf->idvl_p, 0)) {
-		vchar_t *ident0 = NULL;
-		vchar_t ident;
-		struct idspec *id;
-		struct genlist_entry *gpb;
-
-		for (id = genlist_next (iph1->rmconf->idvl_p, &gpb); id; id = genlist_next (0, &gpb)) {
-			/* check the type of both IDs */
-			if (id->idtype != doi2idtype(id_b->type))
-				continue;  /* ID type mismatch */
-			if (id->id == 0)
-				goto matched;
-
-			/* compare defined ID with the ID sent by peer. */
-			if (ident0 != NULL)
-				vfree(ident0);
-			ident0 = getidval(id->idtype, id->id);
-
-			switch (id->idtype) {
-			case IDTYPE_ASN1DN:
-				ident.v = iph1->id_p->v + sizeof(*id_b);
-				ident.l = iph1->id_p->l - sizeof(*id_b);
-				if (eay_cmp_asn1dn(ident0, &ident) == 0)
-					goto matched;
-				break;
-			case IDTYPE_ADDRESS:
-				sa = (struct sockaddr *)ident0->v;
-				sa2 = (caddr_t)(id_b + 1);
-				switch (sa->sa_family) {
-				case AF_INET:
-					if (iph1->id_p->l - sizeof(*id_b) != sizeof(struct in_addr))
-						continue;  /* ID value mismatch */
-					sa1 = (caddr_t)&((struct sockaddr_in *)sa)->sin_addr;
-					if (memcmp(sa1, sa2, sizeof(struct in_addr)) == 0)
-						goto matched;
-					break;
-#ifdef INET6
-				case AF_INET6:
-					if (iph1->id_p->l - sizeof(*id_b) != sizeof(struct in6_addr))
-						continue;  /* ID value mismatch */
-					sa1 = (caddr_t)&((struct sockaddr_in6 *)sa)->sin6_addr;
-					if (memcmp(sa1, sa2, sizeof(struct in6_addr)) == 0)
-						goto matched;
-					break;
-#endif
-				default:
-					break;
-				}
-				break;
-			default:
-				if (memcmp(ident0->v, id_b + 1, ident0->l) == 0)
-					goto matched;
-				break;
-			}
-		}
-		if (ident0 != NULL) {
-			vfree(ident0);
-			ident0 = NULL;
-		}
-		plog(LLV_WARNING, LOCATION, NULL, "No ID match.\n");
-		if (iph1->rmconf->verify_identifier)
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-matched: /* ID value match */
-		if (ident0 != NULL)
-			vfree(ident0);
-	}
-
-	return 0;
-}
-
-/*
- * create ID payload for phase 1 and set into iph1->id.
- * NOT INCLUDING isakmp general header.
- * see, RFC2407 4.6.2.1
- */
-int
-ipsecdoi_setid1(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *ret = NULL;
-	struct ipsecdoi_id_b id_b;
-	vchar_t *ident = NULL;
-	struct sockaddr *ipid = NULL;
-
-	/* init */
-	id_b.proto_id = 0;
-	id_b.port = 0;
-	ident = NULL;
-
-	switch (iph1->rmconf->idvtype) {
-	case IDTYPE_FQDN:
-		id_b.type = IPSECDOI_ID_FQDN;
-		ident = getidval(iph1->rmconf->idvtype, iph1->rmconf->idv);
-		break;
-	case IDTYPE_USERFQDN:
-		id_b.type = IPSECDOI_ID_USER_FQDN;
-		ident = getidval(iph1->rmconf->idvtype, iph1->rmconf->idv);
-		break;
-	case IDTYPE_KEYID:
-		id_b.type = IPSECDOI_ID_KEY_ID;
-		ident = getidval(iph1->rmconf->idvtype, iph1->rmconf->idv);
-		break;
-	case IDTYPE_ASN1DN:
-		id_b.type = IPSECDOI_ID_DER_ASN1_DN;
-		if (iph1->rmconf->idv) {
-			/* XXX it must be encoded to asn1dn. */
-			ident = vdup(iph1->rmconf->idv);
-		} else {
-			if (oakley_getmycert(iph1) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get own CERT.\n");
-				goto err;
-			}
-			ident = eay_get_x509asn1subjectname(&iph1->cert->cert);
-		}
-		break;
-	case IDTYPE_ADDRESS:
-		/*
-		 * if the value of the id type was set by the configuration
-		 * file, then use it.  otherwise the value is get from local
-		 * ip address by using ike negotiation.
-		 */
-		if (iph1->rmconf->idv)
-			ipid = (struct sockaddr *)iph1->rmconf->idv->v;
-		/*FALLTHROUGH*/
-	default:
-	    {
-		int l;
-		caddr_t p;
-
-		if (ipid == NULL)
-			ipid = iph1->local;
-
-		/* use IP address */
-		switch (ipid->sa_family) {
-		case AF_INET:
-			id_b.type = IPSECDOI_ID_IPV4_ADDR;
-			l = sizeof(struct in_addr);
-			p = (caddr_t)&((struct sockaddr_in *)ipid)->sin_addr;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			id_b.type = IPSECDOI_ID_IPV6_ADDR;
-			l = sizeof(struct in6_addr);
-			p = (caddr_t)&((struct sockaddr_in6 *)ipid)->sin6_addr;
-			break;
-#endif
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid address family.\n");
-			goto err;
-		}
-		id_b.proto_id = IPPROTO_UDP;
-		id_b.port = htons(PORT_ISAKMP);
-		ident = vmalloc(l);
-		if (!ident) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get ID buffer.\n");
-			return 0;
-		}
-		memcpy(ident->v, p, ident->l);
-	    }
-	}
-	if (!ident) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID buffer.\n");
-		return 0;
-	}
-
-	ret = vmalloc(sizeof(id_b) + ident->l);
-	if (ret == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID buffer.\n");
-		goto err;
-	}
-
-	memcpy(ret->v, &id_b, sizeof(id_b));
-	memcpy(ret->v + sizeof(id_b), ident->v, ident->l);
-
-	iph1->id = ret;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"use ID type of %s\n", s_ipsecdoi_ident(id_b.type));
-	if (ident)
-		vfree(ident);
-	return 0;
-
-err:
-	if (ident)
-		vfree(ident);
-	plog(LLV_ERROR, LOCATION, NULL, "failed get my ID\n");
-	return -1;
-}
-
-static vchar_t *
-getidval(type, val)
-	int type;
-	vchar_t *val;
-{
-	vchar_t *new = NULL;
-
-	if (val)
-		new = vdup(val);
-	else if (lcconf->ident[type])
-		new = vdup(lcconf->ident[type]);
-
-	return new;
-}
-
-/* it's only called by cfparse.y. */
-int
-set_identifier(vpp, type, value)
-	vchar_t **vpp, *value;
-	int type;
-{
-	return set_identifier_qual(vpp, type, value, IDQUAL_UNSPEC);
-}
-
-int
-set_identifier_qual(vpp, type, value, qual)
-	vchar_t **vpp, *value;
-	int type;
-	int qual;
-{
-	vchar_t *new = NULL;
-
-	/* simply return if value is null. */
-	if (!value){
-		if( type == IDTYPE_FQDN || type == IDTYPE_USERFQDN){
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "No %s\n", type == IDTYPE_FQDN ? "fqdn":"user fqdn");
-			return -1;
-		}
-		return 0;
-	}
-
-	switch (type) {
-	case IDTYPE_FQDN:
-	case IDTYPE_USERFQDN:
-		if(value->l <= 1){
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "Empty %s\n", type == IDTYPE_FQDN ? "fqdn":"user fqdn");
-			return -1;
-		}
-		/* length is adjusted since QUOTEDSTRING teminates NULL. */
-		new = vmalloc(value->l - 1);
-		if (new == NULL)
-			return -1;
-		memcpy(new->v, value->v, new->l);
-		break;
-	case IDTYPE_KEYID:
-		/* 
-		 * If no qualifier is specified: IDQUAL_UNSPEC. It means
-		 * to use a file for backward compatibility sake. 
-		 */
-		switch(qual) {
-		case IDQUAL_FILE:
-		case IDQUAL_UNSPEC: {
-			FILE *fp;
-			char b[512];
-			int tlen, len;
-
-			fp = fopen(value->v, "r");
-			if (fp == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"can not open %s\n", value->v);
-				return -1;
-			}
-			tlen = 0;
-			while ((len = fread(b, 1, sizeof(b), fp)) != 0) {
-				new = vrealloc(new, tlen + len);
-				if (!new) {
-					fclose(fp);
-					return -1;
-				}
-				memcpy(new->v + tlen, b, len);
-				tlen += len;
-			}
-			break;
-		}
-
-		case IDQUAL_TAG:
-			new = vmalloc(value->l - 1);
-			if (new == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"can not allocate memory");
-				return -1;
-			}
-			memcpy(new->v, value->v, new->l);
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"unknown qualifier");
-			return -1;
-		}
-		break;
-	
-	case IDTYPE_ADDRESS: {
-		struct sockaddr *sa;
-
-		/* length is adjusted since QUOTEDSTRING teminates NULL. */
-		if (value->l == 0)
-			break;
-
-		sa = str2saddr(value->v, NULL);
-		if (sa == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid ip address %s\n", value->v);
-			return -1;
-		}
-
-		new = vmalloc(sysdep_sa_len(sa));
-		if (new == NULL) {
-			racoon_free(sa);
-			return -1;
-		}
-		memcpy(new->v, sa, new->l);
-		racoon_free(sa);
-		break;
-	}
-	case IDTYPE_ASN1DN:
-		if (value->v[0] == '~')
-			/* Hex-encoded ASN1 strings */
-			new = eay_hex2asn1dn(value->v + 1, - 1);
-		else
-			/* DN encoded strings */
-			new = eay_str2asn1dn(value->v, value->l - 1);
-
-		if (new == NULL)
-			return -1;
-
-		if (loglevel >= LLV_DEBUG) {
-			X509_NAME *xn;
-			BIO *bio;
-			unsigned char *ptr = (unsigned char *) new->v, *buf;
-			size_t len;
-#if defined(ANDROID_CHANGES)
-			char *bio_contents;
-#else
-			char save;
-#endif
-
-			xn = d2i_X509_NAME(NULL, (void *)&ptr, new->l);
-			bio = BIO_new(BIO_s_mem());
-			
-			X509_NAME_print_ex(bio, xn, 0, 0);
-#if defined(ANDROID_CHANGES)
-			BIO_write(bio, "\x00", 1);
-			BIO_get_mem_data(bio, &bio_contents);
-			plog(LLV_DEBUG, LOCATION, NULL, "Parsed DN: %s\n", bio_contents);
-#else
-			len = BIO_get_mem_data(bio, &ptr);
-			save = ptr[len];
-			ptr[len] = 0;
-			plog(LLV_DEBUG, LOCATION, NULL, "Parsed DN: %s\n", ptr);
-			ptr[len] = save;
-#endif
-			X509_NAME_free(xn);
-			BIO_free(bio);
-		}
-
-		break;
-	}
-
-	*vpp = new;
-
-	return 0;
-}
-
-/*
- * create ID payload for phase 2, and set into iph2->id and id_p.  There are
- * NOT INCLUDING isakmp general header.
- * this function is for initiator.  responder will get to copy from payload.
- * responder ID type is always address type.
- * see, RFC2407 4.6.2.1
- */
-int
-ipsecdoi_setid2(iph2)
-	struct ph2handle *iph2;
-{
-	struct secpolicy *sp;
-
-	/* check there is phase 2 handler ? */
-	sp = getspbyspid(iph2->spid);
-	if (sp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no policy found for spid:%u.\n", iph2->spid);
-		return -1;
-	}
-
-	iph2->id = ipsecdoi_sockaddr2id((struct sockaddr *)&sp->spidx.src,
-					sp->spidx.prefs, sp->spidx.ul_proto);
-	if (iph2->id == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID for %s\n",
-			spidx2str(&sp->spidx));
-		return -1;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "use local ID type %s\n",
-		s_ipsecdoi_ident(((struct ipsecdoi_id_b *)iph2->id->v)->type));
-
-	/* remote side */
-	iph2->id_p = ipsecdoi_sockaddr2id((struct sockaddr *)&sp->spidx.dst,
-				sp->spidx.prefd, sp->spidx.ul_proto);
-	if (iph2->id_p == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID for %s\n",
-			spidx2str(&sp->spidx));
-		VPTRINIT(iph2->id);
-		return -1;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"use remote ID type %s\n",
-		s_ipsecdoi_ident(((struct ipsecdoi_id_b *)iph2->id_p->v)->type));
-
-	return 0;
-}
-
-/*
- * set address type of ID.
- * NOT INCLUDING general header.
- */
-vchar_t *
-ipsecdoi_sockaddr2id(saddr, prefixlen, ul_proto)
-	struct sockaddr *saddr;
-	u_int prefixlen;
-	u_int ul_proto;
-{
-	vchar_t *new;
-	int type, len1, len2;
-	caddr_t sa;
-	u_short port;
-
-	/*
-	 * Q. When type is SUBNET, is it allowed to be ::1/128.
-	 * A. Yes. (consensus at bake-off)
-	 */
-	switch (saddr->sa_family) {
-	case AF_INET:
-		len1 = sizeof(struct in_addr);
-		if (prefixlen == (sizeof(struct in_addr) << 3)) {
-			type = IPSECDOI_ID_IPV4_ADDR;
-			len2 = 0;
-		} else {
-			type = IPSECDOI_ID_IPV4_ADDR_SUBNET;
-			len2 = sizeof(struct in_addr);
-		}
-		sa = (caddr_t)&((struct sockaddr_in *)(saddr))->sin_addr;
-		port = ((struct sockaddr_in *)(saddr))->sin_port;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		len1 = sizeof(struct in6_addr);
-		if (prefixlen == (sizeof(struct in6_addr) << 3)) {
-			type = IPSECDOI_ID_IPV6_ADDR;
-			len2 = 0;
-		} else {
-			type = IPSECDOI_ID_IPV6_ADDR_SUBNET;
-			len2 = sizeof(struct in6_addr);
-		}
-		sa = (caddr_t)&((struct sockaddr_in6 *)(saddr))->sin6_addr;
-		port = ((struct sockaddr_in6 *)(saddr))->sin6_port;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid family: %d.\n", saddr->sa_family);
-		return NULL;
-	}
-
-	/* get ID buffer */
-	new = vmalloc(sizeof(struct ipsecdoi_id_b) + len1 + len2);
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID buffer.\n");
-		return NULL;
-	}
-
-	memset(new->v, 0, new->l);
-
-	/* set the part of header. */
-	((struct ipsecdoi_id_b *)new->v)->type = type;
-
-	/* set ul_proto and port */
-	/*
-	 * NOTE: we use both IPSEC_ULPROTO_ANY and IPSEC_PORT_ANY as wild card
-	 * because 0 means port number of 0.  Instead of 0, we use IPSEC_*_ANY.
-	 */
-	((struct ipsecdoi_id_b *)new->v)->proto_id =
-		ul_proto == IPSEC_ULPROTO_ANY ? 0 : ul_proto;
-	((struct ipsecdoi_id_b *)new->v)->port =
-		port == IPSEC_PORT_ANY ? 0 : port;
-	memcpy(new->v + sizeof(struct ipsecdoi_id_b), sa, len1);
-
-	/* set address */
-
-	/* set prefix */
-	if (len2) {
-		u_char *p = (unsigned char *) new->v + 
-			sizeof(struct ipsecdoi_id_b) + len1;
-		u_int bits = prefixlen;
-
-		while (bits >= 8) {
-			*p++ = 0xff;
-			bits -= 8;
-		}
-
-		if (bits > 0)
-			*p = ~((1 << (8 - bits)) - 1);
-	}
-
-	return new;
-}
-
-vchar_t *
-ipsecdoi_sockrange2id(laddr, haddr, ul_proto)
-	struct sockaddr *laddr, *haddr;
-	u_int ul_proto;
-{
-	vchar_t *new;
-	int type, len1, len2;
-	u_short port;
-
-	if (laddr->sa_family != haddr->sa_family) {
-	    plog(LLV_ERROR, LOCATION, NULL, "Address family mismatch\n");
-	    return NULL;
-	}
-
-	switch (laddr->sa_family) {
-	case AF_INET:
-	    type = IPSECDOI_ID_IPV4_ADDR_RANGE;
-	    len1 = sizeof(struct in_addr);
-	    len2 = sizeof(struct in_addr);
-	    break;
-#ifdef INET6
-	case AF_INET6:
-		type = IPSECDOI_ID_IPV6_ADDR_RANGE;
-		len1 = sizeof(struct in6_addr);
-		len2 = sizeof(struct in6_addr);
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid family: %d.\n", laddr->sa_family);
-		return NULL;
-	}
-
-	/* get ID buffer */
-	new = vmalloc(sizeof(struct ipsecdoi_id_b) + len1 + len2);
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID buffer.\n");
-		return NULL;
-	}
-
-	memset(new->v, 0, new->l);
-	/* set the part of header. */
-	((struct ipsecdoi_id_b *)new->v)->type = type;
-
-	/* set ul_proto and port */
-	/*
-	 * NOTE: we use both IPSEC_ULPROTO_ANY and IPSEC_PORT_ANY as wild card
-	 * because 0 means port number of 0.  Instead of 0, we use IPSEC_*_ANY.
-	 */
-	((struct ipsecdoi_id_b *)new->v)->proto_id =
-		ul_proto == IPSEC_ULPROTO_ANY ? 0 : ul_proto;
-	port = ((struct sockaddr_in *)(laddr))->sin_port;
-	((struct ipsecdoi_id_b *)new->v)->port =
-		port == IPSEC_PORT_ANY ? 0 : port;
-	memcpy(new->v + sizeof(struct ipsecdoi_id_b), 
-	       (caddr_t)&((struct sockaddr_in *)(laddr))->sin_addr, 
-	       len1);
-	memcpy(new->v + sizeof(struct ipsecdoi_id_b) + len1, 
-	       (caddr_t)&((struct sockaddr_in *)haddr)->sin_addr,
-	       len2);
-	return new;
-}
-
-
-/*
- * create sockaddr structure from ID payload (buf).
- * buffers (saddr, prefixlen, ul_proto) must be allocated.
- * see, RFC2407 4.6.2.1
- */
-int
-ipsecdoi_id2sockaddr(buf, saddr, prefixlen, ul_proto)
-	vchar_t *buf;
-	struct sockaddr *saddr;
-	u_int8_t *prefixlen;
-	u_int16_t *ul_proto;
-{
-	struct ipsecdoi_id_b *id_b = (struct ipsecdoi_id_b *)buf->v;
-	u_int plen = 0;
-
-	/*
-	 * When a ID payload of subnet type with a IP address of full bit
-	 * masked, it has to be processed as host address.
-	 * e.g. below 2 type are same.
-	 *      type = ipv6 subnet, data = 2001::1/128
-	 *      type = ipv6 address, data = 2001::1
-	 */
-	switch (id_b->type) {
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in);
-#endif
-		saddr->sa_family = AF_INET;
-		((struct sockaddr_in *)saddr)->sin_port =
-			(id_b->port == 0
-				? IPSEC_PORT_ANY
-				: id_b->port);		/* see sockaddr2id() */
-		memcpy(&((struct sockaddr_in *)saddr)->sin_addr,
-			buf->v + sizeof(*id_b), sizeof(struct in_addr));
-		break;
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in6);
-#endif
-		saddr->sa_family = AF_INET6;
-		((struct sockaddr_in6 *)saddr)->sin6_port =
-			(id_b->port == 0
-				? IPSEC_PORT_ANY
-				: id_b->port);		/* see sockaddr2id() */
-		memcpy(&((struct sockaddr_in6 *)saddr)->sin6_addr,
-			buf->v + sizeof(*id_b), sizeof(struct in6_addr));
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unsupported ID type %d\n", id_b->type);
-		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-	}
-
-	/* get prefix length */
-	switch (id_b->type) {
-	case IPSECDOI_ID_IPV4_ADDR:
-		plen = sizeof(struct in_addr) << 3;
-		break;
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR:
-		plen = sizeof(struct in6_addr) << 3;
-		break;
-#endif
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-#endif
-	    {
-		u_char *p;
-		u_int max;
-		int alen = sizeof(struct in_addr);
-
-		switch (id_b->type) {
-		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-			alen = sizeof(struct in_addr);
-			break;
-#ifdef INET6
-		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-			alen = sizeof(struct in6_addr);
-			break;
-#endif
-		}
-
-		/* sanity check */
-		if (buf->l < alen)
-			return ISAKMP_INTERNAL_ERROR;
-
-		/* get subnet mask length */
-		plen = 0;
-		max = alen <<3;
-
-		p = (unsigned char *) buf->v
-			+ sizeof(struct ipsecdoi_id_b)
-			+ alen;
-
-		for (; *p == 0xff; p++) {
-			plen += 8;
-			if (plen >= max)
-				break;
-		}
-
-		if (plen < max) {
-			u_int l = 0;
-			u_char b = ~(*p);
-
-			while (b) {
-				b >>= 1;
-				l++;
-			}
-
-			l = 8 - l;
-			plen += l;
-		}
-	    }
-		break;
-	}
-
-	*prefixlen = plen;
-	*ul_proto = id_b->proto_id == 0
-				? IPSEC_ULPROTO_ANY
-				: id_b->proto_id;	/* see sockaddr2id() */
-
-	return 0;
-}
-
-/*
- * make printable string from ID payload except of general header.
- */
-char *
-ipsecdoi_id2str(id)
-	const vchar_t *id;
-{
-#define BUFLEN 512
-	char * ret = NULL;
-	int len = 0;
-	char *dat;
-	static char buf[BUFLEN];
-	struct ipsecdoi_id_b *id_b = (struct ipsecdoi_id_b *)id->v;
-	struct sockaddr_storage saddr_storage;
-	struct sockaddr        *saddr;
-	struct sockaddr_in     *saddr_in;
-	struct sockaddr_in6    *saddr_in6;
-	u_int plen = 0;
-
-	saddr     = (struct sockaddr *)&saddr_storage;
-	saddr_in  = (struct sockaddr_in *)&saddr_storage;
-	saddr_in6 = (struct sockaddr_in6 *)&saddr_storage;
-
-	
-	switch (id_b->type) {
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV4_ADDR_RANGE:
-
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in);
-#endif
-		saddr->sa_family = AF_INET;
-
-		saddr_in->sin_port = IPSEC_PORT_ANY;
-		memcpy(&saddr_in->sin_addr,
-			id->v + sizeof(*id_b), sizeof(struct in_addr));
-		break;
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV6_ADDR_RANGE:
-
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in6);
-#endif
-		saddr->sa_family = AF_INET6;
-
-		saddr_in6->sin6_port = IPSEC_PORT_ANY;
-		memcpy(&saddr_in6->sin6_addr,
-			id->v + sizeof(*id_b), sizeof(struct in6_addr));
-		saddr_in6->sin6_scope_id =
-			(IN6_IS_ADDR_LINKLOCAL(&saddr_in6->sin6_addr)
-				? ((struct sockaddr_in6 *)id_b)->sin6_scope_id
-				: 0);
-		break;
-#endif
-	}
-
-	switch (id_b->type) {
-	case IPSECDOI_ID_IPV4_ADDR:
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR:
-#endif
-		len = snprintf( buf, BUFLEN, "%s", saddrwop2str(saddr));
-		break;
-
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-#endif
-	    {
-		u_char *p;
-		u_int max;
-		int alen = sizeof(struct in_addr);
-
-		switch (id_b->type) {
-		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-			alen = sizeof(struct in_addr);
-			break;
-#ifdef INET6
-		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-			alen = sizeof(struct in6_addr);
-			break;
-#endif
-		}
-
-		/* sanity check */
-		if (id->l < alen) {
-			len = 0;
-			break;
-		}
-
-		/* get subnet mask length */
-		plen = 0;
-		max = alen <<3;
-
-		p = (unsigned char *) id->v
-			+ sizeof(struct ipsecdoi_id_b)
-			+ alen;
-
-		for (; *p == 0xff; p++) {
-			plen += 8;
-			if (plen >= max)
-				break;
-		}
-
-		if (plen < max) {
-			u_int l = 0;
-			u_char b = ~(*p);
-
-			while (b) {
-				b >>= 1;
-				l++;
-			}
-
-			l = 8 - l;
-			plen += l;
-		}
-
-		len = snprintf( buf, BUFLEN, "%s/%i", saddrwop2str(saddr), plen);
-	    }
-		break;
-
-	case IPSECDOI_ID_IPV4_ADDR_RANGE:
-
-		len = snprintf( buf, BUFLEN, "%s-", saddrwop2str(saddr));
-
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in);
-#endif
-		saddr->sa_family = AF_INET;
-		saddr_in->sin_port = IPSEC_PORT_ANY;
-		memcpy(&saddr_in->sin_addr,
-			id->v + sizeof(*id_b) + sizeof(struct in_addr),
-			sizeof(struct in_addr));
-
-		len += snprintf( buf + len, BUFLEN - len, "%s", saddrwop2str(saddr));
-
-		break;
-
-#ifdef INET6
-	case IPSECDOI_ID_IPV6_ADDR_RANGE:
-
-		len = snprintf( buf, BUFLEN, "%s-", saddrwop2str(saddr));
-
-#ifndef __linux__
-		saddr->sa_len = sizeof(struct sockaddr_in6);
-#endif
-		saddr->sa_family = AF_INET6;
-		saddr_in6->sin6_port = IPSEC_PORT_ANY;
-		memcpy(&saddr_in6->sin6_addr,
-			id->v + sizeof(*id_b) + sizeof(struct in6_addr),
-			sizeof(struct in6_addr));
-		saddr_in6->sin6_scope_id =
-			(IN6_IS_ADDR_LINKLOCAL(&saddr_in6->sin6_addr)
-				? ((struct sockaddr_in6 *)id_b)->sin6_scope_id
-				: 0);
-
-		len += snprintf( buf + len, BUFLEN - len, "%s", saddrwop2str(saddr));
-
-		break;
-#endif
-
-	case IPSECDOI_ID_FQDN:
-	case IPSECDOI_ID_USER_FQDN:
-		len = id->l - sizeof(*id_b);
-		if (len > BUFLEN)
-			len = BUFLEN;
-		memcpy(buf, id->v + sizeof(*id_b), len);
-		break;
-
-	case IPSECDOI_ID_DER_ASN1_DN:
-	case IPSECDOI_ID_DER_ASN1_GN:
-	{
-		X509_NAME *xn = NULL;
-
-		dat = id->v + sizeof(*id_b);
-		len = id->l - sizeof(*id_b);
-
-		if (d2i_X509_NAME(&xn, (void*) &dat, len) != NULL) {
-			BIO *bio = BIO_new(BIO_s_mem());
-			X509_NAME_print_ex(bio, xn, 0, 0);
-			len = BIO_get_mem_data(bio, &dat);
-			if (len > BUFLEN)
-				len = BUFLEN;
-			memcpy(buf,dat,len);
-			BIO_free(bio);
-			X509_NAME_free(xn);
-		} else {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"unable to extract asn1dn from id\n");
-
-			len = sprintf(buf, "<ASN1-DN>");
-		}
-
-		break;
-	}
-
-	/* currently unhandled id types */
-	case IPSECDOI_ID_KEY_ID:
-		len = sprintf( buf, "<KEY-ID>");
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unknown ID type %d\n", id_b->type);
-	}
-
-	if (!len)
-		len = sprintf( buf, "<?>");
-
-	ret = racoon_malloc(len+1);
-	if (ret != NULL) {
-		memcpy(ret,buf,len);
-		ret[len]=0;
-	}
-
-	return ret;
-}
-
-/*
- * set IPsec data attributes into a proposal.
- * NOTE: MUST called per a transform.
- */
-int
-ipsecdoi_t2satrns(t, pp, pr, tr)
-	struct isakmp_pl_t *t;
-	struct saprop *pp;
-	struct saproto *pr;
-	struct satrns *tr;
-{
-	struct isakmp_data *d, *prev;
-	int flag, type;
-	int error = -1;
-	int life_t;
-	int tlen;
-
-	tr->trns_no = t->t_no;
-	tr->trns_id = t->t_id;
-
-	tlen = ntohs(t->h.len) - sizeof(*t);
-	prev = (struct isakmp_data *)NULL;
-	d = (struct isakmp_data *)(t + 1);
-
-	/* default */
-	life_t = IPSECDOI_ATTR_SA_LD_TYPE_DEFAULT;
-	pp->lifetime = IPSECDOI_ATTR_SA_LD_SEC_DEFAULT;
-	pp->lifebyte = 0;
-	tr->authtype = IPSECDOI_ATTR_AUTH_NONE;
-
-	while (tlen > 0) {
-
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"type=%s, flag=0x%04x, lorv=%s\n",
-			s_ipsecdoi_attr(type), flag,
-			s_ipsecdoi_attr_v(type, ntohs(d->lorv)));
-
-		switch (type) {
-		case IPSECDOI_ATTR_SA_LD_TYPE:
-		{
-			int type = ntohs(d->lorv);
-			switch (type) {
-			case IPSECDOI_ATTR_SA_LD_TYPE_SEC:
-			case IPSECDOI_ATTR_SA_LD_TYPE_KB:
-				life_t = type;
-				break;
-			default:
-				plog(LLV_WARNING, LOCATION, NULL,
-					"invalid life duration type. "
-					"use default\n");
-				life_t = IPSECDOI_ATTR_SA_LD_TYPE_DEFAULT;
-				break;
-			}
-			break;
-		}
-		case IPSECDOI_ATTR_SA_LD:
-			if (prev == NULL
-			 || (ntohs(prev->type) & ~ISAKMP_GEN_MASK) !=
-					IPSECDOI_ATTR_SA_LD_TYPE) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "life duration must follow ltype\n");
-				break;
-			}
-
-		    {
-			u_int32_t t;
-			vchar_t *ld_buf = NULL;
-
-			if (flag) {
-				/* i.e. ISAKMP_GEN_TV */
-				ld_buf = vmalloc(sizeof(d->lorv));
-				if (ld_buf == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "failed to get LD buffer.\n");
-					goto end;
-				}
-				memcpy(ld_buf->v, &d->lorv, sizeof(d->lorv));
-			} else {
-				int len = ntohs(d->lorv);
-				/* i.e. ISAKMP_GEN_TLV */
-				ld_buf = vmalloc(len);
-				if (ld_buf == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-					    "failed to get LD buffer.\n");
-					goto end;
-				}
-				memcpy(ld_buf->v, d + 1, len);
-			}
-			switch (life_t) {
-			case IPSECDOI_ATTR_SA_LD_TYPE_SEC:
-				t = ipsecdoi_set_ld(ld_buf);
-				vfree(ld_buf);
-				if (t == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid life duration.\n");
-					goto end;
-				}
-				/* lifetime must be equal in a proposal. */
-				if (pp->lifetime == IPSECDOI_ATTR_SA_LD_SEC_DEFAULT)
-					pp->lifetime = t;
-				else if (pp->lifetime != t) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"lifetime mismatched "
-						"in a proposal, "
-						"prev:%ld curr:%u.\n",
-						(long)pp->lifetime, t);
-					goto end;
-				}
-				break;
-			case IPSECDOI_ATTR_SA_LD_TYPE_KB:
-				t = ipsecdoi_set_ld(ld_buf);
-				vfree(ld_buf);
-				if (t == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"invalid life duration.\n");
-					goto end;
-				}
-				/* lifebyte must be equal in a proposal. */
-				if (pp->lifebyte == 0)
-					pp->lifebyte = t;
-				else if (pp->lifebyte != t) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"lifebyte mismatched "
-						"in a proposal, "
-						"prev:%d curr:%u.\n",
-						pp->lifebyte, t);
-					goto end;
-				}
-				break;
-			default:
-				vfree(ld_buf);
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid life type: %d\n", life_t);
-				goto end;
-			}
-		    }
-			break;
-
-		case IPSECDOI_ATTR_GRP_DESC:
-			/*
-			 * RFC2407: 4.5 IPSEC Security Association Attributes
-			 *   Specifies the Oakley Group to be used in a PFS QM
-			 *   negotiation.  For a list of supported values, see
-			 *   Appendix A of [IKE].
-			 */
-			if (pp->pfs_group == 0)
-				pp->pfs_group = (u_int16_t)ntohs(d->lorv);
-			else if (pp->pfs_group != (u_int16_t)ntohs(d->lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"pfs_group mismatched "
-					"in a proposal.\n");
-				goto end;
-			}
-			break;
-
-		case IPSECDOI_ATTR_ENC_MODE:
-			if (pr->encmode &&
-			    pr->encmode != (u_int16_t)ntohs(d->lorv)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"multiple encmode exist "
-					"in a transform.\n");
-				goto end;
-			}
-			pr->encmode = (u_int16_t)ntohs(d->lorv);
-			break;
-
-		case IPSECDOI_ATTR_AUTH:
-			if (tr->authtype != IPSECDOI_ATTR_AUTH_NONE) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"multiple authtype exist "
-					"in a transform.\n");
-				goto end;
-			}
-			tr->authtype = (u_int16_t)ntohs(d->lorv);
-			break;
-
-		case IPSECDOI_ATTR_KEY_LENGTH:
-			if (pr->proto_id != IPSECDOI_PROTO_IPSEC_ESP) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"key length defined but not ESP");
-				goto end;
-			}
-			tr->encklen = ntohs(d->lorv);
-			break;
-#ifdef HAVE_SECCTX
-		case IPSECDOI_ATTR_SECCTX:
-		{
-			int len = ntohs(d->lorv);
-			memcpy(&pp->sctx, d + 1, len);
-			pp->sctx.ctx_strlen = ntohs(pp->sctx.ctx_strlen);
-			break;
-		}
-#endif /* HAVE_SECCTX */
-		case IPSECDOI_ATTR_KEY_ROUNDS:
-		case IPSECDOI_ATTR_COMP_DICT_SIZE:
-		case IPSECDOI_ATTR_COMP_PRIVALG:
-		default:
-			break;
-		}
-
-		prev = d;
-		if (flag) {
-			tlen -= sizeof(*d);
-			d = (struct isakmp_data *)((char *)d + sizeof(*d));
-		} else {
-			tlen -= (sizeof(*d) + ntohs(d->lorv));
-			d = (struct isakmp_data *)((caddr_t)d + sizeof(*d) + ntohs(d->lorv));
-		}
-	}
-
-	error = 0;
-end:
-	return error;
-}
-
-int
-ipsecdoi_authalg2trnsid(alg)
-	int alg;
-{
-	switch (alg) {
-        case IPSECDOI_ATTR_AUTH_HMAC_MD5:
-		return IPSECDOI_AH_MD5;
-        case IPSECDOI_ATTR_AUTH_HMAC_SHA1:
-		return IPSECDOI_AH_SHA;
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256:
-		return IPSECDOI_AH_SHA256;
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384:
-		return IPSECDOI_AH_SHA384;
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512:
-		return IPSECDOI_AH_SHA512;
-        case IPSECDOI_ATTR_AUTH_DES_MAC:
-		return IPSECDOI_AH_DES;
-	case IPSECDOI_ATTR_AUTH_KPDK:
-		return IPSECDOI_AH_MD5;	/* XXX */
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid authentication algorithm:%d\n", alg);
-	}
-	return -1;
-}
-
-#ifdef HAVE_GSSAPI
-struct isakmpsa *
-fixup_initiator_sa(match, received)
-	struct isakmpsa *match, *received;
-{
-	if (received->gssid != NULL)
-		match->gssid = vdup(received->gssid);
-
-	return match;
-}
-#endif
-
-static int rm_idtype2doi[] = {
-	255,				/* IDTYPE_UNDEFINED, 0 */
-	IPSECDOI_ID_FQDN,		/* IDTYPE_FQDN, 1 */
-	IPSECDOI_ID_USER_FQDN,		/* IDTYPE_USERFQDN, 2 */
-	IPSECDOI_ID_KEY_ID,		/* IDTYPE_KEYID, 3 */
-	255,    /*			   IDTYPE_ADDRESS, 4 
-		 * it expands into 4 types by another function. */
-	IPSECDOI_ID_DER_ASN1_DN,	/* IDTYPE_ASN1DN, 5 */
-};
-
-/*
- * convert idtype to DOI value.
- * OUT	255  : NG
- *	other: converted.
- */
-int
-idtype2doi(idtype)
-	int idtype;
-{
-	if (ARRAYLEN(rm_idtype2doi) > idtype)
-		return rm_idtype2doi[idtype];
-	return 255;
-}
-
-int
-doi2idtype(doi)
-	int doi;
-{
-	switch(doi) {
-	case IPSECDOI_ID_FQDN:
-		return(IDTYPE_FQDN);
-	case IPSECDOI_ID_USER_FQDN:
-		return(IDTYPE_USERFQDN);
-	case IPSECDOI_ID_KEY_ID:
-		return(IDTYPE_KEYID);
-	case IPSECDOI_ID_DER_ASN1_DN:
-		return(IDTYPE_ASN1DN);
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV6_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-		return(IDTYPE_ADDRESS);
-	default:
-		plog(LLV_WARNING, LOCATION, NULL,
-			"Inproper idtype:%s in this function.\n",
-			s_ipsecdoi_ident(doi));
-		return(IDTYPE_ADDRESS);	/* XXX */
-	}
-	/*NOTREACHED*/
-}
-
-#ifdef ENABLE_HYBRID
-static int
-switch_authmethod(authmethod)
-	int authmethod;
-{
-	switch(authmethod) {
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I;
-		break;
-	/* Those are not implemented */
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-		authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I;
-		break;
-	default:
-		break;
-	}
-
-	return authmethod;
-}
-#endif
diff --git a/src/racoon/ipsec_doi.h b/src/racoon/ipsec_doi.h
deleted file mode 100644
index 21dd93d..0000000
--- a/src/racoon/ipsec_doi.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*	$NetBSD: ipsec_doi.h,v 1.9 2006/12/09 05:52:57 manu Exp $	*/
-
-/* Id: ipsec_doi.h,v 1.15 2006/08/11 16:06:30 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _IPSEC_DOI_H
-#define _IPSEC_DOI_H
-
-/* refered to RFC2407 */
-
-#define IPSEC_DOI 1
-
-/* 4.2 IPSEC Situation Definition */
-#define IPSECDOI_SIT_IDENTITY_ONLY           0x00000001
-#define IPSECDOI_SIT_SECRECY                 0x00000002
-#define IPSECDOI_SIT_INTEGRITY               0x00000004
-
-/* 4.4.1 IPSEC Security Protocol Identifiers */
-  /* 4.4.2 IPSEC ISAKMP Transform Values */
-#define IPSECDOI_PROTO_ISAKMP                        1
-#define   IPSECDOI_KEY_IKE                             1
-
-/* 4.4.1 IPSEC Security Protocol Identifiers */
-#define IPSECDOI_PROTO_IPSEC_AH                      2
-  /* 4.4.3 IPSEC AH Transform Values */
-#define   IPSECDOI_AH_MD5                              2
-#define   IPSECDOI_AH_SHA                              3
-#define   IPSECDOI_AH_DES                              4
-#define   IPSECDOI_AH_SHA256                           5
-#define   IPSECDOI_AH_SHA384                           6
-#define   IPSECDOI_AH_SHA512                           7
-
-/* 4.4.1 IPSEC Security Protocol Identifiers */
-#define IPSECDOI_PROTO_IPSEC_ESP                     3
-  /* 4.4.4 IPSEC ESP Transform Identifiers */
-#define   IPSECDOI_ESP_DES_IV64				1
-#define   IPSECDOI_ESP_DES				2
-#define   IPSECDOI_ESP_3DES				3
-#define   IPSECDOI_ESP_RC5				4
-#define   IPSECDOI_ESP_IDEA				5
-#define   IPSECDOI_ESP_CAST				6
-#define   IPSECDOI_ESP_BLOWFISH				7
-#define   IPSECDOI_ESP_3IDEA				8
-#define   IPSECDOI_ESP_DES_IV32				9
-#define   IPSECDOI_ESP_RC4				10
-#define   IPSECDOI_ESP_NULL				11
-#define   IPSECDOI_ESP_AES				12
-#define   IPSECDOI_ESP_CAMELLIA				22
-#if 1
-  /* draft-ietf-ipsec-ciph-aes-cbc-00.txt */
-#define   IPSECDOI_ESP_TWOFISH				253
-#else
-  /* SSH uses these value for now */
-#define   IPSECDOI_ESP_TWOFISH				250
-#endif
-
-/* 4.4.1 IPSEC Security Protocol Identifiers */
-#define IPSECDOI_PROTO_IPCOMP                        4
-  /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
-#define   IPSECDOI_IPCOMP_OUI				1
-#define   IPSECDOI_IPCOMP_DEFLATE			2
-#define   IPSECDOI_IPCOMP_LZS				3
-
-/* 4.5 IPSEC Security Association Attributes */
-/* NOTE: default value is not included in a packet. */
-#define IPSECDOI_ATTR_SA_LD_TYPE              1 /* B */
-#define   IPSECDOI_ATTR_SA_LD_TYPE_DEFAULT      1
-#define   IPSECDOI_ATTR_SA_LD_TYPE_SEC          1
-#define   IPSECDOI_ATTR_SA_LD_TYPE_KB           2
-#define   IPSECDOI_ATTR_SA_LD_TYPE_MAX          3
-#define IPSECDOI_ATTR_SA_LD                   2 /* V */
-#define   IPSECDOI_ATTR_SA_LD_SEC_DEFAULT      28800 /* 8 hours */
-#define   IPSECDOI_ATTR_SA_LD_KB_MAX  (~(1 << ((sizeof(int) << 3) - 1)))
-#define IPSECDOI_ATTR_GRP_DESC                3 /* B */
-#define IPSECDOI_ATTR_ENC_MODE                4 /* B */
-	/* default value: host dependent */
-#define   IPSECDOI_ATTR_ENC_MODE_ANY            0	/* NOTE:internal use */
-#define   IPSECDOI_ATTR_ENC_MODE_TUNNEL         1
-#define   IPSECDOI_ATTR_ENC_MODE_TRNS           2
-
-/* NAT-T draft-ietf-ipsec-nat-t-ike-05 and later */
-#define   IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC	3
-#define   IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC	4
-
-/* NAT-T up to draft-ietf-ipsec-nat-t-ike-04 */
-#define   IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT	61443
-#define   IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT		61444
-
-#define IPSECDOI_ATTR_AUTH                    5 /* B */
-	/* 0 means not to use authentication. */
-#define   IPSECDOI_ATTR_AUTH_HMAC_MD5           1
-#define   IPSECDOI_ATTR_AUTH_HMAC_SHA1          2
-#define   IPSECDOI_ATTR_AUTH_DES_MAC            3
-#define   IPSECDOI_ATTR_AUTH_KPDK               4 /*RFC-1826(Key/Pad/Data/Key)*/
-#define   IPSECDOI_ATTR_AUTH_HMAC_SHA2_256      5
-#define   IPSECDOI_ATTR_AUTH_HMAC_SHA2_384      6
-#define   IPSECDOI_ATTR_AUTH_HMAC_SHA2_512      7
-#define   IPSECDOI_ATTR_AUTH_NONE               254	/* NOTE:internal use */
-	/*
-	 * When negotiating ESP without authentication, the Auth
-	 * Algorithm attribute MUST NOT be included in the proposal.
-	 * When negotiating ESP without confidentiality, the Auth
-	 * Algorithm attribute MUST be included in the proposal and
-	 * the ESP transform ID must be ESP_NULL.
-	*/
-#define IPSECDOI_ATTR_KEY_LENGTH              6 /* B */
-#define IPSECDOI_ATTR_KEY_ROUNDS              7 /* B */
-#define IPSECDOI_ATTR_COMP_DICT_SIZE          8 /* B */
-#define IPSECDOI_ATTR_COMP_PRIVALG            9 /* V */
-
-#ifdef HAVE_SECCTX
-#define IPSECDOI_ATTR_SECCTX		     10 /* V */
-#endif
-
-/* 4.6.1 Security Association Payload */
-struct ipsecdoi_pl_sa {
-	struct isakmp_gen h;
-	struct ipsecdoi_sa_b {
-		u_int32_t doi; /* Domain of Interpretation */
-		u_int32_t sit; /* Situation */
-	} b;
-	/* followed by Leveled Domain Identifier and so on. */
-} __attribute__((__packed__));
-
-struct ipsecdoi_secrecy_h {
-	u_int16_t len;
-	u_int16_t reserved;
-	/* followed by the value */
-} __attribute__((__packed__));
-
-/* 4.6.2 Identification Payload Content */
-struct ipsecdoi_pl_id {
-	struct isakmp_gen h;
-	struct ipsecdoi_id_b {
-		u_int8_t type;		/* ID Type */
-		u_int8_t proto_id;	/* Protocol ID */
-		u_int16_t port;		/* Port */
-	} b;
-	/* followed by Identification Data */
-} __attribute__((__packed__));
-
-#define IPSECDOI_ID_IPV4_ADDR                        1
-#define IPSECDOI_ID_FQDN                             2
-#define IPSECDOI_ID_USER_FQDN                        3
-#define IPSECDOI_ID_IPV4_ADDR_SUBNET                 4
-#define IPSECDOI_ID_IPV6_ADDR                        5
-#define IPSECDOI_ID_IPV6_ADDR_SUBNET                 6
-#define IPSECDOI_ID_IPV4_ADDR_RANGE                  7
-#define IPSECDOI_ID_IPV6_ADDR_RANGE                  8
-#define IPSECDOI_ID_DER_ASN1_DN                      9
-#define IPSECDOI_ID_DER_ASN1_GN                      10
-#define IPSECDOI_ID_KEY_ID                           11
-
-/* compressing doi type, it's internal use. */
-#define IDTYPE_UNDEFINED	0
-#define IDTYPE_FQDN		1
-#define IDTYPE_USERFQDN		2
-#define IDTYPE_KEYID		3
-#define IDTYPE_ADDRESS		4
-#define IDTYPE_ASN1DN		5
-#define IDTYPE_SUBNET		6
-
-/* qualifiers for KEYID (and maybe others) */
-#define IDQUAL_UNSPEC		0
-#define IDQUAL_FILE		1
-#define IDQUAL_TAG		2
-
-/* The use for checking proposal payload. This is not exchange type. */
-#define IPSECDOI_TYPE_PH1	0
-#define IPSECDOI_TYPE_PH2	1
-
-struct isakmpsa;
-struct ipsecdoi_pl_sa;
-struct saprop;
-struct saproto;
-struct satrns;
-struct prop_pair;
-
-extern int ipsecdoi_checkph1proposal __P((vchar_t *, struct ph1handle *));
-extern int ipsecdoi_selectph2proposal __P((struct ph2handle *));
-extern int ipsecdoi_checkph2proposal __P((struct ph2handle *));
-
-extern struct prop_pair **get_proppair __P((vchar_t *, int));
-extern vchar_t *get_sabyproppair __P((struct prop_pair *, struct ph1handle *));
-extern int ipsecdoi_updatespi __P((struct ph2handle *iph2));
-extern vchar_t *get_sabysaprop __P((struct saprop *, vchar_t *));
-extern int ipsecdoi_chkcmpids( const vchar_t *, const vchar_t *, int );
-extern int ipsecdoi_checkid1 __P((struct ph1handle *));
-extern int ipsecdoi_setid1 __P((struct ph1handle *));
-extern int set_identifier __P((vchar_t **, int, vchar_t *));
-extern int set_identifier_qual __P((vchar_t **, int, vchar_t *, int));
-extern int ipsecdoi_setid2 __P((struct ph2handle *));
-extern vchar_t *ipsecdoi_sockaddr2id __P((struct sockaddr *, u_int, u_int));
-extern int ipsecdoi_id2sockaddr __P((vchar_t *, struct sockaddr *,
-	u_int8_t *, u_int16_t *));
-extern char *ipsecdoi_id2str __P((const vchar_t *));
-extern vchar_t *ipsecdoi_sockrange2id __P((	struct sockaddr *,
-	struct sockaddr *, u_int));
-
-extern vchar_t *ipsecdoi_setph1proposal __P((struct isakmpsa *));
-extern int ipsecdoi_setph2proposal __P((struct ph2handle *));
-extern int ipsecdoi_transportmode __P((struct saprop *));
-extern int ipsecdoi_get_defaultlifetime __P((void));
-extern int ipsecdoi_checkalgtypes __P((int, int, int, int));
-extern int ipproto2doi __P((int));
-extern int doi2ipproto __P((int));
-
-extern int ipsecdoi_t2satrns __P((struct isakmp_pl_t *,
-	struct saprop *, struct saproto *, struct satrns *));
-extern int ipsecdoi_authalg2trnsid __P((int));
-extern int idtype2doi __P((int));
-extern int doi2idtype __P((int));
-
-
-#endif /* _IPSEC_DOI_H */
diff --git a/src/racoon/isakmp.c b/src/racoon/isakmp.c
deleted file mode 100644
index b9fc5ee..0000000
--- a/src/racoon/isakmp.c
+++ /dev/null
@@ -1,3643 +0,0 @@
-/*	$NetBSD: isakmp.c,v 1.20.6.13 2008/09/25 09:34:39 vanhu Exp $	*/
-
-/* Id: isakmp.c,v 1.74 2006/05/07 21:32:59 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <ctype.h>
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "remoteconf.h"
-#include "localconf.h"
-#include "grabmyaddr.h"
-#include "admin.h"
-#include "privsep.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "oakley.h"
-#include "evt.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "pfkey.h"
-#include "crypto_openssl.h"
-#include "policy.h"
-#include "isakmp_ident.h"
-#include "isakmp_agg.h"
-#include "isakmp_base.h"
-#include "isakmp_quick.h"
-#include "isakmp_inf.h"
-#include "isakmp_newg.h"
-#ifdef ENABLE_HYBRID
-#include "vendorid.h"
-#include "isakmp_xauth.h"
-#include "isakmp_unity.h"
-#include "isakmp_cfg.h"
-#endif
-#ifdef ENABLE_FRAG
-#include "isakmp_frag.h"
-#endif
-#include "strnames.h"
-
-#include <fcntl.h>
-
-#ifdef ENABLE_NATT
-# include "nattraversal.h"
-#endif
-# ifdef __linux__
-#  include <linux/udp.h>
-#  include <linux/ip.h>
-#  ifndef SOL_UDP
-#   define SOL_UDP 17
-#  endif
-#if defined(__ANDROID__)
-#include <netinet/udp.h>
-#endif
-# endif /* __linux__ */
-# if defined(__NetBSD__) || defined(__FreeBSD__) ||	\
-  (defined(__APPLE__) && defined(__MACH__))
-#  include <netinet/in.h>
-#  include <netinet/udp.h>
-#  include <netinet/in_systm.h>
-#  include <netinet/ip.h>
-#  define SOL_UDP IPPROTO_UDP
-# endif /* __NetBSD__ / __FreeBSD__ */
-
-#ifdef ANDROID_CHANGES
-#include "NetdClient.h"
-#endif
-
-static int nostate1 __P((struct ph1handle *, vchar_t *));
-static int nostate2 __P((struct ph2handle *, vchar_t *));
-
-extern caddr_t val2str(const char *, size_t);
-
-static int (*ph1exchange[][2][PHASE1ST_MAX])
-	__P((struct ph1handle *, vchar_t *)) = {
- /* error */
- { {}, {}, },
- /* Identity Protection exchange */
- {
-  { nostate1, ident_i1send, nostate1, ident_i2recv, ident_i2send,
-    ident_i3recv, ident_i3send, ident_i4recv, ident_i4send, nostate1, },
-  { nostate1, ident_r1recv, ident_r1send, ident_r2recv, ident_r2send,
-    ident_r3recv, ident_r3send, nostate1, nostate1, nostate1, },
- },
- /* Aggressive exchange */
- {
-  { nostate1, agg_i1send, nostate1, agg_i2recv, agg_i2send,
-    nostate1, nostate1, nostate1, nostate1, nostate1, },
-  { nostate1, agg_r1recv, agg_r1send, agg_r2recv, agg_r2send,
-    nostate1, nostate1, nostate1, nostate1, nostate1, },
- },
- /* Base exchange */
- {
-  { nostate1, base_i1send, nostate1, base_i2recv, base_i2send,
-    base_i3recv, base_i3send, nostate1, nostate1, nostate1, },
-  { nostate1, base_r1recv, base_r1send, base_r2recv, base_r2send,
-    nostate1, nostate1, nostate1, nostate1, nostate1, },
- },
-};
-
-static int (*ph2exchange[][2][PHASE2ST_MAX])
-	__P((struct ph2handle *, vchar_t *)) = {
- /* error */
- { {}, {}, },
- /* Quick mode for IKE */
- {
-  { nostate2, nostate2, quick_i1prep, nostate2, quick_i1send,
-    quick_i2recv, quick_i2send, quick_i3recv, nostate2, nostate2, },
-  { nostate2, quick_r1recv, quick_r1prep, nostate2, quick_r2send,
-    quick_r3recv, quick_r3prep, quick_r3send, nostate2, nostate2, }
- },
-};
-
-static u_char r_ck0[] = { 0,0,0,0,0,0,0,0 }; /* used to verify the r_ck. */
- 
-static int isakmp_main __P((vchar_t *, struct sockaddr *, struct sockaddr *));
-static int ph1_main __P((struct ph1handle *, vchar_t *));
-static int quick_main __P((struct ph2handle *, vchar_t *));
-static int isakmp_ph1begin_r __P((vchar_t *,
-	struct sockaddr *, struct sockaddr *, u_int8_t));
-static int isakmp_ph2begin_i __P((struct ph1handle *, struct ph2handle *));
-static int isakmp_ph2begin_r __P((struct ph1handle *, vchar_t *));
-static int etypesw1 __P((int));
-static int etypesw2 __P((int));
-#ifdef ENABLE_FRAG
-static int frag_handler(struct ph1handle *, 
-    vchar_t *, struct sockaddr *, struct sockaddr *);
-#endif
-
-/*
- * isakmp packet handler
- */
-int
-isakmp_handler(so_isakmp)
-	int so_isakmp;
-{
-	struct isakmp isakmp;
-	union {
-		char		buf[sizeof (isakmp) + 4];
-		u_int32_t	non_esp[2];
-		char		lbuf[sizeof(struct udphdr) + 
-#ifdef __linux
-				     sizeof(struct iphdr) + 
-#else
-				     sizeof(struct ip) + 
-#endif
-				     sizeof(isakmp) + 4];
-	} x;
-	struct sockaddr_storage remote;
-	struct sockaddr_storage local;
-	unsigned int remote_len = sizeof(remote);
-	unsigned int local_len = sizeof(local);
-	int len = 0, extralen = 0;
-	vchar_t *buf = NULL, *tmpbuf = NULL;
-	int error = -1, res;
-
-	/* read message by MSG_PEEK */
-	while ((len = recvfromto(so_isakmp, x.buf, sizeof(x),
-		    MSG_PEEK, (struct sockaddr *)&remote, &remote_len,
-		    (struct sockaddr *)&local, &local_len)) < 0) {
-		if (errno == EINTR)
-			continue;
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to receive isakmp packet: %s\n",
-			strerror (errno));
-		goto end;
-	}
-
-	/* keep-alive packet - ignore */
-	if (len == 1 && (x.buf[0]&0xff) == 0xff) {
-		/* Pull the keep-alive packet */
-		if ((len = recvfrom(so_isakmp, (char *)x.buf, 1,
-		    0, (struct sockaddr *)&remote, &remote_len)) != 1) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "failed to receive keep alive packet: %s\n",
-			    strerror (errno));
-		}
-		goto end;
-	}
-
-	/* Lucent IKE in UDP encapsulation */
-	{
-		struct udphdr *udp;
-#ifdef __linux__
-		struct iphdr *ip;
-
-		udp = (struct udphdr *)&x.lbuf[0];
-		if (ntohs(udp->dest) == 501) {
-			ip = (struct iphdr *)(x.lbuf + sizeof(*udp));
-			extralen += sizeof(*udp) + ip->ihl;
-		}
-#else
-		struct ip *ip;
-
-		udp = (struct udphdr *)&x.lbuf[0];
-		if (ntohs(udp->uh_dport) == 501) {
-			ip = (struct ip *)(x.lbuf + sizeof(*udp));
-			extralen += sizeof(*udp) + ip->ip_hl;
-		}
-#endif
-	}	
-
-#ifdef ENABLE_NATT
-	/* we don't know about portchange yet, 
-	   look for non-esp marker instead */
-	if (x.non_esp[0] == 0 && x.non_esp[1] != 0)
-		extralen = NON_ESP_MARKER_LEN;
-#endif
-
-	/* now we know if there is an extra non-esp 
-	   marker at the beginning or not */
-	memcpy ((char *)&isakmp, x.buf + extralen, sizeof (isakmp));
-
-	/* check isakmp header length, as well as sanity of header length */
-	if (len < sizeof(isakmp) || ntohl(isakmp.len) < sizeof(isakmp)) {
-		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
-			"packet shorter than isakmp header size (%u, %u, %zu)\n",
-			len, ntohl(isakmp.len), sizeof(isakmp));
-		/* dummy receive */
-		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
-			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to receive isakmp packet: %s\n",
-				strerror (errno));
-		}
-		goto end;
-	}
-
-	/* reject it if the size is tooooo big. */
-	if (ntohl(isakmp.len) > 0xffff) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"the length in the isakmp header is too big.\n");
-		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
-			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to receive isakmp packet: %s\n",
-				strerror (errno));
-		}
-		goto end;
-	}
-
-	/* read real message */
-	if ((tmpbuf = vmalloc(ntohl(isakmp.len) + extralen)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate reading buffer (%u Bytes)\n",
-			ntohl(isakmp.len) + extralen);
-		/* dummy receive */
-		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
-			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to receive isakmp packet: %s\n", 
-				strerror (errno));
-		}
-		goto end;
-	}
-
-	while ((len = recvfromto(so_isakmp, (char *)tmpbuf->v, tmpbuf->l,
-	                    0, (struct sockaddr *)&remote, &remote_len,
-	                    (struct sockaddr *)&local, &local_len)) < 0) {
-		if (errno == EINTR)
-			continue;
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to receive isakmp packet: %s\n",
-			strerror (errno));
-		goto end;
-	}
-
-	if ((buf = vmalloc(len - extralen)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate reading buffer (%u Bytes)\n",
-			(len - extralen));
-		goto end;
-	}
-	
-	memcpy (buf->v, tmpbuf->v + extralen, buf->l);
-
-	len -= extralen;
-	
-	if (len != buf->l) {
-		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
-			"received invalid length (%d != %zu), why ?\n",
-			len, buf->l);
-		goto end;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"%d bytes message received %s\n",
-		len, saddr2str_fromto("from %s to %s", 
-			(struct sockaddr *)&remote,
-			(struct sockaddr *)&local));
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* avoid packets with malicious port/address */
-	if (extract_port((struct sockaddr *)&remote) == 0) {
-		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
-			"src port == 0 (valid as UDP but not with IKE)\n");
-		goto end;
-	}
-
-	/* XXX: check sender whether to be allowed or not to accept */
-
-	/* XXX: I don't know how to check isakmp half connection attack. */
-
-	/* simply reply if the packet was processed. */
-	res=check_recvdpkt((struct sockaddr *)&remote,(struct sockaddr *)&local, buf);
-	if (res) {
-		plog(LLV_NOTIFY, LOCATION, NULL,
-			"the packet is retransmitted by %s (%d).\n",
-			 saddr2str((struct sockaddr *)&remote), res);
-		error = 0;
-		goto end;
-	}
-
-	/* isakmp main routine */
-	if (isakmp_main(buf, (struct sockaddr *)&remote,
-			(struct sockaddr *)&local) != 0) goto end;
-
-	error = 0;
-
-end:
-	if (tmpbuf != NULL)
-		vfree(tmpbuf);
-	if (buf != NULL)
-		vfree(buf);
-
-	return(error);
-}
-
-/*
- * main processing to handle isakmp payload
- */
-static int
-isakmp_main(msg, remote, local)
-	vchar_t *msg;
-	struct sockaddr *remote, *local;
-{
-	struct isakmp *isakmp = (struct isakmp *)msg->v;
-	isakmp_index *index = (isakmp_index *)isakmp;
-	u_int32_t msgid = isakmp->msgid;
-	struct ph1handle *iph1;
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(msg, remote, local, 0);
-#endif
-
-	/* the initiator's cookie must not be zero */
-	if (memcmp(&isakmp->i_ck, r_ck0, sizeof(cookie_t)) == 0) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"malformed cookie received.\n");
-		return -1;
-	}
-
-	/* Check the Major and Minor Version fields. */
-	/*
-	 * XXX Is is right to check version here ?
-	 * I think it may no be here because the version depends
-	 * on exchange status.
-	 */
-	if (isakmp->v < ISAKMP_VERSION_NUMBER) {
-		if (ISAKMP_GETMAJORV(isakmp->v) < ISAKMP_MAJOR_VERSION) {
-			plog(LLV_ERROR, LOCATION, remote,
-				"invalid major version %d.\n",
-				ISAKMP_GETMAJORV(isakmp->v));
-			return -1;
-		}
-#if ISAKMP_MINOR_VERSION > 0
-		if (ISAKMP_GETMINORV(isakmp->v) < ISAKMP_MINOR_VERSION) {
-			plog(LLV_ERROR, LOCATION, remote,
-				"invalid minor version %d.\n",
-				ISAKMP_GETMINORV(isakmp->v));
-			return -1;
-		}
-#endif
-	}
-
-	/* check the Flags field. */
-	/* XXX How is the exclusive check, E and A ? */
-	if (isakmp->flags & ~(ISAKMP_FLAG_E | ISAKMP_FLAG_C | ISAKMP_FLAG_A)) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"invalid flag 0x%02x.\n", isakmp->flags);
-		return -1;
-	}
-
-	/* ignore commit bit. */
-	if (ISSET(isakmp->flags, ISAKMP_FLAG_C)) {
-		if (isakmp->msgid == 0) {
-			isakmp_info_send_nx(isakmp, remote, local,
-				ISAKMP_NTYPE_INVALID_FLAGS, NULL);
-			plog(LLV_ERROR, LOCATION, remote,
-				"Commit bit on phase1 forbidden.\n");
-			return -1;
-		}
-	}
-
-	iph1 = getph1byindex(index);
-	if (iph1 != NULL) {
-		/* validity check */
-		if (memcmp(&isakmp->r_ck, r_ck0, sizeof(cookie_t)) == 0 &&
-		    iph1->side == INITIATOR) {
-			plog(LLV_DEBUG, LOCATION, remote,
-				"malformed cookie received or "
-				"the initiator's cookies collide.\n");
-			return -1;
-		}
-
-#ifdef ENABLE_NATT
-		/* Floating ports for NAT-T */
-		if (NATT_AVAILABLE(iph1) &&
-		    ! (iph1->natt_flags & NAT_PORTS_CHANGED) &&
-		    ((cmpsaddrstrict(iph1->remote, remote) != 0) ||
-		    (cmpsaddrstrict(iph1->local, local) != 0)))
-		{
-			/* prevent memory leak */
-			racoon_free(iph1->remote);
-			racoon_free(iph1->local);
-			iph1->remote = NULL;
-			iph1->local = NULL;
-
-			/* copy-in new addresses */
-			iph1->remote = dupsaddr(remote);
-			if (iph1->remote == NULL) {
-           			plog(LLV_ERROR, LOCATION, iph1->remote,
-				   "phase1 failed: dupsaddr failed.\n");
-				remph1(iph1);
-				delph1(iph1);
-				return -1;
-			}
-			iph1->local = dupsaddr(local);
-			if (iph1->local == NULL) {
-           			plog(LLV_ERROR, LOCATION, iph1->remote,
-				   "phase1 failed: dupsaddr failed.\n");
-				remph1(iph1);
-				delph1(iph1);
-				return -1;
-			}
-
-			/* set the flag to prevent further port floating
-			   (FIXME: should we allow it? E.g. when the NAT gw 
-			    is rebooted?) */
-			iph1->natt_flags |= NAT_PORTS_CHANGED | NAT_ADD_NON_ESP_MARKER;
-			
-			/* print some neat info */
-			plog (LLV_INFO, LOCATION, NULL, 
-			      "NAT-T: ports changed to: %s\n",
-			      saddr2str_fromto ("%s<->%s", iph1->remote, iph1->local));
-
-			natt_keepalive_add_ph1 (iph1);
-		}
-#endif
-
-		/* must be same addresses in one stream of a phase at least. */
-		if (cmpsaddrstrict(iph1->remote, remote) != 0) {
-			char *saddr_db, *saddr_act;
-
-			saddr_db = racoon_strdup(saddr2str(iph1->remote));
-			saddr_act = racoon_strdup(saddr2str(remote));
-			STRDUP_FATAL(saddr_db);
-			STRDUP_FATAL(saddr_act);
-
-			plog(LLV_WARNING, LOCATION, remote,
-				"remote address mismatched. db=%s, act=%s\n",
-				saddr_db, saddr_act);
-
-			racoon_free(saddr_db);
-			racoon_free(saddr_act);
-		}
-
-		/*
-		 * don't check of exchange type here because other type will be
-		 * with same index, for example, informational exchange.
-		 */
-
-		/* XXX more acceptable check */
-	}
-
-	switch (isakmp->etype) {
-	case ISAKMP_ETYPE_IDENT:
-	case ISAKMP_ETYPE_AGG:
-	case ISAKMP_ETYPE_BASE:
-		/* phase 1 validity check */
-		if (isakmp->msgid != 0) {
-			plog(LLV_ERROR, LOCATION, remote,
-				"message id should be zero in phase1.\n");
-			return -1;
-		}
-
-		/* search for isakmp status record of phase 1 */
-		if (iph1 == NULL) {
-			/*
-			 * the packet must be the 1st message from a initiator
-			 * or the 2nd message from the responder.
-			 */
-
-			/* search for phase1 handle by index without r_ck */
-			iph1 = getph1byindex0(index);
-			if (iph1 == NULL) {
-				/*it must be the 1st message from a initiator.*/
-				if (memcmp(&isakmp->r_ck, r_ck0,
-					sizeof(cookie_t)) != 0) {
-
-					plog(LLV_DEBUG, LOCATION, remote,
-						"malformed cookie received "
-						"or the spi expired.\n");
-					return -1;
-				}
-
-				/* it must be responder's 1st exchange. */
-				if (isakmp_ph1begin_r(msg, remote, local,
-					isakmp->etype) < 0)
-					return -1;
-				break;
-
-				/*NOTREACHED*/
-			}
-
-			/* it must be the 2nd message from the responder. */
-			if (iph1->side != INITIATOR) {
-				plog(LLV_DEBUG, LOCATION, remote,
-					"malformed cookie received. "
-					"it has to be as the initiator.  %s\n",
-					isakmp_pindex(&iph1->index, 0));
-				return -1;
-			}
-		}
-
-		/*
-		 * Don't delete phase 1 handler when the exchange type
-		 * in handler is not equal to packet's one because of no
-		 * authencication completed.
-		 */
-		if (iph1->etype != isakmp->etype) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"exchange type is mismatched: "
-				"db=%s packet=%s, ignore it.\n",
-				s_isakmp_etype(iph1->etype),
-				s_isakmp_etype(isakmp->etype));
-			return -1;
-		}
-
-#ifdef ENABLE_FRAG
-		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
-			return frag_handler(iph1, msg, remote, local);
-#endif
-
-		/* call main process of phase 1 */
-		if (ph1_main(iph1, msg) < 0) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"phase1 negotiation failed.\n");
-			remph1(iph1);
-			delph1(iph1);
-			return -1;
-		}
-		break;
-
-	case ISAKMP_ETYPE_AUTH:
-		plog(LLV_INFO, LOCATION, remote,
-			"unsupported exchange %d received.\n",
-			isakmp->etype);
-		break;
-
-	case ISAKMP_ETYPE_INFO:
-	case ISAKMP_ETYPE_ACKINFO:
-		/*
-		 * iph1 must be present for Information message.
-		 * if iph1 is null then trying to get the phase1 status
-		 * as the packet from responder againt initiator's 1st
-		 * exchange in phase 1.
-		 * NOTE: We think such informational exchange should be ignored.
-		 */
-		if (iph1 == NULL) {
-			iph1 = getph1byindex0(index);
-			if (iph1 == NULL) {
-				plog(LLV_ERROR, LOCATION, remote,
-					"unknown Informational "
-					"exchange received.\n");
-				return -1;
-			}
-			if (cmpsaddrstrict(iph1->remote, remote) != 0) {
-				plog(LLV_WARNING, LOCATION, remote,
-					"remote address mismatched. "
-					"db=%s\n",
-					saddr2str(iph1->remote));
-			}
-		}
-
-#ifdef ENABLE_FRAG
-		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
-			return frag_handler(iph1, msg, remote, local);
-#endif
-
-		if (isakmp_info_recv(iph1, msg) < 0)
-			return -1;
-		break;
-
-	case ISAKMP_ETYPE_QUICK:
-	{
-		struct ph2handle *iph2;
-
-		if (iph1 == NULL) {
-			isakmp_info_send_nx(isakmp, remote, local,
-				ISAKMP_NTYPE_INVALID_COOKIE, NULL);
-			plog(LLV_ERROR, LOCATION, remote,
-				"can't start the quick mode, "
-				"there is no ISAKMP-SA, %s\n",
-				isakmp_pindex((isakmp_index *)&isakmp->i_ck,
-					isakmp->msgid));
-			return -1;
-		}
-#ifdef ENABLE_HYBRID
-		/* Reinit the IVM if it's still there */		
-		if (iph1->mode_cfg && iph1->mode_cfg->ivm) {
-			oakley_delivm(iph1->mode_cfg->ivm);
-			iph1->mode_cfg->ivm = NULL;
-		}
-#endif
-#ifdef ENABLE_FRAG
-		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
-			return frag_handler(iph1, msg, remote, local);
-#endif
-
-		/* check status of phase 1 whether negotiated or not. */
-		if (iph1->status != PHASE1ST_ESTABLISHED) {
-			plog(LLV_ERROR, LOCATION, remote,
-				"can't start the quick mode, "
-				"there is no valid ISAKMP-SA, %s\n",
-				isakmp_pindex(&iph1->index, iph1->msgid));
-			return -1;
-		}
-
-		/* search isakmp phase 2 stauts record. */
-		iph2 = getph2bymsgid(iph1, msgid);
-		if (iph2 == NULL) {
-			/* it must be new negotiation as responder */
-			if (isakmp_ph2begin_r(iph1, msg) < 0)
-				return -1;
-			return 0;
-			/*NOTREACHED*/
-		}
-
-		/* commit bit. */
-		/* XXX
-		 * we keep to set commit bit during negotiation.
-		 * When SA is configured, bit will be reset.
-		 * XXX
-		 * don't initiate commit bit.  should be fixed in the future.
-		 */
-		if (ISSET(isakmp->flags, ISAKMP_FLAG_C))
-			iph2->flags |= ISAKMP_FLAG_C;
-
-		/* call main process of quick mode */
-		if (quick_main(iph2, msg) < 0) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"phase2 negotiation failed.\n");
-			unbindph12(iph2);
-			remph2(iph2);
-			delph2(iph2);
-			return -1;
-		}
-	}
-		break;
-
-	case ISAKMP_ETYPE_NEWGRP:
-		if (iph1 == NULL) {
-			plog(LLV_ERROR, LOCATION, remote,
-				"Unknown new group mode exchange, "
-				"there is no ISAKMP-SA.\n");
-			return -1;
-		}
-
-#ifdef ENABLE_FRAG
-		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
-			return frag_handler(iph1, msg, remote, local);
-#endif
-
-		isakmp_newgroup_r(iph1, msg);
-		break;
-
-#ifdef ENABLE_HYBRID
-	case ISAKMP_ETYPE_CFG:
-		if (iph1 == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "mode config %d from %s, "
-			     "but we have no ISAKMP-SA.\n",
-			     isakmp->etype, saddr2str(remote));
-			return -1;
-		}
-
-#ifdef ENABLE_FRAG
-		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
-			return frag_handler(iph1, msg, remote, local);
-#endif
-
-		isakmp_cfg_r(iph1, msg);
-		break;
-#endif	 
-
-	case ISAKMP_ETYPE_NONE:
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid exchange type %d from %s.\n",
-			isakmp->etype, saddr2str(remote));
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * main function of phase 1.
- */
-static int
-ph1_main(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	/* ignore a packet */
-	if (iph1->status == PHASE1ST_ESTABLISHED)
-		return 0;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-	/* receive */
-	if (ph1exchange[etypesw1(iph1->etype)]
-		       [iph1->side]
-		       [iph1->status] == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"why isn't the function defined.\n");
-		return -1;
-	}
-	error = (ph1exchange[etypesw1(iph1->etype)]
-			    [iph1->side]
-			    [iph1->status])(iph1, msg);
-	if (error != 0) {
-
-		/* XXX
-		 * When an invalid packet is received on phase1, it should
-		 * be selected to process this packet.  That is to respond
-		 * with a notify and delete phase 1 handler, OR not to respond
-		 * and keep phase 1 handler. However, in PHASE1ST_START when
-		 * acting as RESPONDER we must not keep phase 1 handler or else
-		 * it will stay forever.
-		 */
-
-		if (iph1->side == RESPONDER && iph1->status == PHASE1ST_START) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"failed to pre-process packet.\n");
-			return -1;
-		} else {
-			/* ignore the error and keep phase 1 handler */
-			return 0;
-		}
-	}
-
-#ifndef ENABLE_FRAG
-	/* free resend buffer */
-	if (iph1->sendbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no buffer found as sendbuf\n"); 
-		return -1;
-	}
-#endif
-
-	VPTRINIT(iph1->sendbuf);
-
-	/* turn off schedule */
-	SCHED_KILL(iph1->scr);
-
-	/* send */
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	if ((ph1exchange[etypesw1(iph1->etype)]
-			[iph1->side]
-			[iph1->status])(iph1, msg) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to process packet.\n");
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase1", s_isakmp_state(iph1->etype, iph1->side, iph1->status),
-		timedelta(&start, &end));
-#endif
-	if (iph1->status == PHASE1ST_ESTABLISHED) {
-
-#ifdef ENABLE_STATS
-		gettimeofday(&iph1->end, NULL);
-		syslog(LOG_NOTICE, "%s(%s): %8.6f",
-			"phase1", s_isakmp_etype(iph1->etype),
-			timedelta(&iph1->start, &iph1->end));
-#endif
-
-		/* save created date. */
-		(void)time(&iph1->created);
-
-		/* add to the schedule to expire, and seve back pointer. */
-		iph1->sce = sched_new(iph1->approval->lifetime,
-		    isakmp_ph1expire_stub, iph1);
-#ifdef ENABLE_HYBRID
-		if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
-			switch(AUTHMETHOD(iph1)) {
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-				xauth_sendreq(iph1);
-				/* XXX Don't process INITIAL_CONTACT */
-				iph1->rmconf->ini_contact = 0;
-				break;
-			default:
-				break;
-			}
-		}
-#endif
-#ifdef ENABLE_DPD
-		/* Schedule the r_u_there.... */
-		if(iph1->dpd_support && iph1->rmconf->dpd_interval)
-			isakmp_sched_r_u(iph1, 0);
-#endif
-
-		/* INITIAL-CONTACT processing */
-		/* don't anything if local test mode. */
-		if (!f_local
-		 && iph1->rmconf->ini_contact && !getcontacted(iph1->remote)) {
-			/* send INITIAL-CONTACT */
-			isakmp_info_send_n1(iph1,
-					ISAKMP_NTYPE_INITIAL_CONTACT, NULL);
-			/* insert a node into contacted list. */
-			if (inscontacted(iph1->remote) == -1) {
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-					"failed to add contacted list.\n");
-				/* ignore */
-			}
-		}
-
-		log_ph1established(iph1);
-		plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-
-		/* 
-		 * SA up shell script hook: do it now,except if
-		 * ISAKMP mode config was requested. In the later
-		 * case it is done when we receive the configuration.
-		 */
-		if ((iph1->status == PHASE1ST_ESTABLISHED) &&
-		    !iph1->rmconf->mode_cfg) { 
-			switch (AUTHMETHOD(iph1)) {
-#ifdef ENABLE_HYBRID
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-			/* Unimplemeted... */
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-				break;
-#endif
-			default:
-				script_hook(iph1, SCRIPT_PHASE1_UP);
-				break;
-			}
-		}
-	}
-
-	return 0;
-}
-
-/*
- * main function of quick mode.
- */
-static int
-quick_main(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg;
-{
-	struct isakmp *isakmp = (struct isakmp *)msg->v;
-	int error;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	/* ignore a packet */
-	if (iph2->status == PHASE2ST_ESTABLISHED
-	 || iph2->status == PHASE2ST_GETSPISENT)
-		return 0;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	/* receive */
-	if (ph2exchange[etypesw2(isakmp->etype)]
-		       [iph2->side]
-		       [iph2->status] == NULL) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"why isn't the function defined.\n");
-		return -1;
-	}
-	error = (ph2exchange[etypesw2(isakmp->etype)]
-			    [iph2->side]
-			    [iph2->status])(iph2, msg);
-	if (error != 0) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"failed to pre-process packet.\n");
-		if (error == ISAKMP_INTERNAL_ERROR)
-			return 0;
-		isakmp_info_send_n1(iph2->ph1, error, NULL);
-		return -1;
-	}
-
-	/* when using commit bit, status will be reached here. */
-	if (iph2->status == PHASE2ST_ADDSA)
-		return 0;
-
-	/* free resend buffer */
-	if (iph2->sendbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no buffer found as sendbuf\n"); 
-		return -1;
-	}
-	VPTRINIT(iph2->sendbuf);
-
-	/* turn off schedule */
-	SCHED_KILL(iph2->scr);
-
-	/* send */
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	if ((ph2exchange[etypesw2(isakmp->etype)]
-			[iph2->side]
-			[iph2->status])(iph2, msg) != 0) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"failed to process packet.\n");
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase2",
-		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-}
-
-/* new negotiation of phase 1 for initiator */
-int
-isakmp_ph1begin_i(rmconf, remote, local)
-	struct remoteconf *rmconf;
-	struct sockaddr *remote, *local;
-{
-	struct ph1handle *iph1;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	/* get new entry to isakmp status table. */
-	iph1 = newph1();
-	if (iph1 == NULL)
-		return -1;
-
-	iph1->status = PHASE1ST_START;
-	iph1->rmconf = rmconf;
-	iph1->side = INITIATOR;
-	iph1->version = ISAKMP_VERSION_NUMBER;
-	iph1->msgid = 0;
-	iph1->flags = 0;
-	iph1->ph2cnt = 0;
-#ifdef HAVE_GSSAPI
-	iph1->gssapi_state = NULL;
-#endif
-#ifdef ENABLE_HYBRID
-	if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
-		delph1(iph1);
-		return -1;
-	}
-#endif
-#ifdef ENABLE_FRAG
-
-	if(rmconf->ike_frag == ISAKMP_FRAG_FORCE)
-		iph1->frag = 1;
-	else
-		iph1->frag = 0;
-	iph1->frag_chain = NULL;
-#endif
-	iph1->approval = NULL;
-
-	/* XXX copy remote address */
-	if (copy_ph1addresses(iph1, rmconf, remote, local) < 0) {
-		delph1(iph1);
-		return -1;
-	}
-
-	(void)insph1(iph1);
-
-	/* start phase 1 exchange */
-	iph1->etype = rmconf->etypes->type;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-    {
-	char *a;
-
-	a = racoon_strdup(saddr2str(iph1->local));
-	STRDUP_FATAL(a);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"initiate new phase 1 negotiation: %s<=>%s\n",
-		a, saddr2str(iph1->remote));
-	racoon_free(a);
-    }
-	plog(LLV_INFO, LOCATION, NULL,
-		"begin %s mode.\n",
-		s_isakmp_etype(iph1->etype));
-
-#ifdef ENABLE_STATS
-	gettimeofday(&iph1->start, NULL);
-	gettimeofday(&start, NULL);
-#endif
-	/* start exchange */
-	if ((ph1exchange[etypesw1(iph1->etype)]
-			[iph1->side]
-			[iph1->status])(iph1, NULL) != 0) {
-		/* failed to start phase 1 negotiation */
-		remph1(iph1);
-		delph1(iph1);
-
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase1",
-		s_isakmp_state(iph1->etype, iph1->side, iph1->status),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-}
-
-/* new negotiation of phase 1 for responder */
-static int
-isakmp_ph1begin_r(vchar_t *msg, struct sockaddr *remote,
-                  struct sockaddr *local, u_int8_t etype)
-{
-	struct isakmp *isakmp = (struct isakmp *)msg->v;
-	struct remoteconf *rmconf;
-	struct ph1handle *iph1;
-	struct etypes *etypeok;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	/* look for my configuration */
-	rmconf = getrmconf(remote);
-	if (rmconf == NULL) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"couldn't find "
-			"configuration.\n");
-		return -1;
-	}
-
-	/* check to be acceptable exchange type */
-	etypeok = check_etypeok(rmconf, etype);
-	if (etypeok == NULL) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"not acceptable %s mode\n", s_isakmp_etype(etype));
-		return -1;
-	}
-
-	/* get new entry to isakmp status table. */
-	iph1 = newph1();
-	if (iph1 == NULL)
-		return -1;
-
-	memcpy(&iph1->index.i_ck, &isakmp->i_ck, sizeof(iph1->index.i_ck));
-	iph1->status = PHASE1ST_START;
-	iph1->rmconf = rmconf;
-	iph1->flags = 0;
-	iph1->side = RESPONDER;
-	iph1->etype = etypeok->type;
-	iph1->version = isakmp->v;
-	iph1->msgid = 0;
-#ifdef HAVE_GSSAPI
-	iph1->gssapi_state = NULL;
-#endif
-#ifdef ENABLE_HYBRID
-	if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
-		delph1(iph1);
-		return -1;
-	}
-#endif
-#ifdef ENABLE_FRAG
-	iph1->frag = 0;
-	iph1->frag_chain = NULL;
-#endif
-	iph1->approval = NULL;
-
-#ifdef ENABLE_NATT
-	/* RFC3947 says that we MUST accept new phases1 on NAT-T floated port.
-	 * We have to setup this flag now to correctly generate the first reply.
-	 * Don't know if a better check could be done for that ?
-	 */
-	if(extract_port(local) == lcconf->port_isakmp_natt)
-		iph1->natt_flags |= (NAT_PORTS_CHANGED);
-#endif
-
-	/* copy remote address */
-	if (copy_ph1addresses(iph1, rmconf, remote, local) < 0) {
-		delph1(iph1);
-		return -1;
-	}
-	(void)insph1(iph1);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-    {
-	char *a;
-
-	a = racoon_strdup(saddr2str(iph1->local));
-	STRDUP_FATAL(a);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"respond new phase 1 negotiation: %s<=>%s\n",
-		a, saddr2str(iph1->remote));
-	racoon_free(a);
-    }
-	plog(LLV_INFO, LOCATION, NULL,
-		"begin %s mode.\n", s_isakmp_etype(etype));
-
-#ifdef ENABLE_STATS
-	gettimeofday(&iph1->start, NULL);
-	gettimeofday(&start, NULL);
-#endif
-
-#ifndef ENABLE_FRAG
-
-	/* start exchange */
-	if ((ph1exchange[etypesw1(iph1->etype)]
-	                [iph1->side]
-	                [iph1->status])(iph1, msg) < 0
-	 || (ph1exchange[etypesw1(iph1->etype)]
-			[iph1->side]
-			[iph1->status])(iph1, msg) < 0) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"failed to process packet.\n");
-		remph1(iph1);
-		delph1(iph1);
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase1",
-		s_isakmp_state(iph1->etype, iph1->side, iph1->status),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-
-#else /* ENABLE_FRAG */
-
-	/* now that we have a phase1 handle, feed back into our
-	 * main receive function to catch fragmented packets
-	 */
-
-	return isakmp_main(msg, remote, local);
-
-#endif /* ENABLE_FRAG */
-
-}
-
-/* new negotiation of phase 2 for initiator */
-static int
-isakmp_ph2begin_i(iph1, iph2)
-	struct ph1handle *iph1;
-	struct ph2handle *iph2;
-{
-#ifdef ENABLE_HYBRID
-	if (xauth_check(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Attempt to start phase 2 whereas Xauth failed\n");
-		return -1;
-	}
-#endif
-
-	/* found ISAKMP-SA. */
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
-    {
-	char *a;
-	a = racoon_strdup(saddr2str(iph2->src));
-	STRDUP_FATAL(a);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"initiate new phase 2 negotiation: %s<=>%s\n",
-		a, saddr2str(iph2->dst));
-	racoon_free(a);
-    }
-
-#ifdef ENABLE_STATS
-	gettimeofday(&iph2->start, NULL);
-#endif
-	/* found isakmp-sa */
-	bindph12(iph1, iph2);
-	iph2->status = PHASE2ST_STATUS2;
-
-	if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
-			 [iph2->side]
-			 [iph2->status])(iph2, NULL) < 0) {
-		unbindph12(iph2);
-		/* release ipsecsa handler due to internal error. */
-		remph2(iph2);
-		return -1;
-	}
-	return 0;
-}
-
-/* new negotiation of phase 2 for responder */
-static int
-isakmp_ph2begin_r(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct isakmp *isakmp = (struct isakmp *)msg->v;
-	struct ph2handle *iph2 = 0;
-	int error;
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-#ifdef ENABLE_HYBRID
-	if (xauth_check(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Attempt to start phase 2 whereas Xauth failed\n");
-		return -1;
-	}
-#endif
-
-	iph2 = newph2();
-	if (iph2 == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate phase2 entry.\n");
-		return -1;
-	}
-
-	iph2->ph1 = iph1;
-	iph2->side = RESPONDER;
-	iph2->status = PHASE2ST_START;
-	iph2->flags = isakmp->flags;
-	iph2->msgid = isakmp->msgid;
-	iph2->seq = pk_getseq();
-	iph2->ivm = oakley_newiv2(iph1, iph2->msgid);
-	if (iph2->ivm == NULL) {
-		delph2(iph2);
-		return -1;
-	}
-	iph2->dst = dupsaddr(iph1->remote);	/* XXX should be considered */
-	if (iph2->dst == NULL) {
-		delph2(iph2);
-		return -1;
-	}
-	iph2->src = dupsaddr(iph1->local);	/* XXX should be considered */
-	if (iph2->src == NULL) {
-		delph2(iph2);
-		return -1;
-	}
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
-	if (set_port(iph2->dst, 0) == NULL ||
-	    set_port(iph2->src, 0) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "invalid family: %d\n", iph2->dst->sa_family);
-		delph2(iph2);
-		return -1;
-	}
-#endif
-
-	/* add new entry to isakmp status table */
-	insph2(iph2);
-	bindph12(iph1, iph2);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-    {
-	char *a;
-
-	a = racoon_strdup(saddr2str(iph2->src));
-	STRDUP_FATAL(a);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"respond new phase 2 negotiation: %s<=>%s\n",
-		a, saddr2str(iph2->dst));
-	racoon_free(a);
-    }
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	error = (ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
-	                   [iph2->side]
-	                   [iph2->status])(iph2, msg);
-	if (error != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to pre-process packet.\n");
-		if (error != ISAKMP_INTERNAL_ERROR)
-			isakmp_info_send_n1(iph2->ph1, error, NULL);
-		/*
-		 * release handler because it's wrong that ph2handle is kept
-		 * after failed to check message for responder's.
-		 */
-		unbindph12(iph2);
-		remph2(iph2);
-		delph2(iph2);
-		return -1;
-	}
-
-	/* send */
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	if ((ph2exchange[etypesw2(isakmp->etype)]
-			[iph2->side]
-			[iph2->status])(iph2, msg) < 0) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"failed to process packet.\n");
-		/* don't release handler */
-		return -1;
-	}
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase2",
-		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-}
-
-/*
- * parse ISAKMP payloads, without ISAKMP base header.
- */
-vchar_t *
-isakmp_parsewoh(np0, gen, len)
-	int np0;
-	struct isakmp_gen *gen;
-	int len;
-{
-	u_char np = np0 & 0xff;
-	int tlen, plen;
-	vchar_t *result;
-	struct isakmp_parse_t *p, *ep;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
-
-	/*
-	 * 5 is a magic number, but any value larger than 2 should be fine
-	 * as we do vrealloc() in the following loop.
-	 */
-	result = vmalloc(sizeof(struct isakmp_parse_t) * 5);
-	if (result == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer.\n");
-		return NULL;
-	}
-	p = (struct isakmp_parse_t *)result->v;
-	ep = (struct isakmp_parse_t *)(result->v + result->l - sizeof(*ep));
-
-	tlen = len;
-
-	/* parse through general headers */
-	while (0 < tlen && np != ISAKMP_NPTYPE_NONE) {
-		if (tlen <= sizeof(struct isakmp_gen)) {
-			/* don't send information, see isakmp_ident_r1() */
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid length of payload\n");
-			vfree(result);
-			return NULL;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"seen nptype=%u(%s)\n", np, s_isakmp_nptype(np));
-
-		p->type = np;
-		p->len = ntohs(gen->len);
-		if (p->len < sizeof(struct isakmp_gen) || p->len > tlen) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"invalid length of payload\n");
-			vfree(result);
-			return NULL;
-		}
-		p->ptr = gen;
-		p++;
-		if (ep <= p) {
-			int off;
-
-			off = p - (struct isakmp_parse_t *)result->v;
-			result = vrealloc(result, result->l * 2);
-			if (result == NULL) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-					"failed to realloc buffer.\n");
-				vfree(result);
-				return NULL;
-			}
-			ep = (struct isakmp_parse_t *)
-				(result->v + result->l - sizeof(*ep));
-			p = (struct isakmp_parse_t *)result->v;
-			p += off;
-		}
-
-		np = gen->np;
-		plen = ntohs(gen->len);
-		gen = (struct isakmp_gen *)((caddr_t)gen + plen);
-		tlen -= plen;
-	}
-	p->type = ISAKMP_NPTYPE_NONE;
-	p->len = 0;
-	p->ptr = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "succeed.\n");
-
-	return result;
-}
-
-/*
- * parse ISAKMP payloads, including ISAKMP base header.
- */
-vchar_t *
-isakmp_parse(buf)
-	vchar_t *buf;
-{
-	struct isakmp *isakmp = (struct isakmp *)buf->v;
-	struct isakmp_gen *gen;
-	int tlen;
-	vchar_t *result;
-	u_char np;
-
-	np = isakmp->np;
-	gen = (struct isakmp_gen *)(buf->v + sizeof(*isakmp));
-	tlen = buf->l - sizeof(struct isakmp);
-	result = isakmp_parsewoh(np, gen, tlen);
-
-	return result;
-}
-
-/* %%% */
-int
-isakmp_init()
-{
-	/* initialize a isakmp status table */
-	initph1tree();
-	initph2tree();
-	initctdtree();
-	init_recvdpkt();
-
-	if (isakmp_open() < 0)
-		goto err;
-
-	return(0);
-
-err:
-	isakmp_close();
-	return(-1);
-}
-
-/*
- * make strings containing i_cookie + r_cookie + msgid
- */
-const char *
-isakmp_pindex(index, msgid)
-	const isakmp_index *index;
-	const u_int32_t msgid;
-{
-	static char buf[64];
-	const u_char *p;
-	int i, j;
-
-	memset(buf, 0, sizeof(buf));
-
-	/* copy index */
-	p = (const u_char *)index;
-	for (j = 0, i = 0; i < sizeof(isakmp_index); i++) {
-		snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]);
-		j += 2;
-		switch (i) {
-		case 7:
-			buf[j++] = ':';
-		}
-	}
-
-	if (msgid == 0)
-		return buf;
-
-	/* copy msgid */
-	snprintf((char *)&buf[j], sizeof(buf) - j, ":%08x", ntohs(msgid));
-
-	return buf;
-}
-
-/* open ISAKMP sockets. */
-int
-isakmp_open()
-{
-	const int yes = 1;
-	int ifnum = 0, encap_ifnum = 0;
-#ifdef INET6
-	int pktinfo;
-#endif
-	struct myaddrs *p;
-
-	for (p = lcconf->myaddrs; p; p = p->next) {
-		if (!p->addr)
-			continue;
-
-		/* warn if wildcard address - should we forbid this? */
-		switch (p->addr->sa_family) {
-		case AF_INET:
-			if (((struct sockaddr_in *)p->addr)->sin_addr.s_addr == 0)
-				plog(LLV_WARNING, LOCATION, NULL,
-					"listening to wildcard address,"
-					"broadcast IKE packet may kill you\n");
-			break;
-#ifdef INET6
-		case AF_INET6:
-			if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)p->addr)->sin6_addr))
-				plog(LLV_WARNING, LOCATION, NULL,
-					"listening to wildcard address, "
-					"broadcast IKE packet may kill you\n");
-			break;
-#endif
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"unsupported address family %d\n",
-				lcconf->default_af);
-			goto err_and_next;
-		}
-
-#ifdef INET6
-		if (p->addr->sa_family == AF_INET6 &&
-		    IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)
-					    p->addr)->sin6_addr))
-		{
-			plog(LLV_DEBUG, LOCATION, NULL, 
-				"Ignoring multicast address %s\n",
-				saddr2str(p->addr));
-				racoon_free(p->addr);
-				p->addr = NULL;
-			continue;
-		}
-#endif
-
-		if ((p->sock = socket(p->addr->sa_family, SOCK_DGRAM, 0)) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"socket (%s)\n", strerror(errno));
-			goto err_and_next;
-		}
-#ifdef ANDROID_CHANGES
-		protectFromVpn(p->sock);
-#endif
-
-		if (fcntl(p->sock, F_SETFL, O_NONBLOCK) == -1)
-			plog(LLV_WARNING, LOCATION, NULL,
-				"failed to put socket in non-blocking mode\n");
-
-		/* receive my interface address on inbound packets. */
-		switch (p->addr->sa_family) {
-		case AF_INET:
-			if (setsockopt(p->sock, IPPROTO_IP,
-#ifdef __linux__
-				       IP_PKTINFO,
-#else
-				       IP_RECVDSTADDR,
-#endif
-					(const void *)&yes, sizeof(yes)) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"setsockopt IP_RECVDSTADDR (%s)\n", 
-					strerror(errno));
-				goto err_and_next;
-			}
-			break;
-#ifdef INET6
-		case AF_INET6:
-#ifdef INET6_ADVAPI
-#ifdef IPV6_RECVPKTINFO
-			pktinfo = IPV6_RECVPKTINFO;
-#else  /* old adv. API */
-			pktinfo = IPV6_PKTINFO;
-#endif /* IPV6_RECVPKTINFO */
-#else
-			pktinfo = IPV6_RECVDSTADDR;
-#endif
-			if (setsockopt(p->sock, IPPROTO_IPV6, pktinfo,
-					(const void *)&yes, sizeof(yes)) < 0)
-			{
-				plog(LLV_ERROR, LOCATION, NULL,
-					"setsockopt IPV6_RECVDSTADDR (%d):%s\n",
-					pktinfo, strerror(errno));
-				goto err_and_next;
-			}
-			break;
-#endif
-		}
-
-#ifdef IPV6_USE_MIN_MTU
-		if (p->addr->sa_family == AF_INET6 &&
-		    setsockopt(p->sock, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
-		    (void *)&yes, sizeof(yes)) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "setsockopt IPV6_USE_MIN_MTU (%s)\n", 
-			    strerror(errno));
-			return -1;
-		}
-#endif
-
-		if (setsockopt_bypass(p->sock, p->addr->sa_family) < 0)
-			goto err_and_next;
-
-		if (bind(p->sock, p->addr, sysdep_sa_len(p->addr)) < 0) {
-			plog(LLV_ERROR, LOCATION, p->addr,
-				"failed to bind to address %s (%s).\n",
-				saddr2str(p->addr), strerror(errno));
-			close(p->sock);
-			goto err_and_next;
-		}
-
-		ifnum++;
-
-		plog(LLV_INFO, LOCATION, NULL,
-			"%s used as isakmp port (fd=%d)\n",
-			saddr2str(p->addr), p->sock);
-
-#ifdef ENABLE_NATT
-		if (p->addr->sa_family == AF_INET) {
-			int option = -1;
-
-
-			if(p->udp_encap)
-				option = UDP_ENCAP_ESPINUDP;
-#if defined(ENABLE_NATT_00) || defined(ENABLE_NATT_01)
-			else
-				option = UDP_ENCAP_ESPINUDP_NON_IKE;
-#endif
-			if(option != -1){
-				if (setsockopt (p->sock, SOL_UDP, 
-				    UDP_ENCAP, &option, sizeof (option)) < 0) {
-					plog(LLV_WARNING, LOCATION, NULL,
-					    "setsockopt(%s): UDP_ENCAP %s\n",
-					    option == UDP_ENCAP_ESPINUDP ? "UDP_ENCAP_ESPINUDP" : "UDP_ENCAP_ESPINUDP_NON_IKE",
-						 strerror(errno));
-					goto skip_encap;
-				}
-				else {
-					plog(LLV_INFO, LOCATION, NULL,
-						 "%s used for NAT-T\n",
-						 saddr2str(p->addr));
-					encap_ifnum++;
-				}
-			}
-		}
-skip_encap:
-#endif
-		continue;
-
-	err_and_next:
-		racoon_free(p->addr);
-		p->addr = NULL;
-		if (! lcconf->autograbaddr && lcconf->strict_address)
-			return -1;
-		continue;
-	}
-
-	if (!ifnum) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no address could be bound.\n");
-		return -1;
-	}
-
-#ifdef ENABLE_NATT
-	if (natt_enabled_in_rmconf() && !encap_ifnum) {
-		plog(LLV_WARNING, LOCATION, NULL, 
-			"NAT-T is enabled in at least one remote{} section,\n");
-		plog(LLV_WARNING, LOCATION, NULL, 
-			"but no 'isakmp_natt' address was specified!\n");
-	}
-#endif
-
-	return 0;
-}
-
-void
-isakmp_close()
-{
-#ifndef ANDROID_PATCHED
-	struct myaddrs *p, *next;
-
-	for (p = lcconf->myaddrs; p; p = next) {
-		next = p->next;
-
-		if (!p->addr) {
-			racoon_free(p);
-			continue;
-		}
-		close(p->sock);
-		racoon_free(p->addr);
-		racoon_free(p);
-	}
-
-	lcconf->myaddrs = NULL;
-#endif
-}
-
-int
-isakmp_send(iph1, sbuf)
-	struct ph1handle *iph1;
-	vchar_t *sbuf;
-{
-	int len = 0;
-	int s;
-	vchar_t *vbuf = NULL, swap;
-
-#ifdef ENABLE_NATT
-	size_t extralen = NON_ESP_MARKER_USE(iph1) ? NON_ESP_MARKER_LEN : 0;
-
-	/* Check if NON_ESP_MARKER_LEN is already there (happens when resending packets)
-	 */
-	if(extralen == NON_ESP_MARKER_LEN &&
-	   *(u_int32_t *)sbuf->v == 0)
-		extralen = 0;
-
-#ifdef ENABLE_FRAG
-	/* 
-	 * Do not add the non ESP marker for a packet that will
-	 * be fragmented. The non ESP marker should appear in 
-	 * all fragment's packets, but not in the fragmented packet
-	 */
-	if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN) 
-		extralen = 0;
-#endif
-	if (extralen)
-		plog (LLV_DEBUG, LOCATION, NULL, "Adding NON-ESP marker\n");
-
-	/* If NAT-T port floating is in use, 4 zero bytes (non-ESP marker) 
-	   must added just before the packet itself. For this we must 
-	   allocate a new buffer and release it at the end. */
-	if (extralen) {
-		if ((vbuf = vmalloc (sbuf->l + extralen)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "vbuf allocation failed\n");
-			return -1;
-		}
-		*(u_int32_t *)vbuf->v = 0;
-		memcpy (vbuf->v + extralen, sbuf->v, sbuf->l);
-		/* ensures that the modified buffer will be sent back to the caller, so
-		 * add_recvdpkt() will add the correct buffer
-		 */
-		swap = *sbuf;
-		*sbuf = *vbuf;
-		*vbuf = swap;
-		vfree(vbuf);
-	}
-#endif
-
-	/* select the socket to be sent */
-	s = getsockmyaddr(iph1->local);
-	if (s == -1){
-		return -1;
-	}
-
-	plog (LLV_DEBUG, LOCATION, NULL, "%zu bytes %s\n", sbuf->l, 
-	      saddr2str_fromto("from %s to %s", iph1->local, iph1->remote));
-
-#ifdef ENABLE_FRAG
-	if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN) {
-		if (isakmp_sendfrags(iph1, sbuf) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "isakmp_sendfrags failed\n");
-			return -1;
-		}
-	} else 
-#endif
-	{
-		len = sendfromto(s, sbuf->v, sbuf->l,
-		    iph1->local, iph1->remote, lcconf->count_persend);
-
-		if (len == -1) {
-			plog(LLV_ERROR, LOCATION, NULL, "sendfromto failed\n");
-			return -1;
-		}
-	}
-	
-	return 0;
-}
-
-/* called from scheduler */
-void
-isakmp_ph1resend_stub(p)
-	void *p;
-{
-	struct ph1handle *iph1;
-
-	iph1=(struct ph1handle *)p;
-	if(isakmp_ph1resend(iph1) < 0){
-		if(iph1->scr != NULL){
-			/* Should not happen...
-			 */
-			sched_kill(iph1->scr);
-			iph1->scr=NULL;
-		}
-
-		remph1(iph1);
-		delph1(iph1);
-	}
-}
-
-int
-isakmp_ph1resend(iph1)
-	struct ph1handle *iph1;
-{
-	/* Note: NEVER do the rem/del here, it will be done by the caller or by the _stub function
-	 */
-	if (iph1->retry_counter <= 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"phase1 negotiation failed due to time up. %s\n",
-			isakmp_pindex(&iph1->index, iph1->msgid));
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEER_NO_RESPONSE, NULL);
-
-		return -1;
-	}
-
-	if (isakmp_send(iph1, iph1->sendbuf) < 0){
-		plog(LLV_ERROR, LOCATION, NULL,
-			 "phase1 negotiation failed due to send error. %s\n",
-			 isakmp_pindex(&iph1->index, iph1->msgid));
-		EVT_PUSH(iph1->local, iph1->remote, 
-				 EVTT_PEER_NO_RESPONSE, NULL);
-		return -1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"resend phase1 packet %s\n",
-		isakmp_pindex(&iph1->index, iph1->msgid));
-
-	iph1->retry_counter--;
-
-	iph1->scr = sched_new(iph1->rmconf->retry_interval,
-		isakmp_ph1resend_stub, iph1);
-
-	return 0;
-}
-
-/* called from scheduler */
-void
-isakmp_ph2resend_stub(p)
-	void *p;
-{
-	struct ph2handle *iph2;
-
-	iph2=(struct ph2handle *)p;
-
-	if(isakmp_ph2resend(iph2) < 0){
-		unbindph12(iph2);
-		remph2(iph2);
-		delph2(iph2);
-	}
-}
-
-int
-isakmp_ph2resend(iph2)
-	struct ph2handle *iph2;
-{
-	/* Note: NEVER do the unbind/rem/del here, it will be done by the caller or by the _stub function
-	 */
-	if (iph2->ph1->status == PHASE1ST_EXPIRED){
-		plog(LLV_ERROR, LOCATION, NULL,
-			"phase2 negotiation failed due to phase1 expired. %s\n",
-				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
-		return -1;
-	}
-
-	if (iph2->retry_counter <= 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"phase2 negotiation failed due to time up. %s\n",
-				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
-		EVT_PUSH(iph2->src, iph2->dst, EVTT_PEER_NO_RESPONSE, NULL);
-		unbindph12(iph2);
-		return -1;
-	}
-
-	if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0){
-		plog(LLV_ERROR, LOCATION, NULL,
-			"phase2 negotiation failed due to send error. %s\n",
-				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
-		EVT_PUSH(iph2->src, iph2->dst, EVTT_PEER_NO_RESPONSE, NULL);
-
-		return -1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"resend phase2 packet %s\n",
-		isakmp_pindex(&iph2->ph1->index, iph2->msgid));
-
-	iph2->retry_counter--;
-
-	iph2->scr = sched_new(iph2->ph1->rmconf->retry_interval,
-		isakmp_ph2resend_stub, iph2);
-
-	return 0;
-}
-
-/* called from scheduler */
-void
-isakmp_ph1expire_stub(p)
-	void *p;
-{
-
-	isakmp_ph1expire((struct ph1handle *)p);
-}
-
-void
-isakmp_ph1expire(iph1)
-	struct ph1handle *iph1;
-{
-	char *src, *dst;
-
-	SCHED_KILL(iph1->sce);
-
-	if(iph1->status != PHASE1ST_EXPIRED){
-		src = racoon_strdup(saddr2str(iph1->local));
-		dst = racoon_strdup(saddr2str(iph1->remote));
-		STRDUP_FATAL(src);
-		STRDUP_FATAL(dst);
-
-		plog(LLV_INFO, LOCATION, NULL,
-			 "ISAKMP-SA expired %s-%s spi:%s\n",
-			 src, dst,
-			 isakmp_pindex(&iph1->index, 0));
-		racoon_free(src);
-		racoon_free(dst);
-		iph1->status = PHASE1ST_EXPIRED;
-	}
-
-	/*
-	 * the phase1 deletion is postponed until there is no phase2.
-	 */
-	if (LIST_FIRST(&iph1->ph2tree) != NULL) {
-		iph1->sce = sched_new(1, isakmp_ph1expire_stub, iph1);
-		return;
-	}
-
-	iph1->sce = sched_new(1, isakmp_ph1delete_stub, iph1);
-}
-
-/* called from scheduler */
-void
-isakmp_ph1delete_stub(p)
-	void *p;
-{
-
-	isakmp_ph1delete((struct ph1handle *)p);
-}
-
-void
-isakmp_ph1delete(iph1)
-	struct ph1handle *iph1;
-{
-	char *src, *dst;
-
-	SCHED_KILL(iph1->sce);
-
-	if (LIST_FIRST(&iph1->ph2tree) != NULL) {
-		iph1->sce = sched_new(1, isakmp_ph1delete_stub, iph1);
-		return;
-	}
-
-	/* don't re-negosiation when the phase 1 SA expires. */
-
-	src = racoon_strdup(saddr2str(iph1->local));
-	dst = racoon_strdup(saddr2str(iph1->remote));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"ISAKMP-SA deleted %s-%s spi:%s\n",
-		src, dst, isakmp_pindex(&iph1->index, 0));
-	EVT_PUSH(iph1->local, iph1->remote, EVTT_PHASE1_DOWN, NULL);
-	racoon_free(src);
-	racoon_free(dst);
-
-	remph1(iph1);
-	delph1(iph1);
-
-	return;
-}
-
-/* called from scheduler.
- * this function will call only isakmp_ph2delete().
- * phase 2 handler remain forever if kernel doesn't cry a expire of phase 2 SA
- * by something cause.  That's why this function is called after phase 2 SA
- * expires in the userland.
- */
-void
-isakmp_ph2expire_stub(p)
-	void *p;
-{
-
-	isakmp_ph2expire((struct ph2handle *)p);
-}
-
-void
-isakmp_ph2expire(iph2)
-	struct ph2handle *iph2;
-{
-	char *src, *dst;
-
-	SCHED_KILL(iph2->sce);
-
-	src = racoon_strdup(saddrwop2str(iph2->src));
-	dst = racoon_strdup(saddrwop2str(iph2->dst));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"phase2 sa expired %s-%s\n", src, dst);
-	racoon_free(src);
-	racoon_free(dst);
-
-	iph2->status = PHASE2ST_EXPIRED;
-
-	iph2->sce = sched_new(1, isakmp_ph2delete_stub, iph2);
-
-	return;
-}
-
-/* called from scheduler */
-void
-isakmp_ph2delete_stub(p)
-	void *p;
-{
-
-	isakmp_ph2delete((struct ph2handle *)p);
-}
-
-void
-isakmp_ph2delete(iph2)
-	struct ph2handle *iph2;
-{
-	char *src, *dst;
-
-	SCHED_KILL(iph2->sce);
-
-	src = racoon_strdup(saddrwop2str(iph2->src));
-	dst = racoon_strdup(saddrwop2str(iph2->dst));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"phase2 sa deleted %s-%s\n", src, dst);
-	racoon_free(src);
-	racoon_free(dst);
-
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-
-	return;
-}
-
-/* %%%
- * Interface between PF_KEYv2 and ISAKMP
- */
-/*
- * receive ACQUIRE from kernel, and begin either phase1 or phase2.
- * if phase1 has been finished, begin phase2.
- */
-int
-isakmp_post_acquire(iph2)
-	struct ph2handle *iph2;
-{
-	struct remoteconf *rmconf;
-	struct ph1handle *iph1 = NULL;
-	
-	plog(LLV_DEBUG, LOCATION, NULL, "in post_acquire\n");
-
-	/* search appropreate configuration with masking port. */
-	rmconf = getrmconf(iph2->dst);
-	if (rmconf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no configuration found for %s.\n",
-			saddrwop2str(iph2->dst));
-		return -1;
-	}
-
-	/* if passive mode, ignore the acquire message */
-	if (rmconf->passive) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"because of passive mode, "
-			"ignore the acquire message for %s.\n",
-			saddrwop2str(iph2->dst));
-		return 0;
-	}
-
-	/* 
-	 * Search isakmp status table by address and port 
-	 * If NAT-T is in use, consider null ports as a 
-	 * wildcard and use IKE ports instead.
-	 */
-#ifdef ENABLE_NATT
-	if (!extract_port(iph2->src) && !extract_port(iph2->dst)) {
-		if ((iph1 = getph1byaddrwop(iph2->src, iph2->dst)) != NULL) {
-			set_port(iph2->src, extract_port(iph1->local));
-			set_port(iph2->dst, extract_port(iph1->remote));
-		}
-	} else {
-		iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-	}
-#else
-	iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-#endif
-
-	/* no ISAKMP-SA found. */
-	if (iph1 == NULL) {
-		struct sched *sc;
-
-		iph2->retry_checkph1 = lcconf->retry_checkph1;
-		sc = sched_new(1, isakmp_chkph1there_stub, iph2);
-		plog(LLV_INFO, LOCATION, NULL,
-			"IPsec-SA request for %s queued "
-			"due to no phase1 found.\n",
-			saddrwop2str(iph2->dst));
-
-		/* start phase 1 negotiation as a initiator. */
-		if (isakmp_ph1begin_i(rmconf, iph2->dst, iph2->src) < 0) {
-			SCHED_KILL(sc);
-			return -1;
-		}
-
-		return 0;
-		/*NOTREACHED*/
-	}
-
-	/* found ISAKMP-SA, but on negotiation. */
-	if (iph1->status != PHASE1ST_ESTABLISHED) {
-		iph2->retry_checkph1 = lcconf->retry_checkph1;
-		sched_new(1, isakmp_chkph1there_stub, iph2);
-		plog(LLV_INFO, LOCATION, iph2->dst,
-			"request for establishing IPsec-SA was queued "
-			"due to no phase1 found.\n");
-		return 0;
-		/*NOTREACHED*/
-	}
-
-	/* found established ISAKMP-SA */
-	/* i.e. iph1->status == PHASE1ST_ESTABLISHED */
-
-	/* found ISAKMP-SA. */
-	plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
-
-	/* begin quick mode */
-	if (isakmp_ph2begin_i(iph1, iph2))
-		return -1;
-
-	return 0;
-}
-
-/*
- * receive GETSPI from kernel.
- */
-int
-isakmp_post_getspi(iph2)
-	struct ph2handle *iph2;
-{
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-	/* don't process it because there is no suitable phase1-sa. */
-	if (iph2->ph1->status == PHASE1ST_EXPIRED) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"the negotiation is stopped, "
-			"because there is no suitable ISAKMP-SA.\n");
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-	if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
-	                [iph2->side]
-	                [iph2->status])(iph2, NULL) != 0)
-		return -1;
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase2",
-		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-}
-
-/* called by scheduler */
-void
-isakmp_chkph1there_stub(p)
-	void *p;
-{
-	isakmp_chkph1there((struct ph2handle *)p);
-}
-
-void
-isakmp_chkph1there(iph2)
-	struct ph2handle *iph2;
-{
-	struct ph1handle *iph1;
-
-	iph2->retry_checkph1--;
-	if (iph2->retry_checkph1 < 0) {
-		plog(LLV_ERROR, LOCATION, iph2->dst,
-			"phase2 negotiation failed "
-			"due to time up waiting for phase1. %s\n",
-			sadbsecas2str(iph2->dst, iph2->src,
-				iph2->satype, 0, 0));
-		plog(LLV_INFO, LOCATION, NULL,
-			"delete phase 2 handler.\n");
-
-		/* send acquire to kernel as error */
-		pk_sendeacquire(iph2);
-
-		unbindph12(iph2);
-		remph2(iph2);
-		delph2(iph2);
-
-		return;
-	}
-
-	/* 
-	 * Search isakmp status table by address and port 
-	 * If NAT-T is in use, consider null ports as a 
-	 * wildcard and use IKE ports instead.
-	 */
-#ifdef ENABLE_NATT
-	if (!extract_port(iph2->src) && !extract_port(iph2->dst)) {
-		plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: extract_port.\n");
-		if( (iph1 = getph1byaddrwop(iph2->src, iph2->dst)) != NULL){
-			plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: found a ph1 wop.\n");
-		}
-	} else {
-		plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: searching byaddr.\n");
-		iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-		if(iph1 != NULL)
-			plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: found byaddr.\n");
-	}
-#else
-	iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-#endif
-
-	/* XXX Even if ph1 as responder is there, should we not start
-	 * phase 2 negotiation ? */
-	if (iph1 != NULL
-	 && iph1->status == PHASE1ST_ESTABLISHED) {
-		/* found isakmp-sa */
-
-		plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: got a ph1 handler, setting ports.\n");
-		plog(LLV_DEBUG2, LOCATION, NULL, "iph1->local: %s\n", saddr2str(iph1->local));
-		plog(LLV_DEBUG2, LOCATION, NULL, "iph1->remote: %s\n", saddr2str(iph1->remote));
-		plog(LLV_DEBUG2, LOCATION, NULL, "before:\n");
-		plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
-		plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
-		set_port(iph2->src, extract_port(iph1->local));
-		set_port(iph2->dst, extract_port(iph1->remote));
-		plog(LLV_DEBUG2, LOCATION, NULL, "After:\n");
-		plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
-		plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
-
-		/* begin quick mode */
-		(void)isakmp_ph2begin_i(iph1, iph2);
-		return;
-	}
-
-	plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: no established ph1 handler found\n");
-
-	/* no isakmp-sa found */
-	sched_new(1, isakmp_chkph1there_stub, iph2);
-
-	return;
-}
-
-/* copy variable data into ALLOCATED buffer. */
-caddr_t
-isakmp_set_attr_v(buf, type, val, len)
-	caddr_t buf;
-	int type;
-	caddr_t val;
-	int len;
-{
-	struct isakmp_data *data;
-
-	data = (struct isakmp_data *)buf;
-	data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
-	data->lorv = htons((u_int16_t)len);
-	memcpy(data + 1, val, len);
-
-	return buf + sizeof(*data) + len;
-}
-
-/* copy fixed length data into ALLOCATED buffer. */
-caddr_t
-isakmp_set_attr_l(buf, type, val)
-	caddr_t buf;
-	int type;
-	u_int32_t val;
-{
-	struct isakmp_data *data;
-
-	data = (struct isakmp_data *)buf;
-	data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
-	data->lorv = htons((u_int16_t)val);
-
-	return buf + sizeof(*data);
-}
-
-/* add a variable data attribute to the buffer by reallocating it. */
-vchar_t *
-isakmp_add_attr_v(buf0, type, val, len)
-	vchar_t *buf0;
-	int type;
-	caddr_t val;
-	int len;
-{
-	vchar_t *buf = NULL;
-	struct isakmp_data *data;
-	int tlen;
-	int oldlen = 0;
-
-	tlen = sizeof(*data) + len;
-
-	if (buf0) {
-		oldlen = buf0->l;
-		buf = vrealloc(buf0, oldlen + tlen);
-	} else
-		buf = vmalloc(tlen);
-	if (!buf) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get a attribute buffer.\n");
-		return NULL;
-	}
-
-	data = (struct isakmp_data *)(buf->v + oldlen);
-	data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
-	data->lorv = htons((u_int16_t)len);
-	memcpy(data + 1, val, len);
-
-	return buf;
-}
-
-/* add a fixed data attribute to the buffer by reallocating it. */
-vchar_t *
-isakmp_add_attr_l(buf0, type, val)
-	vchar_t *buf0;
-	int type;
-	u_int32_t val;
-{
-	vchar_t *buf = NULL;
-	struct isakmp_data *data;
-	int tlen;
-	int oldlen = 0;
-
-	tlen = sizeof(*data);
-
-	if (buf0) {
-		oldlen = buf0->l;
-		buf = vrealloc(buf0, oldlen + tlen);
-	} else
-		buf = vmalloc(tlen);
-	if (!buf) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get a attribute buffer.\n");
-		return NULL;
-	}
-
-	data = (struct isakmp_data *)(buf->v + oldlen);
-	data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
-	data->lorv = htons((u_int16_t)val);
-
-	return buf;
-}
-
-/*
- * calculate cookie and set.
- */
-int
-isakmp_newcookie(place, remote, local)
-	caddr_t place;
-	struct sockaddr *remote;
-	struct sockaddr *local;
-{
-	vchar_t *buf = NULL, *buf2 = NULL;
-	char *p;
-	int blen;
-	int alen;
-	caddr_t sa1, sa2;
-	time_t t;
-	int error = -1;
-	u_short port;
-
-
-	if (remote->sa_family != local->sa_family) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"address family mismatch, remote:%d local:%d\n",
-			remote->sa_family, local->sa_family);
-		goto end;
-	}
-	switch (remote->sa_family) {
-	case AF_INET:
-		alen = sizeof(struct in_addr);
-		sa1 = (caddr_t)&((struct sockaddr_in *)remote)->sin_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in *)local)->sin_addr;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		alen = sizeof(struct in6_addr);
-		sa1 = (caddr_t)&((struct sockaddr_in6 *)remote)->sin6_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in6 *)local)->sin6_addr;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid family: %d\n", remote->sa_family);
-		goto end;
-	}
-	blen = (alen + sizeof(u_short)) * 2
-		+ sizeof(time_t) + lcconf->secret_size;
-	buf = vmalloc(blen);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get a cookie.\n");
-		goto end;
-	}
-	p = buf->v;
-
-	/* copy my address */
-	memcpy(p, sa1, alen);
-	p += alen;
-	port = ((struct sockaddr_in *)remote)->sin_port;
-	memcpy(p, &port, sizeof(u_short));
-	p += sizeof(u_short);
-
-	/* copy target address */
-	memcpy(p, sa2, alen);
-	p += alen;
-	port = ((struct sockaddr_in *)local)->sin_port;
-	memcpy(p, &port, sizeof(u_short));
-	p += sizeof(u_short);
-
-	/* copy time */
-	t = time(0);
-	memcpy(p, (caddr_t)&t, sizeof(t));
-	p += sizeof(t);
-
-	/* copy random value */
-	buf2 = eay_set_random(lcconf->secret_size);
-	if (buf2 == NULL)
-		goto end;
-	memcpy(p, buf2->v, lcconf->secret_size);
-	p += lcconf->secret_size;
-	vfree(buf2);
-
-	buf2 = eay_sha1_one(buf);
-	memcpy(place, buf2->v, sizeof(cookie_t));
-
-	sa1 = val2str(place, sizeof (cookie_t));
-	plog(LLV_DEBUG, LOCATION, NULL, "new cookie:\n%s\n", sa1);
-	racoon_free(sa1);
-
-	error = 0;
-end:
-	if (buf != NULL)
-		vfree(buf);
-	if (buf2 != NULL)
-		vfree(buf2);
-	return error;
-}
-
-/*
- * save partner's(payload) data into phhandle.
- */
-int
-isakmp_p2ph(buf, gen)
-	vchar_t **buf;
-	struct isakmp_gen *gen;
-{
-	/* XXX to be checked in each functions for logging. */
-	if (*buf) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"ignore this payload, same payload type exist.\n");
-		return -1;
-	}
-
-	*buf = vmalloc(ntohs(gen->len) - sizeof(*gen));
-	if (*buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer.\n");
-		return -1;
-	}
-	memcpy((*buf)->v, gen + 1, (*buf)->l);
-
-	return 0;
-}
-
-u_int32_t
-isakmp_newmsgid2(iph1)
-	struct ph1handle *iph1;
-{
-	u_int32_t msgid2;
-
-	do {
-		msgid2 = eay_random();
-	} while (getph2bymsgid(iph1, msgid2));
-
-	return msgid2;
-}
-
-/*
- * set values into allocated buffer of isakmp header for phase 1
- */
-static caddr_t
-set_isakmp_header(vbuf, iph1, nptype, etype, flags, msgid)
-	vchar_t *vbuf;
-	struct ph1handle *iph1;
-	int nptype;
-	u_int8_t etype;
-	u_int8_t flags;
-	u_int32_t msgid;
-{
-	struct isakmp *isakmp;
-
-	if (vbuf->l < sizeof(*isakmp))
-		return NULL;
-
-	isakmp = (struct isakmp *)vbuf->v;
-
-	memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t));
-	memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t));
-	isakmp->np = nptype;
-	isakmp->v = iph1->version;
-	isakmp->etype = etype;
-	isakmp->flags = flags;
-	isakmp->msgid = msgid;
-	isakmp->len = htonl(vbuf->l);
-
-	return vbuf->v + sizeof(*isakmp);
-}
-
-/*
- * set values into allocated buffer of isakmp header for phase 1
- */
-caddr_t
-set_isakmp_header1(vbuf, iph1, nptype)
-	vchar_t *vbuf;
-	struct ph1handle *iph1;
-	int nptype;
-{
-	return set_isakmp_header (vbuf, iph1, nptype, iph1->etype, iph1->flags, iph1->msgid);
-}
-
-/*
- * set values into allocated buffer of isakmp header for phase 2
- */
-caddr_t
-set_isakmp_header2(vbuf, iph2, nptype)
-	vchar_t *vbuf;
-	struct ph2handle *iph2;
-	int nptype;
-{
-	return set_isakmp_header (vbuf, iph2->ph1, nptype, ISAKMP_ETYPE_QUICK, iph2->flags, iph2->msgid);
-}
-
-/*
- * set values into allocated buffer of isakmp payload.
- */
-caddr_t
-set_isakmp_payload(buf, src, nptype)
-	caddr_t buf;
-	vchar_t *src;
-	int nptype;
-{
-	struct isakmp_gen *gen;
-	caddr_t p = buf;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "add payload of len %zu, next type %d\n",
-	    src->l, nptype);
-
-	gen = (struct isakmp_gen *)p;
-	gen->np = nptype;
-	gen->len = htons(sizeof(*gen) + src->l);
-	p += sizeof(*gen);
-	memcpy(p, src->v, src->l);
-	p += src->l;
-
-	return p;
-}
-
-static int
-etypesw1(etype)
-	int etype;
-{
-	switch (etype) {
-	case ISAKMP_ETYPE_IDENT:
-		return 1;
-	case ISAKMP_ETYPE_AGG:
-		return 2;
-	case ISAKMP_ETYPE_BASE:
-		return 3;
-	default:
-		return 0;
-	}
-	/*NOTREACHED*/
-}
-
-static int
-etypesw2(etype)
-	int etype;
-{
-	switch (etype) {
-	case ISAKMP_ETYPE_QUICK:
-		return 1;
-	default:
-		return 0;
-	}
-	/*NOTREACHED*/
-}
-
-#ifdef HAVE_PRINT_ISAKMP_C
-/* for print-isakmp.c */
-char *snapend;
-extern void isakmp_print __P((const u_char *, u_int, const u_char *));
-
-char *getname __P((const u_char *));
-#ifdef INET6
-char *getname6 __P((const u_char *));
-#endif
-int safeputchar __P((int));
-
-/*
- * Return a name for the IP address pointed to by ap.  This address
- * is assumed to be in network byte order.
- */
-char *
-getname(ap)
-	const u_char *ap;
-{
-	struct sockaddr_in addr;
-	static char ntop_buf[NI_MAXHOST];
-
-	memset(&addr, 0, sizeof(addr));
-#ifndef __linux__
-	addr.sin_len = sizeof(struct sockaddr_in);
-#endif
-	addr.sin_family = AF_INET;
-	memcpy(&addr.sin_addr, ap, sizeof(addr.sin_addr));
-	if (getnameinfo((struct sockaddr *)&addr, sizeof(addr),
-			ntop_buf, sizeof(ntop_buf), NULL, 0,
-			NI_NUMERICHOST | niflags))
-		strlcpy(ntop_buf, "?", sizeof(ntop_buf));
-
-	return ntop_buf;
-}
-
-#ifdef INET6
-/*
- * Return a name for the IP6 address pointed to by ap.  This address
- * is assumed to be in network byte order.
- */
-char *
-getname6(ap)
-	const u_char *ap;
-{
-	struct sockaddr_in6 addr;
-	static char ntop_buf[NI_MAXHOST];
-
-	memset(&addr, 0, sizeof(addr));
-	addr.sin6_len = sizeof(struct sockaddr_in6);
-	addr.sin6_family = AF_INET6;
-	memcpy(&addr.sin6_addr, ap, sizeof(addr.sin6_addr));
-	if (getnameinfo((struct sockaddr *)&addr, addr.sin6_len,
-			ntop_buf, sizeof(ntop_buf), NULL, 0,
-			NI_NUMERICHOST | niflags))
-		strlcpy(ntop_buf, "?", sizeof(ntop_buf));
-
-	return ntop_buf;
-}
-#endif /* INET6 */
-
-int
-safeputchar(c)
-	int c;
-{
-	unsigned char ch;
-
-	ch = (unsigned char)(c & 0xff);
-	if (c < 0x80 && isprint(c))
-		return printf("%c", c & 0xff);
-	else
-		return printf("\\%03o", c & 0xff);
-}
-
-void
-isakmp_printpacket(msg, from, my, decoded)
-	vchar_t *msg;
-	struct sockaddr *from;
-	struct sockaddr *my;
-	int decoded;
-{
-#ifdef YIPS_DEBUG
-	struct timeval tv;
-	int s;
-	char hostbuf[NI_MAXHOST];
-	char portbuf[NI_MAXSERV];
-	struct isakmp *isakmp;
-	vchar_t *buf;
-#endif
-
-	if (loglevel < LLV_DEBUG)
-		return;
-
-#ifdef YIPS_DEBUG
-	plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
-
-	gettimeofday(&tv, NULL);
-	s = tv.tv_sec % 3600;
-	printf("%02d:%02d.%06u ", s / 60, s % 60, (u_int32_t)tv.tv_usec);
-
-	if (from) {
-		if (getnameinfo(from, sysdep_sa_len(from), hostbuf, sizeof(hostbuf),
-				portbuf, sizeof(portbuf),
-				NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
-			strlcpy(hostbuf, "?", sizeof(hostbuf));
-			strlcpy(portbuf, "?", sizeof(portbuf));
-		}
-		printf("%s:%s", hostbuf, portbuf);
-	} else
-		printf("?");
-	printf(" -> ");
-	if (my) {
-		if (getnameinfo(my, sysdep_sa_len(my), hostbuf, sizeof(hostbuf),
-				portbuf, sizeof(portbuf),
-				NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
-			strlcpy(hostbuf, "?", sizeof(hostbuf));
-			strlcpy(portbuf, "?", sizeof(portbuf));
-		}
-		printf("%s:%s", hostbuf, portbuf);
-	} else
-		printf("?");
-	printf(": ");
-
-	buf = vdup(msg);
-	if (!buf) {
-		printf("(malloc fail)\n");
-		return;
-	}
-	if (decoded) {
-		isakmp = (struct isakmp *)buf->v;
-		if (isakmp->flags & ISAKMP_FLAG_E) {
-#if 0
-			int pad;
-			pad = *(u_char *)(buf->v + buf->l - 1);
-			if (buf->l < pad && 2 < vflag)
-				printf("(wrong padding)");
-#endif
-			isakmp->flags &= ~ISAKMP_FLAG_E;
-		}
-	}
-
-	snapend = buf->v + buf->l;
-	isakmp_print(buf->v, buf->l, NULL);
-	vfree(buf);
-	printf("\n");
-	fflush(stdout);
-
-	return;
-#endif
-}
-#endif /*HAVE_PRINT_ISAKMP_C*/
-
-int
-copy_ph1addresses(iph1, rmconf, remote, local)
-	struct ph1handle *iph1;
-	struct remoteconf *rmconf;
-	struct sockaddr *remote, *local;
-{
-	u_int16_t port;
-
-	/* address portion must be grabbed from real remote address "remote" */
-	iph1->remote = dupsaddr(remote);
-	if (iph1->remote == NULL)
-		return -1;
-
-	/*
-	 * if remote has no port # (in case of initiator - from ACQUIRE msg)
-	 * - if remote.conf specifies port #, use that
-	 * - if remote.conf does not, use 500
-	 * if remote has port # (in case of responder - from recvfrom(2))
-	 * respect content of "remote".
-	 */
-	if (extract_port(iph1->remote) == 0) {
-		port = extract_port(rmconf->remote);
-		if (port == 0)
-			port = PORT_ISAKMP;
-		set_port(iph1->remote, port);
-	}
-
-	if (local == NULL)
-		iph1->local = getlocaladdr(iph1->remote);
-	else
-		iph1->local = dupsaddr(local);
-	if (iph1->local == NULL)
-		return -1;
-
-	if (extract_port(iph1->local) == 0)
-		set_port(iph1->local, PORT_ISAKMP);
-
-#ifdef ENABLE_NATT
-	if (extract_port(iph1->local) == lcconf->port_isakmp_natt) {
-		plog(LLV_DEBUG, LOCATION, NULL, "Marking ports as changed\n");
-		iph1->natt_flags |= NAT_ADD_NON_ESP_MARKER;
-	}
-#endif
-
-	return 0;
-}
-
-static int
-nostate1(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	plog(LLV_ERROR, LOCATION, iph1->remote, "wrong state %u.\n",
-			iph1->status);
-	return -1;
-}
-
-static int
-nostate2(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg;
-{
-	plog(LLV_ERROR, LOCATION, iph2->ph1->remote, "wrong state %u.\n",
-		iph2->status);
-	return -1;
-}
-
-void
-log_ph1established(iph1)
-	const struct ph1handle *iph1;
-{
-	char *src, *dst;
-
-	src = racoon_strdup(saddr2str(iph1->local));
-	dst = racoon_strdup(saddr2str(iph1->remote));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"ISAKMP-SA established %s-%s spi:%s\n",
-		src, dst,
-		isakmp_pindex(&iph1->index, 0));
-	
-	EVT_PUSH(iph1->local, iph1->remote, EVTT_PHASE1_UP, NULL);
-	if(!iph1->rmconf->mode_cfg) {
-		EVT_PUSH(iph1->local, iph1->remote, EVTT_NO_ISAKMP_CFG, NULL);
-	}
-
-	racoon_free(src);
-	racoon_free(dst);
-
-	return;
-}
-
-struct payload_list *
-isakmp_plist_append (struct payload_list *plist, vchar_t *payload, int payload_type)
-{
-	if (! plist) {
-		plist = racoon_malloc (sizeof (struct payload_list));
-		plist->prev = NULL;
-	}
-	else {
-		plist->next = racoon_malloc (sizeof (struct payload_list));
-		plist->next->prev = plist;
-		plist = plist->next;
-	}
-
-	plist->next = NULL;
-	plist->payload = payload;
-	plist->payload_type = payload_type;
-
-	return plist;
-}
-
-vchar_t * 
-isakmp_plist_set_all (struct payload_list **plist, struct ph1handle *iph1)
-{
-	struct payload_list *ptr = *plist, *first;
-	size_t tlen = sizeof (struct isakmp), n = 0;
-	vchar_t *buf = NULL;
-	char *p;
-
-	/* Seek to the first item.  */
-	while (ptr->prev) ptr = ptr->prev;
-	first = ptr;
-	
-	/* Compute the whole length.  */
-	while (ptr) {
-		tlen += ptr->payload->l + sizeof (struct isakmp_gen);
-		ptr = ptr->next;
-	}
-
-	buf = vmalloc(tlen);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	ptr = first;
-
-	p = set_isakmp_header1(buf, iph1, ptr->payload_type);
-	if (p == NULL)
-		goto end;
-
-	while (ptr)
-	{
-		p = set_isakmp_payload (p, ptr->payload, ptr->next ? ptr->next->payload_type : ISAKMP_NPTYPE_NONE);
-		first = ptr;
-		ptr = ptr->next;
-		racoon_free (first);
-		/* ptr->prev = NULL; first = NULL; ... omitted.  */
-		n++;
-	}
-
-	*plist = NULL;
-
-	return buf;
-end:
-	if (buf != NULL)
-		vfree(buf);
-	return NULL;
-}
-
-#ifdef ENABLE_FRAG
-int 
-frag_handler(iph1, msg, remote, local)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-	struct sockaddr *remote;
-	struct sockaddr *local;
-{
-	vchar_t *newmsg;
-
-	if (isakmp_frag_extract(iph1, msg) == 1) {
-		if ((newmsg = isakmp_frag_reassembly(iph1)) == NULL) {
-			plog(LLV_ERROR, LOCATION, remote, 
-			    "Packet reassembly failed\n");
-			return -1;
-		}
-		return isakmp_main(newmsg, remote, local);
-	}
-
-	return 0;
-}
-#endif
-
-void
-script_hook(iph1, script)
-	struct ph1handle *iph1;
-	int script;
-{
-#define IP_MAX 40
-#define PORT_MAX 6
-	char addrstr[IP_MAX];
-	char portstr[PORT_MAX];
-	char **envp = NULL;
-	int envc = 1;
-	struct sockaddr_in *sin;
-	char **c;
-
-	if (iph1 == NULL ||
-		iph1->rmconf == NULL ||
-		iph1->rmconf->script[script] == NULL)
-		return;
-
-#ifdef ENABLE_HYBRID
-	(void)isakmp_cfg_setenv(iph1, &envp, &envc);
-#endif
-
-	/* local address */
-	sin = (struct sockaddr_in *)iph1->local;
-	inet_ntop(sin->sin_family, &sin->sin_addr, addrstr, IP_MAX);
-	snprintf(portstr, PORT_MAX, "%d", ntohs(sin->sin_port));
-
-	if (script_env_append(&envp, &envc, "LOCAL_ADDR", addrstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_ADDR\n");
-		goto out;
-	}
-
-	if (script_env_append(&envp, &envc, "LOCAL_PORT", portstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_PORT\n");
-		goto out;
-	}
-
-	/* Peer address */
-	if (iph1->remote != NULL) {
-		sin = (struct sockaddr_in *)iph1->remote;
-		inet_ntop(sin->sin_family, &sin->sin_addr, addrstr, IP_MAX);
-		snprintf(portstr, PORT_MAX, "%d", ntohs(sin->sin_port));
-
-		if (script_env_append(&envp, &envc, 
-		    "REMOTE_ADDR", addrstr) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot set REMOTE_ADDR\n");
-			goto out;
-		}
-
-		if (script_env_append(&envp, &envc, 
-		    "REMOTE_PORT", portstr) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot set REMOTEL_PORT\n");
-			goto out;
-		}
-	}
-
-	if (privsep_script_exec(iph1->rmconf->script[script]->v, 
-	    script, envp) != 0) 
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Script %s execution failed\n", script_names[script]);
-
-out:
-	for (c = envp; *c; c++)
-		racoon_free(*c);
-
-	racoon_free(envp);
-
-	return;
-}
-
-int
-script_env_append(envp, envc, name, value)
-	char ***envp;
-	int *envc;
-	char *name;
-	char *value;
-{
-	char *envitem;
-	char **newenvp;
-	int newenvc;
-
-	if (value == NULL) {
-	        value = "";
-	}
-
-	envitem = racoon_malloc(strlen(name) + 1 + strlen(value) + 1);
-	if (envitem == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	sprintf(envitem, "%s=%s", name, value);
-
-	newenvc = (*envc) + 1;
-	newenvp = racoon_realloc(*envp, newenvc * sizeof(char *));
-	if (newenvp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		racoon_free(envitem);
-		return -1;
-	}
-
-	newenvp[newenvc - 2] = envitem;
-	newenvp[newenvc - 1] = NULL;
-
-	*envp = newenvp;
-	*envc = newenvc;
-	return 0;
-}
-
-int
-script_exec(script, name, envp)
-	char *script;
-	int name;
-	char *const envp[];
-{
-	char *argv[] = { NULL, NULL, NULL };
-
-	argv[0] = script;
-	argv[1] = script_names[name];
-	argv[2] = NULL;
-
-	switch (fork()) { 
-	case 0:
-		execve(argv[0], argv, envp);
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "execve(\"%s\") failed: %s\n",
-		    argv[0], strerror(errno));
-		_exit(1);
-		break;
-	case -1:
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot fork: %s\n", strerror(errno));
-		return -1;
-		break;
-	default:
-		break;
-	}	
-	return 0;
-
-}
-
-void
-purge_remote(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf = NULL;
-	struct sadb_msg *msg, *next, *end;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	caddr_t mhp[SADB_EXT_MAX + 1];
-	u_int proto_id;
-	struct ph2handle *iph2;
-	struct ph1handle *new_iph1;
-
-	plog(LLV_INFO, LOCATION, NULL,
-		 "purging ISAKMP-SA spi=%s.\n",
-		 isakmp_pindex(&(iph1->index), iph1->msgid));
-
-	/* Mark as expired. */
-	iph1->status = PHASE1ST_EXPIRED;
-
-	/* Check if we have another, still valid, phase1 SA. */
-	new_iph1 = getph1byaddr(iph1->local, iph1->remote, 1);
-
-	/*
-	 * Delete all orphaned or binded to the deleting ph1handle phase2 SAs.
-	 * Keep all others phase2 SAs.
-	 */
-	buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey_dump_sadb returned nothing.\n");
-		return;
-	}
-
-	msg = (struct sadb_msg *)buf->v;
-	end = (struct sadb_msg *)(buf->v + buf->l);
-
-	while (msg < end) {
-		if ((msg->sadb_msg_len << 3) < sizeof(*msg))
-			break;
-		next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
-		if (msg->sadb_msg_type != SADB_DUMP) {
-			msg = next;
-			continue;
-		}
-
-		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey_check (%s)\n", ipsec_strerror());
-			msg = next;
-			continue;
-		}
-
-		sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
-		if (!sa ||
-		    !mhp[SADB_EXT_ADDRESS_SRC] ||
-		    !mhp[SADB_EXT_ADDRESS_DST]) {
-			msg = next;
-			continue;
-		}
-		src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-		dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-		if (sa->sadb_sa_state != SADB_SASTATE_LARVAL &&
-		    sa->sadb_sa_state != SADB_SASTATE_MATURE &&
-		    sa->sadb_sa_state != SADB_SASTATE_DYING) {
-			msg = next;
-			continue;
-		}
-
-		/*
-		 * check in/outbound SAs.
-		 * Select only SAs where src == local and dst == remote (outgoing)
-		 * or src == remote and dst == local (incoming).
-		 */
-		if ((CMPSADDR(iph1->local, src) || CMPSADDR(iph1->remote, dst)) &&
-			(CMPSADDR(iph1->local, dst) || CMPSADDR(iph1->remote, src))) {
-			msg = next;
-			continue;
-		}
-
-		proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-		iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
-
-		/* Check if there is another valid ISAKMP-SA */
-		if (new_iph1 != NULL) {
-
-			if (iph2 == NULL) {
-				/* No handler... still send a pfkey_delete message, but log this !*/
-				plog(LLV_INFO, LOCATION, NULL,
-					"Unknown IPsec-SA spi=%u, hmmmm?\n",
-					ntohl(sa->sadb_sa_spi));
-			}else{
-
-				/* 
-				 * If we have a new ph1, do not purge IPsec-SAs binded
-				 *  to a different ISAKMP-SA
-				 */
-				if (iph2->ph1 != NULL && iph2->ph1 != iph1){
-					msg = next;
-					continue;
-				}
-
-				/* If the ph2handle is established, do not purge IPsec-SA */
-				if (iph2->status == PHASE2ST_ESTABLISHED ||
-					iph2->status == PHASE2ST_EXPIRED) {
-					
-					plog(LLV_INFO, LOCATION, NULL,
-						 "keeping IPsec-SA spi=%u - found valid ISAKMP-SA spi=%s.\n",
-						 ntohl(sa->sadb_sa_spi),
-						 isakmp_pindex(&(new_iph1->index), new_iph1->msgid));
-					msg = next;
-					continue;
-				}
-			}
-		}
-
-		
-		pfkey_send_delete(lcconf->sock_pfkey,
-				  msg->sadb_msg_satype,
-				  IPSEC_MODE_ANY,
-				  src, dst, sa->sadb_sa_spi);
-
-		/* delete a relative phase 2 handle. */
-		if (iph2 != NULL) {
-			delete_spd(iph2, 0);
-			unbindph12(iph2);
-			remph2(iph2);
-			delph2(iph2);
-		}
-
-		plog(LLV_INFO, LOCATION, NULL,
-			 "purged IPsec-SA spi=%u.\n",
-			 ntohl(sa->sadb_sa_spi));
-
-		msg = next;
-	}
-
-	if (buf)
-		vfree(buf);
-
-	/* Mark the phase1 handler as EXPIRED */
-	plog(LLV_INFO, LOCATION, NULL,
-		 "purged ISAKMP-SA spi=%s.\n",
-		 isakmp_pindex(&(iph1->index), iph1->msgid));
-
-	SCHED_KILL(iph1->sce);
-
-	iph1->sce = sched_new(1, isakmp_ph1delete_stub, iph1);
-}
-
-void 
-delete_spd(iph2, created)
-	struct ph2handle *iph2;
- 	u_int64_t created;
-{
-	struct policyindex spidx;
-	struct sockaddr_storage addr;
-	u_int8_t pref;
-	struct sockaddr *src;
-	struct sockaddr *dst;
-	int error;
-	int idi2type = 0;/* switch whether copy IDs into id[src,dst]. */
-
-	if (iph2 == NULL)
-		return;
-
-	/* Delete the SPD entry if we generated it
-	 */
-	if (! iph2->generated_spidx )
-		return;
-
-	src = iph2->src;
-	dst = iph2->dst;
-
-	plog(LLV_INFO, LOCATION, NULL,
-		 "generated policy, deleting it.\n");
-		
-	memset(&spidx, 0, sizeof(spidx));
-	iph2->spidx_gen = (caddr_t )&spidx;
-		
-	/* make inbound policy */
-	iph2->src = dst;
-	iph2->dst = src;
-	spidx.dir = IPSEC_DIR_INBOUND;
-	spidx.ul_proto = 0;
-		
-	/* 
-	 * Note: code from get_proposal_r
-	 */
-		
-#define _XIDT(d) ((struct ipsecdoi_id_b *)(d)->v)->type
-		
-	/*
-	 * make destination address in spidx from either ID payload
-	 * or phase 1 address into a address in spidx.
-	 */
-	if (iph2->id != NULL
-		&& (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
-			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR
-			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR_SUBNET
-			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
-		/* get a destination address of a policy */
-		error = ipsecdoi_id2sockaddr(iph2->id,
-									 (struct sockaddr *)&spidx.dst,
-									 &spidx.prefd, &spidx.ul_proto);
-		if (error)
-			goto purge;
-			
-#ifdef INET6
-		/*
-		 * get scopeid from the SA address.
-		 * note that the phase 1 source address is used as
-		 * a destination address to search for a inbound 
-		 * policy entry because rcoon is responder.
-		 */
-		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR) {
-			if ((error = 
-				 setscopeid((struct sockaddr *)&spidx.dst,
-							iph2->src)) != 0)
-				goto purge;
-		}
-#endif
-			
-		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
-			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR)
-			idi2type = _XIDT(iph2->id);
-			
-	} else {
-			
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "get a destination address of SP index "
-			 "from phase1 address "
-			 "due to no ID payloads found "
-			 "OR because ID type is not address.\n");
-			
-		/*
-		 * copy the SOURCE address of IKE into the 
-		 * DESTINATION address of the key to search the 
-		 * SPD because the direction of policy is inbound.
-		 */
-		memcpy(&spidx.dst, iph2->src, sysdep_sa_len(iph2->src));
-		switch (spidx.dst.ss_family) {
-		case AF_INET:
-			spidx.prefd = 
-				sizeof(struct in_addr) << 3;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			spidx.prefd = 
-				sizeof(struct in6_addr) << 3;
-			break;
-#endif
-		default:
-			spidx.prefd = 0;
-			break;
-		}
-	}
-					
-	/* make source address in spidx */
-	if (iph2->id_p != NULL
-		&& (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR
-			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR
-			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR_SUBNET
-			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
-		/* get a source address of inbound SA */
-		error = ipsecdoi_id2sockaddr(iph2->id_p,
-									 (struct sockaddr *)&spidx.src,
-									 &spidx.prefs, &spidx.ul_proto);
-		if (error)
-			goto purge;
-
-#ifdef INET6
-		/*
-		 * get scopeid from the SA address.
-		 * for more detail, see above of this function.
-		 */
-		if (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR) {
-			error = 
-				setscopeid((struct sockaddr *)&spidx.src,
-						   iph2->dst);
-			if (error)
-				goto purge;
-		}
-#endif
-
-		/* make id[src,dst] if both ID types are IP address and same */
-		if (_XIDT(iph2->id_p) == idi2type
-			&& spidx.dst.ss_family == spidx.src.ss_family) {
-			iph2->src_id = 
-				dupsaddr((struct sockaddr *)&spidx.dst);
-			if (iph2->src_id == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					 "allocation failed\n");
-				goto purge;
-			}
-			iph2->dst_id = 
-				dupsaddr((struct sockaddr *)&spidx.src);
-			if (iph2->dst_id == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					 "allocation failed\n");
-				goto purge;
-			}
-		}
-
-	} else {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "get a source address of SP index "
-			 "from phase1 address "
-			 "due to no ID payloads found "
-			 "OR because ID type is not address.\n");
-
-		/* see above comment. */
-		memcpy(&spidx.src, iph2->dst, sysdep_sa_len(iph2->dst));
-		switch (spidx.src.ss_family) {
-		case AF_INET:
-			spidx.prefs = 
-				sizeof(struct in_addr) << 3;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			spidx.prefs = 
-				sizeof(struct in6_addr) << 3;
-			break;
-#endif
-		default:
-			spidx.prefs = 0;
-			break;
-		}
-	}
-
-#undef _XIDT
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		 "get a src address from ID payload "
-		 "%s prefixlen=%u ul_proto=%u\n",
-		 saddr2str((struct sockaddr *)&spidx.src),
-		 spidx.prefs, spidx.ul_proto);
-	plog(LLV_DEBUG, LOCATION, NULL,
-		 "get dst address from ID payload "
-		 "%s prefixlen=%u ul_proto=%u\n",
-		 saddr2str((struct sockaddr *)&spidx.dst),
-		 spidx.prefd, spidx.ul_proto);
-
-	/*
-	 * convert the ul_proto if it is 0
-	 * because 0 in ID payload means a wild card.
-	 */
-	if (spidx.ul_proto == 0)
-		spidx.ul_proto = IPSEC_ULPROTO_ANY;
-
-#undef _XIDT
-
-	/* Check if the generated SPD has the same timestamp as the SA.
-	 * If timestamps are different, this means that the SPD entry has been
-	 * refreshed by another SA, and should NOT be deleted with the current SA.
-	 */
-	if( created ){
-		struct secpolicy *p;
-		
-		p = getsp(&spidx);
-		if(p != NULL){
-			/* just do no test if p is NULL, because this probably just means
-			 * that the policy has already be deleted for some reason.
-			 */
-			if(p->spidx.created != created)
-				goto purge;
-		}
-	}
-
-	/* End of code from get_proposal_r
-	 */
-
-	if (pk_sendspddelete(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			 "pfkey spddelete(inbound) failed.\n");
-	}else{
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "pfkey spddelete(inbound) sent.\n");
-	}
-
-#ifdef HAVE_POLICY_FWD
-	/* make forward policy if required */
-	if (tunnel_mode_prop(iph2->approval)) {
-		spidx.dir = IPSEC_DIR_FWD;
-		if (pk_sendspddelete(iph2) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "pfkey spddelete(forward) failed.\n");
-		}else{
-			plog(LLV_DEBUG, LOCATION, NULL,
-				 "pfkey spddelete(forward) sent.\n");
-		}
-	}
-#endif
-
-	/* make outbound policy */
-	iph2->src = src;
-	iph2->dst = dst;
-	spidx.dir = IPSEC_DIR_OUTBOUND;
-	addr = spidx.src;
-	spidx.src = spidx.dst;
-	spidx.dst = addr;
-	pref = spidx.prefs;
-	spidx.prefs = spidx.prefd;
-	spidx.prefd = pref;
-
-	if (pk_sendspddelete(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			 "pfkey spddelete(outbound) failed.\n");
-	}else{
-		plog(LLV_DEBUG, LOCATION, NULL,
-			 "pfkey spddelete(outbound) sent.\n");
-	}
-purge:
-	iph2->spidx_gen=NULL;
-}
-
-
-#ifdef INET6
-u_int32_t
-setscopeid(sp_addr0, sa_addr0)
-	struct sockaddr *sp_addr0, *sa_addr0;
-{
-	struct sockaddr_in6 *sp_addr, *sa_addr;
-    
-	sp_addr = (struct sockaddr_in6 *)sp_addr0;
-	sa_addr = (struct sockaddr_in6 *)sa_addr0;
-
-	if (!IN6_IS_ADDR_LINKLOCAL(&sp_addr->sin6_addr)
-	 && !IN6_IS_ADDR_SITELOCAL(&sp_addr->sin6_addr)
-	 && !IN6_IS_ADDR_MULTICAST(&sp_addr->sin6_addr))
-		return 0;
-
-	/* this check should not be here ? */
-	if (sa_addr->sin6_family != AF_INET6) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"can't get scope ID: family mismatch\n");
-		return -1;
-	}
-
-	if (!IN6_IS_ADDR_LINKLOCAL(&sa_addr->sin6_addr)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"scope ID is not supported except of lladdr.\n");
-		return -1;
-	}
-
-	sp_addr->sin6_scope_id = sa_addr->sin6_scope_id;
-
-	return 0;
-}
-#endif
diff --git a/src/racoon/isakmp.h b/src/racoon/isakmp.h
deleted file mode 100644
index d0fd242..0000000
--- a/src/racoon/isakmp.h
+++ /dev/null
@@ -1,429 +0,0 @@
-/*	$NetBSD: isakmp.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp.h,v 1.11 2005/04/25 22:19:39 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_H
-#define _ISAKMP_H
-
-/* refer to RFC 2408 */
-
-/* must include <netinet/in.h> first. */
-/* must include "isakmp_var.h" first. */
-
-#define INITIATOR	0	/* synonym sender */
-#define RESPONDER	1	/* synonym receiver */
-
-#define GENERATE	1
-#define VALIDATE	0
-
-/* 3.1 ISAKMP Header Format
-         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !                          Initiator                            !
-        !                            Cookie                             !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !                          Responder                            !
-        !                            Cookie                             !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !  Next Payload ! MjVer ! MnVer ! Exchange Type !     Flags     !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !                          Message ID                           !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !                            Length                             !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-*/
-struct isakmp {
-	cookie_t i_ck;		/* Initiator Cookie */
-	cookie_t r_ck;		/* Responder Cookie */
-	u_int8_t np;		/* Next Payload Type */
-	u_int8_t v;
-	u_int8_t etype;		/* Exchange Type */
-	u_int8_t flags;		/* Flags */
-	u_int32_t msgid;
-	u_int32_t len;		/* Length */
-} __attribute__((__packed__));
-
-/* Next Payload Type */
-#define ISAKMP_NPTYPE_NONE	0	/* NONE*/
-#define ISAKMP_NPTYPE_SA	1	/* Security Association */
-#define ISAKMP_NPTYPE_P		2	/* Proposal */
-#define ISAKMP_NPTYPE_T		3	/* Transform */
-#define ISAKMP_NPTYPE_KE	4	/* Key Exchange */
-#define ISAKMP_NPTYPE_ID	5	/* Identification */
-#define ISAKMP_NPTYPE_CERT	6	/* Certificate */
-#define ISAKMP_NPTYPE_CR	7	/* Certificate Request */
-#define ISAKMP_NPTYPE_HASH	8	/* Hash */
-#define ISAKMP_NPTYPE_SIG	9	/* Signature */
-#define ISAKMP_NPTYPE_NONCE	10	/* Nonce */
-#define ISAKMP_NPTYPE_N		11	/* Notification */
-#define ISAKMP_NPTYPE_D		12	/* Delete */
-#define ISAKMP_NPTYPE_VID	13	/* Vendor ID */
-#define ISAKMP_NPTYPE_ATTR	14	/* Attribute */
-
-
-/* NAT-T draft-ietf-ipsec-nat-t-ike-05 and later */
-/* XXX conflicts with values assigned to RFC 3547 */
-#define ISAKMP_NPTYPE_NATD_BADDRAFT		15	/* NAT Discovery */
-#define ISAKMP_NPTYPE_NATOA_BADDRAFT	16	/* NAT Original Address */
-
-
-/* NAT-T RFC */
-#define ISAKMP_NPTYPE_NATD_RFC	20	/* NAT Discovery */
-#define ISAKMP_NPTYPE_NATOA_RFC	21	/* NAT Original Address */
-
-/* NAT-T up to draft-ietf-ipsec-nat-t-ike-04 */
-#define ISAKMP_NPTYPE_NATD_DRAFT	130	/* NAT Discovery */
-#define ISAKMP_NPTYPE_NATOA_DRAFT	131	/* NAT Original Address */
-
-/* Frag does not seems to be documented */
-#define ISAKMP_NPTYPE_FRAG	132	/* IKE fragmentation payload */
-
-#define ISAKMP_NPTYPE_MAX	17
-			/*	128 - 255 Private Use */
-
-/*
- * The following are valid when the Vendor ID is one of the
- * following:
- *
- *	MD5("A GSS-API Authentication Method for IKE")
- *	MD5("GSSAPI") (recognized by Windows 2000)
- *	MD5("MS NT5 ISAKMPOAKLEY") (sent by Windows 2000)
- *
- * See draft-ietf-ipsec-isakmp-gss-auth-06.txt.
- */
-#define ISAKMP_NPTYPE_GSS	129	/* GSS token */
-
-#define ISAKMP_MAJOR_VERSION	1
-#define ISAKMP_MINOR_VERSION	0
-#define ISAKMP_VERSION_NUMBER	0x10
-#define ISAKMP_GETMAJORV(v)	(((v) & 0xf0) >> 4)
-#define ISAKMP_SETMAJORV(v, m)	((v) = ((v) & 0x0f) | (((m) << 4) & 0xf0))
-#define ISAKMP_GETMINORV(v)	((v) & 0x0f)
-#define ISAKMP_SETMINORV(v, m)	((v) = ((v) & 0xf0) | ((m) & 0x0f))
-
-/* Exchange Type */
-#define ISAKMP_ETYPE_NONE	0	/* NONE */
-#define ISAKMP_ETYPE_BASE	1	/* Base */
-#define ISAKMP_ETYPE_IDENT	2	/* Identity Proteciton */
-#define ISAKMP_ETYPE_AUTH	3	/* Authentication Only */
-#define ISAKMP_ETYPE_AGG	4	/* Aggressive */
-#define ISAKMP_ETYPE_INFO	5	/* Informational */
-#define ISAKMP_ETYPE_CFG	6	/* Mode config */
-/* Additional Exchange Type */
-#define ISAKMP_ETYPE_QUICK	32	/* Quick Mode */
-#define ISAKMP_ETYPE_NEWGRP	33	/* New group Mode */
-#define ISAKMP_ETYPE_ACKINFO	34	/* Acknowledged Informational */
-
-/* Flags */
-#define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
-#define ISAKMP_FLAG_C 0x02 /* Commit Bit */
-#define ISAKMP_FLAG_A 0x04 /* Authentication Only Bit */
-
-/* 3.2 Payload Generic Header
-         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        ! Next Payload  !   RESERVED    !         Payload Length        !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-*/
-struct isakmp_gen {
-	u_int8_t np;		/* Next Payload */
-	u_int8_t reserved;	/* RESERVED, unused, must set to 0 */
-	u_int16_t len;		/* Payload Length */
-} __attribute__((__packed__));
-
-/* 3.3 Data Attributes
-         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        !A!       Attribute Type        !    AF=0  Attribute Length     !
-        !F!                             !    AF=1  Attribute Value      !
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-        .                   AF=0  Attribute Value                       .
-        .                   AF=1  Not Transmitted                       .
-        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-*/
-struct isakmp_data {
-	u_int16_t type;		/* defined by DOI-spec, and Attribute Format */
-	u_int16_t lorv;		/* if f equal 1, Attribute Length */
-				/* if f equal 0, Attribute Value */
-	/* if f equal 1, Attribute Value */
-} __attribute__((__packed__));
-#define ISAKMP_GEN_TLV 0x0000
-#define ISAKMP_GEN_TV  0x8000
-	/* mask for type of attribute format */
-#define ISAKMP_GEN_MASK 0x8000
-
-#if 0
-/* MAY NOT be used, because of being defined in ipsec-doi. */
-/* 3.4 Security Association Payload */
-struct isakmp_pl_sa {
-	struct isakmp_gen h;
-	u_int32_t doi;		/* Domain of Interpretation */
-	u_int32_t sit;		/* Situation */
-} __attribute__((__packed__));
-#endif
-
-/* 3.5 Proposal Payload */
-	/*
-	The value of the next payload field MUST only contain the value "2"
-	or "0".  If there are additional Proposal payloads in the message,
-	then this field will be 2.  If the current Proposal payload is the
-	last within the security association proposal, then this field will
-	be 0.
-	*/
-struct isakmp_pl_p {
-	struct isakmp_gen h;
-	u_int8_t p_no;		/* Proposal # */
-	u_int8_t proto_id;	/* Protocol */
-	u_int8_t spi_size;	/* SPI Size */
-	u_int8_t num_t;		/* Number of Transforms */
-	/* SPI */
-} __attribute__((__packed__));
-
-/* 3.6 Transform Payload */
-	/*
-	The value of the next payload field MUST only contain the value "3"
-	or "0".  If there are additional Transform payloads in the proposal,
-	then this field will be 3.  If the current Transform payload is the
-	last within the proposal, then this field will be 0.
-	*/
-struct isakmp_pl_t {
-	struct isakmp_gen h;
-	u_int8_t t_no;		/* Transform # */
-	u_int8_t t_id;		/* Transform-Id */
-	u_int16_t reserved;	/* RESERVED2 */
-	/* SA Attributes */
-} __attribute__((__packed__));
-
-/* 3.7 Key Exchange Payload */
-struct isakmp_pl_ke {
-	struct isakmp_gen h;
-	/* Key Exchange Data */
-} __attribute__((__packed__));
-
-#if 0
-/* NOTE: MUST NOT use because of being defined in ipsec-doi instead them. */
-/* 3.8 Identification Payload */
-struct isakmp_pl_id {
-	struct isakmp_gen h;
-	union {
-		u_int8_t id_type;	/* ID Type */
-		u_int32_t doi_data;	/* DOI Specific ID Data */
-	} d;
-	/* Identification Data */
-} __attribute__((__packed__));
-/* A.4 ISAKMP Identification Type Values */
-#define ISAKMP_ID_IPV4_ADDR		0
-#define ISAKMP_ID_IPV4_ADDR_SUBNET	1
-#define ISAKMP_ID_IPV6_ADDR		2
-#define ISAKMP_ID_IPV6_ADDR_SUBNET	3
-#endif
-
-/* 3.9 Certificate Payload */
-struct isakmp_pl_cert {
-	struct isakmp_gen h;
-	/*
-	 * Encoding type of 1 octet follows immediately,
-	 * variable length CERT data follows encoding type.
-	 */
-} __attribute__((__packed__));
-
-/* Certificate Type */
-#define ISAKMP_CERT_NONE	0
-#define ISAKMP_CERT_PKCS7	1
-#define ISAKMP_CERT_PGP		2
-#define ISAKMP_CERT_DNS		3
-#define ISAKMP_CERT_X509SIGN	4
-#define ISAKMP_CERT_X509KE	5
-#define ISAKMP_CERT_KERBEROS	6
-#define ISAKMP_CERT_CRL		7
-#define ISAKMP_CERT_ARL		8
-#define ISAKMP_CERT_SPKI	9
-#define ISAKMP_CERT_X509ATTR	10
-#define ISAKMP_CERT_PLAINRSA	11
-
-/* the method to get peers certificate */
-#define ISAKMP_GETCERT_PAYLOAD		1
-#define ISAKMP_GETCERT_LOCALFILE	2
-#define ISAKMP_GETCERT_DNS		3
-
-/* 3.10 Certificate Request Payload */
-struct isakmp_pl_cr {
-	struct isakmp_gen h;
-	u_int8_t num_cert; /* # Cert. Types */
-	/*
-	Certificate Types (variable length)
-	  -- Contains a list of the types of certificates requested,
-	  sorted in order of preference.  Each individual certificate
-	  type is 1 octet.  This field is NOT required.
-	*/
-	/* # Certificate Authorities (1 octet) */
-	/* Certificate Authorities (variable length) */
-} __attribute__((__packed__));
-
-/* 3.11 Hash Payload */
-struct isakmp_pl_hash {
-	struct isakmp_gen h;
-	/* Hash Data */
-} __attribute__((__packed__));
-
-/* 3.12 Signature Payload */
-struct isakmp_pl_sig {
-	struct isakmp_gen h;
-	/* Signature Data */
-} __attribute__((__packed__));
-
-/* 3.13 Nonce Payload */
-struct isakmp_pl_nonce {
-	struct isakmp_gen h;
-	/* Nonce Data */
-} __attribute__((__packed__));
-
-/* 3.14 Notification Payload */
-struct isakmp_pl_n {
-	struct isakmp_gen h;
-	u_int32_t doi;		/* Domain of Interpretation */
-	u_int8_t proto_id;	/* Protocol-ID */
-	u_int8_t spi_size;	/* SPI Size */
-	u_int16_t type;		/* Notify Message Type */
-	/* SPI */
-	/* Notification Data */
-} __attribute__((__packed__));
-
-/* 3.14.1 Notify Message Types */
-/* NOTIFY MESSAGES - ERROR TYPES */
-#define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE	1
-#define ISAKMP_NTYPE_DOI_NOT_SUPPORTED		2
-#define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED	3
-#define ISAKMP_NTYPE_INVALID_COOKIE		4
-#define ISAKMP_NTYPE_INVALID_MAJOR_VERSION	5
-#define ISAKMP_NTYPE_INVALID_MINOR_VERSION	6
-#define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE	7
-#define ISAKMP_NTYPE_INVALID_FLAGS		8
-#define ISAKMP_NTYPE_INVALID_MESSAGE_ID		9
-#define ISAKMP_NTYPE_INVALID_PROTOCOL_ID	10
-#define ISAKMP_NTYPE_INVALID_SPI		11
-#define ISAKMP_NTYPE_INVALID_TRANSFORM_ID	12
-#define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED	13
-#define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN		14
-#define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX	15
-#define ISAKMP_NTYPE_PAYLOAD_MALFORMED		16
-#define ISAKMP_NTYPE_INVALID_KEY_INFORMATION	17
-#define ISAKMP_NTYPE_INVALID_ID_INFORMATION	18
-#define ISAKMP_NTYPE_INVALID_CERT_ENCODING	19
-#define ISAKMP_NTYPE_INVALID_CERTIFICATE	20
-#define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX	21
-#define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY	22
-#define ISAKMP_NTYPE_INVALID_HASH_INFORMATION	23
-#define ISAKMP_NTYPE_AUTHENTICATION_FAILED	24
-#define ISAKMP_NTYPE_INVALID_SIGNATURE		25
-#define ISAKMP_NTYPE_ADDRESS_NOTIFICATION	26
-#define ISAKMP_NTYPE_NOTIFY_SA_LIFETIME		27
-#define ISAKMP_NTYPE_CERTIFICATE_UNAVAILABLE	28
-#define ISAKMP_NTYPE_UNSUPPORTED_EXCHANGE_TYPE	29
-#define ISAKMP_NTYPE_UNEQUAL_PAYLOAD_LENGTHS	30
-#define ISAKMP_NTYPE_MINERROR			1
-#define ISAKMP_NTYPE_MAXERROR			16383
-/* NOTIFY MESSAGES - STATUS TYPES */
-#define ISAKMP_NTYPE_CONNECTED			16384
-/* 4.6.3 IPSEC DOI Notify Message Types */
-#define ISAKMP_NTYPE_RESPONDER_LIFETIME		24576
-#define ISAKMP_NTYPE_REPLAY_STATUS		24577
-#define ISAKMP_NTYPE_INITIAL_CONTACT		24578
-
-/* DPD */
-#define ISAKMP_NTYPE_R_U_THERE			36136
-#define ISAKMP_NTYPE_R_U_THERE_ACK		36137
-
-#define ISAKMP_NTYPE_HEARTBEAT			40503
-
-/* using only to log */
-#define ISAKMP_LOG_RETRY_LIMIT_REACHED		65530
-
-/* XXX means internal error but it's not reserved by any drafts... */
-#define ISAKMP_INTERNAL_ERROR			-1
-
-/* 3.15 Delete Payload */
-struct isakmp_pl_d {
-	struct isakmp_gen h;
-	u_int32_t doi;		/* Domain of Interpretation */
-	u_int8_t proto_id;	/* Protocol-Id */
-	u_int8_t spi_size;	/* SPI Size */
-	u_int16_t num_spi;	/* # of SPIs */
-	/* SPI(es) */
-} __attribute__((__packed__));
-
-struct payload_list {
-	struct payload_list	*next, *prev;
-	vchar_t			*payload;
-	int			payload_type;
-};
-
-
-/* See draft-ietf-ipsec-isakmp-mode-cfg-04.txt, 3.2 */
-struct isakmp_pl_attr {
-	struct isakmp_gen h;
-	u_int8_t type;		/* Exchange type */
-	u_int8_t res2;
-	u_int16_t id;		/* Per transaction id */
-} __attribute__((__packed__));
-            
-/* Exchange type */
-#define ISAKMP_CFG_REQUEST	1
-#define ISAKMP_CFG_REPLY	2
-#define ISAKMP_CFG_SET		3
-#define ISAKMP_CFG_ACK		4
-
-/* IKE fragmentation payload */
-struct isakmp_frag {
-	u_int16_t unknown0;	/* always set to zero? */
-	u_int16_t len;
-	u_int16_t unknown1;	/* always set to 1? */
-	u_int8_t index;
-	u_int8_t flags;
-} __attribute__((__packed__)); 
-
-/* flags */
-#define ISAKMP_FRAG_LAST	1
-
-/* DPD R-U-THERE / R-U-THERE-ACK Payload */
-struct isakmp_pl_ru {
-	struct isakmp_gen h;
-	u_int32_t doi;		/* Domain of Interpretation */
-	u_int8_t proto_id;	/* Protocol-Id */
-	u_int8_t spi_size;	/* SPI Size */
-	u_int16_t type;		/* Notify type */
-	cookie_t  i_ck;	/* Initiator Cookie */
-	cookie_t r_ck;	/* Responder cookie*/
-	u_int32_t data;		/* Notification data */
-} __attribute__((__packed__));
-
-#endif /* _ISAKMP_H */
diff --git a/src/racoon/isakmp_agg.c b/src/racoon/isakmp_agg.c
deleted file mode 100644
index d9b89d9..0000000
--- a/src/racoon/isakmp_agg.c
+++ /dev/null
@@ -1,1489 +0,0 @@
-/*	$NetBSD: isakmp_agg.c,v 1.9 2006/09/30 21:49:37 manu Exp $	*/
-
-/* Id: isakmp_agg.c,v 1.28 2006/04/06 16:46:08 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* Aggressive Exchange (Aggressive Mode) */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "evt.h"
-#include "oakley.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "isakmp_agg.h"
-#include "isakmp_inf.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-#ifdef ENABLE_FRAG
-#include "isakmp_frag.h"
-#endif
-#include "vendorid.h"
-#include "strnames.h"
-
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-
-#ifdef HAVE_GSSAPI
-#include "gssapi.h"
-#endif
-
-/*
- * begin Aggressive Mode as initiator.
- */
-/*
- * send to responder
- * 	psk: HDR, SA, KE, Ni, IDi1
- * 	sig: HDR, SA, KE, Ni, IDi1 [, CR ]
- *   gssapi: HDR, SA, KE, Ni, IDi1, GSSi
- * 	rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
- * 	rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
- * 	     <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
- */
-int
-agg_i1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg; /* must be null */
-{
-	struct payload_list *plist = NULL;
-	int need_cr = 0;
-	vchar_t *cr = NULL; 
-	int error = -1;
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt[MAX_NATT_VID_COUNT] = { NULL };
-	int i;
-#endif
-#ifdef ENABLE_HYBRID
-	vchar_t *vid_xauth = NULL;
-	vchar_t *vid_unity = NULL;
-#endif
-#ifdef ENABLE_FRAG
-	vchar_t *vid_frag = NULL;
-#endif
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-	int len;
-#endif
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif
-
-
-	/* validity check */
-	if (msg != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"msg has to be NULL in this function.\n");
-		goto end;
-	}
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* create isakmp index */
-	memset(&iph1->index, 0, sizeof(iph1->index));
-	isakmp_newcookie((caddr_t)&iph1->index, iph1->remote, iph1->local);
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-	/* create SA payload for my proposal */
-	iph1->sa = ipsecdoi_setph1proposal(iph1->rmconf->proposal);
-	if (iph1->sa == NULL)
-		goto end;
-
-	/* consistency check of proposals */
-	if (iph1->rmconf->dhgrp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"configuration failure about DH group.\n");
-		goto end;
-	}
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->rmconf->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-#ifdef ENABLE_HYBRID
-	/* Do we need Xauth VID? */
-	switch (RMAUTHMETHOD(iph1)) {
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-		if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL)
-			plog(LLV_ERROR, LOCATION, NULL, 
-			     "Xauth vendor ID generation failed\n");
-		if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL)
-			plog(LLV_ERROR, LOCATION, NULL, 
-			     "Unity vendor ID generation failed\n");
-		break;
-	default:
-		break;
-	}
-#endif
-
-#ifdef ENABLE_FRAG
-	if (iph1->rmconf->ike_frag) {
-		vid_frag = set_vendorid(VENDORID_FRAG);
-		if (vid_frag != NULL)
-			vid_frag = isakmp_frag_addcap(vid_frag,
-			    VENDORID_FRAG_AGG);
-		if (vid_frag == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Frag vendorID construction failed\n");
-	}		
-#endif
-
-	/* create CR if need */
-	if (iph1->rmconf->send_cr
-	 && oakley_needcr(iph1->rmconf->proposal->authmethod)
-	 && iph1->rmconf->peerscertfile == NULL) {
-		need_cr = 1;
-		cr = oakley_getcr(iph1);
-		if (cr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get cr buffer.\n");
-			goto end;
-		}
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "authmethod is %s\n",
-		s_oakley_attr_method(iph1->rmconf->proposal->authmethod));
-#ifdef HAVE_GSSAPI
-	if (RMAUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB)
-		gssapi_get_itoken(iph1, &len);
-#endif
-
-	/* set SA payload to propose */
-	plist = isakmp_plist_append(plist, iph1->sa, ISAKMP_NPTYPE_SA);
-
-	/* create isakmp KE payload */
-	plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-	/* create isakmp NONCE payload */
-	plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-	/* create isakmp ID payload */
-	plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-
-#ifdef HAVE_GSSAPI
-	if (RMAUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
-		gssapi_get_token_to_send(iph1, &gsstoken);
-		plist = isakmp_plist_append(plist, gsstoken, ISAKMP_NPTYPE_GSS);
-	}
-#endif
-	/* create isakmp CR payload */
-	if (need_cr)
-		plist = isakmp_plist_append(plist, cr, ISAKMP_NPTYPE_CR);
-
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		plist = isakmp_plist_append(plist, vid_frag, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_NATT
-	/* 
-	 * set VID payload for NAT-T if NAT-T 
-	 * support allowed in the config file 
-	 */
-	if (iph1->rmconf->nat_traversal) 
-		plist = isakmp_plist_append_natt_vids(plist, vid_natt);
-#endif
-#ifdef ENABLE_HYBRID
-	if (vid_xauth)
-		plist = isakmp_plist_append(plist, 
-		    vid_xauth, ISAKMP_NPTYPE_VID);
-	if (vid_unity)
-		plist = isakmp_plist_append(plist, 
-		    vid_unity, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_DPD
-	if(iph1->rmconf->dpd){
-		vid_dpd = set_vendorid(VENDORID_DPD);
-		if (vid_dpd != NULL)
-			plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-	if (cr)
-		vfree(cr);
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		vfree(vid_frag);
-#endif
-#ifdef ENABLE_NATT
-	for (i = 0; i < MAX_NATT_VID_COUNT && vid_natt[i] != NULL; i++)
-		vfree(vid_natt[i]);
-#endif
-#ifdef ENABLE_HYBRID
-	if (vid_xauth != NULL)
-		vfree(vid_xauth);
-	if (vid_unity != NULL)
-		vfree(vid_unity);
-#endif
-#ifdef ENABLE_DPD
-	if (vid_dpd != NULL)
-		vfree(vid_dpd);
-#endif
-
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR, SA, KE, Nr, IDr1, HASH_R
- * 	sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
- *   gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
- * 	rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
- * 	rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
- */
-int
-agg_i2recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	vchar_t *satmp = NULL;
-	int error = -1;
-	int vid_numeric;
-	int ptype;
-#ifdef ENABLE_HYBRID
-	vchar_t *unity_vid;
-	vchar_t *xauth_vid;
-#endif
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-
-#ifdef ENABLE_NATT
-	int natd_seq = 0;
-	struct natd_payload {
-		int seq;
-		vchar_t *payload;
-		TAILQ_ENTRY(natd_payload) chain;
-	};
-	TAILQ_HEAD(_natd_payload, natd_payload) natd_tree;
-	TAILQ_INIT(&natd_tree);
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	iph1->pl_hash = NULL;
-
-	/* SA payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-
-	if (isakmp_p2ph(&satmp, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_CR:
-			if (oakley_savecr(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph1);
-			break;
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
-			    pa->type == iph1->natt_options->payload_nat_d) {
-				struct natd_payload *natd;
-				natd = (struct natd_payload *)racoon_malloc(sizeof(*natd));
-				if (!natd)
-					goto end;
-
-				natd->payload = NULL;
-
-				if (isakmp_p2ph (&natd->payload, pa->ptr) < 0)
-					goto end;
-
-				natd->seq = natd_seq++;
-
-				TAILQ_INSERT_TAIL(&natd_tree, natd, chain);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see isakmp_ident_r1() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(satmp, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-	VPTRINIT(iph1->sa_ret);
-
-	/* fix isakmp index */
-	memcpy(&iph1->index.r_ck, &((struct isakmp *)msg->v)->r_ck,
-		sizeof(cookie_t));
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1)) {
-		struct natd_payload *natd = NULL;
-		int natd_verified;
-		
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-
-		/* set both bits first so that we can clear them
-		   upon verifying hashes */
-		iph1->natt_flags |= NAT_DETECTED;
-                        
-		while ((natd = TAILQ_FIRST(&natd_tree)) != NULL) {
-			/* this function will clear appropriate bits bits 
-			   from iph1->natt_flags */
-			natd_verified = natt_compare_addr_hash (iph1,
-				natd->payload, natd->seq);
-
-			plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-				natd->seq - 1,
-				natd_verified ? "verified" : "doesn't match");
-			
-			vfree (natd->payload);
-
-			TAILQ_REMOVE(&natd_tree, natd, chain);
-			racoon_free (natd);
-		}
-
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-
-		if (iph1->natt_flags & NAT_DETECTED)
-			natt_float_ports (iph1);
-	}
-#endif
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->rmconf->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid(iph1) < 0)
-		goto end;
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-	/* validate authentication value */
-	ptype = oakley_validate_auth(iph1);
-	if (ptype != 0) {
-		if (ptype == -1) {
-			/* message printed inner oakley_validate_auth() */
-			goto end;
-		}
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEERPH1AUTH_FAILED, NULL);
-		isakmp_info_send_n1(iph1, ptype, NULL);
-		goto end;
-	}
-
-	if (oakley_checkcr(iph1) < 0) {
-		/* Ignore this error in order to be interoperability. */
-		;
-	}
-
-	/* change status of isakmp status entry */
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-	if (pbuf)
-		vfree(pbuf);
-	if (satmp)
-		vfree(satmp);
-	if (error) {
-		VPTRINIT(iph1->dhpub_p);
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-		oakley_delcert(iph1->cr_p);
-		iph1->cr_p = NULL;
-	}
-
-	return error;
-}
-
-/*
- * send to responder
- * 	psk: HDR, HASH_I
- *   gssapi: HDR, HASH_I
- * 	sig: HDR, [ CERT, ] SIG_I
- * 	rsa: HDR, HASH_I
- * 	rev: HDR, HASH_I
- */
-int
-agg_i2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	int need_cert = 0;
-	int error = -1;
-	vchar_t *gsshash = NULL;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* generate HASH to send */
-	plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_I\n");
-	iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
-	if (iph1->hash == NULL) {
-#ifdef HAVE_GSSAPI
-		if (gssapi_more_tokens(iph1) &&
-#ifdef ENABLE_HYBRID
-		    !iph1->rmconf->xauth &&
-#endif
-		    1)
-			isakmp_info_send_n1(iph1,
-			    ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE, NULL);
-#endif
-		goto end;
-	}
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-#endif  
-		/* set HASH payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->hash, ISAKMP_NPTYPE_HASH);
-		break;
-
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-#endif
-		/* XXX if there is CR or not ? */
-
-		if (oakley_getmycert(iph1) < 0)
-			goto end;
-
-		if (oakley_getsign(iph1) < 0)
-			goto end;
-
-		if (iph1->cert != NULL && iph1->rmconf->send_cert)
-			need_cert = 1;
-
-		/* add CERT payload if there */
-		if (need_cert)
-			plist = isakmp_plist_append(plist, 
-			    iph1->cert->pl, ISAKMP_NPTYPE_CERT);
-
-		/* add SIG payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sig, ISAKMP_NPTYPE_SIG);
-		break;
-
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-#endif
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		gsshash = gssapi_wraphash(iph1);
-		if (gsshash == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to wrap hash\n");
-			isakmp_info_send_n1(iph1,
-				ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE, NULL);
-			goto end;
-		}
-
-		plist = isakmp_plist_append(plist, 
-		    gsshash, ISAKMP_NPTYPE_HASH);
-		break;
-#endif
-	}
-
-#ifdef ENABLE_NATT
-	/* generate NAT-D payloads */
-	if (NATT_AVAILABLE(iph1)) {
-		vchar_t *natd[2] = { NULL, NULL };
-
-		plog(LLV_INFO, LOCATION, 
-		    NULL, "Adding remote and local NAT-D payloads.\n");
-
-		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "NAT-D hashing failed for %s\n", 
-			    saddr2str(iph1->remote));
-			goto end;
-		}
-
-		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "NAT-D hashing failed for %s\n", 
-			    saddr2str(iph1->local));
-			goto end;
-		}
-
-		plist = isakmp_plist_append(plist, 
-		    natd[0], iph1->natt_options->payload_nat_d);
-		plist = isakmp_plist_append(plist, 
-		    natd[1], iph1->natt_options->payload_nat_d);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send to responder */
-	if (isakmp_send(iph1, iph1->sendbuf) < 0)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-	if (gsshash)
-		vfree(gsshash);
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, SA, KE, Ni, IDi1
- * 	sig: HDR, SA, KE, Ni, IDi1 [, CR ]
- *   gssapi: HDR, SA, KE, Ni, IDi1 , GSSi
- * 	rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
- * 	rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
- * 	     <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
- */
-int
-agg_r1recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int vid_numeric;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* SA payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-	if (isakmp_p2ph(&iph1->sa, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"received payload of type %s\n",
-			s_isakmp_nptype(pa->type));
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			vid_numeric = handle_vendorid(iph1, pa->ptr);
-#ifdef ENABLE_FRAG
-			if ((vid_numeric == VENDORID_FRAG) &&
-			    (vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_AGG))
-				iph1->frag = 1;
-#endif
-			break;
-
-		case ISAKMP_NPTYPE_CR:
-			if (oakley_savecr(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-		default:
-			/* don't send information, see isakmp_ident_r1() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-#endif
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(iph1->sa, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-
-	if (oakley_checkcr(iph1) < 0) {
-		/* Ignore this error in order to be interoperability. */
-		;
-	}
-
-	iph1->status = PHASE1ST_MSG1RECEIVED;
-
-	error = 0;
-
-end:
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-	if (pbuf)
-		vfree(pbuf);
-	if (error) {
-		VPTRINIT(iph1->sa);
-		VPTRINIT(iph1->dhpub_p);
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-		oakley_delcert(iph1->cr_p);
-		iph1->cr_p = NULL;
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR, SA, KE, Nr, IDr1, HASH_R
- * 	sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
- *   gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
- * 	rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
- * 	rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
- */
-int
-agg_r1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	int need_cr = 0;
-	int need_cert = 0;
-	vchar_t *cr = NULL;
-	int error = -1;
-#ifdef ENABLE_HYBRID
-	vchar_t *xauth_vid = NULL;
-	vchar_t *unity_vid = NULL;
-#endif
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt = NULL;
-	vchar_t *natd[2] = { NULL, NULL };
-#endif
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif
-#ifdef ENABLE_FRAG
-	vchar_t *vid_frag = NULL;
-#endif
-
-#ifdef HAVE_GSSAPI
-	int gsslen;
-	vchar_t *gsstoken = NULL, *gsshash = NULL;
-	vchar_t *gss_sa = NULL;
-	int free_gss_sa = 0;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* set responder's cookie */
-	isakmp_newcookie((caddr_t)&iph1->index.r_ck, iph1->remote, iph1->local);
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->rmconf->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid(iph1) < 0)
-		goto end;
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-#ifdef HAVE_GSSAPI
-	if (RMAUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB)
-		gssapi_get_rtoken(iph1, &gsslen);
-#endif
-
-	/* generate HASH to send */
-	plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_R\n");
-	iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
-	if (iph1->hash == NULL) {
-#ifdef HAVE_GSSAPI
-		if (gssapi_more_tokens(iph1))
-			isakmp_info_send_n1(iph1,
-			    ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE, NULL);
-#endif
-		goto end;
-	}
-
-	/* create CR if need */
-	if (iph1->rmconf->send_cr
-	 && oakley_needcr(iph1->approval->authmethod)
-	 && iph1->rmconf->peerscertfile == NULL) {
-		need_cr = 1;
-		cr = oakley_getcr(iph1);
-		if (cr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get cr buffer.\n");
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	/* Has the peer announced NAT-T? */
-	if (NATT_AVAILABLE(iph1)) {
-	  	/* set chosen VID */
-		vid_natt = set_vendorid(iph1->natt_options->version);
-
-		/* generate NAT-D payloads */
-		plog (LLV_INFO, LOCATION, NULL, "Adding remote and local NAT-D payloads.\n");
-		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->remote));
-			goto end;
-		}
-
-		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->local));
-			goto end;
-		}
-	}
-#endif
-#ifdef ENABLE_DPD
-	/* Only send DPD support if remote announced DPD and if DPD support is active */
-	if (iph1->dpd_support && iph1->rmconf->dpd)
-		vid_dpd = set_vendorid(VENDORID_DPD);
-#endif
-#ifdef ENABLE_FRAG
-	if (iph1->frag) {
-		vid_frag = set_vendorid(VENDORID_FRAG);
-		if (vid_frag != NULL)
-			vid_frag = isakmp_frag_addcap(vid_frag,
-			    VENDORID_FRAG_AGG);
-		if (vid_frag == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Frag vendorID construction failed\n");
-	}
-#endif
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-		/* set SA payload to reply */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sa_ret, ISAKMP_NPTYPE_SA);
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* create isakmp NONCE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-		/* create isakmp ID payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->id, ISAKMP_NPTYPE_ID);
-
-		/* create isakmp HASH payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->hash, ISAKMP_NPTYPE_HASH);
-
-		/* create isakmp CR payload if needed */
-		if (need_cr)
-			plist = isakmp_plist_append(plist, 
-			    cr, ISAKMP_NPTYPE_CR);
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-		/* XXX if there is CR or not ? */
-
-		if (oakley_getmycert(iph1) < 0)
-			goto end;
-
-		if (oakley_getsign(iph1) < 0)
-			goto end;
-
-		if (iph1->cert != NULL && iph1->rmconf->send_cert)
-			need_cert = 1;
-
-		/* set SA payload to reply */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sa_ret, ISAKMP_NPTYPE_SA);
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* create isakmp NONCE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-		/* add ID payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->id, ISAKMP_NPTYPE_ID);
-
-		/* add CERT payload if there */
-		if (need_cert)
-			plist = isakmp_plist_append(plist, 
-			    iph1->cert->pl, ISAKMP_NPTYPE_CERT);
-
-		/* add SIG payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sig, ISAKMP_NPTYPE_SIG);
-
-		/* create isakmp CR payload if needed */
-		if (need_cr)
-			plist = isakmp_plist_append(plist, 
-			    cr, ISAKMP_NPTYPE_CR);
-		break;
-
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-			/* create buffer to send isakmp payload */
-			gsshash = gssapi_wraphash(iph1);
-			if (gsshash == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to wrap hash\n");
-				/*
-				 * This is probably due to the GSS 
-				 * roundtrips not being finished yet. 
-				 * Return this error in the hope that 
-				 * a fallback to main mode will be done.
-				 */
-				isakmp_info_send_n1(iph1,
-				    ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE, NULL);
-				goto end;
-			}
-			if (iph1->approval->gssid != NULL)
-				gss_sa = 
-				    ipsecdoi_setph1proposal(iph1->approval);  
-			else
-				gss_sa = iph1->sa_ret;
-
-			if (gss_sa != iph1->sa_ret)
-				free_gss_sa = 1;
-
-			/* set SA payload to reply */
-			plist = isakmp_plist_append(plist, 
-			    gss_sa, ISAKMP_NPTYPE_SA);
-
-			/* create isakmp KE payload */
-			plist = isakmp_plist_append(plist, 
-			    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-			/* create isakmp NONCE payload */
-			plist = isakmp_plist_append(plist, 
-			    iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-			/* create isakmp ID payload */
-			plist = isakmp_plist_append(plist, 
-			    iph1->id, ISAKMP_NPTYPE_ID);
-
-			/* create GSS payload */
-			gssapi_get_token_to_send(iph1, &gsstoken);
-			plist = isakmp_plist_append(plist, 
-			    gsstoken, ISAKMP_NPTYPE_GSS);
-
-			/* create isakmp HASH payload */
-			plist = isakmp_plist_append(plist, 
-			    gsshash, ISAKMP_NPTYPE_HASH);
-
-			/* append vendor id, if needed */
-			break;
-#endif
-	}
-
-#ifdef ENABLE_HYBRID
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
-		plog (LLV_INFO, LOCATION, NULL, "Adding xauth VID payload.\n");
-		if ((xauth_vid = set_vendorid(VENDORID_XAUTH)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Xauth vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist, 
-		    xauth_vid, ISAKMP_NPTYPE_VID);
-	}
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) {
-		if ((unity_vid = set_vendorid(VENDORID_UNITY)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Unity vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist, 
-		    unity_vid, ISAKMP_NPTYPE_VID);
-	}
-#endif
-
-#ifdef ENABLE_NATT
-	/* append NAT-T payloads */
-	if (vid_natt) {
-		/* chosen VID */
-		plist = isakmp_plist_append(plist, vid_natt, ISAKMP_NPTYPE_VID);
-		/* NAT-D */
-		plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
-		plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
-	}
-#endif
-
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		plist = isakmp_plist_append(plist, vid_frag, ISAKMP_NPTYPE_VID);
-#endif
-
-#ifdef ENABLE_DPD
-	if (vid_dpd)
-		plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID);
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 1);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-	if (cr)
-		vfree(cr);
-#ifdef ENABLE_HYBRID
-	if (xauth_vid)
-		vfree(xauth_vid);
-	if (unity_vid)
-		vfree(unity_vid);
-#endif
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-	if (gsshash)
-		vfree(gsshash);
-	if (free_gss_sa)
-		vfree(gss_sa);
-#endif
-#ifdef ENABLE_DPD
-	if (vid_dpd)
-		vfree(vid_dpd);
-#endif
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		vfree(vid_frag);
-#endif
-
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, HASH_I
- *   gssapi: HDR, HASH_I
- * 	sig: HDR, [ CERT, ] SIG_I
- * 	rsa: HDR, HASH_I
- * 	rev: HDR, HASH_I
- */
-int
-agg_r2recv(iph1, msg0)
-	struct ph1handle *iph1;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int ptype;
-
-#ifdef ENABLE_NATT
-	int natd_seq = 0;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* decrypting if need. */
-	/* XXX configurable ? */
-	if (ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		msg = oakley_do_decrypt(iph1, msg0,
-					iph1->ivm->iv, iph1->ivm->ive);
-		if (msg == NULL)
-			goto end;
-	} else
-		msg = vdup(msg0);
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	iph1->pl_hash = NULL;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph1);
-			break;
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
-				pa->type == iph1->natt_options->payload_nat_d)
-			{
-				vchar_t *natd_received = NULL;
-				int natd_verified;
-				
-				if (isakmp_p2ph (&natd_received, pa->ptr) < 0)
-					goto end;
-				
-				if (natd_seq == 0)
-					iph1->natt_flags |= NAT_DETECTED;
-				
-				natd_verified = natt_compare_addr_hash (iph1,
-					natd_received, natd_seq++);
-				
-				plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-					natd_seq - 1,
-					natd_verified ? "verified" : "doesn't match");
-				
-				vfree (natd_received);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see isakmp_ident_r1() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-#endif
-
-	/* validate authentication value */
-	ptype = oakley_validate_auth(iph1);
-	if (ptype != 0) {
-		if (ptype == -1) {
-			/* message printed inner oakley_validate_auth() */
-			goto end;
-		}
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEERPH1AUTH_FAILED, NULL);
-		isakmp_info_send_n1(iph1, ptype, NULL);
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (msg)
-		vfree(msg);
-	if (error) {
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-	}
-
-	return error;
-}
-
-/*
- * status update and establish isakmp sa.
- */
-int
-agg_r2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* IV synchronized when packet encrypted. */
-	/* see handler.h about IV synchronization. */
-	if (ISSET(((struct isakmp *)msg->v)->flags, ISAKMP_FLAG_E))
-		memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->iv->l);
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-	return error;
-}
diff --git a/src/racoon/isakmp_agg.h b/src/racoon/isakmp_agg.h
deleted file mode 100644
index 89645eb..0000000
--- a/src/racoon/isakmp_agg.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*	$NetBSD: isakmp_agg.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_agg.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_AGG_H
-#define _ISAKMP_AGG_H
-
-extern int agg_i1send __P((struct ph1handle *, vchar_t *));
-extern int agg_i2recv __P((struct ph1handle *, vchar_t *));
-extern int agg_i2send __P((struct ph1handle *, vchar_t *));
-
-extern int agg_r1recv __P((struct ph1handle *, vchar_t *));
-extern int agg_r1send __P((struct ph1handle *, vchar_t *));
-extern int agg_r2recv __P((struct ph1handle *, vchar_t *));
-extern int agg_r2send __P((struct ph1handle *, vchar_t *));
-
-#endif /* _ISAKMP_AGG_H */
diff --git a/src/racoon/isakmp_base.c b/src/racoon/isakmp_base.c
deleted file mode 100644
index 308c3e3..0000000
--- a/src/racoon/isakmp_base.c
+++ /dev/null
@@ -1,1407 +0,0 @@
-/*	$NetBSD: isakmp_base.c,v 1.7 2006/10/02 21:51:33 manu Exp $	*/
-
-/*	$KAME: isakmp_base.c,v 1.49 2003/11/13 02:30:20 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* Base Exchange (Base Mode) */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "evt.h"
-#include "oakley.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "isakmp_base.h"
-#include "isakmp_inf.h"
-#include "vendorid.h"
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-#ifdef ENABLE_FRAG
-#include "isakmp_frag.h"
-#endif
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-
-/* %%%
- * begin Identity Protection Mode as initiator.
- */
-/*
- * send to responder
- * 	psk: HDR, SA, Idii, Ni_b
- * 	sig: HDR, SA, Idii, Ni_b
- * 	rsa: HDR, SA, [HASH(1),] <IDii_b>Pubkey_r, <Ni_b>Pubkey_r
- * 	rev: HDR, SA, [HASH(1),] <Ni_b>Pubkey_r, <IDii_b>Ke_i
- */
-int
-base_i1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg; /* must be null */
-{
-	struct payload_list *plist = NULL;
-	int error = -1;
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt[MAX_NATT_VID_COUNT] = { NULL };
-	int i, vid_natt_i = 0;
-#endif
-#ifdef ENABLE_FRAG
-	vchar_t *vid_frag = NULL;
-#endif
-#ifdef ENABLE_HYBRID
-	vchar_t *vid_xauth = NULL;
-	vchar_t *vid_unity = NULL;
-#endif
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif
-
-
-	/* validity check */
-	if (msg != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"msg has to be NULL in this function.\n");
-		goto end;
-	}
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* create isakmp index */
-	memset(&iph1->index, 0, sizeof(iph1->index));
-	isakmp_newcookie((caddr_t)&iph1->index, iph1->remote, iph1->local);
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-	/* create SA payload for my proposal */
-	iph1->sa = ipsecdoi_setph1proposal(iph1->rmconf->proposal);
-	if (iph1->sa == NULL)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-#ifdef ENABLE_HYBRID
-        /* Do we need Xauth VID? */
-        switch (RMAUTHMETHOD(iph1)) {
-        case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-        case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-        case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-                if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL)
-                        plog(LLV_ERROR, LOCATION, NULL,
-                             "Xauth vendor ID generation failed\n");
-
-                if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL)
-                        plog(LLV_ERROR, LOCATION, NULL,
-                             "Unity vendor ID generation failed\n");
-                break;
-        default:
-                break;
-        }
-#endif
-#ifdef ENABLE_FRAG
-	if (iph1->rmconf->ike_frag) {
-		vid_frag = set_vendorid(VENDORID_FRAG);
-		if (vid_frag != NULL)
-			vid_frag = isakmp_frag_addcap(vid_frag, 
-			    VENDORID_FRAG_BASE);
-		if (vid_frag == NULL)
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Frag vendorID construction failed\n");
-	}
-#endif
-#ifdef ENABLE_NATT
-	/* Is NAT-T support allowed in the config file? */
-	if (iph1->rmconf->nat_traversal) {
-		/* Advertise NAT-T capability */
-		memset (vid_natt, 0, sizeof (vid_natt));
-#ifdef VENDORID_NATT_00
-		if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_00)) != NULL)
-			vid_natt_i++;
-#endif
-#ifdef VENDORID_NATT_02
-		if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_02)) != NULL)
-			vid_natt_i++;
-#endif
-#ifdef VENDORID_NATT_02_N
-		if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_02_N)) != NULL)
-			vid_natt_i++;
-#endif
-#ifdef VENDORID_NATT_RFC
-		if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_RFC)) != NULL)
-			vid_natt_i++;
-#endif
-	}
-#endif
-
-	/* set SA payload to propose */
-	plist = isakmp_plist_append(plist, iph1->sa, ISAKMP_NPTYPE_SA);
-
-	/* create isakmp ID payload */
-	plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-
-	/* create isakmp NONCE payload */
-	plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		plist = isakmp_plist_append(plist, vid_frag, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_HYBRID
-	if (vid_xauth)
-		plist = isakmp_plist_append(plist, 
-		    vid_xauth, ISAKMP_NPTYPE_VID);
-	if (vid_unity)
-		plist = isakmp_plist_append(plist, 
-		    vid_unity, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_DPD
-	if (iph1->rmconf->dpd) {
-		vid_dpd = set_vendorid(VENDORID_DPD);
-		if (vid_dpd != NULL)
-			plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID); 
-	}
-#endif  
-#ifdef ENABLE_NATT
-	/* set VID payload for NAT-T */
-	for (i = 0; i < vid_natt_i; i++)
-		plist = isakmp_plist_append(plist, vid_natt[i], ISAKMP_NPTYPE_VID);
-#endif
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		vfree(vid_frag);
-#endif 
-#ifdef ENABLE_NATT
-	for (i = 0; i < vid_natt_i; i++)
-		vfree(vid_natt[i]);
-#endif
-#ifdef ENABLE_HYBRID    
-	if (vid_xauth != NULL)
-		vfree(vid_xauth);
-	if (vid_unity != NULL) 
-		vfree(vid_unity);
-#endif 
-#ifdef ENABLE_DPD
-	if (vid_dpd != NULL)    
-		vfree(vid_dpd);
-#endif     
-
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR, SA, Idir, Nr_b
- * 	sig: HDR, SA, Idir, Nr_b, [ CR ]
- * 	rsa: HDR, SA, <IDir_b>PubKey_i, <Nr_b>PubKey_i
- * 	rev: HDR, SA, <Nr_b>PubKey_i, <IDir_b>Ke_r
- */
-int
-base_i2recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	vchar_t *satmp = NULL;
-	int error = -1;
-	int vid_numeric;
-#ifdef ENABLE_HYBRID
-	vchar_t *unity_vid;
-	vchar_t *xauth_vid;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* SA payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-	if (isakmp_p2ph(&satmp, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	if (iph1->nonce_p == NULL || iph1->id_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-#endif
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(satmp, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-	VPTRINIT(iph1->sa_ret);
-
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (satmp)
-		vfree(satmp);
-
-	if (error) {
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-	}
-
-	return error;
-}
-
-/*
- * send to responder
- * 	psk: HDR, KE, HASH_I
- * 	sig: HDR, KE, [ CR, ] [CERT,] SIG_I
- * 	rsa: HDR, KE, HASH_I
- * 	rev: HDR, <KE>Ke_i, HASH_I
- */
-int
-base_i2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	vchar_t *vid = NULL;
-	int need_cert = 0;
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* fix isakmp index */
-	memcpy(&iph1->index.r_ck, &((struct isakmp *)msg->v)->r_ck,
-		sizeof(cookie_t));
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->approval->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* generate SKEYID to compute hash if not signature mode */
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-#endif
-		break;
-	default:
-		if (oakley_skeyid(iph1) < 0)
-			goto end;
-		break;
-	}
-
-	/* generate HASH to send */
-	plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_I\n");
-	iph1->hash = oakley_ph1hash_base_i(iph1, GENERATE);
-	if (iph1->hash == NULL)
-		goto end;
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-#endif
-		vid = set_vendorid(iph1->approval->vendorid);
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* create isakmp HASH payload */
-		plist = isakmp_plist_append(plist, iph1->hash, ISAKMP_NPTYPE_HASH);
-
-		/* append vendor id, if needed */
-		if (vid)
-			plist = isakmp_plist_append(plist, vid, ISAKMP_NPTYPE_VID);
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-#endif
-		/* XXX if there is CR or not ? */
-
-		if (oakley_getmycert(iph1) < 0)
-			goto end;
-
-		if (oakley_getsign(iph1) < 0)
-			goto end;
-
-		if (iph1->cert && iph1->rmconf->send_cert)
-			need_cert = 1;
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* add CERT payload if there */
-		if (need_cert)
-			plist = isakmp_plist_append(plist, 
-			    iph1->cert->pl, ISAKMP_NPTYPE_CERT);
-
-		/* add SIG payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sig, ISAKMP_NPTYPE_SIG);
-
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		/* ... */
-		break;
-#endif
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-#endif
-		break;
-	}
-
-#ifdef ENABLE_NATT
-	/* generate NAT-D payloads */
-	if (NATT_AVAILABLE(iph1))
-	{
-		vchar_t *natd[2] = { NULL, NULL };
-
-		plog (LLV_INFO, LOCATION, NULL, "Adding remote and local NAT-D payloads.\n");
-		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->remote));
-			goto end;
-		}
-
-		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->local));
-			goto end;
-		}
-
-		plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
-		plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG2SENT;
-
-	error = 0;
-
-end:
-	if (vid)
-		vfree(vid);
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR, KE, HASH_R
- * 	sig: HDR, KE, [CERT,] SIG_R
- * 	rsa: HDR, KE, HASH_R
- * 	rev: HDR, <KE>_Ke_r, HASH_R
- */
-int
-base_i3recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int ptype;
-#ifdef ENABLE_NATT
-	vchar_t	*natd_received;
-	int natd_seq = 0, natd_verified;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (NATT_AVAILABLE(iph1) && iph1->natt_options &&
-			    pa->type == iph1->natt_options->payload_nat_d) {
-				natd_received = NULL;
-				if (isakmp_p2ph (&natd_received, pa->ptr) < 0)
-					goto end;
-                        
-				/* set both bits first so that we can clear them
-				   upon verifying hashes */
-				if (natd_seq == 0)
-					iph1->natt_flags |= NAT_DETECTED;
-                        
-				/* this function will clear appropriate bits bits 
-				   from iph1->natt_flags */
-				natd_verified = natt_compare_addr_hash (iph1,
-					natd_received, natd_seq++);
-                        
-				plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-					natd_seq - 1,
-					natd_verified ? "verified" : "doesn't match");
-                        
-				vfree (natd_received);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1)) {
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-		if (iph1->natt_flags & NAT_DETECTED)
-			natt_float_ports (iph1);
-	}
-#endif
-
-	/* payload existency check */
-	/* validate authentication value */
-	ptype = oakley_validate_auth(iph1);
-	if (ptype != 0) {
-		if (ptype == -1) {
-			/* message printed inner oakley_validate_auth() */
-			goto end;
-		}
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEERPH1AUTH_FAILED, NULL);
-		isakmp_info_send_n1(iph1, ptype, NULL);
-		goto end;
-	}
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYID to compute hash if signature mode */
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-#endif
-		if (oakley_skeyid(iph1) < 0)
-			goto end;
-		break;
-	default:
-		break;
-	}
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->iv->l);
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	iph1->status = PHASE1ST_MSG3RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-
-	if (error) {
-		VPTRINIT(iph1->dhpub_p);
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-	}
-
-	return error;
-}
-
-/*
- * status update and establish isakmp sa.
- */
-int
-base_i3send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG3RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, SA, Idii, Ni_b
- * 	sig: HDR, SA, Idii, Ni_b
- * 	rsa: HDR, SA, [HASH(1),] <IDii_b>Pubkey_r, <Ni_b>Pubkey_r
- * 	rev: HDR, SA, [HASH(1),] <Ni_b>Pubkey_r, <IDii_b>Ke_i
- */
-int
-base_r1recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int vid_numeric;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	/*
-	 * NOTE: XXX even if multiple VID, we'll silently ignore those.
-	 */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* check the position of SA payload */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-	if (isakmp_p2ph(&iph1->sa, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			vid_numeric = handle_vendorid(iph1, pa->ptr);
-#ifdef ENABLE_FRAG
-			if ((vid_numeric == VENDORID_FRAG) &&
-			    (vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_BASE))
-				iph1->frag = 1;
-#endif
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	if (iph1->nonce_p == NULL || iph1->id_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-#endif
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(iph1->sa, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG1RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-
-	if (error) {
-		VPTRINIT(iph1->sa);
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR, SA, Idir, Nr_b
- * 	sig: HDR, SA, Idir, Nr_b, [ CR ]
- * 	rsa: HDR, SA, <IDir_b>PubKey_i, <Nr_b>PubKey_i
- * 	rev: HDR, SA, <Nr_b>PubKey_i, <IDir_b>Ke_r
- */
-int
-base_r1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	int error = -1;
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt = NULL;
-#endif
-#ifdef ENABLE_HYBRID    
-        vchar_t *vid_xauth = NULL;
-        vchar_t *vid_unity = NULL;
-#endif  
-#ifdef ENABLE_FRAG
-	vchar_t *vid_frag = NULL;
-#endif
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif  
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* set responder's cookie */
-	isakmp_newcookie((caddr_t)&iph1->index.r_ck, iph1->remote, iph1->local);
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-	/* set SA payload to reply */
-	plist = isakmp_plist_append(plist, iph1->sa_ret, ISAKMP_NPTYPE_SA);
-
-	/* create isakmp ID payload */
-	plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-
-	/* create isakmp NONCE payload */
-	plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-#ifdef ENABLE_NATT
-	/* has the peer announced nat-t? */
-	if (NATT_AVAILABLE(iph1))
-		vid_natt = set_vendorid(iph1->natt_options->version);
-	if (vid_natt)
-		plist = isakmp_plist_append(plist, vid_natt, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_HYBRID
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
-		plog (LLV_INFO, LOCATION, NULL, "Adding xauth VID payload.\n");
-		if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Xauth vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist,
-		    vid_xauth, ISAKMP_NPTYPE_VID);
-	}
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) {
-		if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Unity vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist,
-		    vid_unity, ISAKMP_NPTYPE_VID);
-	}
-#endif
-#ifdef ENABLE_DPD
-	/* 
-	 * Only send DPD support if remote announced DPD 
-	 * and if DPD support is active 
-	 */
-	if (iph1->dpd_support && iph1->rmconf->dpd) {
-		if ((vid_dpd = set_vendorid(VENDORID_DPD)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "DPD vendorID construction failed\n");
-		} else {
-			plist = isakmp_plist_append(plist, vid_dpd,
-			    ISAKMP_NPTYPE_VID);
-		}
-	}
-#endif
-#ifdef ENABLE_FRAG
-	if (iph1->rmconf->ike_frag) {
-		if ((vid_frag = set_vendorid(VENDORID_FRAG)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Frag vendorID construction failed\n");
-		} else {
-			vid_frag = isakmp_frag_addcap(vid_frag,
-			    VENDORID_FRAG_BASE);
-			plist = isakmp_plist_append(plist,
-			    vid_frag, ISAKMP_NPTYPE_VID);
-		}
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1) {
-		iph1 = NULL;
-		goto end;
-	}
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-#ifdef ENABLE_NATT
-	if (vid_natt)
-		vfree(vid_natt);
-#endif
-#ifdef ENABLE_HYBRID    
-	if (vid_xauth != NULL)
-		vfree(vid_xauth);
-	if (vid_unity != NULL)
-		vfree(vid_unity);
-#endif    
-#ifdef ENABLE_FRAG
-	if (vid_frag)
-		vfree(vid_frag);
-#endif
-#ifdef ENABLE_DPD
-	if (vid_dpd)
-		vfree(vid_dpd);
-#endif
-
-	if (iph1 != NULL)
-		VPTRINIT(iph1->sa_ret);
-
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, KE, HASH_I
- * 	sig: HDR, KE, [ CR, ] [CERT,] SIG_I
- * 	rsa: HDR, KE, HASH_I
- * 	rev: HDR, <KE>Ke_i, HASH_I
- */
-int
-base_r2recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int ptype;
-#ifdef ENABLE_NATT
-	int natd_seq = 0;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	iph1->pl_hash = NULL;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (pa->type == iph1->natt_options->payload_nat_d)
-			{
-				vchar_t *natd_received = NULL;
-				int natd_verified;
-				
-				if (isakmp_p2ph (&natd_received, pa->ptr) < 0)
-					goto end;
-				
-				if (natd_seq == 0)
-					iph1->natt_flags |= NAT_DETECTED;
-				
-				natd_verified = natt_compare_addr_hash (iph1,
-					natd_received, natd_seq++);
-				
-				plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-					natd_seq - 1,
-					natd_verified ? "verified" : "doesn't match");
-				
-				vfree (natd_received);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->approval->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYID */
-	if (oakley_skeyid(iph1) < 0)
-		goto end;
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-#endif
-
-	/* payload existency check */
-	/* validate authentication value */
-	ptype = oakley_validate_auth(iph1);
-	if (ptype != 0) {
-		if (ptype == -1) {
-			/* message printed inner oakley_validate_auth() */
-			goto end;
-		}
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEERPH1AUTH_FAILED, NULL);
-		isakmp_info_send_n1(iph1, ptype, NULL);
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-
-	if (error) {
-		VPTRINIT(iph1->dhpub_p);
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR, KE, HASH_R
- * 	sig: HDR, KE, [CERT,] SIG_R
- * 	rsa: HDR, KE, HASH_R
- * 	rev: HDR, <KE>_Ke_r, HASH_R
- */
-int
-base_r2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	vchar_t *vid = NULL;
-	int need_cert = 0;
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* generate HASH to send */
-	plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_I\n");
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-#endif
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-#endif
-		iph1->hash = oakley_ph1hash_base_r(iph1, GENERATE);
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid authentication method %d\n",
-			iph1->approval->authmethod);
-		goto end; 
-	}
-	if (iph1->hash == NULL)
-		goto end;
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-		vid = set_vendorid(iph1->approval->vendorid);
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* create isakmp HASH payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->hash, ISAKMP_NPTYPE_HASH);
-
-		/* append vendor id, if needed */
-		if (vid)
-			plist = isakmp_plist_append(plist, 
-			    vid, ISAKMP_NPTYPE_VID);
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-#endif
-		/* XXX if there is CR or not ? */
-
-		if (oakley_getmycert(iph1) < 0)
-			goto end;
-
-		if (oakley_getsign(iph1) < 0)
-			goto end;
-
-		if (iph1->cert && iph1->rmconf->send_cert)
-			need_cert = 1;
-
-		/* create isakmp KE payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-		/* add CERT payload if there */
-		if (need_cert)
-			plist = isakmp_plist_append(plist, 
-			    iph1->cert->pl, ISAKMP_NPTYPE_CERT);
-		/* add SIG payload */
-		plist = isakmp_plist_append(plist, 
-		    iph1->sig, ISAKMP_NPTYPE_SIG);
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		/* ... */
-		break;
-#endif
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		break;
-	}
-
-#ifdef ENABLE_NATT
-	/* generate NAT-D payloads */
-	if (NATT_AVAILABLE(iph1)) {
-		vchar_t *natd[2] = { NULL, NULL };
-
-		plog(LLV_INFO, LOCATION, 
-		    NULL, "Adding remote and local NAT-D payloads.\n");
-		if ((natd[0] = natt_hash_addr(iph1, iph1->remote)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "NAT-D hashing failed for %s\n", 
-			    saddr2str(iph1->remote));
-			goto end;
-		}
-
-		if ((natd[1] = natt_hash_addr(iph1, iph1->local)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "NAT-D hashing failed for %s\n", 
-			    saddr2str(iph1->local));
-			goto end;
-		}
-
-		plist = isakmp_plist_append(plist, 
-		    natd[0], iph1->natt_options->payload_nat_d);
-		plist = isakmp_plist_append(plist, 
-		    natd[1], iph1->natt_options->payload_nat_d);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all(&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send HDR;KE;NONCE to responder */
-	if (isakmp_send(iph1, iph1->sendbuf) < 0)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-	if (vid)
-		vfree(vid);
-	return error;
-}
diff --git a/src/racoon/isakmp_base.h b/src/racoon/isakmp_base.h
deleted file mode 100644
index 560880e..0000000
--- a/src/racoon/isakmp_base.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*	$NetBSD: isakmp_base.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_base.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_BASE_H
-#define _ISAKMP_BASE_H
-
-extern int base_i1send __P((struct ph1handle *, vchar_t *));
-extern int base_i2recv __P((struct ph1handle *, vchar_t *));
-extern int base_i2send __P((struct ph1handle *, vchar_t *));
-extern int base_i3recv __P((struct ph1handle *, vchar_t *));
-extern int base_i3send __P((struct ph1handle *, vchar_t *));
-
-extern int base_r1recv __P((struct ph1handle *, vchar_t *));
-extern int base_r1send __P((struct ph1handle *, vchar_t *));
-extern int base_r2recv __P((struct ph1handle *, vchar_t *));
-extern int base_r2send __P((struct ph1handle *, vchar_t *));
-
-#endif /* _ISAKMP_BASE_H */
diff --git a/src/racoon/isakmp_cfg.c b/src/racoon/isakmp_cfg.c
deleted file mode 100644
index fa127dc..0000000
--- a/src/racoon/isakmp_cfg.c
+++ /dev/null
@@ -1,2194 +0,0 @@
-/*	$NetBSD: isakmp_cfg.c,v 1.12.6.4 2008/11/27 15:25:20 vanhu Exp $	*/
-
-/* Id: isakmp_cfg.c,v 1.55 2006/08/22 18:17:17 manubsd Exp */
-
-/*
- * Copyright (C) 2004-2006 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#ifndef ANDROID_PATCHED
-#include <utmp.h>
-#endif
-#if defined(__APPLE__) && defined(__MACH__)
-#include <util.h>
-#endif
-
-#ifdef __FreeBSD__
-# include <libutil.h>
-#endif
-#ifdef __NetBSD__
-#  include <util.h>
-#endif
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#include <ctype.h>
-#include <resolv.h>
-
-#ifdef HAVE_LIBRADIUS
-#include <sys/utsname.h>
-#include <radlib.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "handler.h"
-#include "evt.h"
-#include "throttle.h"
-#include "remoteconf.h"
-#include "crypto_openssl.h"
-#include "isakmp_inf.h"
-#include "isakmp_xauth.h"
-#include "isakmp_unity.h"
-#include "isakmp_cfg.h"
-#include "strnames.h"
-#include "admin.h"
-#include "privsep.h"
-
-struct isakmp_cfg_config isakmp_cfg_config;
-
-static vchar_t *buffer_cat(vchar_t *s, vchar_t *append);
-static vchar_t *isakmp_cfg_net(struct ph1handle *, struct isakmp_data *);
-#if 0
-static vchar_t *isakmp_cfg_void(struct ph1handle *, struct isakmp_data *);
-#endif
-static vchar_t *isakmp_cfg_addr4(struct ph1handle *, 
-				 struct isakmp_data *, in_addr_t *);
-static void isakmp_cfg_getaddr4(struct isakmp_data *, struct in_addr *);
-static vchar_t *isakmp_cfg_addr4_list(struct ph1handle *,
-				      struct isakmp_data *, in_addr_t *, int);
-static void isakmp_cfg_appendaddr4(struct isakmp_data *, 
-				   struct in_addr *, int *, int);
-static void isakmp_cfg_getstring(struct isakmp_data *,char *);
-void isakmp_cfg_iplist_to_str(char *, int, void *, int);
-
-#define ISAKMP_CFG_LOGIN	1
-#define ISAKMP_CFG_LOGOUT	2
-static int isakmp_cfg_accounting(struct ph1handle *, int);
-#ifdef HAVE_LIBRADIUS
-static int isakmp_cfg_accounting_radius(struct ph1handle *, int);
-#endif
-
-/* 
- * Handle an ISAKMP config mode packet
- * We expect HDR, HASH, ATTR
- */
-void
-isakmp_cfg_r(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct isakmp *packet;
-	struct isakmp_gen *ph;
-	int tlen;
-	char *npp;
-	int np;
-	vchar_t *dmsg;
-	struct isakmp_ivm *ivm;
-
-	/* Check that the packet is long enough to have a header */
-	if (msg->l < sizeof(*packet)) {
-	     plog(LLV_ERROR, LOCATION, NULL, "Unexpected short packet\n");
-	     return;
-	}
-
-	packet = (struct isakmp *)msg->v;
-
-	/* Is it encrypted? It should be encrypted */
-	if ((packet->flags & ISAKMP_FLAG_E) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "User credentials sent in cleartext!\n");
-		return;
-	}
-
-	/* 
-	 * Decrypt the packet. If this is the beginning of a new
-	 * exchange, reinitialize the IV
-	 */
-	if (iph1->mode_cfg->ivm == NULL ||
-	    iph1->mode_cfg->last_msgid != packet->msgid )
-		iph1->mode_cfg->ivm = 
-		    isakmp_cfg_newiv(iph1, packet->msgid);
-	ivm = iph1->mode_cfg->ivm;
-
-	dmsg = oakley_do_decrypt(iph1, msg, ivm->iv, ivm->ive);
-	if (dmsg == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "failed to decrypt message\n");
-		return;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "MODE_CFG packet\n");
-	plogdump(LLV_DEBUG, dmsg->v, dmsg->l);
-
-	/* Now work with the decrypted packet */
-	packet = (struct isakmp *)dmsg->v;
-	tlen = dmsg->l - sizeof(*packet);
-	ph = (struct isakmp_gen *)(packet + 1);
-
-	np = packet->np;
-	while ((tlen > 0) && (np != ISAKMP_NPTYPE_NONE)) {
-		/* Check that the payload header fits in the packet */
-		if (tlen < sizeof(*ph)) {
-			 plog(LLV_WARNING, LOCATION, NULL, 
-			      "Short payload header\n");
-			 goto out;
-		}
-
-		/* Check that the payload fits in the packet */
-		if (tlen < ntohs(ph->len)) {
-			plog(LLV_WARNING, LOCATION, NULL, 
-			      "Short payload\n");
-			goto out;
-		}
-		
-		plog(LLV_DEBUG, LOCATION, NULL, "Seen payload %d\n", np);
-		plogdump(LLV_DEBUG, ph, ntohs(ph->len));
-
-		switch(np) {
-		case ISAKMP_NPTYPE_HASH: {
-			vchar_t *check;
-			vchar_t *payload;
-			size_t plen;
-			struct isakmp_gen *nph;
-
-			plen = ntohs(ph->len);
-			nph = (struct isakmp_gen *)((char *)ph + plen);
-			plen = ntohs(nph->len);
-
-			if ((payload = vmalloc(plen)) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Cannot allocate memory\n");
-				goto out;
-			}
-			memcpy(payload->v, nph, plen);
-
-			if ((check = oakley_compute_hash1(iph1, 
-			    packet->msgid, payload)) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Cannot compute hash\n");
-				vfree(payload);
-				goto out;
-			}
-
-			if (memcmp(ph + 1, check->v, check->l) != 0) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Hash verification failed\n");
-				vfree(payload);
-				vfree(check);
-				goto out;
-			}
-			vfree(payload);
-			vfree(check);
-			break;
-		}
-		case ISAKMP_NPTYPE_ATTR: {
-			struct isakmp_pl_attr *attrpl;
-
-			attrpl = (struct isakmp_pl_attr *)ph;
-			isakmp_cfg_attr_r(iph1, packet->msgid, attrpl);
-
-			break;
-		}
-		default:
-			 plog(LLV_WARNING, LOCATION, NULL, 
-			      "Unexpected next payload %d\n", np);
-			 /* Skip to the next payload */
-			 break;
-		}
-
-		/* Move to the next payload */
-		np = ph->np;
-		tlen -= ntohs(ph->len);
-		npp = (char *)ph;
-		ph = (struct isakmp_gen *)(npp + ntohs(ph->len));
-	}
-
-out:
-	vfree(dmsg);
-}
-
-int
-isakmp_cfg_attr_r(iph1, msgid, attrpl) 
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-	struct isakmp_pl_attr *attrpl;
-{
-	int type = attrpl->type;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-	     "Configuration exchange type %s\n", s_isakmp_cfg_ptype(type));
-	switch (type) {
-	case ISAKMP_CFG_ACK:
-		/* ignore, but this is the time to reinit the IV */
-		oakley_delivm(iph1->mode_cfg->ivm);
-		iph1->mode_cfg->ivm = NULL;
-		return 0;
-		break;
-
-	case ISAKMP_CFG_REPLY:
-		return isakmp_cfg_reply(iph1, attrpl);
-		break;
-
-	case ISAKMP_CFG_REQUEST:
-		iph1->msgid = msgid;
-		return isakmp_cfg_request(iph1, attrpl);
-		break;
-
-	case ISAKMP_CFG_SET:
-		iph1->msgid = msgid;
-		return isakmp_cfg_set(iph1, attrpl);
-		break;
-
-	default:
-		plog(LLV_WARNING, LOCATION, NULL,
-		     "Unepected configuration exchange type %d\n", type);
-		return -1;
-		break;
-	}
-
-	return 0;
-}
-
-int
-isakmp_cfg_reply(iph1, attrpl)
-	struct ph1handle *iph1;
-	struct isakmp_pl_attr *attrpl;
-{
-	struct isakmp_data *attr;
-	int tlen;
-	size_t alen;
-	char *npp;
-	int type;
-	struct sockaddr_in *sin;
-	int error;
-
-	tlen = ntohs(attrpl->h.len);
-	attr = (struct isakmp_data *)(attrpl + 1);
-	tlen -= sizeof(*attrpl);
-	
-	while (tlen > 0) {
-		type = ntohs(attr->type);
-
-		/* Handle short attributes */
-		if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
-			type &= ~ISAKMP_GEN_MASK;
-
-			plog(LLV_DEBUG, LOCATION, NULL,
-			     "Short attribute %s = %d\n", 
-			     s_isakmp_cfg_type(type), ntohs(attr->lorv));
-
-			switch (type) {
-			case XAUTH_TYPE:
-				if ((error = xauth_attr_reply(iph1, 
-				    attr, ntohs(attrpl->id))) != 0)
-					return error;
-				break;
-
-			default:
-				plog(LLV_WARNING, LOCATION, NULL,
-				     "Ignored short attribute %s\n",
-				     s_isakmp_cfg_type(type));
-				break;
-			}
-
-			tlen -= sizeof(*attr);
-			attr++;
-			continue;
-		}
-
-		type = ntohs(attr->type);
-		alen = ntohs(attr->lorv);
-
-		/* Check that the attribute fit in the packet */
-		if (tlen < alen) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Short attribute %s\n",
-			     s_isakmp_cfg_type(type));
-			return -1;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "Attribute %s, len %zu\n", 
-		     s_isakmp_cfg_type(type), alen);
-
-		switch(type) {
-		case XAUTH_TYPE:
-		case XAUTH_USER_NAME:
-		case XAUTH_USER_PASSWORD:
-		case XAUTH_PASSCODE:
-		case XAUTH_MESSAGE:
-		case XAUTH_CHALLENGE:
-		case XAUTH_DOMAIN:
-		case XAUTH_STATUS:
-		case XAUTH_NEXT_PIN:
-		case XAUTH_ANSWER:
-			if ((error = xauth_attr_reply(iph1, 
-			    attr, ntohs(attrpl->id))) != 0)
-				return error;
-			break;
-		case INTERNAL_IP4_ADDRESS:
-			isakmp_cfg_getaddr4(attr, &iph1->mode_cfg->addr4);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_ADDR4;
-			break;
-		case INTERNAL_IP4_NETMASK:
-			isakmp_cfg_getaddr4(attr, &iph1->mode_cfg->mask4);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_MASK4;
-			break;
-		case INTERNAL_IP4_DNS:
-			isakmp_cfg_appendaddr4(attr, 
-			    &iph1->mode_cfg->dns4[iph1->mode_cfg->dns4_index],
-			    &iph1->mode_cfg->dns4_index, MAXNS);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_DNS4;
-			break;
-		case INTERNAL_IP4_NBNS:
-			isakmp_cfg_appendaddr4(attr, 
-			    &iph1->mode_cfg->wins4[iph1->mode_cfg->wins4_index],
-			    &iph1->mode_cfg->wins4_index, MAXNS);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_WINS4;
-			break;
-		case UNITY_DEF_DOMAIN:
-			isakmp_cfg_getstring(attr, 
-			    iph1->mode_cfg->default_domain);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_DEFAULT_DOMAIN;
-			break;
-		case UNITY_SPLIT_INCLUDE:
-		case UNITY_LOCAL_LAN:
-		case UNITY_SPLITDNS_NAME:
-		case UNITY_BANNER:
-		case UNITY_SAVE_PASSWD:
-		case UNITY_NATT_PORT:
-		case UNITY_PFS:
-		case UNITY_FW_TYPE:
-		case UNITY_BACKUP_SERVERS:
-		case UNITY_DDNS_HOSTNAME:
-			isakmp_unity_reply(iph1, attr);
-			break;
-		case INTERNAL_IP4_SUBNET:
-		case INTERNAL_ADDRESS_EXPIRY:
-		default:
-			plog(LLV_WARNING, LOCATION, NULL,
-			     "Ignored attribute %s\n",
-			     s_isakmp_cfg_type(type));
-			break;
-		}
-
-		npp = (char *)attr;
-		attr = (struct isakmp_data *)(npp + sizeof(*attr) + alen);
-		tlen -= (sizeof(*attr) + alen);
-	}
-
-	/* 
-	 * Call the SA up script hook now that we have the configuration
-	 * It is done at the end of phase 1 if ISAKMP mode config is not
-	 * requested.
-	 */
-	
-	if ((iph1->status == PHASE1ST_ESTABLISHED) && 
-	    iph1->rmconf->mode_cfg) {
-		switch (AUTHMETHOD(iph1)) {
-		case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-		/* Unimplemented */
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I: 
-			script_hook(iph1, SCRIPT_PHASE1_UP);
-			break;
-		default:
-			break;
-		}
-	}
-		
-
-#ifdef ENABLE_ADMINPORT
-	{
-		vchar_t *buf;
-
-		alen = ntohs(attrpl->h.len) - sizeof(*attrpl);
-		if ((buf = vmalloc(alen)) == NULL) {
-			plog(LLV_WARNING, LOCATION, NULL, 
-			    "Cannot allocate memory: %s\n", strerror(errno));
-		} else {
-			memcpy(buf->v, attrpl + 1, buf->l);
-			EVT_PUSH(iph1->local, iph1->remote, 
-			    EVTT_ISAKMP_CFG_DONE, buf);
-			vfree(buf);
-		}
-	}
-#endif
-
-	return 0;
-}
-
-int
-isakmp_cfg_request(iph1, attrpl)
-	struct ph1handle *iph1;
-	struct isakmp_pl_attr *attrpl;
-{
-	struct isakmp_data *attr;
-	int tlen;
-	size_t alen;
-	char *npp;
-	vchar_t *payload;
-	struct isakmp_pl_attr *reply;
-	vchar_t *reply_attr;
-	int type;
-	int error = -1;
-
-	if ((payload = vmalloc(sizeof(*reply))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return -1;
-	}
-	memset(payload->v, 0, sizeof(*reply));
-
-	tlen = ntohs(attrpl->h.len);
-	attr = (struct isakmp_data *)(attrpl + 1);
-	tlen -= sizeof(*attrpl);
-	
-	while (tlen > 0) {
-		reply_attr = NULL;
-		type = ntohs(attr->type);
-
-		/* Handle short attributes */
-		if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
-			type &= ~ISAKMP_GEN_MASK;
-
-			plog(LLV_DEBUG, LOCATION, NULL,
-			     "Short attribute %s = %d\n", 
-			     s_isakmp_cfg_type(type), ntohs(attr->lorv));
-
-			switch (type) {
-			case XAUTH_TYPE:
-				reply_attr = isakmp_xauth_req(iph1, attr);
-				break;
-			default:
-				plog(LLV_WARNING, LOCATION, NULL,
-				     "Ignored short attribute %s\n",
-				     s_isakmp_cfg_type(type));
-				break;
-			}
-
-			tlen -= sizeof(*attr);
-			attr++;
-
-			if (reply_attr != NULL) {
-				payload = buffer_cat(payload, reply_attr);
-				vfree(reply_attr);
-			}
-
-			continue;
-		}
-
-		type = ntohs(attr->type);
-		alen = ntohs(attr->lorv);
-
-		/* Check that the attribute fit in the packet */
-		if (tlen < alen) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Short attribute %s\n",
-			     s_isakmp_cfg_type(type));
-			goto end;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "Attribute %s, len %zu\n",
-		     s_isakmp_cfg_type(type), alen);
-
-		switch(type) {
-		case INTERNAL_IP4_ADDRESS:
-		case INTERNAL_IP4_NETMASK:
-		case INTERNAL_IP4_DNS:
-		case INTERNAL_IP4_NBNS:
-		case INTERNAL_IP4_SUBNET:
-			reply_attr = isakmp_cfg_net(iph1, attr);
-			break;
-
-		case XAUTH_TYPE:
-		case XAUTH_USER_NAME:
-		case XAUTH_USER_PASSWORD:
-		case XAUTH_PASSCODE:
-		case XAUTH_MESSAGE:
-		case XAUTH_CHALLENGE:
-		case XAUTH_DOMAIN:
-		case XAUTH_STATUS:
-		case XAUTH_NEXT_PIN:
-		case XAUTH_ANSWER:
-			reply_attr = isakmp_xauth_req(iph1, attr);
-			break;
-
-		case APPLICATION_VERSION:
-			reply_attr = isakmp_cfg_string(iph1, 
-			    attr, ISAKMP_CFG_RACOON_VERSION);
-			break;
-
-		case UNITY_BANNER:
-		case UNITY_PFS:
-		case UNITY_SAVE_PASSWD:
-		case UNITY_DEF_DOMAIN:
-		case UNITY_DDNS_HOSTNAME:
-		case UNITY_FW_TYPE:
-		case UNITY_SPLITDNS_NAME:
-		case UNITY_SPLIT_INCLUDE:
-		case UNITY_LOCAL_LAN:
-		case UNITY_NATT_PORT:
-		case UNITY_BACKUP_SERVERS:
-			reply_attr = isakmp_unity_req(iph1, attr);
-			break;
-
-		case INTERNAL_ADDRESS_EXPIRY:
-		default:
-			plog(LLV_WARNING, LOCATION, NULL,
-			     "Ignored attribute %s\n",
-			     s_isakmp_cfg_type(type));
-			break;
-		}
-
-		npp = (char *)attr;
-		attr = (struct isakmp_data *)(npp + sizeof(*attr) + alen);
-		tlen -= (sizeof(*attr) + alen);
-
-		if (reply_attr != NULL) {
-			payload = buffer_cat(payload, reply_attr);
-			vfree(reply_attr);
-		}
-
-	}
-
-	reply = (struct isakmp_pl_attr *)payload->v;
-	reply->h.len = htons(payload->l);
-	reply->type = ISAKMP_CFG_REPLY;
-	reply->id = attrpl->id;
-
-	plog(LLV_DEBUG, LOCATION, NULL, 
-		    "Sending MODE_CFG REPLY\n");
-
-	error = isakmp_cfg_send(iph1, payload, 
-	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 0);
-
-	if (iph1->status == PHASE1ST_ESTABLISHED) {
-		switch (AUTHMETHOD(iph1)) {
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-		/* Unimplemented */
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R: 
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R: 
-			script_hook(iph1, SCRIPT_PHASE1_UP);
-			break;
-		default:
-			break;
-		}
-	}
-	
-end:
-	vfree(payload);
-
-	return error;
-}
-
-int
-isakmp_cfg_set(iph1, attrpl)
-	struct ph1handle *iph1;
-	struct isakmp_pl_attr *attrpl;
-{
-	struct isakmp_data *attr;
-	int tlen;
-	size_t alen;
-	char *npp;
-	vchar_t *payload;
-	struct isakmp_pl_attr *reply;
-	vchar_t *reply_attr;
-	int type;
-	int error = -1;
-
-	if ((payload = vmalloc(sizeof(*reply))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return -1;
-	}
-	memset(payload->v, 0, sizeof(*reply));
-
-	tlen = ntohs(attrpl->h.len);
-	attr = (struct isakmp_data *)(attrpl + 1);
-	tlen -= sizeof(*attrpl);
-	
-	/* 
-	 * We should send ack for the attributes we accepted 
-	 */
-	while (tlen > 0) {
-		reply_attr = NULL;
-		type = ntohs(attr->type);
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "Attribute %s\n", 
-		     s_isakmp_cfg_type(type & ~ISAKMP_GEN_MASK));
-		
-		switch (type & ~ISAKMP_GEN_MASK) {
-		case XAUTH_STATUS:
-			reply_attr = isakmp_xauth_set(iph1, attr);
-			break;
-		default:
-			plog(LLV_DEBUG, LOCATION, NULL,
-			     "Unexpected SET attribute %s\n", 
-		     	     s_isakmp_cfg_type(type & ~ISAKMP_GEN_MASK));
-			break;
-		}
-
-		if (reply_attr != NULL) {
-			payload = buffer_cat(payload, reply_attr);
-			vfree(reply_attr);
-		}
-
-		/* 
-		 * Move to next attribute. If we run out of the packet, 
-		 * tlen becomes negative and we exit. 
-		 */
-		if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
-			tlen -= sizeof(*attr);
-			attr++;
-		} else {
-			alen = ntohs(attr->lorv);
-			tlen -= (sizeof(*attr) + alen);
-			npp = (char *)attr;
-			attr = (struct isakmp_data *)
-			    (npp + sizeof(*attr) + alen);
-		}
-	}
-
-	reply = (struct isakmp_pl_attr *)payload->v;
-	reply->h.len = htons(payload->l);
-	reply->type = ISAKMP_CFG_ACK;
-	reply->id = attrpl->id;
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		     "Sending MODE_CFG ACK\n");
-
-	error = isakmp_cfg_send(iph1, payload, 
-	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 0);
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_DELETE_PH1) {
-		if (iph1->status == PHASE1ST_ESTABLISHED)
-			isakmp_info_send_d1(iph1);
-		remph1(iph1);
-		delph1(iph1);
-		iph1 = NULL;
-	}
-end:
-	vfree(payload);
-
-	/* 
-	 * If required, request ISAKMP mode config information
-	 */
-	if ((iph1 != NULL) && (iph1->rmconf->mode_cfg) && (error == 0))
-		error = isakmp_cfg_getconfig(iph1);
-
-	return error;
-}
-
-
-static vchar_t *
-buffer_cat(s, append)
-	vchar_t *s;
-	vchar_t *append;
-{
-	vchar_t *new;
-
-	new = vmalloc(s->l + append->l);
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory\n");
-		return s;
-	}
-
-	memcpy(new->v, s->v, s->l);
-	memcpy(new->v + s->l, append->v, append->l);
-
-	vfree(s);
-	return new;
-}
-
-static vchar_t *
-isakmp_cfg_net(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	int type;
-	int confsource;
-	in_addr_t addr4;
-
-	type = ntohs(attr->type);
-
-	/* 
-	 * Don't give an address to a peer that did not succeed Xauth
-	 */
-	if (xauth_check(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Attempt to start phase config whereas Xauth failed\n");
-		return NULL;
-	}
-
-	confsource = isakmp_cfg_config.confsource;
-	/*
-	 * If we have to fall back to a local
-	 * configuration source, we will jump
-	 * back to this point.
-	 */
-retry_source:
-
-	switch(type) {
-	case INTERNAL_IP4_ADDRESS:
-		switch(confsource) {
-#ifdef HAVE_LIBLDAP
-		case ISAKMP_CFG_CONF_LDAP:
-			if (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN)
-			    break;
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "No IP from LDAP, using local pool\n");
-			/* FALLTHROUGH */
-			confsource = ISAKMP_CFG_CONF_LOCAL;
-			goto retry_source;
-#endif
-#ifdef HAVE_LIBRADIUS
-		case ISAKMP_CFG_CONF_RADIUS:
-			if ((iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN)
-			    && (iph1->mode_cfg->addr4.s_addr != htonl(-2)))
-			    /*
-			     * -2 is 255.255.255.254, RADIUS uses that
-			     * to instruct the NAS to use a local pool
-			     */
-			    break;
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "No IP from RADIUS, using local pool\n");
-			/* FALLTHROUGH */
-			confsource = ISAKMP_CFG_CONF_LOCAL;
-			goto retry_source;
-#endif
-		case ISAKMP_CFG_CONF_LOCAL:
-			if (isakmp_cfg_getport(iph1) == -1) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Port pool depleted\n");
-				break;
-			}
-
-			iph1->mode_cfg->addr4.s_addr = 
-			    htonl(ntohl(isakmp_cfg_config.network4) 
-			    + iph1->mode_cfg->port);
-			iph1->mode_cfg->flags |= ISAKMP_CFG_ADDR4_LOCAL;
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unexpected confsource\n");
-		}
-			
-		if (isakmp_cfg_accounting(iph1, ISAKMP_CFG_LOGIN) != 0)
-			plog(LLV_ERROR, LOCATION, NULL, "Accounting failed\n");
-
-		return isakmp_cfg_addr4(iph1, 
-		    attr, &iph1->mode_cfg->addr4.s_addr);
-		break;
-
-	case INTERNAL_IP4_NETMASK:
-		switch(confsource) {
-#ifdef HAVE_LIBLDAP
-		case ISAKMP_CFG_CONF_LDAP:
-			if (iph1->mode_cfg->flags & ISAKMP_CFG_MASK4_EXTERN)
-				break;
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "No mask from LDAP, using local pool\n");
-			/* FALLTHROUGH */
-			confsource = ISAKMP_CFG_CONF_LOCAL;
-			goto retry_source;
-#endif
-#ifdef HAVE_LIBRADIUS
-		case ISAKMP_CFG_CONF_RADIUS:
-			if (iph1->mode_cfg->flags & ISAKMP_CFG_MASK4_EXTERN)
-				break;
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "No mask from RADIUS, using local pool\n");
-			/* FALLTHROUGH */
-			confsource = ISAKMP_CFG_CONF_LOCAL;
-			goto retry_source;
-#endif
-		case ISAKMP_CFG_CONF_LOCAL:
-			iph1->mode_cfg->mask4.s_addr 
-			    = isakmp_cfg_config.netmask4;
-			iph1->mode_cfg->flags |= ISAKMP_CFG_MASK4_LOCAL;
-			break;
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unexpected confsource\n");
-		}
-		return isakmp_cfg_addr4(iph1, attr, 
-		    &iph1->mode_cfg->mask4.s_addr);
-		break;
-
-	case INTERNAL_IP4_DNS:
-		return isakmp_cfg_addr4_list(iph1, 
-		    attr, &isakmp_cfg_config.dns4[0], 
-		    isakmp_cfg_config.dns4_index);
-		break;
-
-	case INTERNAL_IP4_NBNS:
-		return isakmp_cfg_addr4_list(iph1, 
-		    attr, &isakmp_cfg_config.nbns4[0], 
-		    isakmp_cfg_config.nbns4_index);
-		break;
-
-	case INTERNAL_IP4_SUBNET:
-		return isakmp_cfg_addr4(iph1, 
-		    attr, &isakmp_cfg_config.network4);
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Unexpected type %d\n", type);
-		break;
-	}
-	return NULL;
-}
-
-#if 0
-static vchar_t *
-isakmp_cfg_void(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	vchar_t *buffer;
-	struct isakmp_data *new;
-
-	if ((buffer = vmalloc(sizeof(*attr))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	new = (struct isakmp_data *)buffer->v;
-
-	new->type = attr->type;
-	new->lorv = htons(0);
-
-	return buffer;
-}
-#endif
-
-vchar_t *
-isakmp_cfg_copy(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	vchar_t *buffer;
-	size_t len = 0;
-
-	if ((ntohs(attr->type) & ISAKMP_GEN_MASK) == ISAKMP_GEN_TLV)
-		len = ntohs(attr->lorv);
-
-	if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	memcpy(buffer->v, attr, sizeof(*attr) + ntohs(attr->lorv));
-
-	return buffer;
-}
-
-vchar_t *
-isakmp_cfg_short(iph1, attr, value)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	int value;
-{
-	vchar_t *buffer;
-	struct isakmp_data *new;
-	int type;
-
-	if ((buffer = vmalloc(sizeof(*attr))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	new = (struct isakmp_data *)buffer->v;
-	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
-
-	new->type = htons(type | ISAKMP_GEN_TV);
-	new->lorv = htons(value);
-
-	return buffer;
-}
-
-vchar_t *
-isakmp_cfg_varlen(iph1, attr, string, len)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	char *string;
-	size_t len;
-{
-	vchar_t *buffer;
-	struct isakmp_data *new;
-	char *data;
-
-	if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	new = (struct isakmp_data *)buffer->v;
-
-	new->type = attr->type;
-	new->lorv = htons(len);
-	data = (char *)(new + 1);
-
-	memcpy(data, string, len);
-	
-	return buffer;
-}
-vchar_t *
-isakmp_cfg_string(iph1, attr, string)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	char *string;
-{
-	size_t len = strlen(string);
-	return isakmp_cfg_varlen(iph1, attr, string, len);
-}
-
-static vchar_t *
-isakmp_cfg_addr4(iph1, attr, addr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	in_addr_t *addr;
-{
-	vchar_t *buffer;
-	struct isakmp_data *new;
-	size_t len;
-
-	len = sizeof(*addr);
-	if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	new = (struct isakmp_data *)buffer->v;
-
-	new->type = attr->type;
-	new->lorv = htons(len);
-	memcpy(new + 1, addr, len);
-	
-	return buffer;
-}
-
-static vchar_t *
-isakmp_cfg_addr4_list(iph1, attr, addr, nbr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	in_addr_t *addr;
-	int nbr;
-{
-	int error = -1;
-	vchar_t *buffer = NULL;
-	vchar_t *bufone = NULL;
-	struct isakmp_data *new;
-	size_t len;
-	int i;
-
-	len = sizeof(*addr);
-	if ((buffer = vmalloc(0)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		goto out;
-	}
-	for(i = 0; i < nbr; i++) {
-		if ((bufone = vmalloc(sizeof(*attr) + len)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot allocate memory\n");
-			goto out;
-		}
-		new = (struct isakmp_data *)bufone->v;
-		new->type = attr->type;
-		new->lorv = htons(len);
-		memcpy(new + 1, &addr[i], len);
-		new += (len + sizeof(*attr));
-		buffer = buffer_cat(buffer, bufone);
-		vfree(bufone);
-	}
-
-	error = 0;
-
-out:
-	if ((error != 0) && (buffer != NULL)) {
-		vfree(buffer);
-		buffer = NULL;
-	}
-
-	return buffer;
-}
-
-struct isakmp_ivm *
-isakmp_cfg_newiv(iph1, msgid)
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-{
-	struct isakmp_cfg_state *ics = iph1->mode_cfg;
-
-	if (ics == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "isakmp_cfg_newiv called without mode config state\n");
-		return NULL;
-	}
-
-	if (ics->ivm != NULL)
-		oakley_delivm(ics->ivm);
-
-	ics->ivm = oakley_newiv2(iph1, msgid);
-	ics->last_msgid = msgid;
-
-	return ics->ivm;
-}
-
-/* Derived from isakmp_info_send_common */
-int
-isakmp_cfg_send(iph1, payload, np, flags, new_exchange)
-	struct ph1handle *iph1;
-	vchar_t *payload;
-	u_int32_t np;
-	int flags;
-	int new_exchange;
-{
-	struct ph2handle *iph2 = NULL;
-	vchar_t *hash = NULL;
-	struct isakmp *isakmp;
-	struct isakmp_gen *gen;
-	char *p;
-	int tlen;
-	int error = -1;
-	struct isakmp_cfg_state *ics = iph1->mode_cfg;
-
-	/* Check if phase 1 is established */
-	if ((iph1->status != PHASE1ST_ESTABLISHED) || 
-	    (iph1->local == NULL) ||
-	    (iph1->remote == NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "ISAKMP mode config exchange with immature phase 1\n");
-		goto end;
-	}
-
-	/* add new entry to isakmp status table */
-	iph2 = newph2();
-	if (iph2 == NULL)
-		goto end;
-
-	iph2->dst = dupsaddr(iph1->remote);
-	if (iph2->dst == NULL) {
-		delph2(iph2);
-		goto end;
-	}
-	iph2->src = dupsaddr(iph1->local);
-	if (iph2->src == NULL) {
-		delph2(iph2);
-		goto end;
-	}
-
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
-	if (set_port(iph2->dst, 0) == NULL ||
-	    set_port(iph2->src, 0) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "invalid family: %d\n", iph1->remote->sa_family);
-		delph2(iph2);
-		goto end;
-	}
-#endif
-	iph2->ph1 = iph1;
-	iph2->side = INITIATOR;
-	iph2->status = PHASE2ST_START;
-
-	if (new_exchange)
-		iph2->msgid = isakmp_newmsgid2(iph1);
-	else
-		iph2->msgid = iph1->msgid;
-
-	/* get IV and HASH(1) if skeyid_a was generated. */
-	if (iph1->skeyid_a != NULL) {
-		if (new_exchange) {
-			if (isakmp_cfg_newiv(iph1, iph2->msgid) == NULL) {
-				delph2(iph2);
-				goto end;
-			}
-		}
-
-		/* generate HASH(1) */
-		hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, payload);
-		if (hash == NULL) {
-			delph2(iph2);
-			goto end;
-		}
-
-		/* initialized total buffer length */
-		tlen = hash->l;
-		tlen += sizeof(*gen);
-	} else {
-		/* IKE-SA is not established */
-		hash = NULL;
-
-		/* initialized total buffer length */
-		tlen = 0;
-	}
-	if ((flags & ISAKMP_FLAG_A) == 0)
-		iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_E);
-	else
-		iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_A);
-
-	insph2(iph2);
-	bindph12(iph1, iph2);
-
-	tlen += sizeof(*isakmp) + payload->l;
-
-	/* create buffer for isakmp payload */
-	iph2->sendbuf = vmalloc(tlen);
-	if (iph2->sendbuf == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto err;
-	}
-
-	/* create isakmp header */
-	isakmp = (struct isakmp *)iph2->sendbuf->v;
-	memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t));
-	memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t));
-	isakmp->np = hash == NULL ? (np & 0xff) : ISAKMP_NPTYPE_HASH;
-	isakmp->v = iph1->version;
-	isakmp->etype = ISAKMP_ETYPE_CFG;
-	isakmp->flags = iph2->flags;
-	memcpy(&isakmp->msgid, &iph2->msgid, sizeof(isakmp->msgid));
-	isakmp->len = htonl(tlen);
-	p = (char *)(isakmp + 1);
-
-	/* create HASH payload */
-	if (hash != NULL) {
-		gen = (struct isakmp_gen *)p;
-		gen->np = np & 0xff;
-		gen->len = htons(sizeof(*gen) + hash->l);
-		p += sizeof(*gen);
-		memcpy(p, hash->v, hash->l);
-		p += hash->l;
-	}
-
-	/* add payload */
-	memcpy(p, payload->v, payload->l);
-	p += payload->l;
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph2->sendbuf, iph1->local, iph1->remote, 1);
-#endif
-	
-	plog(LLV_DEBUG, LOCATION, NULL, "MODE_CFG packet to send\n");
-	plogdump(LLV_DEBUG, iph2->sendbuf->v, iph2->sendbuf->l);
-
-	/* encoding */
-	if (ISSET(isakmp->flags, ISAKMP_FLAG_E)) {
-		vchar_t *tmp;
-
-		tmp = oakley_do_encrypt(iph2->ph1, iph2->sendbuf, 
-			ics->ivm->ive, ics->ivm->iv);
-		VPTRINIT(iph2->sendbuf);
-		if (tmp == NULL)
-			goto err;
-		iph2->sendbuf = tmp;
-	}
-
-	/* HDR*, HASH(1), ATTR */
-	if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0) {
-		VPTRINIT(iph2->sendbuf);
-		goto err;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"sendto mode config %s.\n", s_isakmp_nptype(np));
-
-	/*
-	 * XXX We might need to resend the message...
-	 */
-
-	error = 0;
-	VPTRINIT(iph2->sendbuf);
-
-err:
-	if (iph2->sendbuf != NULL)
-		vfree(iph2->sendbuf);
-
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-end:
-	if (hash)
-		vfree(hash);
-	return error;
-}
-
-
-void 
-isakmp_cfg_rmstate(iph1)
-	struct ph1handle *iph1;
-{
-	struct isakmp_cfg_state *state = iph1->mode_cfg;
-
-	if (isakmp_cfg_accounting(iph1, ISAKMP_CFG_LOGOUT) != 0)
-		plog(LLV_ERROR, LOCATION, NULL, "Accounting failed\n");
-
-	if (state->flags & ISAKMP_CFG_PORT_ALLOCATED)
-		isakmp_cfg_putport(iph1, state->port);	
-
-	/* Delete the IV if it's still there */
-	if(iph1->mode_cfg->ivm) {
-		oakley_delivm(iph1->mode_cfg->ivm);
-		iph1->mode_cfg->ivm = NULL;
-	}
-
-	/* Free any allocated splitnet lists */
-	if(iph1->mode_cfg->split_include != NULL)
-		splitnet_list_free(iph1->mode_cfg->split_include,
-			&iph1->mode_cfg->include_count);
-	if(iph1->mode_cfg->split_local != NULL)
-		splitnet_list_free(iph1->mode_cfg->split_local,
-			&iph1->mode_cfg->local_count);
-
-	xauth_rmstate(&state->xauth);
-
-	racoon_free(state);
-	iph1->mode_cfg = NULL;
-
-	return;
-}
-
-struct isakmp_cfg_state *
-isakmp_cfg_mkstate(void) 
-{
-	struct isakmp_cfg_state *state;
-
-	if ((state = racoon_malloc(sizeof(*state))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot allocate memory for mode config state\n");
-		return NULL;
-	}
-	memset(state, 0, sizeof(*state));
-
-	return state;
-}
-
-int 
-isakmp_cfg_getport(iph1)
-	struct ph1handle *iph1;
-{
-	unsigned int i;
-	size_t size = isakmp_cfg_config.pool_size;
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_PORT_ALLOCATED)
-		return iph1->mode_cfg->port;
-
-	if (isakmp_cfg_config.port_pool == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "isakmp_cfg_config.port_pool == NULL\n");
-		return -1;
-	}
-
-	for (i = 0; i < size; i++) {
-		if (isakmp_cfg_config.port_pool[i].used == 0)
-			break;
-	}
-
-	if (i == size) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "No more addresses available\n");
-			return -1;
-	}
-
-	isakmp_cfg_config.port_pool[i].used = 1;
-
-	plog(LLV_INFO, LOCATION, NULL, "Using port %d\n", i);
-
-	iph1->mode_cfg->flags |= ISAKMP_CFG_PORT_ALLOCATED;
-	iph1->mode_cfg->port = i;
-
-	return i;
-}
-
-int 
-isakmp_cfg_putport(iph1, index)
-	struct ph1handle *iph1;
-	unsigned int index;
-{
-	if (isakmp_cfg_config.port_pool == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "isakmp_cfg_config.port_pool == NULL\n");
-		return -1;
-	}
-
-	if (isakmp_cfg_config.port_pool[index].used == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Attempt to release an unallocated address (port %d)\n",
-		    index);
-		return -1;
-	}
-
-#ifdef HAVE_LIBPAM
-	/* Cleanup PAM status associated with the port */
-	if (isakmp_cfg_config.authsource == ISAKMP_CFG_AUTH_PAM)
-		privsep_cleanup_pam(index);
-#endif
-	isakmp_cfg_config.port_pool[index].used = 0;
-	iph1->mode_cfg->flags &= ISAKMP_CFG_PORT_ALLOCATED;
-
-	plog(LLV_INFO, LOCATION, NULL, "Released port %d\n", index);
-
-	return 0;
-}
-
-#ifdef HAVE_LIBPAM
-void
-cleanup_pam(port)
-	int port;
-{
-	if (isakmp_cfg_config.port_pool[port].pam != NULL) {
-		pam_end(isakmp_cfg_config.port_pool[port].pam, PAM_SUCCESS);
-		isakmp_cfg_config.port_pool[port].pam = NULL;
-	}
-
-	return;
-}
-#endif
-
-/* Accounting, only for RADIUS or PAM */
-static int
-isakmp_cfg_accounting(iph1, inout)
-	struct ph1handle *iph1;
-	int inout;
-{
-#ifdef HAVE_LIBPAM
-	if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_PAM)
-		return privsep_accounting_pam(iph1->mode_cfg->port, 
-		    inout);
-#endif 
-#ifdef HAVE_LIBRADIUS
-	if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_RADIUS)
-		return isakmp_cfg_accounting_radius(iph1, inout);
-#endif
-	if (isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_SYSTEM)
-		return privsep_accounting_system(iph1->mode_cfg->port,
-			iph1->remote, iph1->mode_cfg->login, inout);
-	return 0;
-}
-
-#ifdef HAVE_LIBPAM
-int 
-isakmp_cfg_accounting_pam(port, inout)
-	int port;
-	int inout;
-{
-	int error = 0;
-	pam_handle_t *pam;
-
-	if (isakmp_cfg_config.port_pool == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "isakmp_cfg_config.port_pool == NULL\n");
-		return -1;
-	}
-	
-	pam = isakmp_cfg_config.port_pool[port].pam;
-	if (pam == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "pam handle is NULL\n");
-		return -1;
-	}
-
-	switch (inout) {
-	case ISAKMP_CFG_LOGIN:
-		error = pam_open_session(pam, 0);
-		break;
-	case ISAKMP_CFG_LOGOUT:
-		error = pam_close_session(pam, 0);
-		pam_end(pam, error);
-		isakmp_cfg_config.port_pool[port].pam = NULL;
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
-		break;
-	}
-	
-	if (error != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "pam_open_session/pam_close_session failed: %s\n",
-		    pam_strerror(pam, error)); 
-		return -1;
-        }
-
-	return 0;
-}
-#endif /* HAVE_LIBPAM */
-
-#ifdef HAVE_LIBRADIUS
-static int
-isakmp_cfg_accounting_radius(iph1, inout)
-	struct ph1handle *iph1;
-	int inout;
-{
-	/* For first time use, initialize Radius */
-	if (radius_acct_state == NULL) {
-		if ((radius_acct_state = rad_acct_open()) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot init librradius\n");
-			return -1;
-		}
-
-		if (rad_config(radius_acct_state, NULL) != 0) {
-			 plog(LLV_ERROR, LOCATION, NULL,
-			     "Cannot open librarius config file: %s\n",
-			     rad_strerror(radius_acct_state));
-			  rad_close(radius_acct_state);
-			  radius_acct_state = NULL;
-			  return -1;
-		}
-	}
-
-	if (rad_create_request(radius_acct_state, 
-	    RAD_ACCOUNTING_REQUEST) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_create_request failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	if (rad_put_string(radius_acct_state, RAD_USER_NAME, 
-	    iph1->mode_cfg->login) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_string failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	switch (inout) {
-	case ISAKMP_CFG_LOGIN:
-		inout = RAD_START;
-		break;
-	case ISAKMP_CFG_LOGOUT:
-		inout = RAD_STOP;
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
-		break;
-	}
-
-	if (rad_put_addr(radius_acct_state, 
-	    RAD_FRAMED_IP_ADDRESS, iph1->mode_cfg->addr4) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_addr failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	if (rad_put_addr(radius_acct_state, 
-	    RAD_LOGIN_IP_HOST, iph1->mode_cfg->addr4) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_addr failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	if (rad_put_int(radius_acct_state, RAD_ACCT_STATUS_TYPE, inout) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_int failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	if (isakmp_cfg_radius_common(radius_acct_state, 
-	    iph1->mode_cfg->port) != 0)
-		return -1;
-
-	if (rad_send_request(radius_acct_state) != RAD_ACCOUNTING_RESPONSE) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_send_request failed: %s\n",
-		    rad_strerror(radius_acct_state));
-		return -1;
-	}
-
-	return 0;
-}
-#endif /* HAVE_LIBRADIUS */
-
-/*
- * Attributes common to all RADIUS requests
- */
-#ifdef HAVE_LIBRADIUS
-int
-isakmp_cfg_radius_common(radius_state, port)
-	struct rad_handle *radius_state;
-	int port;
-{ 
-	struct utsname name;
-	static struct hostent *host = NULL;
-	struct in_addr nas_addr;
-
-	/* 
-	 * Find our own IP by resolving our nodename
-	 */
-	if (host == NULL) {
-		if (uname(&name) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "uname failed: %s\n", strerror(errno));
-			return -1;
-		}
-
-		if ((host = gethostbyname(name.nodename)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "gethostbyname failed: %s\n", strerror(errno));
-			return -1;
-		}
-	}
-
-	memcpy(&nas_addr, host->h_addr, sizeof(nas_addr));
-	if (rad_put_addr(radius_state, RAD_NAS_IP_ADDRESS, nas_addr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_addr failed: %s\n",
-		    rad_strerror(radius_state));
-		return -1;
-	}
-
-	if (rad_put_int(radius_state, RAD_NAS_PORT, port) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_int failed: %s\n",
-		    rad_strerror(radius_state));
-		return -1;
-	}
-
-	if (rad_put_int(radius_state, RAD_NAS_PORT_TYPE, RAD_VIRTUAL) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_int failed: %s\n",
-		    rad_strerror(radius_state));
-		return -1;
-	}
-
-	if (rad_put_int(radius_state, RAD_SERVICE_TYPE, RAD_FRAMED) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "rad_put_int failed: %s\n",
-		    rad_strerror(radius_state));
-		return -1;
-	}
-	
-	return 0;
-}
-#endif
-
-#ifndef ANDROID_PATCHED
-
-/*
-	Logs the user into the utmp system files.
-*/
-
-int
-isakmp_cfg_accounting_system(port, raddr, usr, inout)
-	int port;
-	struct sockaddr *raddr;
-	char *usr;
-	int inout;
-{
-	int error = 0;
-	struct utmp ut;
-	char term[UT_LINESIZE];
-	char addr[NI_MAXHOST];
-	
-	if (usr == NULL || usr[0]=='\0') {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"system accounting : no login found\n");
-		return -1;
-	}
-
-	sprintf(term, TERMSPEC, port);
-
-	switch (inout) {
-	case ISAKMP_CFG_LOGIN:
-		strncpy(ut.ut_name, usr, UT_NAMESIZE);
-		ut.ut_name[UT_NAMESIZE - 1] = '\0';
-
-		strncpy(ut.ut_line, term, UT_LINESIZE);
-		ut.ut_line[UT_LINESIZE - 1] = '\0';
-
-		GETNAMEINFO_NULL(raddr, addr);
-		strncpy(ut.ut_host, addr, UT_HOSTSIZE);
-		ut.ut_host[UT_HOSTSIZE - 1] = '\0';
-
-		ut.ut_time = time(NULL);
- 
-		plog(LLV_INFO, LOCATION, NULL,
-			"Accounting : '%s' logging on '%s' from %s.\n",
-			ut.ut_name, ut.ut_line, ut.ut_host);
-
-		login(&ut);
-
-		break;
-	case ISAKMP_CFG_LOGOUT:	
-
-		plog(LLV_INFO, LOCATION, NULL,
-			"Accounting : '%s' unlogging from '%s'.\n",
-			usr, term);
-
-		logout(term);
-
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
-		break;
-	}
-
-	return 0;
-}
-	
-#endif
-
-int 
-isakmp_cfg_getconfig(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buffer;
-	struct isakmp_pl_attr *attrpl;
-	struct isakmp_data *attr;
-	size_t len;
-	int error;
-	int attrcount;
-	int i;
-	int attrlist[] = {
-		INTERNAL_IP4_ADDRESS,
-		INTERNAL_IP4_NETMASK,
-		INTERNAL_IP4_DNS,
-		INTERNAL_IP4_NBNS,
-		UNITY_BANNER,
-		UNITY_DEF_DOMAIN,
-		UNITY_SPLITDNS_NAME,
-		UNITY_SPLIT_INCLUDE,
-		UNITY_LOCAL_LAN,
-		APPLICATION_VERSION,
-	};
-
-	attrcount = sizeof(attrlist) / sizeof(*attrlist);
-	len = sizeof(*attrpl) + sizeof(*attr) * attrcount;
-	    
-	if ((buffer = vmalloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return -1;
-	}
-
-	attrpl = (struct isakmp_pl_attr *)buffer->v;
-	attrpl->h.len = htons(len);
-	attrpl->type = ISAKMP_CFG_REQUEST;
-	attrpl->id = htons((u_int16_t)(eay_random() & 0xffff));
-
-	attr = (struct isakmp_data *)(attrpl + 1);
-
-	for (i = 0; i < attrcount; i++) {
-		attr->type = htons(attrlist[i]);
-		attr->lorv = htons(0);
-		attr++;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, 
-		    "Sending MODE_CFG REQUEST\n");
-
-	error = isakmp_cfg_send(iph1, buffer,
-	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1);
-
-	vfree(buffer);
-
-	return error;
-}
-
-static void
-isakmp_cfg_getaddr4(attr, ip)
-	struct isakmp_data *attr;
-	struct in_addr *ip;
-{
-	size_t alen = ntohs(attr->lorv);
-	in_addr_t *addr;
-
-	if (alen != sizeof(*ip)) {
-		plog(LLV_ERROR, LOCATION, NULL, "Bad IPv4 address len\n");
-		return;
-	}
-
-	addr = (in_addr_t *)(attr + 1);
-	ip->s_addr = *addr;
-
-	return;
-}
-
-static void
-isakmp_cfg_appendaddr4(attr, ip, num, max)
-	struct isakmp_data *attr;
-	struct in_addr *ip;
-	int *num;
-	int max;
-{
-	size_t alen = ntohs(attr->lorv);
-	in_addr_t *addr;
-
-	if (alen != sizeof(*ip)) {
-		plog(LLV_ERROR, LOCATION, NULL, "Bad IPv4 address len\n");
-		return;
-	}
-	if (*num == max) {
-		plog(LLV_ERROR, LOCATION, NULL, "Too many addresses given\n");
-		return;
-	}
-
-	addr = (in_addr_t *)(attr + 1);
-	ip->s_addr = *addr;
-	(*num)++;
-
-	return;
-}
-
-static void
-isakmp_cfg_getstring(attr, str)
-	struct isakmp_data *attr;
-	char *str;
-{
-	size_t alen = ntohs(attr->lorv);
-	char *src;
-	src = (char *)(attr + 1);
-
-	memcpy(str, src, (alen > MAXPATHLEN ? MAXPATHLEN : alen));
-
-	return;
-}
-
-#define IP_MAX 40
-
-void
-isakmp_cfg_iplist_to_str(dest, count, addr, withmask)
-	char *dest;
-	int count;
-	void *addr;
-	int withmask;
-{
-	int i;
-	int p;
-	int l;
-	struct unity_network tmp;
-	for(i = 0, p = 0; i < count; i++) {
-		if(withmask == 1)
-			l = sizeof(struct unity_network);
-		else
-			l = sizeof(struct in_addr);
-		memcpy(&tmp, addr, l);
-#if defined(ANDROID_CHANGES)
-		addr = ((uint8_t*) addr) + l;
-#else
-		addr += l;
-#endif
-		if((uint32_t)tmp.addr4.s_addr == 0)
-			break;
-	
-		inet_ntop(AF_INET, &tmp.addr4, dest + p, IP_MAX);
-		p += strlen(dest + p);
-		if(withmask == 1) {
-			dest[p] = '/';
-			p++;
-			inet_ntop(AF_INET, &tmp.mask4, dest + p, IP_MAX);
-			p += strlen(dest + p);
-		}
-		dest[p] = ' ';
-		p++;
-	}
-	if(p > 0)
-		dest[p-1] = '\0';
-	else
-		dest[0] = '\0';
-}
-
-int
-isakmp_cfg_setenv(iph1, envp, envc)
-	struct ph1handle *iph1; 
-	char ***envp;
-	int *envc;
-{
-	char addrstr[IP_MAX];
-	char addrlist[IP_MAX * MAXNS + MAXNS];
-	char *splitlist = addrlist;
-	char *splitlist_cidr;
-	char defdom[MAXPATHLEN + 1];
-	int cidr, tmp;
-	char cidrstr[4];
-	int i, p;
-	int test;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "Starting a script.\n");
-
-	/* 
-	 * Internal IPv4 address, either if 
-	 * we are a client or a server.
-	 */
-	if ((iph1->mode_cfg->flags & ISAKMP_CFG_GOT_ADDR4) ||
-#ifdef HAVE_LIBLDAP
-	    (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) ||
-#endif
-#ifdef HAVE_LIBRADIUS
-	    (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_EXTERN) ||
-#endif
-	    (iph1->mode_cfg->flags & ISAKMP_CFG_ADDR4_LOCAL)) {
-		inet_ntop(AF_INET, &iph1->mode_cfg->addr4, 
-		    addrstr, IP_MAX);
-	} else
-		addrstr[0] = '\0';
-
-	if (script_env_append(envp, envc, "INTERNAL_ADDR4", addrstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_ADDR4\n");
-		return -1;
-	}
-
-	if (iph1->mode_cfg->xauth.authdata.generic.usr != NULL) {
-		if (script_env_append(envp, envc, "XAUTH_USER", 
-		    iph1->mode_cfg->xauth.authdata.generic.usr) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot set XAUTH_USER\n");
-			return -1;
-		}
-	}
-
-	/* Internal IPv4 mask */
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_MASK4) 
-		inet_ntop(AF_INET, &iph1->mode_cfg->mask4, 
-		    addrstr, IP_MAX);
-	else
-		addrstr[0] = '\0';
-
-	/* 	
-	 * During several releases, documentation adverised INTERNAL_NETMASK4
-	 * while code was using INTERNAL_MASK4. We now do both.
-	 */
-
-	if (script_env_append(envp, envc, "INTERNAL_MASK4", addrstr) != 0) { 
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_MASK4\n");
-		return -1;
-	}
-
-	if (script_env_append(envp, envc, "INTERNAL_NETMASK4", addrstr) != 0) { 
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot set INTERNAL_NETMASK4\n");
-		return -1;
-	}
-
-	tmp = ntohl(iph1->mode_cfg->mask4.s_addr);
-	for (cidr = 0; tmp != 0; cidr++)
-		tmp <<= 1;
-	snprintf(cidrstr, 3, "%d", cidr);
-
-	if (script_env_append(envp, envc, "INTERNAL_CIDR4", cidrstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_CIDR4\n");
-		return -1;
-	}
-
-	/* Internal IPv4 DNS */
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_DNS4) {
-		/* First Internal IPv4 DNS (for compatibilty with older code */
-		inet_ntop(AF_INET, &iph1->mode_cfg->dns4[0], 
-		    addrstr, IP_MAX);
-
-		/* Internal IPv4 DNS - all */
-		isakmp_cfg_iplist_to_str(addrlist, iph1->mode_cfg->dns4_index,
-			(void *)iph1->mode_cfg->dns4, 0);
-	} else {
-		addrstr[0] = '\0';
-		addrlist[0] = '\0';
-	}
-
-	if (script_env_append(envp, envc, "INTERNAL_DNS4", addrstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set INTERNAL_DNS4\n");
-		return -1;
-	}
-	if (script_env_append(envp, envc, "INTERNAL_DNS4_LIST", addrlist) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot set INTERNAL_DNS4_LIST\n");
-		return -1;
-	}
-	
-	/* Internal IPv4 WINS */
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_WINS4) {
-		/* 
-		 * First Internal IPv4 WINS 
-		 * (for compatibilty with older code 
-		 */
-		inet_ntop(AF_INET, &iph1->mode_cfg->wins4[0], 
-		    addrstr, IP_MAX);
-
-		/* Internal IPv4 WINS - all */
-		isakmp_cfg_iplist_to_str(addrlist, iph1->mode_cfg->wins4_index,
-			(void *)iph1->mode_cfg->wins4, 0);
-	} else {
-		addrstr[0] = '\0';
-		addrlist[0] = '\0';
-	}
-
-	if (script_env_append(envp, envc, "INTERNAL_WINS4", addrstr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot set INTERNAL_WINS4\n");
-		return -1;
-	}
-	if (script_env_append(envp, envc, 
-	    "INTERNAL_WINS4_LIST", addrlist) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot set INTERNAL_WINS4_LIST\n");
-		return -1;
-	}
-
-	/* Deault domain */
-	if(iph1->mode_cfg->flags & ISAKMP_CFG_GOT_DEFAULT_DOMAIN) 
-		strncpy(defdom, 
-		    iph1->mode_cfg->default_domain, 
-		    MAXPATHLEN + 1);
-	else
-		defdom[0] = '\0';
-	
-	if (script_env_append(envp, envc, "DEFAULT_DOMAIN", defdom) != 0) { 
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot set DEFAULT_DOMAIN\n");
-		return -1;
-	}
-
-	/* Split networks */
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_SPLIT_INCLUDE) {
-		splitlist =
-		    splitnet_list_2str(iph1->mode_cfg->split_include, NETMASK);
-		splitlist_cidr =
-		    splitnet_list_2str(iph1->mode_cfg->split_include, CIDR);
-	} else {
-		splitlist = addrlist;
-		splitlist_cidr = addrlist;
-		addrlist[0] = '\0';
-	}
-
-	if (script_env_append(envp, envc, "SPLIT_INCLUDE", splitlist) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set SPLIT_INCLUDE\n");
-		return -1;
-	}
-	if (script_env_append(envp, envc,
-	    "SPLIT_INCLUDE_CIDR", splitlist_cidr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Cannot set SPLIT_INCLUDE_CIDR\n");
-		return -1;
-	}
-	if (splitlist != addrlist)
-		racoon_free(splitlist);
-	if (splitlist_cidr != addrlist)
-		racoon_free(splitlist_cidr);
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_GOT_SPLIT_LOCAL) {
-		splitlist =
-		    splitnet_list_2str(iph1->mode_cfg->split_local, NETMASK);
-		splitlist_cidr =
-		    splitnet_list_2str(iph1->mode_cfg->split_local, CIDR);
-	} else {
-		splitlist = addrlist;
-		splitlist_cidr = addrlist;
-		addrlist[0] = '\0';
-	}
-
-	if (script_env_append(envp, envc, "SPLIT_LOCAL", splitlist) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot set SPLIT_LOCAL\n");
-		return -1;
-	}
-	if (script_env_append(envp, envc,
-	    "SPLIT_LOCAL_CIDR", splitlist_cidr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Cannot set SPLIT_LOCAL_CIDR\n");
-		return -1;
-	}
-	if (splitlist != addrlist)
-		racoon_free(splitlist);
-	if (splitlist_cidr != addrlist)
-		racoon_free(splitlist_cidr);
-
-	return 0;
-}
-
-int
-isakmp_cfg_resize_pool(size)
-	int size;
-{
-	struct isakmp_cfg_port *new_pool;
-	size_t len;
-	int i;
-
-	if (size == isakmp_cfg_config.pool_size)
-		return 0;
-
-	plog(LLV_INFO, LOCATION, NULL,
-	    "Resize address pool from %zu to %d\n",
-	    isakmp_cfg_config.pool_size, size);
-
-	/* If a pool already exists, check if we can shrink it */
-	if ((isakmp_cfg_config.port_pool != NULL) &&
-	    (size < isakmp_cfg_config.pool_size)) {
-		for (i = isakmp_cfg_config.pool_size-1; i >= size; --i) {
-			if (isakmp_cfg_config.port_pool[i].used) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "resize pool from %zu to %d impossible "
-				    "port %d is in use\n", 
-				    isakmp_cfg_config.pool_size, size, i);
-				size = i;
-				break;
-			}	
-		}
-	}
-
-	len = size * sizeof(*isakmp_cfg_config.port_pool);
-	new_pool = racoon_realloc(isakmp_cfg_config.port_pool, len);
-	if (new_pool == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "resize pool from %zu to %d impossible: %s",
-		    isakmp_cfg_config.pool_size, size, strerror(errno));
-		return -1;
-	}
-
-	/* If size increase, intialize correctly the new records */
-	if (size > isakmp_cfg_config.pool_size) {
-		size_t unit;
-		size_t old_size;
-
-		unit =  sizeof(*isakmp_cfg_config.port_pool);
-		old_size = isakmp_cfg_config.pool_size;
-
-		bzero((char *)new_pool + (old_size * unit), 
-		    (size - old_size) * unit);
-	}
-
-	isakmp_cfg_config.port_pool = new_pool;
-	isakmp_cfg_config.pool_size = size;
-
-	return 0;
-}
-
-int
-isakmp_cfg_init(cold) 
-	int cold;
-{
-	int i;
-	int error;
-
-	isakmp_cfg_config.network4 = (in_addr_t)0x00000000;
-	isakmp_cfg_config.netmask4 = (in_addr_t)0x00000000;
-	for (i = 0; i < MAXNS; i++)
-		isakmp_cfg_config.dns4[i] = (in_addr_t)0x00000000;
-	isakmp_cfg_config.dns4_index = 0;
-	for (i = 0; i < MAXWINS; i++)
-		isakmp_cfg_config.nbns4[i] = (in_addr_t)0x00000000;
-	isakmp_cfg_config.nbns4_index = 0;
-	if (cold == ISAKMP_CFG_INIT_COLD)
-		isakmp_cfg_config.port_pool = NULL;
-	isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_SYSTEM;
-	isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_SYSTEM;
-	if (cold == ISAKMP_CFG_INIT_COLD) {
-		if (isakmp_cfg_config.grouplist != NULL) {
-			for (i = 0; i < isakmp_cfg_config.groupcount; i++)
-				racoon_free(isakmp_cfg_config.grouplist[i]);
-			racoon_free(isakmp_cfg_config.grouplist);
-		}
-	}
-	isakmp_cfg_config.grouplist = NULL;
-	isakmp_cfg_config.groupcount = 0;
-	isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LOCAL;
-	isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_NONE;
-	if (cold == ISAKMP_CFG_INIT_COLD)
-		isakmp_cfg_config.pool_size = 0;
-	isakmp_cfg_config.auth_throttle = THROTTLE_PENALTY;
-	strlcpy(isakmp_cfg_config.default_domain, ISAKMP_CFG_DEFAULT_DOMAIN,
-	    MAXPATHLEN);
-	strlcpy(isakmp_cfg_config.motd, ISAKMP_CFG_MOTD, MAXPATHLEN);
-
-	if (cold != ISAKMP_CFG_INIT_COLD )
-		if (isakmp_cfg_config.splitnet_list != NULL)
-			splitnet_list_free(isakmp_cfg_config.splitnet_list,
-				&isakmp_cfg_config.splitnet_count);
-	isakmp_cfg_config.splitnet_list = NULL;
-	isakmp_cfg_config.splitnet_count = 0;
-	isakmp_cfg_config.splitnet_type = 0;
-
-	isakmp_cfg_config.pfs_group = 0;
-	isakmp_cfg_config.save_passwd = 0;
-
-	if (cold != ISAKMP_CFG_INIT_COLD )
-		if (isakmp_cfg_config.splitdns_list != NULL)
-			racoon_free(isakmp_cfg_config.splitdns_list);
-	isakmp_cfg_config.splitdns_list = NULL;
-	isakmp_cfg_config.splitdns_len = 0;
-
-#if 0
-	if (cold == ISAKMP_CFG_INIT_COLD) {
-		if ((error = isakmp_cfg_resize_pool(ISAKMP_CFG_MAX_CNX)) != 0)
-			return error;
-	}
-#endif
-
-	return 0;
-}
-
diff --git a/src/racoon/isakmp_cfg.h b/src/racoon/isakmp_cfg.h
deleted file mode 100644
index 253a17f..0000000
--- a/src/racoon/isakmp_cfg.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/*	$NetBSD: isakmp_cfg.h,v 1.6 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME$ */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifdef HAVE_LIBPAM
-#include <security/pam_appl.h>
-#endif
-
-#ifdef ANDROID_PATCHED
-#include <arpa/inet.h>
-#ifndef MAXNS
-#define MAXNS 2
-#endif
-#endif
-
-/* 
- * XXX don't forget to update 
- * src/racoon/handler.c:exclude_cfg_addr()
- * if you add IPv6 capability
- */
-
-/* Attribute types */
-#define INTERNAL_IP4_ADDRESS        1
-#define INTERNAL_IP4_NETMASK        2
-#define INTERNAL_IP4_DNS            3
-#define INTERNAL_IP4_NBNS           4
-#define INTERNAL_ADDRESS_EXPIRY     5
-#define INTERNAL_IP4_DHCP           6
-#define APPLICATION_VERSION         7
-#define INTERNAL_IP6_ADDRESS        8
-#define INTERNAL_IP6_NETMASK        9
-#define INTERNAL_IP6_DNS           10
-#define INTERNAL_IP6_NBNS          11
-#define INTERNAL_IP6_DHCP          12
-#define INTERNAL_IP4_SUBNET        13
-#define SUPPORTED_ATTRIBUTES       14
-#define INTERNAL_IP6_SUBNET        15
-
-/* For APPLICATION_VERSION */
-#define ISAKMP_CFG_RACOON_VERSION "racoon / IPsec-tools"
-
-/* For the wins servers -- XXX find the value somewhere ? */
-#define MAXWINS 4
-
-/* 
- * Global configuration for ISAKMP mode confiration address allocation 
- * Read from the mode_cfg section of racoon.conf
- */
-struct isakmp_cfg_port {
-	char	used;
-#ifdef HAVE_LIBPAM
-	pam_handle_t *pam;
-#endif
-};
-
-struct isakmp_cfg_config {
-	in_addr_t		network4;
-	in_addr_t		netmask4;
-	in_addr_t		dns4[MAXNS];
-	int			dns4_index;
-	in_addr_t		nbns4[MAXWINS];
-	int			nbns4_index;
-	struct isakmp_cfg_port 	*port_pool;
-	int			authsource;
-	int			groupsource;
-	char			**grouplist;
-	int			groupcount;
-	int			confsource;
-	int			accounting;
-	size_t			pool_size;
-	int			auth_throttle;
-	/* XXX move this to a unity specific sub-structure */
-	char			default_domain[MAXPATHLEN + 1];
-	char			motd[MAXPATHLEN + 1];
-	struct unity_netentry	*splitnet_list;
-	int			splitnet_count;
-	int			splitnet_type;
-	char 			*splitdns_list;
-	int			splitdns_len;
-	int			pfs_group;
-	int			save_passwd;
-};
-
-/* For utmp updating */
-#define TERMSPEC	"vpn%d"
-
-/* For authsource */
-#define ISAKMP_CFG_AUTH_SYSTEM	0
-#define ISAKMP_CFG_AUTH_RADIUS	1
-#define ISAKMP_CFG_AUTH_PAM	2
-#define ISAKMP_CFG_AUTH_LDAP	4
-
-/* For groupsource */
-#define ISAKMP_CFG_GROUP_SYSTEM	0
-#define ISAKMP_CFG_GROUP_LDAP	1
-
-/* For confsource */
-#define ISAKMP_CFG_CONF_LOCAL	0
-#define ISAKMP_CFG_CONF_RADIUS	1
-#define ISAKMP_CFG_CONF_LDAP	2
-
-/* For accounting */
-#define ISAKMP_CFG_ACCT_NONE	0
-#define ISAKMP_CFG_ACCT_RADIUS	1
-#define ISAKMP_CFG_ACCT_PAM	2
-#define ISAKMP_CFG_ACCT_LDAP	3
-#define ISAKMP_CFG_ACCT_SYSTEM	4
-
-/* For pool_size */
-#define ISAKMP_CFG_MAX_CNX	255
-
-/* For motd */
-#define ISAKMP_CFG_MOTD	"/etc/motd"
-
-/* For default domain */
-#define ISAKMP_CFG_DEFAULT_DOMAIN ""
-
-extern struct isakmp_cfg_config isakmp_cfg_config;
-
-/*
- * ISAKMP mode config state 
- */
-#define LOGINLEN 31
-struct isakmp_cfg_state {
-	int flags;			/* See below */
-	unsigned int port;		/* address index */
-	char login[LOGINLEN + 1];	/* login */
-	struct in_addr addr4;		/* IPv4 address */
-	struct in_addr mask4;		/* IPv4 netmask */
-	struct in_addr dns4[MAXNS];	/* IPv4 DNS (when client only) */
-	int dns4_index;			/* Number of IPv4 DNS (client only) */
-	struct in_addr wins4[MAXWINS];	/* IPv4 WINS (when client only) */
-	int wins4_index;		/* Number of IPv4 WINS (client only) */
-	char default_domain[MAXPATHLEN + 1];	/* Default domain recieved */
-	struct unity_netentry 
-	    *split_include; 		/* UNITY_SPLIT_INCLUDE */
-	int include_count;		/* Number of SPLIT_INCLUDES */
-	struct unity_netentry 
-	    *split_local;		/* UNITY_LOCAL_LAN */
-	int local_count;		/* Number of SPLIT_LOCAL */
-	struct xauth_state xauth;	/* Xauth state, if revelant */		
-	struct isakmp_ivm *ivm;		/* XXX Use iph1's ivm? */
-	u_int32_t last_msgid;           /* Last message-ID */
-};
-
-/* flags */
-#define ISAKMP_CFG_VENDORID_XAUTH	0x01	/* Supports Xauth */
-#define ISAKMP_CFG_VENDORID_UNITY	0x02	/* Cisco Unity compliant */
-#define ISAKMP_CFG_PORT_ALLOCATED	0x04	/* Port allocated */
-#define ISAKMP_CFG_ADDR4_EXTERN		0x08	/* Address from external config  */
-#define ISAKMP_CFG_MASK4_EXTERN		0x10	/* Netmask from external config */
-#define ISAKMP_CFG_ADDR4_LOCAL		0x20	/* Address from local pool */
-#define ISAKMP_CFG_MASK4_LOCAL		0x40	/* Netmask from local pool */
-#define ISAKMP_CFG_GOT_ADDR4		0x80	/* Client got address */
-#define ISAKMP_CFG_GOT_MASK4		0x100	/* Client got mask */
-#define ISAKMP_CFG_GOT_DNS4		0x200	/* Client got DNS */
-#define ISAKMP_CFG_GOT_WINS4		0x400	/* Client got WINS */
-#define ISAKMP_CFG_DELETE_PH1		0x800	/* phase 1 should be deleted */
-#define ISAKMP_CFG_GOT_DEFAULT_DOMAIN	0x1000	/* Client got default domain */
-#define ISAKMP_CFG_GOT_SPLIT_INCLUDE	0x2000	/* Client got a split network config */
-#define ISAKMP_CFG_GOT_SPLIT_LOCAL	0x4000	/* Client got a split LAN config */
-
-struct isakmp_pl_attr;
-struct ph1handle;
-struct isakmp_ivm;
-void isakmp_cfg_r(struct ph1handle *, vchar_t *);
-int isakmp_cfg_attr_r(struct ph1handle *, u_int32_t, struct isakmp_pl_attr *);
-int isakmp_cfg_reply(struct ph1handle *, struct isakmp_pl_attr *);
-int isakmp_cfg_request(struct ph1handle *, struct isakmp_pl_attr *);
-int isakmp_cfg_set(struct ph1handle *, struct isakmp_pl_attr *);
-int isakmp_cfg_send(struct ph1handle *, vchar_t *, u_int32_t, int, int);
-struct isakmp_ivm *isakmp_cfg_newiv(struct ph1handle *, u_int32_t);
-void isakmp_cfg_rmstate(struct ph1handle *);
-struct isakmp_cfg_state *isakmp_cfg_mkstate(void);
-vchar_t *isakmp_cfg_copy(struct ph1handle *, struct isakmp_data *);
-vchar_t *isakmp_cfg_short(struct ph1handle *, struct isakmp_data *, int);
-vchar_t *isakmp_cfg_varlen(struct ph1handle *, struct isakmp_data *, char *, size_t);
-vchar_t *isakmp_cfg_string(struct ph1handle *, struct isakmp_data *, char *);
-int isakmp_cfg_getconfig(struct ph1handle *);
-int isakmp_cfg_setenv(struct ph1handle *, char ***, int *);
-
-int isakmp_cfg_resize_pool(int);
-int isakmp_cfg_getport(struct ph1handle *);
-int isakmp_cfg_putport(struct ph1handle *, unsigned int);
-int isakmp_cfg_init(int);
-#define ISAKMP_CFG_INIT_COLD	1
-#define ISAKMP_CFG_INIT_WARM	0
-
-#ifdef HAVE_LIBRADIUS
-struct rad_handle;
-extern struct rad_handle *radius_acct_state;
-int isakmp_cfg_radius_common(struct rad_handle *, int); 
-#endif
-
-#ifdef HAVE_LIBPAM
-int isakmp_cfg_accounting_pam(int, int);
-void cleanup_pam(int);
-#endif
-
-int isakmp_cfg_accounting_system(int, struct sockaddr *, char *, int);
diff --git a/src/racoon/isakmp_frag.c b/src/racoon/isakmp_frag.c
deleted file mode 100644
index 6fac6a2..0000000
--- a/src/racoon/isakmp_frag.c
+++ /dev/null
@@ -1,356 +0,0 @@
-/*	$NetBSD: isakmp_frag.c,v 1.4.6.1 2009/04/22 11:25:35 tteras Exp $	*/
-
-/* Id: isakmp_frag.c,v 1.4 2004/11/13 17:31:36 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <openssl/md5.h> 
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <ctype.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "handler.h"
-#include "isakmp_frag.h"
-#include "strnames.h"
-
-int
-isakmp_sendfrags(iph1, buf) 
-	struct ph1handle *iph1;
-	vchar_t *buf;
-{
-	struct isakmp *hdr;
-	struct isakmp_frag *fraghdr;
-	caddr_t data;
-	caddr_t sdata;
-	size_t datalen;
-	size_t max_datalen;
-	size_t fraglen;
-	vchar_t *frag;
-	unsigned int trailer;
-	unsigned int fragnum = 0;
-	size_t len;
-	int etype;
-
-	/*
-	 * Catch the exchange type for later: the fragments and the
-	 * fragmented packet must have the same exchange type.
-	 */
-	hdr = (struct isakmp *)buf->v;
-	etype = hdr->etype;
-
-	/*
-	 * We want to send a a packet smaller than ISAKMP_FRAG_MAXLEN
-	 * First compute the maximum data length that will fit in it
-	 */
-	max_datalen = ISAKMP_FRAG_MAXLEN - 
-	    (sizeof(*hdr) + sizeof(*fraghdr) + sizeof(trailer));
-
-	sdata = buf->v;
-	len = buf->l;
-
-	while (len > 0) {
-		fragnum++;
-
-		if (len > max_datalen)
-			datalen = max_datalen;
-		else
-			datalen = len;
-
-		fraglen = sizeof(*hdr) 
-			+ sizeof(*fraghdr) 
-			+ datalen;
-
-		if ((frag = vmalloc(fraglen)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot allocate memory\n");
-			return -1;
-		}
-
-		set_isakmp_header1(frag, iph1, ISAKMP_NPTYPE_FRAG);
-		hdr = (struct isakmp *)frag->v;
-		hdr->etype = etype;
-
-		fraghdr = (struct isakmp_frag *)(hdr + 1);
-		fraghdr->unknown0 = htons(0);
-		fraghdr->len = htons(fraglen - sizeof(*hdr));
-		fraghdr->unknown1 = htons(1);
-		fraghdr->index = fragnum;
-		if (len == datalen)
-			fraghdr->flags = ISAKMP_FRAG_LAST;
-		else
-			fraghdr->flags = 0;
-
-		data = (caddr_t)(fraghdr + 1);
-		memcpy(data, sdata, datalen);
-
-		if (isakmp_send(iph1, frag) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL, "isakmp_send failed\n");
-			return -1;
-		}
-
-		vfree(frag);
-
-		len -= datalen;
-		sdata += datalen;
-	}
-		
-	return fragnum;
-}
-
-unsigned int 
-vendorid_frag_cap(gen)
-	struct isakmp_gen *gen;
-{
-	int *hp;
-
-	hp = (int *)(gen + 1);
-
-	return ntohl(hp[MD5_DIGEST_LENGTH / sizeof(*hp)]);
-}
-
-int 
-isakmp_frag_extract(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct isakmp *isakmp;
-	struct isakmp_frag *frag;
-	struct isakmp_frag_item *item;
-	vchar_t *buf;
-	size_t len;
-	int last_frag = 0;
-	char *data;
-	int i;
-
-	if (msg->l < sizeof(*isakmp) + sizeof(*frag)) {
-		plog(LLV_ERROR, LOCATION, NULL, "Message too short\n");
-		return -1;
-	}
-
-	isakmp = (struct isakmp *)msg->v;
-	frag = (struct isakmp_frag *)(isakmp + 1);
-
-	/* 
-	 * frag->len is the frag payload data plus the frag payload header,
-	 * whose size is sizeof(*frag) 
-	 */
-	if (msg->l < sizeof(*isakmp) + ntohs(frag->len) ||
-	    ntohs(frag->len) < sizeof(*frag) + 1) {
-		plog(LLV_ERROR, LOCATION, NULL, "Fragment too short\n");
-		return -1;
-	}
-
-	if ((buf = vmalloc(ntohs(frag->len) - sizeof(*frag))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return -1;
-	}
-
-	if ((item = racoon_malloc(sizeof(*item))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		vfree(buf);
-		return -1;
-	}
-
-	data = (char *)(frag + 1);
-	memcpy(buf->v, data, buf->l);
-
-	item->frag_num = frag->index;
-	item->frag_last = (frag->flags & ISAKMP_FRAG_LAST);
-	item->frag_next = NULL;
-	item->frag_packet = buf;
-
-	/* Look for the last frag while inserting the new item in the chain */
-	if (item->frag_last)
-		last_frag = item->frag_num;
-
-	if (iph1->frag_chain == NULL) {
-		iph1->frag_chain = item;
-	} else {
-		struct isakmp_frag_item *current;
-
-		current = iph1->frag_chain;
-		while (current->frag_next) {
-			if (current->frag_last)
-				last_frag = item->frag_num;
-			current = current->frag_next;
-		}
-		current->frag_next = item;
-	}
-
-	/* If we saw the last frag, check if the chain is complete */
-	if (last_frag != 0) {
-		for (i = 1; i <= last_frag; i++) {
-			item = iph1->frag_chain;
-			do {
-				if (item->frag_num == i)
-					break;
-				item = item->frag_next;
-			} while (item != NULL);
-
-			if (item == NULL) /* Not found */
-				break;
-		}
-
-		if (item != NULL) /* It is complete */
-			return 1;
-	}
-		
-	return 0;
-}
-
-vchar_t *
-isakmp_frag_reassembly(iph1)
-	struct ph1handle *iph1;
-{
-	struct isakmp_frag_item *item;
-	size_t len = 0;
-	vchar_t *buf = NULL;
-	int frag_count = 0;
-	int i;
-	char *data;
-
-	if ((item = iph1->frag_chain) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "No fragment to reassemble\n");
-		goto out;
-	}
-
-	do {
-		frag_count++;
-		len += item->frag_packet->l;
-		item = item->frag_next;
-	} while (item != NULL);
-	
-	if ((buf = vmalloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		goto out;
-	}
-	data = buf->v;
-
-	for (i = 1; i <= frag_count; i++) {
-		item = iph1->frag_chain;
-		do {
-			if (item->frag_num == i)
-				break;
-			item = item->frag_next;
-		} while (item != NULL);
-
-		if (item == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Missing fragment #%d\n", i);
-			vfree(buf);
-			buf = NULL;
-			goto out;
-		}
-		memcpy(data, item->frag_packet->v, item->frag_packet->l);
-		data += item->frag_packet->l;
-	}
-
-out:
-	item = iph1->frag_chain;		
-	do {
-		struct isakmp_frag_item *next_item;
-
-		next_item = item->frag_next;
-
-		vfree(item->frag_packet);
-		racoon_free(item);
-
-		item = next_item;
-	} while (item != NULL);
-
-	iph1->frag_chain = NULL;
-
-	return buf;
-}
-
-vchar_t *
-isakmp_frag_addcap(buf, cap)
-	vchar_t *buf;
-	int cap;
-{
-	int *capp;
-	size_t len;
-
-	/* If the capability has not been added, add room now */
-	len = buf->l;
-	if (len == MD5_DIGEST_LENGTH) {
-		if ((buf = vrealloc(buf, len + sizeof(cap))) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot allocate memory\n");
-			return NULL;
-		}
-		capp = (int *)(buf->v + len);
-		*capp = htonl(0);
-	}
-
-	capp = (int *)(buf->v + MD5_DIGEST_LENGTH);
-	*capp |= htonl(cap);
-
-	return buf;
-}
-
diff --git a/src/racoon/isakmp_frag.h b/src/racoon/isakmp_frag.h
deleted file mode 100644
index f2d4c33..0000000
--- a/src/racoon/isakmp_frag.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*	$NetBSD: isakmp_frag.h,v 1.5 2006/09/18 20:32:40 manu Exp $	*/
-
-/*	Id: isakmp_frag.h,v 1.3 2005/04/09 16:25:24 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* These are the values from parsing "remote {}"
-   block of the config file. */
-#define ISAKMP_FRAG_OFF		FLASE   /* = 0 */
-#define ISAKMP_FRAG_ON		TRUE    /* = 1 */
-#define ISAKMP_FRAG_FORCE	2
-
-/* IKE fragmentation capabilities */
-#define VENDORID_FRAG_IDENT 	0x80000000
-#define VENDORID_FRAG_BASE 	0x40000000
-#define VENDORID_FRAG_AGG 	0x80000000
-
-#define ISAKMP_FRAG_MAXLEN 552
-
-struct isakmp_frag_item {
-	int	frag_num;
-	int	frag_last;
-	struct isakmp_frag_item *frag_next;
-	vchar_t *frag_packet;
-};
-
-int isakmp_sendfrags(struct ph1handle *, vchar_t *);
-unsigned int vendorid_frag_cap(struct isakmp_gen *);
-int isakmp_frag_extract(struct ph1handle *, vchar_t *);
-vchar_t *isakmp_frag_reassembly(struct ph1handle *);
-vchar_t *isakmp_frag_addcap(vchar_t *, int);
diff --git a/src/racoon/isakmp_ident.c b/src/racoon/isakmp_ident.c
deleted file mode 100644
index c3f71b3..0000000
--- a/src/racoon/isakmp_ident.c
+++ /dev/null
@@ -1,1911 +0,0 @@
-/*	$NetBSD: isakmp_ident.c,v 1.6 2006/10/02 21:41:59 manu Exp $	*/
-
-/* Id: isakmp_ident.c,v 1.21 2006/04/06 16:46:08 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* Identity Protecion Exchange (Main Mode) */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "evt.h"
-#include "oakley.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "isakmp_ident.h"
-#include "isakmp_inf.h"
-#include "vendorid.h"
-
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-#ifdef HAVE_GSSAPI
-#include "gssapi.h"
-#endif
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-#ifdef ENABLE_FRAG 
-#include "isakmp_frag.h"
-#endif
-
-static vchar_t *ident_ir2mx __P((struct ph1handle *));
-static vchar_t *ident_ir3mx __P((struct ph1handle *));
-
-/* %%%
- * begin Identity Protection Mode as initiator.
- */
-/*
- * send to responder
- * 	psk: HDR, SA
- * 	sig: HDR, SA
- * 	rsa: HDR, SA
- * 	rev: HDR, SA
- */
-int
-ident_i1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg; /* must be null */
-{
-	struct payload_list *plist = NULL;
-	int error = -1;
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt[MAX_NATT_VID_COUNT] = { NULL };
-	int i;
-#endif
-#ifdef ENABLE_HYBRID  
-	vchar_t *vid_xauth = NULL;
-	vchar_t *vid_unity = NULL;
-#endif
-#ifdef ENABLE_FRAG 
-	vchar_t *vid_frag = NULL;
-#endif 
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif
-	/* validity check */
-	if (msg != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"msg has to be NULL in this function.\n");
-		goto end;
-	}
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* create isakmp index */
-	memset(&iph1->index, 0, sizeof(iph1->index));
-	isakmp_newcookie((caddr_t)&iph1->index, iph1->remote, iph1->local);
-
-	/* create SA payload for my proposal */
-	iph1->sa = ipsecdoi_setph1proposal(iph1->rmconf->proposal);
-	if (iph1->sa == NULL)
-		goto end;
-
-	/* set SA payload to propose */
-	plist = isakmp_plist_append(plist, iph1->sa, ISAKMP_NPTYPE_SA);
-
-#ifdef ENABLE_NATT
-	/* set VID payload for NAT-T if NAT-T support allowed in the config file */
-	if (iph1->rmconf->nat_traversal) 
-		plist = isakmp_plist_append_natt_vids(plist, vid_natt);
-#endif
-#ifdef ENABLE_HYBRID
-	/* Do we need Xauth VID? */
-	switch (RMAUTHMETHOD(iph1)) {
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-		if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Xauth vendor ID generation failed\n");
-		else
-			plist = isakmp_plist_append(plist,
-			    vid_xauth, ISAKMP_NPTYPE_VID);
-			
-		if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Unity vendor ID generation failed\n");
-		else
-                	plist = isakmp_plist_append(plist,
-			    vid_unity, ISAKMP_NPTYPE_VID);
-		break;
-	default:
-		break;
-	}
-#endif
-#ifdef ENABLE_FRAG
-	if (iph1->rmconf->ike_frag) {
-		if ((vid_frag = set_vendorid(VENDORID_FRAG)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Frag vendorID construction failed\n");
-		} else {
-			vid_frag = isakmp_frag_addcap(vid_frag,
-			    VENDORID_FRAG_IDENT);
-			plist = isakmp_plist_append(plist, 
-			    vid_frag, ISAKMP_NPTYPE_VID);
-		}
-	}
-#endif
-#ifdef ENABLE_DPD
-	if(iph1->rmconf->dpd){
-		vid_dpd = set_vendorid(VENDORID_DPD);
-		if (vid_dpd != NULL)
-			plist = isakmp_plist_append(plist, vid_dpd,
-			    ISAKMP_NPTYPE_VID);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-#ifdef ENABLE_FRAG
-	if (vid_frag) 
-		vfree(vid_frag);
-#endif  
-#ifdef ENABLE_NATT
-	for (i = 0; i < MAX_NATT_VID_COUNT && vid_natt[i] != NULL; i++)
-		vfree(vid_natt[i]);
-#endif
-#ifdef ENABLE_HYBRID
-	if (vid_xauth != NULL)
-		vfree(vid_xauth);
-	if (vid_unity != NULL)
-		vfree(vid_unity);
-#endif
-#ifdef ENABLE_DPD
-	if (vid_dpd != NULL)
-		vfree(vid_dpd);
-#endif
-
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR, SA
- * 	sig: HDR, SA
- * 	rsa: HDR, SA
- * 	rev: HDR, SA
- */
-int
-ident_i2recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	vchar_t *satmp = NULL;
-	int error = -1;
-	int vid_numeric;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	/*
-	 * NOTE: RedCreek(as responder) attaches N[responder-lifetime] here,
-	 *	if proposal-lifetime > lifetime-redcreek-wants.
-	 *	(see doi-08 4.5.4)
-	 *	=> According to the seciton 4.6.3 in RFC 2407, This is illegal.
-	 * NOTE: we do not really care about ordering of VID and N.
-	 *	does it matters?
-	 * NOTE: even if there's multiple VID/N, we'll ignore them.
-	 */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* SA payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-	if (isakmp_p2ph(&satmp, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-#endif
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(satmp, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-	VPTRINIT(iph1->sa_ret);
-
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (satmp)
-		vfree(satmp);
-	return error;
-}
-
-/*
- * send to responder
- * 	psk: HDR, KE, Ni
- * 	sig: HDR, KE, Ni
- *   gssapi: HDR, KE, Ni, GSSi
- * 	rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
- * 	rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
- * 	          <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
- */
-int
-ident_i2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* fix isakmp index */
-	memcpy(&iph1->index.r_ck, &((struct isakmp *)msg->v)->r_ck,
-		sizeof(cookie_t));
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->approval->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB &&
-	    gssapi_get_itoken(iph1, NULL) < 0)
-		goto end;
-#endif
-
-	/* create buffer to send isakmp payload */
-	iph1->sendbuf = ident_ir2mx(iph1);
-	if (iph1->sendbuf == NULL)
-		goto end;
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG2SENT;
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR, KE, Nr
- * 	sig: HDR, KE, Nr [, CR ]
- *   gssapi: HDR, KE, Nr, GSSr
- * 	rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
- * 	rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
- */
-int
-ident_i3recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-#ifdef ENABLE_NATT
-	vchar_t	*natd_received;
-	int natd_seq = 0, natd_verified;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_CR:
-			if (oakley_savecr(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
-			    pa->type == iph1->natt_options->payload_nat_d) {
-				natd_received = NULL;
-				if (isakmp_p2ph (&natd_received, pa->ptr) < 0)
-					goto end;
-                        
-				/* set both bits first so that we can clear them
-				   upon verifying hashes */
-				if (natd_seq == 0)
-					iph1->natt_flags |= NAT_DETECTED;
-                        
-				/* this function will clear appropriate bits bits 
-				   from iph1->natt_flags */
-				natd_verified = natt_compare_addr_hash (iph1,
-					natd_received, natd_seq++);
-                        
-				plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-					natd_seq - 1,
-					natd_verified ? "verified" : "doesn't match");
-                        
-				vfree (natd_received);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1)) {
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-		if (iph1->natt_flags & NAT_DETECTED)
-			natt_float_ports (iph1);
-	}
-#endif
-
-	/* payload existency check */
-	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	if (oakley_checkcr(iph1) < 0) {
-		/* Ignore this error in order to be interoperability. */
-		;
-	}
-
-	iph1->status = PHASE1ST_MSG3RECEIVED;
-
-	error = 0;
-
-end:
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-	if (pbuf)
-		vfree(pbuf);
-	if (error) {
-		VPTRINIT(iph1->dhpub_p);
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-		oakley_delcert(iph1->cr_p);
-		iph1->cr_p = NULL;
-	}
-
-	return error;
-}
-
-/*
- * send to responder
- * 	psk: HDR*, IDi1, HASH_I
- * 	sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
- *   gssapi: HDR*, IDi1, < Gssi(n) | HASH_I >
- * 	rsa: HDR*, HASH_I
- * 	rev: HDR*, HASH_I
- */
-int
-ident_i3send(iph1, msg0)
-	struct ph1handle *iph1;
-	vchar_t *msg0;
-{
-	int error = -1;
-	int dohash = 1;
-#ifdef HAVE_GSSAPI
-	int len;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG3RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid(iph1) < 0)
-		goto end;
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB &&
-	    gssapi_more_tokens(iph1)) {
-		plog(LLV_DEBUG, LOCATION, NULL, "calling get_itoken\n");
-		if (gssapi_get_itoken(iph1, &len) < 0)
-			goto end;
-		if (len != 0)
-			dohash = 0;
-	}
-#endif
-
-	/* generate HASH to send */
-	if (dohash) {
-		iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
-		if (iph1->hash == NULL)
-			goto end;
-	} else
-		iph1->hash = NULL;
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	/* create HDR;ID;HASH payload */
-	iph1->sendbuf = ident_ir3mx(iph1);
-	if (iph1->sendbuf == NULL)
-		goto end;
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg0) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->ive->v, iph1->ivm->iv->v, iph1->ivm->iv->l);
-
-	iph1->status = PHASE1ST_MSG3SENT;
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * receive from responder
- * 	psk: HDR*, IDr1, HASH_R
- * 	sig: HDR*, IDr1, [ CERT, ] SIG_R
- *   gssapi: HDR*, IDr1, < GSSr(n) | HASH_R >
- * 	rsa: HDR*, HASH_R
- * 	rev: HDR*, HASH_R
- */
-int
-ident_i4recv(iph1, msg0)
-	struct ph1handle *iph1;
-	vchar_t *msg0;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	vchar_t *msg = NULL;
-	int error = -1;
-	int type;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG3SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* decrypting */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"ignore the packet, "
-			"expecting the packet encrypted.\n");
-		goto end;
-	}
-	msg = oakley_do_decrypt(iph1, msg0, iph1->ivm->iv, iph1->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	iph1->pl_hash = NULL;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph1);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-	/* validate authentication value */
-#ifdef HAVE_GSSAPI
-	if (gsstoken == NULL) {
-#endif
-		type = oakley_validate_auth(iph1);
-		if (type != 0) {
-			if (type == -1) {
-				/* msg printed inner oakley_validate_auth() */
-				goto end;
-			}
-			EVT_PUSH(iph1->local, iph1->remote, 
-			    EVTT_PEERPH1AUTH_FAILED, NULL);
-			isakmp_info_send_n1(iph1, type, NULL);
-			goto end;
-		}
-#ifdef HAVE_GSSAPI
-	}
-#endif
-
-	/*
-	 * XXX: Should we do compare two addresses, ph1handle's and ID
-	 * payload's.
-	 */
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote, "peer's ID:");
-	plogdump(LLV_DEBUG, iph1->id_p->v, iph1->id_p->l);
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->ive->l);
-
-	/*
-	 * If we got a GSS token, we need to this roundtrip again.
-	 */
-#ifdef HAVE_GSSAPI
-	iph1->status = gsstoken != 0 ? PHASE1ST_MSG3RECEIVED : 
-	    PHASE1ST_MSG4RECEIVED;
-#else
-	iph1->status = PHASE1ST_MSG4RECEIVED;
-#endif
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (msg)
-		vfree(msg);
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-
-	if (error) {
-		VPTRINIT(iph1->id_p);
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-	}
-
-	return error;
-}
-
-/*
- * status update and establish isakmp sa.
- */
-int
-ident_i4send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG4RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->iv->l);
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, SA
- * 	sig: HDR, SA
- * 	rsa: HDR, SA
- * 	rev: HDR, SA
- */
-int
-ident_r1recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int vid_numeric;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	/*
-	 * NOTE: XXX even if multiple VID, we'll silently ignore those.
-	 */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* check the position of SA payload */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		goto end;
-	}
-	if (isakmp_p2ph(&iph1->sa, pa->ptr) < 0)
-		goto end;
-	pa++;
-
-	for (/*nothing*/;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_VID:
-			vid_numeric = handle_vendorid(iph1, pa->ptr);
-#ifdef ENABLE_FRAG
-			if ((vid_numeric == VENDORID_FRAG) &&
-			    (vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_IDENT))
-				iph1->frag = 1;
-#endif   
-			break;
-		default:
-			/*
-			 * We don't send information to the peer even
-			 * if we received malformed packet.  Because we
-			 * can't distinguish the malformed packet and
-			 * the re-sent packet.  And we do same behavior
-			 * when we expect encrypted packet.
-			 */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog(LLV_INFO, LOCATION, iph1->remote,
-		     "Selected NAT-T version: %s\n",
-		     vid_string_by_id(iph1->natt_options->version));
-#endif
-
-	/* check SA payload and set approval SA for use */
-	if (ipsecdoi_checkph1proposal(iph1->sa, iph1) < 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"failed to get valid proposal.\n");
-		/* XXX send information */
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG1RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (error) {
-		VPTRINIT(iph1->sa);
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR, SA
- * 	sig: HDR, SA
- * 	rsa: HDR, SA
- * 	rev: HDR, SA
- */
-int
-ident_r1send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	struct payload_list *plist = NULL;
-	int error = -1;
-	vchar_t *gss_sa = NULL;
-#ifdef HAVE_GSSAPI
-	int free_gss_sa = 0;
-#endif
-#ifdef ENABLE_NATT
-	vchar_t *vid_natt = NULL;
-#endif
-#ifdef ENABLE_HYBRID
-        vchar_t *vid_xauth = NULL;
-        vchar_t *vid_unity = NULL;
-#endif  
-#ifdef ENABLE_DPD
-	vchar_t *vid_dpd = NULL;
-#endif
-#ifdef ENABLE_FRAG          
-	vchar_t *vid_frag = NULL;
-#endif 
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* set responder's cookie */
-	isakmp_newcookie((caddr_t)&iph1->index.r_ck, iph1->remote, iph1->local);
-
-#ifdef HAVE_GSSAPI
-	if (iph1->approval->gssid != NULL) {
-		gss_sa = ipsecdoi_setph1proposal(iph1->approval);
-		if (gss_sa != iph1->sa_ret)
-			free_gss_sa = 1;
-	} else 
-#endif
-		gss_sa = iph1->sa_ret;
-
-	/* set SA payload to reply */
-	plist = isakmp_plist_append(plist, gss_sa, ISAKMP_NPTYPE_SA);
-
-#ifdef ENABLE_HYBRID
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
-		plog (LLV_INFO, LOCATION, NULL, "Adding xauth VID payload.\n");
-		if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Xauth vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist,
-		    vid_xauth, ISAKMP_NPTYPE_VID);
-	}
-
-	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) {
-		if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot create Unity vendor ID\n");
-			goto end;
-		}
-		plist = isakmp_plist_append(plist,
-		    vid_unity, ISAKMP_NPTYPE_VID);
-	}
-#endif
-#ifdef ENABLE_NATT
-	/* Has the peer announced NAT-T? */
-	if (NATT_AVAILABLE(iph1))
-		vid_natt = set_vendorid(iph1->natt_options->version);
-
-	if (vid_natt)
-		plist = isakmp_plist_append(plist, vid_natt, ISAKMP_NPTYPE_VID);
-#endif
-#ifdef ENABLE_DPD
-	/* XXX only send DPD VID if remote sent it ? */
-	if(iph1->rmconf->dpd){
-		vid_dpd = set_vendorid(VENDORID_DPD);
-		if (vid_dpd != NULL)
-			plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID);
-	}
-#endif
-#ifdef ENABLE_FRAG
-	if (iph1->frag) {
-		vid_frag = set_vendorid(VENDORID_FRAG);
-		if (vid_frag != NULL)
-			vid_frag = isakmp_frag_addcap(vid_frag,
-			    VENDORID_FRAG_IDENT);
-		if (vid_frag == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Frag vendorID construction failed\n");
-		else
-			plist = isakmp_plist_append(plist, 
-			     vid_frag, ISAKMP_NPTYPE_VID);
-	}
-#endif
-
-	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1) {
-		goto end;
-	}
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG1SENT;
-
-	error = 0;
-
-end:
-#ifdef HAVE_GSSAPI
-	if (free_gss_sa)
-		vfree(gss_sa);
-#endif
-#ifdef ENABLE_NATT
-	if (vid_natt)
-		vfree(vid_natt);
-#endif
-#ifdef ENABLE_HYBRID
-	if (vid_xauth != NULL)
-		vfree(vid_xauth);
-	if (vid_unity != NULL)
-		vfree(vid_unity);
-#endif
-#ifdef ENABLE_DPD
-	if (vid_dpd != NULL)
-		vfree(vid_dpd);
-#endif
-#ifdef ENABLE_FRAG
-	if (vid_frag != NULL)
-		vfree(vid_frag);
-#endif
-
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR, KE, Ni
- * 	sig: HDR, KE, Ni
- *   gssapi: HDR, KE, Ni, GSSi
- * 	rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
- * 	rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
- * 	          <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
- */
-int
-ident_r2recv(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-#ifdef ENABLE_NATT
-	int natd_seq = 0;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_CR:
-			plog(LLV_WARNING, LOCATION, iph1->remote,
-				"CR received, ignore it. "
-				"It should be in other exchange.\n");
-			break;
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATD_DRAFT:
-		case ISAKMP_NPTYPE_NATD_RFC:
-			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
-				pa->type == iph1->natt_options->payload_nat_d)
-			{
-				vchar_t *natd_received = NULL;
-				int natd_verified;
-				
-				if (isakmp_p2ph (&natd_received, pa->ptr) < 0)
-					goto end;
-				
-				if (natd_seq == 0)
-					iph1->natt_flags |= NAT_DETECTED;
-				
-				natd_verified = natt_compare_addr_hash (iph1,
-					natd_received, natd_seq++);
-				
-				plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n",
-					natd_seq - 1,
-					natd_verified ? "verified" : "doesn't match");
-				
-				vfree (natd_received);
-				break;
-			}
-			/* passthrough to default... */
-#endif
-
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-#ifdef ENABLE_NATT
-	if (NATT_AVAILABLE(iph1))
-		plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n",
-		      iph1->natt_flags & NAT_DETECTED ? 
-		      		"detected:" : "not detected",
-		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
-		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
-#endif
-
-	/* payload existency check */
-	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	iph1->status = PHASE1ST_MSG2RECEIVED;
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-
-	if (error) {
-		VPTRINIT(iph1->dhpub_p);
-		VPTRINIT(iph1->nonce_p);
-		VPTRINIT(iph1->id_p);
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR, KE, Nr
- * 	sig: HDR, KE, Nr [, CR ]
- *   gssapi: HDR, KE, Nr, GSSr
- * 	rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
- * 	rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
- */
-int
-ident_r2send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* generate DH public value */
-	if (oakley_dh_generate(iph1->approval->dhgrp,
-				&iph1->dhpub, &iph1->dhpriv) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
-	if (iph1->nonce == NULL)
-		goto end;
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB)
-		gssapi_get_rtoken(iph1, NULL);
-#endif
-
-	/* create HDR;KE;NONCE payload */
-	iph1->sendbuf = ident_ir2mx(iph1);
-	if (iph1->sendbuf == NULL)
-		goto end;
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
-#endif
-
-	/* send the packet, add to the schedule to resend */
-	iph1->retry_counter = iph1->rmconf->retry_counter;
-	if (isakmp_ph1resend(iph1) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* compute sharing secret of DH */
-	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
-				iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0)
-		goto end;
-
-	/* generate SKEYIDs & IV & final cipher key */
-	if (oakley_skeyid(iph1) < 0)
-		goto end;
-	if (oakley_skeyid_dae(iph1) < 0)
-		goto end;
-	if (oakley_compute_enckey(iph1) < 0)
-		goto end;
-	if (oakley_newiv(iph1) < 0)
-		goto end;
-
-	iph1->status = PHASE1ST_MSG2SENT;
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * receive from initiator
- * 	psk: HDR*, IDi1, HASH_I
- * 	sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
- *   gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I >
- * 	rsa: HDR*, HASH_I
- * 	rev: HDR*, HASH_I
- */
-int
-ident_r3recv(iph1, msg0)
-	struct ph1handle *iph1;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-	int error = -1;
-	int type;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG2SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* decrypting */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"reject the packet, "
-			"expecting the packet encrypted.\n");
-		goto end;
-	}
-	msg = oakley_do_decrypt(iph1, msg0, iph1->ivm->iv, iph1->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	iph1->pl_hash = NULL;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_ID:
-			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_HASH:
-			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_CR:
-			if (oakley_savecr(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_CERT:
-			if (oakley_savecert(iph1, pa->ptr) < 0)
-				goto end;
-			break;
-		case ISAKMP_NPTYPE_SIG:
-			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0)
-				goto end;
-			break;
-#ifdef HAVE_GSSAPI
-		case ISAKMP_NPTYPE_GSS:
-			if (isakmp_p2ph(&gsstoken, pa->ptr) < 0)
-				goto end;
-			gssapi_save_received_token(iph1, gsstoken);
-			break;
-#endif
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph1);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-	/* XXX same as ident_i4recv(), should be merged. */
-    {
-	int ng = 0;
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-#endif
-		if (iph1->id_p == NULL || iph1->pl_hash == NULL)
-			ng++;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-		if (iph1->id_p == NULL || iph1->sig_p == NULL)
-			ng++;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		if (iph1->pl_hash == NULL)
-			ng++;
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		if (gsstoken == NULL && iph1->pl_hash == NULL)
-			ng++;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid authmethod %d why ?\n",
-			iph1->approval->authmethod);
-		goto end;
-	}
-	if (ng) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-    }
-
-	/* verify identifier */
-	if (ipsecdoi_checkid1(iph1) != 0) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid ID payload.\n");
-		goto end;
-	}
-
-	/* validate authentication value */
-#ifdef HAVE_GSSAPI
-	if (gsstoken == NULL) {
-#endif
-		type = oakley_validate_auth(iph1);
-		if (type != 0) {
-			if (type == -1) {
-				/* msg printed inner oakley_validate_auth() */
-				goto end;
-			}
-			EVT_PUSH(iph1->local, iph1->remote, 
-			    EVTT_PEERPH1AUTH_FAILED, NULL);
-			isakmp_info_send_n1(iph1, type, NULL);
-			goto end;
-		}
-#ifdef HAVE_GSSAPI
-	}
-#endif
-
-	if (oakley_checkcr(iph1) < 0) {
-		/* Ignore this error in order to be interoperability. */
-		;
-	}
-
-	/*
-	 * XXX: Should we do compare two addresses, ph1handle's and ID
-	 * payload's.
-	 */
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote, "peer's ID\n");
-	plogdump(LLV_DEBUG, iph1->id_p->v, iph1->id_p->l);
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->ive->l);
-
-#ifdef HAVE_GSSAPI
-	iph1->status = gsstoken != NULL ? PHASE1ST_MSG2RECEIVED :
-	    PHASE1ST_MSG3RECEIVED;
-#else
-	iph1->status = PHASE1ST_MSG3RECEIVED;
-#endif
-
-	error = 0;
-
-end:
-	if (pbuf)
-		vfree(pbuf);
-	if (msg)
-		vfree(msg);
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-
-	if (error) {
-		VPTRINIT(iph1->id_p);
-		oakley_delcert(iph1->cert_p);
-		iph1->cert_p = NULL;
-		oakley_delcert(iph1->crl_p);
-		iph1->crl_p = NULL;
-		VPTRINIT(iph1->sig_p);
-		oakley_delcert(iph1->cr_p);
-		iph1->cr_p = NULL;
-	}
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	psk: HDR*, IDr1, HASH_R
- * 	sig: HDR*, IDr1, [ CERT, ] SIG_R
- *   gssapi: HDR*, IDr1, < GSSr(n) | HASH_R >
- * 	rsa: HDR*, HASH_R
- * 	rev: HDR*, HASH_R
- */
-int
-ident_r3send(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-	int error = -1;
-	int dohash = 1;
-#ifdef HAVE_GSSAPI
-	int len;
-#endif
-
-	/* validity check */
-	if (iph1->status != PHASE1ST_MSG3RECEIVED) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph1->status);
-		goto end;
-	}
-
-	/* make ID payload into isakmp status */
-	if (ipsecdoi_setid1(iph1) < 0)
-		goto end;
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB &&
-	    gssapi_more_tokens(iph1)) {
-		gssapi_get_rtoken(iph1, &len);
-		if (len != 0)
-			dohash = 0;
-	}
-#endif
-
-	if (dohash) {
-		/* generate HASH to send */
-		plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_R\n");
-		iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
-		if (iph1->hash == NULL)
-			goto end;
-	} else
-		iph1->hash = NULL;
-
-	/* set encryption flag */
-	iph1->flags |= ISAKMP_FLAG_E;
-
-	/* create HDR;ID;HASH payload */
-	iph1->sendbuf = ident_ir3mx(iph1);
-	if (iph1->sendbuf == NULL)
-		goto end;
-
-	/* send HDR;ID;HASH to responder */
-	if (isakmp_send(iph1, iph1->sendbuf) < 0)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* see handler.h about IV synchronization. */
-	memcpy(iph1->ivm->ive->v, iph1->ivm->iv->v, iph1->ivm->iv->l);
-
-	iph1->status = PHASE1ST_ESTABLISHED;
-
-	error = 0;
-
-end:
-
-	return error;
-}
-
-/*
- * This is used in main mode for:
- * initiator's 3rd exchange send to responder
- * 	psk: HDR, KE, Ni
- * 	sig: HDR, KE, Ni
- * 	rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
- * 	rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
- * 	          <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
- * responders 2nd exchnage send to initiator
- * 	psk: HDR, KE, Nr
- * 	sig: HDR, KE, Nr [, CR ]
- * 	rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
- * 	rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
- */
-static vchar_t *
-ident_ir2mx(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf = 0;
-	struct payload_list *plist = NULL;
-	int need_cr = 0;
-	vchar_t *cr = NULL;
-	vchar_t *vid = NULL;
-	int error = -1;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstoken = NULL;
-#endif
-#ifdef ENABLE_NATT
-	vchar_t *natd[2] = { NULL, NULL };
-#endif
-
-	/* create CR if need */
-	if (iph1->side == RESPONDER
-	 && iph1->rmconf->send_cr
-	 && oakley_needcr(iph1->approval->authmethod)
-	 && iph1->rmconf->peerscertfile == NULL) {
-		need_cr = 1;
-		cr = oakley_getcr(iph1);
-		if (cr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get cr buffer.\n");
-			goto end;
-		}
-	}
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB)
-		gssapi_get_token_to_send(iph1, &gsstoken);
-#endif
-
-	/* create isakmp KE payload */
-	plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
-
-	/* create isakmp NONCE payload */
-	plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB)
-		plist = isakmp_plist_append(plist, gsstoken, ISAKMP_NPTYPE_GSS);
-#endif
-
-	/* append vendor id, if needed */
-	if (vid)
-		plist = isakmp_plist_append(plist, vid, ISAKMP_NPTYPE_VID);
-
-	/* create isakmp CR payload if needed */
-	if (need_cr)
-		plist = isakmp_plist_append(plist, cr, ISAKMP_NPTYPE_CR);
-
-#ifdef ENABLE_NATT
-	/* generate and append NAT-D payloads */
-	if (NATT_AVAILABLE(iph1) && iph1->status == PHASE1ST_MSG2RECEIVED)
-	{
-		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->remote));
-			goto end;
-		}
-
-		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"NAT-D hashing failed for %s\n", saddr2str(iph1->local));
-			goto end;
-		}
-
-		plog (LLV_INFO, LOCATION, NULL, "Adding remote and local NAT-D payloads.\n");
-		plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
-		plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
-	}
-#endif
-	
-	buf = isakmp_plist_set_all (&plist, iph1);
-	
-	error = 0;
-
-end:
-	if (error && buf != NULL) {
-		vfree(buf);
-		buf = NULL;
-	}
-	if (cr)
-		vfree(cr);
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-	if (vid)
-		vfree(vid);
-
-#ifdef ENABLE_NATT
-	if (natd[0])
-		vfree(natd[0]);
-	if (natd[1])
-		vfree(natd[1]);
-#endif
-
-	return buf;
-}
-
-/*
- * This is used in main mode for:
- * initiator's 4th exchange send to responder
- * 	psk: HDR*, IDi1, HASH_I
- * 	sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
- *   gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I >
- * 	rsa: HDR*, HASH_I
- * 	rev: HDR*, HASH_I
- * responders 3rd exchnage send to initiator
- * 	psk: HDR*, IDr1, HASH_R
- * 	sig: HDR*, IDr1, [ CERT, ] SIG_R
- *   gssapi: HDR*, [ IDr1, ] < GSSr(n) | HASH_R >
- * 	rsa: HDR*, HASH_R
- * 	rev: HDR*, HASH_R
- */
-static vchar_t *
-ident_ir3mx(iph1)
-	struct ph1handle *iph1;
-{
-	struct payload_list *plist = NULL;
-	vchar_t *buf = NULL, *new = NULL;
-	int need_cr = 0;
-	int need_cert = 0;
-	vchar_t *cr = NULL;
-	int error = -1;
-#ifdef HAVE_GSSAPI
-	int nptype;
-	vchar_t *gsstoken = NULL;
-	vchar_t *gsshash = NULL;
-#endif
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-#endif
-		/* create isakmp ID payload */
-		plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-
-		/* create isakmp HASH payload */
-		plist = isakmp_plist_append(plist, iph1->hash, ISAKMP_NPTYPE_HASH);
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif 
-		if (oakley_getmycert(iph1) < 0)
-			goto end;
-
-		if (oakley_getsign(iph1) < 0)
-			goto end;
-
-		/* create CR if need */
-		if (iph1->side == INITIATOR
-		 && iph1->rmconf->send_cr
-	 	 && oakley_needcr(iph1->approval->authmethod)
-		 && iph1->rmconf->peerscertfile == NULL) {
-			need_cr = 1;
-			cr = oakley_getcr(iph1);
-			if (cr == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get cr buffer.\n");
-				goto end;
-			}
-		}
-
-		if (iph1->cert != NULL && iph1->rmconf->send_cert)
-			need_cert = 1;
-
-		/* add ID payload */
-		plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-
-		/* add CERT payload if there */
-		if (need_cert)
-			plist = isakmp_plist_append(plist, iph1->cert->pl, ISAKMP_NPTYPE_CERT);
-		/* add SIG payload */
-		plist = isakmp_plist_append(plist, iph1->sig, ISAKMP_NPTYPE_SIG);
-
-		/* create isakmp CR payload */
-		if (need_cr)
-			plist = isakmp_plist_append(plist, cr, ISAKMP_NPTYPE_CR);
-		break;
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		if (iph1->hash != NULL) {
-			gsshash = gssapi_wraphash(iph1);
-			if (gsshash == NULL)
-				goto end;
-		} else {
-			gssapi_get_token_to_send(iph1, &gsstoken);
-		}
-
-		if (!gssapi_id_sent(iph1)) {
-			/* create isakmp ID payload */
-			plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
-			gssapi_set_id_sent(iph1);
-		}
-
-		if (iph1->hash != NULL)
-			/* create isakmp HASH payload */
-			plist = isakmp_plist_append(plist, gsshash, ISAKMP_NPTYPE_HASH);
-		else
-			plist = isakmp_plist_append(plist, gsstoken, ISAKMP_NPTYPE_GSS);
-		break;
-#endif
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not supported authentication type %d\n",
-			iph1->approval->authmethod);
-		goto end;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid authentication type %d\n",
-			iph1->approval->authmethod);
-		goto end;
-	}
-
-	buf = isakmp_plist_set_all (&plist, iph1);
-	
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(buf, iph1->local, iph1->remote, 1);
-#endif
-
-	/* encoding */
-	new = oakley_do_encrypt(iph1, buf, iph1->ivm->ive, iph1->ivm->iv);
-	if (new == NULL)
-		goto end;
-
-	vfree(buf);
-
-	buf = new;
-
-	error = 0;
-
-end:
-#ifdef HAVE_GSSAPI
-	if (gsstoken)
-		vfree(gsstoken);
-#endif
-	if (cr)
-		vfree(cr);
-	if (error && buf != NULL) {
-		vfree(buf);
-		buf = NULL;
-	}
-
-	return buf;
-}
diff --git a/src/racoon/isakmp_ident.h b/src/racoon/isakmp_ident.h
deleted file mode 100644
index ea5595d..0000000
--- a/src/racoon/isakmp_ident.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*	$NetBSD: isakmp_ident.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_ident.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_IDENT_H
-#define _ISAKMP_IDENT_H
-
-extern int ident_i1send __P((struct ph1handle *, vchar_t *));
-extern int ident_i2recv __P((struct ph1handle *, vchar_t *));
-extern int ident_i2send __P((struct ph1handle *, vchar_t *));
-extern int ident_i3recv __P((struct ph1handle *, vchar_t *));
-extern int ident_i3send __P((struct ph1handle *, vchar_t *));
-extern int ident_i4recv __P((struct ph1handle *, vchar_t *));
-extern int ident_i4send __P((struct ph1handle *, vchar_t *));
-
-extern int ident_r1recv __P((struct ph1handle *, vchar_t *));
-extern int ident_r1send __P((struct ph1handle *, vchar_t *));
-extern int ident_r2recv __P((struct ph1handle *, vchar_t *));
-extern int ident_r2send __P((struct ph1handle *, vchar_t *));
-extern int ident_r3recv __P((struct ph1handle *, vchar_t *));
-extern int ident_r3send __P((struct ph1handle *, vchar_t *));
-
-#endif /* _ISAKMP_IDENT_H */
diff --git a/src/racoon/isakmp_inf.c b/src/racoon/isakmp_inf.c
deleted file mode 100644
index 5f487d2..0000000
--- a/src/racoon/isakmp_inf.c
+++ /dev/null
@@ -1,1714 +0,0 @@
-/*	$NetBSD: isakmp_inf.c,v 1.14.4.17 2009/05/18 17:07:46 tteras Exp $	*/
-
-/* Id: isakmp_inf.c,v 1.44 2006/05/06 20:45:52 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <net/pfkeyv2.h>
-#include <netinet/in.h>
-#include <sys/queue.h>
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "libpfkey.h"
-
-#include "var.h"
-#include "vmbuf.h"
-#include "schedule.h"
-#include "str2val.h"
-#include "misc.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "sockmisc.h"
-#include "handler.h"
-#include "policy.h"
-#include "proposal.h"
-#include "isakmp_var.h"
-#include "evt.h"
-#include "isakmp.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#include "isakmp_unity.h"
-#include "isakmp_cfg.h" 
-#endif
-#include "isakmp_inf.h"
-#include "oakley.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "policy.h"
-#include "algorithm.h"
-#include "proposal.h"
-#include "admin.h"
-#include "strnames.h"
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-
-/* information exchange */
-static int isakmp_info_recv_n (struct ph1handle *, struct isakmp_pl_n *, u_int32_t, int);
-static int isakmp_info_recv_d (struct ph1handle *, struct isakmp_pl_d *, u_int32_t, int);
-
-#ifdef ENABLE_DPD
-static int isakmp_info_recv_r_u __P((struct ph1handle *,
-	struct isakmp_pl_ru *, u_int32_t));
-static int isakmp_info_recv_r_u_ack __P((struct ph1handle *,
-	struct isakmp_pl_ru *, u_int32_t));
-static void isakmp_info_send_r_u __P((void *));
-#endif
-
-static void purge_isakmp_spi __P((int, isakmp_index *, size_t));
-static void info_recv_initialcontact __P((struct ph1handle *));
-
-/* %%%
- * Information Exchange
- */
-/*
- * receive Information
- */
-int
-isakmp_info_recv(iph1, msg0)
-	struct ph1handle *iph1;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *pbuf = NULL;
-	u_int32_t msgid = 0;
-	int error = -1;
-	struct isakmp *isakmp;
-	struct isakmp_gen *gen;
-	struct isakmp_parse_t *pa, *pap;
-	void *p;
-	vchar_t *hash, *payload;
-	struct isakmp_gen *nd;
-	u_int8_t np;
-	int encrypted;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "receive Information.\n");
-
-	encrypted = ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E);
-	msgid = ((struct isakmp *)msg0->v)->msgid;
-
-	/* Use new IV to decrypt Informational message. */
-	if (encrypted) {
-		struct isakmp_ivm *ivm;
-
-		if (iph1->ivm == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, "iph1->ivm == NULL\n");
-			return -1;
-		}
-
-		/* compute IV */
-		ivm = oakley_newiv2(iph1, ((struct isakmp *)msg0->v)->msgid);
-		if (ivm == NULL)
-			return -1;
-
-		msg = oakley_do_decrypt(iph1, msg0, ivm->iv, ivm->ive);
-		oakley_delivm(ivm);
-		if (msg == NULL)
-			return -1;
-
-	} else
-		msg = vdup(msg0);
-
-	/* Safety check */
-	if (msg->l < sizeof(*isakmp) + sizeof(*gen)) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-			"ignore information because the "
-			"message is way too short - %zu byte(s).\n", msg->l);
-		goto end;
-	}
-
-	isakmp = (struct isakmp *)msg->v;
-	gen = (struct isakmp_gen *)((caddr_t)isakmp + sizeof(struct isakmp));
-	np = gen->np;
-
-	if (encrypted) {
-		if (isakmp->np != ISAKMP_NPTYPE_HASH) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "ignore information because the"
-			    "message has no hash payload.\n");
-			goto end;
-		}
-
-		if (iph1->status != PHASE1ST_ESTABLISHED) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "ignore information because ISAKMP-SA"
-			    "has not been established yet.\n");
-			goto end;
-		}
-		
-		/* Safety check */
-		if (msg->l < sizeof(*isakmp) + ntohs(gen->len) + sizeof(*nd)) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-				"ignore information because the "
-				"message is too short - %zu byte(s).\n", msg->l);
-			goto end;
-		}
-
-		p = (caddr_t) gen + sizeof(struct isakmp_gen);
-		nd = (struct isakmp_gen *) ((caddr_t) gen + ntohs(gen->len));
-
-		/* nd length check */
-		if (ntohs(nd->len) > msg->l - (sizeof(struct isakmp) +
-		    ntohs(gen->len))) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "too long payload length (broken message?)\n");
-			goto end;
-		}
-
-		if (ntohs(nd->len) < sizeof(*nd)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"too short payload length (broken message?)\n");
-			goto end;
-		}
-
-		payload = vmalloc(ntohs(nd->len));
-		if (payload == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "cannot allocate memory\n");
-			goto end;
-		}
-
-		memcpy(payload->v, (caddr_t) nd, ntohs(nd->len));
-
-		/* compute HASH */
-		hash = oakley_compute_hash1(iph1, isakmp->msgid, payload);
-		if (hash == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "cannot compute hash\n");
-
-			vfree(payload);
-			goto end;
-		}
-		
-		if (ntohs(gen->len) - sizeof(struct isakmp_gen) != hash->l) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "ignore information due to hash length mismatch\n");
-
-			vfree(hash);
-			vfree(payload);
-			goto end;
-		}
-
-		if (memcmp(p, hash->v, hash->l) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "ignore information due to hash mismatch\n");
-
-			vfree(hash);
-			vfree(payload);
-			goto end;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL, "hash validated.\n");
-
-		vfree(hash);
-		vfree(payload);
-	} else {
-		/* make sure the packet was encrypted after the beginning of phase 1. */
-		switch (iph1->etype) {
-		case ISAKMP_ETYPE_AGG:
-		case ISAKMP_ETYPE_BASE:
-		case ISAKMP_ETYPE_IDENT:
-			if ((iph1->side == INITIATOR && iph1->status < PHASE1ST_MSG3SENT)
-			 || (iph1->side == RESPONDER && iph1->status < PHASE1ST_MSG2SENT)) {
-				break;
-			}
-			/*FALLTHRU*/
-		default:
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"%s message must be encrypted\n",
-				s_isakmp_nptype(np));
-			error = 0;
-			goto end;
-		}
-	}
-
-	if (!(pbuf = isakmp_parse(msg))) {
-		error = -1;
-		goto end;
-	}
-
-	error = 0;
-	for (pa = (struct isakmp_parse_t *)pbuf->v; pa->type; pa++) {
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_HASH:
-			/* Handled above */
-			break;
-		case ISAKMP_NPTYPE_N:
-			error = isakmp_info_recv_n(iph1,
-				(struct isakmp_pl_n *)pa->ptr,
-				msgid, encrypted);
-			break;
-		case ISAKMP_NPTYPE_D:
-			error = isakmp_info_recv_d(iph1,
-				(struct isakmp_pl_d *)pa->ptr,
-				msgid, encrypted);
-			break;
-		case ISAKMP_NPTYPE_NONCE:
-			/* XXX to be 6.4.2 ike-01.txt */
-			/* XXX IV is to be synchronized. */
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore Acknowledged Informational\n");
-			break;
-		default:
-			/* don't send information, see isakmp_ident_r1() */
-			error = 0;
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"reject the packet, "
-				"received unexpected payload type %s.\n",
-				s_isakmp_nptype(gen->np));
-		}
-		if (error < 0)
-			break;
-	}
-    end:
-	if (msg != NULL)
-		vfree(msg);
-	if (pbuf != NULL)
-		vfree(pbuf);
-	return error;
-}
-
-/*
- * handling of Notification payload
- */
-static int
-isakmp_info_recv_n(iph1, notify, msgid, encrypted)
-	struct ph1handle *iph1;
-	struct isakmp_pl_n *notify;
-	u_int32_t msgid;
-	int encrypted;
-{
-	u_int type;
-	vchar_t *pbuf;
-	char *nraw, *ndata;
-	size_t l;
-	char *spi;
-
-	type = ntohs(notify->type);
-
-	switch (type) {
-	case ISAKMP_NTYPE_CONNECTED:
-	case ISAKMP_NTYPE_RESPONDER_LIFETIME:
-	case ISAKMP_NTYPE_REPLAY_STATUS:
-#ifdef ENABLE_HYBRID
-	case ISAKMP_NTYPE_UNITY_HEARTBEAT:
-#endif
-		/* do something */
-		break;
-	case ISAKMP_NTYPE_INITIAL_CONTACT:
-		if (encrypted)
-			info_recv_initialcontact(iph1);
-			return 0;
-		break;
-#ifdef ENABLE_DPD
-	case ISAKMP_NTYPE_R_U_THERE:
-		if (encrypted)
-			return isakmp_info_recv_r_u(iph1,
-				(struct isakmp_pl_ru *)notify, msgid);
-		break;
-	case ISAKMP_NTYPE_R_U_THERE_ACK:
-		if (encrypted)
-			return isakmp_info_recv_r_u_ack(iph1,
-				(struct isakmp_pl_ru *)notify, msgid);
-		break;
-#endif
-	default:
-	    {
-		/* XXX there is a potential of dos attack. */
-		if(type >= ISAKMP_NTYPE_MINERROR &&
-		   type <= ISAKMP_NTYPE_MAXERROR) {
-			if (msgid == 0) {
-				/* don't think this realy deletes ph1 ? */
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-					"delete phase1 handle.\n");
-				return -1;
-			} else {
-				if (getph2bymsgid(iph1, msgid) == NULL) {
-					plog(LLV_ERROR, LOCATION, iph1->remote,
-						"fatal %s notify messsage, "
-						"phase1 should be deleted.\n",
-						s_isakmp_notify_msg(type));
-				} else {
-					plog(LLV_ERROR, LOCATION, iph1->remote,
-						"fatal %s notify messsage, "
-						"phase2 should be deleted.\n",
-						s_isakmp_notify_msg(type));
-				}
-			}
-		} else {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"unhandled notify message %s, "
-				"no phase2 handle found.\n",
-				s_isakmp_notify_msg(type));
-		}
-	    }
-	    break;
-	}
-
-	/* get spi if specified and allocate */
-	if(notify->spi_size > 0) {
-		if (ntohs(notify->h.len) < sizeof(*notify) + notify->spi_size) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"invalid spi_size in notification payload.\n");
-			return -1;
-		}
-		spi = val2str((char *)(notify + 1), notify->spi_size);
-
-		plog(LLV_DEBUG, LOCATION, iph1->remote,
-			"notification message %d:%s, "
-			"doi=%d proto_id=%d spi=%s(size=%d).\n",
-			type, s_isakmp_notify_msg(type),
-			ntohl(notify->doi), notify->proto_id, spi, notify->spi_size);
-
-		racoon_free(spi);
-	}
-
-	/* Send the message data to the logs */
-	if(type >= ISAKMP_NTYPE_MINERROR &&
-	   type <= ISAKMP_NTYPE_MAXERROR) {
-		l = ntohs(notify->h.len) - sizeof(*notify) - notify->spi_size;
-		if (l > 0) {
-			nraw = (char*)notify;	
-			nraw += sizeof(*notify) + notify->spi_size;
-			ndata = binsanitize(nraw, l);
-			if (ndata != NULL) {
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-				    "Message: '%s'.\n", 
-				    ndata);
-				racoon_free(ndata);
-			} else {
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-				    "Cannot allocate memory\n");
-			}
-		}
-	}
-	return 0;
-}
-
-/*
- * handling of Deletion payload
- */
-static int
-isakmp_info_recv_d(iph1, delete, msgid, encrypted)
-	struct ph1handle *iph1;
-	struct isakmp_pl_d *delete;
-	u_int32_t msgid;
-	int encrypted;
-{
-	int tlen, num_spi;
-	vchar_t *pbuf;
-	int protected = 0;
-	struct ph1handle *del_ph1;
-	struct ph2handle *iph2;
-	union {
-		u_int32_t spi32;
-		u_int16_t spi16[2];
-	} spi;
-
-	if (ntohl(delete->doi) != IPSEC_DOI) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"delete payload with invalid doi:%d.\n",
-			ntohl(delete->doi));
-#ifdef ENABLE_HYBRID
-		/*
-		 * At deconnexion time, Cisco VPN client does this
-		 * with a zero DOI. Don't give up in that situation.
-		 */
-		if (((iph1->mode_cfg->flags &
-		    ISAKMP_CFG_VENDORID_UNITY) == 0) || (delete->doi != 0))
-			return 0;
-#else
-		return 0;
-#endif
-	}
-
-	num_spi = ntohs(delete->num_spi);
-	tlen = ntohs(delete->h.len) - sizeof(struct isakmp_pl_d);
-
-	if (tlen != num_spi * delete->spi_size) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"deletion payload with invalid length.\n");
-		return 0;
-	}
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		"delete payload for protocol %s\n",
-		s_ipsecdoi_proto(delete->proto_id));
-
-	if(!iph1->rmconf->weak_phase1_check && !encrypted) {
-		plog(LLV_WARNING, LOCATION, iph1->remote,
-			"Ignoring unencrypted delete payload "
-			"(check the weak_phase1_check option)\n");
-		return 0;
-	}
-
-	switch (delete->proto_id) {
-	case IPSECDOI_PROTO_ISAKMP:
-		if (delete->spi_size != sizeof(isakmp_index)) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"delete payload with strange spi "
-				"size %d(proto_id:%d)\n",
-				delete->spi_size, delete->proto_id);
-			return 0;
-		}
-
-		del_ph1=getph1byindex((isakmp_index *)(delete + 1));
-		if(del_ph1 != NULL){
-
-			EVT_PUSH(del_ph1->local, del_ph1->remote,
-			EVTT_PEERPH1_NOPROP, NULL);
-			if (del_ph1->scr)
-				SCHED_KILL(del_ph1->scr);
-
-			/*
-			 * Do not delete IPsec SAs when receiving an IKE delete notification.
-			 * Just delete the IKE SA.
-			 */
-			isakmp_ph1expire(del_ph1);
-		}
-		break;
-
-	case IPSECDOI_PROTO_IPSEC_AH:
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		if (delete->spi_size != sizeof(u_int32_t)) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"delete payload with strange spi "
-				"size %d(proto_id:%d)\n",
-				delete->spi_size, delete->proto_id);
-			return 0;
-		}
-		EVT_PUSH(iph1->local, iph1->remote, 
-		    EVTT_PEER_DELETE, NULL);
-		purge_ipsec_spi(iph1->remote, delete->proto_id,
-		    (u_int32_t *)(delete + 1), num_spi);
-		break;
-
-	case IPSECDOI_PROTO_IPCOMP:
-		/* need to handle both 16bit/32bit SPI */
-		memset(&spi, 0, sizeof(spi));
-		if (delete->spi_size == sizeof(spi.spi16[1])) {
-			memcpy(&spi.spi16[1], delete + 1,
-			    sizeof(spi.spi16[1]));
-		} else if (delete->spi_size == sizeof(spi.spi32))
-			memcpy(&spi.spi32, delete + 1, sizeof(spi.spi32));
-		else {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"delete payload with strange spi "
-				"size %d(proto_id:%d)\n",
-				delete->spi_size, delete->proto_id);
-			return 0;
-		}
-		purge_ipsec_spi(iph1->remote, delete->proto_id,
-		    &spi.spi32, num_spi);
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"deletion message received, "
-			"invalid proto_id: %d\n",
-			delete->proto_id);
-		return 0;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "purged SAs.\n");
-
-	return 0;
-}
-
-/*
- * send Delete payload (for ISAKMP SA) in Informational exchange.
- */
-int
-isakmp_info_send_d1(iph1)
-	struct ph1handle *iph1;
-{
-	struct isakmp_pl_d *d;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-
-	if (iph1->status != PHASE2ST_ESTABLISHED)
-		return 0;
-
-	/* create delete payload */
-
-	/* send SPIs of inbound SAs. */
-	/* XXX should send outbound SAs's ? */
-	tlen = sizeof(*d) + sizeof(isakmp_index);
-	payload = vmalloc(tlen);
-	if (payload == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-			"failed to get buffer for payload.\n");
-		return errno;
-	}
-
-	d = (struct isakmp_pl_d *)payload->v;
-	d->h.np = ISAKMP_NPTYPE_NONE;
-	d->h.len = htons(tlen);
-	d->doi = htonl(IPSEC_DOI);
-	d->proto_id = IPSECDOI_PROTO_ISAKMP;
-	d->spi_size = sizeof(isakmp_index);
-	d->num_spi = htons(1);
-	memcpy(d + 1, &iph1->index, sizeof(isakmp_index));
-
-	error = isakmp_info_send_common(iph1, payload,
-					ISAKMP_NPTYPE_D, 0);
-	vfree(payload);
-
-	return error;
-}
-
-/*
- * send Delete payload (for IPsec SA) in Informational exchange, based on
- * pfkey msg.  It sends always single SPI.
- */
-int
-isakmp_info_send_d2(iph2)
-	struct ph2handle *iph2;
-{
-	struct ph1handle *iph1;
-	struct saproto *pr;
-	struct isakmp_pl_d *d;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-	u_int8_t *spi;
-
-	if (iph2->status != PHASE2ST_ESTABLISHED)
-		return 0;
-
-	/*
-	 * don't send delete information if there is no phase 1 handler.
-	 * It's nonsensical to negotiate phase 1 to send the information.
-	 */
-	iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
-	if (iph1 == NULL){
-		plog(LLV_DEBUG2, LOCATION, NULL,
-			 "No ph1 handler found, could not send DELETE_SA\n");
-		return 0;
-	}
-
-	/* create delete payload */
-	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-
-		/* send SPIs of inbound SAs. */
-		/*
-		 * XXX should I send outbound SAs's ?
-		 * I send inbound SAs's SPI only at the moment because I can't
-		 * decode any more if peer send encoded packet without aware of
-		 * deletion of SA.  Outbound SAs don't come under the situation.
-		 */
-		tlen = sizeof(*d) + pr->spisize;
-		payload = vmalloc(tlen);
-		if (payload == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-				"failed to get buffer for payload.\n");
-			return errno;
-		}
-
-		d = (struct isakmp_pl_d *)payload->v;
-		d->h.np = ISAKMP_NPTYPE_NONE;
-		d->h.len = htons(tlen);
-		d->doi = htonl(IPSEC_DOI);
-		d->proto_id = pr->proto_id;
-		d->spi_size = pr->spisize;
-		d->num_spi = htons(1);
-		/*
-		 * XXX SPI bits are left-filled, for use with IPComp.
-		 * we should be switching to variable-length spi field...
-		 */
-		spi = (u_int8_t *)&pr->spi;
-		spi += sizeof(pr->spi);
-		spi -= pr->spisize;
-		memcpy(d + 1, spi, pr->spisize);
-
-		error = isakmp_info_send_common(iph1, payload,
-						ISAKMP_NPTYPE_D, 0);
-		vfree(payload);
-	}
-
-	return error;
-}
-
-/*
- * send Notification payload (for without ISAKMP SA) in Informational exchange
- */
-int
-isakmp_info_send_nx(isakmp, remote, local, type, data)
-	struct isakmp *isakmp;
-	struct sockaddr *remote, *local;
-	int type;
-	vchar_t *data;
-{
-	struct ph1handle *iph1 = NULL;
-	struct remoteconf *rmconf;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = -1;
-	struct isakmp_pl_n *n;
-	int spisiz = 0;		/* see below */
-
-	/* search appropreate configuration */
-	rmconf = getrmconf(remote);
-	if (rmconf == NULL) {
-		plog(LLV_ERROR, LOCATION, remote,
-			"no configuration found for peer address.\n");
-		goto end;
-	}
-
-	/* add new entry to isakmp status table. */
-	iph1 = newph1();
-	if (iph1 == NULL)
-		return -1;
-
-	memcpy(&iph1->index.i_ck, &isakmp->i_ck, sizeof(cookie_t));
-	isakmp_newcookie((char *)&iph1->index.r_ck, remote, local);
-	iph1->status = PHASE1ST_START;
-	iph1->rmconf = rmconf;
-	iph1->side = INITIATOR;
-	iph1->version = isakmp->v;
-	iph1->flags = 0;
-	iph1->msgid = 0;	/* XXX */
-#ifdef ENABLE_HYBRID
-	if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL)
-		goto end;
-#endif
-#ifdef ENABLE_FRAG
-	iph1->frag = 0;
-	iph1->frag_chain = NULL;
-#endif
-
-	/* copy remote address */
-	if (copy_ph1addresses(iph1, rmconf, remote, local) < 0)
-		goto end;
-
-	tlen = sizeof(*n) + spisiz;
-	if (data)
-		tlen += data->l;
-	payload = vmalloc(tlen);
-	if (payload == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	n = (struct isakmp_pl_n *)payload->v;
-	n->h.np = ISAKMP_NPTYPE_NONE;
-	n->h.len = htons(tlen);
-	n->doi = htonl(IPSEC_DOI);
-	n->proto_id = IPSECDOI_KEY_IKE;
-	n->spi_size = spisiz;
-	n->type = htons(type);
-	if (spisiz)
-		memset(n + 1, 0, spisiz);	/* XXX spisiz is always 0 */
-	if (data)
-		memcpy((caddr_t)(n + 1) + spisiz, data->v, data->l);
-
-	error = isakmp_info_send_common(iph1, payload, ISAKMP_NPTYPE_N, 0);
-	vfree(payload);
-
-    end:
-	if (iph1 != NULL)
-		delph1(iph1);
-
-	return error;
-}
-
-/*
- * send Notification payload (for ISAKMP SA) in Informational exchange
- */
-int
-isakmp_info_send_n1(iph1, type, data)
-	struct ph1handle *iph1;
-	int type;
-	vchar_t *data;
-{
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-	struct isakmp_pl_n *n;
-	int spisiz;
-
-	/*
-	 * note on SPI size: which description is correct?  I have chosen
-	 * this to be 0.
-	 *
-	 * RFC2408 3.1, 2nd paragraph says: ISAKMP SA is identified by
-	 * Initiator/Responder cookie and SPI has no meaning, SPI size = 0.
-	 * RFC2408 3.1, first paragraph on page 40: ISAKMP SA is identified
-	 * by cookie and SPI has no meaning, 0 <= SPI size <= 16.
-	 * RFC2407 4.6.3.3, INITIAL-CONTACT is required to set to 16.
-	 */
-	if (type == ISAKMP_NTYPE_INITIAL_CONTACT)
-		spisiz = sizeof(isakmp_index);
-	else
-		spisiz = 0;
-
-	tlen = sizeof(*n) + spisiz;
-	if (data)
-		tlen += data->l;
-	payload = vmalloc(tlen);
-	if (payload == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		return errno;
-	}
-
-	n = (struct isakmp_pl_n *)payload->v;
-	n->h.np = ISAKMP_NPTYPE_NONE;
-	n->h.len = htons(tlen);
-	n->doi = htonl(iph1->rmconf->doitype);
-	n->proto_id = IPSECDOI_PROTO_ISAKMP; /* XXX to be configurable ? */
-	n->spi_size = spisiz;
-	n->type = htons(type);
-	if (spisiz)
-		memcpy(n + 1, &iph1->index, sizeof(isakmp_index));
-	if (data)
-		memcpy((caddr_t)(n + 1) + spisiz, data->v, data->l);
-
-	error = isakmp_info_send_common(iph1, payload, ISAKMP_NPTYPE_N, iph1->flags);
-	vfree(payload);
-
-	return error;
-}
-
-/*
- * send Notification payload (for IPsec SA) in Informational exchange
- */
-int
-isakmp_info_send_n2(iph2, type, data)
-	struct ph2handle *iph2;
-	int type;
-	vchar_t *data;
-{
-	struct ph1handle *iph1 = iph2->ph1;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-	struct isakmp_pl_n *n;
-	struct saproto *pr;
-
-	if (!iph2->approval)
-		return EINVAL;
-
-	pr = iph2->approval->head;
-
-	/* XXX must be get proper spi */
-	tlen = sizeof(*n) + pr->spisize;
-	if (data)
-		tlen += data->l;
-	payload = vmalloc(tlen);
-	if (payload == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		return errno;
-	}
-
-	n = (struct isakmp_pl_n *)payload->v;
-	n->h.np = ISAKMP_NPTYPE_NONE;
-	n->h.len = htons(tlen);
-	n->doi = htonl(IPSEC_DOI);		/* IPSEC DOI (1) */
-	n->proto_id = pr->proto_id;		/* IPSEC AH/ESP/whatever*/
-	n->spi_size = pr->spisize;
-	n->type = htons(type);
-	*(u_int32_t *)(n + 1) = pr->spi;
-	if (data)
-		memcpy((caddr_t)(n + 1) + pr->spisize, data->v, data->l);
-
-	iph2->flags |= ISAKMP_FLAG_E;	/* XXX Should we do FLAG_A ? */
-	error = isakmp_info_send_common(iph1, payload, ISAKMP_NPTYPE_N, iph2->flags);
-	vfree(payload);
-
-	return error;
-}
-
-/*
- * send Information
- * When ph1->skeyid_a == NULL, send message without encoding.
- */
-int
-isakmp_info_send_common(iph1, payload, np, flags)
-	struct ph1handle *iph1;
-	vchar_t *payload;
-	u_int32_t np;
-	int flags;
-{
-	struct ph2handle *iph2 = NULL;
-	vchar_t *hash = NULL;
-	struct isakmp *isakmp;
-	struct isakmp_gen *gen;
-	char *p;
-	int tlen;
-	int error = -1;
-
-	/* add new entry to isakmp status table */
-	iph2 = newph2();
-	if (iph2 == NULL)
-		goto end;
-
-	iph2->dst = dupsaddr(iph1->remote);
-	if (iph2->dst == NULL) {
-		delph2(iph2);
-		goto end;
-	}
-	iph2->src = dupsaddr(iph1->local);
-	if (iph2->src == NULL) {
-		delph2(iph2);
-		goto end;
-	}
-#if (!defined(ENABLE_NATT)) || (defined(BROKEN_NATT))
-	if (set_port(iph2->dst, 0) == NULL ||
-	    set_port(iph2->src, 0) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "invalid family: %d\n", iph1->remote->sa_family);
-		delph2(iph2);
-		goto end;
-	}
-#endif
-	iph2->ph1 = iph1;
-	iph2->side = INITIATOR;
-	iph2->status = PHASE2ST_START;
-	iph2->msgid = isakmp_newmsgid2(iph1);
-
-	/* get IV and HASH(1) if skeyid_a was generated. */
-	if (iph1->skeyid_a != NULL) {
-		iph2->ivm = oakley_newiv2(iph1, iph2->msgid);
-		if (iph2->ivm == NULL) {
-			delph2(iph2);
-			goto end;
-		}
-
-		/* generate HASH(1) */
-		hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, payload);
-		if (hash == NULL) {
-			delph2(iph2);
-			goto end;
-		}
-
-		/* initialized total buffer length */
-		tlen = hash->l;
-		tlen += sizeof(*gen);
-	} else {
-		/* IKE-SA is not established */
-		hash = NULL;
-
-		/* initialized total buffer length */
-		tlen = 0;
-	}
-	if ((flags & ISAKMP_FLAG_A) == 0)
-		iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_E);
-	else
-		iph2->flags = (hash == NULL ? 0 : ISAKMP_FLAG_A);
-
-	insph2(iph2);
-	bindph12(iph1, iph2);
-
-	tlen += sizeof(*isakmp) + payload->l;
-
-	/* create buffer for isakmp payload */
-	iph2->sendbuf = vmalloc(tlen);
-	if (iph2->sendbuf == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto err;
-	}
-
-	/* create isakmp header */
-	isakmp = (struct isakmp *)iph2->sendbuf->v;
-	memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t));
-	memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t));
-	isakmp->np = hash == NULL ? (np & 0xff) : ISAKMP_NPTYPE_HASH;
-	isakmp->v = iph1->version;
-	isakmp->etype = ISAKMP_ETYPE_INFO;
-	isakmp->flags = iph2->flags;
-	memcpy(&isakmp->msgid, &iph2->msgid, sizeof(isakmp->msgid));
-	isakmp->len   = htonl(tlen);
-	p = (char *)(isakmp + 1);
-
-	/* create HASH payload */
-	if (hash != NULL) {
-		gen = (struct isakmp_gen *)p;
-		gen->np = np & 0xff;
-		gen->len = htons(sizeof(*gen) + hash->l);
-		p += sizeof(*gen);
-		memcpy(p, hash->v, hash->l);
-		p += hash->l;
-	}
-
-	/* add payload */
-	memcpy(p, payload->v, payload->l);
-	p += payload->l;
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(iph2->sendbuf, iph1->local, iph1->remote, 1);
-#endif
-
-	/* encoding */
-	if (ISSET(isakmp->flags, ISAKMP_FLAG_E)) {
-		vchar_t *tmp;
-
-		tmp = oakley_do_encrypt(iph2->ph1, iph2->sendbuf, iph2->ivm->ive,
-				iph2->ivm->iv);
-		VPTRINIT(iph2->sendbuf);
-		if (tmp == NULL)
-			goto err;
-		iph2->sendbuf = tmp;
-	}
-
-	/* HDR*, HASH(1), N */
-	if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0) {
-		VPTRINIT(iph2->sendbuf);
-		goto err;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"sendto Information %s.\n", s_isakmp_nptype(np));
-
-	/*
-	 * don't resend notify message because peer can use Acknowledged
-	 * Informational if peer requires the reply of the notify message.
-	 */
-
-	/* XXX If Acknowledged Informational required, don't delete ph2handle */
-	error = 0;
-	VPTRINIT(iph2->sendbuf);
-	goto err;	/* XXX */
-
-end:
-	if (hash)
-		vfree(hash);
-	return error;
-
-err:
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-	goto end;
-}
-
-/*
- * add a notify payload to buffer by reallocating buffer.
- * If buf == NULL, the function only create a notify payload.
- *
- * XXX Which is SPI to be included, inbound or outbound ?
- */
-vchar_t *
-isakmp_add_pl_n(buf0, np_p, type, pr, data)
-	vchar_t *buf0;
-	u_int8_t **np_p;
-	int type;
-	struct saproto *pr;
-	vchar_t *data;
-{
-	vchar_t *buf = NULL;
-	struct isakmp_pl_n *n;
-	int tlen;
-	int oldlen = 0;
-
-	if (*np_p)
-		**np_p = ISAKMP_NPTYPE_N;
-
-	tlen = sizeof(*n) + pr->spisize;
-
-	if (data)
-		tlen += data->l;
-	if (buf0) {
-		oldlen = buf0->l;
-		buf = vrealloc(buf0, buf0->l + tlen);
-	} else
-		buf = vmalloc(tlen);
-	if (!buf) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get a payload buffer.\n");
-		return NULL;
-	}
-
-	n = (struct isakmp_pl_n *)(buf->v + oldlen);
-	n->h.np = ISAKMP_NPTYPE_NONE;
-	n->h.len = htons(tlen);
-	n->doi = htonl(IPSEC_DOI);		/* IPSEC DOI (1) */
-	n->proto_id = pr->proto_id;		/* IPSEC AH/ESP/whatever*/
-	n->spi_size = pr->spisize;
-	n->type = htons(type);
-	*(u_int32_t *)(n + 1) = pr->spi;	/* XXX */
-	if (data)
-		memcpy((caddr_t)(n + 1) + pr->spisize, data->v, data->l);
-
-	/* save the pointer of next payload type */
-	*np_p = &n->h.np;
-
-	return buf;
-}
-
-static void
-purge_isakmp_spi(proto, spi, n)
-	int proto;
-	isakmp_index *spi;	/*network byteorder*/
-	size_t n;
-{
-	struct ph1handle *iph1;
-	size_t i;
-
-	for (i = 0; i < n; i++) {
-		iph1 = getph1byindex(&spi[i]);
-		if (!iph1)
-			continue;
-
-		plog(LLV_INFO, LOCATION, NULL,
-			"purged ISAKMP-SA proto_id=%s spi=%s.\n",
-			s_ipsecdoi_proto(proto),
-			isakmp_pindex(&spi[i], 0));
-
-		SCHED_KILL(iph1->sce);
-		iph1->status = PHASE1ST_EXPIRED;
-		iph1->sce = sched_new(1, isakmp_ph1delete_stub, iph1);
-	}
-}
-
-
-
-void
-purge_ipsec_spi(dst0, proto, spi, n)
-	struct sockaddr *dst0;
-	int proto;
-	u_int32_t *spi;	/*network byteorder*/
-	size_t n;
-{
-	vchar_t *buf = NULL;
-	struct sadb_msg *msg, *next, *end;
-	struct sadb_sa *sa;
-	struct sadb_lifetime *lt;
-	struct sockaddr *src, *dst;
-	struct ph2handle *iph2;
-	u_int64_t created;
-	size_t i;
-	caddr_t mhp[SADB_EXT_MAX + 1];
-#ifdef ENABLE_NATT
-	struct sadb_x_nat_t_type *natt_type;
-	struct sadb_x_nat_t_port *natt_port;
-#endif
-
-	plog(LLV_DEBUG2, LOCATION, NULL,
-		 "purge_ipsec_spi:\n");
-	plog(LLV_DEBUG2, LOCATION, NULL, "dst0: %s\n", saddr2str(dst0));
-	plog(LLV_DEBUG2, LOCATION, NULL, "SPI: %08X\n", ntohl(spi[0]));
-
-	buf = pfkey_dump_sadb(ipsecdoi2pfkey_proto(proto));
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey_dump_sadb returned nothing.\n");
-		return;
-	}
-
-	msg = (struct sadb_msg *)buf->v;
-	end = (struct sadb_msg *)(buf->v + buf->l);
-
-	while (msg < end) {
-		if ((msg->sadb_msg_len << 3) < sizeof(*msg))
-			break;
-		next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
-		if (msg->sadb_msg_type != SADB_DUMP) {
-			msg = next;
-			continue;
-		}
-
-		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey_check (%s)\n", ipsec_strerror());
-			msg = next;
-			continue;
-		}
-
-		sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
-		if (!sa
-		 || !mhp[SADB_EXT_ADDRESS_SRC]
-		 || !mhp[SADB_EXT_ADDRESS_DST]) {
-			msg = next;
-			continue;
-		}
-		src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-		dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-		lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-		if(lt != NULL)
-			created = lt->sadb_lifetime_addtime;
-		else
-			created = 0;
-
-		if (sa->sadb_sa_state != SADB_SASTATE_MATURE
-		 && sa->sadb_sa_state != SADB_SASTATE_DYING) {
-			msg = next;
-			continue;
-		}
-#ifdef ENABLE_NATT
-		natt_type = (void *)mhp[SADB_X_EXT_NAT_T_TYPE];
-		if (natt_type && natt_type->sadb_x_nat_t_type_type) {
-			/* NAT-T is enabled for this SADB entry; copy
-			 * the ports from NAT-T extensions */
-			natt_port = (void *)mhp[SADB_X_EXT_NAT_T_SPORT];
-			if (extract_port(src) == 0 && natt_port != NULL)
-				set_port(src, ntohs(natt_port->sadb_x_nat_t_port_port));
-
-			natt_port = (void *)mhp[SADB_X_EXT_NAT_T_DPORT];
-			if (extract_port(dst) == 0 && natt_port != NULL)
-				set_port(dst, ntohs(natt_port->sadb_x_nat_t_port_port));
-		}else{
-			/* Force default UDP ports, so CMPSADDR will match SAs with NO encapsulation
-			 */
-			set_port(src, PORT_ISAKMP);
-			set_port(dst, PORT_ISAKMP);
-		}
-#endif
-		plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(src));
-		plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(dst));
-
-		/* XXX n^2 algorithm, inefficient */
-
-		/* don't delete inbound SAs at the moment */
-		/* XXX should we remove SAs with opposite direction as well? */
-		if (CMPSADDR(dst0, dst)) {
-			msg = next;
-			continue;
-		}
-
-#ifdef ENABLE_NATT
-		if (natt_type == NULL ||
-			! natt_type->sadb_x_nat_t_type_type) {
-			/* Set back port to 0 if it was forced to default UDP port
-			 */
-			set_port(src, 0);
-			set_port(dst, 0);
-		}
-#endif
-		for (i = 0; i < n; i++) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"check spi(packet)=%u spi(db)=%u.\n",
-				ntohl(spi[i]), ntohl(sa->sadb_sa_spi));
-			if (spi[i] != sa->sadb_sa_spi)
-				continue;
-
-			pfkey_send_delete(lcconf->sock_pfkey,
-				msg->sadb_msg_satype,
-				IPSEC_MODE_ANY,
-				src, dst, sa->sadb_sa_spi);
-
-			/*
-			 * delete a relative phase 2 handler.
-			 * continue to process if no relative phase 2 handler
-			 * exists.
-			 */
-			iph2 = getph2bysaidx(src, dst, proto, spi[i]);
-			if(iph2 != NULL){
-				delete_spd(iph2, created);
-				unbindph12(iph2);
-				remph2(iph2);
-				delph2(iph2);
-			}
-
-			plog(LLV_INFO, LOCATION, NULL,
-				"purged IPsec-SA proto_id=%s spi=%u.\n",
-				s_ipsecdoi_proto(proto),
-				ntohl(spi[i]));
-		}
-
-		msg = next;
-	}
-
-	if (buf)
-		vfree(buf);
-}
-
-/*
- * delete all phase2 sa relatived to the destination address.
- * Don't delete Phase 1 handlers on INITIAL-CONTACT, and don't ignore
- * an INITIAL-CONTACT if we have contacted the peer.  This matches the
- * Sun IKE behavior, and makes rekeying work much better when the peer
- * restarts.
- */
-static void
-info_recv_initialcontact(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf = NULL;
-	struct sadb_msg *msg, *next, *end;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	caddr_t mhp[SADB_EXT_MAX + 1];
-	int proto_id, i;
-	struct ph2handle *iph2;
-#if 0
-	char *loc, *rem;
-#endif
-
-	if (f_local)
-		return;
-
-#if 0
-	loc = racoon_strdup(saddrwop2str(iph1->local));
-	rem = racoon_strdup(saddrwop2str(iph1->remote));
-	STRDUP_FATAL(loc);
-	STRDUP_FATAL(rem);
-
-	/*
-	 * Purge all IPSEC-SAs for the peer.  We can do this
-	 * the easy way (using a PF_KEY SADB_DELETE extension)
-	 * or we can do it the hard way.
-	 */
-	for (i = 0; i < pfkey_nsatypes; i++) {
-		proto_id = pfkey2ipsecdoi_proto(pfkey_satypes[i].ps_satype);
-
-		plog(LLV_INFO, LOCATION, NULL,
-		    "purging %s SAs for %s -> %s\n",
-		    pfkey_satypes[i].ps_name, loc, rem);
-		if (pfkey_send_delete_all(lcconf->sock_pfkey,
-		    pfkey_satypes[i].ps_satype, IPSEC_MODE_ANY,
-		    iph1->local, iph1->remote) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "delete_all %s -> %s failed for %s (%s)\n",
-			    loc, rem,
-			    pfkey_satypes[i].ps_name, ipsec_strerror());
-			goto the_hard_way;
-		}
-
-		deleteallph2(iph1->local, iph1->remote, proto_id);
-
-		plog(LLV_INFO, LOCATION, NULL,
-		    "purging %s SAs for %s -> %s\n",
-		    pfkey_satypes[i].ps_name, rem, loc);
-		if (pfkey_send_delete_all(lcconf->sock_pfkey,
-		    pfkey_satypes[i].ps_satype, IPSEC_MODE_ANY,
-		    iph1->remote, iph1->local) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "delete_all %s -> %s failed for %s (%s)\n",
-			    rem, loc,
-			    pfkey_satypes[i].ps_name, ipsec_strerror());
-			goto the_hard_way;
-		}
-
-		deleteallph2(iph1->remote, iph1->local, proto_id);
-	}
-
-	racoon_free(loc);
-	racoon_free(rem);
-	return;
-
- the_hard_way:
-	racoon_free(loc);
-	racoon_free(rem);
-#endif
-
-	buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey_dump_sadb returned nothing.\n");
-		return;
-	}
-
-	msg = (struct sadb_msg *)buf->v;
-	end = (struct sadb_msg *)(buf->v + buf->l);
-
-	while (msg < end) {
-		if ((msg->sadb_msg_len << 3) < sizeof(*msg))
-			break;
-		next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
-		if (msg->sadb_msg_type != SADB_DUMP) {
-			msg = next;
-			continue;
-		}
-
-		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey_check (%s)\n", ipsec_strerror());
-			msg = next;
-			continue;
-		}
-
-		if (mhp[SADB_EXT_SA] == NULL
-		 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-		 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
-			msg = next;
-			continue;
-		}
-		sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-		src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-		dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-		if (sa->sadb_sa_state != SADB_SASTATE_MATURE
-		 && sa->sadb_sa_state != SADB_SASTATE_DYING) {
-			msg = next;
-			continue;
-		}
-
-		/*
-		 * RFC2407 4.6.3.3 INITIAL-CONTACT is the message that
-		 * announces the sender of the message was rebooted.
-		 * it is interpreted to delete all SAs which source address
-		 * is the sender of the message.
-		 * racoon only deletes SA which is matched both the
-		 * source address and the destination accress.
-		 */
-#ifdef ENABLE_NATT
-		/* 
-		 * XXX RFC 3947 says that whe MUST NOT use IP+port to find old SAs
-		 * from this peer !
-		 */
-		if(iph1->natt_flags & NAT_DETECTED){
-			if (CMPSADDR(iph1->local, src) == 0 &&
-				CMPSADDR(iph1->remote, dst) == 0)
-				;
-			else if (CMPSADDR(iph1->remote, src) == 0 &&
-					 CMPSADDR(iph1->local, dst) == 0)
-				;
-			else {
-				msg = next;
-				continue;
-			}
-		} else
-#endif
-		/* If there is no NAT-T, we don't have to check addr + port...
-		 * XXX what about a configuration with a remote peers which is not
-		 * NATed, but which NATs some other peers ?
-		 * Here, the INITIAl-CONTACT would also flush all those NATed peers !!
-		 */
-		if (cmpsaddrwop(iph1->local, src) == 0 &&
-		    cmpsaddrwop(iph1->remote, dst) == 0)
-			;
-		else if (cmpsaddrwop(iph1->remote, src) == 0 &&
-		    cmpsaddrwop(iph1->local, dst) == 0)
-			;
-		else {
-			msg = next;
-			continue;
-		}
-
-		/*
-		 * Make sure this is an SATYPE that we manage.
-		 * This is gross; too bad we couldn't do it the
-		 * easy way.
-		 */
-		for (i = 0; i < pfkey_nsatypes; i++) {
-			if (pfkey_satypes[i].ps_satype ==
-			    msg->sadb_msg_satype)
-				break;
-		}
-		if (i == pfkey_nsatypes) {
-			msg = next;
-			continue;
-		}
-
-		plog(LLV_INFO, LOCATION, NULL,
-			"purging spi=%u.\n", ntohl(sa->sadb_sa_spi));
-		pfkey_send_delete(lcconf->sock_pfkey,
-			msg->sadb_msg_satype,
-			IPSEC_MODE_ANY, src, dst, sa->sadb_sa_spi);
-
-		/*
-		 * delete a relative phase 2 handler.
-		 * continue to process if no relative phase 2 handler
-		 * exists.
-		 */
-		proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-		iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
-		if (iph2) {
-			delete_spd(iph2, 0);
-			unbindph12(iph2);
-			remph2(iph2);
-			delph2(iph2);
-		}
-
-		msg = next;
-	}
-
-	vfree(buf);
-}
-
-void
-isakmp_check_notify(gen, iph1)
-	struct isakmp_gen *gen;		/* points to Notify payload */
-	struct ph1handle *iph1;
-{
-	struct isakmp_pl_n *notify = (struct isakmp_pl_n *)gen;
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		"Notify Message received\n");
-
-	switch (ntohs(notify->type)) {
-	case ISAKMP_NTYPE_CONNECTED:
-	case ISAKMP_NTYPE_RESPONDER_LIFETIME:
-	case ISAKMP_NTYPE_REPLAY_STATUS:
-	case ISAKMP_NTYPE_HEARTBEAT:
-#ifdef ENABLE_HYBRID
-	case ISAKMP_NTYPE_UNITY_HEARTBEAT:
-#endif
-		plog(LLV_WARNING, LOCATION, iph1->remote,
-			"ignore %s notification.\n",
-			s_isakmp_notify_msg(ntohs(notify->type)));
-		break;
-	case ISAKMP_NTYPE_INITIAL_CONTACT:
-		plog(LLV_WARNING, LOCATION, iph1->remote,
-			"ignore INITIAL-CONTACT notification, "
-			"because it is only accepted after phase1.\n");
-		break;
-	default:
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"received unknown notification type %s.\n",
-			s_isakmp_notify_msg(ntohs(notify->type)));
-	}
-
-	return;
-}
-
-
-#ifdef ENABLE_DPD
-static int
-isakmp_info_recv_r_u (iph1, ru, msgid)
-	struct ph1handle *iph1;
-	struct isakmp_pl_ru *ru;
-	u_int32_t msgid;
-{
-	struct isakmp_pl_ru *ru_ack;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		 "DPD R-U-There received\n");
-
-	/* XXX should compare cookies with iph1->index?
-	   Or is this already done by calling function?  */
-	tlen = sizeof(*ru_ack);
-	payload = vmalloc(tlen);
-	if (payload == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		return errno;
-	}
-
-	ru_ack = (struct isakmp_pl_ru *)payload->v;
-	ru_ack->h.np = ISAKMP_NPTYPE_NONE;
-	ru_ack->h.len = htons(tlen);
-	ru_ack->doi = htonl(IPSEC_DOI);
-	ru_ack->type = htons(ISAKMP_NTYPE_R_U_THERE_ACK);
-	ru_ack->proto_id = IPSECDOI_PROTO_ISAKMP; /* XXX ? */
-	ru_ack->spi_size = sizeof(isakmp_index);
-	memcpy(ru_ack->i_ck, ru->i_ck, sizeof(cookie_t));
-	memcpy(ru_ack->r_ck, ru->r_ck, sizeof(cookie_t));	
-	ru_ack->data = ru->data;
-
-	/* XXX Should we do FLAG_A ?  */
-	error = isakmp_info_send_common(iph1, payload, ISAKMP_NPTYPE_N,
-					ISAKMP_FLAG_E);
-	vfree(payload);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "received a valid R-U-THERE, ACK sent\n");
-
-	/* Should we mark tunnel as active ? */
-	return error;
-}
-
-static int
-isakmp_info_recv_r_u_ack (iph1, ru, msgid)
-	struct ph1handle *iph1;
-	struct isakmp_pl_ru *ru;
-	u_int32_t msgid;
-{
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		 "DPD R-U-There-Ack received\n");
-
-	/* XXX Maintain window of acceptable sequence numbers ?
-	 * => ru->data <= iph2->dpd_seq &&
-	 *    ru->data >= iph2->dpd_seq - iph2->dpd_fails ? */
-	if (ntohl(ru->data) != iph1->dpd_seq-1) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			 "Wrong DPD sequence number (%d, %d expected).\n", 
-			 ntohl(ru->data), iph1->dpd_seq-1);
-		return 0;
-	}
-
-	if (memcmp(ru->i_ck, iph1->index.i_ck, sizeof(cookie_t)) ||
-	    memcmp(ru->r_ck, iph1->index.r_ck, sizeof(cookie_t))) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			 "Cookie mismatch in DPD ACK!.\n");
-		return 0;
-	}
-
-	iph1->dpd_fails = 0;
-
-	/* Useless ??? */
-	iph1->dpd_lastack = time(NULL);
-
-	SCHED_KILL(iph1->dpd_r_u);
-
-	isakmp_sched_r_u(iph1, 0);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "received an R-U-THERE-ACK\n");
-
-	return 0;
-}
-
-
-
-
-/*
- * send DPD R-U-THERE payload in Informational exchange.
- */
-static void
-isakmp_info_send_r_u(arg)
-	void *arg;
-{
-	struct ph1handle *iph1 = arg;
-
-	/* create R-U-THERE payload */
-	struct isakmp_pl_ru *ru;
-	vchar_t *payload = NULL;
-	int tlen;
-	int error = 0;
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote, "DPD monitoring....\n");
-
-	iph1->dpd_r_u=NULL;
-
-	if (iph1->dpd_fails >= iph1->rmconf->dpd_maxfails) {
-
-		plog(LLV_INFO, LOCATION, iph1->remote,
-			"DPD: remote (ISAKMP-SA spi=%s) seems to be dead.\n",
-			isakmp_pindex(&iph1->index, 0));
-
-		EVT_PUSH(iph1->local, iph1->remote, EVTT_DPD_TIMEOUT, NULL);
-		purge_remote(iph1);
-
-		/* Do not reschedule here: phase1 is deleted,
-		 * DPD will be reactivated when a new ph1 will be negociated
-		 */
-		return;
-	}
-
-	/* TODO: check recent activity to avoid useless sends... */
-
-	tlen = sizeof(*ru);
-	payload = vmalloc(tlen);
-	if (payload == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-			 "failed to get buffer for payload.\n");
-		return;
-	}
-	ru = (struct isakmp_pl_ru *)payload->v;
-	ru->h.np = ISAKMP_NPTYPE_NONE;
-	ru->h.len = htons(tlen);
-	ru->doi = htonl(IPSEC_DOI);
-	ru->type = htons(ISAKMP_NTYPE_R_U_THERE);
-	ru->proto_id = IPSECDOI_PROTO_ISAKMP; /* XXX ?*/
-	ru->spi_size = sizeof(isakmp_index);
-
-	memcpy(ru->i_ck, iph1->index.i_ck, sizeof(cookie_t));
-	memcpy(ru->r_ck, iph1->index.r_ck, sizeof(cookie_t));
-
-	if (iph1->dpd_seq == 0){
-		/* generate a random seq which is not too big */
-		srand(time(NULL));
-		iph1->dpd_seq = rand() & 0x0fff;
-	}
-
-	ru->data = htonl(iph1->dpd_seq);
-
-	error = isakmp_info_send_common(iph1, payload, ISAKMP_NPTYPE_N, 0);
-	vfree(payload);
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		 "DPD R-U-There sent (%d)\n", error);
-
-	/* will be decreased if ACK received... */
-	iph1->dpd_fails++;
-
-	/* XXX should be increased only when ACKed ? */
-	iph1->dpd_seq++;
-
-	/* Reschedule the r_u_there with a short delay,
-	 * will be deleted/rescheduled if ACK received before */
-	isakmp_sched_r_u(iph1, 1);
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		 "rescheduling send_r_u (%d).\n", iph1->rmconf->dpd_retry);
-}
-
-/* Schedule a new R-U-THERE */
-int
-isakmp_sched_r_u(iph1, retry)
-	struct ph1handle *iph1;
-	int retry;
-{
-	if(iph1 == NULL ||
-	   iph1->rmconf == NULL)
-		return 1;
-
-
-	if(iph1->dpd_support == 0 ||
-	   iph1->rmconf->dpd_interval == 0)
-		return 0;
-
-	if(retry)
-		iph1->dpd_r_u = sched_new(iph1->rmconf->dpd_retry,
-								  isakmp_info_send_r_u, iph1);
-	else
-		iph1->dpd_r_u = sched_new(iph1->rmconf->dpd_interval,
-								  isakmp_info_send_r_u, iph1);
-
-	return 0;
-}
-#endif
diff --git a/src/racoon/isakmp_inf.h b/src/racoon/isakmp_inf.h
deleted file mode 100644
index c7682d9..0000000
--- a/src/racoon/isakmp_inf.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*	$NetBSD: isakmp_inf.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_inf.h,v 1.6 2005/05/07 14:15:59 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_INF_H
-#define _ISAKMP_INF_H
-
-struct saproto;
-extern int isakmp_info_recv __P((struct ph1handle *, vchar_t *));
-extern int isakmp_info_send_d1 __P((struct ph1handle *));
-extern int isakmp_info_send_d2 __P((struct ph2handle *));
-extern int isakmp_info_send_nx __P((struct isakmp *,
-	struct sockaddr *, struct sockaddr *, int, vchar_t *));
-extern int isakmp_info_send_n1 __P((struct ph1handle *, int, vchar_t *));
-extern int isakmp_info_send_n2 __P((struct ph2handle *, int, vchar_t *));
-extern int isakmp_info_send_common __P((struct ph1handle *,
-	vchar_t *, u_int32_t, int));
-
-extern vchar_t * isakmp_add_pl_n __P((vchar_t *, u_int8_t **, int,
-	struct saproto *, vchar_t *));
-
-extern void isakmp_check_notify __P((struct isakmp_gen *, struct ph1handle *));
-
-#ifdef ENABLE_DPD
-extern int isakmp_sched_r_u __P((struct ph1handle *, int));
-#endif
-
-extern void purge_ipsec_spi __P((struct sockaddr *, int,	u_int32_t *, size_t));
-extern int tunnel_mode_prop __P((struct saprop *));
-
-#endif /* _ISAKMP_INF_H */
diff --git a/src/racoon/isakmp_newg.c b/src/racoon/isakmp_newg.c
deleted file mode 100644
index 85b91b9..0000000
--- a/src/racoon/isakmp_newg.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*	$NetBSD: isakmp_newg.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: isakmp_newg.c,v 1.10 2002/09/27 05:55:52 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "schedule.h"
-#include "cfparse_proto.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_newg.h"
-#include "oakley.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "handler.h"
-#include "pfkey.h"
-#include "admin.h"
-#include "str2val.h"
-#include "vendorid.h"
-
-/*
- * New group mode as responder
- */
-int
-isakmp_newgroup_r(iph1, msg)
-	struct ph1handle *iph1;
-	vchar_t *msg;
-{
-#if 0
-	struct isakmp *isakmp = (struct isakmp *)msg->v;
-	struct isakmp_pl_hash *hash = NULL;
-	struct isakmp_pl_sa *sa = NULL;
-	int error = -1;
-	vchar_t *buf;
-	struct oakley_sa *osa;
-	int len;
-
-	/* validate the type of next payload */
-	/*
-	 * ISAKMP_ETYPE_NEWGRP,
-	 * ISAKMP_NPTYPE_HASH, (ISAKMP_NPTYPE_VID), ISAKMP_NPTYPE_SA,
-	 * ISAKMP_NPTYPE_NONE
-	 */
-    {
-	vchar_t *pbuf = NULL;
-	struct isakmp_parse_t *pa;
-
-	if ((pbuf = isakmp_parse(msg)) == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_HASH:
-			if (hash) {
-				isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-					"received multiple payload type %d.\n",
-					pa->type);
-				vfree(pbuf);
-				goto end;
-			}
-			hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_SA:
-			if (sa) {
-				isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-					"received multiple payload type %d.\n",
-					pa->type);
-				vfree(pbuf);
-				goto end;
-			}
-			sa = (struct isakmp_pl_sa *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_VID:
-			handle_vendorid(iph1, pa->ptr);
-			break;
-		default:
-			isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			vfree(pbuf);
-			goto end;
-		}
-	}
-	vfree(pbuf);
-
-	if (!hash || !sa) {
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"no HASH, or no SA payload.\n");
-		goto end;
-	}
-    }
-
-	/* validate HASH */
-    {
-	char *r_hash;
-	vchar_t *my_hash = NULL;
-	int result;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "validate HASH\n");
-
-	len = sizeof(isakmp->msgid) + ntohs(sa->h.len);
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-	memcpy(buf->v, &isakmp->msgid, sizeof(isakmp->msgid));
-	memcpy(buf->v + sizeof(isakmp->msgid), sa, ntohs(sa->h.len));
-
-	plog(LLV_DEBUG, LOCATION, NULL, "hash source\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	my_hash = isakmp_prf(iph1->skeyid_a, buf, iph1);
-	vfree(buf);
-	if (my_hash == NULL)
-		goto end;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "hash result\n");
-	plogdump(LLV_DEBUG, my_hash->v, my_hash->l);
-
-	r_hash = (char *)hash + sizeof(*hash);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "original hash\n"));
-	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash)));
-
-	result = memcmp(my_hash->v, r_hash, my_hash->l);
-	vfree(my_hash);
-
-	if (result) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"HASH mismatch.\n");
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_HASH_INFORMATION, NULL);
-		goto end;
-	}
-    }
-
-	/* check SA payload and get new one for use */
-	buf = ipsecdoi_get_proposal((struct ipsecdoi_sa *)sa,
-					OAKLEY_NEWGROUP_MODE);
-	if (buf == NULL) {
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
-		goto end;
-	}
-
-	/* save sa parameters */
-	osa = ipsecdoi_get_oakley(buf);
-	if (osa == NULL) {
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
-		goto end;
-	}
-	vfree(buf);
-
-	switch (osa->dhgrp) {
-	case OAKLEY_ATTR_GRP_DESC_MODP768:
-	case OAKLEY_ATTR_GRP_DESC_MODP1024:
-	case OAKLEY_ATTR_GRP_DESC_MODP1536:
-		/*XXX*/
-	default:
-		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
-		plog(LLV_ERROR, LOCATION, NULL,
-			"dh group %d isn't supported.\n", osa->dhgrp);
-		goto end;
-	}
-
-	plog(LLV_INFO, LOCATION, iph1->remote,
-		"got new dh group %s.\n", isakmp_pindex(&iph1->index, 0));
-
-	error = 0;
-
-end:
-	if (error) {
-		if (iph1 != NULL)
-			(void)isakmp_free_ph1(iph1);
-	}
-	return error;
-#endif
-	return 0;
-}
-
diff --git a/src/racoon/isakmp_newg.h b/src/racoon/isakmp_newg.h
deleted file mode 100644
index 1562c41..0000000
--- a/src/racoon/isakmp_newg.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*	$NetBSD: isakmp_newg.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_newg.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_NEWG_H
-#define _ISAKMP_NEWG_H
-
-extern int isakmp_newgroup_r __P((struct ph1handle *, vchar_t *));
-
-#endif /* _ISAKMP_NEWG_H */
diff --git a/src/racoon/isakmp_quick.c b/src/racoon/isakmp_quick.c
deleted file mode 100644
index 963438d..0000000
--- a/src/racoon/isakmp_quick.c
+++ /dev/null
@@ -1,2189 +0,0 @@
-/*	$NetBSD: isakmp_quick.c,v 1.11.4.1 2007/08/01 11:52:21 vanhu Exp $	*/
-
-/* Id: isakmp_quick.c,v 1.29 2006/08/22 18:17:17 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include PATH_IPSEC_H
-
-#include "var.h"
-#include "vmbuf.h"
-#include "schedule.h"
-#include "misc.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "handler.h"
-#include "policy.h"
-#include "proposal.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_inf.h"
-#include "isakmp_quick.h"
-#include "oakley.h"
-#include "ipsec_doi.h"
-#include "crypto_openssl.h"
-#include "pfkey.h"
-#include "policy.h"
-#include "algorithm.h"
-#include "sockmisc.h"
-#include "proposal.h"
-#include "sainfo.h"
-#include "admin.h"
-#include "strnames.h"
-
-/* quick mode */
-static vchar_t *quick_ir1mx __P((struct ph2handle *, vchar_t *, vchar_t *));
-static int get_sainfo_r __P((struct ph2handle *));
-static int get_proposal_r __P((struct ph2handle *));
-
-/* %%%
- * Quick Mode
- */
-/*
- * begin Quick Mode as initiator.  send pfkey getspi message to kernel.
- */
-int
-quick_i1prep(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg; /* must be null pointer */
-{
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_STATUS2) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	iph2->msgid = isakmp_newmsgid2(iph2->ph1);
-	iph2->ivm = oakley_newiv2(iph2->ph1, iph2->msgid);
-	if (iph2->ivm == NULL)
-		return 0;
-
-	iph2->status = PHASE2ST_GETSPISENT;
-
-	/* don't anything if local test mode. */
-	if (f_local) {
-		error = 0;
-		goto end;
-	}
-
-	/* send getspi message */
-	if (pk_sendgetspi(iph2) < 0)
-		goto end;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey getspi sent.\n");
-
-	iph2->sce = sched_new(lcconf->wait_ph2complete,
-		pfkey_timeover_stub, iph2);
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * send to responder
- * 	HDR*, HASH(1), SA, Ni [, KE ] [, IDi2, IDr2 ]
- */
-int
-quick_i1send(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg; /* must be null pointer */
-{
-	vchar_t *body = NULL;
-	vchar_t *hash = NULL;
-	struct isakmp_gen *gen;
-	char *p;
-	int tlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-	int pfsgroup, idci, idcr;
-	int np;
-	struct ipsecdoi_id_b *id, *id_p;
-
-	/* validity check */
-	if (msg != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"msg has to be NULL in this function.\n");
-		goto end;
-	}
-	if (iph2->status != PHASE2ST_GETSPIDONE) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* create SA payload for my proposal */
-	if (ipsecdoi_setph2proposal(iph2) < 0)
-		goto end;
-
-	/* generate NONCE value */
-	iph2->nonce = eay_set_random(iph2->ph1->rmconf->nonce_size);
-	if (iph2->nonce == NULL)
-		goto end;
-
-	/*
-	 * DH value calculation is kicked out into cfparse.y.
-	 * because pfs group can not be negotiated, it's only to be checked
-	 * acceptable.
-	 */
-	/* generate KE value if need */
-	pfsgroup = iph2->proposal->pfs_group;
-	if (pfsgroup) {
-		/* DH group settting if PFS is required. */
-		if (oakley_setdhgroup(pfsgroup, &iph2->pfsgrp) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to set DH value.\n");
-			goto end;
-		}
-		if (oakley_dh_generate(iph2->pfsgrp,
-				&iph2->dhpub, &iph2->dhpriv) < 0) {
-			goto end;
-		}
-	}
-
-	/* generate ID value */
-	if (ipsecdoi_setid2(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "IDci:\n");
-	plogdump(LLV_DEBUG, iph2->id->v, iph2->id->l);
-	plog(LLV_DEBUG, LOCATION, NULL, "IDcr:\n");
-	plogdump(LLV_DEBUG, iph2->id_p->v, iph2->id_p->l);
-
-	/*
-	 * we do not attach IDci nor IDcr, under the following condition:
-	 * - all proposals are transport mode
-	 * - no MIP6 or proxy
-	 * - id payload suggests to encrypt all the traffic (no specific
-	 *   protocol type)
-	 */
-	id = (struct ipsecdoi_id_b *)iph2->id->v;
-	id_p = (struct ipsecdoi_id_b *)iph2->id_p->v;
-	if (id->proto_id == 0
-	 && id_p->proto_id == 0
-	 && iph2->ph1->rmconf->support_proxy == 0
-	 && ipsecdoi_transportmode(iph2->proposal)) {
-		idci = idcr = 0;
-	} else
-		idci = idcr = 1;
-
-	/* create SA;NONCE payload, and KE if need, and IDii, IDir. */
-	tlen = + sizeof(*gen) + iph2->sa->l
-		+ sizeof(*gen) + iph2->nonce->l;
-	if (pfsgroup)
-		tlen += (sizeof(*gen) + iph2->dhpub->l);
-	if (idci)
-		tlen += sizeof(*gen) + iph2->id->l;
-	if (idcr)
-		tlen += sizeof(*gen) + iph2->id_p->l;
-
-	body = vmalloc(tlen);
-	if (body == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	p = body->v;
-
-	/* add SA payload */
-	p = set_isakmp_payload(p, iph2->sa, ISAKMP_NPTYPE_NONCE);
-
-	/* add NONCE payload */
-	if (pfsgroup)
-		np = ISAKMP_NPTYPE_KE;
-	else if (idci || idcr)
-		np = ISAKMP_NPTYPE_ID;
-	else
-		np = ISAKMP_NPTYPE_NONE;
-	p = set_isakmp_payload(p, iph2->nonce, np);
-
-	/* add KE payload if need. */
-	np = (idci || idcr) ? ISAKMP_NPTYPE_ID : ISAKMP_NPTYPE_NONE;
-	if (pfsgroup)
-		p = set_isakmp_payload(p, iph2->dhpub, np);
-
-	/* IDci */
-	np = (idcr) ? ISAKMP_NPTYPE_ID : ISAKMP_NPTYPE_NONE;
-	if (idci)
-		p = set_isakmp_payload(p, iph2->id, np);
-
-	/* IDcr */
-	if (idcr)
-		p = set_isakmp_payload(p, iph2->id_p, ISAKMP_NPTYPE_NONE);
-
-	/* generate HASH(1) */
-	hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, body);
-	if (hash == NULL)
-		goto end;
-
-	/* send isakmp payload */
-	iph2->sendbuf = quick_ir1mx(iph2, body, hash);
-	if (iph2->sendbuf == NULL)
-		goto end;
-
-	/* send the packet, add to the schedule to resend */
-	iph2->retry_counter = iph2->ph1->rmconf->retry_counter;
-	if (isakmp_ph2resend(iph2) == -1)
-		goto end;
-
-	/* change status of isakmp status entry */
-	iph2->status = PHASE2ST_MSG1SENT;
-
-	error = 0;
-
-end:
-	if (body != NULL)
-		vfree(body);
-	if (hash != NULL)
-		vfree(hash);
-
-	return error;
-}
-
-/*
- * receive from responder
- * 	HDR*, HASH(2), SA, Nr [, KE ] [, IDi2, IDr2 ]
- */
-int
-quick_i2recv(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *hbuf = NULL;	/* for hash computing. */
-	vchar_t *pbuf = NULL;	/* for payload parsing */
-	struct isakmp_parse_t *pa;
-	struct isakmp *isakmp = (struct isakmp *)msg0->v;
-	struct isakmp_pl_hash *hash = NULL;
-	int f_id;
-	char *p;
-	int tlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* decrypt packet */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"Packet wasn't encrypted.\n");
-		goto end;
-	}
-	msg = oakley_do_decrypt(iph2->ph1, msg0, iph2->ivm->iv, iph2->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* create buffer for validating HASH(2) */
-	/*
-	 * ordering rule:
-	 *	1. the first one must be HASH
-	 *	2. the second one must be SA (added in isakmp-oakley-05!)
-	 *	3. two IDs must be considered as IDci, then IDcr
-	 */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* HASH payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_HASH) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_HASH);
-		goto end;
-	}
-	hash = (struct isakmp_pl_hash *)pa->ptr;
-	pa++;
-
-	/*
-	 * this restriction was introduced in isakmp-oakley-05.
-	 * we do not check this for backward compatibility.
-	 * TODO: command line/config file option to enable/disable this code
-	 */
-	/* HASH payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_WARNING, LOCATION, iph2->ph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_HASH);
-	}
-
-	/* allocate buffer for computing HASH(2) */
-	tlen = iph2->nonce->l
-		+ ntohl(isakmp->len) - sizeof(*isakmp);
-	hbuf = vmalloc(tlen);
-	if (hbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer.\n");
-		goto end;
-	}
-	p = hbuf->v + iph2->nonce->l;	/* retain the space for Ni_b */
-
-	/*
-	 * parse the payloads.
-	 * copy non-HASH payloads into hbuf, so that we can validate HASH.
-	 */
-	iph2->sa_ret = NULL;
-	f_id = 0;	/* flag to use checking ID */
-	tlen = 0;	/* count payload length except of HASH payload. */
-	for (; pa->type; pa++) {
-
-		/* copy to buffer for HASH */
-		/* Don't modify the payload */
-		memcpy(p, pa->ptr, pa->len);
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_SA:
-			if (iph2->sa_ret != NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"Ignored, multiple SA "
-					"isn't supported.\n");
-				break;
-			}
-			if (isakmp_p2ph(&iph2->sa_ret, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph2->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph2->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_ID:
-		    {
-			vchar_t *vp;
-
-			/* check ID value */
-			if (f_id == 0) {
-				/* for IDci */
-				f_id = 1;
-				vp = iph2->id;
-			} else {
-				/* for IDcr */
-				vp = iph2->id_p;
-			}
-
-#ifndef ANDROID_PATCHED
-			if (memcmp(vp->v, (caddr_t)pa->ptr + sizeof(struct isakmp_gen), vp->l)) {
-
-				plog(LLV_ERROR, LOCATION, NULL,
-					"mismatched ID was returned.\n");
-				error = ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED;
-				goto end;
-			}
-#endif
-		    }
-			break;
-
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph2->ph1);
-			break;
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATOA_DRAFT:
-		case ISAKMP_NPTYPE_NATOA_RFC:
-			/* Ignore original source/destination messages */
-			break;
-#endif
-
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-
-		p += pa->len;
-
-		/* compute true length of payload. */
-		tlen += pa->len;
-	}
-
-	/* payload existency check */
-	if (hash == NULL || iph2->sa_ret == NULL || iph2->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* Fixed buffer for calculating HASH */
-	memcpy(hbuf->v, iph2->nonce->v, iph2->nonce->l);
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"HASH allocated:hbuf->l=%zu actual:tlen=%zu\n",
-		hbuf->l, tlen + iph2->nonce->l);
-	/* adjust buffer length for HASH */
-	hbuf->l = iph2->nonce->l + tlen;
-
-	/* validate HASH(2) */
-    {
-	char *r_hash;
-	vchar_t *my_hash = NULL;
-	int result;
-
-	r_hash = (char *)hash + sizeof(*hash);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(2) received:");
-	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash));
-
-	my_hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, hbuf);
-	if (my_hash == NULL)
-		goto end;
-
-	result = memcmp(my_hash->v, r_hash, my_hash->l);
-	vfree(my_hash);
-
-	if (result) {
-		plog(LLV_DEBUG, LOCATION, iph2->ph1->remote,
-			"HASH(2) mismatch.\n");
-		error = ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		goto end;
-	}
-    }
-
-	/* validity check SA payload sent from responder */
-	if (ipsecdoi_checkph2proposal(iph2) < 0) {
-		error = ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN;
-		goto end;
-	}
-
-	/* change status of isakmp status entry */
-	iph2->status = PHASE2ST_STATUS6;
-
-	error = 0;
-
-end:
-	if (hbuf)
-		vfree(hbuf);
-	if (pbuf)
-		vfree(pbuf);
-	if (msg)
-		vfree(msg);
-
-	if (error) {
-		VPTRINIT(iph2->sa_ret);
-		VPTRINIT(iph2->nonce_p);
-		VPTRINIT(iph2->dhpub_p);
-		VPTRINIT(iph2->id);
-		VPTRINIT(iph2->id_p);
-	}
-
-	return error;
-}
-
-/*
- * send to responder
- * 	HDR*, HASH(3)
- */
-int
-quick_i2send(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *buf = NULL;
-	vchar_t *hash = NULL;
-	char *p = NULL;
-	int tlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_STATUS6) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* generate HASH(3) */
-    {
-	vchar_t *tmp = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(3) generate\n");
-
-	tmp = vmalloc(iph2->nonce->l + iph2->nonce_p->l);
-	if (tmp == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer.\n");
-		goto end;
-	}
-	memcpy(tmp->v, iph2->nonce->v, iph2->nonce->l);
-	memcpy(tmp->v + iph2->nonce->l, iph2->nonce_p->v, iph2->nonce_p->l);
-
-	hash = oakley_compute_hash3(iph2->ph1, iph2->msgid, tmp);
-	vfree(tmp);
-
-	if (hash == NULL)
-		goto end;
-    }
-
-	/* create buffer for isakmp payload */
-	tlen = sizeof(struct isakmp)
-		+ sizeof(struct isakmp_gen) + hash->l;
-	buf = vmalloc(tlen);
-	if (buf == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	/* create isakmp header */
-	p = set_isakmp_header2(buf, iph2, ISAKMP_NPTYPE_HASH);
-	if (p == NULL)
-		goto end;
-
-	/* add HASH(3) payload */
-	p = set_isakmp_payload(p, hash, ISAKMP_NPTYPE_NONE);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(buf, iph2->ph1->local, iph2->ph1->remote, 1);
-#endif
-
-	/* encoding */
-	iph2->sendbuf = oakley_do_encrypt(iph2->ph1, buf, iph2->ivm->ive, iph2->ivm->iv);
-	if (iph2->sendbuf == NULL)
-		goto end;
-
-	/* if there is commit bit, need resending */
-	if (ISSET(iph2->flags, ISAKMP_FLAG_C)) {
-		/* send the packet, add to the schedule to resend */
-		iph2->retry_counter = iph2->ph1->rmconf->retry_counter;
-		if (isakmp_ph2resend(iph2) == -1)
-			goto end;
-	} else {
-		/* send the packet */
-		if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0)
-			goto end;
-	}
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph2->ph1->remote, iph2->ph1->local,
-			iph2->sendbuf, msg0) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* compute both of KEYMATs */
-	if (oakley_compute_keymat(iph2, INITIATOR) < 0)
-		goto end;
-
-	iph2->status = PHASE2ST_ADDSA;
-
-	/* don't anything if local test mode. */
-	if (f_local) {
-		error = 0;
-		goto end;
-	}
-
-	/* if there is commit bit don't set up SA now. */
-	if (ISSET(iph2->flags, ISAKMP_FLAG_C)) {
-		iph2->status = PHASE2ST_COMMIT;
-		error = 0;
-		goto end;
-	}
-
-	/* Do UPDATE for initiator */
-	plog(LLV_DEBUG, LOCATION, NULL, "call pk_sendupdate\n");
-	if (pk_sendupdate(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey update failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey update sent.\n");
-
-	/* Do ADD for responder */
-	if (pk_sendadd(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey add failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey add sent.\n");
-
-	error = 0;
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	if (msg != NULL)
-		vfree(msg);
-	if (hash != NULL)
-		vfree(hash);
-
-	return error;
-}
-
-/*
- * receive from responder
- * 	HDR#*, HASH(4), notify
- */
-int
-quick_i3recv(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *pbuf = NULL;	/* for payload parsing */
-	struct isakmp_parse_t *pa;
-	struct isakmp_pl_hash *hash = NULL;
-	vchar_t *notify = NULL;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_COMMIT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* decrypt packet */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"Packet wasn't encrypted.\n");
-		goto end;
-	}
-	msg = oakley_do_decrypt(iph2->ph1, msg0, iph2->ivm->iv, iph2->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_HASH:
-			hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_N:
-			if (notify != NULL) {
-				plog(LLV_WARNING, LOCATION, NULL,
-				    "Ignoring multiples notifications\n");
-				break;
-			}
-			isakmp_check_notify(pa->ptr, iph2->ph1);
-			notify = vmalloc(pa->len);
-			if (notify == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get notify buffer.\n");
-				goto end;
-			}
-			memcpy(notify->v, pa->ptr, notify->l);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-	if (hash == NULL) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* validate HASH(4) */
-    {
-	char *r_hash;
-	vchar_t *my_hash = NULL;
-	vchar_t *tmp = NULL;
-	int result;
-
-	r_hash = (char *)hash + sizeof(*hash);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(4) validate:");
-	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash));
-
-	my_hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, notify);
-	vfree(tmp);
-	if (my_hash == NULL)
-		goto end;
-
-	result = memcmp(my_hash->v, r_hash, my_hash->l);
-	vfree(my_hash);
-
-	if (result) {
-		plog(LLV_DEBUG, LOCATION, iph2->ph1->remote,
-			"HASH(4) mismatch.\n");
-		error = ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		goto end;
-	}
-    }
-
-	iph2->status = PHASE2ST_ADDSA;
-	iph2->flags ^= ISAKMP_FLAG_C;	/* reset bit */
-
-	/* don't anything if local test mode. */
-	if (f_local) {
-		error = 0;
-		goto end;
-	}
-
-	/* Do UPDATE for initiator */
-	plog(LLV_DEBUG, LOCATION, NULL, "call pk_sendupdate\n");
-	if (pk_sendupdate(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey update failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey update sent.\n");
-
-	/* Do ADD for responder */
-	if (pk_sendadd(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey add failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey add sent.\n");
-
-	error = 0;
-
-end:
-	if (msg != NULL)
-		vfree(msg);
-	if (pbuf != NULL)
-		vfree(pbuf);
-	if (notify != NULL)
-		vfree(notify);
-
-	return error;
-}
-
-/*
- * receive from initiator
- * 	HDR*, HASH(1), SA, Ni [, KE ] [, IDi2, IDr2 ]
- */
-int
-quick_r1recv(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *hbuf = NULL;	/* for hash computing. */
-	vchar_t *pbuf = NULL;	/* for payload parsing */
-	struct isakmp_parse_t *pa;
-	struct isakmp *isakmp = (struct isakmp *)msg0->v;
-	struct isakmp_pl_hash *hash = NULL;
-	char *p;
-	int tlen;
-	int f_id_order;	/* for ID payload detection */
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_START) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* decrypting */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"Packet wasn't encrypted.\n");
-		error = ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		goto end;
-	}
-	/* decrypt packet */
-	msg = oakley_do_decrypt(iph2->ph1, msg0, iph2->ivm->iv, iph2->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* create buffer for using to validate HASH(1) */
-	/*
-	 * ordering rule:
-	 *	1. the first one must be HASH
-	 *	2. the second one must be SA (added in isakmp-oakley-05!)
-	 *	3. two IDs must be considered as IDci, then IDcr
-	 */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-	pa = (struct isakmp_parse_t *)pbuf->v;
-
-	/* HASH payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_HASH) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_HASH);
-		error = ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX;
-		goto end;
-	}
-	hash = (struct isakmp_pl_hash *)pa->ptr;
-	pa++;
-
-	/*
-	 * this restriction was introduced in isakmp-oakley-05.
-	 * we do not check this for backward compatibility.
-	 * TODO: command line/config file option to enable/disable this code
-	 */
-	/* HASH payload is fixed postion */
-	if (pa->type != ISAKMP_NPTYPE_SA) {
-		plog(LLV_WARNING, LOCATION, iph2->ph1->remote,
-			"received invalid next payload type %d, "
-			"expecting %d.\n",
-			pa->type, ISAKMP_NPTYPE_SA);
-		error = ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX;
-	}
-
-	/* allocate buffer for computing HASH(1) */
-	tlen = ntohl(isakmp->len) - sizeof(*isakmp);
-	hbuf = vmalloc(tlen);
-	if (hbuf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer.\n");
-		goto end;
-	}
-	p = hbuf->v;
-
-	/*
-	 * parse the payloads.
-	 * copy non-HASH payloads into hbuf, so that we can validate HASH.
-	 */
-	iph2->sa = NULL;	/* we don't support multi SAs. */
-	iph2->nonce_p = NULL;
-	iph2->dhpub_p = NULL;
-	iph2->id_p = NULL;
-	iph2->id = NULL;
-	tlen = 0;	/* count payload length except of HASH payload. */
-
-	/*
-	 * IDi2 MUST be immediatelly followed by IDr2.  We allowed the
-	 * illegal case, but logged.  First ID payload is to be IDi2.
-	 * And next ID payload is to be IDr2.
-	 */
-	f_id_order = 0;
-
-	for (; pa->type; pa++) {
-
-		/* copy to buffer for HASH */
-		/* Don't modify the payload */
-		memcpy(p, pa->ptr, pa->len);
-
-		if (pa->type != ISAKMP_NPTYPE_ID)
-			f_id_order = 0;
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_SA:
-			if (iph2->sa != NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"Multi SAs isn't supported.\n");
-				goto end;
-			}
-			if (isakmp_p2ph(&iph2->sa, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_NONCE:
-			if (isakmp_p2ph(&iph2->nonce_p, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_KE:
-			if (isakmp_p2ph(&iph2->dhpub_p, pa->ptr) < 0)
-				goto end;
-			break;
-
-		case ISAKMP_NPTYPE_ID:
-			if (iph2->id_p == NULL) {
-				/* for IDci */
-				f_id_order++;
-
-				if (isakmp_p2ph(&iph2->id_p, pa->ptr) < 0)
-					goto end;
-
-			} else if (iph2->id == NULL) {
-				/* for IDcr */
-				if (f_id_order == 0) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"IDr2 payload is not "
-						"immediatelly followed "
-						"by IDi2. We allowed.\n");
-					/* XXX we allowed in this case. */
-				}
-
-				if (isakmp_p2ph(&iph2->id, pa->ptr) < 0)
-					goto end;
-			} else {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"received too many ID payloads.\n");
-				plogdump(LLV_ERROR, iph2->id->v, iph2->id->l);
-				error = ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-				goto end;
-			}
-			break;
-
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph2->ph1);
-			break;
-
-#ifdef ENABLE_NATT
-		case ISAKMP_NPTYPE_NATOA_DRAFT:
-		case ISAKMP_NPTYPE_NATOA_RFC:
-			/* Ignore original source/destination messages */
-			break;
-#endif
-
-		default:
-			plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			error = ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-			goto end;
-		}
-
-		p += pa->len;
-
-		/* compute true length of payload. */
-		tlen += pa->len;
-	}
-
-	/* payload existency check */
-	if (hash == NULL || iph2->sa == NULL || iph2->nonce_p == NULL) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"few isakmp message received.\n");
-		error = ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		goto end;
-	}
-
-	if (iph2->id_p) {
-		plog(LLV_DEBUG, LOCATION, NULL, "received IDci2:");
-		plogdump(LLV_DEBUG, iph2->id_p->v, iph2->id_p->l);
-	}
-	if (iph2->id) {
-		plog(LLV_DEBUG, LOCATION, NULL, "received IDcr2:");
-		plogdump(LLV_DEBUG, iph2->id->v, iph2->id->l);
-	}
-
-	/* adjust buffer length for HASH */
-	hbuf->l = tlen;
-
-	/* validate HASH(1) */
-    {
-	char *r_hash;
-	vchar_t *my_hash = NULL;
-	int result;
-
-	r_hash = (caddr_t)hash + sizeof(*hash);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(1) validate:");
-	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash));
-
-	my_hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, hbuf);
-	if (my_hash == NULL)
-		goto end;
-
-	result = memcmp(my_hash->v, r_hash, my_hash->l);
-	vfree(my_hash);
-
-	if (result) {
-		plog(LLV_DEBUG, LOCATION, iph2->ph1->remote,
-			"HASH(1) mismatch.\n");
-		error = ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		goto end;
-	}
-    }
-
-	/* get sainfo */
-	error = get_sainfo_r(iph2);
-	if (error) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get sainfo.\n");
-		goto end;
-	}
-
-
-	/* check the existence of ID payload and create responder's proposal */
-	error = get_proposal_r(iph2);
-	switch (error) {
-	case -2:
-		/* generate a policy template from peer's proposal */
-		if (set_proposal_from_proposal(iph2)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to generate a proposal template "
-				"from client's proposal.\n");
-			return ISAKMP_INTERNAL_ERROR;
-		}
-		/*FALLTHROUGH*/
-	case 0:
-		/* select single proposal or reject it. */
-		if (ipsecdoi_selectph2proposal(iph2) < 0) {
-			error = ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN;
-			goto end;
-		}
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get proposal for responder.\n");
-		goto end;
-	}
-
-	/* check KE and attribute of PFS */
-	if (iph2->dhpub_p != NULL && iph2->approval->pfs_group == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no PFS is specified, but peer sends KE.\n");
-		error = ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN;
-		goto end;
-	}
-	if (iph2->dhpub_p == NULL && iph2->approval->pfs_group != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"PFS is specified, but peer doesn't sends KE.\n");
-		error = ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN;
-		goto end;
-	}
-
-	/*
-	 * save the packet from the initiator in order to resend the
-	 * responder's first packet against this packet.
-	 */
-	iph2->msg1 = vdup(msg0);
-
-	/* change status of isakmp status entry */
-	iph2->status = PHASE2ST_STATUS2;
-
-	error = 0;
-
-end:
-	if (hbuf)
-		vfree(hbuf);
-	if (msg)
-		vfree(msg);
-	if (pbuf)
-		vfree(pbuf);
-
-	if (error) {
-		VPTRINIT(iph2->sa);
-		VPTRINIT(iph2->nonce_p);
-		VPTRINIT(iph2->dhpub_p);
-		VPTRINIT(iph2->id);
-		VPTRINIT(iph2->id_p);
-	}
-
-	return error;
-}
-
-/*
- * call pfkey_getspi.
- */
-int
-quick_r1prep(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg;
-{
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_STATUS2) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	iph2->status = PHASE2ST_GETSPISENT;
-
-	/* send getspi message */
-	if (pk_sendgetspi(iph2) < 0)
-		goto end;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey getspi sent.\n");
-
-	iph2->sce = sched_new(lcconf->wait_ph2complete,
-		pfkey_timeover_stub, iph2);
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * send to initiator
- * 	HDR*, HASH(2), SA, Nr [, KE ] [, IDi2, IDr2 ]
- */
-int
-quick_r2send(iph2, msg)
-	struct ph2handle *iph2;
-	vchar_t *msg;
-{
-	vchar_t *body = NULL;
-	vchar_t *hash = NULL;
-	struct isakmp_gen *gen;
-	char *p;
-	int tlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-	int pfsgroup;
-	u_int8_t *np_p = NULL;
-
-	/* validity check */
-	if (msg != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"msg has to be NULL in this function.\n");
-		goto end;
-	}
-	if (iph2->status != PHASE2ST_GETSPIDONE) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* update responders SPI */
-	if (ipsecdoi_updatespi(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "failed to update spi.\n");
-		goto end;
-	}
-
-	/* generate NONCE value */
-	iph2->nonce = eay_set_random(iph2->ph1->rmconf->nonce_size);
-	if (iph2->nonce == NULL)
-		goto end;
-
-	/* generate KE value if need */
-	pfsgroup = iph2->approval->pfs_group;
-	if (iph2->dhpub_p != NULL && pfsgroup != 0) {
-		/* DH group settting if PFS is required. */
-		if (oakley_setdhgroup(pfsgroup, &iph2->pfsgrp) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to set DH value.\n");
-			goto end;
-		}
-		/* generate DH public value */
-		if (oakley_dh_generate(iph2->pfsgrp,
-				&iph2->dhpub, &iph2->dhpriv) < 0) {
-			goto end;
-		}
-	}
-
-	/* create SA;NONCE payload, and KE and ID if need */
-	tlen = sizeof(*gen) + iph2->sa_ret->l
-		+ sizeof(*gen) + iph2->nonce->l;
-	if (iph2->dhpub_p != NULL && pfsgroup != 0)
-		tlen += (sizeof(*gen) + iph2->dhpub->l);
-	if (iph2->id_p != NULL)
-		tlen += (sizeof(*gen) + iph2->id_p->l
-			+ sizeof(*gen) + iph2->id->l);
-
-	body = vmalloc(tlen);
-	if (body == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-	p = body->v;
-
-	/* make SA payload */ 
-	p = set_isakmp_payload(body->v, iph2->sa_ret, ISAKMP_NPTYPE_NONCE);
-
-	/* add NONCE payload */
-	np_p = &((struct isakmp_gen *)p)->np;	/* XXX */
-	p = set_isakmp_payload(p, iph2->nonce,
-		(iph2->dhpub_p != NULL && pfsgroup != 0)
-				? ISAKMP_NPTYPE_KE
-				: (iph2->id_p != NULL
-					? ISAKMP_NPTYPE_ID
-					: ISAKMP_NPTYPE_NONE));
-
-	/* add KE payload if need. */
-	if (iph2->dhpub_p != NULL && pfsgroup != 0) {
-		np_p = &((struct isakmp_gen *)p)->np;	/* XXX */
-		p = set_isakmp_payload(p, iph2->dhpub,
-			(iph2->id_p == NULL)
-				? ISAKMP_NPTYPE_NONE
-				: ISAKMP_NPTYPE_ID);
-	}
-
-	/* add ID payloads received. */
-	if (iph2->id_p != NULL) {
-		/* IDci */
-		p = set_isakmp_payload(p, iph2->id_p, ISAKMP_NPTYPE_ID);
-		/* IDcr */
-		np_p = &((struct isakmp_gen *)p)->np;	/* XXX */
-		p = set_isakmp_payload(p, iph2->id, ISAKMP_NPTYPE_NONE);
-	}
-
-	/* add a RESPONDER-LIFETIME notify payload if needed */
-    {
-	vchar_t *data = NULL;
-	struct saprop *pp = iph2->approval;
-	struct saproto *pr;
-
-	if (pp->claim & IPSECDOI_ATTR_SA_LD_TYPE_SEC) {
-		u_int32_t v = htonl((u_int32_t)pp->lifetime);
-		data = isakmp_add_attr_l(data, IPSECDOI_ATTR_SA_LD_TYPE,
-					IPSECDOI_ATTR_SA_LD_TYPE_SEC);
-		if (!data)
-			goto end;
-		data = isakmp_add_attr_v(data, IPSECDOI_ATTR_SA_LD,
-					(caddr_t)&v, sizeof(v));
-		if (!data)
-			goto end;
-	}
-	if (pp->claim & IPSECDOI_ATTR_SA_LD_TYPE_KB) {
-		u_int32_t v = htonl((u_int32_t)pp->lifebyte);
-		data = isakmp_add_attr_l(data, IPSECDOI_ATTR_SA_LD_TYPE,
-					IPSECDOI_ATTR_SA_LD_TYPE_KB);
-		if (!data)
-			goto end;
-		data = isakmp_add_attr_v(data, IPSECDOI_ATTR_SA_LD,
-					(caddr_t)&v, sizeof(v));
-		if (!data)
-			goto end;
-	}
-
-	/*
-	 * XXX Is there only single RESPONDER-LIFETIME payload in a IKE message
-	 * in the case of SA bundle ?
-	 */
-	if (data) {
-		for (pr = pp->head; pr; pr = pr->next) {
-			body = isakmp_add_pl_n(body, &np_p,
-					ISAKMP_NTYPE_RESPONDER_LIFETIME, pr, data);
-			if (!body) {
-				vfree(data);
-				return error;	/* XXX */
-			}
-		}
-		vfree(data);
-	}
-    }
-
-	/* generate HASH(2) */
-    {
-	vchar_t *tmp;
-
-	tmp = vmalloc(iph2->nonce_p->l + body->l);
-	if (tmp == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer.\n");
-		goto end;
-	}
-	memcpy(tmp->v, iph2->nonce_p->v, iph2->nonce_p->l);
-	memcpy(tmp->v + iph2->nonce_p->l, body->v, body->l);
-
-	hash = oakley_compute_hash1(iph2->ph1, iph2->msgid, tmp);
-	vfree(tmp);
-
-	if (hash == NULL)
-		goto end;
-    }
-
-	/* send isakmp payload */
-	iph2->sendbuf = quick_ir1mx(iph2, body, hash);
-	if (iph2->sendbuf == NULL)
-		goto end;
-
-	/* send the packet, add to the schedule to resend */
-	iph2->retry_counter = iph2->ph1->rmconf->retry_counter;
-	if (isakmp_ph2resend(iph2) == -1)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph2->ph1->remote, iph2->ph1->local, iph2->sendbuf, iph2->msg1) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	/* change status of isakmp status entry */
-	iph2->status = PHASE2ST_MSG1SENT;
-
-	error = 0;
-
-end:
-	if (body != NULL)
-		vfree(body);
-	if (hash != NULL)
-		vfree(hash);
-
-	return error;
-}
-
-/*
- * receive from initiator
- * 	HDR*, HASH(3)
- */
-int
-quick_r3recv(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *msg = NULL;
-	vchar_t *pbuf = NULL;	/* for payload parsing */
-	struct isakmp_parse_t *pa;
-	struct isakmp_pl_hash *hash = NULL;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_MSG1SENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* decrypt packet */
-	if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"Packet wasn't encrypted.\n");
-		goto end;
-	}
-	msg = oakley_do_decrypt(iph2->ph1, msg0, iph2->ivm->iv, iph2->ivm->ive);
-	if (msg == NULL)
-		goto end;
-
-	/* validate the type of next payload */
-	pbuf = isakmp_parse(msg);
-	if (pbuf == NULL)
-		goto end;
-
-	for (pa = (struct isakmp_parse_t *)pbuf->v;
-	     pa->type != ISAKMP_NPTYPE_NONE;
-	     pa++) {
-
-		switch (pa->type) {
-		case ISAKMP_NPTYPE_HASH:
-			hash = (struct isakmp_pl_hash *)pa->ptr;
-			break;
-		case ISAKMP_NPTYPE_N:
-			isakmp_check_notify(pa->ptr, iph2->ph1);
-			break;
-		default:
-			/* don't send information, see ident_r1recv() */
-			plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-				"ignore the packet, "
-				"received unexpecting payload type %d.\n",
-				pa->type);
-			goto end;
-		}
-	}
-
-	/* payload existency check */
-	if (hash == NULL) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"few isakmp message received.\n");
-		goto end;
-	}
-
-	/* validate HASH(3) */
-	/* HASH(3) = prf(SKEYID_a, 0 | M-ID | Ni_b | Nr_b) */
-    {
-	char *r_hash;
-	vchar_t *my_hash = NULL;
-	vchar_t *tmp = NULL;
-	int result;
-
-	r_hash = (char *)hash + sizeof(*hash);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(3) validate:");
-	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash));
-
-	tmp = vmalloc(iph2->nonce_p->l + iph2->nonce->l);
-	if (tmp == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer.\n");
-		goto end;
-	}
-	memcpy(tmp->v, iph2->nonce_p->v, iph2->nonce_p->l);
-	memcpy(tmp->v + iph2->nonce_p->l, iph2->nonce->v, iph2->nonce->l);
-
-	my_hash = oakley_compute_hash3(iph2->ph1, iph2->msgid, tmp);
-	vfree(tmp);
-	if (my_hash == NULL)
-		goto end;
-
-	result = memcmp(my_hash->v, r_hash, my_hash->l);
-	vfree(my_hash);
-
-	if (result) {
-		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
-			"HASH(3) mismatch.\n");
-		error = ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		goto end;
-	}
-    }
-
-	/* if there is commit bit, don't set up SA now. */
-	if (ISSET(iph2->flags, ISAKMP_FLAG_C)) {
-		iph2->status = PHASE2ST_COMMIT;
-	} else
-		iph2->status = PHASE2ST_STATUS6;
-
-	error = 0;
-
-end:
-	if (pbuf != NULL)
-		vfree(pbuf);
-	if (msg != NULL)
-		vfree(msg);
-
-	return error;
-}
-
-/*
- * send to initiator
- * 	HDR#*, HASH(4), notify
- */
-int
-quick_r3send(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	vchar_t *buf = NULL;
-	vchar_t *myhash = NULL;
-	struct isakmp_pl_n *n;
-	vchar_t *notify = NULL;
-	char *p;
-	int tlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_COMMIT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* generate HASH(4) */
-	/* XXX What can I do in the case of multiple different SA */
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH(4) generate\n");
-
-	/* XXX What should I do if there are multiple SAs ? */
-	tlen = sizeof(struct isakmp_pl_n) + iph2->approval->head->spisize;
-	notify = vmalloc(tlen);
-	if (notify == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get notify buffer.\n");
-		goto end;
-	}
-	n = (struct isakmp_pl_n *)notify->v;
-	n->h.np = ISAKMP_NPTYPE_NONE;
-	n->h.len = htons(tlen);
-	n->doi = htonl(IPSEC_DOI);
-	n->proto_id = iph2->approval->head->proto_id;
-	n->spi_size = sizeof(iph2->approval->head->spisize);
-	n->type = htons(ISAKMP_NTYPE_CONNECTED);
-	memcpy(n + 1, &iph2->approval->head->spi, iph2->approval->head->spisize);
-
-	myhash = oakley_compute_hash1(iph2->ph1, iph2->msgid, notify);
-	if (myhash == NULL)
-		goto end;
-
-	/* create buffer for isakmp payload */
-	tlen = sizeof(struct isakmp)
-		+ sizeof(struct isakmp_gen) + myhash->l
-		+ notify->l;
-	buf = vmalloc(tlen);
-	if (buf == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	/* create isakmp header */
-	p = set_isakmp_header2(buf, iph2, ISAKMP_NPTYPE_HASH);
-	if (p == NULL)
-		goto end;
-
-	/* add HASH(4) payload */
-	p = set_isakmp_payload(p, myhash, ISAKMP_NPTYPE_N);
-
-	/* add notify payload */
-	memcpy(p, notify->v, notify->l);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(buf, iph2->ph1->local, iph2->ph1->remote, 1);
-#endif
-
-	/* encoding */
-	iph2->sendbuf = oakley_do_encrypt(iph2->ph1, buf, iph2->ivm->ive, iph2->ivm->iv);
-	if (iph2->sendbuf == NULL)
-		goto end;
-
-	/* send the packet */
-	if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0)
-		goto end;
-
-	/* the sending message is added to the received-list. */
-	if (add_recvdpkt(iph2->ph1->remote, iph2->ph1->local, iph2->sendbuf, msg0) == -1) {
-		plog(LLV_ERROR , LOCATION, NULL,
-			"failed to add a response packet to the tree.\n");
-		goto end;
-	}
-
-	iph2->status = PHASE2ST_COMMIT;
-
-	error = 0;
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	if (myhash != NULL)
-		vfree(myhash);
-	if (notify != NULL)
-		vfree(notify);
-
-	return error;
-}
-
-int
-tunnel_mode_prop(p)
-	struct saprop *p;
-{
-	struct saproto *pr;
-
-	for (pr = p->head; pr; pr = pr->next)
-		if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL)
-			return 1;
-	return 0;
-}
-
-/*
- * set SA to kernel.
- */
-int
-quick_r3prep(iph2, msg0)
-	struct ph2handle *iph2;
-	vchar_t *msg0;
-{
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* validity check */
-	if (iph2->status != PHASE2ST_STATUS6) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatched %d.\n", iph2->status);
-		goto end;
-	}
-
-	/* compute both of KEYMATs */
-	if (oakley_compute_keymat(iph2, RESPONDER) < 0)
-		goto end;
-
-	iph2->status = PHASE2ST_ADDSA;
-	iph2->flags ^= ISAKMP_FLAG_C;	/* reset bit */
-
-	/* don't anything if local test mode. */
-	if (f_local) {
-		error = 0;
-		goto end;
-	}
-
-	/* Do UPDATE as responder */
-	plog(LLV_DEBUG, LOCATION, NULL, "call pk_sendupdate\n");
-	if (pk_sendupdate(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey update failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey update sent.\n");
-
-	/* Do ADD for responder */
-	if (pk_sendadd(iph2) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL, "pfkey add failed.\n");
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "pfkey add sent.\n");
-
-	/*
-	 * set policies into SPD if the policy is generated
-	 * from peer's policy.
-	 */
-	if (iph2->spidx_gen) {
-
-		struct policyindex *spidx;
-		struct sockaddr_storage addr;
-		u_int8_t pref;
-		struct sockaddr *src = iph2->src;
-		struct sockaddr *dst = iph2->dst;
-
-		/* make inbound policy */
-		iph2->src = dst;
-		iph2->dst = src;
-		if (pk_sendspdupdate2(iph2) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey spdupdate2(inbound) failed.\n");
-			goto end;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey spdupdate2(inbound) sent.\n");
-
-		spidx = (struct policyindex *)iph2->spidx_gen;
-#ifdef HAVE_POLICY_FWD
-		/* make forward policy if required */
-		if (tunnel_mode_prop(iph2->approval)) {
-			spidx->dir = IPSEC_DIR_FWD;
-			if (pk_sendspdupdate2(iph2) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"pfkey spdupdate2(forward) failed.\n");
-				goto end;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"pfkey spdupdate2(forward) sent.\n");
-		}
-#endif
-
-		/* make outbound policy */
-		iph2->src = src;
-		iph2->dst = dst;
-		spidx->dir = IPSEC_DIR_OUTBOUND;
-		addr = spidx->src;
-		spidx->src = spidx->dst;
-		spidx->dst = addr;
-		pref = spidx->prefs;
-		spidx->prefs = spidx->prefd;
-		spidx->prefd = pref;
-
-		if (pk_sendspdupdate2(iph2) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey spdupdate2(outbound) failed.\n");
-			goto end;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey spdupdate2(outbound) sent.\n");
-
-		/* spidx_gen is unnecessary any more */
-		delsp_bothdir((struct policyindex *)iph2->spidx_gen);
-		racoon_free(iph2->spidx_gen);
-		iph2->spidx_gen = NULL;
-		iph2->generated_spidx=1;
-	}
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * create HASH, body (SA, NONCE) payload with isakmp header.
- */
-static vchar_t *
-quick_ir1mx(iph2, body, hash)
-	struct ph2handle *iph2;
-	vchar_t *body, *hash;
-{
-	struct isakmp *isakmp;
-	vchar_t *buf = NULL, *new = NULL;
-	char *p;
-	int tlen;
-	struct isakmp_gen *gen;
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* create buffer for isakmp payload */
-	tlen = sizeof(*isakmp)
-		+ sizeof(*gen) + hash->l
-		+ body->l;
-	buf = vmalloc(tlen);
-	if (buf == NULL) { 
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send.\n");
-		goto end;
-	}
-
-	/* re-set encryption flag, for serurity. */
-	iph2->flags |= ISAKMP_FLAG_E;
-
-	/* set isakmp header */
-	p = set_isakmp_header2(buf, iph2, ISAKMP_NPTYPE_HASH);
-	if (p == NULL)
-		goto end;
-
-	/* add HASH payload */
-	/* XXX is next type always SA ? */
-	p = set_isakmp_payload(p, hash, ISAKMP_NPTYPE_SA);
-
-	/* add body payload */
-	memcpy(p, body->v, body->l);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(buf, iph2->ph1->local, iph2->ph1->remote, 1);
-#endif
-
-	/* encoding */
-	new = oakley_do_encrypt(iph2->ph1, buf, iph2->ivm->ive, iph2->ivm->iv);
-	
-	if (new == NULL)
-		goto end;
-
-	vfree(buf);
-
-	buf = new;
-
-	error = 0;
-
-end:
-	if (error && buf != NULL) {
-		vfree(buf);
-		buf = NULL;
-	}
-
-	return buf;
-}
-
-/*
- * get remote's sainfo.
- * NOTE: this function is for responder.
- */
-static int
-get_sainfo_r(iph2)
-	struct ph2handle *iph2;
-{
-	vchar_t *idsrc = NULL, *iddst = NULL;
-	int prefixlen;
-	int error = ISAKMP_INTERNAL_ERROR;
-	int remoteid = 0;
-
-	if (iph2->id == NULL) {
-		switch (iph2->src->sa_family) {
-		case AF_INET:
-			prefixlen = sizeof(struct in_addr) << 3;
-			break;
-		case AF_INET6:
-			prefixlen = sizeof(struct in6_addr) << 3;
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid family: %d\n", iph2->src->sa_family);
-			goto end;
-		}
-		idsrc = ipsecdoi_sockaddr2id(iph2->src, prefixlen,
-					IPSEC_ULPROTO_ANY);
-	} else {
-		idsrc = vdup(iph2->id);
-	}
-	if (idsrc == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to set ID for source.\n");
-		goto end;
-	}
-
-	if (iph2->id_p == NULL) {
-		switch (iph2->dst->sa_family) {
-		case AF_INET:
-			prefixlen = sizeof(struct in_addr) << 3;
-			break;
-		case AF_INET6:
-			prefixlen = sizeof(struct in6_addr) << 3;
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid family: %d\n", iph2->dst->sa_family);
-			goto end;
-		}
-		iddst = ipsecdoi_sockaddr2id(iph2->dst, prefixlen,
-					IPSEC_ULPROTO_ANY);
-	} else {
-		iddst = vdup(iph2->id_p);
-	}
-	if (iddst == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to set ID for destination.\n");
-		goto end;
-	}
-
-	{
-		struct remoteconf *conf;
-		conf = getrmconf(iph2->dst);
-		if (conf != NULL)
-			remoteid=conf->ph1id;
-		else{
-			plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
-			remoteid=0;
-		}
-		
-	}
-
-	iph2->sainfo = getsainfo(idsrc, iddst, iph2->ph1->id_p, remoteid);
-	if (iph2->sainfo == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get sainfo.\n");
-		goto end;
-	}
-
-#ifdef ENABLE_HYBRID
-	/* xauth group inclusion check */
-	if (iph2->sainfo->group != NULL)
-		if(group_check(iph2->ph1,&iph2->sainfo->group->v,1))
-			goto end;
-#endif
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"selected sainfo: %s\n", sainfo2str(iph2->sainfo));
-
-	error = 0;
-end:
-	if (idsrc)
-		vfree(idsrc);
-	if (iddst)
-		vfree(iddst);
-
-	return error;
-}
-
-/*
- * Copy both IP addresses in ID payloads into [src,dst]_id if both ID types
- * are IP address and same address family.
- * Then get remote's policy from SPD copied from kernel.
- * If the type of ID payload is address or subnet type, then the index is
- * made from the payload.  If there is no ID payload, or the type of ID
- * payload is NOT address type, then the index is made from the address
- * pair of phase 1.
- * NOTE: This function is only for responder.
- */
-static int
-get_proposal_r(iph2)
-	struct ph2handle *iph2;
-{
-	struct policyindex spidx;
-	struct secpolicy *sp_in, *sp_out;
-	int idi2type = 0;	/* switch whether copy IDs into id[src,dst]. */
-	int error = ISAKMP_INTERNAL_ERROR;
-
-	/* check the existence of ID payload */
-	if ((iph2->id_p != NULL && iph2->id == NULL)
-	 || (iph2->id_p == NULL && iph2->id != NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Both IDs wasn't found in payload.\n");
-		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-	}
-
-	/* make sure if id[src,dst] is null. */
-	if (iph2->src_id || iph2->dst_id) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Why do ID[src,dst] exist already.\n");
-		return ISAKMP_INTERNAL_ERROR;
-	}
-
-	memset(&spidx, 0, sizeof(spidx));
-
-#define _XIDT(d) ((struct ipsecdoi_id_b *)(d)->v)->type
-
-	/* make a spidx; a key to search SPD */
-	spidx.dir = IPSEC_DIR_INBOUND;
-	spidx.ul_proto = 0;
-
-	/*
-	 * make destination address in spidx from either ID payload
-	 * or phase 1 address into a address in spidx.
-	 */
-	if (iph2->id != NULL
-	 && (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
-	  || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR
-	  || _XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR_SUBNET
-	  || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
-		/* get a destination address of a policy */
-		error = ipsecdoi_id2sockaddr(iph2->id,
-				(struct sockaddr *)&spidx.dst,
-				&spidx.prefd, &spidx.ul_proto);
-		if (error)
-			return error;
-
-#ifdef INET6
-		/*
-		 * get scopeid from the SA address.
-		 * note that the phase 1 source address is used as
-		 * a destination address to search for a inbound policy entry
-		 * because rcoon is responder.
-		 */
-		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR) {
-			error = setscopeid((struct sockaddr *)&spidx.dst,
-			                    iph2->src);
-			if (error)
-				return error;
-		}
-#endif
-
-		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
-		 || _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR)
-			idi2type = _XIDT(iph2->id);
-
-	} else {
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"get a destination address of SP index "
-			"from phase1 address "
-			"due to no ID payloads found "
-			"OR because ID type is not address.\n");
-
-		/*
-		 * copy the SOURCE address of IKE into the DESTINATION address
-		 * of the key to search the SPD because the direction of policy
-		 * is inbound.
-		 */
-		memcpy(&spidx.dst, iph2->src, sysdep_sa_len(iph2->src));
-		switch (spidx.dst.ss_family) {
-		case AF_INET:
-			spidx.prefd = sizeof(struct in_addr) << 3;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			spidx.prefd = sizeof(struct in6_addr) << 3;
-			break;
-#endif
-		default:
-			spidx.prefd = 0;
-			break;
-		}
-	}
-
-	/* make source address in spidx */
-	if (iph2->id_p != NULL
-	 && (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR
-	  || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR
-	  || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR_SUBNET
-	  || _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
-		/* get a source address of inbound SA */
-		error = ipsecdoi_id2sockaddr(iph2->id_p,
-				(struct sockaddr *)&spidx.src,
-				&spidx.prefs, &spidx.ul_proto);
-		if (error)
-			return error;
-
-#ifdef INET6
-		/*
-		 * get scopeid from the SA address.
-		 * for more detail, see above of this function.
-		 */
-		if (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR) {
-			error = setscopeid((struct sockaddr *)&spidx.src,
-			                    iph2->dst);
-			if (error)
-				return error;
-		}
-#endif
-
-		/* make id[src,dst] if both ID types are IP address and same */
-		if (_XIDT(iph2->id_p) == idi2type
-		 && spidx.dst.ss_family == spidx.src.ss_family) {
-			iph2->src_id = dupsaddr((struct sockaddr *)&spidx.dst);
-			if (iph2->src_id  == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "buffer allocation failed.\n");
-				return ISAKMP_INTERNAL_ERROR;
-			}
-			iph2->dst_id = dupsaddr((struct sockaddr *)&spidx.src);
-			if (iph2->dst_id  == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "buffer allocation failed.\n");
-				return ISAKMP_INTERNAL_ERROR;
-			}
-		}
-
-	} else {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"get a source address of SP index "
-			"from phase1 address "
-			"due to no ID payloads found "
-			"OR because ID type is not address.\n");
-
-		/* see above comment. */
-		memcpy(&spidx.src, iph2->dst, sysdep_sa_len(iph2->dst));
-		switch (spidx.src.ss_family) {
-		case AF_INET:
-			spidx.prefs = sizeof(struct in_addr) << 3;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			spidx.prefs = sizeof(struct in6_addr) << 3;
-			break;
-#endif
-		default:
-			spidx.prefs = 0;
-			break;
-		}
-	}
-
-#undef _XIDT
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"get a src address from ID payload "
-		"%s prefixlen=%u ul_proto=%u\n",
-		saddr2str((struct sockaddr *)&spidx.src),
-		spidx.prefs, spidx.ul_proto);
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"get dst address from ID payload "
-		"%s prefixlen=%u ul_proto=%u\n",
-		saddr2str((struct sockaddr *)&spidx.dst),
-		spidx.prefd, spidx.ul_proto);
-
-	/*
-	 * convert the ul_proto if it is 0
-	 * because 0 in ID payload means a wild card.
-	 */
-	if (spidx.ul_proto == 0)
-		spidx.ul_proto = IPSEC_ULPROTO_ANY;
-
-#ifdef HAVE_SECCTX
-	/*
-	 * Need to use security context in spidx to ensure the correct
-	 * policy is selected. The only way to get the security context
-	 * is to look into the proposal sent by peer ahead of time.
-	 */
-	if (get_security_context(iph2->sa, &spidx)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "error occurred trying to get security context.\n");
-		return ISAKMP_INTERNAL_ERROR;
-	}
-#endif /* HAVE_SECCTX */
-
-	/* get inbound policy */
-	sp_in = getsp_r(&spidx);
-	if (sp_in == NULL) {
-		if (iph2->ph1->rmconf->gen_policy) {
-			plog(LLV_INFO, LOCATION, NULL,
-				"no policy found, "
-				"try to generate the policy : %s\n",
-				spidx2str(&spidx));
-			iph2->spidx_gen = racoon_malloc(sizeof(spidx));
-			if (!iph2->spidx_gen) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"buffer allocation failed.\n");
-				return ISAKMP_INTERNAL_ERROR;
-			}
-			memcpy(iph2->spidx_gen, &spidx, sizeof(spidx));
-			return -2;	/* special value */
-		}
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no policy found: %s\n", spidx2str(&spidx));
-		return ISAKMP_INTERNAL_ERROR;
-	}
-	/* Refresh existing generated policies
-	 */
-	if (iph2->ph1->rmconf->gen_policy) {
-		plog(LLV_INFO, LOCATION, NULL,
-			 "Update the generated policy : %s\n",
-			 spidx2str(&spidx));
-		iph2->spidx_gen = racoon_malloc(sizeof(spidx));
-		if (!iph2->spidx_gen) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				 "buffer allocation failed.\n");
-			return ISAKMP_INTERNAL_ERROR;
-		}
-		memcpy(iph2->spidx_gen, &spidx, sizeof(spidx));
-	}
-
-	/* get outbound policy */
-    {
-	struct sockaddr_storage addr;
-	u_int8_t pref;
-
-	spidx.dir = IPSEC_DIR_OUTBOUND;
-	addr = spidx.src;
-	spidx.src = spidx.dst;
-	spidx.dst = addr;
-	pref = spidx.prefs;
-	spidx.prefs = spidx.prefd;
-	spidx.prefd = pref;
-
-	sp_out = getsp_r(&spidx);
-	if (!sp_out) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"no outbound policy found: %s\n",
-			spidx2str(&spidx));
-	}
-    }
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"suitable SP found:%s\n", spidx2str(&spidx));
-
-	/*
-	 * In the responder side, the inbound policy should be using IPsec.
-	 * outbound policy is not checked currently.
-	 */
-	if (sp_in->policy != IPSEC_POLICY_IPSEC) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"policy found, but no IPsec required: %s\n",
-			spidx2str(&spidx));
-		return ISAKMP_INTERNAL_ERROR;
-	}
-
-	/* set new proposal derived from a policy into the iph2->proposal. */
-	if (set_proposal_from_policy(iph2, sp_in, sp_out) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to create saprop.\n");
-		return ISAKMP_INTERNAL_ERROR;
-	}
-
-#ifdef HAVE_SECCTX
-	if (spidx.sec_ctx.ctx_str) {
-		set_secctx_in_proposal(iph2, spidx);
-	}
-#endif /* HAVE_SECCTX */
-
-	return 0;
-}
-
diff --git a/src/racoon/isakmp_quick.h b/src/racoon/isakmp_quick.h
deleted file mode 100644
index 71eeecf..0000000
--- a/src/racoon/isakmp_quick.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*	$NetBSD: isakmp_quick.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: isakmp_quick.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_QUICK_H
-#define _ISAKMP_QUICK_H
-
-extern int quick_i1prep __P((struct ph2handle *, vchar_t *));
-extern int quick_i1send __P((struct ph2handle *, vchar_t *));
-extern int quick_i2recv __P((struct ph2handle *, vchar_t *));
-extern int quick_i2send __P((struct ph2handle *, vchar_t *));
-extern int quick_i3recv __P((struct ph2handle *, vchar_t *));
-
-extern int quick_r1recv __P((struct ph2handle *, vchar_t *));
-extern int quick_r1prep __P((struct ph2handle *, vchar_t *));
-extern int quick_r2send __P((struct ph2handle *, vchar_t *));
-extern int quick_r3recv __P((struct ph2handle *, vchar_t *));
-extern int quick_r3send __P((struct ph2handle *, vchar_t *));
-extern int quick_r3prep __P((struct ph2handle *, vchar_t *));
-
-#endif /* _ISAKMP_QUICK_H */
diff --git a/src/racoon/isakmp_unity.c b/src/racoon/isakmp_unity.c
deleted file mode 100644
index 7a332e3..0000000
--- a/src/racoon/isakmp_unity.c
+++ /dev/null
@@ -1,411 +0,0 @@
-/*	$NetBSD: isakmp_unity.c,v 1.7 2006/10/09 06:17:20 manu Exp $	*/
-
-/* Id: isakmp_unity.c,v 1.10 2006/07/31 04:49:23 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <ctype.h>
-#include <resolv.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "handler.h"
-#include "isakmp_xauth.h"
-#include "isakmp_unity.h"
-#include "isakmp_cfg.h"
-#include "strnames.h"
-
-static vchar_t *isakmp_cfg_split(struct ph1handle *, 
-    struct isakmp_data *, struct unity_netentry*,int);
-
-vchar_t *
-isakmp_unity_req(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	int type;
-	vchar_t *reply_attr = NULL;
-
-	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Unity mode config request but the peer "
-		    "did not declare itself as  unity compliant\n");
-		return NULL;
-	}
-
-	type = ntohs(attr->type);
-
-	/* Handle short attributes */
-	if ((type & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
-		type &= ~ISAKMP_GEN_MASK;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "Short attribute %s = %d\n", 
-		     s_isakmp_cfg_type(type), ntohs(attr->lorv));
-
-		switch (type) {
-		default:
-			plog(LLV_DEBUG, LOCATION, NULL,
-			     "Ignored short attribute %s\n",
-			     s_isakmp_cfg_type(type));
-			break;
-		}
-
-		return reply_attr;
-	}
-
-	switch(type) {
-	case UNITY_BANNER: {
-#define MAXMOTD 65536
-		char buf[MAXMOTD + 1];
-		int fd;
-		char *filename = &isakmp_cfg_config.motd[0];
-		int len;
-
-		if ((fd = open(filename, O_RDONLY, 0)) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot open \"%s\"\n", filename);
-			return NULL;
-		}
-
-		if ((len = read(fd, buf, MAXMOTD)) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot read \"%s\"\n", filename);
-			close(fd);
-			return NULL;
-		}
-		close(fd);
-
-		buf[len] = '\0';
-		reply_attr = isakmp_cfg_string(iph1, attr, buf);
-
-		break;
-	}
-
-	case UNITY_PFS:
-		reply_attr = isakmp_cfg_short(iph1, attr, 
-		    isakmp_cfg_config.pfs_group);
-		break;
-
-	case UNITY_SAVE_PASSWD:
-		reply_attr = isakmp_cfg_short(iph1, attr, 
-		    isakmp_cfg_config.save_passwd);
-		break;
-
-	case UNITY_DDNS_HOSTNAME:
-		reply_attr = isakmp_cfg_copy(iph1, attr);
-		break;
-
-	case UNITY_DEF_DOMAIN:
-		reply_attr = isakmp_cfg_string(iph1, 
-		    attr, isakmp_cfg_config.default_domain);
-		break;
-
-	case UNITY_SPLIT_INCLUDE:
-		if(isakmp_cfg_config.splitnet_type == UNITY_SPLIT_INCLUDE)
-			reply_attr = isakmp_cfg_split(iph1, attr,
-			isakmp_cfg_config.splitnet_list,
-			isakmp_cfg_config.splitnet_count);
-		else
-			return NULL;
-		break;
-	case UNITY_LOCAL_LAN:
-		if(isakmp_cfg_config.splitnet_type == UNITY_LOCAL_LAN)
-			reply_attr = isakmp_cfg_split(iph1, attr,
-			isakmp_cfg_config.splitnet_list,
-			isakmp_cfg_config.splitnet_count);
-		else
-			return NULL;
-		break;
-	case UNITY_SPLITDNS_NAME:
-		reply_attr = isakmp_cfg_varlen(iph1, attr,
-				isakmp_cfg_config.splitdns_list,
-				isakmp_cfg_config.splitdns_len);
-		break;
-	case UNITY_FW_TYPE:
-	case UNITY_NATT_PORT:
-	case UNITY_BACKUP_SERVERS:
-	default:
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "Ignored attribute %s\n", s_isakmp_cfg_type(type));
-		return NULL;
-		break;
-	}
-
-	return reply_attr;
-}
-
-void
-isakmp_unity_reply(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	int type = ntohs(attr->type);
-	int alen = ntohs(attr->lorv);
-
-	struct unity_network *network = (struct unity_network *)(attr + 1);
-	int index = 0;
-	int count = 0;
-
-	switch(type) {
-	case UNITY_SPLIT_INCLUDE:
-	{
-		if (alen)
-			count = alen / sizeof(struct unity_network);
-
-		for(;index < count; index++)
-			splitnet_list_add(
-				&iph1->mode_cfg->split_include,
-				&network[index],
-				&iph1->mode_cfg->include_count);
-
-		iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_SPLIT_INCLUDE;
-		break;
-	}
-	case UNITY_LOCAL_LAN:
-	{
-		if (alen)
-			count = alen / sizeof(struct unity_network);
-
-		for(;index < count; index++)
-			splitnet_list_add(
-				&iph1->mode_cfg->split_local,
-				&network[index],
-				&iph1->mode_cfg->local_count);
-
-		iph1->mode_cfg->flags |= ISAKMP_CFG_GOT_SPLIT_LOCAL;
-		break;
-	}
-	case UNITY_SPLITDNS_NAME:
-	case UNITY_BANNER:
-	case UNITY_SAVE_PASSWD:
-	case UNITY_NATT_PORT:
-	case UNITY_PFS:
-	case UNITY_FW_TYPE:
-	case UNITY_BACKUP_SERVERS:
-	case UNITY_DDNS_HOSTNAME:
-	default:
-		plog(LLV_WARNING, LOCATION, NULL,
-		     "Ignored attribute %s\n",
-		     s_isakmp_cfg_type(type));
-		break;
-	}
-	return;
-}
-
-static vchar_t *
-isakmp_cfg_split(iph1, attr, netentry, count)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	struct unity_netentry *netentry;
-	int count;
-{
-	vchar_t *buffer;
-	struct isakmp_data *new;
-	struct unity_network * network;
-	size_t len;
-	int index = 0;
-
-	char tmp1[40];
-	char tmp2[40];
-
-	len = sizeof(struct unity_network) * count;
-	if ((buffer = vmalloc(sizeof(*attr) + len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	new = (struct isakmp_data *)buffer->v;
-	new->type = attr->type;
-	new->lorv = htons(len);
-
-	network = (struct unity_network *)(new + 1);
-	for (; index < count; index++) {
-
-		memcpy(&network[index],
-			&netentry->network,
-			sizeof(struct unity_network));
-
-		inet_ntop(AF_INET, &netentry->network.addr4, tmp1, 40);
-		inet_ntop(AF_INET, &netentry->network.mask4, tmp2, 40);
-		plog(LLV_DEBUG, LOCATION, NULL, "splitnet: %s/%s\n", tmp1, tmp2);
-
-		netentry = netentry->next;
-	}
-
-	return buffer;
-}
-
-int  splitnet_list_add(list, network, count)
-	struct unity_netentry ** list;
-	struct unity_network * network;
-	int *count;
-{
-	struct unity_netentry * newentry;
-
-	/*
-	 * allocate new netentry and copy
-         * new splitnet network data
-	 */
-	newentry = (struct unity_netentry *)
-		racoon_malloc(sizeof(struct unity_netentry));
-	if (newentry == NULL)
-		return -1;
-
-	memcpy(&newentry->network,network,
-		sizeof(struct unity_network));
-	newentry->next = NULL;
-
-	/*
-	 * locate the last netentry in our
-	 * splitnet list and add our entry
-	 */
-	if (*list == NULL)
-		*list = newentry;
-	else {
-		struct unity_netentry * tmpentry = *list;
-		while (tmpentry->next != NULL)
-			tmpentry = tmpentry->next;
-		tmpentry->next = newentry;
-	}
-
-	(*count)++;
-
-	return 0;
-}
-
-void splitnet_list_free(list, count)
-	struct unity_netentry * list;
-	int *count;
-{
-	struct unity_netentry * netentry = list;
-	struct unity_netentry * delentry;
-
-	*count = 0;
-
-	while (netentry != NULL) {
-		delentry = netentry;
-		netentry = netentry->next;
-		racoon_free(delentry);
-	}
-}
-
-char * splitnet_list_2str(list, splitnet_ipaddr)
-	struct unity_netentry * list;
-	enum splinet_ipaddr splitnet_ipaddr;
-{
-	struct unity_netentry * netentry;
-	char tmp1[40];
-	char tmp2[40];
-	char * str;
-	int len;
-
-	/* determine string length */
-	len = 1;
-	netentry = list;
-	while (netentry != NULL) {
-
-		inet_ntop(AF_INET, &netentry->network.addr4, tmp1, 40);
-		inet_ntop(AF_INET, &netentry->network.mask4, tmp2, 40);
-		len += strlen(tmp1);
-		len += strlen(tmp2);
-		len += 2;
-
-		netentry = netentry->next;
-	}
-
-	/* allocate network list string */
-	str = racoon_malloc(len);
-	if (str == NULL)
-		return NULL;
-
-	/* create network list string */
-	len = 0;
-	netentry = list;
-	while (netentry != NULL) {
-
-		inet_ntop(AF_INET, &netentry->network.addr4, tmp1, 40);
-		inet_ntop(AF_INET, &netentry->network.mask4, tmp2, 40);
-		if (splitnet_ipaddr == CIDR) {
-			uint32_t tmp3;
-			int cidrmask;
-
-			tmp3 = ntohl(netentry->network.mask4.s_addr);
-			for (cidrmask = 0; tmp3 != 0; cidrmask++)
-				tmp3 <<= 1;
-			len += sprintf(str+len, "%s/%d ", tmp1, cidrmask);
-		} else {
-			len += sprintf(str+len, "%s/%s ", tmp1, tmp2);
-		}
-
-		netentry = netentry->next;
-	}
-
-	str[len]=0;
-
-	return str;
-}
diff --git a/src/racoon/isakmp_unity.h b/src/racoon/isakmp_unity.h
deleted file mode 100644
index f564197..0000000
--- a/src/racoon/isakmp_unity.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*	$NetBSD: isakmp_unity.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME$ */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-enum splinet_ipaddr { NETMASK, CIDR };
-
-/* ISAKMP notifies specific to the Unity vendor Id */
-/* Sent during xauth if the user types his password too slowly */
-#define ISAKMP_NTYPE_UNITY_HEARTBEAT	40500
-
-/* ISAKMP mode config attributes specific to the Unity vendor Id */
-#define UNITY_BANNER		28672
-#define UNITY_SAVE_PASSWD	28673
-#define UNITY_DEF_DOMAIN	28674
-#define UNITY_SPLITDNS_NAME	28675
-#define UNITY_SPLIT_INCLUDE	28676
-#define UNITY_NATT_PORT		28677
-#define UNITY_LOCAL_LAN		28678
-#define UNITY_PFS		28679
-#define UNITY_FW_TYPE		28680
-#define UNITY_BACKUP_SERVERS	28681
-#define UNITY_DDNS_HOSTNAME	28682
-
-/*
- * Unity adress/mask lists
- * XXX : the padding is probably there for something !
- */
-        
-struct unity_network {
-	struct in_addr addr4;
-	struct in_addr mask4;
-	char padding[6];
-} __attribute__((__packed__));
-        
-struct unity_netentry {
-	struct unity_network    network;       
-	struct unity_netentry   *next;
-};
-
-int	splitnet_list_add(struct unity_netentry **, struct unity_network *, int *);
-void	splitnet_list_free(struct unity_netentry *, int *);
-char *	splitnet_list_2str(struct unity_netentry *, enum splinet_ipaddr);
-
-vchar_t *isakmp_unity_req(struct ph1handle *, struct isakmp_data *);
-void isakmp_unity_reply(struct ph1handle *, struct isakmp_data *);
diff --git a/src/racoon/isakmp_var.h b/src/racoon/isakmp_var.h
deleted file mode 100644
index f4ef45d..0000000
--- a/src/racoon/isakmp_var.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*	$NetBSD: isakmp_var.h,v 1.6.6.1 2007/02/20 09:08:49 vanhu Exp $	*/
-
-/* Id: isakmp_var.h,v 1.12 2005/05/07 14:45:31 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_VAR_H
-#define _ISAKMP_VAR_H
-
-#include "vmbuf.h"
-
-#define PORT_ISAKMP 500
-#define PORT_ISAKMP_NATT 4500
-
-#define DEFAULT_NONCE_SIZE	16
-
-typedef u_char cookie_t[8];
-typedef u_char msgid_t[4];
-
-typedef struct { /* i_cookie + r_cookie */
-	cookie_t i_ck;
-	cookie_t r_ck;
-} isakmp_index;
-
-struct isakmp_gen;
-struct sched;
-
-struct sockaddr;
-struct ph1handle;
-struct ph2handle;
-struct remoteconf;
-struct isakmp_gen;
-struct ipsecdoi_pl_id;	/* XXX */
-struct isakmp_pl_ke;	/* XXX */
-struct isakmp_pl_nonce;	/* XXX */
-
-extern int isakmp_handler __P((int));
-extern int isakmp_ph1begin_i __P((struct remoteconf *, struct sockaddr *,
-	struct sockaddr *));
-
-extern vchar_t *isakmp_parsewoh __P((int, struct isakmp_gen *, int));
-extern vchar_t *isakmp_parse __P((vchar_t *));
-
-extern int isakmp_init __P((void));
-extern const char *isakmp_pindex __P((const isakmp_index *, const u_int32_t));
-extern int isakmp_open __P((void));
-extern void isakmp_close __P((void));
-extern int isakmp_send __P((struct ph1handle *, vchar_t *));
-
-extern void isakmp_ph1resend_stub __P((void *));
-extern int isakmp_ph1resend __P((struct ph1handle *));
-extern void isakmp_ph2resend_stub __P((void *));
-extern int isakmp_ph2resend __P((struct ph2handle *));
-extern void isakmp_ph1expire_stub __P((void *));
-extern void isakmp_ph1expire __P((struct ph1handle *));
-extern void isakmp_ph1delete_stub __P((void *));
-extern void isakmp_ph1delete __P((struct ph1handle *));
-extern void isakmp_ph2expire_stub __P((void *));
-extern void isakmp_ph2expire __P((struct ph2handle *));
-extern void isakmp_ph2delete_stub __P((void *));
-extern void isakmp_ph2delete __P((struct ph2handle *));
-
-extern int isakmp_post_acquire __P((struct ph2handle *));
-extern int isakmp_post_getspi __P((struct ph2handle *));
-extern void isakmp_chkph1there_stub __P((void *));
-extern void isakmp_chkph1there __P((struct ph2handle *));
-
-extern caddr_t isakmp_set_attr_v __P((caddr_t, int, caddr_t, int));
-extern caddr_t isakmp_set_attr_l __P((caddr_t, int, u_int32_t));
-extern vchar_t *isakmp_add_attr_v __P((vchar_t *, int, caddr_t, int));
-extern vchar_t *isakmp_add_attr_l __P((vchar_t *, int, u_int32_t));
-
-extern int isakmp_newcookie __P((caddr_t, struct sockaddr *, struct sockaddr *));
-
-extern int isakmp_p2ph __P((vchar_t **, struct isakmp_gen *));
-
-extern u_int32_t isakmp_newmsgid2 __P((struct ph1handle *));
-extern caddr_t set_isakmp_header1 __P((vchar_t *, struct ph1handle *, int));
-extern caddr_t set_isakmp_header2 __P((vchar_t *, struct ph2handle *, int));
-extern caddr_t set_isakmp_payload __P((caddr_t, vchar_t *, int));
-
-extern struct payload_list *isakmp_plist_append __P((struct payload_list *plist, 
-	vchar_t *payload, int payload_type));
-extern vchar_t *isakmp_plist_set_all __P((struct payload_list **plist,
-	struct ph1handle *iph1));
-
-#ifdef HAVE_PRINT_ISAKMP_C
-extern void isakmp_printpacket __P((vchar_t *, struct sockaddr *,
-	struct sockaddr *, int));
-#endif
-
-extern int copy_ph1addresses __P(( struct ph1handle *,
-	struct remoteconf *, struct sockaddr *, struct sockaddr *));
-extern void log_ph1established __P((const struct ph1handle *));
-
-extern void script_hook __P((struct ph1handle *, int)); 
-extern int script_env_append __P((char ***, int *, char *, char *));
-extern int script_exec __P((char *, int, char * const *));
-
-void purge_remote __P((struct ph1handle *));
-void delete_spd __P((struct ph2handle *, u_int64_t));
-#ifdef INET6
-u_int32_t setscopeid __P((struct sockaddr *, struct sockaddr *));
-#endif
-#endif /* _ISAKMP_VAR_H */
diff --git a/src/racoon/isakmp_xauth.c b/src/racoon/isakmp_xauth.c
deleted file mode 100644
index 3f62587..0000000
--- a/src/racoon/isakmp_xauth.c
+++ /dev/null
@@ -1,1704 +0,0 @@
-/*	$NetBSD: isakmp_xauth.c,v 1.11.6.2 2009/04/20 13:35:36 tteras Exp $	*/
-
-/* Id: isakmp_xauth.c,v 1.38 2006/08/22 18:17:17 manubsd Exp */
-
-/*
- * Copyright (C) 2004-2005 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <pwd.h>
-#include <grp.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <ctype.h>
-#include <resolv.h>
-
-#ifdef HAVE_SHADOW_H
-#include <shadow.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "schedule.h"
-#include "debug.h"
-
-#include "crypto_openssl.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "admin.h"
-#include "privsep.h"
-#include "evt.h"
-#include "handler.h"
-#include "throttle.h"
-#include "remoteconf.h"
-#include "isakmp_inf.h"
-#include "isakmp_xauth.h"
-#include "isakmp_unity.h"
-#include "isakmp_cfg.h"
-#include "strnames.h"
-#include "ipsec_doi.h"
-#include "remoteconf.h"
-#include "localconf.h"
-
-#ifdef HAVE_LIBRADIUS
-#include <radlib.h>
-
-struct rad_handle *radius_auth_state = NULL;
-struct rad_handle *radius_acct_state = NULL;
-#endif
-
-#ifdef HAVE_LIBPAM
-#include <security/pam_appl.h>
-
-static char *PAM_usr = NULL;
-static char *PAM_pwd = NULL;
-static int PAM_conv(int, const struct pam_message **, 
-    struct pam_response **, void *);
-static struct pam_conv PAM_chat = { &PAM_conv, NULL };
-#endif
-
-#ifdef HAVE_LIBLDAP
-#include "ldap.h"
-#include <arpa/inet.h>
-struct xauth_ldap_config xauth_ldap_config;
-#endif
-
-void 
-xauth_sendreq(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buffer;
-	struct isakmp_pl_attr *attr;
-	struct isakmp_data *typeattr;
-	struct isakmp_data *usrattr;
-	struct isakmp_data *pwdattr;
-	struct xauth_state *xst = &iph1->mode_cfg->xauth;
-	size_t tlen;
-
-	/* Status checks */
-	if (iph1->status != PHASE1ST_ESTABLISHED) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth request while phase 1 is not completed\n");
-		return;
-	}
-
-	if (xst->status != XAUTHST_NOTYET) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth request whith Xauth state %d\n", xst->status);
-		return;
-	}
-
-	plog(LLV_INFO, LOCATION, NULL, "Sending Xauth request\n");
-
-	tlen = sizeof(*attr) +
-	       + sizeof(*typeattr) +
-	       + sizeof(*usrattr) +
-	       + sizeof(*pwdattr);
-	
-	if ((buffer = vmalloc(tlen)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate buffer\n");
-		return;
-	}
-	
-	attr = (struct isakmp_pl_attr *)buffer->v;
-	memset(attr, 0, tlen);
-
-	attr->h.len = htons(tlen);
-	attr->type = ISAKMP_CFG_REQUEST;
-	attr->id = htons(eay_random());
-
-	typeattr = (struct isakmp_data *)(attr + 1);
-	typeattr->type = htons(XAUTH_TYPE | ISAKMP_GEN_TV);
-	typeattr->lorv = htons(XAUTH_TYPE_GENERIC);
-
-	usrattr = (struct isakmp_data *)(typeattr + 1);
-	usrattr->type = htons(XAUTH_USER_NAME | ISAKMP_GEN_TLV);
-	usrattr->lorv = htons(0);
-
-	pwdattr = (struct isakmp_data *)(usrattr + 1);
-	pwdattr->type = htons(XAUTH_USER_PASSWORD | ISAKMP_GEN_TLV);
-	pwdattr->lorv = htons(0);
-
-	isakmp_cfg_send(iph1, buffer, 
-	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1);
-	
-	vfree(buffer);
-
-	xst->status = XAUTHST_REQSENT;
-
-	return;
-}
-
-int
-xauth_attr_reply(iph1, attr, id)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-	int id;
-{
-	char **outlet = NULL;
-	size_t alen = 0;
-	int type;
-	struct xauth_state *xst = &iph1->mode_cfg->xauth;
-
-	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth reply but peer did not declare "
-		    "itself as Xauth capable\n");
-		return -1;
-	}
-
-	if (xst->status != XAUTHST_REQSENT) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth reply while Xauth state is %d\n", xst->status);
-		return -1;
-	}
-
-	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
-	switch (type) {
-	case XAUTH_TYPE:
-		switch (ntohs(attr->lorv)) {
-		case XAUTH_TYPE_GENERIC:
-			xst->authtype = XAUTH_TYPE_GENERIC;
-			break;
-		default:
-			plog(LLV_WARNING, LOCATION, NULL, 
-			    "Unexpected authentication type %d\n", 
-			    ntohs(type));
-			return -1;
-		}
-		break;
-
-	case XAUTH_USER_NAME:
-		outlet = &xst->authdata.generic.usr;
-		break;
-
-	case XAUTH_USER_PASSWORD:
-		outlet = &xst->authdata.generic.pwd; 
-		break;
-
-	default:
-		plog(LLV_WARNING, LOCATION, NULL, 
-		    "ignored Xauth attribute %d\n", type);
-		break;
-	}
-
-	if (outlet != NULL) {
-		alen = ntohs(attr->lorv);
-
-		if ((*outlet = racoon_malloc(alen + 1)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot allocate memory for Xauth Data\n");
-			return -1;
-		}
-
-		memcpy(*outlet, attr + 1, alen);
-		(*outlet)[alen] = '\0';
-		outlet = NULL;
-	}
-
-	
-	if ((xst->authdata.generic.usr != NULL) &&
-	   (xst->authdata.generic.pwd != NULL)) {
-		int port;
-		int res;
-		char *usr = xst->authdata.generic.usr;
-		char *pwd = xst->authdata.generic.pwd;
-		time_t throttle_delay = 0;
-
-#if 0	/* Real debug, don't do that at home */
-		plog(LLV_DEBUG, LOCATION, NULL, 
-		    "Got username \"%s\", password \"%s\"\n", usr, pwd);
-#endif
-		strncpy(iph1->mode_cfg->login, usr, LOGINLEN);
-		iph1->mode_cfg->login[LOGINLEN] = '\0';
-
-		res = -1;
-		if ((port = isakmp_cfg_getport(iph1)) == -1) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Port pool depleted\n");
-			goto skip_auth;
-		}	
-
-		switch (isakmp_cfg_config.authsource) {
-		case ISAKMP_CFG_AUTH_SYSTEM:
-			res = privsep_xauth_login_system(usr, pwd);
-			break;
-#ifdef HAVE_LIBRADIUS
-		case ISAKMP_CFG_AUTH_RADIUS:
-			res = xauth_login_radius(iph1, usr, pwd);
-			break;
-#endif
-#ifdef HAVE_LIBPAM
-		case ISAKMP_CFG_AUTH_PAM:
-			res = privsep_xauth_login_pam(iph1->mode_cfg->port, 
-			    iph1->remote, usr, pwd);
-			break;
-#endif
-#ifdef HAVE_LIBLDAP
-		case ISAKMP_CFG_AUTH_LDAP:
-			res = xauth_login_ldap(iph1, usr, pwd);
-			break;
-#endif
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unexpected authentication source\n");
-			res = -1;
-			break;
-		}
-
-		/*
-		 * Optional group authentication
-		 */
-		if (!res && (isakmp_cfg_config.groupcount))
-			res = group_check(iph1,
-				isakmp_cfg_config.grouplist,
-				isakmp_cfg_config.groupcount);
-
-		/*
-		 * On failure, throttle the connexion for the remote host
-		 * in order to make password attacks more difficult.
-		 */
-		throttle_delay = throttle_host(iph1->remote, res) - time(NULL);
-		if (throttle_delay > 0) {
-			char *str;
-
-			str = saddrwop2str(iph1->remote);
-
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Throttling in action for %s: delay %lds\n",
-			    str, (unsigned long)throttle_delay);
-			res = -1;
-		} else {
-			throttle_delay = 0;
-		}
-
-skip_auth:
-		if (throttle_delay != 0) {
-			struct xauth_reply_arg *xra;
-
-			if ((xra = racoon_malloc(sizeof(*xra))) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "malloc failed, bypass throttling\n");
-				return xauth_reply(iph1, port, id, res);
-			}
-
-			/*
-			 * We need to store the ph1, but it might have
-			 * disapeared when xauth_reply is called, so
-			 * store the index instead.
-			 */
-			xra->index = iph1->index;
-			xra->port = port;
-			xra->id = id;
-			xra->res = res;
-			sched_new(throttle_delay, xauth_reply_stub, xra);
-		} else {
-			return xauth_reply(iph1, port, id, res);
-		}
-	}
-
-	return 0;
-}
-
-void 
-xauth_reply_stub(args)
-	void *args;
-{
-	struct xauth_reply_arg *xra = (struct xauth_reply_arg *)args;
-	struct ph1handle *iph1;
-
-	if ((iph1 = getph1byindex(&xra->index)) != NULL)
-		(void)xauth_reply(iph1, xra->port, xra->id, xra->res);
-	else
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Delayed Xauth reply: phase 1 no longer exists.\n"); 
-
-	racoon_free(xra);
-	return;
-}
-
-int
-xauth_reply(iph1, port, id, res)
-	struct ph1handle *iph1;
-	int port;
-	int id;
-#if defined(ANDROID_CHANGES)
-	int res;
-#endif
-{
-	struct xauth_state *xst = &iph1->mode_cfg->xauth;
-	char *usr = xst->authdata.generic.usr;
-
-	if (res != 0) {
-		if (port != -1)
-			isakmp_cfg_putport(iph1, port);
-
-		plog(LLV_INFO, LOCATION, NULL, 
-		    "login failed for user \"%s\"\n", usr);
-		
-		xauth_sendstatus(iph1, XAUTH_STATUS_FAIL, id);
-		xst->status = XAUTHST_NOTYET;
-
-		/* Delete Phase 1 SA */
-		if (iph1->status == PHASE1ST_ESTABLISHED)
-			isakmp_info_send_d1(iph1);
-		remph1(iph1);
-		delph1(iph1);
-
-		return -1;
-	}
-
-	xst->status = XAUTHST_OK;
-	plog(LLV_INFO, LOCATION, NULL, 
-	    "login succeeded for user \"%s\"\n", usr);
-
-	xauth_sendstatus(iph1, XAUTH_STATUS_OK, id);
-
-	return 0;
-}
-
-void
-xauth_sendstatus(iph1, status, id)
-	struct ph1handle *iph1;
-	int status;
-	int id;
-{
-	vchar_t *buffer;
-	struct isakmp_pl_attr *attr;
-	struct isakmp_data *stattr;
-	size_t tlen;
-
-	tlen = sizeof(*attr) +
-	       + sizeof(*stattr); 
-	
-	if ((buffer = vmalloc(tlen)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate buffer\n");
-		return;
-	}
-	
-	attr = (struct isakmp_pl_attr *)buffer->v;
-	memset(attr, 0, tlen);
-
-	attr->h.len = htons(tlen);
-	attr->type = ISAKMP_CFG_SET;
-	attr->id = htons(id);
-
-	stattr = (struct isakmp_data *)(attr + 1);
-	stattr->type = htons(XAUTH_STATUS | ISAKMP_GEN_TV);
-	stattr->lorv = htons(status);
-
-	isakmp_cfg_send(iph1, buffer, 
-	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1);
-	
-	vfree(buffer);
-
-	return;	
-}
-
-#ifdef HAVE_LIBRADIUS
-int
-xauth_radius_init(void)
-{
-	/* For first time use, initialize Radius */
-	if ((isakmp_cfg_config.authsource == ISAKMP_CFG_AUTH_RADIUS) &&
-	    (radius_auth_state == NULL)) {
-		if ((radius_auth_state = rad_auth_open()) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot init libradius\n");
-			return -1;
-		}
-
-		if (rad_config(radius_auth_state, NULL) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot open librarius config file: %s\n", 
-			    rad_strerror(radius_auth_state));
-			rad_close(radius_auth_state);
-			radius_auth_state = NULL;
-			return -1;
-		}
-	}
-
-	if ((isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_RADIUS) &&
-	    (radius_acct_state == NULL)) {
-		if ((radius_acct_state = rad_acct_open()) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot init libradius\n");
-			return -1;
-		}
-
-		if (rad_config(radius_acct_state, NULL) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot open librarius config file: %s\n", 
-			    rad_strerror(radius_acct_state));
-			rad_close(radius_acct_state);
-			radius_acct_state = NULL;
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-int
-xauth_login_radius(iph1, usr, pwd)
-	struct ph1handle *iph1;
-	char *usr;
-	char *pwd;
-{
-	int res;
-	const void *data;
-	size_t len;
-	int type;
-
-	if (rad_create_request(radius_auth_state, RAD_ACCESS_REQUEST) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "rad_create_request failed: %s\n", 
-		    rad_strerror(radius_auth_state));
-		return -1;
-	}
-	
-	if (rad_put_string(radius_auth_state, RAD_USER_NAME, usr) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "rad_put_string failed: %s\n", 
-		    rad_strerror(radius_auth_state));
-		return -1;
-	}
-
-	if (rad_put_string(radius_auth_state, RAD_USER_PASSWORD, pwd) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "rad_put_string failed: %s\n", 
-		    rad_strerror(radius_auth_state));
-		return -1;
-	}
-
-	if (isakmp_cfg_radius_common(radius_auth_state, iph1->mode_cfg->port) != 0)
-		return -1;
-
-	switch (res = rad_send_request(radius_auth_state)) {
-	case RAD_ACCESS_ACCEPT:
-		while ((type = rad_get_attr(radius_auth_state, &data, &len)) != 0) {
-			switch (type) {
-			case RAD_FRAMED_IP_ADDRESS:
-				iph1->mode_cfg->addr4 = rad_cvt_addr(data);
-				iph1->mode_cfg->flags 
-				    |= ISAKMP_CFG_ADDR4_EXTERN;
-				break;
-
-			case RAD_FRAMED_IP_NETMASK:
-				iph1->mode_cfg->mask4 = rad_cvt_addr(data);
-				iph1->mode_cfg->flags 
-				    |= ISAKMP_CFG_MASK4_EXTERN;
-				break;
-
-			default:
-				plog(LLV_INFO, LOCATION, NULL,
-				    "Unexpected attribute: %d\n", type);
-				break;
-			}
-		}
-
-		return 0;
-		break;
-
-	case RAD_ACCESS_REJECT:
-		return -1;
-		break;
-
-	case -1:
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "rad_send_request failed: %s\n", 
-		    rad_strerror(radius_auth_state));
-		return -1;
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "rad_send_request returned %d\n", res);
-		return -1;
-		break;
-	}
-
-	return -1;
-}
-#endif
-
-#ifdef HAVE_LIBPAM
-static int 
-PAM_conv(msg_count, msg, rsp, dontcare)
-	int msg_count;
-	const struct pam_message **msg;
-	struct pam_response **rsp;
-	void *dontcare;
-{
-	int i;
-	int replies = 0;
-	struct pam_response *reply = NULL;
-
-	if ((reply = racoon_malloc(sizeof(*reply) * msg_count)) == NULL) 
-		return PAM_CONV_ERR;
-	bzero(reply, sizeof(*reply) * msg_count);
-
-	for (i = 0; i < msg_count; i++) {
-		switch (msg[i]->msg_style) {
-		case PAM_PROMPT_ECHO_ON:
-			/* Send the username, libpam frees resp */
-			reply[i].resp_retcode = PAM_SUCCESS;
-			if ((reply[i].resp = strdup(PAM_usr)) == NULL) {
-				plog(LLV_ERROR, LOCATION, 
-				    NULL, "strdup failed\n");
-				exit(1);
-			}
-			break;
-
-		case PAM_PROMPT_ECHO_OFF:
-			/* Send the password, libpam frees resp */
-			reply[i].resp_retcode = PAM_SUCCESS;
-			if ((reply[i].resp = strdup(PAM_pwd)) == NULL) {
-				plog(LLV_ERROR, LOCATION, 
-				    NULL, "strdup failed\n");
-				exit(1);
-			}
-			break;
-
-		case PAM_TEXT_INFO:
-		case PAM_ERROR_MSG:
-			reply[i].resp_retcode = PAM_SUCCESS;
-			reply[i].resp = NULL;
-			break;
-
-		default:
-			if (reply != NULL)
-				racoon_free(reply);
-			return PAM_CONV_ERR;
-			break;
-		}
-	}
-
-	if (reply != NULL)
-		*rsp = reply;
-
-	return PAM_SUCCESS;
-}
-
-int
-xauth_login_pam(port, raddr, usr, pwd)
-	int port;
-	struct sockaddr *raddr;
-	char *usr;
-	char *pwd;
-{
-	int error;
-	int res;
-	const void *data;
-	size_t len;
-	int type;
-	char *remote = NULL;
-	pam_handle_t *pam = NULL;
-
-	if (isakmp_cfg_config.port_pool == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "isakmp_cfg_config.port_pool == NULL\n");
-		return -1;
-	}
-
-	if ((error = pam_start("racoon", usr, 
-	    &PAM_chat, &isakmp_cfg_config.port_pool[port].pam)) != 0) {
-		if (isakmp_cfg_config.port_pool[port].pam == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, "pam_start failed\n");
-			return -1;
-		} else {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "pam_start failed: %s\n", 
-			    pam_strerror(isakmp_cfg_config.port_pool[port].pam,
-			    error));
-			goto out;
-		}
-	}
-	pam = isakmp_cfg_config.port_pool[port].pam;
-
-	if ((remote = strdup(saddrwop2str(raddr))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "cannot allocate memory: %s\n", strerror(errno)); 
-		goto out;
-	}
-	
-	if ((error = pam_set_item(pam, PAM_RHOST, remote)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "pam_set_item failed: %s\n", 
-		    pam_strerror(pam, error));
-		goto out;
-	}
-
-	PAM_usr = usr;
-	PAM_pwd = pwd;
-	error = pam_authenticate(pam, 0);
-	PAM_usr = NULL;
-	PAM_pwd = NULL;
-	if (error != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "pam_authenticate failed: %s\n", 
-		    pam_strerror(pam, error));
-		goto out;
-	}
-
-	if ((error = pam_acct_mgmt(pam, 0)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "pam_acct_mgmt failed: %s\n", 
-		    pam_strerror(pam, error));
-		goto out;
-	}
-
-	if ((error = pam_setcred(pam, 0)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "pam_setcred failed: %s\n", 
-		    pam_strerror(pam, error));
-		goto out;
-	}
-
-	if (remote != NULL)
-		free(remote);
-
-	return 0;
-
-out:
-	pam_end(pam, error);
-	isakmp_cfg_config.port_pool[port].pam = NULL;
-	if (remote != NULL)
-		free(remote);
-	return -1;
-}
-#endif
-
-#ifdef HAVE_LIBLDAP
-int 
-xauth_ldap_init(void)
-{
-	int tmplen;
-	int error = -1;
-
-	xauth_ldap_config.pver = 3;
-	xauth_ldap_config.host = NULL;
-	xauth_ldap_config.port = LDAP_PORT;
-	xauth_ldap_config.base = NULL;
-	xauth_ldap_config.subtree = 0;
-	xauth_ldap_config.bind_dn = NULL;
-	xauth_ldap_config.bind_pw = NULL;
-	xauth_ldap_config.auth_type = LDAP_AUTH_SIMPLE;
-	xauth_ldap_config.attr_user = NULL;
-	xauth_ldap_config.attr_addr = NULL;
-	xauth_ldap_config.attr_mask = NULL;
-	xauth_ldap_config.attr_group = NULL;
-	xauth_ldap_config.attr_member = NULL;
-
-	/* set default host */
-	tmplen = strlen(LDAP_DFLT_HOST);
-	xauth_ldap_config.host = vmalloc(tmplen);
-	if (xauth_ldap_config.host == NULL)
-		goto out;
-	memcpy(xauth_ldap_config.host->v, LDAP_DFLT_HOST, tmplen);
-
-	/* set default user naming attribute */
-	tmplen = strlen(LDAP_DFLT_USER);
-	xauth_ldap_config.attr_user = vmalloc(tmplen);
-	if (xauth_ldap_config.attr_user == NULL)
-		goto out;	
-	memcpy(xauth_ldap_config.attr_user->v, LDAP_DFLT_USER, tmplen);
-
-	/* set default address attribute */
-	tmplen = strlen(LDAP_DFLT_ADDR);
-	xauth_ldap_config.attr_addr = vmalloc(tmplen);
-	if (xauth_ldap_config.attr_addr == NULL)
-		goto out;
-	memcpy(xauth_ldap_config.attr_addr->v, LDAP_DFLT_ADDR, tmplen);
-
-	/* set default netmask attribute */
-	tmplen = strlen(LDAP_DFLT_MASK);
-	xauth_ldap_config.attr_mask = vmalloc(tmplen);
-	if (xauth_ldap_config.attr_mask == NULL)
-		goto out;
-	memcpy(xauth_ldap_config.attr_mask->v, LDAP_DFLT_MASK, tmplen);
-
-	/* set default group naming attribute */
-	tmplen = strlen(LDAP_DFLT_GROUP);
-	xauth_ldap_config.attr_group = vmalloc(tmplen);
-	if (xauth_ldap_config.attr_group == NULL)
-		goto out;
-	memcpy(xauth_ldap_config.attr_group->v, LDAP_DFLT_GROUP, tmplen);
-
-	/* set default member attribute */
-	tmplen = strlen(LDAP_DFLT_MEMBER);
-	xauth_ldap_config.attr_member = vmalloc(tmplen);
-	if (xauth_ldap_config.attr_member == NULL)
-		goto out;
-	memcpy(xauth_ldap_config.attr_member->v, LDAP_DFLT_MEMBER, tmplen);
-
-	error = 0;
-out:
-	if (error != 0)
-		plog(LLV_ERROR, LOCATION, NULL, "cannot allocate memory\n");
-
-	return error;
-}
-
-int
-xauth_login_ldap(iph1, usr, pwd)
-	struct ph1handle *iph1;
-	char *usr;
-	char *pwd;
-{
-	int rtn = -1;
-	int res = -1;
-	LDAP *ld = NULL;
-	LDAPMessage *lr = NULL;
-	LDAPMessage *le = NULL;
-	struct berval cred;
-	struct berval **bv = NULL;
-	struct timeval timeout;
-	char *init = NULL;
-	char *filter = NULL;
-	char *atlist[3];
-	char *basedn = NULL;
-	char *userdn = NULL;
-	int tmplen = 0;
-	int ecount = 0;
-	int scope = LDAP_SCOPE_ONE;
-
-	atlist[0] = NULL;
-	atlist[1] = NULL;
-	atlist[2] = NULL;
-
-	/* build our initialization url */
-	tmplen = strlen("ldap://:") + 17;
-	tmplen += strlen(xauth_ldap_config.host->v);
-	init = racoon_malloc(tmplen);
-	if (init == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unable to alloc ldap init url\n");
-		goto ldap_end;
-	}
-	sprintf(init,"ldap://%s:%d",
-		xauth_ldap_config.host->v,
-		xauth_ldap_config.port );
-
-	/* initialize the ldap handle */
-	res = ldap_initialize(&ld, init);
-	if (res != LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_initialize failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_end;
-	}
-
-	/* initialize the protocol version */
-	ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,
-		&xauth_ldap_config.pver);
-
-	/*
-	 * attempt to bind to the ldap server.
-         * default to anonymous bind unless a
-	 * user dn and password has been
-	 * specified in our configuration
-         */
-	if ((xauth_ldap_config.bind_dn != NULL)&&
-	    (xauth_ldap_config.bind_pw != NULL))
-	{
-		cred.bv_val = xauth_ldap_config.bind_pw->v;
-		cred.bv_len = strlen( cred.bv_val );
-		res = ldap_sasl_bind_s(ld,
-			xauth_ldap_config.bind_dn->v, NULL, &cred,
-			NULL, NULL, NULL);
-	}
-	else
-	{
-		res = ldap_sasl_bind_s(ld,
-			NULL, NULL, NULL,
-			NULL, NULL, NULL);
-	}
-	
-	if (res!=LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_sasl_bind_s (search) failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_end;
-	}
-
-	/* build an ldap user search filter */
-	tmplen = strlen(xauth_ldap_config.attr_user->v);
-	tmplen += 1;
-	tmplen += strlen(usr);
-	tmplen += 1;
-	filter = racoon_malloc(tmplen);
-	if (filter == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unable to alloc ldap search filter buffer\n");
-		goto ldap_end;
-	}
-	sprintf(filter, "%s=%s",
-		xauth_ldap_config.attr_user->v, usr);
-
-	/* build our return attribute list */
-	tmplen = strlen(xauth_ldap_config.attr_addr->v) + 1;
-	atlist[0] = racoon_malloc(tmplen);
-	tmplen = strlen(xauth_ldap_config.attr_mask->v) + 1;
-	atlist[1] = racoon_malloc(tmplen);
-	if ((atlist[0] == NULL)||(atlist[1] == NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unable to alloc ldap attrib list buffer\n");
-		goto ldap_end;
-	}
-	strcpy(atlist[0],xauth_ldap_config.attr_addr->v);
-	strcpy(atlist[1],xauth_ldap_config.attr_mask->v);
-
-	/* attempt to locate the user dn */
-	if (xauth_ldap_config.base != NULL)
-		basedn = xauth_ldap_config.base->v;
-	if (xauth_ldap_config.subtree)
-		scope = LDAP_SCOPE_SUBTREE;
-	timeout.tv_sec = 15;
-	timeout.tv_usec = 0;
-	res = ldap_search_ext_s(ld, basedn, scope,
-		filter, atlist, 0, NULL, NULL,
-		&timeout, 2, &lr);
-	if (res != LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_search_ext_s failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_end;
-	}
-
-	/* check the number of ldap entries returned */
-	ecount = ldap_count_entries(ld, lr);
-	if (ecount < 1) {
-		plog(LLV_WARNING, LOCATION, NULL, 
-			"no ldap results for filter \'%s\'\n", 
-			 filter);
-		goto ldap_end;
-	}
-	if (ecount > 1) {
-		plog(LLV_WARNING, LOCATION, NULL, 
-			"multiple (%i) ldap results for filter \'%s\'\n", 
-			ecount, filter);
-	}
-
-	/* obtain the dn from the first result */
-	le = ldap_first_entry(ld, lr);
-	if (le == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_first_entry failed: invalid entry returned\n");
-		goto ldap_end;
-	}
-	userdn = ldap_get_dn(ld, le);
-	if (userdn == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_get_dn failed: invalid string returned\n");
-		goto ldap_end;
-	}
-
-	/* cache the user dn in the xauth state */
-	iph1->mode_cfg->xauth.udn = racoon_malloc(strlen(userdn)+1);
-	strcpy(iph1->mode_cfg->xauth.udn,userdn);
-
-	/* retrieve modecfg address */
-	bv = ldap_get_values_len(ld, le, xauth_ldap_config.attr_addr->v);
-	if (bv != NULL)	{
-		char tmpaddr[16];
-		/* sanity check for address value */
-		if ((bv[0]->bv_len < 7)||(bv[0]->bv_len > 15)) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"ldap returned invalid modecfg address\n");
-			ldap_value_free_len(bv);
-			goto ldap_end;
-		}
-		memcpy(tmpaddr,bv[0]->bv_val,bv[0]->bv_len);
-		tmpaddr[bv[0]->bv_len]=0;
-		iph1->mode_cfg->addr4.s_addr = inet_addr(tmpaddr);
-		iph1->mode_cfg->flags |= ISAKMP_CFG_ADDR4_EXTERN;
-		plog(LLV_INFO, LOCATION, NULL,
-			"ldap returned modecfg address %s\n", tmpaddr);
-		ldap_value_free_len(bv);
-	}
-
-	/* retrieve modecfg netmask */
-	bv = ldap_get_values_len(ld, le, xauth_ldap_config.attr_mask->v);
-	if (bv != NULL)	{
-		char tmpmask[16];
-		/* sanity check for netmask value */
-		if ((bv[0]->bv_len < 7)||(bv[0]->bv_len > 15)) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"ldap returned invalid modecfg netmask\n");
-			ldap_value_free_len(bv);
-			goto ldap_end;
-		}
-		memcpy(tmpmask,bv[0]->bv_val,bv[0]->bv_len);
-		tmpmask[bv[0]->bv_len]=0;
-		iph1->mode_cfg->mask4.s_addr = inet_addr(tmpmask);
-		iph1->mode_cfg->flags |= ISAKMP_CFG_MASK4_EXTERN;
-		plog(LLV_INFO, LOCATION, NULL,
-			"ldap returned modecfg netmask %s\n", tmpmask);
-		ldap_value_free_len(bv);
-	}
-
-	/*
-	 * finally, use the dn and the xauth
-	 * password to check the users given
-	 * credentials by attempting to bind
-	 * to the ldap server
-	 */
-	plog(LLV_INFO, LOCATION, NULL,
-		"attempting ldap bind for dn \'%s\'\n", userdn);
-	cred.bv_val = pwd;
-	cred.bv_len = strlen( cred.bv_val );
-	res = ldap_sasl_bind_s(ld,
-		userdn, NULL, &cred,
-		NULL, NULL, NULL);
-        if(res==LDAP_SUCCESS)
-		rtn = 0;
-
-ldap_end:
-
-	/* free ldap resources */
-	if (userdn != NULL)
-		ldap_memfree(userdn);
-	if (atlist[0] != NULL)
-		racoon_free(atlist[0]);
-	if (atlist[1] != NULL)
-		racoon_free(atlist[1]);
-	if (filter != NULL)
-		racoon_free(filter);
-	if (lr != NULL)
-		ldap_msgfree(lr);
-	if (init != NULL)
-		racoon_free(init);
-
-	ldap_unbind_ext_s(ld, NULL, NULL);
-
-	return rtn;
-}
-
-int
-xauth_group_ldap(udn, grp)
-	char * udn;
-	char * grp;
-{
-	int rtn = -1;
-	int res = -1;
-	LDAP *ld = NULL;
-	LDAPMessage *lr = NULL;
-	LDAPMessage *le = NULL;
-	struct berval cred;
-	struct timeval timeout;
-	char *init = NULL;
-	char *filter = NULL;
-	char *basedn = NULL;
-	char *groupdn = NULL;
-	int tmplen = 0;
-	int ecount = 0;
-	int scope = LDAP_SCOPE_ONE;
-
-	/* build our initialization url */
-	tmplen = strlen("ldap://:") + 17;
-	tmplen += strlen(xauth_ldap_config.host->v);
-	init = racoon_malloc(tmplen);
-	if (init == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unable to alloc ldap init url\n");
-		goto ldap_group_end;
-	}
-	sprintf(init,"ldap://%s:%d",
-		xauth_ldap_config.host->v,
-		xauth_ldap_config.port );
-
-	/* initialize the ldap handle */
-	res = ldap_initialize(&ld, init);
-	if (res != LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_initialize failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_group_end;
-	}
-
-	/* initialize the protocol version */
-	ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,
-		&xauth_ldap_config.pver);
-
-	/*
-	 * attempt to bind to the ldap server.
-         * default to anonymous bind unless a
-	 * user dn and password has been
-	 * specified in our configuration
-         */
-	if ((xauth_ldap_config.bind_dn != NULL)&&
-	    (xauth_ldap_config.bind_pw != NULL))
-	{
-		cred.bv_val = xauth_ldap_config.bind_pw->v;
-		cred.bv_len = strlen( cred.bv_val );
-		res = ldap_sasl_bind_s(ld,
-			xauth_ldap_config.bind_dn->v, NULL, &cred,
-			NULL, NULL, NULL);
-	}
-	else
-	{
-		res = ldap_sasl_bind_s(ld,
-			NULL, NULL, NULL,
-			NULL, NULL, NULL);
-	}
-
-	if (res!=LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_sasl_bind_s (search) failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_group_end;
-	}
-
-	/* build an ldap group search filter */
-	tmplen = strlen("(&(=)(=))") + 1;
-	tmplen += strlen(xauth_ldap_config.attr_group->v);
-	tmplen += strlen(grp);
-	tmplen += strlen(xauth_ldap_config.attr_member->v);
-	tmplen += strlen(udn);
-	filter = racoon_malloc(tmplen);
-	if (filter == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unable to alloc ldap search filter buffer\n");
-		goto ldap_group_end;
-	}
-	sprintf(filter, "(&(%s=%s)(%s=%s))",
-		xauth_ldap_config.attr_group->v, grp,
-		xauth_ldap_config.attr_member->v, udn);
-
-	/* attempt to locate the group dn */
-	if (xauth_ldap_config.base != NULL)
-		basedn = xauth_ldap_config.base->v;
-	if (xauth_ldap_config.subtree)
-		scope = LDAP_SCOPE_SUBTREE;
-	timeout.tv_sec = 15;
-	timeout.tv_usec = 0;
-	res = ldap_search_ext_s(ld, basedn, scope,
-		filter, NULL, 0, NULL, NULL,
-		&timeout, 2, &lr);
-	if (res != LDAP_SUCCESS) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_search_ext_s failed: %s\n",
-			ldap_err2string(res));
-		goto ldap_group_end;
-	}
-
-	/* check the number of ldap entries returned */
-	ecount = ldap_count_entries(ld, lr);
-	if (ecount < 1) {
-		plog(LLV_WARNING, LOCATION, NULL, 
-			"no ldap results for filter \'%s\'\n", 
-			 filter);
-		goto ldap_group_end;
-	}
-
-	/* success */
-	rtn = 0;
-
-	/* obtain the dn from the first result */
-	le = ldap_first_entry(ld, lr);
-	if (le == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_first_entry failed: invalid entry returned\n");
-		goto ldap_group_end;
-	}
-	groupdn = ldap_get_dn(ld, le);
-	if (groupdn == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ldap_get_dn failed: invalid string returned\n");
-		goto ldap_group_end;
-	}
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"ldap membership group returned \'%s\'\n", groupdn);
-ldap_group_end:
-
-	/* free ldap resources */
-	if (groupdn != NULL)
-		ldap_memfree(groupdn);
-	if (filter != NULL)
-		racoon_free(filter);
-	if (lr != NULL)
-		ldap_msgfree(lr);
-	if (init != NULL)
-		racoon_free(init);
-
-	ldap_unbind_ext_s(ld, NULL, NULL);
-
-	return rtn;
-}
-
-#endif
-
-#ifndef ANDROID_PATCHED
-
-int
-xauth_login_system(usr, pwd)
-	char *usr;
-	char *pwd;
-{
-	struct passwd *pw;
-	char *cryptpwd;
-	char *syscryptpwd;
-#ifdef HAVE_SHADOW_H
-	struct spwd *spw;
-
-	if ((spw = getspnam(usr)) == NULL)
-		return -1;
-
-	syscryptpwd = spw->sp_pwdp;
-#endif
-
-	if ((pw = getpwnam(usr)) == NULL)
-		return -1;
-
-#ifndef HAVE_SHADOW_H
-	syscryptpwd = pw->pw_passwd;
-#endif
-
-	/* No root login. Ever. */
-	if (pw->pw_uid == 0)
-		return -1;
-
-	if ((cryptpwd = crypt(pwd, syscryptpwd)) == NULL)
-		return -1;
-
-	if (strcmp(cryptpwd, syscryptpwd) == 0)
-		return 0;
-
-	return -1;
-}
-
-#endif
-
-int
-xauth_group_system(usr, grp)
-	char * usr;
-	char * grp;
-{
-	struct group * gr;
-	char * member;
-	int index = 0;
-
-	gr = getgrnam(grp);
-	if (gr == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"the system group name \'%s\' is unknown\n",
-			grp);
-		return -1;
-	}
-
-	while ((member = gr->gr_mem[index++])!=NULL) {
-		if (!strcmp(member,usr)) {
-			plog(LLV_INFO, LOCATION, NULL,
-		                "membership validated\n");
-			return 0;
-		}
-	}
-
-	return -1;
-}
-
-int 
-xauth_check(iph1)
-	struct ph1handle *iph1;
-{
-	struct xauth_state *xst = &iph1->mode_cfg->xauth;
-
-	/* 
- 	 * Only the server side (edge device) really check for Xauth 
-	 * status. It does it if the chose authmethod is using Xauth.
-	 * On the client side (roadwarrior), we don't check anything.
-	 */
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-	/* The following are not yet implemented */
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-		if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Hybrid auth negotiated but peer did not "
-			    "announced as Xauth capable\n");
-			return -1;
-		}
-
-		if (xst->status != XAUTHST_OK) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Hybrid auth negotiated but peer did not "
-			    "succeed Xauth exchange\n");
-			return -1;
-		}
-
-		return 0;
-		break;
-	default:
-		return 0;
-		break;
-	}
-
-	return 0;
-}
-
-int
-group_check(iph1, grp_list, grp_count)
-	struct ph1handle *iph1;
-	char **grp_list;
-	int grp_count;
-{
-	int res = -1;
-	int grp_index = 0;
-	char * usr = NULL;
-
-	/* check for presence of modecfg data */
-
-	if(iph1->mode_cfg == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"xauth group specified but modecfg not found\n");
-		return res;
-	}
-
-	/* loop through our group list */
-
-	for(; grp_index < grp_count; grp_index++) {
-
-		/* check for presence of xauth data */
-
-		usr = iph1->mode_cfg->xauth.authdata.generic.usr;
-
-		if(usr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"xauth group specified but xauth not found\n");
-			return res;
-		}
-
-		/* call appropriate group validation funtion */
-
-		switch (isakmp_cfg_config.groupsource) {
-
-			case ISAKMP_CFG_GROUP_SYSTEM:
-				res = xauth_group_system(
-					usr,
-					grp_list[grp_index]);
-				break;
-
-#ifdef HAVE_LIBLDAP
-			case ISAKMP_CFG_GROUP_LDAP:
-				res = xauth_group_ldap(
-					iph1->mode_cfg->xauth.udn,
-					grp_list[grp_index]);
-				break;
-#endif
-
-			default:
-				/* we should never get here */
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "Unknown group auth source\n");
-				break;
-		}
-
-		if( !res ) {
-			plog(LLV_INFO, LOCATION, NULL,
-				"user \"%s\" is a member of group \"%s\"\n",
-				usr,
-				grp_list[grp_index]);
-			break;
-		} else {
-			plog(LLV_INFO, LOCATION, NULL,
-				"user \"%s\" is not a member of group \"%s\"\n",
-				usr,
-				grp_list[grp_index]);
-		}
-	}
-
-	return res;
-}
-
-vchar_t *
-isakmp_xauth_req(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	int type;
-	size_t dlen = 0;
-	int ashort = 0;
-	int value = 0;
-	vchar_t *buffer = NULL;
-	char *mraw = NULL, *mdata;
-	char *data;
-	vchar_t *usr = NULL;
-	vchar_t *pwd = NULL;
-	size_t skip = 0;
-	int freepwd = 0;
-
-	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth mode config request but peer "
-		    "did not declare itself as Xauth capable\n");
-		return NULL;
-	}
-
-	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
-
-	/* Sanity checks */
-	switch(type) {
-	case XAUTH_TYPE:
-		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unexpected long XAUTH_TYPE attribute\n");
-			return NULL;
-		}
-		if (ntohs(attr->lorv) != XAUTH_TYPE_GENERIC) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unsupported Xauth authentication %d\n", 
-			    ntohs(attr->lorv));
-			return NULL;
-		}
-		ashort = 1;
-		dlen = 0;
-		value = XAUTH_TYPE_GENERIC;
-		break;
-
-	case XAUTH_USER_NAME:
-		if (!iph1->rmconf->xauth || !iph1->rmconf->xauth->login) {
-			plog(LLV_ERROR, LOCATION, NULL, "Xauth performed "
-			    "with no login supplied\n");
-			return NULL;
-		}
-
-		dlen = iph1->rmconf->xauth->login->l - 1;
-		iph1->rmconf->xauth->state |= XAUTH_SENT_USERNAME;
-		break;
-
-#ifdef ANDROID_PATCHED
-        case XAUTH_PASSCODE:
-#endif  
-	case XAUTH_USER_PASSWORD:
-		if (!iph1->rmconf->xauth || !iph1->rmconf->xauth->login)
-			return NULL;
-
-		skip = sizeof(struct ipsecdoi_id_b);
-		usr = vmalloc(iph1->rmconf->xauth->login->l - 1 + skip);
-		if (usr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot allocate memory\n");
-			return NULL;
-		}
-		memset(usr->v, 0, skip);
-		memcpy(usr->v + skip, 
-		    iph1->rmconf->xauth->login->v, 
-		    iph1->rmconf->xauth->login->l - 1);
-
-		if (iph1->rmconf->xauth->pass) {
-			/* A key given through racoonctl */
-			pwd = iph1->rmconf->xauth->pass;
-		} else {
-			if ((pwd = getpskbyname(usr)) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "No password was found for login %s\n", 
-				    iph1->rmconf->xauth->login->v);
-				vfree(usr);
-				return NULL;
-			}
-			/* We have to free it before returning */
-			freepwd = 1;
-		}
-		vfree(usr);
-
-		iph1->rmconf->xauth->state |= XAUTH_SENT_PASSWORD;
-		dlen = pwd->l;
-
-		break;
-	case XAUTH_MESSAGE:
-		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
-			dlen = ntohs(attr->lorv);
-			if (dlen > 0) {
-				mraw = (char*)(attr + 1);
-				mdata = binsanitize(mraw, dlen);
-				if (mdata == NULL) {
-					plog(LLV_ERROR, LOCATION, iph1->remote,
-					    "Cannot allocate memory\n");
-					return NULL;
-				}
-				plog(LLV_NOTIFY,LOCATION, iph1->remote,
-					"XAUTH Message: '%s'.\n",
-					mdata);
-				racoon_free(mdata);
-			}
-		}
-		return NULL;
-	default:
-		plog(LLV_WARNING, LOCATION, NULL,
-		    "Ignored attribute %s\n", s_isakmp_cfg_type(type));
-		return NULL;
-		break;
-	}
-
-	if ((buffer = vmalloc(sizeof(*attr) + dlen)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot allocate memory\n");
-		goto out;
-	}
-
-	attr = (struct isakmp_data *)buffer->v;
-	if (ashort) {
-		attr->type = htons(type | ISAKMP_GEN_TV);
-		attr->lorv = htons(value);
-		goto out;
-	}
-
-	attr->type = htons(type | ISAKMP_GEN_TLV);
-	attr->lorv = htons(dlen);
-	data = (char *)(attr + 1);
-
-	switch(type) {
-	case XAUTH_USER_NAME:
-		/* 
-		 * iph1->rmconf->xauth->login->v is valid, 
-		 * we just checked it in the previous switch case 
-		 */
-		memcpy(data, iph1->rmconf->xauth->login->v, dlen);
-		break;
-#ifdef ANDROID_PATCHED
-        case XAUTH_PASSCODE:
-#endif  
-	case XAUTH_USER_PASSWORD:
-		memcpy(data, pwd->v, dlen);
-		break;
-	default:
-		break;
-	}
-
-out:
-	if (freepwd)
-		vfree(pwd);
-
-	return buffer;
-}
-
-vchar_t *
-isakmp_xauth_set(iph1, attr)
-	struct ph1handle *iph1;
-	struct isakmp_data *attr;
-{
-	int type;
-	vchar_t *buffer = NULL;
-	char *data;
-	struct xauth_state *xst;
-	size_t dlen = 0;
-	char* mraw = NULL, *mdata;
-
-	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Xauth mode config set but peer "
-		    "did not declare itself as Xauth capable\n");
-		return NULL;
-	}
-
-	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
-
-	switch(type) {
-	case XAUTH_STATUS:
-		/* 
-		 * We should only receive ISAKMP mode_cfg SET XAUTH_STATUS
-		 * when running as a client (initiator).
-		 */
-		xst = &iph1->mode_cfg->xauth;
-		switch(AUTHMETHOD(iph1)) {
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-		case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-		/* Not implemented ... */
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Unexpected XAUTH_STATUS_OK\n");
-			return NULL;
-			break;
-		}
-
-		/* If we got a failure, delete iph1 */
-		if (ntohs(attr->lorv) != XAUTH_STATUS_OK) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Xauth authentication failed\n");
-
-			EVT_PUSH(iph1->local, iph1->remote, 
-			    EVTT_XAUTH_FAILED, NULL);
-
-			iph1->mode_cfg->flags |= ISAKMP_CFG_DELETE_PH1;
-		} else {
-			EVT_PUSH(iph1->local, iph1->remote, 
-			    EVTT_XAUTH_SUCCESS, NULL);
-		}
-
-
-		/* We acknowledge it */
-		break;
-	case XAUTH_MESSAGE:
-		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
-			dlen = ntohs(attr->lorv);
-			if (dlen > 0) {
-				mraw = (char*)(attr + 1);
-				mdata = binsanitize(mraw, dlen);
-				if (mdata == NULL) {
-					plog(LLV_ERROR, LOCATION, iph1->remote,
-					    "Cannot allocate memory\n");
-					return NULL;
-				}
-				plog(LLV_NOTIFY,LOCATION, iph1->remote,
-					"XAUTH Message: '%s'.\n",
-					mdata);
-				racoon_free(mdata);
-			}
-		}
-
-	default:
-		plog(LLV_WARNING, LOCATION, NULL,
-		    "Ignored attribute %s\n", s_isakmp_cfg_type(type));
-		return NULL;
-		break;
-	}
-
-	if ((buffer = vmalloc(sizeof(*attr))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "Cannot allocate memory\n");
-		return NULL;
-	}
-
-	attr = (struct isakmp_data *)buffer->v;
-	attr->type = htons(type | ISAKMP_GEN_TV);
-	attr->lorv = htons(0);
-
-	return buffer;
-}
-
-
-void 
-xauth_rmstate(xst)
-	struct xauth_state *xst;
-{
-	switch (xst->authtype) {
-	case XAUTH_TYPE_GENERIC:
-		if (xst->authdata.generic.usr)
-			racoon_free(xst->authdata.generic.usr);
-
-		if (xst->authdata.generic.pwd)
-			racoon_free(xst->authdata.generic.pwd);
-
-		break;
-
-	case XAUTH_TYPE_CHAP:
-	case XAUTH_TYPE_OTP:
-	case XAUTH_TYPE_SKEY:
-		plog(LLV_WARNING, LOCATION, NULL, 
-		    "Unsupported authtype %d\n", xst->authtype);
-		break;
-
-	default:
-		plog(LLV_WARNING, LOCATION, NULL, 
-		    "Unexpected authtype %d\n", xst->authtype);
-		break;
-	}
-
-#ifdef HAVE_LIBLDAP
-	if (xst->udn != NULL)
-		racoon_free(xst->udn);
-#endif
-	return;
-}
-
-int
-xauth_rmconf_used(xauth_rmconf)
-	struct xauth_rmconf **xauth_rmconf;
-{
-	if (*xauth_rmconf == NULL) {
-		*xauth_rmconf = racoon_malloc(sizeof(**xauth_rmconf));
-		if (*xauth_rmconf == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "xauth_rmconf_used: malloc failed\n");
-			return -1;
-		}
-
-		(*xauth_rmconf)->login = NULL;
-		(*xauth_rmconf)->pass = NULL;
-		(*xauth_rmconf)->state = 0;
-	}
-
-	return 0;
-}
-
-void 
-xauth_rmconf_delete(xauth_rmconf)
-	struct xauth_rmconf **xauth_rmconf;
-{
-	if (*xauth_rmconf != NULL) { 
-		if ((*xauth_rmconf)->login != NULL)
-			vfree((*xauth_rmconf)->login);
-		if ((*xauth_rmconf)->pass != NULL)
-			vfree((*xauth_rmconf)->pass);
-
-		racoon_free(*xauth_rmconf);
-		*xauth_rmconf = NULL;
-	}
-
-	return;
-}
diff --git a/src/racoon/isakmp_xauth.h b/src/racoon/isakmp_xauth.h
deleted file mode 100644
index ebb5214..0000000
--- a/src/racoon/isakmp_xauth.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*	$NetBSD: isakmp_xauth.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME$ */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus 
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _ISAKMP_XAUTH_H
-#define _ISAKMP_XAUTH_H
-
-/* ISAKMP mode config attribute types specific to the Xauth vendor ID */
-#define	XAUTH_TYPE                16520
-#define	XAUTH_USER_NAME           16521
-#define	XAUTH_USER_PASSWORD       16522
-#define	XAUTH_PASSCODE            16523
-#define	XAUTH_MESSAGE             16524
-#define	XAUTH_CHALLENGE           16525
-#define	XAUTH_DOMAIN              16526
-#define	XAUTH_STATUS              16527
-#define	XAUTH_NEXT_PIN            16528
-#define	XAUTH_ANSWER              16529
-
-/* Types for XAUTH_TYPE */
-#define	XAUTH_TYPE_GENERIC 	0
-#define	XAUTH_TYPE_CHAP    	1
-#define	XAUTH_TYPE_OTP     	2
-#define	XAUTH_TYPE_SKEY    	3
-
-/* Values for XAUTH_STATUS */
-#define	XAUTH_STATUS_FAIL       0
-#define	XAUTH_STATUS_OK         1
-
-/* For phase 1 Xauth status */
-struct xauth_state {
-	int status; /* authentication status, used only on server side */
-	int vendorid;
-	int authtype;
-	union {
-		struct authgeneric {
-			char *usr;
-			char *pwd;
-		} generic;
-	} authdata;
-#ifdef HAVE_LIBLDAP
-	char *udn; /* ldap user dn */
-#endif
-};
-
-/* What's been sent */
-#define XAUTH_SENT_USERNAME 1
-#define XAUTH_SENT_PASSWORD 2
-#define XAUTH_SENT_EVERYTHING (XAUTH_SENT_USERNAME | XAUTH_SENT_PASSWORD)
-
-/* For rmconf Xauth data */
-struct xauth_rmconf {
-	vchar_t *login;	/* xauth login */
-	vchar_t *pass;	/* xauth password */
-	int state;      /* what's been sent */
-};
-
-/* status */
-#define XAUTHST_NOTYET	0
-#define XAUTHST_REQSENT	1
-#define XAUTHST_OK	2
-
-struct xauth_reply_arg {
-	isakmp_index index;
-	int port;
-	int id;
-	int res;
-};
-
-struct ph1handle;
-struct isakmp_data;
-void xauth_sendreq(struct ph1handle *);
-int xauth_attr_reply(struct ph1handle *, struct isakmp_data *, int);
-int xauth_login_system(char *, char *);
-void xauth_sendstatus(struct ph1handle *, int, int);
-int xauth_check(struct ph1handle *);
-int group_check(struct ph1handle *, char **, int);
-vchar_t *isakmp_xauth_req(struct ph1handle *, struct isakmp_data *);
-vchar_t *isakmp_xauth_set(struct ph1handle *, struct isakmp_data *);
-void xauth_rmstate(struct xauth_state *);
-void xauth_reply_stub(void *);
-int xauth_reply(struct ph1handle *, int, int, int);
-int xauth_rmconf_used(struct xauth_rmconf **);
-void xauth_rmconf_delete(struct xauth_rmconf **);
-
-#ifdef HAVE_LIBRADIUS
-int xauth_login_radius(struct ph1handle *, char *, char *);
-int xauth_radius_init(void);
-#endif
-
-#ifdef HAVE_LIBPAM
-int xauth_login_pam(int, struct sockaddr *, char *, char *);
-#endif
-
-#ifdef HAVE_LIBLDAP
-
-#define LDAP_DFLT_HOST		"localhost"
-#define LDAP_DFLT_USER		"cn"
-#define LDAP_DFLT_ADDR		"racoon-address"
-#define LDAP_DFLT_MASK		"racoon-netmask"
-#define LDAP_DFLT_GROUP		"cn"
-#define LDAP_DFLT_MEMBER	"member"
-
-struct xauth_ldap_config {
-	int		pver;
-	vchar_t 	*host;
-	int		port;
-	vchar_t		*base;
-	int		subtree;
-	vchar_t		*bind_dn;
-	vchar_t		*bind_pw;
-	int		auth_type;
-	vchar_t		*attr_user;
-	vchar_t		*attr_addr;
-	vchar_t		*attr_mask;
-	vchar_t		*attr_group;
-	vchar_t		*attr_member;
-};
-
-extern struct xauth_ldap_config xauth_ldap_config;
-
-int xauth_ldap_init(void);
-int xauth_login_ldap(struct ph1handle *, char *, char *);
-#endif
-
-#endif /* _ISAKMP_XAUTH_H */
diff --git a/src/racoon/kmpstat.c b/src/racoon/kmpstat.c
deleted file mode 100644
index c59e43a..0000000
--- a/src/racoon/kmpstat.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*	$NetBSD: kmpstat.c,v 1.4.6.2 2007/11/06 16:41:33 vanhu Exp $	*/
-
-/*	$KAME: kmpstat.c,v 1.33 2004/08/16 08:20:28 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/pfkeyv2.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <err.h>
-#include <sys/ioctl.h> 
-#include <resolv.h>
-
-#include "libpfkey.h"
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-#include "sockmisc.h"
-
-#include "racoonctl.h"
-#include "admin.h"
-#include "schedule.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_xauth.h"
-#include "isakmp_var.h"
-#include "isakmp_cfg.h"
-#include "oakley.h"
-#include "handler.h"
-#include "pfkey.h"
-#include "admin.h"
-#include "evt.h"
-#include "admin_var.h"
-#include "ipsec_doi.h"
-
-u_int32_t racoonctl_interface = RACOONCTL_INTERFACE;
-u_int32_t racoonctl_interface_major = RACOONCTL_INTERFACE_MAJOR;
-
-static int so;
-u_int32_t loglevel = 0;
-
-int
-com_init()
-{
-	struct sockaddr_un name;
-
-	memset(&name, 0, sizeof(name));
-	name.sun_family = AF_UNIX;
-	snprintf(name.sun_path, sizeof(name.sun_path),
-		"%s", adminsock_path);
-
-	so = socket(AF_UNIX, SOCK_STREAM, 0);
-	if (so < 0)
-		return -1;
-
-	if (connect(so, (struct sockaddr *)&name, sizeof(name)) < 0) {
-		(void)close(so);
-		return -1;
-	}
-
-	return 0;
-}
-
-int
-com_send(combuf)
-	vchar_t *combuf;
-{
-	int len;
-
-	if ((len = send(so, combuf->v, combuf->l, 0)) == -1) {
-		perror("send");
-		(void)close(so);
-		return -1;
-	}
-
-	return 0;
-}
-
-int
-com_recv(combufp) 
-	vchar_t **combufp;
-{
-	struct admin_com h, *com;
-	caddr_t buf;
-	int len;
-	int l = 0;
-	caddr_t p;
-
-	if (combufp == NULL)
-		return -1;
-
-	/* receive by PEEK */ 
-	if ((len = recv(so, &h, sizeof(h), MSG_PEEK)) == -1)
-		goto bad1;
-
-	/* sanity check */
-	if (len < sizeof(h))
-		goto bad1;
-
-	if (h.ac_errno) {
-		errno = h.ac_errno;
-		goto bad1;
-	}
-
-	/* allocate buffer */
-	if ((*combufp = vmalloc(h.ac_len)) == NULL)
-		goto bad1;
-
-	/* read real message */
-	p = (*combufp)->v;
-	while (l < len) {
-		if ((len = recv(so, p, h.ac_len, 0)) < 0) {
-			perror("recv");
-			goto bad2;
-		}
-		l += len;
-		p += len;
-	}
-	
-	return 0;
-
-bad2:
-	vfree(*combufp);
-bad1:
-	*combufp = NULL;
-	return -1;
-}
-
-/*
- * Dumb plog functions (used by sockmisc.c) 
- */
-void
-_plog(int pri, const char *func, struct sockaddr *sa, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vprintf(fmt, ap);
-	va_end(ap);
-}
-
-void
-plogdump(pri, data, len) 
-	int pri;
-	void *data;
-	size_t len;
-{
-	return;
-}
-
-struct sockaddr *
-get_sockaddr(family, name, port)
-	int family;
-	char *name, *port;
-{
-	struct addrinfo hint, *ai;
-	int error;
-
-	memset(&hint, 0, sizeof(hint));
-	hint.ai_family = PF_UNSPEC;
-	hint.ai_family = family;
-	hint.ai_socktype = SOCK_STREAM;
-
-	error = getaddrinfo(name, port, &hint, &ai);
-	if (error != 0) {
-		printf("%s: %s/%s\n", gai_strerror(error), name, port);
-		return NULL;
-	}
-
-	return ai->ai_addr;
-}
diff --git a/src/racoon/localconf.c b/src/racoon/localconf.c
deleted file mode 100644
index ede1d9b..0000000
--- a/src/racoon/localconf.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/*	$NetBSD: localconf.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: localconf.c,v 1.33 2001/08/09 07:32:19 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <err.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "algorithm.h"
-#include "admin.h"
-#include "privsep.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "grabmyaddr.h"
-#include "vendorid.h"
-#include "str2val.h"
-#include "safefile.h"
-#include "admin.h"
-#include "gcmalloc.h"
-
-struct localconf *lcconf;
-
-static void setdefault __P((void));
-
-void
-initlcconf()
-{
-	lcconf = racoon_calloc(1, sizeof(*lcconf));
-	if (lcconf == NULL)
-		errx(1, "failed to allocate local conf.");
-
-	setdefault();
-
-	lcconf->racoon_conf = LC_DEFAULT_CF;
-}
-
-void
-flushlcconf()
-{
-	int i;
-
-	setdefault();
-	clear_myaddr(&lcconf->myaddrs);
-	for (i = 0; i < LC_PATHTYPE_MAX; i++) {
-		if (lcconf->pathinfo[i]) {
-			racoon_free(lcconf->pathinfo[i]);
-			lcconf->pathinfo[i] = NULL;
-		}
-	}
-	for (i = 0; i < LC_IDENTTYPE_MAX; i++) {
-		if (lcconf->ident[i])
-			vfree(lcconf->ident[i]);
-		lcconf->ident[i] = NULL;
-	}
-}
-
-static void
-setdefault()
-{
-	lcconf->uid = 0;
-	lcconf->gid = 0;
-	lcconf->chroot = NULL;
-	lcconf->autograbaddr = 1;
-	lcconf->port_isakmp = PORT_ISAKMP;
-	lcconf->port_isakmp_natt = PORT_ISAKMP_NATT;
-	lcconf->default_af = AF_INET;
-	lcconf->pad_random = LC_DEFAULT_PAD_RANDOM;
-	lcconf->pad_randomlen = LC_DEFAULT_PAD_RANDOMLEN;
-	lcconf->pad_maxsize = LC_DEFAULT_PAD_MAXSIZE;
-	lcconf->pad_strict = LC_DEFAULT_PAD_STRICT;
-	lcconf->pad_excltail = LC_DEFAULT_PAD_EXCLTAIL;
-	lcconf->retry_counter = LC_DEFAULT_RETRY_COUNTER;
-	lcconf->retry_interval = LC_DEFAULT_RETRY_INTERVAL;
-	lcconf->count_persend = LC_DEFAULT_COUNT_PERSEND;
-	lcconf->secret_size = LC_DEFAULT_SECRETSIZE;
-	lcconf->retry_checkph1 = LC_DEFAULT_RETRY_CHECKPH1;
-	lcconf->wait_ph2complete = LC_DEFAULT_WAIT_PH2COMPLETE;
-	lcconf->strict_address = FALSE;
-	lcconf->complex_bundle = TRUE; /*XXX FALSE;*/
-	lcconf->gss_id_enc = LC_GSSENC_UTF16LE; /* Windows compatibility */
-	lcconf->natt_ka_interval = LC_DEFAULT_NATT_KA_INTERVAL;
-}
-
-/*
- * get PSK by string.
- */
-vchar_t *
-getpskbyname(id0)
-	vchar_t *id0;
-{
-	char *id;
-	vchar_t *key = NULL;
-
-	id = racoon_calloc(1, 1 + id0->l - sizeof(struct ipsecdoi_id_b));
-	if (id == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get psk buffer.\n");
-		goto end;
-	}
-	memcpy(id, id0->v + sizeof(struct ipsecdoi_id_b),
-		id0->l - sizeof(struct ipsecdoi_id_b));
-	id[id0->l - sizeof(struct ipsecdoi_id_b)] = '\0';
-
-	key = privsep_getpsk(id, id0->l - sizeof(struct ipsecdoi_id_b));
-
-end:
-	if (id)
-		racoon_free(id);
-	return key;
-}
-
-/*
- * get PSK by address.
- */
-vchar_t *
-getpskbyaddr(remote)
-	struct sockaddr *remote;
-{
-	vchar_t *key = NULL;
-	char addr[NI_MAXHOST], port[NI_MAXSERV];
-
-	GETNAMEINFO(remote, addr, port);
-
-	key = privsep_getpsk(addr, strlen(addr));
-
-	return key;
-}
-
-vchar_t *
-getpsk(str, len)
-	const char *str;
-	const int len;
-{
-	FILE *fp;
-	char buf[1024];	/* XXX how is variable length ? */
-	vchar_t *key = NULL;
-	char *p, *q;
-	size_t keylen;
-	char *k = NULL;
-
-	if (safefile(lcconf->pathinfo[LC_PATHTYPE_PSK], 1) == 0)
-		fp = fopen(lcconf->pathinfo[LC_PATHTYPE_PSK], "r");
-	else
-		fp = NULL;
-	if (fp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to open pre_share_key file %s\n",
-			lcconf->pathinfo[LC_PATHTYPE_PSK]);
-		return NULL;
-	}
-
-	while (fgets(buf, sizeof(buf), fp) != NULL) {
-		/* comment line */
-		if (buf[0] == '#')
-			continue;
-
-		/* search the end of 1st string. */
-		for (p = buf; *p != '\0' && !isspace((int)*p); p++)
-			;
-		if (*p == '\0')
-			continue;	/* no 2nd parameter */
-		*p = '\0';
-		/* search the 1st of 2nd string. */
-		while (isspace((int)*++p))
-			;
-		if (*p == '\0')
-			continue;	/* no 2nd parameter */
-		p--;
-		if (strncmp(buf, str, len) == 0 && buf[len] == '\0') {
-			p++;
-			keylen = 0;
-			for (q = p; *q != '\0' && *q != '\n'; q++)
-				keylen++;
-			*q = '\0';
-
-			/* fix key if hex string */
-			if (strncmp(p, "0x", 2) == 0) {
-				k = str2val(p + 2, 16, &keylen);
-				if (k == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"failed to get psk buffer.\n");
-					goto end;
-				}
-				p = k;
-			}
-
-			key = vmalloc(keylen);
-			if (key == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate key buffer.\n");
-				goto end;
-			}
-			memcpy(key->v, p, key->l);
-			if (k)
-				racoon_free(k);
-			goto end;
-		}
-	}
-
-end:
-	fclose(fp);
-	return key;
-}
-
-/*
- * get a file name of a type specified.
- */
-void
-getpathname(path, len, type, name)
-	char *path;
-	int len, type;
-	const char *name;
-{
-	snprintf(path, len, "%s%s%s", 
-		name[0] == '/' ? "" : lcconf->pathinfo[type],
-		name[0] == '/' ? "" : "/",
-		name);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "filename: %s\n", path);
-}
-
-#if 0 /* DELETEIT */
-static int lc_doi2idtype[] = {
-	-1,
-	-1,
-	LC_IDENTTYPE_FQDN,
-	LC_IDENTTYPE_USERFQDN,
-	-1,
-	-1,
-	-1,
-	-1,
-	-1,
-	LC_IDENTTYPE_CERTNAME,
-	-1,
-	LC_IDENTTYPE_KEYID,
-};
-
-/*
- * convert DOI value to idtype
- * OUT	-1   : NG
- *	other: converted.
- */
-int
-doi2idtype(idtype)
-	int idtype;
-{
-	if (ARRAYLEN(lc_doi2idtype) > idtype)
-		return lc_doi2idtype[idtype];
-	return -1;
-}
-#endif
-
-static int lc_sittype2doi[] = {
-	IPSECDOI_SIT_IDENTITY_ONLY,
-	IPSECDOI_SIT_SECRECY,
-	IPSECDOI_SIT_INTEGRITY,
-};
-
-/*
- * convert sittype to DOI value.
- * OUT	-1   : NG
- *	other: converted.
- */
-int
-sittype2doi(sittype)
-	int sittype;
-{
-	if (ARRAYLEN(lc_sittype2doi) > sittype)
-		return lc_sittype2doi[sittype];
-	return -1;
-}
-
-static int lc_doitype2doi[] = {
-	IPSEC_DOI,
-};
-
-/*
- * convert doitype to DOI value.
- * OUT	-1   : NG
- *	other: converted.
- */
-int
-doitype2doi(doitype)
-	int doitype;
-{
-	if (ARRAYLEN(lc_doitype2doi) > doitype)
-		return lc_doitype2doi[doitype];
-	return -1;
-}
-
-
-
-static void
-saverestore_params(f)
-	int f;
-{
-	static u_int16_t s_port_isakmp;
-#ifdef ENABLE_ADMINPORT
-	static u_int16_t s_port_admin;
-#endif
-
-	/* 0: save, 1: restore */
-	if (f) {
-		lcconf->port_isakmp = s_port_isakmp;
-#ifdef ENABLE_ADMINPORT
-		lcconf->port_admin = s_port_admin;
-#endif
-	} else {
-		s_port_isakmp = lcconf->port_isakmp;
-#ifdef ENABLE_ADMINPORT
-		s_port_admin = lcconf->port_admin;
-#endif
-	}
-}
-
-void
-restore_params()
-{
-	saverestore_params(1);
-}
-
-void
-save_params()
-{
-	saverestore_params(0);
-}
diff --git a/src/racoon/localconf.h b/src/racoon/localconf.h
deleted file mode 100644
index f7cf33a..0000000
--- a/src/racoon/localconf.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*	$NetBSD: localconf.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: localconf.h,v 1.13 2005/11/06 18:13:18 monas Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _LOCALCONF_H
-#define _LOCALCONF_H
-
-/* local configuration */
-
-#define LC_DEFAULT_CF	SYSCONFDIR "/racoon.conf"
-
-#define LC_PATHTYPE_INCLUDE	0
-#define LC_PATHTYPE_PSK		1
-#define LC_PATHTYPE_CERT	2
-#define LC_PATHTYPE_BACKUPSA	3
-#define LC_PATHTYPE_SCRIPT	4
-#define LC_PATHTYPE_PIDFILE	5
-#define LC_PATHTYPE_MAX		6
-
-#define LC_DEFAULT_PAD_MAXSIZE		20
-#define LC_DEFAULT_PAD_RANDOM		TRUE
-#define LC_DEFAULT_PAD_RANDOMLEN	FALSE
-#define LC_DEFAULT_PAD_STRICT		FALSE
-#define LC_DEFAULT_PAD_EXCLTAIL		TRUE
-#define LC_DEFAULT_RETRY_COUNTER	5
-#define LC_DEFAULT_RETRY_INTERVAL	10
-#define LC_DEFAULT_COUNT_PERSEND	1
-#define LC_DEFAULT_RETRY_CHECKPH1	30
-#define LC_DEFAULT_WAIT_PH2COMPLETE	30
-#define LC_DEFAULT_NATT_KA_INTERVAL	20
-
-#define LC_DEFAULT_SECRETSIZE	16	/* 128 bits */
-
-#define LC_IDENTTYPE_MAX	5	/* XXX */
-
-#define	LC_GSSENC_UTF16LE	0	/* GSS ID in UTF-16LE */
-#define	LC_GSSENC_LATIN1	1	/* GSS ID in ISO-Latin-1 */
-#define	LC_GSSENC_MAX		2
-
-struct localconf {
-	char *racoon_conf;		/* configuration filename */
-
-	uid_t uid;
-	gid_t gid;
-	char *chroot;			/* chroot path */
-	u_int16_t port_isakmp;		/* port for isakmp as default */
-	u_int16_t port_isakmp_natt;	/* port for NAT-T use */
-	u_int16_t port_admin;		/* port for admin */
-	int default_af;			/* default address family */
-
-	int sock_admin;
-	int sock_pfkey;
-	int rtsock;			/* routing socket */
-
-	int autograbaddr;
-	struct myaddrs *myaddrs;
-
-	char *pathinfo[LC_PATHTYPE_MAX];
-	vchar_t *ident[LC_IDENTTYPE_MAX]; /* base of Identifier payload. */
-
-	int pad_random;
-	int pad_randomlen;
-	int pad_maxsize;
-	int pad_strict;
-	int pad_excltail;
-
-	int retry_counter;		/* times to retry. */
-	int retry_interval;		/* interval each retry. */
-	int count_persend;		/* the number of packets each retry. */
-				/* above 3 values are copied into a handler. */
-
-	int retry_checkph1;
-	int wait_ph2complete;
-
-	int natt_ka_interval;		/* NAT-T keepalive interval. */
-
-	int secret_size;
-	int strict_address;		/* strictly check addresses. */
-
-	int complex_bundle;
-		/*
-		 * If we want to make a packet "IP2 AH ESP IP1 ULP",
-		 * the SPD in KAME expresses AH transport + ESP tunnel.
-		 * So racoon sent the proposal contained such the order.
-		 * But lots of implementation interprets AH tunnel + ESP
-		 * tunnel in this case.  racoon has changed the format,
-		 * usually uses this format.  If the option, 'complex_bundle'
-		 * is enable, racoon uses old format.
-		 */
-
-	int gss_id_enc;			/* GSS ID encoding to use */
-};
-
-extern struct localconf *lcconf;
-
-extern void initlcconf __P((void));
-extern void flushlcconf __P((void));
-extern vchar_t *getpskbyname __P((vchar_t *));
-extern vchar_t *getpskbyaddr __P((struct sockaddr *));
-extern void getpathname __P((char *, int, int, const char *));
-extern int sittype2doi __P((int));
-extern int doitype2doi __P((int));
-extern vchar_t *getpsk __P((const char *, const int)); 
-
-extern void restore_params __P((void));
-extern void save_params __P((void));
-
-#endif /* _LOCALCONF_H */
diff --git a/src/racoon/logger.c b/src/racoon/logger.c
deleted file mode 100644
index 06991cc..0000000
--- a/src/racoon/logger.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*	$NetBSD: logger.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/*	$KAME: logger.c,v 1.9 2002/09/03 14:37:03 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include "logger.h"
-#include "var.h"
-#include "gcmalloc.h"
-
-struct log *
-log_open(siz, fname)
-	size_t siz;
-	char *fname;
-{
-	struct log *p;
-
-	p = (struct log *)racoon_malloc(sizeof(*p));
-	if (p == NULL)
-		return NULL;
-	memset(p, 0, sizeof(*p));
-
-	p->buf = (char **)racoon_malloc(sizeof(char *) * siz);
-	if (p->buf == NULL) {
-		racoon_free(p);
-		return NULL;
-	}
-	memset(p->buf, 0, sizeof(char *) * siz);
-
-	p->tbuf = (time_t *)racoon_malloc(sizeof(time_t *) * siz);
-	if (p->tbuf == NULL) {
-		racoon_free(p->buf);
-		racoon_free(p);
-		return NULL;
-	}
-	memset(p->tbuf, 0, sizeof(time_t *) * siz);
-
-	p->siz = siz;
-	if (fname)
-		p->fname = racoon_strdup(fname);
-
-	return p;
-}
-
-/*
- * append string to ring buffer.
- * string must be \n-terminated (since we add timestamps).
- * even if not, we'll add \n to avoid formatting mistake (see log_close()).
- */
-void
-log_add(p, str)
-	struct log *p;
-	char *str;
-{
-	/* syslog if p->fname == NULL? */
-	if (p->buf[p->head])
-		racoon_free(p->buf[p->head]);
-	p->buf[p->head] = racoon_strdup(str);
-	p->tbuf[p->head] = time(NULL);
-	p->head++;
-	p->head %= p->siz;
-}
-
-/*
- * write out string to the log file, as is.
- * \n-termination is up to the caller.  if you don't add \n, the file
- * format may be broken.
- */
-int
-log_print(p, str)
-	struct log *p;
-	char *str;
-{
-	FILE *fp;
-
-	if (p->fname == NULL)
-		return -1;	/*XXX syslog?*/
-	fp = fopen(p->fname, "a");
-	if (fp == NULL)
-		return -1;
-	fprintf(fp, "%s", str);
-	fclose(fp);
-
-	return 0;
-}
-
-int
-log_vprint(struct log *p, const char *fmt, ...)
-{
-	va_list ap;
-
-	FILE *fp;
-
-	if (p->fname == NULL)
-		return -1;	/*XXX syslog?*/
-	fp = fopen(p->fname, "a");
-	if (fp == NULL)
-		return -1;
-	va_start(ap, fmt);
-	vfprintf(fp, fmt, ap);
-	va_end(ap);
-
-	fclose(fp);
-
-	return 0;
-}
-
-int
-log_vaprint(struct log *p, const char *fmt, va_list ap)
-{
-	FILE *fp;
-
-	if (p->fname == NULL)
-		return -1;	/*XXX syslog?*/
-	fp = fopen(p->fname, "a");
-	if (fp == NULL)
-		return -1;
-	vfprintf(fp, fmt, ap);
-	fclose(fp);
-
-	return 0;
-}
-
-/*
- * write out content of ring buffer, and reclaim the log structure
- */
-int
-log_close(p)
-	struct log *p;
-{
-	FILE *fp;
-	int i, j;
-	char ts[256];
-	struct tm *tm;
-
-	if (p->fname == NULL)
-		goto nowrite;
-	fp = fopen(p->fname, "a");
-	if (fp == NULL)
-		goto nowrite;
-
-	for (i = 0; i < p->siz; i++) {
-		j = (p->head + i) % p->siz;
-		if (p->buf[j]) {
-			tm = localtime(&p->tbuf[j]);
-			strftime(ts, sizeof(ts), "%B %d %T", tm);
-			fprintf(fp, "%s: %s\n", ts, p->buf[j]);
-			if (*(p->buf[j] + strlen(p->buf[j]) - 1) != '\n')
-				fprintf(fp, "\n");
-		}
-	}
-	fclose(fp);
-
-nowrite:
-	log_free(p);
-	return 0;
-}
-
-void
-log_free(p)
-	struct log *p;
-{
-	int i;
-
-	for (i = 0; i < p->siz; i++)
-		racoon_free(p->buf[i]);
-	racoon_free(p->buf);
-	racoon_free(p->tbuf);
-	if (p->fname)
-		racoon_free(p->fname);
-	racoon_free(p);
-}
-
-#ifdef TEST
-struct log *l;
-
-void
-vatest(const char *fmt, ...)
-{
-	va_list ap;
-	va_start(ap, fmt);
-	log_vaprint(l, fmt, ap);
-	va_end(ap);
-}
-
-int
-main(argc, argv)
-	int argc;
-	char **argv;
-{
-	int i;
-
-	l = log_open(30, "/tmp/hoge");
-	if (l == NULL)
-		errx(1, "hoge");
-
-	for (i = 0; i < 50; i++) {
-		log_add(l, "foo");
-		log_add(l, "baa");
-		log_add(l, "baz");
-	}
-	log_print(l, "hoge\n");
-	log_vprint(l, "hoge %s\n", "this is test");
-	vatest("%s %s\n", "this is", "vprint test");
-	abort();
-	log_free(l);
-}
-
-#endif
-
diff --git a/src/racoon/logger.h b/src/racoon/logger.h
deleted file mode 100644
index 3fd3e94..0000000
--- a/src/racoon/logger.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*	$NetBSD: logger.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: logger.h,v 1.3 2004/06/11 16:00:16 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _LOGGER_H
-#define _LOGGER_H
-
-struct log {
-	int head;
-	int siz;
-	char **buf;
-	time_t *tbuf;
-	char *fname;
-};
-
-extern struct log *log_open __P((size_t, char *));
-extern void log_add __P((struct log *, char *));
-extern int log_print __P((struct log *, char *));
-extern int log_vprint __P((struct log *, const char *, ...));
-extern int log_vaprint __P((struct log *, const char *, va_list));
-extern int log_close __P((struct log *));
-extern void log_free __P((struct log *));
-
-#endif /* _LOGGER_H */
diff --git a/src/racoon/main.c b/src/racoon/main.c
deleted file mode 100644
index 094026e..0000000
--- a/src/racoon/main.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*	$NetBSD: main.c,v 1.6.6.2 2008/11/27 15:25:26 vanhu Exp $	*/
-
-/* Id: main.c,v 1.25 2006/06/20 20:31:34 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/stat.h>
-
-#include <netinet/in.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <paths.h>
-#include <err.h>
-
-/*
- * If we're using a debugging malloc library, this may define our
- * wrapper stubs.
- */
-#define	RACOON_MAIN_PROGRAM
-#include "gcmalloc.h"
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "cfparse_proto.h"
-#include "isakmp_var.h"
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#include "isakmp.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-#include "remoteconf.h"
-#include "localconf.h"
-#include "session.h"
-#include "oakley.h"
-#include "pfkey.h"
-#include "policy.h"
-#include "crypto_openssl.h"
-#include "backupsa.h"
-#include "vendorid.h"
-
-#include "package_version.h"
-
-int f_local = 0;	/* local test mode.  behave like a wall. */
-int vflag = 1;		/* for print-isakmp.c */
-static int loading_sa = 0;	/* install sa when racoon boots up. */
-static int dump_config = 0;	/* dump parsed config file. */
-
-#ifdef TOP_PACKAGE
-static char version[] = "@(#)" TOP_PACKAGE_STRING " (" TOP_PACKAGE_URL ")";
-#else /* TOP_PACKAGE */
-static char version[] = "@(#) racoon / IPsec-tools";
-#endif /* TOP_PACKAGE */
-
-int main __P((int, char **));
-static void usage __P((void));
-static void parse __P((int, char **));
-#if 0
-static void cleanup_pidfile __P((void));
-#endif
-
-void
-usage()
-{
-	printf("usage: racoon [-BdFv%s] %s[-f (file)] [-l (file)] [-p (port)]\n",
-#ifdef INET6
-		"46",
-#else
-		"",
-#endif
-#ifdef ENABLE_ADMINPORT
-		"[-a (port)] "
-#else
-		""
-#endif
-		);
-	printf("   -B: install SA to the kernel from the file "
-		"specified by the configuration file.\n");
-	printf("   -d: debug level, more -d will generate more debug message.\n");
-	printf("   -C: dump parsed config file.\n");
-	printf("   -L: include location in debug messages\n");
-	printf("   -F: run in foreground, do not become daemon.\n");
-	printf("   -v: be more verbose\n");
-#ifdef INET6
-	printf("   -4: IPv4 mode.\n");
-	printf("   -6: IPv6 mode.\n");
-#endif
-#ifdef ENABLE_ADMINPORT
-	printf("   -a: port number for admin port.\n");
-#endif
-	printf("   -f: pathname for configuration file.\n");
-	printf("   -l: pathname for log file.\n");
-	printf("   -p: port number for isakmp (default: %d).\n", PORT_ISAKMP);
-	printf("   -P: port number for NAT-T (default: %d).\n", PORT_ISAKMP_NATT);
-	exit(1);
-}
-
-int
-main(ac, av)
-	int ac;
-	char **av;
-{
-	int error;
-
-	if (geteuid() != 0) {
-		errx(1, "must be root to invoke this program.");
-		/* NOTREACHED*/
-	}
-
-	/*
-	 * Don't let anyone read files I write.  Although some files (such as
-	 * the PID file) can be other readable, we dare to use the global mask,
-	 * because racoon uses fopen(3), which can't specify the permission
-	 * at the creation time.
-	 */
-	umask(077);
-	if (umask(077) != 077) {
-		errx(1, "could not set umask");
-		/* NOTREACHED*/
-	}
-
-#ifdef DEBUG_RECORD_MALLOCATION
-	DRM_init();
-#endif
-
-#ifdef HAVE_SECCTX
-	init_avc();
-#endif
-	eay_init();
-	initlcconf();
-	initrmconf();
-	oakley_dhinit();
-	compute_vendorids();
-
-	parse(ac, av);
-
-	ploginit();
-
-	plog(LLV_INFO, LOCATION, NULL, "%s\n", version);
-	plog(LLV_INFO, LOCATION, NULL, "@(#)"
-	    "This product linked %s (http://www.openssl.org/)"
-	    "\n", eay_version());
-	plog(LLV_INFO, LOCATION, NULL, "Reading configuration from \"%s\"\n", 
-	    lcconf->racoon_conf);
-
-	if (pfkey_init() < 0) {
-		errx(1, "something error happened "
-			"while pfkey initializing.");
-		/* NOTREACHED*/
-	}
-
-#ifdef ENABLE_HYBRID
-	if (isakmp_cfg_init(ISAKMP_CFG_INIT_COLD))
-		errx(1, "could not initialize ISAKMP mode config structures");
-#endif
-
-#ifdef HAVE_LIBLDAP
-	if (xauth_ldap_init() != 0)
-		errx(1, "could not initialize libldap");
-#endif
-
-	/*
-	 * in order to prefer the parameters by command line,
-	 * saving some parameters before parsing configuration file.
-	 */
-	save_params();
-	error = cfparse();
-	if (error != 0)
-		errx(1, "failed to parse configuration file.");
-	restore_params();
-
-#ifdef ENABLE_HYBRID
-	if(isakmp_cfg_config.network4 && isakmp_cfg_config.pool_size == 0)
-		if ((error = isakmp_cfg_resize_pool(ISAKMP_CFG_MAX_CNX)) != 0)
-			return error;
-#endif
-
-	if (dump_config)
-		dumprmconf ();
-
-#ifdef HAVE_LIBRADIUS
-	if (xauth_radius_init() != 0) {
-		errx(1, "could not initialize libradius");
-		/* NOTREACHED*/
-	}
-#endif
-
-	/*
-	 * install SAs from the specified file.  If the file is not specified
-	 * by the configuration file, racoon will exit.
-	 */
-	if (loading_sa && !f_local) {
-		if (backupsa_from_file() != 0)
-			errx(1, "something error happened "
-				"SA recovering.");
-	}
-
-	if (f_foreground)
-		close(0);
-	else {
-		if (daemon(0, 0) < 0) {
-			errx(1, "failed to be daemon. (%s)",
-				strerror(errno));
-		}
-#ifndef __linux__
-		/*
-		 * In case somebody has started inetd manually, we need to
-		 * clear the logname, so that old servers run as root do not
-		 * get the user's logname..
-		 */
-		if (setlogin("") < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"cannot clear logname: %s\n", strerror(errno));
-			/* no big deal if it fails.. */
-		}
-#endif
-		if (!f_local) {
-#if 0
-			if (atexit(cleanup_pidfile) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"cannot register pidfile cleanup");
-			}
-#endif
-		}
-	}
-
-	session();
-
-	exit(0);
-}
-
-#if 0
-static void
-cleanup_pidfile()
-{
-	pid_t p = getpid();
-
-	/* if it's not child process, clean everything */
-	if (racoon_pid == p) {
-		const char *pid_file = _PATH_VARRUN "racoon.pid";
-
-		(void) unlink(pid_file);
-	}
-}
-#endif
-
-static void
-parse(ac, av)
-	int ac;
-	char **av;
-{
-	extern char *optarg;
-	extern int optind;
-	int c;
-#ifdef YYDEBUG
-	extern int yydebug;
-#endif
-
-	pname = strrchr(*av, '/');
-	if (pname)
-		pname++;
-	else
-		pname = *av;
-
-	while ((c = getopt(ac, av, "dLFp:P:a:f:l:vZBC"
-#ifdef YYDEBUG
-			"y"
-#endif
-#ifdef INET6
-			"46"
-#endif
-			)) != -1) {
-		switch (c) {
-		case 'd':
-			loglevel++;
-			break;
-		case 'L':
-			print_location = 1;
-			break;
-		case 'F':
-			printf("Foreground mode.\n");
-			f_foreground = 1;
-			break;
-		case 'p':
-			lcconf->port_isakmp = atoi(optarg);
-			break;
-		case 'P':
-			lcconf->port_isakmp_natt = atoi(optarg);
-			break;
-		case 'a':
-#ifdef ENABLE_ADMINPORT
-			lcconf->port_admin = atoi(optarg);
-			break;
-#else
-			fprintf(stderr, "%s: the option is disabled "
-			    "in the configuration\n", pname);
-			exit(1);
-#endif
-		case 'f':
-			lcconf->racoon_conf = optarg;
-			break;
-		case 'l':
-			plogset(optarg);
-			break;
-		case 'v':
-			vflag++;
-			break;
-		case 'Z':
-			/*
-			 * only local test.
-			 * To specify -Z option and to choice a appropriate
-			 * port number for ISAKMP, you can launch some racoons
-			 * on the local host for debug.
-			 * pk_sendadd() on initiator side is always failed
-			 * even if this flag is used.  Because there is same
-			 * spi in the SAD which is inserted by pk_sendgetspi()
-			 * on responder side.
-			 */
-			printf("Local test mode.\n");
-			f_local = 1;
-			break;
-#ifdef YYDEBUG
-		case 'y':
-			yydebug = 1;
-			break;
-#endif
-#ifdef INET6
-		case '4':
-			lcconf->default_af = AF_INET;
-			break;
-		case '6':
-			lcconf->default_af = AF_INET6;
-			break;
-#endif
-		case 'B':
-			loading_sa++;
-			break;
-		case 'C':
-			dump_config++;
-			break;
-		default:
-			usage();
-			/* NOTREACHED */
-		}
-	}
-	ac -= optind;
-	av += optind;
-
-	if (ac != 0) {
-		usage();
-		/* NOTREACHED */
-	}
-
-	return;
-}
diff --git a/src/racoon/misc.c b/src/racoon/misc.c
deleted file mode 100644
index 18a4f19..0000000
--- a/src/racoon/misc.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*	$NetBSD: misc.c,v 1.4.6.1 2008/07/15 00:55:48 mgrooms Exp $	*/
-
-/*	$KAME: misc.c,v 1.23 2001/08/16 14:37:29 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <syslog.h>
-#include <ctype.h>
-
-#include "var.h"
-#include "misc.h"
-#include "debug.h"
-
-#if 0
-static int bindump __P((void *, size_t));
-
-static int
-bindump(buf0, len)
-        void *buf0;
-        size_t len;
-{
-	unsigned char *buf = (unsigned char *)buf0;
-	size_t i;
-
-	for (i = 0; i < len; i++) {
-		if ((buf[i] & 0x80) || !isprint(buf[i]))
-			printf("\\x%x", buf[i]);
-		else
-			printf("%c", buf[i]);
-	}
-	printf("\n");
-
-	return 0;
-}
-#endif
-
-int
-racoon_hexdump(buf0, len)
-	const void *buf0;
-	size_t len;
-{
-	const unsigned char *buf = buf0;
-	size_t i;
-
-	for (i = 0; i < len; i++) {
-		if (i != 0 && i % 32 == 0)
-			printf("\n");
-		if (i % 4 == 0)
-			printf(" ");
-		printf("%02x", buf[i]);
-	}
-	printf("\n");
-
-	return 0;
-}
-
-char *
-bit2str(n, bl)
-	int n, bl;
-{
-#define MAXBITLEN 128
-	static char b[MAXBITLEN + 1];
-	int i;
-
-	if (bl > MAXBITLEN)
-		return "Failed to convert.";	/* NG */
-	memset(b, '0', bl);
-	b[bl] = '\0';
-
-	for (i = 0; i < bl; i++) {
-		if (n & (1 << i))
-			b[bl - 1 - i] = '1';
-	}
-
-	return b;
-}
-
-const char *
-debug_location(file, line, func)
-	const char *file;
-	int line;
-	const char *func;
-{
-	static char buf[1024];
-	const char *p;
-
-	/* truncate pathname */
-	p = strrchr(file, '/');
-	if (p)
-		p++;
-	else
-		p = file;
-
-	if (func)
-		snprintf(buf, sizeof(buf), "%s:%d:%s()", p, line, func);
-	else
-		snprintf(buf, sizeof(buf), "%s:%d", p, line);
-
-	return buf;
-}
-
-/*
- * get file size.
- * -1: error occured.
- */
-int
-getfsize(path)
-	char *path;
-{
-        struct stat st;
-
-        if (stat(path, &st) != 0)
-                return -1;
-        else
-                return st.st_size;
-}
-
-/*
- * calculate the difference between two times.
- * t1: start
- * t2: end
- */
-double
-timedelta(t1, t2)
-	struct timeval *t1, *t2;
-{
-	if (t2->tv_usec >= t1->tv_usec)
-		return t2->tv_sec - t1->tv_sec +
-			(double)(t2->tv_usec - t1->tv_usec) / 1000000;
-
-	return t2->tv_sec - t1->tv_sec - 1 +
-		(double)(1000000 + t2->tv_usec - t1->tv_usec) / 1000000;
-}
diff --git a/src/racoon/misc.h b/src/racoon/misc.h
deleted file mode 100644
index 4979802..0000000
--- a/src/racoon/misc.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*	$NetBSD: misc.h,v 1.4.6.1 2008/07/15 00:55:48 mgrooms Exp $	*/
-
-/* Id: misc.h,v 1.9 2006/04/06 14:00:06 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _MISC_H
-#define _MISC_H
-
-#define BIT2STR(b) bit2str(b, sizeof(b)<<3)
-
-#ifdef HAVE_FUNC_MACRO
-#define LOCATION        debug_location(__FILE__, __LINE__, __func__)
-#else
-#define LOCATION        debug_location(__FILE__, __LINE__, NULL)
-#endif
-
-extern int racoon_hexdump __P((const void *, size_t));
-extern char *bit2str __P((int, int));
-extern void *get_newbuf __P((void *, size_t));
-extern const char *debug_location __P((const char *, int, const char *));
-extern int getfsize __P((char *));
-struct timeval;
-extern double timedelta __P((struct timeval *, struct timeval *));
-char *strdup __P((const char *));
-
-#if defined(__APPLE__) && defined(__MACH__)
-#define RACOON_TAILQ_FOREACH_REVERSE(var, head, headname ,field)	\
-  TAILQ_FOREACH_REVERSE(var, head, field, headname)
-#else
-#define RACOON_TAILQ_FOREACH_REVERSE(var, head, headname ,field)	\
-    TAILQ_FOREACH_REVERSE(var, head, headname, field)
-#endif
-
-#ifndef HAVE_STRLCPY
-#define strlcpy(d,s,l) (strncpy(d,s,l), (d)[(l)-1] = '\0')
-#endif
-
-#ifndef HAVE_STRLCAT
-#define strlcat(d,s,l) strncat(d,s,(l)-strlen(d)-1)
-#endif
-
-#define STRDUP_FATAL(x) if (x == NULL) {			\
-	plog(LLV_ERROR, LOCATION, NULL, "strdup failed\n");	\
-	exit(1);						\
-}
-
-#include "libpfkey.h"
-
-#endif /* _MISC_H */
diff --git a/src/racoon/missing/crypto/rijndael/boxes-fst.dat b/src/racoon/missing/crypto/rijndael/boxes-fst.dat
deleted file mode 100644
index 28d15d3..0000000
--- a/src/racoon/missing/crypto/rijndael/boxes-fst.dat
+++ /dev/null
@@ -1,957 +0,0 @@
-/*	$KAME: boxes-fst.dat,v 1.1.1.1 2001/08/08 09:56:27 sakane Exp $	*/
-
-const word8 S[256] = {
- 99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215, 171, 118, 
-202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 
-183, 253, 147,  38,  54,  63, 247, 204,  52, 165, 229, 241, 113, 216,  49,  21, 
-  4, 199,  35, 195,  24, 150,   5, 154,   7,  18, 128, 226, 235,  39, 178, 117, 
-  9, 131,  44,  26,  27, 110,  90, 160,  82,  59, 214, 179,  41, 227,  47, 132, 
- 83, 209,   0, 237,  32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 
-208, 239, 170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168, 
- 81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255, 243, 210, 
-205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61, 100,  93,  25, 115, 
- 96, 129,  79, 220,  34,  42, 144, 136,  70, 238, 184,  20, 222,  94,  11, 219, 
-224,  50,  58,  10,  73,   6,  36,  92, 194, 211, 172,  98, 145, 149, 228, 121, 
-231, 200,  55, 109, 141, 213,  78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 
-186, 120,  37,  46,  28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 
-112,  62, 181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158, 
-225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,  40, 223, 
-140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15, 176,  84, 187,  22
-};
-
-#ifdef INTERMEDIATE_VALUE_KAT
-static const word8 Si[256] = {
- 82,   9, 106, 213,  48,  54, 165,  56, 191,  64, 163, 158, 129, 243, 215, 251, 
-124, 227,  57, 130, 155,  47, 255, 135,  52, 142,  67,  68, 196, 222, 233, 203, 
- 84, 123, 148,  50, 166, 194,  35,  61, 238,  76, 149,  11,  66, 250, 195,  78, 
-  8,  46, 161, 102,  40, 217,  36, 178, 118,  91, 162,  73, 109, 139, 209,  37, 
-114, 248, 246, 100, 134, 104, 152,  22, 212, 164,  92, 204,  93, 101, 182, 146, 
-108, 112,  72,  80, 253, 237, 185, 218,  94,  21,  70,  87, 167, 141, 157, 132, 
-144, 216, 171,   0, 140, 188, 211,  10, 247, 228,  88,   5, 184, 179,  69,   6, 
-208,  44,  30, 143, 202,  63,  15,   2, 193, 175, 189,   3,   1,  19, 138, 107, 
- 58, 145,  17,  65,  79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 
-150, 172, 116,  34, 231, 173,  53, 133, 226, 249,  55, 232,  28, 117, 223, 110, 
- 71, 241,  26, 113,  29,  41, 197, 137, 111, 183,  98,  14, 170,  24, 190,  27, 
-252,  86,  62,  75, 198, 210, 121,  32, 154, 219, 192, 254, 120, 205,  90, 244, 
- 31, 221, 168,  51, 136,   7, 199,  49, 177,  18,  16,  89,  39, 128, 236,  95, 
- 96,  81, 127, 169,  25, 181,  74,  13,  45, 229, 122, 159, 147, 201, 156, 239, 
-160, 224,  59,  77, 174,  42, 245, 176, 200, 235, 187,  60, 131,  83, 153,  97, 
- 23,  43,   4, 126, 186, 119, 214,  38, 225, 105,  20,  99,  85,  33,  12, 125
-};
-#endif /* INTERMEDIATE_VALUE_KAT */
-
-union xtab {
-	word32	xt32[256];
-	word8	xt8[256][4];
-};
-
-static const union xtab xT1 = {
-	.xt8 = {
-{0xc6,0x63,0x63,0xa5}, {0xf8,0x7c,0x7c,0x84}, {0xee,0x77,0x77,0x99}, {0xf6,0x7b,0x7b,0x8d},
-{0xff,0xf2,0xf2,0x0d}, {0xd6,0x6b,0x6b,0xbd}, {0xde,0x6f,0x6f,0xb1}, {0x91,0xc5,0xc5,0x54},
-{0x60,0x30,0x30,0x50}, {0x02,0x01,0x01,0x03}, {0xce,0x67,0x67,0xa9}, {0x56,0x2b,0x2b,0x7d},
-{0xe7,0xfe,0xfe,0x19}, {0xb5,0xd7,0xd7,0x62}, {0x4d,0xab,0xab,0xe6}, {0xec,0x76,0x76,0x9a},
-{0x8f,0xca,0xca,0x45}, {0x1f,0x82,0x82,0x9d}, {0x89,0xc9,0xc9,0x40}, {0xfa,0x7d,0x7d,0x87},
-{0xef,0xfa,0xfa,0x15}, {0xb2,0x59,0x59,0xeb}, {0x8e,0x47,0x47,0xc9}, {0xfb,0xf0,0xf0,0x0b},
-{0x41,0xad,0xad,0xec}, {0xb3,0xd4,0xd4,0x67}, {0x5f,0xa2,0xa2,0xfd}, {0x45,0xaf,0xaf,0xea},
-{0x23,0x9c,0x9c,0xbf}, {0x53,0xa4,0xa4,0xf7}, {0xe4,0x72,0x72,0x96}, {0x9b,0xc0,0xc0,0x5b},
-{0x75,0xb7,0xb7,0xc2}, {0xe1,0xfd,0xfd,0x1c}, {0x3d,0x93,0x93,0xae}, {0x4c,0x26,0x26,0x6a},
-{0x6c,0x36,0x36,0x5a}, {0x7e,0x3f,0x3f,0x41}, {0xf5,0xf7,0xf7,0x02}, {0x83,0xcc,0xcc,0x4f},
-{0x68,0x34,0x34,0x5c}, {0x51,0xa5,0xa5,0xf4}, {0xd1,0xe5,0xe5,0x34}, {0xf9,0xf1,0xf1,0x08},
-{0xe2,0x71,0x71,0x93}, {0xab,0xd8,0xd8,0x73}, {0x62,0x31,0x31,0x53}, {0x2a,0x15,0x15,0x3f},
-{0x08,0x04,0x04,0x0c}, {0x95,0xc7,0xc7,0x52}, {0x46,0x23,0x23,0x65}, {0x9d,0xc3,0xc3,0x5e},
-{0x30,0x18,0x18,0x28}, {0x37,0x96,0x96,0xa1}, {0x0a,0x05,0x05,0x0f}, {0x2f,0x9a,0x9a,0xb5},
-{0x0e,0x07,0x07,0x09}, {0x24,0x12,0x12,0x36}, {0x1b,0x80,0x80,0x9b}, {0xdf,0xe2,0xe2,0x3d},
-{0xcd,0xeb,0xeb,0x26}, {0x4e,0x27,0x27,0x69}, {0x7f,0xb2,0xb2,0xcd}, {0xea,0x75,0x75,0x9f},
-{0x12,0x09,0x09,0x1b}, {0x1d,0x83,0x83,0x9e}, {0x58,0x2c,0x2c,0x74}, {0x34,0x1a,0x1a,0x2e},
-{0x36,0x1b,0x1b,0x2d}, {0xdc,0x6e,0x6e,0xb2}, {0xb4,0x5a,0x5a,0xee}, {0x5b,0xa0,0xa0,0xfb},
-{0xa4,0x52,0x52,0xf6}, {0x76,0x3b,0x3b,0x4d}, {0xb7,0xd6,0xd6,0x61}, {0x7d,0xb3,0xb3,0xce},
-{0x52,0x29,0x29,0x7b}, {0xdd,0xe3,0xe3,0x3e}, {0x5e,0x2f,0x2f,0x71}, {0x13,0x84,0x84,0x97},
-{0xa6,0x53,0x53,0xf5}, {0xb9,0xd1,0xd1,0x68}, {0x00,0x00,0x00,0x00}, {0xc1,0xed,0xed,0x2c},
-{0x40,0x20,0x20,0x60}, {0xe3,0xfc,0xfc,0x1f}, {0x79,0xb1,0xb1,0xc8}, {0xb6,0x5b,0x5b,0xed},
-{0xd4,0x6a,0x6a,0xbe}, {0x8d,0xcb,0xcb,0x46}, {0x67,0xbe,0xbe,0xd9}, {0x72,0x39,0x39,0x4b},
-{0x94,0x4a,0x4a,0xde}, {0x98,0x4c,0x4c,0xd4}, {0xb0,0x58,0x58,0xe8}, {0x85,0xcf,0xcf,0x4a},
-{0xbb,0xd0,0xd0,0x6b}, {0xc5,0xef,0xef,0x2a}, {0x4f,0xaa,0xaa,0xe5}, {0xed,0xfb,0xfb,0x16},
-{0x86,0x43,0x43,0xc5}, {0x9a,0x4d,0x4d,0xd7}, {0x66,0x33,0x33,0x55}, {0x11,0x85,0x85,0x94},
-{0x8a,0x45,0x45,0xcf}, {0xe9,0xf9,0xf9,0x10}, {0x04,0x02,0x02,0x06}, {0xfe,0x7f,0x7f,0x81},
-{0xa0,0x50,0x50,0xf0}, {0x78,0x3c,0x3c,0x44}, {0x25,0x9f,0x9f,0xba}, {0x4b,0xa8,0xa8,0xe3},
-{0xa2,0x51,0x51,0xf3}, {0x5d,0xa3,0xa3,0xfe}, {0x80,0x40,0x40,0xc0}, {0x05,0x8f,0x8f,0x8a},
-{0x3f,0x92,0x92,0xad}, {0x21,0x9d,0x9d,0xbc}, {0x70,0x38,0x38,0x48}, {0xf1,0xf5,0xf5,0x04},
-{0x63,0xbc,0xbc,0xdf}, {0x77,0xb6,0xb6,0xc1}, {0xaf,0xda,0xda,0x75}, {0x42,0x21,0x21,0x63},
-{0x20,0x10,0x10,0x30}, {0xe5,0xff,0xff,0x1a}, {0xfd,0xf3,0xf3,0x0e}, {0xbf,0xd2,0xd2,0x6d},
-{0x81,0xcd,0xcd,0x4c}, {0x18,0x0c,0x0c,0x14}, {0x26,0x13,0x13,0x35}, {0xc3,0xec,0xec,0x2f},
-{0xbe,0x5f,0x5f,0xe1}, {0x35,0x97,0x97,0xa2}, {0x88,0x44,0x44,0xcc}, {0x2e,0x17,0x17,0x39},
-{0x93,0xc4,0xc4,0x57}, {0x55,0xa7,0xa7,0xf2}, {0xfc,0x7e,0x7e,0x82}, {0x7a,0x3d,0x3d,0x47},
-{0xc8,0x64,0x64,0xac}, {0xba,0x5d,0x5d,0xe7}, {0x32,0x19,0x19,0x2b}, {0xe6,0x73,0x73,0x95},
-{0xc0,0x60,0x60,0xa0}, {0x19,0x81,0x81,0x98}, {0x9e,0x4f,0x4f,0xd1}, {0xa3,0xdc,0xdc,0x7f},
-{0x44,0x22,0x22,0x66}, {0x54,0x2a,0x2a,0x7e}, {0x3b,0x90,0x90,0xab}, {0x0b,0x88,0x88,0x83},
-{0x8c,0x46,0x46,0xca}, {0xc7,0xee,0xee,0x29}, {0x6b,0xb8,0xb8,0xd3}, {0x28,0x14,0x14,0x3c},
-{0xa7,0xde,0xde,0x79}, {0xbc,0x5e,0x5e,0xe2}, {0x16,0x0b,0x0b,0x1d}, {0xad,0xdb,0xdb,0x76},
-{0xdb,0xe0,0xe0,0x3b}, {0x64,0x32,0x32,0x56}, {0x74,0x3a,0x3a,0x4e}, {0x14,0x0a,0x0a,0x1e},
-{0x92,0x49,0x49,0xdb}, {0x0c,0x06,0x06,0x0a}, {0x48,0x24,0x24,0x6c}, {0xb8,0x5c,0x5c,0xe4},
-{0x9f,0xc2,0xc2,0x5d}, {0xbd,0xd3,0xd3,0x6e}, {0x43,0xac,0xac,0xef}, {0xc4,0x62,0x62,0xa6},
-{0x39,0x91,0x91,0xa8}, {0x31,0x95,0x95,0xa4}, {0xd3,0xe4,0xe4,0x37}, {0xf2,0x79,0x79,0x8b},
-{0xd5,0xe7,0xe7,0x32}, {0x8b,0xc8,0xc8,0x43}, {0x6e,0x37,0x37,0x59}, {0xda,0x6d,0x6d,0xb7},
-{0x01,0x8d,0x8d,0x8c}, {0xb1,0xd5,0xd5,0x64}, {0x9c,0x4e,0x4e,0xd2}, {0x49,0xa9,0xa9,0xe0},
-{0xd8,0x6c,0x6c,0xb4}, {0xac,0x56,0x56,0xfa}, {0xf3,0xf4,0xf4,0x07}, {0xcf,0xea,0xea,0x25},
-{0xca,0x65,0x65,0xaf}, {0xf4,0x7a,0x7a,0x8e}, {0x47,0xae,0xae,0xe9}, {0x10,0x08,0x08,0x18},
-{0x6f,0xba,0xba,0xd5}, {0xf0,0x78,0x78,0x88}, {0x4a,0x25,0x25,0x6f}, {0x5c,0x2e,0x2e,0x72},
-{0x38,0x1c,0x1c,0x24}, {0x57,0xa6,0xa6,0xf1}, {0x73,0xb4,0xb4,0xc7}, {0x97,0xc6,0xc6,0x51},
-{0xcb,0xe8,0xe8,0x23}, {0xa1,0xdd,0xdd,0x7c}, {0xe8,0x74,0x74,0x9c}, {0x3e,0x1f,0x1f,0x21},
-{0x96,0x4b,0x4b,0xdd}, {0x61,0xbd,0xbd,0xdc}, {0x0d,0x8b,0x8b,0x86}, {0x0f,0x8a,0x8a,0x85},
-{0xe0,0x70,0x70,0x90}, {0x7c,0x3e,0x3e,0x42}, {0x71,0xb5,0xb5,0xc4}, {0xcc,0x66,0x66,0xaa},
-{0x90,0x48,0x48,0xd8}, {0x06,0x03,0x03,0x05}, {0xf7,0xf6,0xf6,0x01}, {0x1c,0x0e,0x0e,0x12},
-{0xc2,0x61,0x61,0xa3}, {0x6a,0x35,0x35,0x5f}, {0xae,0x57,0x57,0xf9}, {0x69,0xb9,0xb9,0xd0},
-{0x17,0x86,0x86,0x91}, {0x99,0xc1,0xc1,0x58}, {0x3a,0x1d,0x1d,0x27}, {0x27,0x9e,0x9e,0xb9},
-{0xd9,0xe1,0xe1,0x38}, {0xeb,0xf8,0xf8,0x13}, {0x2b,0x98,0x98,0xb3}, {0x22,0x11,0x11,0x33},
-{0xd2,0x69,0x69,0xbb}, {0xa9,0xd9,0xd9,0x70}, {0x07,0x8e,0x8e,0x89}, {0x33,0x94,0x94,0xa7},
-{0x2d,0x9b,0x9b,0xb6}, {0x3c,0x1e,0x1e,0x22}, {0x15,0x87,0x87,0x92}, {0xc9,0xe9,0xe9,0x20},
-{0x87,0xce,0xce,0x49}, {0xaa,0x55,0x55,0xff}, {0x50,0x28,0x28,0x78}, {0xa5,0xdf,0xdf,0x7a},
-{0x03,0x8c,0x8c,0x8f}, {0x59,0xa1,0xa1,0xf8}, {0x09,0x89,0x89,0x80}, {0x1a,0x0d,0x0d,0x17},
-{0x65,0xbf,0xbf,0xda}, {0xd7,0xe6,0xe6,0x31}, {0x84,0x42,0x42,0xc6}, {0xd0,0x68,0x68,0xb8},
-{0x82,0x41,0x41,0xc3}, {0x29,0x99,0x99,0xb0}, {0x5a,0x2d,0x2d,0x77}, {0x1e,0x0f,0x0f,0x11},
-{0x7b,0xb0,0xb0,0xcb}, {0xa8,0x54,0x54,0xfc}, {0x6d,0xbb,0xbb,0xd6}, {0x2c,0x16,0x16,0x3a}
-	}
-};
-#define	T1	xT1.xt8
-
-static const union xtab xT2 = {
-	.xt8 = {
-{0xa5,0xc6,0x63,0x63}, {0x84,0xf8,0x7c,0x7c}, {0x99,0xee,0x77,0x77}, {0x8d,0xf6,0x7b,0x7b},
-{0x0d,0xff,0xf2,0xf2}, {0xbd,0xd6,0x6b,0x6b}, {0xb1,0xde,0x6f,0x6f}, {0x54,0x91,0xc5,0xc5},
-{0x50,0x60,0x30,0x30}, {0x03,0x02,0x01,0x01}, {0xa9,0xce,0x67,0x67}, {0x7d,0x56,0x2b,0x2b},
-{0x19,0xe7,0xfe,0xfe}, {0x62,0xb5,0xd7,0xd7}, {0xe6,0x4d,0xab,0xab}, {0x9a,0xec,0x76,0x76},
-{0x45,0x8f,0xca,0xca}, {0x9d,0x1f,0x82,0x82}, {0x40,0x89,0xc9,0xc9}, {0x87,0xfa,0x7d,0x7d},
-{0x15,0xef,0xfa,0xfa}, {0xeb,0xb2,0x59,0x59}, {0xc9,0x8e,0x47,0x47}, {0x0b,0xfb,0xf0,0xf0},
-{0xec,0x41,0xad,0xad}, {0x67,0xb3,0xd4,0xd4}, {0xfd,0x5f,0xa2,0xa2}, {0xea,0x45,0xaf,0xaf},
-{0xbf,0x23,0x9c,0x9c}, {0xf7,0x53,0xa4,0xa4}, {0x96,0xe4,0x72,0x72}, {0x5b,0x9b,0xc0,0xc0},
-{0xc2,0x75,0xb7,0xb7}, {0x1c,0xe1,0xfd,0xfd}, {0xae,0x3d,0x93,0x93}, {0x6a,0x4c,0x26,0x26},
-{0x5a,0x6c,0x36,0x36}, {0x41,0x7e,0x3f,0x3f}, {0x02,0xf5,0xf7,0xf7}, {0x4f,0x83,0xcc,0xcc},
-{0x5c,0x68,0x34,0x34}, {0xf4,0x51,0xa5,0xa5}, {0x34,0xd1,0xe5,0xe5}, {0x08,0xf9,0xf1,0xf1},
-{0x93,0xe2,0x71,0x71}, {0x73,0xab,0xd8,0xd8}, {0x53,0x62,0x31,0x31}, {0x3f,0x2a,0x15,0x15},
-{0x0c,0x08,0x04,0x04}, {0x52,0x95,0xc7,0xc7}, {0x65,0x46,0x23,0x23}, {0x5e,0x9d,0xc3,0xc3},
-{0x28,0x30,0x18,0x18}, {0xa1,0x37,0x96,0x96}, {0x0f,0x0a,0x05,0x05}, {0xb5,0x2f,0x9a,0x9a},
-{0x09,0x0e,0x07,0x07}, {0x36,0x24,0x12,0x12}, {0x9b,0x1b,0x80,0x80}, {0x3d,0xdf,0xe2,0xe2},
-{0x26,0xcd,0xeb,0xeb}, {0x69,0x4e,0x27,0x27}, {0xcd,0x7f,0xb2,0xb2}, {0x9f,0xea,0x75,0x75},
-{0x1b,0x12,0x09,0x09}, {0x9e,0x1d,0x83,0x83}, {0x74,0x58,0x2c,0x2c}, {0x2e,0x34,0x1a,0x1a},
-{0x2d,0x36,0x1b,0x1b}, {0xb2,0xdc,0x6e,0x6e}, {0xee,0xb4,0x5a,0x5a}, {0xfb,0x5b,0xa0,0xa0},
-{0xf6,0xa4,0x52,0x52}, {0x4d,0x76,0x3b,0x3b}, {0x61,0xb7,0xd6,0xd6}, {0xce,0x7d,0xb3,0xb3},
-{0x7b,0x52,0x29,0x29}, {0x3e,0xdd,0xe3,0xe3}, {0x71,0x5e,0x2f,0x2f}, {0x97,0x13,0x84,0x84},
-{0xf5,0xa6,0x53,0x53}, {0x68,0xb9,0xd1,0xd1}, {0x00,0x00,0x00,0x00}, {0x2c,0xc1,0xed,0xed},
-{0x60,0x40,0x20,0x20}, {0x1f,0xe3,0xfc,0xfc}, {0xc8,0x79,0xb1,0xb1}, {0xed,0xb6,0x5b,0x5b},
-{0xbe,0xd4,0x6a,0x6a}, {0x46,0x8d,0xcb,0xcb}, {0xd9,0x67,0xbe,0xbe}, {0x4b,0x72,0x39,0x39},
-{0xde,0x94,0x4a,0x4a}, {0xd4,0x98,0x4c,0x4c}, {0xe8,0xb0,0x58,0x58}, {0x4a,0x85,0xcf,0xcf},
-{0x6b,0xbb,0xd0,0xd0}, {0x2a,0xc5,0xef,0xef}, {0xe5,0x4f,0xaa,0xaa}, {0x16,0xed,0xfb,0xfb},
-{0xc5,0x86,0x43,0x43}, {0xd7,0x9a,0x4d,0x4d}, {0x55,0x66,0x33,0x33}, {0x94,0x11,0x85,0x85},
-{0xcf,0x8a,0x45,0x45}, {0x10,0xe9,0xf9,0xf9}, {0x06,0x04,0x02,0x02}, {0x81,0xfe,0x7f,0x7f},
-{0xf0,0xa0,0x50,0x50}, {0x44,0x78,0x3c,0x3c}, {0xba,0x25,0x9f,0x9f}, {0xe3,0x4b,0xa8,0xa8},
-{0xf3,0xa2,0x51,0x51}, {0xfe,0x5d,0xa3,0xa3}, {0xc0,0x80,0x40,0x40}, {0x8a,0x05,0x8f,0x8f},
-{0xad,0x3f,0x92,0x92}, {0xbc,0x21,0x9d,0x9d}, {0x48,0x70,0x38,0x38}, {0x04,0xf1,0xf5,0xf5},
-{0xdf,0x63,0xbc,0xbc}, {0xc1,0x77,0xb6,0xb6}, {0x75,0xaf,0xda,0xda}, {0x63,0x42,0x21,0x21},
-{0x30,0x20,0x10,0x10}, {0x1a,0xe5,0xff,0xff}, {0x0e,0xfd,0xf3,0xf3}, {0x6d,0xbf,0xd2,0xd2},
-{0x4c,0x81,0xcd,0xcd}, {0x14,0x18,0x0c,0x0c}, {0x35,0x26,0x13,0x13}, {0x2f,0xc3,0xec,0xec},
-{0xe1,0xbe,0x5f,0x5f}, {0xa2,0x35,0x97,0x97}, {0xcc,0x88,0x44,0x44}, {0x39,0x2e,0x17,0x17},
-{0x57,0x93,0xc4,0xc4}, {0xf2,0x55,0xa7,0xa7}, {0x82,0xfc,0x7e,0x7e}, {0x47,0x7a,0x3d,0x3d},
-{0xac,0xc8,0x64,0x64}, {0xe7,0xba,0x5d,0x5d}, {0x2b,0x32,0x19,0x19}, {0x95,0xe6,0x73,0x73},
-{0xa0,0xc0,0x60,0x60}, {0x98,0x19,0x81,0x81}, {0xd1,0x9e,0x4f,0x4f}, {0x7f,0xa3,0xdc,0xdc},
-{0x66,0x44,0x22,0x22}, {0x7e,0x54,0x2a,0x2a}, {0xab,0x3b,0x90,0x90}, {0x83,0x0b,0x88,0x88},
-{0xca,0x8c,0x46,0x46}, {0x29,0xc7,0xee,0xee}, {0xd3,0x6b,0xb8,0xb8}, {0x3c,0x28,0x14,0x14},
-{0x79,0xa7,0xde,0xde}, {0xe2,0xbc,0x5e,0x5e}, {0x1d,0x16,0x0b,0x0b}, {0x76,0xad,0xdb,0xdb},
-{0x3b,0xdb,0xe0,0xe0}, {0x56,0x64,0x32,0x32}, {0x4e,0x74,0x3a,0x3a}, {0x1e,0x14,0x0a,0x0a},
-{0xdb,0x92,0x49,0x49}, {0x0a,0x0c,0x06,0x06}, {0x6c,0x48,0x24,0x24}, {0xe4,0xb8,0x5c,0x5c},
-{0x5d,0x9f,0xc2,0xc2}, {0x6e,0xbd,0xd3,0xd3}, {0xef,0x43,0xac,0xac}, {0xa6,0xc4,0x62,0x62},
-{0xa8,0x39,0x91,0x91}, {0xa4,0x31,0x95,0x95}, {0x37,0xd3,0xe4,0xe4}, {0x8b,0xf2,0x79,0x79},
-{0x32,0xd5,0xe7,0xe7}, {0x43,0x8b,0xc8,0xc8}, {0x59,0x6e,0x37,0x37}, {0xb7,0xda,0x6d,0x6d},
-{0x8c,0x01,0x8d,0x8d}, {0x64,0xb1,0xd5,0xd5}, {0xd2,0x9c,0x4e,0x4e}, {0xe0,0x49,0xa9,0xa9},
-{0xb4,0xd8,0x6c,0x6c}, {0xfa,0xac,0x56,0x56}, {0x07,0xf3,0xf4,0xf4}, {0x25,0xcf,0xea,0xea},
-{0xaf,0xca,0x65,0x65}, {0x8e,0xf4,0x7a,0x7a}, {0xe9,0x47,0xae,0xae}, {0x18,0x10,0x08,0x08},
-{0xd5,0x6f,0xba,0xba}, {0x88,0xf0,0x78,0x78}, {0x6f,0x4a,0x25,0x25}, {0x72,0x5c,0x2e,0x2e},
-{0x24,0x38,0x1c,0x1c}, {0xf1,0x57,0xa6,0xa6}, {0xc7,0x73,0xb4,0xb4}, {0x51,0x97,0xc6,0xc6},
-{0x23,0xcb,0xe8,0xe8}, {0x7c,0xa1,0xdd,0xdd}, {0x9c,0xe8,0x74,0x74}, {0x21,0x3e,0x1f,0x1f},
-{0xdd,0x96,0x4b,0x4b}, {0xdc,0x61,0xbd,0xbd}, {0x86,0x0d,0x8b,0x8b}, {0x85,0x0f,0x8a,0x8a},
-{0x90,0xe0,0x70,0x70}, {0x42,0x7c,0x3e,0x3e}, {0xc4,0x71,0xb5,0xb5}, {0xaa,0xcc,0x66,0x66},
-{0xd8,0x90,0x48,0x48}, {0x05,0x06,0x03,0x03}, {0x01,0xf7,0xf6,0xf6}, {0x12,0x1c,0x0e,0x0e},
-{0xa3,0xc2,0x61,0x61}, {0x5f,0x6a,0x35,0x35}, {0xf9,0xae,0x57,0x57}, {0xd0,0x69,0xb9,0xb9},
-{0x91,0x17,0x86,0x86}, {0x58,0x99,0xc1,0xc1}, {0x27,0x3a,0x1d,0x1d}, {0xb9,0x27,0x9e,0x9e},
-{0x38,0xd9,0xe1,0xe1}, {0x13,0xeb,0xf8,0xf8}, {0xb3,0x2b,0x98,0x98}, {0x33,0x22,0x11,0x11},
-{0xbb,0xd2,0x69,0x69}, {0x70,0xa9,0xd9,0xd9}, {0x89,0x07,0x8e,0x8e}, {0xa7,0x33,0x94,0x94},
-{0xb6,0x2d,0x9b,0x9b}, {0x22,0x3c,0x1e,0x1e}, {0x92,0x15,0x87,0x87}, {0x20,0xc9,0xe9,0xe9},
-{0x49,0x87,0xce,0xce}, {0xff,0xaa,0x55,0x55}, {0x78,0x50,0x28,0x28}, {0x7a,0xa5,0xdf,0xdf},
-{0x8f,0x03,0x8c,0x8c}, {0xf8,0x59,0xa1,0xa1}, {0x80,0x09,0x89,0x89}, {0x17,0x1a,0x0d,0x0d},
-{0xda,0x65,0xbf,0xbf}, {0x31,0xd7,0xe6,0xe6}, {0xc6,0x84,0x42,0x42}, {0xb8,0xd0,0x68,0x68},
-{0xc3,0x82,0x41,0x41}, {0xb0,0x29,0x99,0x99}, {0x77,0x5a,0x2d,0x2d}, {0x11,0x1e,0x0f,0x0f},
-{0xcb,0x7b,0xb0,0xb0}, {0xfc,0xa8,0x54,0x54}, {0xd6,0x6d,0xbb,0xbb}, {0x3a,0x2c,0x16,0x16}
-	}
-};
-#define	T2	xT2.xt8
-
-static const union xtab xT3 = {
-	.xt8 = {
-{0x63,0xa5,0xc6,0x63}, {0x7c,0x84,0xf8,0x7c}, {0x77,0x99,0xee,0x77}, {0x7b,0x8d,0xf6,0x7b},
-{0xf2,0x0d,0xff,0xf2}, {0x6b,0xbd,0xd6,0x6b}, {0x6f,0xb1,0xde,0x6f}, {0xc5,0x54,0x91,0xc5},
-{0x30,0x50,0x60,0x30}, {0x01,0x03,0x02,0x01}, {0x67,0xa9,0xce,0x67}, {0x2b,0x7d,0x56,0x2b},
-{0xfe,0x19,0xe7,0xfe}, {0xd7,0x62,0xb5,0xd7}, {0xab,0xe6,0x4d,0xab}, {0x76,0x9a,0xec,0x76},
-{0xca,0x45,0x8f,0xca}, {0x82,0x9d,0x1f,0x82}, {0xc9,0x40,0x89,0xc9}, {0x7d,0x87,0xfa,0x7d},
-{0xfa,0x15,0xef,0xfa}, {0x59,0xeb,0xb2,0x59}, {0x47,0xc9,0x8e,0x47}, {0xf0,0x0b,0xfb,0xf0},
-{0xad,0xec,0x41,0xad}, {0xd4,0x67,0xb3,0xd4}, {0xa2,0xfd,0x5f,0xa2}, {0xaf,0xea,0x45,0xaf},
-{0x9c,0xbf,0x23,0x9c}, {0xa4,0xf7,0x53,0xa4}, {0x72,0x96,0xe4,0x72}, {0xc0,0x5b,0x9b,0xc0},
-{0xb7,0xc2,0x75,0xb7}, {0xfd,0x1c,0xe1,0xfd}, {0x93,0xae,0x3d,0x93}, {0x26,0x6a,0x4c,0x26},
-{0x36,0x5a,0x6c,0x36}, {0x3f,0x41,0x7e,0x3f}, {0xf7,0x02,0xf5,0xf7}, {0xcc,0x4f,0x83,0xcc},
-{0x34,0x5c,0x68,0x34}, {0xa5,0xf4,0x51,0xa5}, {0xe5,0x34,0xd1,0xe5}, {0xf1,0x08,0xf9,0xf1},
-{0x71,0x93,0xe2,0x71}, {0xd8,0x73,0xab,0xd8}, {0x31,0x53,0x62,0x31}, {0x15,0x3f,0x2a,0x15},
-{0x04,0x0c,0x08,0x04}, {0xc7,0x52,0x95,0xc7}, {0x23,0x65,0x46,0x23}, {0xc3,0x5e,0x9d,0xc3},
-{0x18,0x28,0x30,0x18}, {0x96,0xa1,0x37,0x96}, {0x05,0x0f,0x0a,0x05}, {0x9a,0xb5,0x2f,0x9a},
-{0x07,0x09,0x0e,0x07}, {0x12,0x36,0x24,0x12}, {0x80,0x9b,0x1b,0x80}, {0xe2,0x3d,0xdf,0xe2},
-{0xeb,0x26,0xcd,0xeb}, {0x27,0x69,0x4e,0x27}, {0xb2,0xcd,0x7f,0xb2}, {0x75,0x9f,0xea,0x75},
-{0x09,0x1b,0x12,0x09}, {0x83,0x9e,0x1d,0x83}, {0x2c,0x74,0x58,0x2c}, {0x1a,0x2e,0x34,0x1a},
-{0x1b,0x2d,0x36,0x1b}, {0x6e,0xb2,0xdc,0x6e}, {0x5a,0xee,0xb4,0x5a}, {0xa0,0xfb,0x5b,0xa0},
-{0x52,0xf6,0xa4,0x52}, {0x3b,0x4d,0x76,0x3b}, {0xd6,0x61,0xb7,0xd6}, {0xb3,0xce,0x7d,0xb3},
-{0x29,0x7b,0x52,0x29}, {0xe3,0x3e,0xdd,0xe3}, {0x2f,0x71,0x5e,0x2f}, {0x84,0x97,0x13,0x84},
-{0x53,0xf5,0xa6,0x53}, {0xd1,0x68,0xb9,0xd1}, {0x00,0x00,0x00,0x00}, {0xed,0x2c,0xc1,0xed},
-{0x20,0x60,0x40,0x20}, {0xfc,0x1f,0xe3,0xfc}, {0xb1,0xc8,0x79,0xb1}, {0x5b,0xed,0xb6,0x5b},
-{0x6a,0xbe,0xd4,0x6a}, {0xcb,0x46,0x8d,0xcb}, {0xbe,0xd9,0x67,0xbe}, {0x39,0x4b,0x72,0x39},
-{0x4a,0xde,0x94,0x4a}, {0x4c,0xd4,0x98,0x4c}, {0x58,0xe8,0xb0,0x58}, {0xcf,0x4a,0x85,0xcf},
-{0xd0,0x6b,0xbb,0xd0}, {0xef,0x2a,0xc5,0xef}, {0xaa,0xe5,0x4f,0xaa}, {0xfb,0x16,0xed,0xfb},
-{0x43,0xc5,0x86,0x43}, {0x4d,0xd7,0x9a,0x4d}, {0x33,0x55,0x66,0x33}, {0x85,0x94,0x11,0x85},
-{0x45,0xcf,0x8a,0x45}, {0xf9,0x10,0xe9,0xf9}, {0x02,0x06,0x04,0x02}, {0x7f,0x81,0xfe,0x7f},
-{0x50,0xf0,0xa0,0x50}, {0x3c,0x44,0x78,0x3c}, {0x9f,0xba,0x25,0x9f}, {0xa8,0xe3,0x4b,0xa8},
-{0x51,0xf3,0xa2,0x51}, {0xa3,0xfe,0x5d,0xa3}, {0x40,0xc0,0x80,0x40}, {0x8f,0x8a,0x05,0x8f},
-{0x92,0xad,0x3f,0x92}, {0x9d,0xbc,0x21,0x9d}, {0x38,0x48,0x70,0x38}, {0xf5,0x04,0xf1,0xf5},
-{0xbc,0xdf,0x63,0xbc}, {0xb6,0xc1,0x77,0xb6}, {0xda,0x75,0xaf,0xda}, {0x21,0x63,0x42,0x21},
-{0x10,0x30,0x20,0x10}, {0xff,0x1a,0xe5,0xff}, {0xf3,0x0e,0xfd,0xf3}, {0xd2,0x6d,0xbf,0xd2},
-{0xcd,0x4c,0x81,0xcd}, {0x0c,0x14,0x18,0x0c}, {0x13,0x35,0x26,0x13}, {0xec,0x2f,0xc3,0xec},
-{0x5f,0xe1,0xbe,0x5f}, {0x97,0xa2,0x35,0x97}, {0x44,0xcc,0x88,0x44}, {0x17,0x39,0x2e,0x17},
-{0xc4,0x57,0x93,0xc4}, {0xa7,0xf2,0x55,0xa7}, {0x7e,0x82,0xfc,0x7e}, {0x3d,0x47,0x7a,0x3d},
-{0x64,0xac,0xc8,0x64}, {0x5d,0xe7,0xba,0x5d}, {0x19,0x2b,0x32,0x19}, {0x73,0x95,0xe6,0x73},
-{0x60,0xa0,0xc0,0x60}, {0x81,0x98,0x19,0x81}, {0x4f,0xd1,0x9e,0x4f}, {0xdc,0x7f,0xa3,0xdc},
-{0x22,0x66,0x44,0x22}, {0x2a,0x7e,0x54,0x2a}, {0x90,0xab,0x3b,0x90}, {0x88,0x83,0x0b,0x88},
-{0x46,0xca,0x8c,0x46}, {0xee,0x29,0xc7,0xee}, {0xb8,0xd3,0x6b,0xb8}, {0x14,0x3c,0x28,0x14},
-{0xde,0x79,0xa7,0xde}, {0x5e,0xe2,0xbc,0x5e}, {0x0b,0x1d,0x16,0x0b}, {0xdb,0x76,0xad,0xdb},
-{0xe0,0x3b,0xdb,0xe0}, {0x32,0x56,0x64,0x32}, {0x3a,0x4e,0x74,0x3a}, {0x0a,0x1e,0x14,0x0a},
-{0x49,0xdb,0x92,0x49}, {0x06,0x0a,0x0c,0x06}, {0x24,0x6c,0x48,0x24}, {0x5c,0xe4,0xb8,0x5c},
-{0xc2,0x5d,0x9f,0xc2}, {0xd3,0x6e,0xbd,0xd3}, {0xac,0xef,0x43,0xac}, {0x62,0xa6,0xc4,0x62},
-{0x91,0xa8,0x39,0x91}, {0x95,0xa4,0x31,0x95}, {0xe4,0x37,0xd3,0xe4}, {0x79,0x8b,0xf2,0x79},
-{0xe7,0x32,0xd5,0xe7}, {0xc8,0x43,0x8b,0xc8}, {0x37,0x59,0x6e,0x37}, {0x6d,0xb7,0xda,0x6d},
-{0x8d,0x8c,0x01,0x8d}, {0xd5,0x64,0xb1,0xd5}, {0x4e,0xd2,0x9c,0x4e}, {0xa9,0xe0,0x49,0xa9},
-{0x6c,0xb4,0xd8,0x6c}, {0x56,0xfa,0xac,0x56}, {0xf4,0x07,0xf3,0xf4}, {0xea,0x25,0xcf,0xea},
-{0x65,0xaf,0xca,0x65}, {0x7a,0x8e,0xf4,0x7a}, {0xae,0xe9,0x47,0xae}, {0x08,0x18,0x10,0x08},
-{0xba,0xd5,0x6f,0xba}, {0x78,0x88,0xf0,0x78}, {0x25,0x6f,0x4a,0x25}, {0x2e,0x72,0x5c,0x2e},
-{0x1c,0x24,0x38,0x1c}, {0xa6,0xf1,0x57,0xa6}, {0xb4,0xc7,0x73,0xb4}, {0xc6,0x51,0x97,0xc6},
-{0xe8,0x23,0xcb,0xe8}, {0xdd,0x7c,0xa1,0xdd}, {0x74,0x9c,0xe8,0x74}, {0x1f,0x21,0x3e,0x1f},
-{0x4b,0xdd,0x96,0x4b}, {0xbd,0xdc,0x61,0xbd}, {0x8b,0x86,0x0d,0x8b}, {0x8a,0x85,0x0f,0x8a},
-{0x70,0x90,0xe0,0x70}, {0x3e,0x42,0x7c,0x3e}, {0xb5,0xc4,0x71,0xb5}, {0x66,0xaa,0xcc,0x66},
-{0x48,0xd8,0x90,0x48}, {0x03,0x05,0x06,0x03}, {0xf6,0x01,0xf7,0xf6}, {0x0e,0x12,0x1c,0x0e},
-{0x61,0xa3,0xc2,0x61}, {0x35,0x5f,0x6a,0x35}, {0x57,0xf9,0xae,0x57}, {0xb9,0xd0,0x69,0xb9},
-{0x86,0x91,0x17,0x86}, {0xc1,0x58,0x99,0xc1}, {0x1d,0x27,0x3a,0x1d}, {0x9e,0xb9,0x27,0x9e},
-{0xe1,0x38,0xd9,0xe1}, {0xf8,0x13,0xeb,0xf8}, {0x98,0xb3,0x2b,0x98}, {0x11,0x33,0x22,0x11},
-{0x69,0xbb,0xd2,0x69}, {0xd9,0x70,0xa9,0xd9}, {0x8e,0x89,0x07,0x8e}, {0x94,0xa7,0x33,0x94},
-{0x9b,0xb6,0x2d,0x9b}, {0x1e,0x22,0x3c,0x1e}, {0x87,0x92,0x15,0x87}, {0xe9,0x20,0xc9,0xe9},
-{0xce,0x49,0x87,0xce}, {0x55,0xff,0xaa,0x55}, {0x28,0x78,0x50,0x28}, {0xdf,0x7a,0xa5,0xdf},
-{0x8c,0x8f,0x03,0x8c}, {0xa1,0xf8,0x59,0xa1}, {0x89,0x80,0x09,0x89}, {0x0d,0x17,0x1a,0x0d},
-{0xbf,0xda,0x65,0xbf}, {0xe6,0x31,0xd7,0xe6}, {0x42,0xc6,0x84,0x42}, {0x68,0xb8,0xd0,0x68},
-{0x41,0xc3,0x82,0x41}, {0x99,0xb0,0x29,0x99}, {0x2d,0x77,0x5a,0x2d}, {0x0f,0x11,0x1e,0x0f},
-{0xb0,0xcb,0x7b,0xb0}, {0x54,0xfc,0xa8,0x54}, {0xbb,0xd6,0x6d,0xbb}, {0x16,0x3a,0x2c,0x16}
-	}
-};
-#define	T3	xT3.xt8
-
-static const union xtab xT4 = {
-	.xt8 = {
-{0x63,0x63,0xa5,0xc6}, {0x7c,0x7c,0x84,0xf8}, {0x77,0x77,0x99,0xee}, {0x7b,0x7b,0x8d,0xf6},
-{0xf2,0xf2,0x0d,0xff}, {0x6b,0x6b,0xbd,0xd6}, {0x6f,0x6f,0xb1,0xde}, {0xc5,0xc5,0x54,0x91},
-{0x30,0x30,0x50,0x60}, {0x01,0x01,0x03,0x02}, {0x67,0x67,0xa9,0xce}, {0x2b,0x2b,0x7d,0x56},
-{0xfe,0xfe,0x19,0xe7}, {0xd7,0xd7,0x62,0xb5}, {0xab,0xab,0xe6,0x4d}, {0x76,0x76,0x9a,0xec},
-{0xca,0xca,0x45,0x8f}, {0x82,0x82,0x9d,0x1f}, {0xc9,0xc9,0x40,0x89}, {0x7d,0x7d,0x87,0xfa},
-{0xfa,0xfa,0x15,0xef}, {0x59,0x59,0xeb,0xb2}, {0x47,0x47,0xc9,0x8e}, {0xf0,0xf0,0x0b,0xfb},
-{0xad,0xad,0xec,0x41}, {0xd4,0xd4,0x67,0xb3}, {0xa2,0xa2,0xfd,0x5f}, {0xaf,0xaf,0xea,0x45},
-{0x9c,0x9c,0xbf,0x23}, {0xa4,0xa4,0xf7,0x53}, {0x72,0x72,0x96,0xe4}, {0xc0,0xc0,0x5b,0x9b},
-{0xb7,0xb7,0xc2,0x75}, {0xfd,0xfd,0x1c,0xe1}, {0x93,0x93,0xae,0x3d}, {0x26,0x26,0x6a,0x4c},
-{0x36,0x36,0x5a,0x6c}, {0x3f,0x3f,0x41,0x7e}, {0xf7,0xf7,0x02,0xf5}, {0xcc,0xcc,0x4f,0x83},
-{0x34,0x34,0x5c,0x68}, {0xa5,0xa5,0xf4,0x51}, {0xe5,0xe5,0x34,0xd1}, {0xf1,0xf1,0x08,0xf9},
-{0x71,0x71,0x93,0xe2}, {0xd8,0xd8,0x73,0xab}, {0x31,0x31,0x53,0x62}, {0x15,0x15,0x3f,0x2a},
-{0x04,0x04,0x0c,0x08}, {0xc7,0xc7,0x52,0x95}, {0x23,0x23,0x65,0x46}, {0xc3,0xc3,0x5e,0x9d},
-{0x18,0x18,0x28,0x30}, {0x96,0x96,0xa1,0x37}, {0x05,0x05,0x0f,0x0a}, {0x9a,0x9a,0xb5,0x2f},
-{0x07,0x07,0x09,0x0e}, {0x12,0x12,0x36,0x24}, {0x80,0x80,0x9b,0x1b}, {0xe2,0xe2,0x3d,0xdf},
-{0xeb,0xeb,0x26,0xcd}, {0x27,0x27,0x69,0x4e}, {0xb2,0xb2,0xcd,0x7f}, {0x75,0x75,0x9f,0xea},
-{0x09,0x09,0x1b,0x12}, {0x83,0x83,0x9e,0x1d}, {0x2c,0x2c,0x74,0x58}, {0x1a,0x1a,0x2e,0x34},
-{0x1b,0x1b,0x2d,0x36}, {0x6e,0x6e,0xb2,0xdc}, {0x5a,0x5a,0xee,0xb4}, {0xa0,0xa0,0xfb,0x5b},
-{0x52,0x52,0xf6,0xa4}, {0x3b,0x3b,0x4d,0x76}, {0xd6,0xd6,0x61,0xb7}, {0xb3,0xb3,0xce,0x7d},
-{0x29,0x29,0x7b,0x52}, {0xe3,0xe3,0x3e,0xdd}, {0x2f,0x2f,0x71,0x5e}, {0x84,0x84,0x97,0x13},
-{0x53,0x53,0xf5,0xa6}, {0xd1,0xd1,0x68,0xb9}, {0x00,0x00,0x00,0x00}, {0xed,0xed,0x2c,0xc1},
-{0x20,0x20,0x60,0x40}, {0xfc,0xfc,0x1f,0xe3}, {0xb1,0xb1,0xc8,0x79}, {0x5b,0x5b,0xed,0xb6},
-{0x6a,0x6a,0xbe,0xd4}, {0xcb,0xcb,0x46,0x8d}, {0xbe,0xbe,0xd9,0x67}, {0x39,0x39,0x4b,0x72},
-{0x4a,0x4a,0xde,0x94}, {0x4c,0x4c,0xd4,0x98}, {0x58,0x58,0xe8,0xb0}, {0xcf,0xcf,0x4a,0x85},
-{0xd0,0xd0,0x6b,0xbb}, {0xef,0xef,0x2a,0xc5}, {0xaa,0xaa,0xe5,0x4f}, {0xfb,0xfb,0x16,0xed},
-{0x43,0x43,0xc5,0x86}, {0x4d,0x4d,0xd7,0x9a}, {0x33,0x33,0x55,0x66}, {0x85,0x85,0x94,0x11},
-{0x45,0x45,0xcf,0x8a}, {0xf9,0xf9,0x10,0xe9}, {0x02,0x02,0x06,0x04}, {0x7f,0x7f,0x81,0xfe},
-{0x50,0x50,0xf0,0xa0}, {0x3c,0x3c,0x44,0x78}, {0x9f,0x9f,0xba,0x25}, {0xa8,0xa8,0xe3,0x4b},
-{0x51,0x51,0xf3,0xa2}, {0xa3,0xa3,0xfe,0x5d}, {0x40,0x40,0xc0,0x80}, {0x8f,0x8f,0x8a,0x05},
-{0x92,0x92,0xad,0x3f}, {0x9d,0x9d,0xbc,0x21}, {0x38,0x38,0x48,0x70}, {0xf5,0xf5,0x04,0xf1},
-{0xbc,0xbc,0xdf,0x63}, {0xb6,0xb6,0xc1,0x77}, {0xda,0xda,0x75,0xaf}, {0x21,0x21,0x63,0x42},
-{0x10,0x10,0x30,0x20}, {0xff,0xff,0x1a,0xe5}, {0xf3,0xf3,0x0e,0xfd}, {0xd2,0xd2,0x6d,0xbf},
-{0xcd,0xcd,0x4c,0x81}, {0x0c,0x0c,0x14,0x18}, {0x13,0x13,0x35,0x26}, {0xec,0xec,0x2f,0xc3},
-{0x5f,0x5f,0xe1,0xbe}, {0x97,0x97,0xa2,0x35}, {0x44,0x44,0xcc,0x88}, {0x17,0x17,0x39,0x2e},
-{0xc4,0xc4,0x57,0x93}, {0xa7,0xa7,0xf2,0x55}, {0x7e,0x7e,0x82,0xfc}, {0x3d,0x3d,0x47,0x7a},
-{0x64,0x64,0xac,0xc8}, {0x5d,0x5d,0xe7,0xba}, {0x19,0x19,0x2b,0x32}, {0x73,0x73,0x95,0xe6},
-{0x60,0x60,0xa0,0xc0}, {0x81,0x81,0x98,0x19}, {0x4f,0x4f,0xd1,0x9e}, {0xdc,0xdc,0x7f,0xa3},
-{0x22,0x22,0x66,0x44}, {0x2a,0x2a,0x7e,0x54}, {0x90,0x90,0xab,0x3b}, {0x88,0x88,0x83,0x0b},
-{0x46,0x46,0xca,0x8c}, {0xee,0xee,0x29,0xc7}, {0xb8,0xb8,0xd3,0x6b}, {0x14,0x14,0x3c,0x28},
-{0xde,0xde,0x79,0xa7}, {0x5e,0x5e,0xe2,0xbc}, {0x0b,0x0b,0x1d,0x16}, {0xdb,0xdb,0x76,0xad},
-{0xe0,0xe0,0x3b,0xdb}, {0x32,0x32,0x56,0x64}, {0x3a,0x3a,0x4e,0x74}, {0x0a,0x0a,0x1e,0x14},
-{0x49,0x49,0xdb,0x92}, {0x06,0x06,0x0a,0x0c}, {0x24,0x24,0x6c,0x48}, {0x5c,0x5c,0xe4,0xb8},
-{0xc2,0xc2,0x5d,0x9f}, {0xd3,0xd3,0x6e,0xbd}, {0xac,0xac,0xef,0x43}, {0x62,0x62,0xa6,0xc4},
-{0x91,0x91,0xa8,0x39}, {0x95,0x95,0xa4,0x31}, {0xe4,0xe4,0x37,0xd3}, {0x79,0x79,0x8b,0xf2},
-{0xe7,0xe7,0x32,0xd5}, {0xc8,0xc8,0x43,0x8b}, {0x37,0x37,0x59,0x6e}, {0x6d,0x6d,0xb7,0xda},
-{0x8d,0x8d,0x8c,0x01}, {0xd5,0xd5,0x64,0xb1}, {0x4e,0x4e,0xd2,0x9c}, {0xa9,0xa9,0xe0,0x49},
-{0x6c,0x6c,0xb4,0xd8}, {0x56,0x56,0xfa,0xac}, {0xf4,0xf4,0x07,0xf3}, {0xea,0xea,0x25,0xcf},
-{0x65,0x65,0xaf,0xca}, {0x7a,0x7a,0x8e,0xf4}, {0xae,0xae,0xe9,0x47}, {0x08,0x08,0x18,0x10},
-{0xba,0xba,0xd5,0x6f}, {0x78,0x78,0x88,0xf0}, {0x25,0x25,0x6f,0x4a}, {0x2e,0x2e,0x72,0x5c},
-{0x1c,0x1c,0x24,0x38}, {0xa6,0xa6,0xf1,0x57}, {0xb4,0xb4,0xc7,0x73}, {0xc6,0xc6,0x51,0x97},
-{0xe8,0xe8,0x23,0xcb}, {0xdd,0xdd,0x7c,0xa1}, {0x74,0x74,0x9c,0xe8}, {0x1f,0x1f,0x21,0x3e},
-{0x4b,0x4b,0xdd,0x96}, {0xbd,0xbd,0xdc,0x61}, {0x8b,0x8b,0x86,0x0d}, {0x8a,0x8a,0x85,0x0f},
-{0x70,0x70,0x90,0xe0}, {0x3e,0x3e,0x42,0x7c}, {0xb5,0xb5,0xc4,0x71}, {0x66,0x66,0xaa,0xcc},
-{0x48,0x48,0xd8,0x90}, {0x03,0x03,0x05,0x06}, {0xf6,0xf6,0x01,0xf7}, {0x0e,0x0e,0x12,0x1c},
-{0x61,0x61,0xa3,0xc2}, {0x35,0x35,0x5f,0x6a}, {0x57,0x57,0xf9,0xae}, {0xb9,0xb9,0xd0,0x69},
-{0x86,0x86,0x91,0x17}, {0xc1,0xc1,0x58,0x99}, {0x1d,0x1d,0x27,0x3a}, {0x9e,0x9e,0xb9,0x27},
-{0xe1,0xe1,0x38,0xd9}, {0xf8,0xf8,0x13,0xeb}, {0x98,0x98,0xb3,0x2b}, {0x11,0x11,0x33,0x22},
-{0x69,0x69,0xbb,0xd2}, {0xd9,0xd9,0x70,0xa9}, {0x8e,0x8e,0x89,0x07}, {0x94,0x94,0xa7,0x33},
-{0x9b,0x9b,0xb6,0x2d}, {0x1e,0x1e,0x22,0x3c}, {0x87,0x87,0x92,0x15}, {0xe9,0xe9,0x20,0xc9},
-{0xce,0xce,0x49,0x87}, {0x55,0x55,0xff,0xaa}, {0x28,0x28,0x78,0x50}, {0xdf,0xdf,0x7a,0xa5},
-{0x8c,0x8c,0x8f,0x03}, {0xa1,0xa1,0xf8,0x59}, {0x89,0x89,0x80,0x09}, {0x0d,0x0d,0x17,0x1a},
-{0xbf,0xbf,0xda,0x65}, {0xe6,0xe6,0x31,0xd7}, {0x42,0x42,0xc6,0x84}, {0x68,0x68,0xb8,0xd0},
-{0x41,0x41,0xc3,0x82}, {0x99,0x99,0xb0,0x29}, {0x2d,0x2d,0x77,0x5a}, {0x0f,0x0f,0x11,0x1e},
-{0xb0,0xb0,0xcb,0x7b}, {0x54,0x54,0xfc,0xa8}, {0xbb,0xbb,0xd6,0x6d}, {0x16,0x16,0x3a,0x2c}
-	}
-};
-#define	T4	xT4.xt8
-
-static const union xtab xT5 = {
-	.xt8 = {
-{0x51,0xf4,0xa7,0x50}, {0x7e,0x41,0x65,0x53}, {0x1a,0x17,0xa4,0xc3}, {0x3a,0x27,0x5e,0x96},
-{0x3b,0xab,0x6b,0xcb}, {0x1f,0x9d,0x45,0xf1}, {0xac,0xfa,0x58,0xab}, {0x4b,0xe3,0x03,0x93},
-{0x20,0x30,0xfa,0x55}, {0xad,0x76,0x6d,0xf6}, {0x88,0xcc,0x76,0x91}, {0xf5,0x02,0x4c,0x25},
-{0x4f,0xe5,0xd7,0xfc}, {0xc5,0x2a,0xcb,0xd7}, {0x26,0x35,0x44,0x80}, {0xb5,0x62,0xa3,0x8f},
-{0xde,0xb1,0x5a,0x49}, {0x25,0xba,0x1b,0x67}, {0x45,0xea,0x0e,0x98}, {0x5d,0xfe,0xc0,0xe1},
-{0xc3,0x2f,0x75,0x02}, {0x81,0x4c,0xf0,0x12}, {0x8d,0x46,0x97,0xa3}, {0x6b,0xd3,0xf9,0xc6},
-{0x03,0x8f,0x5f,0xe7}, {0x15,0x92,0x9c,0x95}, {0xbf,0x6d,0x7a,0xeb}, {0x95,0x52,0x59,0xda},
-{0xd4,0xbe,0x83,0x2d}, {0x58,0x74,0x21,0xd3}, {0x49,0xe0,0x69,0x29}, {0x8e,0xc9,0xc8,0x44},
-{0x75,0xc2,0x89,0x6a}, {0xf4,0x8e,0x79,0x78}, {0x99,0x58,0x3e,0x6b}, {0x27,0xb9,0x71,0xdd},
-{0xbe,0xe1,0x4f,0xb6}, {0xf0,0x88,0xad,0x17}, {0xc9,0x20,0xac,0x66}, {0x7d,0xce,0x3a,0xb4},
-{0x63,0xdf,0x4a,0x18}, {0xe5,0x1a,0x31,0x82}, {0x97,0x51,0x33,0x60}, {0x62,0x53,0x7f,0x45},
-{0xb1,0x64,0x77,0xe0}, {0xbb,0x6b,0xae,0x84}, {0xfe,0x81,0xa0,0x1c}, {0xf9,0x08,0x2b,0x94},
-{0x70,0x48,0x68,0x58}, {0x8f,0x45,0xfd,0x19}, {0x94,0xde,0x6c,0x87}, {0x52,0x7b,0xf8,0xb7},
-{0xab,0x73,0xd3,0x23}, {0x72,0x4b,0x02,0xe2}, {0xe3,0x1f,0x8f,0x57}, {0x66,0x55,0xab,0x2a},
-{0xb2,0xeb,0x28,0x07}, {0x2f,0xb5,0xc2,0x03}, {0x86,0xc5,0x7b,0x9a}, {0xd3,0x37,0x08,0xa5},
-{0x30,0x28,0x87,0xf2}, {0x23,0xbf,0xa5,0xb2}, {0x02,0x03,0x6a,0xba}, {0xed,0x16,0x82,0x5c},
-{0x8a,0xcf,0x1c,0x2b}, {0xa7,0x79,0xb4,0x92}, {0xf3,0x07,0xf2,0xf0}, {0x4e,0x69,0xe2,0xa1},
-{0x65,0xda,0xf4,0xcd}, {0x06,0x05,0xbe,0xd5}, {0xd1,0x34,0x62,0x1f}, {0xc4,0xa6,0xfe,0x8a},
-{0x34,0x2e,0x53,0x9d}, {0xa2,0xf3,0x55,0xa0}, {0x05,0x8a,0xe1,0x32}, {0xa4,0xf6,0xeb,0x75},
-{0x0b,0x83,0xec,0x39}, {0x40,0x60,0xef,0xaa}, {0x5e,0x71,0x9f,0x06}, {0xbd,0x6e,0x10,0x51},
-{0x3e,0x21,0x8a,0xf9}, {0x96,0xdd,0x06,0x3d}, {0xdd,0x3e,0x05,0xae}, {0x4d,0xe6,0xbd,0x46},
-{0x91,0x54,0x8d,0xb5}, {0x71,0xc4,0x5d,0x05}, {0x04,0x06,0xd4,0x6f}, {0x60,0x50,0x15,0xff},
-{0x19,0x98,0xfb,0x24}, {0xd6,0xbd,0xe9,0x97}, {0x89,0x40,0x43,0xcc}, {0x67,0xd9,0x9e,0x77},
-{0xb0,0xe8,0x42,0xbd}, {0x07,0x89,0x8b,0x88}, {0xe7,0x19,0x5b,0x38}, {0x79,0xc8,0xee,0xdb},
-{0xa1,0x7c,0x0a,0x47}, {0x7c,0x42,0x0f,0xe9}, {0xf8,0x84,0x1e,0xc9}, {0x00,0x00,0x00,0x00},
-{0x09,0x80,0x86,0x83}, {0x32,0x2b,0xed,0x48}, {0x1e,0x11,0x70,0xac}, {0x6c,0x5a,0x72,0x4e},
-{0xfd,0x0e,0xff,0xfb}, {0x0f,0x85,0x38,0x56}, {0x3d,0xae,0xd5,0x1e}, {0x36,0x2d,0x39,0x27},
-{0x0a,0x0f,0xd9,0x64}, {0x68,0x5c,0xa6,0x21}, {0x9b,0x5b,0x54,0xd1}, {0x24,0x36,0x2e,0x3a},
-{0x0c,0x0a,0x67,0xb1}, {0x93,0x57,0xe7,0x0f}, {0xb4,0xee,0x96,0xd2}, {0x1b,0x9b,0x91,0x9e},
-{0x80,0xc0,0xc5,0x4f}, {0x61,0xdc,0x20,0xa2}, {0x5a,0x77,0x4b,0x69}, {0x1c,0x12,0x1a,0x16},
-{0xe2,0x93,0xba,0x0a}, {0xc0,0xa0,0x2a,0xe5}, {0x3c,0x22,0xe0,0x43}, {0x12,0x1b,0x17,0x1d},
-{0x0e,0x09,0x0d,0x0b}, {0xf2,0x8b,0xc7,0xad}, {0x2d,0xb6,0xa8,0xb9}, {0x14,0x1e,0xa9,0xc8},
-{0x57,0xf1,0x19,0x85}, {0xaf,0x75,0x07,0x4c}, {0xee,0x99,0xdd,0xbb}, {0xa3,0x7f,0x60,0xfd},
-{0xf7,0x01,0x26,0x9f}, {0x5c,0x72,0xf5,0xbc}, {0x44,0x66,0x3b,0xc5}, {0x5b,0xfb,0x7e,0x34},
-{0x8b,0x43,0x29,0x76}, {0xcb,0x23,0xc6,0xdc}, {0xb6,0xed,0xfc,0x68}, {0xb8,0xe4,0xf1,0x63},
-{0xd7,0x31,0xdc,0xca}, {0x42,0x63,0x85,0x10}, {0x13,0x97,0x22,0x40}, {0x84,0xc6,0x11,0x20},
-{0x85,0x4a,0x24,0x7d}, {0xd2,0xbb,0x3d,0xf8}, {0xae,0xf9,0x32,0x11}, {0xc7,0x29,0xa1,0x6d},
-{0x1d,0x9e,0x2f,0x4b}, {0xdc,0xb2,0x30,0xf3}, {0x0d,0x86,0x52,0xec}, {0x77,0xc1,0xe3,0xd0},
-{0x2b,0xb3,0x16,0x6c}, {0xa9,0x70,0xb9,0x99}, {0x11,0x94,0x48,0xfa}, {0x47,0xe9,0x64,0x22},
-{0xa8,0xfc,0x8c,0xc4}, {0xa0,0xf0,0x3f,0x1a}, {0x56,0x7d,0x2c,0xd8}, {0x22,0x33,0x90,0xef},
-{0x87,0x49,0x4e,0xc7}, {0xd9,0x38,0xd1,0xc1}, {0x8c,0xca,0xa2,0xfe}, {0x98,0xd4,0x0b,0x36},
-{0xa6,0xf5,0x81,0xcf}, {0xa5,0x7a,0xde,0x28}, {0xda,0xb7,0x8e,0x26}, {0x3f,0xad,0xbf,0xa4},
-{0x2c,0x3a,0x9d,0xe4}, {0x50,0x78,0x92,0x0d}, {0x6a,0x5f,0xcc,0x9b}, {0x54,0x7e,0x46,0x62},
-{0xf6,0x8d,0x13,0xc2}, {0x90,0xd8,0xb8,0xe8}, {0x2e,0x39,0xf7,0x5e}, {0x82,0xc3,0xaf,0xf5},
-{0x9f,0x5d,0x80,0xbe}, {0x69,0xd0,0x93,0x7c}, {0x6f,0xd5,0x2d,0xa9}, {0xcf,0x25,0x12,0xb3},
-{0xc8,0xac,0x99,0x3b}, {0x10,0x18,0x7d,0xa7}, {0xe8,0x9c,0x63,0x6e}, {0xdb,0x3b,0xbb,0x7b},
-{0xcd,0x26,0x78,0x09}, {0x6e,0x59,0x18,0xf4}, {0xec,0x9a,0xb7,0x01}, {0x83,0x4f,0x9a,0xa8},
-{0xe6,0x95,0x6e,0x65}, {0xaa,0xff,0xe6,0x7e}, {0x21,0xbc,0xcf,0x08}, {0xef,0x15,0xe8,0xe6},
-{0xba,0xe7,0x9b,0xd9}, {0x4a,0x6f,0x36,0xce}, {0xea,0x9f,0x09,0xd4}, {0x29,0xb0,0x7c,0xd6},
-{0x31,0xa4,0xb2,0xaf}, {0x2a,0x3f,0x23,0x31}, {0xc6,0xa5,0x94,0x30}, {0x35,0xa2,0x66,0xc0},
-{0x74,0x4e,0xbc,0x37}, {0xfc,0x82,0xca,0xa6}, {0xe0,0x90,0xd0,0xb0}, {0x33,0xa7,0xd8,0x15},
-{0xf1,0x04,0x98,0x4a}, {0x41,0xec,0xda,0xf7}, {0x7f,0xcd,0x50,0x0e}, {0x17,0x91,0xf6,0x2f},
-{0x76,0x4d,0xd6,0x8d}, {0x43,0xef,0xb0,0x4d}, {0xcc,0xaa,0x4d,0x54}, {0xe4,0x96,0x04,0xdf},
-{0x9e,0xd1,0xb5,0xe3}, {0x4c,0x6a,0x88,0x1b}, {0xc1,0x2c,0x1f,0xb8}, {0x46,0x65,0x51,0x7f},
-{0x9d,0x5e,0xea,0x04}, {0x01,0x8c,0x35,0x5d}, {0xfa,0x87,0x74,0x73}, {0xfb,0x0b,0x41,0x2e},
-{0xb3,0x67,0x1d,0x5a}, {0x92,0xdb,0xd2,0x52}, {0xe9,0x10,0x56,0x33}, {0x6d,0xd6,0x47,0x13},
-{0x9a,0xd7,0x61,0x8c}, {0x37,0xa1,0x0c,0x7a}, {0x59,0xf8,0x14,0x8e}, {0xeb,0x13,0x3c,0x89},
-{0xce,0xa9,0x27,0xee}, {0xb7,0x61,0xc9,0x35}, {0xe1,0x1c,0xe5,0xed}, {0x7a,0x47,0xb1,0x3c},
-{0x9c,0xd2,0xdf,0x59}, {0x55,0xf2,0x73,0x3f}, {0x18,0x14,0xce,0x79}, {0x73,0xc7,0x37,0xbf},
-{0x53,0xf7,0xcd,0xea}, {0x5f,0xfd,0xaa,0x5b}, {0xdf,0x3d,0x6f,0x14}, {0x78,0x44,0xdb,0x86},
-{0xca,0xaf,0xf3,0x81}, {0xb9,0x68,0xc4,0x3e}, {0x38,0x24,0x34,0x2c}, {0xc2,0xa3,0x40,0x5f},
-{0x16,0x1d,0xc3,0x72}, {0xbc,0xe2,0x25,0x0c}, {0x28,0x3c,0x49,0x8b}, {0xff,0x0d,0x95,0x41},
-{0x39,0xa8,0x01,0x71}, {0x08,0x0c,0xb3,0xde}, {0xd8,0xb4,0xe4,0x9c}, {0x64,0x56,0xc1,0x90},
-{0x7b,0xcb,0x84,0x61}, {0xd5,0x32,0xb6,0x70}, {0x48,0x6c,0x5c,0x74}, {0xd0,0xb8,0x57,0x42}
-	}
-};
-#define	T5	xT5.xt8
-
-static const union xtab xT6 = {
-	.xt8 = {
-{0x50,0x51,0xf4,0xa7}, {0x53,0x7e,0x41,0x65}, {0xc3,0x1a,0x17,0xa4}, {0x96,0x3a,0x27,0x5e},
-{0xcb,0x3b,0xab,0x6b}, {0xf1,0x1f,0x9d,0x45}, {0xab,0xac,0xfa,0x58}, {0x93,0x4b,0xe3,0x03},
-{0x55,0x20,0x30,0xfa}, {0xf6,0xad,0x76,0x6d}, {0x91,0x88,0xcc,0x76}, {0x25,0xf5,0x02,0x4c},
-{0xfc,0x4f,0xe5,0xd7}, {0xd7,0xc5,0x2a,0xcb}, {0x80,0x26,0x35,0x44}, {0x8f,0xb5,0x62,0xa3},
-{0x49,0xde,0xb1,0x5a}, {0x67,0x25,0xba,0x1b}, {0x98,0x45,0xea,0x0e}, {0xe1,0x5d,0xfe,0xc0},
-{0x02,0xc3,0x2f,0x75}, {0x12,0x81,0x4c,0xf0}, {0xa3,0x8d,0x46,0x97}, {0xc6,0x6b,0xd3,0xf9},
-{0xe7,0x03,0x8f,0x5f}, {0x95,0x15,0x92,0x9c}, {0xeb,0xbf,0x6d,0x7a}, {0xda,0x95,0x52,0x59},
-{0x2d,0xd4,0xbe,0x83}, {0xd3,0x58,0x74,0x21}, {0x29,0x49,0xe0,0x69}, {0x44,0x8e,0xc9,0xc8},
-{0x6a,0x75,0xc2,0x89}, {0x78,0xf4,0x8e,0x79}, {0x6b,0x99,0x58,0x3e}, {0xdd,0x27,0xb9,0x71},
-{0xb6,0xbe,0xe1,0x4f}, {0x17,0xf0,0x88,0xad}, {0x66,0xc9,0x20,0xac}, {0xb4,0x7d,0xce,0x3a},
-{0x18,0x63,0xdf,0x4a}, {0x82,0xe5,0x1a,0x31}, {0x60,0x97,0x51,0x33}, {0x45,0x62,0x53,0x7f},
-{0xe0,0xb1,0x64,0x77}, {0x84,0xbb,0x6b,0xae}, {0x1c,0xfe,0x81,0xa0}, {0x94,0xf9,0x08,0x2b},
-{0x58,0x70,0x48,0x68}, {0x19,0x8f,0x45,0xfd}, {0x87,0x94,0xde,0x6c}, {0xb7,0x52,0x7b,0xf8},
-{0x23,0xab,0x73,0xd3}, {0xe2,0x72,0x4b,0x02}, {0x57,0xe3,0x1f,0x8f}, {0x2a,0x66,0x55,0xab},
-{0x07,0xb2,0xeb,0x28}, {0x03,0x2f,0xb5,0xc2}, {0x9a,0x86,0xc5,0x7b}, {0xa5,0xd3,0x37,0x08},
-{0xf2,0x30,0x28,0x87}, {0xb2,0x23,0xbf,0xa5}, {0xba,0x02,0x03,0x6a}, {0x5c,0xed,0x16,0x82},
-{0x2b,0x8a,0xcf,0x1c}, {0x92,0xa7,0x79,0xb4}, {0xf0,0xf3,0x07,0xf2}, {0xa1,0x4e,0x69,0xe2},
-{0xcd,0x65,0xda,0xf4}, {0xd5,0x06,0x05,0xbe}, {0x1f,0xd1,0x34,0x62}, {0x8a,0xc4,0xa6,0xfe},
-{0x9d,0x34,0x2e,0x53}, {0xa0,0xa2,0xf3,0x55}, {0x32,0x05,0x8a,0xe1}, {0x75,0xa4,0xf6,0xeb},
-{0x39,0x0b,0x83,0xec}, {0xaa,0x40,0x60,0xef}, {0x06,0x5e,0x71,0x9f}, {0x51,0xbd,0x6e,0x10},
-{0xf9,0x3e,0x21,0x8a}, {0x3d,0x96,0xdd,0x06}, {0xae,0xdd,0x3e,0x05}, {0x46,0x4d,0xe6,0xbd},
-{0xb5,0x91,0x54,0x8d}, {0x05,0x71,0xc4,0x5d}, {0x6f,0x04,0x06,0xd4}, {0xff,0x60,0x50,0x15},
-{0x24,0x19,0x98,0xfb}, {0x97,0xd6,0xbd,0xe9}, {0xcc,0x89,0x40,0x43}, {0x77,0x67,0xd9,0x9e},
-{0xbd,0xb0,0xe8,0x42}, {0x88,0x07,0x89,0x8b}, {0x38,0xe7,0x19,0x5b}, {0xdb,0x79,0xc8,0xee},
-{0x47,0xa1,0x7c,0x0a}, {0xe9,0x7c,0x42,0x0f}, {0xc9,0xf8,0x84,0x1e}, {0x00,0x00,0x00,0x00},
-{0x83,0x09,0x80,0x86}, {0x48,0x32,0x2b,0xed}, {0xac,0x1e,0x11,0x70}, {0x4e,0x6c,0x5a,0x72},
-{0xfb,0xfd,0x0e,0xff}, {0x56,0x0f,0x85,0x38}, {0x1e,0x3d,0xae,0xd5}, {0x27,0x36,0x2d,0x39},
-{0x64,0x0a,0x0f,0xd9}, {0x21,0x68,0x5c,0xa6}, {0xd1,0x9b,0x5b,0x54}, {0x3a,0x24,0x36,0x2e},
-{0xb1,0x0c,0x0a,0x67}, {0x0f,0x93,0x57,0xe7}, {0xd2,0xb4,0xee,0x96}, {0x9e,0x1b,0x9b,0x91},
-{0x4f,0x80,0xc0,0xc5}, {0xa2,0x61,0xdc,0x20}, {0x69,0x5a,0x77,0x4b}, {0x16,0x1c,0x12,0x1a},
-{0x0a,0xe2,0x93,0xba}, {0xe5,0xc0,0xa0,0x2a}, {0x43,0x3c,0x22,0xe0}, {0x1d,0x12,0x1b,0x17},
-{0x0b,0x0e,0x09,0x0d}, {0xad,0xf2,0x8b,0xc7}, {0xb9,0x2d,0xb6,0xa8}, {0xc8,0x14,0x1e,0xa9},
-{0x85,0x57,0xf1,0x19}, {0x4c,0xaf,0x75,0x07}, {0xbb,0xee,0x99,0xdd}, {0xfd,0xa3,0x7f,0x60},
-{0x9f,0xf7,0x01,0x26}, {0xbc,0x5c,0x72,0xf5}, {0xc5,0x44,0x66,0x3b}, {0x34,0x5b,0xfb,0x7e},
-{0x76,0x8b,0x43,0x29}, {0xdc,0xcb,0x23,0xc6}, {0x68,0xb6,0xed,0xfc}, {0x63,0xb8,0xe4,0xf1},
-{0xca,0xd7,0x31,0xdc}, {0x10,0x42,0x63,0x85}, {0x40,0x13,0x97,0x22}, {0x20,0x84,0xc6,0x11},
-{0x7d,0x85,0x4a,0x24}, {0xf8,0xd2,0xbb,0x3d}, {0x11,0xae,0xf9,0x32}, {0x6d,0xc7,0x29,0xa1},
-{0x4b,0x1d,0x9e,0x2f}, {0xf3,0xdc,0xb2,0x30}, {0xec,0x0d,0x86,0x52}, {0xd0,0x77,0xc1,0xe3},
-{0x6c,0x2b,0xb3,0x16}, {0x99,0xa9,0x70,0xb9}, {0xfa,0x11,0x94,0x48}, {0x22,0x47,0xe9,0x64},
-{0xc4,0xa8,0xfc,0x8c}, {0x1a,0xa0,0xf0,0x3f}, {0xd8,0x56,0x7d,0x2c}, {0xef,0x22,0x33,0x90},
-{0xc7,0x87,0x49,0x4e}, {0xc1,0xd9,0x38,0xd1}, {0xfe,0x8c,0xca,0xa2}, {0x36,0x98,0xd4,0x0b},
-{0xcf,0xa6,0xf5,0x81}, {0x28,0xa5,0x7a,0xde}, {0x26,0xda,0xb7,0x8e}, {0xa4,0x3f,0xad,0xbf},
-{0xe4,0x2c,0x3a,0x9d}, {0x0d,0x50,0x78,0x92}, {0x9b,0x6a,0x5f,0xcc}, {0x62,0x54,0x7e,0x46},
-{0xc2,0xf6,0x8d,0x13}, {0xe8,0x90,0xd8,0xb8}, {0x5e,0x2e,0x39,0xf7}, {0xf5,0x82,0xc3,0xaf},
-{0xbe,0x9f,0x5d,0x80}, {0x7c,0x69,0xd0,0x93}, {0xa9,0x6f,0xd5,0x2d}, {0xb3,0xcf,0x25,0x12},
-{0x3b,0xc8,0xac,0x99}, {0xa7,0x10,0x18,0x7d}, {0x6e,0xe8,0x9c,0x63}, {0x7b,0xdb,0x3b,0xbb},
-{0x09,0xcd,0x26,0x78}, {0xf4,0x6e,0x59,0x18}, {0x01,0xec,0x9a,0xb7}, {0xa8,0x83,0x4f,0x9a},
-{0x65,0xe6,0x95,0x6e}, {0x7e,0xaa,0xff,0xe6}, {0x08,0x21,0xbc,0xcf}, {0xe6,0xef,0x15,0xe8},
-{0xd9,0xba,0xe7,0x9b}, {0xce,0x4a,0x6f,0x36}, {0xd4,0xea,0x9f,0x09}, {0xd6,0x29,0xb0,0x7c},
-{0xaf,0x31,0xa4,0xb2}, {0x31,0x2a,0x3f,0x23}, {0x30,0xc6,0xa5,0x94}, {0xc0,0x35,0xa2,0x66},
-{0x37,0x74,0x4e,0xbc}, {0xa6,0xfc,0x82,0xca}, {0xb0,0xe0,0x90,0xd0}, {0x15,0x33,0xa7,0xd8},
-{0x4a,0xf1,0x04,0x98}, {0xf7,0x41,0xec,0xda}, {0x0e,0x7f,0xcd,0x50}, {0x2f,0x17,0x91,0xf6},
-{0x8d,0x76,0x4d,0xd6}, {0x4d,0x43,0xef,0xb0}, {0x54,0xcc,0xaa,0x4d}, {0xdf,0xe4,0x96,0x04},
-{0xe3,0x9e,0xd1,0xb5}, {0x1b,0x4c,0x6a,0x88}, {0xb8,0xc1,0x2c,0x1f}, {0x7f,0x46,0x65,0x51},
-{0x04,0x9d,0x5e,0xea}, {0x5d,0x01,0x8c,0x35}, {0x73,0xfa,0x87,0x74}, {0x2e,0xfb,0x0b,0x41},
-{0x5a,0xb3,0x67,0x1d}, {0x52,0x92,0xdb,0xd2}, {0x33,0xe9,0x10,0x56}, {0x13,0x6d,0xd6,0x47},
-{0x8c,0x9a,0xd7,0x61}, {0x7a,0x37,0xa1,0x0c}, {0x8e,0x59,0xf8,0x14}, {0x89,0xeb,0x13,0x3c},
-{0xee,0xce,0xa9,0x27}, {0x35,0xb7,0x61,0xc9}, {0xed,0xe1,0x1c,0xe5}, {0x3c,0x7a,0x47,0xb1},
-{0x59,0x9c,0xd2,0xdf}, {0x3f,0x55,0xf2,0x73}, {0x79,0x18,0x14,0xce}, {0xbf,0x73,0xc7,0x37},
-{0xea,0x53,0xf7,0xcd}, {0x5b,0x5f,0xfd,0xaa}, {0x14,0xdf,0x3d,0x6f}, {0x86,0x78,0x44,0xdb},
-{0x81,0xca,0xaf,0xf3}, {0x3e,0xb9,0x68,0xc4}, {0x2c,0x38,0x24,0x34}, {0x5f,0xc2,0xa3,0x40},
-{0x72,0x16,0x1d,0xc3}, {0x0c,0xbc,0xe2,0x25}, {0x8b,0x28,0x3c,0x49}, {0x41,0xff,0x0d,0x95},
-{0x71,0x39,0xa8,0x01}, {0xde,0x08,0x0c,0xb3}, {0x9c,0xd8,0xb4,0xe4}, {0x90,0x64,0x56,0xc1},
-{0x61,0x7b,0xcb,0x84}, {0x70,0xd5,0x32,0xb6}, {0x74,0x48,0x6c,0x5c}, {0x42,0xd0,0xb8,0x57}
-	}
-};
-#define	T6	xT6.xt8
-
-static const union xtab xT7 = {
-	.xt8 = {
-{0xa7,0x50,0x51,0xf4}, {0x65,0x53,0x7e,0x41}, {0xa4,0xc3,0x1a,0x17}, {0x5e,0x96,0x3a,0x27},
-{0x6b,0xcb,0x3b,0xab}, {0x45,0xf1,0x1f,0x9d}, {0x58,0xab,0xac,0xfa}, {0x03,0x93,0x4b,0xe3},
-{0xfa,0x55,0x20,0x30}, {0x6d,0xf6,0xad,0x76}, {0x76,0x91,0x88,0xcc}, {0x4c,0x25,0xf5,0x02},
-{0xd7,0xfc,0x4f,0xe5}, {0xcb,0xd7,0xc5,0x2a}, {0x44,0x80,0x26,0x35}, {0xa3,0x8f,0xb5,0x62},
-{0x5a,0x49,0xde,0xb1}, {0x1b,0x67,0x25,0xba}, {0x0e,0x98,0x45,0xea}, {0xc0,0xe1,0x5d,0xfe},
-{0x75,0x02,0xc3,0x2f}, {0xf0,0x12,0x81,0x4c}, {0x97,0xa3,0x8d,0x46}, {0xf9,0xc6,0x6b,0xd3},
-{0x5f,0xe7,0x03,0x8f}, {0x9c,0x95,0x15,0x92}, {0x7a,0xeb,0xbf,0x6d}, {0x59,0xda,0x95,0x52},
-{0x83,0x2d,0xd4,0xbe}, {0x21,0xd3,0x58,0x74}, {0x69,0x29,0x49,0xe0}, {0xc8,0x44,0x8e,0xc9},
-{0x89,0x6a,0x75,0xc2}, {0x79,0x78,0xf4,0x8e}, {0x3e,0x6b,0x99,0x58}, {0x71,0xdd,0x27,0xb9},
-{0x4f,0xb6,0xbe,0xe1}, {0xad,0x17,0xf0,0x88}, {0xac,0x66,0xc9,0x20}, {0x3a,0xb4,0x7d,0xce},
-{0x4a,0x18,0x63,0xdf}, {0x31,0x82,0xe5,0x1a}, {0x33,0x60,0x97,0x51}, {0x7f,0x45,0x62,0x53},
-{0x77,0xe0,0xb1,0x64}, {0xae,0x84,0xbb,0x6b}, {0xa0,0x1c,0xfe,0x81}, {0x2b,0x94,0xf9,0x08},
-{0x68,0x58,0x70,0x48}, {0xfd,0x19,0x8f,0x45}, {0x6c,0x87,0x94,0xde}, {0xf8,0xb7,0x52,0x7b},
-{0xd3,0x23,0xab,0x73}, {0x02,0xe2,0x72,0x4b}, {0x8f,0x57,0xe3,0x1f}, {0xab,0x2a,0x66,0x55},
-{0x28,0x07,0xb2,0xeb}, {0xc2,0x03,0x2f,0xb5}, {0x7b,0x9a,0x86,0xc5}, {0x08,0xa5,0xd3,0x37},
-{0x87,0xf2,0x30,0x28}, {0xa5,0xb2,0x23,0xbf}, {0x6a,0xba,0x02,0x03}, {0x82,0x5c,0xed,0x16},
-{0x1c,0x2b,0x8a,0xcf}, {0xb4,0x92,0xa7,0x79}, {0xf2,0xf0,0xf3,0x07}, {0xe2,0xa1,0x4e,0x69},
-{0xf4,0xcd,0x65,0xda}, {0xbe,0xd5,0x06,0x05}, {0x62,0x1f,0xd1,0x34}, {0xfe,0x8a,0xc4,0xa6},
-{0x53,0x9d,0x34,0x2e}, {0x55,0xa0,0xa2,0xf3}, {0xe1,0x32,0x05,0x8a}, {0xeb,0x75,0xa4,0xf6},
-{0xec,0x39,0x0b,0x83}, {0xef,0xaa,0x40,0x60}, {0x9f,0x06,0x5e,0x71}, {0x10,0x51,0xbd,0x6e},
-{0x8a,0xf9,0x3e,0x21}, {0x06,0x3d,0x96,0xdd}, {0x05,0xae,0xdd,0x3e}, {0xbd,0x46,0x4d,0xe6},
-{0x8d,0xb5,0x91,0x54}, {0x5d,0x05,0x71,0xc4}, {0xd4,0x6f,0x04,0x06}, {0x15,0xff,0x60,0x50},
-{0xfb,0x24,0x19,0x98}, {0xe9,0x97,0xd6,0xbd}, {0x43,0xcc,0x89,0x40}, {0x9e,0x77,0x67,0xd9},
-{0x42,0xbd,0xb0,0xe8}, {0x8b,0x88,0x07,0x89}, {0x5b,0x38,0xe7,0x19}, {0xee,0xdb,0x79,0xc8},
-{0x0a,0x47,0xa1,0x7c}, {0x0f,0xe9,0x7c,0x42}, {0x1e,0xc9,0xf8,0x84}, {0x00,0x00,0x00,0x00},
-{0x86,0x83,0x09,0x80}, {0xed,0x48,0x32,0x2b}, {0x70,0xac,0x1e,0x11}, {0x72,0x4e,0x6c,0x5a},
-{0xff,0xfb,0xfd,0x0e}, {0x38,0x56,0x0f,0x85}, {0xd5,0x1e,0x3d,0xae}, {0x39,0x27,0x36,0x2d},
-{0xd9,0x64,0x0a,0x0f}, {0xa6,0x21,0x68,0x5c}, {0x54,0xd1,0x9b,0x5b}, {0x2e,0x3a,0x24,0x36},
-{0x67,0xb1,0x0c,0x0a}, {0xe7,0x0f,0x93,0x57}, {0x96,0xd2,0xb4,0xee}, {0x91,0x9e,0x1b,0x9b},
-{0xc5,0x4f,0x80,0xc0}, {0x20,0xa2,0x61,0xdc}, {0x4b,0x69,0x5a,0x77}, {0x1a,0x16,0x1c,0x12},
-{0xba,0x0a,0xe2,0x93}, {0x2a,0xe5,0xc0,0xa0}, {0xe0,0x43,0x3c,0x22}, {0x17,0x1d,0x12,0x1b},
-{0x0d,0x0b,0x0e,0x09}, {0xc7,0xad,0xf2,0x8b}, {0xa8,0xb9,0x2d,0xb6}, {0xa9,0xc8,0x14,0x1e},
-{0x19,0x85,0x57,0xf1}, {0x07,0x4c,0xaf,0x75}, {0xdd,0xbb,0xee,0x99}, {0x60,0xfd,0xa3,0x7f},
-{0x26,0x9f,0xf7,0x01}, {0xf5,0xbc,0x5c,0x72}, {0x3b,0xc5,0x44,0x66}, {0x7e,0x34,0x5b,0xfb},
-{0x29,0x76,0x8b,0x43}, {0xc6,0xdc,0xcb,0x23}, {0xfc,0x68,0xb6,0xed}, {0xf1,0x63,0xb8,0xe4},
-{0xdc,0xca,0xd7,0x31}, {0x85,0x10,0x42,0x63}, {0x22,0x40,0x13,0x97}, {0x11,0x20,0x84,0xc6},
-{0x24,0x7d,0x85,0x4a}, {0x3d,0xf8,0xd2,0xbb}, {0x32,0x11,0xae,0xf9}, {0xa1,0x6d,0xc7,0x29},
-{0x2f,0x4b,0x1d,0x9e}, {0x30,0xf3,0xdc,0xb2}, {0x52,0xec,0x0d,0x86}, {0xe3,0xd0,0x77,0xc1},
-{0x16,0x6c,0x2b,0xb3}, {0xb9,0x99,0xa9,0x70}, {0x48,0xfa,0x11,0x94}, {0x64,0x22,0x47,0xe9},
-{0x8c,0xc4,0xa8,0xfc}, {0x3f,0x1a,0xa0,0xf0}, {0x2c,0xd8,0x56,0x7d}, {0x90,0xef,0x22,0x33},
-{0x4e,0xc7,0x87,0x49}, {0xd1,0xc1,0xd9,0x38}, {0xa2,0xfe,0x8c,0xca}, {0x0b,0x36,0x98,0xd4},
-{0x81,0xcf,0xa6,0xf5}, {0xde,0x28,0xa5,0x7a}, {0x8e,0x26,0xda,0xb7}, {0xbf,0xa4,0x3f,0xad},
-{0x9d,0xe4,0x2c,0x3a}, {0x92,0x0d,0x50,0x78}, {0xcc,0x9b,0x6a,0x5f}, {0x46,0x62,0x54,0x7e},
-{0x13,0xc2,0xf6,0x8d}, {0xb8,0xe8,0x90,0xd8}, {0xf7,0x5e,0x2e,0x39}, {0xaf,0xf5,0x82,0xc3},
-{0x80,0xbe,0x9f,0x5d}, {0x93,0x7c,0x69,0xd0}, {0x2d,0xa9,0x6f,0xd5}, {0x12,0xb3,0xcf,0x25},
-{0x99,0x3b,0xc8,0xac}, {0x7d,0xa7,0x10,0x18}, {0x63,0x6e,0xe8,0x9c}, {0xbb,0x7b,0xdb,0x3b},
-{0x78,0x09,0xcd,0x26}, {0x18,0xf4,0x6e,0x59}, {0xb7,0x01,0xec,0x9a}, {0x9a,0xa8,0x83,0x4f},
-{0x6e,0x65,0xe6,0x95}, {0xe6,0x7e,0xaa,0xff}, {0xcf,0x08,0x21,0xbc}, {0xe8,0xe6,0xef,0x15},
-{0x9b,0xd9,0xba,0xe7}, {0x36,0xce,0x4a,0x6f}, {0x09,0xd4,0xea,0x9f}, {0x7c,0xd6,0x29,0xb0},
-{0xb2,0xaf,0x31,0xa4}, {0x23,0x31,0x2a,0x3f}, {0x94,0x30,0xc6,0xa5}, {0x66,0xc0,0x35,0xa2},
-{0xbc,0x37,0x74,0x4e}, {0xca,0xa6,0xfc,0x82}, {0xd0,0xb0,0xe0,0x90}, {0xd8,0x15,0x33,0xa7},
-{0x98,0x4a,0xf1,0x04}, {0xda,0xf7,0x41,0xec}, {0x50,0x0e,0x7f,0xcd}, {0xf6,0x2f,0x17,0x91},
-{0xd6,0x8d,0x76,0x4d}, {0xb0,0x4d,0x43,0xef}, {0x4d,0x54,0xcc,0xaa}, {0x04,0xdf,0xe4,0x96},
-{0xb5,0xe3,0x9e,0xd1}, {0x88,0x1b,0x4c,0x6a}, {0x1f,0xb8,0xc1,0x2c}, {0x51,0x7f,0x46,0x65},
-{0xea,0x04,0x9d,0x5e}, {0x35,0x5d,0x01,0x8c}, {0x74,0x73,0xfa,0x87}, {0x41,0x2e,0xfb,0x0b},
-{0x1d,0x5a,0xb3,0x67}, {0xd2,0x52,0x92,0xdb}, {0x56,0x33,0xe9,0x10}, {0x47,0x13,0x6d,0xd6},
-{0x61,0x8c,0x9a,0xd7}, {0x0c,0x7a,0x37,0xa1}, {0x14,0x8e,0x59,0xf8}, {0x3c,0x89,0xeb,0x13},
-{0x27,0xee,0xce,0xa9}, {0xc9,0x35,0xb7,0x61}, {0xe5,0xed,0xe1,0x1c}, {0xb1,0x3c,0x7a,0x47},
-{0xdf,0x59,0x9c,0xd2}, {0x73,0x3f,0x55,0xf2}, {0xce,0x79,0x18,0x14}, {0x37,0xbf,0x73,0xc7},
-{0xcd,0xea,0x53,0xf7}, {0xaa,0x5b,0x5f,0xfd}, {0x6f,0x14,0xdf,0x3d}, {0xdb,0x86,0x78,0x44},
-{0xf3,0x81,0xca,0xaf}, {0xc4,0x3e,0xb9,0x68}, {0x34,0x2c,0x38,0x24}, {0x40,0x5f,0xc2,0xa3},
-{0xc3,0x72,0x16,0x1d}, {0x25,0x0c,0xbc,0xe2}, {0x49,0x8b,0x28,0x3c}, {0x95,0x41,0xff,0x0d},
-{0x01,0x71,0x39,0xa8}, {0xb3,0xde,0x08,0x0c}, {0xe4,0x9c,0xd8,0xb4}, {0xc1,0x90,0x64,0x56},
-{0x84,0x61,0x7b,0xcb}, {0xb6,0x70,0xd5,0x32}, {0x5c,0x74,0x48,0x6c}, {0x57,0x42,0xd0,0xb8}
-	}
-};
-#define	T7	xT7.xt8
-
-static const union xtab xT8 = {
-	.xt8 = {
-{0xf4,0xa7,0x50,0x51}, {0x41,0x65,0x53,0x7e}, {0x17,0xa4,0xc3,0x1a}, {0x27,0x5e,0x96,0x3a},
-{0xab,0x6b,0xcb,0x3b}, {0x9d,0x45,0xf1,0x1f}, {0xfa,0x58,0xab,0xac}, {0xe3,0x03,0x93,0x4b},
-{0x30,0xfa,0x55,0x20}, {0x76,0x6d,0xf6,0xad}, {0xcc,0x76,0x91,0x88}, {0x02,0x4c,0x25,0xf5},
-{0xe5,0xd7,0xfc,0x4f}, {0x2a,0xcb,0xd7,0xc5}, {0x35,0x44,0x80,0x26}, {0x62,0xa3,0x8f,0xb5},
-{0xb1,0x5a,0x49,0xde}, {0xba,0x1b,0x67,0x25}, {0xea,0x0e,0x98,0x45}, {0xfe,0xc0,0xe1,0x5d},
-{0x2f,0x75,0x02,0xc3}, {0x4c,0xf0,0x12,0x81}, {0x46,0x97,0xa3,0x8d}, {0xd3,0xf9,0xc6,0x6b},
-{0x8f,0x5f,0xe7,0x03}, {0x92,0x9c,0x95,0x15}, {0x6d,0x7a,0xeb,0xbf}, {0x52,0x59,0xda,0x95},
-{0xbe,0x83,0x2d,0xd4}, {0x74,0x21,0xd3,0x58}, {0xe0,0x69,0x29,0x49}, {0xc9,0xc8,0x44,0x8e},
-{0xc2,0x89,0x6a,0x75}, {0x8e,0x79,0x78,0xf4}, {0x58,0x3e,0x6b,0x99}, {0xb9,0x71,0xdd,0x27},
-{0xe1,0x4f,0xb6,0xbe}, {0x88,0xad,0x17,0xf0}, {0x20,0xac,0x66,0xc9}, {0xce,0x3a,0xb4,0x7d},
-{0xdf,0x4a,0x18,0x63}, {0x1a,0x31,0x82,0xe5}, {0x51,0x33,0x60,0x97}, {0x53,0x7f,0x45,0x62},
-{0x64,0x77,0xe0,0xb1}, {0x6b,0xae,0x84,0xbb}, {0x81,0xa0,0x1c,0xfe}, {0x08,0x2b,0x94,0xf9},
-{0x48,0x68,0x58,0x70}, {0x45,0xfd,0x19,0x8f}, {0xde,0x6c,0x87,0x94}, {0x7b,0xf8,0xb7,0x52},
-{0x73,0xd3,0x23,0xab}, {0x4b,0x02,0xe2,0x72}, {0x1f,0x8f,0x57,0xe3}, {0x55,0xab,0x2a,0x66},
-{0xeb,0x28,0x07,0xb2}, {0xb5,0xc2,0x03,0x2f}, {0xc5,0x7b,0x9a,0x86}, {0x37,0x08,0xa5,0xd3},
-{0x28,0x87,0xf2,0x30}, {0xbf,0xa5,0xb2,0x23}, {0x03,0x6a,0xba,0x02}, {0x16,0x82,0x5c,0xed},
-{0xcf,0x1c,0x2b,0x8a}, {0x79,0xb4,0x92,0xa7}, {0x07,0xf2,0xf0,0xf3}, {0x69,0xe2,0xa1,0x4e},
-{0xda,0xf4,0xcd,0x65}, {0x05,0xbe,0xd5,0x06}, {0x34,0x62,0x1f,0xd1}, {0xa6,0xfe,0x8a,0xc4},
-{0x2e,0x53,0x9d,0x34}, {0xf3,0x55,0xa0,0xa2}, {0x8a,0xe1,0x32,0x05}, {0xf6,0xeb,0x75,0xa4},
-{0x83,0xec,0x39,0x0b}, {0x60,0xef,0xaa,0x40}, {0x71,0x9f,0x06,0x5e}, {0x6e,0x10,0x51,0xbd},
-{0x21,0x8a,0xf9,0x3e}, {0xdd,0x06,0x3d,0x96}, {0x3e,0x05,0xae,0xdd}, {0xe6,0xbd,0x46,0x4d},
-{0x54,0x8d,0xb5,0x91}, {0xc4,0x5d,0x05,0x71}, {0x06,0xd4,0x6f,0x04}, {0x50,0x15,0xff,0x60},
-{0x98,0xfb,0x24,0x19}, {0xbd,0xe9,0x97,0xd6}, {0x40,0x43,0xcc,0x89}, {0xd9,0x9e,0x77,0x67},
-{0xe8,0x42,0xbd,0xb0}, {0x89,0x8b,0x88,0x07}, {0x19,0x5b,0x38,0xe7}, {0xc8,0xee,0xdb,0x79},
-{0x7c,0x0a,0x47,0xa1}, {0x42,0x0f,0xe9,0x7c}, {0x84,0x1e,0xc9,0xf8}, {0x00,0x00,0x00,0x00},
-{0x80,0x86,0x83,0x09}, {0x2b,0xed,0x48,0x32}, {0x11,0x70,0xac,0x1e}, {0x5a,0x72,0x4e,0x6c},
-{0x0e,0xff,0xfb,0xfd}, {0x85,0x38,0x56,0x0f}, {0xae,0xd5,0x1e,0x3d}, {0x2d,0x39,0x27,0x36},
-{0x0f,0xd9,0x64,0x0a}, {0x5c,0xa6,0x21,0x68}, {0x5b,0x54,0xd1,0x9b}, {0x36,0x2e,0x3a,0x24},
-{0x0a,0x67,0xb1,0x0c}, {0x57,0xe7,0x0f,0x93}, {0xee,0x96,0xd2,0xb4}, {0x9b,0x91,0x9e,0x1b},
-{0xc0,0xc5,0x4f,0x80}, {0xdc,0x20,0xa2,0x61}, {0x77,0x4b,0x69,0x5a}, {0x12,0x1a,0x16,0x1c},
-{0x93,0xba,0x0a,0xe2}, {0xa0,0x2a,0xe5,0xc0}, {0x22,0xe0,0x43,0x3c}, {0x1b,0x17,0x1d,0x12},
-{0x09,0x0d,0x0b,0x0e}, {0x8b,0xc7,0xad,0xf2}, {0xb6,0xa8,0xb9,0x2d}, {0x1e,0xa9,0xc8,0x14},
-{0xf1,0x19,0x85,0x57}, {0x75,0x07,0x4c,0xaf}, {0x99,0xdd,0xbb,0xee}, {0x7f,0x60,0xfd,0xa3},
-{0x01,0x26,0x9f,0xf7}, {0x72,0xf5,0xbc,0x5c}, {0x66,0x3b,0xc5,0x44}, {0xfb,0x7e,0x34,0x5b},
-{0x43,0x29,0x76,0x8b}, {0x23,0xc6,0xdc,0xcb}, {0xed,0xfc,0x68,0xb6}, {0xe4,0xf1,0x63,0xb8},
-{0x31,0xdc,0xca,0xd7}, {0x63,0x85,0x10,0x42}, {0x97,0x22,0x40,0x13}, {0xc6,0x11,0x20,0x84},
-{0x4a,0x24,0x7d,0x85}, {0xbb,0x3d,0xf8,0xd2}, {0xf9,0x32,0x11,0xae}, {0x29,0xa1,0x6d,0xc7},
-{0x9e,0x2f,0x4b,0x1d}, {0xb2,0x30,0xf3,0xdc}, {0x86,0x52,0xec,0x0d}, {0xc1,0xe3,0xd0,0x77},
-{0xb3,0x16,0x6c,0x2b}, {0x70,0xb9,0x99,0xa9}, {0x94,0x48,0xfa,0x11}, {0xe9,0x64,0x22,0x47},
-{0xfc,0x8c,0xc4,0xa8}, {0xf0,0x3f,0x1a,0xa0}, {0x7d,0x2c,0xd8,0x56}, {0x33,0x90,0xef,0x22},
-{0x49,0x4e,0xc7,0x87}, {0x38,0xd1,0xc1,0xd9}, {0xca,0xa2,0xfe,0x8c}, {0xd4,0x0b,0x36,0x98},
-{0xf5,0x81,0xcf,0xa6}, {0x7a,0xde,0x28,0xa5}, {0xb7,0x8e,0x26,0xda}, {0xad,0xbf,0xa4,0x3f},
-{0x3a,0x9d,0xe4,0x2c}, {0x78,0x92,0x0d,0x50}, {0x5f,0xcc,0x9b,0x6a}, {0x7e,0x46,0x62,0x54},
-{0x8d,0x13,0xc2,0xf6}, {0xd8,0xb8,0xe8,0x90}, {0x39,0xf7,0x5e,0x2e}, {0xc3,0xaf,0xf5,0x82},
-{0x5d,0x80,0xbe,0x9f}, {0xd0,0x93,0x7c,0x69}, {0xd5,0x2d,0xa9,0x6f}, {0x25,0x12,0xb3,0xcf},
-{0xac,0x99,0x3b,0xc8}, {0x18,0x7d,0xa7,0x10}, {0x9c,0x63,0x6e,0xe8}, {0x3b,0xbb,0x7b,0xdb},
-{0x26,0x78,0x09,0xcd}, {0x59,0x18,0xf4,0x6e}, {0x9a,0xb7,0x01,0xec}, {0x4f,0x9a,0xa8,0x83},
-{0x95,0x6e,0x65,0xe6}, {0xff,0xe6,0x7e,0xaa}, {0xbc,0xcf,0x08,0x21}, {0x15,0xe8,0xe6,0xef},
-{0xe7,0x9b,0xd9,0xba}, {0x6f,0x36,0xce,0x4a}, {0x9f,0x09,0xd4,0xea}, {0xb0,0x7c,0xd6,0x29},
-{0xa4,0xb2,0xaf,0x31}, {0x3f,0x23,0x31,0x2a}, {0xa5,0x94,0x30,0xc6}, {0xa2,0x66,0xc0,0x35},
-{0x4e,0xbc,0x37,0x74}, {0x82,0xca,0xa6,0xfc}, {0x90,0xd0,0xb0,0xe0}, {0xa7,0xd8,0x15,0x33},
-{0x04,0x98,0x4a,0xf1}, {0xec,0xda,0xf7,0x41}, {0xcd,0x50,0x0e,0x7f}, {0x91,0xf6,0x2f,0x17},
-{0x4d,0xd6,0x8d,0x76}, {0xef,0xb0,0x4d,0x43}, {0xaa,0x4d,0x54,0xcc}, {0x96,0x04,0xdf,0xe4},
-{0xd1,0xb5,0xe3,0x9e}, {0x6a,0x88,0x1b,0x4c}, {0x2c,0x1f,0xb8,0xc1}, {0x65,0x51,0x7f,0x46},
-{0x5e,0xea,0x04,0x9d}, {0x8c,0x35,0x5d,0x01}, {0x87,0x74,0x73,0xfa}, {0x0b,0x41,0x2e,0xfb},
-{0x67,0x1d,0x5a,0xb3}, {0xdb,0xd2,0x52,0x92}, {0x10,0x56,0x33,0xe9}, {0xd6,0x47,0x13,0x6d},
-{0xd7,0x61,0x8c,0x9a}, {0xa1,0x0c,0x7a,0x37}, {0xf8,0x14,0x8e,0x59}, {0x13,0x3c,0x89,0xeb},
-{0xa9,0x27,0xee,0xce}, {0x61,0xc9,0x35,0xb7}, {0x1c,0xe5,0xed,0xe1}, {0x47,0xb1,0x3c,0x7a},
-{0xd2,0xdf,0x59,0x9c}, {0xf2,0x73,0x3f,0x55}, {0x14,0xce,0x79,0x18}, {0xc7,0x37,0xbf,0x73},
-{0xf7,0xcd,0xea,0x53}, {0xfd,0xaa,0x5b,0x5f}, {0x3d,0x6f,0x14,0xdf}, {0x44,0xdb,0x86,0x78},
-{0xaf,0xf3,0x81,0xca}, {0x68,0xc4,0x3e,0xb9}, {0x24,0x34,0x2c,0x38}, {0xa3,0x40,0x5f,0xc2},
-{0x1d,0xc3,0x72,0x16}, {0xe2,0x25,0x0c,0xbc}, {0x3c,0x49,0x8b,0x28}, {0x0d,0x95,0x41,0xff},
-{0xa8,0x01,0x71,0x39}, {0x0c,0xb3,0xde,0x08}, {0xb4,0xe4,0x9c,0xd8}, {0x56,0xc1,0x90,0x64},
-{0xcb,0x84,0x61,0x7b}, {0x32,0xb6,0x70,0xd5}, {0x6c,0x5c,0x74,0x48}, {0xb8,0x57,0x42,0xd0}
-	}
-};
-#define	T8	xT8.xt8
-
-static const word8 S5[256] = {
-0x52,0x09,0x6a,0xd5,
-0x30,0x36,0xa5,0x38,
-0xbf,0x40,0xa3,0x9e,
-0x81,0xf3,0xd7,0xfb,
-0x7c,0xe3,0x39,0x82,
-0x9b,0x2f,0xff,0x87,
-0x34,0x8e,0x43,0x44,
-0xc4,0xde,0xe9,0xcb,
-0x54,0x7b,0x94,0x32,
-0xa6,0xc2,0x23,0x3d,
-0xee,0x4c,0x95,0x0b,
-0x42,0xfa,0xc3,0x4e,
-0x08,0x2e,0xa1,0x66,
-0x28,0xd9,0x24,0xb2,
-0x76,0x5b,0xa2,0x49,
-0x6d,0x8b,0xd1,0x25,
-0x72,0xf8,0xf6,0x64,
-0x86,0x68,0x98,0x16,
-0xd4,0xa4,0x5c,0xcc,
-0x5d,0x65,0xb6,0x92,
-0x6c,0x70,0x48,0x50,
-0xfd,0xed,0xb9,0xda,
-0x5e,0x15,0x46,0x57,
-0xa7,0x8d,0x9d,0x84,
-0x90,0xd8,0xab,0x00,
-0x8c,0xbc,0xd3,0x0a,
-0xf7,0xe4,0x58,0x05,
-0xb8,0xb3,0x45,0x06,
-0xd0,0x2c,0x1e,0x8f,
-0xca,0x3f,0x0f,0x02,
-0xc1,0xaf,0xbd,0x03,
-0x01,0x13,0x8a,0x6b,
-0x3a,0x91,0x11,0x41,
-0x4f,0x67,0xdc,0xea,
-0x97,0xf2,0xcf,0xce,
-0xf0,0xb4,0xe6,0x73,
-0x96,0xac,0x74,0x22,
-0xe7,0xad,0x35,0x85,
-0xe2,0xf9,0x37,0xe8,
-0x1c,0x75,0xdf,0x6e,
-0x47,0xf1,0x1a,0x71,
-0x1d,0x29,0xc5,0x89,
-0x6f,0xb7,0x62,0x0e,
-0xaa,0x18,0xbe,0x1b,
-0xfc,0x56,0x3e,0x4b,
-0xc6,0xd2,0x79,0x20,
-0x9a,0xdb,0xc0,0xfe,
-0x78,0xcd,0x5a,0xf4,
-0x1f,0xdd,0xa8,0x33,
-0x88,0x07,0xc7,0x31,
-0xb1,0x12,0x10,0x59,
-0x27,0x80,0xec,0x5f,
-0x60,0x51,0x7f,0xa9,
-0x19,0xb5,0x4a,0x0d,
-0x2d,0xe5,0x7a,0x9f,
-0x93,0xc9,0x9c,0xef,
-0xa0,0xe0,0x3b,0x4d,
-0xae,0x2a,0xf5,0xb0,
-0xc8,0xeb,0xbb,0x3c,
-0x83,0x53,0x99,0x61,
-0x17,0x2b,0x04,0x7e,
-0xba,0x77,0xd6,0x26,
-0xe1,0x69,0x14,0x63,
-0x55,0x21,0x0c,0x7d
-};
-
-static const union xtab xU1 = {
-	.xt8 = {
-{0x00,0x00,0x00,0x00}, {0x0e,0x09,0x0d,0x0b}, {0x1c,0x12,0x1a,0x16}, {0x12,0x1b,0x17,0x1d},
-{0x38,0x24,0x34,0x2c}, {0x36,0x2d,0x39,0x27}, {0x24,0x36,0x2e,0x3a}, {0x2a,0x3f,0x23,0x31},
-{0x70,0x48,0x68,0x58}, {0x7e,0x41,0x65,0x53}, {0x6c,0x5a,0x72,0x4e}, {0x62,0x53,0x7f,0x45},
-{0x48,0x6c,0x5c,0x74}, {0x46,0x65,0x51,0x7f}, {0x54,0x7e,0x46,0x62}, {0x5a,0x77,0x4b,0x69},
-{0xe0,0x90,0xd0,0xb0}, {0xee,0x99,0xdd,0xbb}, {0xfc,0x82,0xca,0xa6}, {0xf2,0x8b,0xc7,0xad},
-{0xd8,0xb4,0xe4,0x9c}, {0xd6,0xbd,0xe9,0x97}, {0xc4,0xa6,0xfe,0x8a}, {0xca,0xaf,0xf3,0x81},
-{0x90,0xd8,0xb8,0xe8}, {0x9e,0xd1,0xb5,0xe3}, {0x8c,0xca,0xa2,0xfe}, {0x82,0xc3,0xaf,0xf5},
-{0xa8,0xfc,0x8c,0xc4}, {0xa6,0xf5,0x81,0xcf}, {0xb4,0xee,0x96,0xd2}, {0xba,0xe7,0x9b,0xd9},
-{0xdb,0x3b,0xbb,0x7b}, {0xd5,0x32,0xb6,0x70}, {0xc7,0x29,0xa1,0x6d}, {0xc9,0x20,0xac,0x66},
-{0xe3,0x1f,0x8f,0x57}, {0xed,0x16,0x82,0x5c}, {0xff,0x0d,0x95,0x41}, {0xf1,0x04,0x98,0x4a},
-{0xab,0x73,0xd3,0x23}, {0xa5,0x7a,0xde,0x28}, {0xb7,0x61,0xc9,0x35}, {0xb9,0x68,0xc4,0x3e},
-{0x93,0x57,0xe7,0x0f}, {0x9d,0x5e,0xea,0x04}, {0x8f,0x45,0xfd,0x19}, {0x81,0x4c,0xf0,0x12},
-{0x3b,0xab,0x6b,0xcb}, {0x35,0xa2,0x66,0xc0}, {0x27,0xb9,0x71,0xdd}, {0x29,0xb0,0x7c,0xd6},
-{0x03,0x8f,0x5f,0xe7}, {0x0d,0x86,0x52,0xec}, {0x1f,0x9d,0x45,0xf1}, {0x11,0x94,0x48,0xfa},
-{0x4b,0xe3,0x03,0x93}, {0x45,0xea,0x0e,0x98}, {0x57,0xf1,0x19,0x85}, {0x59,0xf8,0x14,0x8e},
-{0x73,0xc7,0x37,0xbf}, {0x7d,0xce,0x3a,0xb4}, {0x6f,0xd5,0x2d,0xa9}, {0x61,0xdc,0x20,0xa2},
-{0xad,0x76,0x6d,0xf6}, {0xa3,0x7f,0x60,0xfd}, {0xb1,0x64,0x77,0xe0}, {0xbf,0x6d,0x7a,0xeb},
-{0x95,0x52,0x59,0xda}, {0x9b,0x5b,0x54,0xd1}, {0x89,0x40,0x43,0xcc}, {0x87,0x49,0x4e,0xc7},
-{0xdd,0x3e,0x05,0xae}, {0xd3,0x37,0x08,0xa5}, {0xc1,0x2c,0x1f,0xb8}, {0xcf,0x25,0x12,0xb3},
-{0xe5,0x1a,0x31,0x82}, {0xeb,0x13,0x3c,0x89}, {0xf9,0x08,0x2b,0x94}, {0xf7,0x01,0x26,0x9f},
-{0x4d,0xe6,0xbd,0x46}, {0x43,0xef,0xb0,0x4d}, {0x51,0xf4,0xa7,0x50}, {0x5f,0xfd,0xaa,0x5b},
-{0x75,0xc2,0x89,0x6a}, {0x7b,0xcb,0x84,0x61}, {0x69,0xd0,0x93,0x7c}, {0x67,0xd9,0x9e,0x77},
-{0x3d,0xae,0xd5,0x1e}, {0x33,0xa7,0xd8,0x15}, {0x21,0xbc,0xcf,0x08}, {0x2f,0xb5,0xc2,0x03},
-{0x05,0x8a,0xe1,0x32}, {0x0b,0x83,0xec,0x39}, {0x19,0x98,0xfb,0x24}, {0x17,0x91,0xf6,0x2f},
-{0x76,0x4d,0xd6,0x8d}, {0x78,0x44,0xdb,0x86}, {0x6a,0x5f,0xcc,0x9b}, {0x64,0x56,0xc1,0x90},
-{0x4e,0x69,0xe2,0xa1}, {0x40,0x60,0xef,0xaa}, {0x52,0x7b,0xf8,0xb7}, {0x5c,0x72,0xf5,0xbc},
-{0x06,0x05,0xbe,0xd5}, {0x08,0x0c,0xb3,0xde}, {0x1a,0x17,0xa4,0xc3}, {0x14,0x1e,0xa9,0xc8},
-{0x3e,0x21,0x8a,0xf9}, {0x30,0x28,0x87,0xf2}, {0x22,0x33,0x90,0xef}, {0x2c,0x3a,0x9d,0xe4},
-{0x96,0xdd,0x06,0x3d}, {0x98,0xd4,0x0b,0x36}, {0x8a,0xcf,0x1c,0x2b}, {0x84,0xc6,0x11,0x20},
-{0xae,0xf9,0x32,0x11}, {0xa0,0xf0,0x3f,0x1a}, {0xb2,0xeb,0x28,0x07}, {0xbc,0xe2,0x25,0x0c},
-{0xe6,0x95,0x6e,0x65}, {0xe8,0x9c,0x63,0x6e}, {0xfa,0x87,0x74,0x73}, {0xf4,0x8e,0x79,0x78},
-{0xde,0xb1,0x5a,0x49}, {0xd0,0xb8,0x57,0x42}, {0xc2,0xa3,0x40,0x5f}, {0xcc,0xaa,0x4d,0x54},
-{0x41,0xec,0xda,0xf7}, {0x4f,0xe5,0xd7,0xfc}, {0x5d,0xfe,0xc0,0xe1}, {0x53,0xf7,0xcd,0xea},
-{0x79,0xc8,0xee,0xdb}, {0x77,0xc1,0xe3,0xd0}, {0x65,0xda,0xf4,0xcd}, {0x6b,0xd3,0xf9,0xc6},
-{0x31,0xa4,0xb2,0xaf}, {0x3f,0xad,0xbf,0xa4}, {0x2d,0xb6,0xa8,0xb9}, {0x23,0xbf,0xa5,0xb2},
-{0x09,0x80,0x86,0x83}, {0x07,0x89,0x8b,0x88}, {0x15,0x92,0x9c,0x95}, {0x1b,0x9b,0x91,0x9e},
-{0xa1,0x7c,0x0a,0x47}, {0xaf,0x75,0x07,0x4c}, {0xbd,0x6e,0x10,0x51}, {0xb3,0x67,0x1d,0x5a},
-{0x99,0x58,0x3e,0x6b}, {0x97,0x51,0x33,0x60}, {0x85,0x4a,0x24,0x7d}, {0x8b,0x43,0x29,0x76},
-{0xd1,0x34,0x62,0x1f}, {0xdf,0x3d,0x6f,0x14}, {0xcd,0x26,0x78,0x09}, {0xc3,0x2f,0x75,0x02},
-{0xe9,0x10,0x56,0x33}, {0xe7,0x19,0x5b,0x38}, {0xf5,0x02,0x4c,0x25}, {0xfb,0x0b,0x41,0x2e},
-{0x9a,0xd7,0x61,0x8c}, {0x94,0xde,0x6c,0x87}, {0x86,0xc5,0x7b,0x9a}, {0x88,0xcc,0x76,0x91},
-{0xa2,0xf3,0x55,0xa0}, {0xac,0xfa,0x58,0xab}, {0xbe,0xe1,0x4f,0xb6}, {0xb0,0xe8,0x42,0xbd},
-{0xea,0x9f,0x09,0xd4}, {0xe4,0x96,0x04,0xdf}, {0xf6,0x8d,0x13,0xc2}, {0xf8,0x84,0x1e,0xc9},
-{0xd2,0xbb,0x3d,0xf8}, {0xdc,0xb2,0x30,0xf3}, {0xce,0xa9,0x27,0xee}, {0xc0,0xa0,0x2a,0xe5},
-{0x7a,0x47,0xb1,0x3c}, {0x74,0x4e,0xbc,0x37}, {0x66,0x55,0xab,0x2a}, {0x68,0x5c,0xa6,0x21},
-{0x42,0x63,0x85,0x10}, {0x4c,0x6a,0x88,0x1b}, {0x5e,0x71,0x9f,0x06}, {0x50,0x78,0x92,0x0d},
-{0x0a,0x0f,0xd9,0x64}, {0x04,0x06,0xd4,0x6f}, {0x16,0x1d,0xc3,0x72}, {0x18,0x14,0xce,0x79},
-{0x32,0x2b,0xed,0x48}, {0x3c,0x22,0xe0,0x43}, {0x2e,0x39,0xf7,0x5e}, {0x20,0x30,0xfa,0x55},
-{0xec,0x9a,0xb7,0x01}, {0xe2,0x93,0xba,0x0a}, {0xf0,0x88,0xad,0x17}, {0xfe,0x81,0xa0,0x1c},
-{0xd4,0xbe,0x83,0x2d}, {0xda,0xb7,0x8e,0x26}, {0xc8,0xac,0x99,0x3b}, {0xc6,0xa5,0x94,0x30},
-{0x9c,0xd2,0xdf,0x59}, {0x92,0xdb,0xd2,0x52}, {0x80,0xc0,0xc5,0x4f}, {0x8e,0xc9,0xc8,0x44},
-{0xa4,0xf6,0xeb,0x75}, {0xaa,0xff,0xe6,0x7e}, {0xb8,0xe4,0xf1,0x63}, {0xb6,0xed,0xfc,0x68},
-{0x0c,0x0a,0x67,0xb1}, {0x02,0x03,0x6a,0xba}, {0x10,0x18,0x7d,0xa7}, {0x1e,0x11,0x70,0xac},
-{0x34,0x2e,0x53,0x9d}, {0x3a,0x27,0x5e,0x96}, {0x28,0x3c,0x49,0x8b}, {0x26,0x35,0x44,0x80},
-{0x7c,0x42,0x0f,0xe9}, {0x72,0x4b,0x02,0xe2}, {0x60,0x50,0x15,0xff}, {0x6e,0x59,0x18,0xf4},
-{0x44,0x66,0x3b,0xc5}, {0x4a,0x6f,0x36,0xce}, {0x58,0x74,0x21,0xd3}, {0x56,0x7d,0x2c,0xd8},
-{0x37,0xa1,0x0c,0x7a}, {0x39,0xa8,0x01,0x71}, {0x2b,0xb3,0x16,0x6c}, {0x25,0xba,0x1b,0x67},
-{0x0f,0x85,0x38,0x56}, {0x01,0x8c,0x35,0x5d}, {0x13,0x97,0x22,0x40}, {0x1d,0x9e,0x2f,0x4b},
-{0x47,0xe9,0x64,0x22}, {0x49,0xe0,0x69,0x29}, {0x5b,0xfb,0x7e,0x34}, {0x55,0xf2,0x73,0x3f},
-{0x7f,0xcd,0x50,0x0e}, {0x71,0xc4,0x5d,0x05}, {0x63,0xdf,0x4a,0x18}, {0x6d,0xd6,0x47,0x13},
-{0xd7,0x31,0xdc,0xca}, {0xd9,0x38,0xd1,0xc1}, {0xcb,0x23,0xc6,0xdc}, {0xc5,0x2a,0xcb,0xd7},
-{0xef,0x15,0xe8,0xe6}, {0xe1,0x1c,0xe5,0xed}, {0xf3,0x07,0xf2,0xf0}, {0xfd,0x0e,0xff,0xfb},
-{0xa7,0x79,0xb4,0x92}, {0xa9,0x70,0xb9,0x99}, {0xbb,0x6b,0xae,0x84}, {0xb5,0x62,0xa3,0x8f},
-{0x9f,0x5d,0x80,0xbe}, {0x91,0x54,0x8d,0xb5}, {0x83,0x4f,0x9a,0xa8}, {0x8d,0x46,0x97,0xa3}
-	}
-};
-#define	U1	xU1.xt8
-
-static const union xtab xU2 = {
-	.xt8 = {
-{0x00,0x00,0x00,0x00}, {0x0b,0x0e,0x09,0x0d}, {0x16,0x1c,0x12,0x1a}, {0x1d,0x12,0x1b,0x17},
-{0x2c,0x38,0x24,0x34}, {0x27,0x36,0x2d,0x39}, {0x3a,0x24,0x36,0x2e}, {0x31,0x2a,0x3f,0x23},
-{0x58,0x70,0x48,0x68}, {0x53,0x7e,0x41,0x65}, {0x4e,0x6c,0x5a,0x72}, {0x45,0x62,0x53,0x7f},
-{0x74,0x48,0x6c,0x5c}, {0x7f,0x46,0x65,0x51}, {0x62,0x54,0x7e,0x46}, {0x69,0x5a,0x77,0x4b},
-{0xb0,0xe0,0x90,0xd0}, {0xbb,0xee,0x99,0xdd}, {0xa6,0xfc,0x82,0xca}, {0xad,0xf2,0x8b,0xc7},
-{0x9c,0xd8,0xb4,0xe4}, {0x97,0xd6,0xbd,0xe9}, {0x8a,0xc4,0xa6,0xfe}, {0x81,0xca,0xaf,0xf3},
-{0xe8,0x90,0xd8,0xb8}, {0xe3,0x9e,0xd1,0xb5}, {0xfe,0x8c,0xca,0xa2}, {0xf5,0x82,0xc3,0xaf},
-{0xc4,0xa8,0xfc,0x8c}, {0xcf,0xa6,0xf5,0x81}, {0xd2,0xb4,0xee,0x96}, {0xd9,0xba,0xe7,0x9b},
-{0x7b,0xdb,0x3b,0xbb}, {0x70,0xd5,0x32,0xb6}, {0x6d,0xc7,0x29,0xa1}, {0x66,0xc9,0x20,0xac},
-{0x57,0xe3,0x1f,0x8f}, {0x5c,0xed,0x16,0x82}, {0x41,0xff,0x0d,0x95}, {0x4a,0xf1,0x04,0x98},
-{0x23,0xab,0x73,0xd3}, {0x28,0xa5,0x7a,0xde}, {0x35,0xb7,0x61,0xc9}, {0x3e,0xb9,0x68,0xc4},
-{0x0f,0x93,0x57,0xe7}, {0x04,0x9d,0x5e,0xea}, {0x19,0x8f,0x45,0xfd}, {0x12,0x81,0x4c,0xf0},
-{0xcb,0x3b,0xab,0x6b}, {0xc0,0x35,0xa2,0x66}, {0xdd,0x27,0xb9,0x71}, {0xd6,0x29,0xb0,0x7c},
-{0xe7,0x03,0x8f,0x5f}, {0xec,0x0d,0x86,0x52}, {0xf1,0x1f,0x9d,0x45}, {0xfa,0x11,0x94,0x48},
-{0x93,0x4b,0xe3,0x03}, {0x98,0x45,0xea,0x0e}, {0x85,0x57,0xf1,0x19}, {0x8e,0x59,0xf8,0x14},
-{0xbf,0x73,0xc7,0x37}, {0xb4,0x7d,0xce,0x3a}, {0xa9,0x6f,0xd5,0x2d}, {0xa2,0x61,0xdc,0x20},
-{0xf6,0xad,0x76,0x6d}, {0xfd,0xa3,0x7f,0x60}, {0xe0,0xb1,0x64,0x77}, {0xeb,0xbf,0x6d,0x7a},
-{0xda,0x95,0x52,0x59}, {0xd1,0x9b,0x5b,0x54}, {0xcc,0x89,0x40,0x43}, {0xc7,0x87,0x49,0x4e},
-{0xae,0xdd,0x3e,0x05}, {0xa5,0xd3,0x37,0x08}, {0xb8,0xc1,0x2c,0x1f}, {0xb3,0xcf,0x25,0x12},
-{0x82,0xe5,0x1a,0x31}, {0x89,0xeb,0x13,0x3c}, {0x94,0xf9,0x08,0x2b}, {0x9f,0xf7,0x01,0x26},
-{0x46,0x4d,0xe6,0xbd}, {0x4d,0x43,0xef,0xb0}, {0x50,0x51,0xf4,0xa7}, {0x5b,0x5f,0xfd,0xaa},
-{0x6a,0x75,0xc2,0x89}, {0x61,0x7b,0xcb,0x84}, {0x7c,0x69,0xd0,0x93}, {0x77,0x67,0xd9,0x9e},
-{0x1e,0x3d,0xae,0xd5}, {0x15,0x33,0xa7,0xd8}, {0x08,0x21,0xbc,0xcf}, {0x03,0x2f,0xb5,0xc2},
-{0x32,0x05,0x8a,0xe1}, {0x39,0x0b,0x83,0xec}, {0x24,0x19,0x98,0xfb}, {0x2f,0x17,0x91,0xf6},
-{0x8d,0x76,0x4d,0xd6}, {0x86,0x78,0x44,0xdb}, {0x9b,0x6a,0x5f,0xcc}, {0x90,0x64,0x56,0xc1},
-{0xa1,0x4e,0x69,0xe2}, {0xaa,0x40,0x60,0xef}, {0xb7,0x52,0x7b,0xf8}, {0xbc,0x5c,0x72,0xf5},
-{0xd5,0x06,0x05,0xbe}, {0xde,0x08,0x0c,0xb3}, {0xc3,0x1a,0x17,0xa4}, {0xc8,0x14,0x1e,0xa9},
-{0xf9,0x3e,0x21,0x8a}, {0xf2,0x30,0x28,0x87}, {0xef,0x22,0x33,0x90}, {0xe4,0x2c,0x3a,0x9d},
-{0x3d,0x96,0xdd,0x06}, {0x36,0x98,0xd4,0x0b}, {0x2b,0x8a,0xcf,0x1c}, {0x20,0x84,0xc6,0x11},
-{0x11,0xae,0xf9,0x32}, {0x1a,0xa0,0xf0,0x3f}, {0x07,0xb2,0xeb,0x28}, {0x0c,0xbc,0xe2,0x25},
-{0x65,0xe6,0x95,0x6e}, {0x6e,0xe8,0x9c,0x63}, {0x73,0xfa,0x87,0x74}, {0x78,0xf4,0x8e,0x79},
-{0x49,0xde,0xb1,0x5a}, {0x42,0xd0,0xb8,0x57}, {0x5f,0xc2,0xa3,0x40}, {0x54,0xcc,0xaa,0x4d},
-{0xf7,0x41,0xec,0xda}, {0xfc,0x4f,0xe5,0xd7}, {0xe1,0x5d,0xfe,0xc0}, {0xea,0x53,0xf7,0xcd},
-{0xdb,0x79,0xc8,0xee}, {0xd0,0x77,0xc1,0xe3}, {0xcd,0x65,0xda,0xf4}, {0xc6,0x6b,0xd3,0xf9},
-{0xaf,0x31,0xa4,0xb2}, {0xa4,0x3f,0xad,0xbf}, {0xb9,0x2d,0xb6,0xa8}, {0xb2,0x23,0xbf,0xa5},
-{0x83,0x09,0x80,0x86}, {0x88,0x07,0x89,0x8b}, {0x95,0x15,0x92,0x9c}, {0x9e,0x1b,0x9b,0x91},
-{0x47,0xa1,0x7c,0x0a}, {0x4c,0xaf,0x75,0x07}, {0x51,0xbd,0x6e,0x10}, {0x5a,0xb3,0x67,0x1d},
-{0x6b,0x99,0x58,0x3e}, {0x60,0x97,0x51,0x33}, {0x7d,0x85,0x4a,0x24}, {0x76,0x8b,0x43,0x29},
-{0x1f,0xd1,0x34,0x62}, {0x14,0xdf,0x3d,0x6f}, {0x09,0xcd,0x26,0x78}, {0x02,0xc3,0x2f,0x75},
-{0x33,0xe9,0x10,0x56}, {0x38,0xe7,0x19,0x5b}, {0x25,0xf5,0x02,0x4c}, {0x2e,0xfb,0x0b,0x41},
-{0x8c,0x9a,0xd7,0x61}, {0x87,0x94,0xde,0x6c}, {0x9a,0x86,0xc5,0x7b}, {0x91,0x88,0xcc,0x76},
-{0xa0,0xa2,0xf3,0x55}, {0xab,0xac,0xfa,0x58}, {0xb6,0xbe,0xe1,0x4f}, {0xbd,0xb0,0xe8,0x42},
-{0xd4,0xea,0x9f,0x09}, {0xdf,0xe4,0x96,0x04}, {0xc2,0xf6,0x8d,0x13}, {0xc9,0xf8,0x84,0x1e},
-{0xf8,0xd2,0xbb,0x3d}, {0xf3,0xdc,0xb2,0x30}, {0xee,0xce,0xa9,0x27}, {0xe5,0xc0,0xa0,0x2a},
-{0x3c,0x7a,0x47,0xb1}, {0x37,0x74,0x4e,0xbc}, {0x2a,0x66,0x55,0xab}, {0x21,0x68,0x5c,0xa6},
-{0x10,0x42,0x63,0x85}, {0x1b,0x4c,0x6a,0x88}, {0x06,0x5e,0x71,0x9f}, {0x0d,0x50,0x78,0x92},
-{0x64,0x0a,0x0f,0xd9}, {0x6f,0x04,0x06,0xd4}, {0x72,0x16,0x1d,0xc3}, {0x79,0x18,0x14,0xce},
-{0x48,0x32,0x2b,0xed}, {0x43,0x3c,0x22,0xe0}, {0x5e,0x2e,0x39,0xf7}, {0x55,0x20,0x30,0xfa},
-{0x01,0xec,0x9a,0xb7}, {0x0a,0xe2,0x93,0xba}, {0x17,0xf0,0x88,0xad}, {0x1c,0xfe,0x81,0xa0},
-{0x2d,0xd4,0xbe,0x83}, {0x26,0xda,0xb7,0x8e}, {0x3b,0xc8,0xac,0x99}, {0x30,0xc6,0xa5,0x94},
-{0x59,0x9c,0xd2,0xdf}, {0x52,0x92,0xdb,0xd2}, {0x4f,0x80,0xc0,0xc5}, {0x44,0x8e,0xc9,0xc8},
-{0x75,0xa4,0xf6,0xeb}, {0x7e,0xaa,0xff,0xe6}, {0x63,0xb8,0xe4,0xf1}, {0x68,0xb6,0xed,0xfc},
-{0xb1,0x0c,0x0a,0x67}, {0xba,0x02,0x03,0x6a}, {0xa7,0x10,0x18,0x7d}, {0xac,0x1e,0x11,0x70},
-{0x9d,0x34,0x2e,0x53}, {0x96,0x3a,0x27,0x5e}, {0x8b,0x28,0x3c,0x49}, {0x80,0x26,0x35,0x44},
-{0xe9,0x7c,0x42,0x0f}, {0xe2,0x72,0x4b,0x02}, {0xff,0x60,0x50,0x15}, {0xf4,0x6e,0x59,0x18},
-{0xc5,0x44,0x66,0x3b}, {0xce,0x4a,0x6f,0x36}, {0xd3,0x58,0x74,0x21}, {0xd8,0x56,0x7d,0x2c},
-{0x7a,0x37,0xa1,0x0c}, {0x71,0x39,0xa8,0x01}, {0x6c,0x2b,0xb3,0x16}, {0x67,0x25,0xba,0x1b},
-{0x56,0x0f,0x85,0x38}, {0x5d,0x01,0x8c,0x35}, {0x40,0x13,0x97,0x22}, {0x4b,0x1d,0x9e,0x2f},
-{0x22,0x47,0xe9,0x64}, {0x29,0x49,0xe0,0x69}, {0x34,0x5b,0xfb,0x7e}, {0x3f,0x55,0xf2,0x73},
-{0x0e,0x7f,0xcd,0x50}, {0x05,0x71,0xc4,0x5d}, {0x18,0x63,0xdf,0x4a}, {0x13,0x6d,0xd6,0x47},
-{0xca,0xd7,0x31,0xdc}, {0xc1,0xd9,0x38,0xd1}, {0xdc,0xcb,0x23,0xc6}, {0xd7,0xc5,0x2a,0xcb},
-{0xe6,0xef,0x15,0xe8}, {0xed,0xe1,0x1c,0xe5}, {0xf0,0xf3,0x07,0xf2}, {0xfb,0xfd,0x0e,0xff},
-{0x92,0xa7,0x79,0xb4}, {0x99,0xa9,0x70,0xb9}, {0x84,0xbb,0x6b,0xae}, {0x8f,0xb5,0x62,0xa3},
-{0xbe,0x9f,0x5d,0x80}, {0xb5,0x91,0x54,0x8d}, {0xa8,0x83,0x4f,0x9a}, {0xa3,0x8d,0x46,0x97}
-	}
-};
-#define	U2	xU2.xt8
-
-static const union xtab xU3 = {
-	.xt8 = {
-{0x00,0x00,0x00,0x00}, {0x0d,0x0b,0x0e,0x09}, {0x1a,0x16,0x1c,0x12}, {0x17,0x1d,0x12,0x1b},
-{0x34,0x2c,0x38,0x24}, {0x39,0x27,0x36,0x2d}, {0x2e,0x3a,0x24,0x36}, {0x23,0x31,0x2a,0x3f},
-{0x68,0x58,0x70,0x48}, {0x65,0x53,0x7e,0x41}, {0x72,0x4e,0x6c,0x5a}, {0x7f,0x45,0x62,0x53},
-{0x5c,0x74,0x48,0x6c}, {0x51,0x7f,0x46,0x65}, {0x46,0x62,0x54,0x7e}, {0x4b,0x69,0x5a,0x77},
-{0xd0,0xb0,0xe0,0x90}, {0xdd,0xbb,0xee,0x99}, {0xca,0xa6,0xfc,0x82}, {0xc7,0xad,0xf2,0x8b},
-{0xe4,0x9c,0xd8,0xb4}, {0xe9,0x97,0xd6,0xbd}, {0xfe,0x8a,0xc4,0xa6}, {0xf3,0x81,0xca,0xaf},
-{0xb8,0xe8,0x90,0xd8}, {0xb5,0xe3,0x9e,0xd1}, {0xa2,0xfe,0x8c,0xca}, {0xaf,0xf5,0x82,0xc3},
-{0x8c,0xc4,0xa8,0xfc}, {0x81,0xcf,0xa6,0xf5}, {0x96,0xd2,0xb4,0xee}, {0x9b,0xd9,0xba,0xe7},
-{0xbb,0x7b,0xdb,0x3b}, {0xb6,0x70,0xd5,0x32}, {0xa1,0x6d,0xc7,0x29}, {0xac,0x66,0xc9,0x20},
-{0x8f,0x57,0xe3,0x1f}, {0x82,0x5c,0xed,0x16}, {0x95,0x41,0xff,0x0d}, {0x98,0x4a,0xf1,0x04},
-{0xd3,0x23,0xab,0x73}, {0xde,0x28,0xa5,0x7a}, {0xc9,0x35,0xb7,0x61}, {0xc4,0x3e,0xb9,0x68},
-{0xe7,0x0f,0x93,0x57}, {0xea,0x04,0x9d,0x5e}, {0xfd,0x19,0x8f,0x45}, {0xf0,0x12,0x81,0x4c},
-{0x6b,0xcb,0x3b,0xab}, {0x66,0xc0,0x35,0xa2}, {0x71,0xdd,0x27,0xb9}, {0x7c,0xd6,0x29,0xb0},
-{0x5f,0xe7,0x03,0x8f}, {0x52,0xec,0x0d,0x86}, {0x45,0xf1,0x1f,0x9d}, {0x48,0xfa,0x11,0x94},
-{0x03,0x93,0x4b,0xe3}, {0x0e,0x98,0x45,0xea}, {0x19,0x85,0x57,0xf1}, {0x14,0x8e,0x59,0xf8},
-{0x37,0xbf,0x73,0xc7}, {0x3a,0xb4,0x7d,0xce}, {0x2d,0xa9,0x6f,0xd5}, {0x20,0xa2,0x61,0xdc},
-{0x6d,0xf6,0xad,0x76}, {0x60,0xfd,0xa3,0x7f}, {0x77,0xe0,0xb1,0x64}, {0x7a,0xeb,0xbf,0x6d},
-{0x59,0xda,0x95,0x52}, {0x54,0xd1,0x9b,0x5b}, {0x43,0xcc,0x89,0x40}, {0x4e,0xc7,0x87,0x49},
-{0x05,0xae,0xdd,0x3e}, {0x08,0xa5,0xd3,0x37}, {0x1f,0xb8,0xc1,0x2c}, {0x12,0xb3,0xcf,0x25},
-{0x31,0x82,0xe5,0x1a}, {0x3c,0x89,0xeb,0x13}, {0x2b,0x94,0xf9,0x08}, {0x26,0x9f,0xf7,0x01},
-{0xbd,0x46,0x4d,0xe6}, {0xb0,0x4d,0x43,0xef}, {0xa7,0x50,0x51,0xf4}, {0xaa,0x5b,0x5f,0xfd},
-{0x89,0x6a,0x75,0xc2}, {0x84,0x61,0x7b,0xcb}, {0x93,0x7c,0x69,0xd0}, {0x9e,0x77,0x67,0xd9},
-{0xd5,0x1e,0x3d,0xae}, {0xd8,0x15,0x33,0xa7}, {0xcf,0x08,0x21,0xbc}, {0xc2,0x03,0x2f,0xb5},
-{0xe1,0x32,0x05,0x8a}, {0xec,0x39,0x0b,0x83}, {0xfb,0x24,0x19,0x98}, {0xf6,0x2f,0x17,0x91},
-{0xd6,0x8d,0x76,0x4d}, {0xdb,0x86,0x78,0x44}, {0xcc,0x9b,0x6a,0x5f}, {0xc1,0x90,0x64,0x56},
-{0xe2,0xa1,0x4e,0x69}, {0xef,0xaa,0x40,0x60}, {0xf8,0xb7,0x52,0x7b}, {0xf5,0xbc,0x5c,0x72},
-{0xbe,0xd5,0x06,0x05}, {0xb3,0xde,0x08,0x0c}, {0xa4,0xc3,0x1a,0x17}, {0xa9,0xc8,0x14,0x1e},
-{0x8a,0xf9,0x3e,0x21}, {0x87,0xf2,0x30,0x28}, {0x90,0xef,0x22,0x33}, {0x9d,0xe4,0x2c,0x3a},
-{0x06,0x3d,0x96,0xdd}, {0x0b,0x36,0x98,0xd4}, {0x1c,0x2b,0x8a,0xcf}, {0x11,0x20,0x84,0xc6},
-{0x32,0x11,0xae,0xf9}, {0x3f,0x1a,0xa0,0xf0}, {0x28,0x07,0xb2,0xeb}, {0x25,0x0c,0xbc,0xe2},
-{0x6e,0x65,0xe6,0x95}, {0x63,0x6e,0xe8,0x9c}, {0x74,0x73,0xfa,0x87}, {0x79,0x78,0xf4,0x8e},
-{0x5a,0x49,0xde,0xb1}, {0x57,0x42,0xd0,0xb8}, {0x40,0x5f,0xc2,0xa3}, {0x4d,0x54,0xcc,0xaa},
-{0xda,0xf7,0x41,0xec}, {0xd7,0xfc,0x4f,0xe5}, {0xc0,0xe1,0x5d,0xfe}, {0xcd,0xea,0x53,0xf7},
-{0xee,0xdb,0x79,0xc8}, {0xe3,0xd0,0x77,0xc1}, {0xf4,0xcd,0x65,0xda}, {0xf9,0xc6,0x6b,0xd3},
-{0xb2,0xaf,0x31,0xa4}, {0xbf,0xa4,0x3f,0xad}, {0xa8,0xb9,0x2d,0xb6}, {0xa5,0xb2,0x23,0xbf},
-{0x86,0x83,0x09,0x80}, {0x8b,0x88,0x07,0x89}, {0x9c,0x95,0x15,0x92}, {0x91,0x9e,0x1b,0x9b},
-{0x0a,0x47,0xa1,0x7c}, {0x07,0x4c,0xaf,0x75}, {0x10,0x51,0xbd,0x6e}, {0x1d,0x5a,0xb3,0x67},
-{0x3e,0x6b,0x99,0x58}, {0x33,0x60,0x97,0x51}, {0x24,0x7d,0x85,0x4a}, {0x29,0x76,0x8b,0x43},
-{0x62,0x1f,0xd1,0x34}, {0x6f,0x14,0xdf,0x3d}, {0x78,0x09,0xcd,0x26}, {0x75,0x02,0xc3,0x2f},
-{0x56,0x33,0xe9,0x10}, {0x5b,0x38,0xe7,0x19}, {0x4c,0x25,0xf5,0x02}, {0x41,0x2e,0xfb,0x0b},
-{0x61,0x8c,0x9a,0xd7}, {0x6c,0x87,0x94,0xde}, {0x7b,0x9a,0x86,0xc5}, {0x76,0x91,0x88,0xcc},
-{0x55,0xa0,0xa2,0xf3}, {0x58,0xab,0xac,0xfa}, {0x4f,0xb6,0xbe,0xe1}, {0x42,0xbd,0xb0,0xe8},
-{0x09,0xd4,0xea,0x9f}, {0x04,0xdf,0xe4,0x96}, {0x13,0xc2,0xf6,0x8d}, {0x1e,0xc9,0xf8,0x84},
-{0x3d,0xf8,0xd2,0xbb}, {0x30,0xf3,0xdc,0xb2}, {0x27,0xee,0xce,0xa9}, {0x2a,0xe5,0xc0,0xa0},
-{0xb1,0x3c,0x7a,0x47}, {0xbc,0x37,0x74,0x4e}, {0xab,0x2a,0x66,0x55}, {0xa6,0x21,0x68,0x5c},
-{0x85,0x10,0x42,0x63}, {0x88,0x1b,0x4c,0x6a}, {0x9f,0x06,0x5e,0x71}, {0x92,0x0d,0x50,0x78},
-{0xd9,0x64,0x0a,0x0f}, {0xd4,0x6f,0x04,0x06}, {0xc3,0x72,0x16,0x1d}, {0xce,0x79,0x18,0x14},
-{0xed,0x48,0x32,0x2b}, {0xe0,0x43,0x3c,0x22}, {0xf7,0x5e,0x2e,0x39}, {0xfa,0x55,0x20,0x30},
-{0xb7,0x01,0xec,0x9a}, {0xba,0x0a,0xe2,0x93}, {0xad,0x17,0xf0,0x88}, {0xa0,0x1c,0xfe,0x81},
-{0x83,0x2d,0xd4,0xbe}, {0x8e,0x26,0xda,0xb7}, {0x99,0x3b,0xc8,0xac}, {0x94,0x30,0xc6,0xa5},
-{0xdf,0x59,0x9c,0xd2}, {0xd2,0x52,0x92,0xdb}, {0xc5,0x4f,0x80,0xc0}, {0xc8,0x44,0x8e,0xc9},
-{0xeb,0x75,0xa4,0xf6}, {0xe6,0x7e,0xaa,0xff}, {0xf1,0x63,0xb8,0xe4}, {0xfc,0x68,0xb6,0xed},
-{0x67,0xb1,0x0c,0x0a}, {0x6a,0xba,0x02,0x03}, {0x7d,0xa7,0x10,0x18}, {0x70,0xac,0x1e,0x11},
-{0x53,0x9d,0x34,0x2e}, {0x5e,0x96,0x3a,0x27}, {0x49,0x8b,0x28,0x3c}, {0x44,0x80,0x26,0x35},
-{0x0f,0xe9,0x7c,0x42}, {0x02,0xe2,0x72,0x4b}, {0x15,0xff,0x60,0x50}, {0x18,0xf4,0x6e,0x59},
-{0x3b,0xc5,0x44,0x66}, {0x36,0xce,0x4a,0x6f}, {0x21,0xd3,0x58,0x74}, {0x2c,0xd8,0x56,0x7d},
-{0x0c,0x7a,0x37,0xa1}, {0x01,0x71,0x39,0xa8}, {0x16,0x6c,0x2b,0xb3}, {0x1b,0x67,0x25,0xba},
-{0x38,0x56,0x0f,0x85}, {0x35,0x5d,0x01,0x8c}, {0x22,0x40,0x13,0x97}, {0x2f,0x4b,0x1d,0x9e},
-{0x64,0x22,0x47,0xe9}, {0x69,0x29,0x49,0xe0}, {0x7e,0x34,0x5b,0xfb}, {0x73,0x3f,0x55,0xf2},
-{0x50,0x0e,0x7f,0xcd}, {0x5d,0x05,0x71,0xc4}, {0x4a,0x18,0x63,0xdf}, {0x47,0x13,0x6d,0xd6},
-{0xdc,0xca,0xd7,0x31}, {0xd1,0xc1,0xd9,0x38}, {0xc6,0xdc,0xcb,0x23}, {0xcb,0xd7,0xc5,0x2a},
-{0xe8,0xe6,0xef,0x15}, {0xe5,0xed,0xe1,0x1c}, {0xf2,0xf0,0xf3,0x07}, {0xff,0xfb,0xfd,0x0e},
-{0xb4,0x92,0xa7,0x79}, {0xb9,0x99,0xa9,0x70}, {0xae,0x84,0xbb,0x6b}, {0xa3,0x8f,0xb5,0x62},
-{0x80,0xbe,0x9f,0x5d}, {0x8d,0xb5,0x91,0x54}, {0x9a,0xa8,0x83,0x4f}, {0x97,0xa3,0x8d,0x46}
-	}
-};
-#define	U3	xU3.xt8
-
-static const union xtab xU4 = {
-	.xt8 = {
-{0x00,0x00,0x00,0x00}, {0x09,0x0d,0x0b,0x0e}, {0x12,0x1a,0x16,0x1c}, {0x1b,0x17,0x1d,0x12},
-{0x24,0x34,0x2c,0x38}, {0x2d,0x39,0x27,0x36}, {0x36,0x2e,0x3a,0x24}, {0x3f,0x23,0x31,0x2a},
-{0x48,0x68,0x58,0x70}, {0x41,0x65,0x53,0x7e}, {0x5a,0x72,0x4e,0x6c}, {0x53,0x7f,0x45,0x62},
-{0x6c,0x5c,0x74,0x48}, {0x65,0x51,0x7f,0x46}, {0x7e,0x46,0x62,0x54}, {0x77,0x4b,0x69,0x5a},
-{0x90,0xd0,0xb0,0xe0}, {0x99,0xdd,0xbb,0xee}, {0x82,0xca,0xa6,0xfc}, {0x8b,0xc7,0xad,0xf2},
-{0xb4,0xe4,0x9c,0xd8}, {0xbd,0xe9,0x97,0xd6}, {0xa6,0xfe,0x8a,0xc4}, {0xaf,0xf3,0x81,0xca},
-{0xd8,0xb8,0xe8,0x90}, {0xd1,0xb5,0xe3,0x9e}, {0xca,0xa2,0xfe,0x8c}, {0xc3,0xaf,0xf5,0x82},
-{0xfc,0x8c,0xc4,0xa8}, {0xf5,0x81,0xcf,0xa6}, {0xee,0x96,0xd2,0xb4}, {0xe7,0x9b,0xd9,0xba},
-{0x3b,0xbb,0x7b,0xdb}, {0x32,0xb6,0x70,0xd5}, {0x29,0xa1,0x6d,0xc7}, {0x20,0xac,0x66,0xc9},
-{0x1f,0x8f,0x57,0xe3}, {0x16,0x82,0x5c,0xed}, {0x0d,0x95,0x41,0xff}, {0x04,0x98,0x4a,0xf1},
-{0x73,0xd3,0x23,0xab}, {0x7a,0xde,0x28,0xa5}, {0x61,0xc9,0x35,0xb7}, {0x68,0xc4,0x3e,0xb9},
-{0x57,0xe7,0x0f,0x93}, {0x5e,0xea,0x04,0x9d}, {0x45,0xfd,0x19,0x8f}, {0x4c,0xf0,0x12,0x81},
-{0xab,0x6b,0xcb,0x3b}, {0xa2,0x66,0xc0,0x35}, {0xb9,0x71,0xdd,0x27}, {0xb0,0x7c,0xd6,0x29},
-{0x8f,0x5f,0xe7,0x03}, {0x86,0x52,0xec,0x0d}, {0x9d,0x45,0xf1,0x1f}, {0x94,0x48,0xfa,0x11},
-{0xe3,0x03,0x93,0x4b}, {0xea,0x0e,0x98,0x45}, {0xf1,0x19,0x85,0x57}, {0xf8,0x14,0x8e,0x59},
-{0xc7,0x37,0xbf,0x73}, {0xce,0x3a,0xb4,0x7d}, {0xd5,0x2d,0xa9,0x6f}, {0xdc,0x20,0xa2,0x61},
-{0x76,0x6d,0xf6,0xad}, {0x7f,0x60,0xfd,0xa3}, {0x64,0x77,0xe0,0xb1}, {0x6d,0x7a,0xeb,0xbf},
-{0x52,0x59,0xda,0x95}, {0x5b,0x54,0xd1,0x9b}, {0x40,0x43,0xcc,0x89}, {0x49,0x4e,0xc7,0x87},
-{0x3e,0x05,0xae,0xdd}, {0x37,0x08,0xa5,0xd3}, {0x2c,0x1f,0xb8,0xc1}, {0x25,0x12,0xb3,0xcf},
-{0x1a,0x31,0x82,0xe5}, {0x13,0x3c,0x89,0xeb}, {0x08,0x2b,0x94,0xf9}, {0x01,0x26,0x9f,0xf7},
-{0xe6,0xbd,0x46,0x4d}, {0xef,0xb0,0x4d,0x43}, {0xf4,0xa7,0x50,0x51}, {0xfd,0xaa,0x5b,0x5f},
-{0xc2,0x89,0x6a,0x75}, {0xcb,0x84,0x61,0x7b}, {0xd0,0x93,0x7c,0x69}, {0xd9,0x9e,0x77,0x67},
-{0xae,0xd5,0x1e,0x3d}, {0xa7,0xd8,0x15,0x33}, {0xbc,0xcf,0x08,0x21}, {0xb5,0xc2,0x03,0x2f},
-{0x8a,0xe1,0x32,0x05}, {0x83,0xec,0x39,0x0b}, {0x98,0xfb,0x24,0x19}, {0x91,0xf6,0x2f,0x17},
-{0x4d,0xd6,0x8d,0x76}, {0x44,0xdb,0x86,0x78}, {0x5f,0xcc,0x9b,0x6a}, {0x56,0xc1,0x90,0x64},
-{0x69,0xe2,0xa1,0x4e}, {0x60,0xef,0xaa,0x40}, {0x7b,0xf8,0xb7,0x52}, {0x72,0xf5,0xbc,0x5c},
-{0x05,0xbe,0xd5,0x06}, {0x0c,0xb3,0xde,0x08}, {0x17,0xa4,0xc3,0x1a}, {0x1e,0xa9,0xc8,0x14},
-{0x21,0x8a,0xf9,0x3e}, {0x28,0x87,0xf2,0x30}, {0x33,0x90,0xef,0x22}, {0x3a,0x9d,0xe4,0x2c},
-{0xdd,0x06,0x3d,0x96}, {0xd4,0x0b,0x36,0x98}, {0xcf,0x1c,0x2b,0x8a}, {0xc6,0x11,0x20,0x84},
-{0xf9,0x32,0x11,0xae}, {0xf0,0x3f,0x1a,0xa0}, {0xeb,0x28,0x07,0xb2}, {0xe2,0x25,0x0c,0xbc},
-{0x95,0x6e,0x65,0xe6}, {0x9c,0x63,0x6e,0xe8}, {0x87,0x74,0x73,0xfa}, {0x8e,0x79,0x78,0xf4},
-{0xb1,0x5a,0x49,0xde}, {0xb8,0x57,0x42,0xd0}, {0xa3,0x40,0x5f,0xc2}, {0xaa,0x4d,0x54,0xcc},
-{0xec,0xda,0xf7,0x41}, {0xe5,0xd7,0xfc,0x4f}, {0xfe,0xc0,0xe1,0x5d}, {0xf7,0xcd,0xea,0x53},
-{0xc8,0xee,0xdb,0x79}, {0xc1,0xe3,0xd0,0x77}, {0xda,0xf4,0xcd,0x65}, {0xd3,0xf9,0xc6,0x6b},
-{0xa4,0xb2,0xaf,0x31}, {0xad,0xbf,0xa4,0x3f}, {0xb6,0xa8,0xb9,0x2d}, {0xbf,0xa5,0xb2,0x23},
-{0x80,0x86,0x83,0x09}, {0x89,0x8b,0x88,0x07}, {0x92,0x9c,0x95,0x15}, {0x9b,0x91,0x9e,0x1b},
-{0x7c,0x0a,0x47,0xa1}, {0x75,0x07,0x4c,0xaf}, {0x6e,0x10,0x51,0xbd}, {0x67,0x1d,0x5a,0xb3},
-{0x58,0x3e,0x6b,0x99}, {0x51,0x33,0x60,0x97}, {0x4a,0x24,0x7d,0x85}, {0x43,0x29,0x76,0x8b},
-{0x34,0x62,0x1f,0xd1}, {0x3d,0x6f,0x14,0xdf}, {0x26,0x78,0x09,0xcd}, {0x2f,0x75,0x02,0xc3},
-{0x10,0x56,0x33,0xe9}, {0x19,0x5b,0x38,0xe7}, {0x02,0x4c,0x25,0xf5}, {0x0b,0x41,0x2e,0xfb},
-{0xd7,0x61,0x8c,0x9a}, {0xde,0x6c,0x87,0x94}, {0xc5,0x7b,0x9a,0x86}, {0xcc,0x76,0x91,0x88},
-{0xf3,0x55,0xa0,0xa2}, {0xfa,0x58,0xab,0xac}, {0xe1,0x4f,0xb6,0xbe}, {0xe8,0x42,0xbd,0xb0},
-{0x9f,0x09,0xd4,0xea}, {0x96,0x04,0xdf,0xe4}, {0x8d,0x13,0xc2,0xf6}, {0x84,0x1e,0xc9,0xf8},
-{0xbb,0x3d,0xf8,0xd2}, {0xb2,0x30,0xf3,0xdc}, {0xa9,0x27,0xee,0xce}, {0xa0,0x2a,0xe5,0xc0},
-{0x47,0xb1,0x3c,0x7a}, {0x4e,0xbc,0x37,0x74}, {0x55,0xab,0x2a,0x66}, {0x5c,0xa6,0x21,0x68},
-{0x63,0x85,0x10,0x42}, {0x6a,0x88,0x1b,0x4c}, {0x71,0x9f,0x06,0x5e}, {0x78,0x92,0x0d,0x50},
-{0x0f,0xd9,0x64,0x0a}, {0x06,0xd4,0x6f,0x04}, {0x1d,0xc3,0x72,0x16}, {0x14,0xce,0x79,0x18},
-{0x2b,0xed,0x48,0x32}, {0x22,0xe0,0x43,0x3c}, {0x39,0xf7,0x5e,0x2e}, {0x30,0xfa,0x55,0x20},
-{0x9a,0xb7,0x01,0xec}, {0x93,0xba,0x0a,0xe2}, {0x88,0xad,0x17,0xf0}, {0x81,0xa0,0x1c,0xfe},
-{0xbe,0x83,0x2d,0xd4}, {0xb7,0x8e,0x26,0xda}, {0xac,0x99,0x3b,0xc8}, {0xa5,0x94,0x30,0xc6},
-{0xd2,0xdf,0x59,0x9c}, {0xdb,0xd2,0x52,0x92}, {0xc0,0xc5,0x4f,0x80}, {0xc9,0xc8,0x44,0x8e},
-{0xf6,0xeb,0x75,0xa4}, {0xff,0xe6,0x7e,0xaa}, {0xe4,0xf1,0x63,0xb8}, {0xed,0xfc,0x68,0xb6},
-{0x0a,0x67,0xb1,0x0c}, {0x03,0x6a,0xba,0x02}, {0x18,0x7d,0xa7,0x10}, {0x11,0x70,0xac,0x1e},
-{0x2e,0x53,0x9d,0x34}, {0x27,0x5e,0x96,0x3a}, {0x3c,0x49,0x8b,0x28}, {0x35,0x44,0x80,0x26},
-{0x42,0x0f,0xe9,0x7c}, {0x4b,0x02,0xe2,0x72}, {0x50,0x15,0xff,0x60}, {0x59,0x18,0xf4,0x6e},
-{0x66,0x3b,0xc5,0x44}, {0x6f,0x36,0xce,0x4a}, {0x74,0x21,0xd3,0x58}, {0x7d,0x2c,0xd8,0x56},
-{0xa1,0x0c,0x7a,0x37}, {0xa8,0x01,0x71,0x39}, {0xb3,0x16,0x6c,0x2b}, {0xba,0x1b,0x67,0x25},
-{0x85,0x38,0x56,0x0f}, {0x8c,0x35,0x5d,0x01}, {0x97,0x22,0x40,0x13}, {0x9e,0x2f,0x4b,0x1d},
-{0xe9,0x64,0x22,0x47}, {0xe0,0x69,0x29,0x49}, {0xfb,0x7e,0x34,0x5b}, {0xf2,0x73,0x3f,0x55},
-{0xcd,0x50,0x0e,0x7f}, {0xc4,0x5d,0x05,0x71}, {0xdf,0x4a,0x18,0x63}, {0xd6,0x47,0x13,0x6d},
-{0x31,0xdc,0xca,0xd7}, {0x38,0xd1,0xc1,0xd9}, {0x23,0xc6,0xdc,0xcb}, {0x2a,0xcb,0xd7,0xc5},
-{0x15,0xe8,0xe6,0xef}, {0x1c,0xe5,0xed,0xe1}, {0x07,0xf2,0xf0,0xf3}, {0x0e,0xff,0xfb,0xfd},
-{0x79,0xb4,0x92,0xa7}, {0x70,0xb9,0x99,0xa9}, {0x6b,0xae,0x84,0xbb}, {0x62,0xa3,0x8f,0xb5},
-{0x5d,0x80,0xbe,0x9f}, {0x54,0x8d,0xb5,0x91}, {0x4f,0x9a,0xa8,0x83}, {0x46,0x97,0xa3,0x8d}
-	}
-};
-#define	U4	xU4.xt8
-
-static const word32 rcon[30] = { 
-  0x01,0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
-};
diff --git a/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.c b/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.c
deleted file mode 100644
index 7e48d44..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.c
+++ /dev/null
@@ -1,496 +0,0 @@
-/*	$NetBSD: rijndael-alg-fst.c,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael-alg-fst.c,v 1.1.1.1 2001/08/08 09:56:23 sakane Exp $	*/
-
-/*
- * rijndael-alg-fst.c   v2.3   April '2000
- *
- * Optimised ANSI C code
- *
- * authors: v1.0: Antoon Bosselaers
- *          v2.0: Vincent Rijmen
- *          v2.3: Paulo Barreto
- *
- * This code is placed in the public domain.
- */
-
-#include "config.h"
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#ifdef _KERNEL
-#include <sys/systm.h>
-#else
-#include <string.h>
-#endif
-#include <crypto/rijndael/rijndael-alg-fst.h>
-#include <crypto/rijndael/rijndael_local.h>
-
-#include <crypto/rijndael/boxes-fst.dat>
-
-#include <err.h>
-#define bcopy(a, b, c) memcpy((b), (a), (c))
-#define bzero(a, b) memset((a), 0, (b))
-#define panic(a) err(1, (a))
-
-int rijndaelKeySched(word8 k[MAXKC][4], word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
-	/* Calculate the necessary round keys
-	 * The number of calculations depends on keyBits and blockBits
-	 */ 
-	int j, r, t, rconpointer = 0;
-	union {
-		word8	x8[MAXKC][4];
-		word32	x32[MAXKC];
-	} xtk;
-#define	tk	xtk.x8
-	int KC = ROUNDS - 6;
-
-	for (j = KC-1; j >= 0; j--) {
-		*((word32*)tk[j]) = *((word32*)k[j]);
-	}
-	r = 0;
-	t = 0;
-	/* copy values into round key array */
-	for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
-		for (; (j < KC) && (t < 4); j++, t++) {
-			*((word32*)W[r][t]) = *((word32*)tk[j]);
-		}
-		if (t == 4) {
-			r++;
-			t = 0;
-		}
-	}
-		
-	while (r < ROUNDS + 1) { /* while not enough round key material calculated */
-		/* calculate new values */
-		tk[0][0] ^= S[tk[KC-1][1]];
-		tk[0][1] ^= S[tk[KC-1][2]];
-		tk[0][2] ^= S[tk[KC-1][3]];
-		tk[0][3] ^= S[tk[KC-1][0]];
-		tk[0][0] ^= rcon[rconpointer++];
-
-		if (KC != 8) {
-			for (j = 1; j < KC; j++) {
-				*((word32*)tk[j]) ^= *((word32*)tk[j-1]);
-			}
-		} else {
-			for (j = 1; j < KC/2; j++) {
-				*((word32*)tk[j]) ^= *((word32*)tk[j-1]);
-			}
-			tk[KC/2][0] ^= S[tk[KC/2 - 1][0]];
-			tk[KC/2][1] ^= S[tk[KC/2 - 1][1]];
-			tk[KC/2][2] ^= S[tk[KC/2 - 1][2]];
-			tk[KC/2][3] ^= S[tk[KC/2 - 1][3]];
-			for (j = KC/2 + 1; j < KC; j++) {
-				*((word32*)tk[j]) ^= *((word32*)tk[j-1]);
-			}
-		}
-		/* copy values into round key array */
-		for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
-			for (; (j < KC) && (t < 4); j++, t++) {
-				*((word32*)W[r][t]) = *((word32*)tk[j]);
-			}
-			if (t == 4) {
-				r++;
-				t = 0;
-			}
-		}
-	}		
-	return 0;
-#undef tk
-}
-
-int rijndaelKeyEncToDec(word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
-	int r;
-	word8 *w;
-
-	for (r = 1; r < ROUNDS; r++) {
-		w = W[r][0];
-		*((word32*)w) =
-			  *((const word32*)U1[w[0]])
-			^ *((const word32*)U2[w[1]])
-			^ *((const word32*)U3[w[2]])
-			^ *((const word32*)U4[w[3]]);
-
-		w = W[r][1];
-		*((word32*)w) =
-			  *((const word32*)U1[w[0]])
-			^ *((const word32*)U2[w[1]])
-			^ *((const word32*)U3[w[2]])
-			^ *((const word32*)U4[w[3]]);
-
-		w = W[r][2];
-		*((word32*)w) =
-			  *((const word32*)U1[w[0]])
-			^ *((const word32*)U2[w[1]])
-			^ *((const word32*)U3[w[2]])
-			^ *((const word32*)U4[w[3]]);
-
-		w = W[r][3];
-		*((word32*)w) =
-			  *((const word32*)U1[w[0]])
-			^ *((const word32*)U2[w[1]])
-			^ *((const word32*)U3[w[2]])
-			^ *((const word32*)U4[w[3]]);
-	}
-	return 0;
-}	
-
-/**
- * Encrypt a single block. 
- */
-int rijndaelEncrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
-	int r;
-	union {
-		word8	x8[16];
-		word32	x32[4];
-	} xa, xb;
-#define	a	xa.x8
-#define	b	xb.x8
-	union {
-		word8	x8[4][4];
-		word32	x32[4];
-	} xtemp;
-#define	temp	xtemp.x8
-
-    memcpy(a, in, sizeof a);
-
-    *((word32*)temp[0]) = *((word32*)(a   )) ^ *((word32*)rk[0][0]);
-    *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
-    *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]);
-    *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[0][3]);
-    *((word32*)(b    )) = *((const word32*)T1[temp[0][0]])
-					^ *((const word32*)T2[temp[1][1]])
-					^ *((const word32*)T3[temp[2][2]]) 
-					^ *((const word32*)T4[temp[3][3]]);
-    *((word32*)(b + 4)) = *((const word32*)T1[temp[1][0]])
-					^ *((const word32*)T2[temp[2][1]])
-					^ *((const word32*)T3[temp[3][2]]) 
-					^ *((const word32*)T4[temp[0][3]]);
-    *((word32*)(b + 8)) = *((const word32*)T1[temp[2][0]])
-					^ *((const word32*)T2[temp[3][1]])
-					^ *((const word32*)T3[temp[0][2]]) 
-					^ *((const word32*)T4[temp[1][3]]);
-    *((word32*)(b +12)) = *((const word32*)T1[temp[3][0]])
-					^ *((const word32*)T2[temp[0][1]])
-					^ *((const word32*)T3[temp[1][2]]) 
-					^ *((const word32*)T4[temp[2][3]]);
-	for (r = 1; r < ROUNDS-1; r++) {
-		*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
-		*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
-		*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
-		*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
-
-		*((word32*)(b    )) = *((const word32*)T1[temp[0][0]])
-					^ *((const word32*)T2[temp[1][1]])
-					^ *((const word32*)T3[temp[2][2]]) 
-					^ *((const word32*)T4[temp[3][3]]);
-		*((word32*)(b + 4)) = *((const word32*)T1[temp[1][0]])
-					^ *((const word32*)T2[temp[2][1]])
-					^ *((const word32*)T3[temp[3][2]]) 
-					^ *((const word32*)T4[temp[0][3]]);
-		*((word32*)(b + 8)) = *((const word32*)T1[temp[2][0]])
-					^ *((const word32*)T2[temp[3][1]])
-					^ *((const word32*)T3[temp[0][2]]) 
-					^ *((const word32*)T4[temp[1][3]]);
-		*((word32*)(b +12)) = *((const word32*)T1[temp[3][0]])
-					^ *((const word32*)T2[temp[0][1]])
-					^ *((const word32*)T3[temp[1][2]]) 
-					^ *((const word32*)T4[temp[2][3]]);
-	}
-	/* last round is special */   
-	*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[ROUNDS-1][0]);
-	*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]);
-	*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]);
-	*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]);
-	b[ 0] = T1[temp[0][0]][1];
-	b[ 1] = T1[temp[1][1]][1];
-	b[ 2] = T1[temp[2][2]][1];
-	b[ 3] = T1[temp[3][3]][1];
-	b[ 4] = T1[temp[1][0]][1];
-	b[ 5] = T1[temp[2][1]][1];
-	b[ 6] = T1[temp[3][2]][1];
-	b[ 7] = T1[temp[0][3]][1];
-	b[ 8] = T1[temp[2][0]][1];
-	b[ 9] = T1[temp[3][1]][1];
-	b[10] = T1[temp[0][2]][1];
-	b[11] = T1[temp[1][3]][1];
-	b[12] = T1[temp[3][0]][1];
-	b[13] = T1[temp[0][1]][1];
-	b[14] = T1[temp[1][2]][1];
-	b[15] = T1[temp[2][3]][1];
-	*((word32*)(b   )) ^= *((word32*)rk[ROUNDS][0]);
-	*((word32*)(b+ 4)) ^= *((word32*)rk[ROUNDS][1]);
-	*((word32*)(b+ 8)) ^= *((word32*)rk[ROUNDS][2]);
-	*((word32*)(b+12)) ^= *((word32*)rk[ROUNDS][3]);
-
-	memcpy(out, b, sizeof b /* XXX out */);
-
-	return 0;
-#undef a
-#undef b
-#undef temp
-}
-
-#ifdef INTERMEDIATE_VALUE_KAT
-/**
- * Encrypt only a certain number of rounds.
- * Only used in the Intermediate Value Known Answer Test.
- */
-int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
-	int r;
-	word8 temp[4][4];
-
-	/* make number of rounds sane */
-	if (rounds > ROUNDS) {
-		rounds = ROUNDS;
-	}
-
-	*((word32*)a[0]) = *((word32*)a[0]) ^ *((word32*)rk[0][0]);
-	*((word32*)a[1]) = *((word32*)a[1]) ^ *((word32*)rk[0][1]);
-	*((word32*)a[2]) = *((word32*)a[2]) ^ *((word32*)rk[0][2]);
-	*((word32*)a[3]) = *((word32*)a[3]) ^ *((word32*)rk[0][3]);
-
-	for (r = 1; (r <= rounds) && (r < ROUNDS); r++) {
-		*((word32*)temp[0]) = *((const word32*)T1[a[0][0]])
-					   ^ *((const word32*)T2[a[1][1]])
-					   ^ *((const word32*)T3[a[2][2]]) 
-					   ^ *((const word32*)T4[a[3][3]]);
-		*((word32*)temp[1]) = *((const word32*)T1[a[1][0]])
-					   ^ *((const word32*)T2[a[2][1]])
-					   ^ *((const word32*)T3[a[3][2]]) 
-					   ^ *((const word32*)T4[a[0][3]]);
-		*((word32*)temp[2]) = *((const word32*)T1[a[2][0]])
-					   ^ *((const word32*)T2[a[3][1]])
-					   ^ *((const word32*)T3[a[0][2]]) 
-					   ^ *((const word32*)T4[a[1][3]]);
-		*((word32*)temp[3]) = *((const word32*)T1[a[3][0]])
-					   ^ *((const word32*)T2[a[0][1]])
-					   ^ *((const word32*)T3[a[1][2]]) 
-					   ^ *((const word32*)T4[a[2][3]]);
-		*((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[r][0]);
-		*((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[r][1]);
-		*((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[r][2]);
-		*((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[r][3]);
-	}
-	if (rounds == ROUNDS) {
-	   	/* last round is special */   
-	   	temp[0][0] = T1[a[0][0]][1];
-	   	temp[0][1] = T1[a[1][1]][1];
-	   	temp[0][2] = T1[a[2][2]][1]; 
-	   	temp[0][3] = T1[a[3][3]][1];
-	   	temp[1][0] = T1[a[1][0]][1];
-	   	temp[1][1] = T1[a[2][1]][1];
-	   	temp[1][2] = T1[a[3][2]][1]; 
-	   	temp[1][3] = T1[a[0][3]][1];
-	   	temp[2][0] = T1[a[2][0]][1];
-	   	temp[2][1] = T1[a[3][1]][1];
-	   	temp[2][2] = T1[a[0][2]][1]; 
-	   	temp[2][3] = T1[a[1][3]][1];
-	   	temp[3][0] = T1[a[3][0]][1];
-	   	temp[3][1] = T1[a[0][1]][1];
-	   	temp[3][2] = T1[a[1][2]][1]; 
-	   	temp[3][3] = T1[a[2][3]][1];
-		*((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[ROUNDS][0]);
-		*((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[ROUNDS][1]);
-		*((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[ROUNDS][2]);
-		*((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[ROUNDS][3]);
-	}
-
-	return 0;
-}   
-#endif /* INTERMEDIATE_VALUE_KAT */
-
-/**
- * Decrypt a single block.
- */
-int rijndaelDecrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
-	int r;
-	union {
-		word8	x8[16];
-		word32	x32[4];
-	} xa, xb;
-#define	a	xa.x8
-#define	b	xb.x8
-	union {
-		word8	x8[4][4];
-		word32	x32[4];
-	} xtemp;
-#define	temp	xtemp.x8
-	
-    memcpy(a, in, sizeof a);
-
-    *((word32*)temp[0]) = *((word32*)(a   )) ^ *((word32*)rk[ROUNDS][0]);
-    *((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]);
-    *((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]);
-    *((word32*)temp[3]) = *((word32*)(a+12)) ^ *((word32*)rk[ROUNDS][3]);
-
-    *((word32*)(b   )) = *((const word32*)T5[temp[0][0]])
-           ^ *((const word32*)T6[temp[3][1]])
-           ^ *((const word32*)T7[temp[2][2]]) 
-           ^ *((const word32*)T8[temp[1][3]]);
-	*((word32*)(b+ 4)) = *((const word32*)T5[temp[1][0]])
-           ^ *((const word32*)T6[temp[0][1]])
-           ^ *((const word32*)T7[temp[3][2]]) 
-           ^ *((const word32*)T8[temp[2][3]]);
-	*((word32*)(b+ 8)) = *((const word32*)T5[temp[2][0]])
-           ^ *((const word32*)T6[temp[1][1]])
-           ^ *((const word32*)T7[temp[0][2]]) 
-           ^ *((const word32*)T8[temp[3][3]]);
-	*((word32*)(b+12)) = *((const word32*)T5[temp[3][0]])
-           ^ *((const word32*)T6[temp[2][1]])
-           ^ *((const word32*)T7[temp[1][2]]) 
-           ^ *((const word32*)T8[temp[0][3]]);
-	for (r = ROUNDS-1; r > 1; r--) {
-		*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[r][0]);
-		*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]);
-		*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]);
-		*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[r][3]);
-		*((word32*)(b   )) = *((const word32*)T5[temp[0][0]])
-		   ^ *((const word32*)T6[temp[3][1]])
-		   ^ *((const word32*)T7[temp[2][2]]) 
-		   ^ *((const word32*)T8[temp[1][3]]);
-		*((word32*)(b+ 4)) = *((const word32*)T5[temp[1][0]])
-		   ^ *((const word32*)T6[temp[0][1]])
-		   ^ *((const word32*)T7[temp[3][2]]) 
-		   ^ *((const word32*)T8[temp[2][3]]);
-		*((word32*)(b+ 8)) = *((const word32*)T5[temp[2][0]])
-		   ^ *((const word32*)T6[temp[1][1]])
-		   ^ *((const word32*)T7[temp[0][2]]) 
-		   ^ *((const word32*)T8[temp[3][3]]);
-		*((word32*)(b+12)) = *((const word32*)T5[temp[3][0]])
-		   ^ *((const word32*)T6[temp[2][1]])
-		   ^ *((const word32*)T7[temp[1][2]]) 
-		   ^ *((const word32*)T8[temp[0][3]]);
-	}
-	/* last round is special */   
-	*((word32*)temp[0]) = *((word32*)(b   )) ^ *((word32*)rk[1][0]);
-	*((word32*)temp[1]) = *((word32*)(b+ 4)) ^ *((word32*)rk[1][1]);
-	*((word32*)temp[2]) = *((word32*)(b+ 8)) ^ *((word32*)rk[1][2]);
-	*((word32*)temp[3]) = *((word32*)(b+12)) ^ *((word32*)rk[1][3]);
-	b[ 0] = S5[temp[0][0]];
-	b[ 1] = S5[temp[3][1]];
-	b[ 2] = S5[temp[2][2]];
-	b[ 3] = S5[temp[1][3]];
-	b[ 4] = S5[temp[1][0]];
-	b[ 5] = S5[temp[0][1]];
-	b[ 6] = S5[temp[3][2]];
-	b[ 7] = S5[temp[2][3]];
-	b[ 8] = S5[temp[2][0]];
-	b[ 9] = S5[temp[1][1]];
-	b[10] = S5[temp[0][2]];
-	b[11] = S5[temp[3][3]];
-	b[12] = S5[temp[3][0]];
-	b[13] = S5[temp[2][1]];
-	b[14] = S5[temp[1][2]];
-	b[15] = S5[temp[0][3]];
-	*((word32*)(b   )) ^= *((word32*)rk[0][0]);
-	*((word32*)(b+ 4)) ^= *((word32*)rk[0][1]);
-	*((word32*)(b+ 8)) ^= *((word32*)rk[0][2]);
-	*((word32*)(b+12)) ^= *((word32*)rk[0][3]);
-
-	memcpy(out, b, sizeof b /* XXX out */);
-
-	return 0;
-#undef a
-#undef b
-#undef temp
-}
-
-
-#ifdef INTERMEDIATE_VALUE_KAT
-/**
- * Decrypt only a certain number of rounds.
- * Only used in the Intermediate Value Known Answer Test.
- * Operations rearranged such that the intermediate values
- * of decryption correspond with the intermediate values
- * of encryption.
- */
-int rijndaelDecryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) {
-	int r, i;
-	word8 temp[4], shift;
-
-	/* make number of rounds sane */
-	if (rounds > ROUNDS) {
-		rounds = ROUNDS;
-	}
-    /* first round is special: */
-	*(word32 *)a[0] ^= *(word32 *)rk[ROUNDS][0];
-	*(word32 *)a[1] ^= *(word32 *)rk[ROUNDS][1];
-	*(word32 *)a[2] ^= *(word32 *)rk[ROUNDS][2];
-	*(word32 *)a[3] ^= *(word32 *)rk[ROUNDS][3];
-	for (i = 0; i < 4; i++) {
-		a[i][0] = Si[a[i][0]];
-		a[i][1] = Si[a[i][1]];
-		a[i][2] = Si[a[i][2]];
-		a[i][3] = Si[a[i][3]];
-	}
-	for (i = 1; i < 4; i++) {
-		shift = (4 - i) & 3;
-		temp[0] = a[(0 + shift) & 3][i];
-		temp[1] = a[(1 + shift) & 3][i];
-		temp[2] = a[(2 + shift) & 3][i];
-		temp[3] = a[(3 + shift) & 3][i];
-		a[0][i] = temp[0];
-		a[1][i] = temp[1];
-		a[2][i] = temp[2];
-		a[3][i] = temp[3];
-	}
-	/* ROUNDS-1 ordinary rounds */
-	for (r = ROUNDS-1; r > rounds; r--) {
-		*(word32 *)a[0] ^= *(word32 *)rk[r][0];
-		*(word32 *)a[1] ^= *(word32 *)rk[r][1];
-		*(word32 *)a[2] ^= *(word32 *)rk[r][2];
-		*(word32 *)a[3] ^= *(word32 *)rk[r][3];
-
-		*((word32*)a[0]) =
-			  *((const word32*)U1[a[0][0]])
-			^ *((const word32*)U2[a[0][1]])
-			^ *((const word32*)U3[a[0][2]])
-			^ *((const word32*)U4[a[0][3]]);
-
-		*((word32*)a[1]) =
-			  *((const word32*)U1[a[1][0]])
-			^ *((const word32*)U2[a[1][1]])
-			^ *((const word32*)U3[a[1][2]])
-			^ *((const word32*)U4[a[1][3]]);
-
-		*((word32*)a[2]) =
-			  *((const word32*)U1[a[2][0]])
-			^ *((const word32*)U2[a[2][1]])
-			^ *((const word32*)U3[a[2][2]])
-			^ *((const word32*)U4[a[2][3]]);
-
-		*((word32*)a[3]) =
-			  *((const word32*)U1[a[3][0]])
-			^ *((const word32*)U2[a[3][1]])
-			^ *((const word32*)U3[a[3][2]])
-			^ *((const word32*)U4[a[3][3]]);
-		for (i = 0; i < 4; i++) {
-			a[i][0] = Si[a[i][0]];
-			a[i][1] = Si[a[i][1]];
-			a[i][2] = Si[a[i][2]];
-			a[i][3] = Si[a[i][3]];
-		}
-		for (i = 1; i < 4; i++) {
-			shift = (4 - i) & 3;
-			temp[0] = a[(0 + shift) & 3][i];
-			temp[1] = a[(1 + shift) & 3][i];
-			temp[2] = a[(2 + shift) & 3][i];
-			temp[3] = a[(3 + shift) & 3][i];
-			a[0][i] = temp[0];
-			a[1][i] = temp[1];
-			a[2][i] = temp[2];
-			a[3][i] = temp[3];
-		}
-	}
-	if (rounds == 0) {
-		/* End with the extra key addition */	
-		*(word32 *)a[0] ^= *(word32 *)rk[0][0];
-		*(word32 *)a[1] ^= *(word32 *)rk[0][1];
-		*(word32 *)a[2] ^= *(word32 *)rk[0][2];
-		*(word32 *)a[3] ^= *(word32 *)rk[0][3];
-	}    
-	return 0;
-}
-#endif /* INTERMEDIATE_VALUE_KAT */
diff --git a/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.h b/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.h
deleted file mode 100644
index 4afeca1..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael-alg-fst.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*	$NetBSD: rijndael-alg-fst.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael-alg-fst.h,v 1.1.1.1 2001/08/08 09:56:23 sakane Exp $	*/
-
-/*
- * rijndael-alg-fst.h   v2.3   April '2000
- *
- * Optimised ANSI C code
- *
- * #define INTERMEDIATE_VALUE_KAT to generate the Intermediate Value Known Answer Test.
- */
-
-#ifndef __RIJNDAEL_ALG_FST_H
-#define __RIJNDAEL_ALG_FST_H
-
-#define RIJNDAEL_MAXKC			(256/32)
-#define RIJNDAEL_MAXROUNDS		14
-
-int rijndaelKeySched(u_int8_t k[RIJNDAEL_MAXKC][4], u_int8_t rk[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS);
-
-int rijndaelKeyEncToDec(u_int8_t W[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS);
-
-int rijndaelEncrypt(u_int8_t a[16], u_int8_t b[16], u_int8_t rk[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS);
-
-#ifdef INTERMEDIATE_VALUE_KAT
-int rijndaelEncryptRound(u_int8_t a[4][4], u_int8_t rk[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS, int rounds);
-#endif /* INTERMEDIATE_VALUE_KAT */
-
-int rijndaelDecrypt(u_int8_t a[16], u_int8_t b[16], u_int8_t rk[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS);
-
-#ifdef INTERMEDIATE_VALUE_KAT
-int rijndaelDecryptRound(u_int8_t a[4][4], u_int8_t rk[RIJNDAEL_MAXROUNDS+1][4][4], int ROUNDS, int rounds);
-#endif /* INTERMEDIATE_VALUE_KAT */
-
-#endif /* __RIJNDAEL_ALG_FST_H */
diff --git a/src/racoon/missing/crypto/rijndael/rijndael-api-fst.c b/src/racoon/missing/crypto/rijndael/rijndael-api-fst.c
deleted file mode 100644
index 9b6f5fe..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael-api-fst.c
+++ /dev/null
@@ -1,494 +0,0 @@
-/*	$NetBSD: rijndael-api-fst.c,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael-api-fst.c,v 1.8 2002/11/18 23:32:54 itojun Exp $	*/
-
-/*
- * rijndael-api-fst.c   v2.3   April '2000
- *
- * Optimised ANSI C code
- *
- * authors: v1.0: Antoon Bosselaers
- *          v2.0: Vincent Rijmen
- *          v2.1: Vincent Rijmen
- *          v2.2: Vincent Rijmen
- *          v2.3: Paulo Barreto
- *          v2.4: Vincent Rijmen
- *
- * This code is placed in the public domain.
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#ifdef _KERNEL
-#include <sys/time.h>
-#include <sys/systm.h>
-#else
-#include <string.h>
-#endif
-#include <crypto/rijndael/rijndael-alg-fst.h>
-#include <crypto/rijndael/rijndael-api-fst.h>
-#include <crypto/rijndael/rijndael_local.h>
-
-#include <err.h>
-#define bcopy(a, b, c) memcpy(b, a, c)
-#define bzero(a, b) memset(a, 0, b)
-#define panic(a) err(1, (a))
-
-int rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMaterial) {
-	word8 k[MAXKC][4];
-	int i;
-	char *keyMat;
-	
-	if (key == NULL) {
-		return BAD_KEY_INSTANCE;
-	}
-
-	if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) {
-		key->direction = direction;
-	} else {
-		return BAD_KEY_DIR;
-	}
-
-	if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { 
-		key->keyLen = keyLen;
-	} else {
-		return BAD_KEY_MAT;
-	}
-
-	if (keyMaterial != NULL) {
-		bcopy(keyMaterial, key->keyMaterial, keyLen/8);
-	}
-
-	key->ROUNDS = keyLen/32 + 6;
-
-	/* initialize key schedule: */
-	keyMat = key->keyMaterial;
-	for (i = 0; i < key->keyLen/8; i++) {
-		k[i >> 2][i & 3] = (word8)keyMat[i]; 
-	}
-	rijndaelKeySched(k, key->keySched, key->ROUNDS);
-	if (direction == DIR_DECRYPT) {
-		rijndaelKeyEncToDec(key->keySched, key->ROUNDS);
-	}
-
-	return TRUE;
-}
-
-int rijndael_cipherInit(cipherInstance *cipher, BYTE mode, char *IV) {
-	if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) {
-		cipher->mode = mode;
-	} else {
-		return BAD_CIPHER_MODE;
-	}
-	if (IV != NULL) {
-		bcopy(IV, cipher->IV, MAX_IV_SIZE);
-	} else {
-		bzero(cipher->IV, MAX_IV_SIZE);
-	}
-	return TRUE;
-}
-
-int rijndael_blockEncrypt(cipherInstance *cipher, keyInstance *key,
-		BYTE *input, int inputLen, BYTE *outBuffer) {
-	int i, k, numBlocks;
-	word8 block[16], iv[4][4];
-
-	if (cipher == NULL ||
-		key == NULL ||
-		key->direction == DIR_DECRYPT) {
-		return BAD_CIPHER_STATE;
-	}
-	if (input == NULL || inputLen <= 0) {
-		return 0; /* nothing to do */
-	}
-
-	numBlocks = inputLen/128;
-	
-	switch (cipher->mode) {
-	case MODE_ECB: 
-		for (i = numBlocks; i > 0; i--) {
-			rijndaelEncrypt(input, outBuffer, key->keySched, key->ROUNDS);
-			input += 16;
-			outBuffer += 16;
-		}
-		break;
-		
-	case MODE_CBC:
-#if 1 /*STRICT_ALIGN*/
-		bcopy(cipher->IV, block, 16);
-		bcopy(input, iv, 16);
-		((word32*)block)[0] ^= ((word32*)iv)[0];
-		((word32*)block)[1] ^= ((word32*)iv)[1];
-		((word32*)block)[2] ^= ((word32*)iv)[2];
-		((word32*)block)[3] ^= ((word32*)iv)[3];
-#else
-		((word32*)block)[0] = ((word32*)cipher->IV)[0] ^ ((word32*)input)[0];
-		((word32*)block)[1] = ((word32*)cipher->IV)[1] ^ ((word32*)input)[1];
-		((word32*)block)[2] = ((word32*)cipher->IV)[2] ^ ((word32*)input)[2];
-		((word32*)block)[3] = ((word32*)cipher->IV)[3] ^ ((word32*)input)[3];
-#endif
-		rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
-		input += 16;
-		for (i = numBlocks - 1; i > 0; i--) {
-#if 1 /*STRICT_ALIGN*/
-			bcopy(outBuffer, block, 16);
-			bcopy(input, iv, 16);
-			((word32*)block)[0] ^= ((word32*)iv)[0];
-			((word32*)block)[1] ^= ((word32*)iv)[1];
-			((word32*)block)[2] ^= ((word32*)iv)[2];
-			((word32*)block)[3] ^= ((word32*)iv)[3];
-#else
-			((word32*)block)[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0];
-			((word32*)block)[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1];
-			((word32*)block)[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2];
-			((word32*)block)[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3];
-#endif
-			outBuffer += 16;
-			rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
-			input += 16;
-		}
-		break;
-	
-	case MODE_CFB1:
-#if 1 /*STRICT_ALIGN*/
-		bcopy(cipher->IV, iv, 16); 
-#else  /* !STRICT_ALIGN */
-		*((word32*)iv[0]) = *((word32*)(cipher->IV   ));
-		*((word32*)iv[1]) = *((word32*)(cipher->IV+ 4));
-		*((word32*)iv[2]) = *((word32*)(cipher->IV+ 8));
-		*((word32*)iv[3]) = *((word32*)(cipher->IV+12));
-#endif /* ?STRICT_ALIGN */
-		for (i = numBlocks; i > 0; i--) {
-			for (k = 0; k < 128; k++) {
-				*((word32*) block    ) = *((word32*)iv[0]);
-				*((word32*)(block+ 4)) = *((word32*)iv[1]);
-				*((word32*)(block+ 8)) = *((word32*)iv[2]);
-				*((word32*)(block+12)) = *((word32*)iv[3]);
-				rijndaelEncrypt(block, block, key->keySched, key->ROUNDS);
-				outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
-				iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
-				iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
-				iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
-				iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
-				iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
-				iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
-				iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
-				iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
-				iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
-				iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
-				iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
-				iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
-				iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
-				iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
-				iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
-				iv[3][3] = (iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1);
-			}
-		}
-		break;
-	
-	default:
-		return BAD_CIPHER_STATE;
-	}
-	
-	return 128*numBlocks;
-}
-
-/**
- * Encrypt data partitioned in octets, using RFC 2040-like padding.
- *
- * @param   input           data to be encrypted (octet sequence)
- * @param   inputOctets		input length in octets (not bits)
- * @param   outBuffer       encrypted output data
- *
- * @return	length in octets (not bits) of the encrypted output buffer.
- */
-int rijndael_padEncrypt(cipherInstance *cipher, keyInstance *key,
-		BYTE *input, int inputOctets, BYTE *outBuffer) {
-	int i, numBlocks, padLen;
-	word8 block[16], *iv, *cp;
-
-	if (cipher == NULL ||
-		key == NULL ||
-		key->direction == DIR_DECRYPT) {
-		return BAD_CIPHER_STATE;
-	}
-	if (input == NULL || inputOctets <= 0) {
-		return 0; /* nothing to do */
-	}
-
-	numBlocks = inputOctets/16;
-
-	switch (cipher->mode) {
-	case MODE_ECB: 
-		for (i = numBlocks; i > 0; i--) {
-			rijndaelEncrypt(input, outBuffer, key->keySched, key->ROUNDS);
-			input += 16;
-			outBuffer += 16;
-		}
-		padLen = 16 - (inputOctets - 16*numBlocks);
-		if (padLen <= 0 || padLen > 16)
-			panic("rijndael_padEncrypt(ECB)");
-		bcopy(input, block, 16 - padLen);
-		for (cp = block + 16 - padLen; cp < block + 16; cp++)
-			*cp = padLen;
-		rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
-		break;
-
-	case MODE_CBC:
-		iv = cipher->IV;
-		for (i = numBlocks; i > 0; i--) {
-			((word32*)block)[0] = ((word32*)input)[0] ^ ((word32*)iv)[0];
-			((word32*)block)[1] = ((word32*)input)[1] ^ ((word32*)iv)[1];
-			((word32*)block)[2] = ((word32*)input)[2] ^ ((word32*)iv)[2];
-			((word32*)block)[3] = ((word32*)input)[3] ^ ((word32*)iv)[3];
-			rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
-			iv = outBuffer;
-			input += 16;
-			outBuffer += 16;
-		}
-		padLen = 16 - (inputOctets - 16*numBlocks);
-		if (padLen <= 0 || padLen > 16)
-			panic("rijndael_padEncrypt(CBC)");
-		for (i = 0; i < 16 - padLen; i++) {
-			block[i] = input[i] ^ iv[i];
-		}
-		for (i = 16 - padLen; i < 16; i++) {
-			block[i] = (BYTE)padLen ^ iv[i];
-		}
-		rijndaelEncrypt(block, outBuffer, key->keySched, key->ROUNDS);
-		break;
-
-	default:
-		return BAD_CIPHER_STATE;
-	}
-
-	return 16*(numBlocks + 1);
-}
-
-int rijndael_blockDecrypt(cipherInstance *cipher, keyInstance *key,
-		BYTE *input, int inputLen, BYTE *outBuffer) {
-	int i, k, numBlocks;
-	word8 block[16], iv[4][4];
-
-	if (cipher == NULL ||
-		key == NULL ||
-		(cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT)) {
-		return BAD_CIPHER_STATE;
-	}
-	if (input == NULL || inputLen <= 0) {
-		return 0; /* nothing to do */
-	}
-
-	numBlocks = inputLen/128;
-
-	switch (cipher->mode) {
-	case MODE_ECB: 
-		for (i = numBlocks; i > 0; i--) { 
-			rijndaelDecrypt(input, outBuffer, key->keySched, key->ROUNDS);
-			input += 16;
-			outBuffer += 16;
-		}
-		break;
-		
-	case MODE_CBC:
-#if 1 /*STRICT_ALIGN */
-		bcopy(cipher->IV, iv, 16); 
-#else
-		*((word32*)iv[0]) = *((word32*)(cipher->IV   ));
-		*((word32*)iv[1]) = *((word32*)(cipher->IV+ 4));
-		*((word32*)iv[2]) = *((word32*)(cipher->IV+ 8));
-		*((word32*)iv[3]) = *((word32*)(cipher->IV+12));
-#endif
-		for (i = numBlocks; i > 0; i--) {
-			rijndaelDecrypt(input, block, key->keySched, key->ROUNDS);
-			((word32*)block)[0] ^= *((word32*)iv[0]);
-			((word32*)block)[1] ^= *((word32*)iv[1]);
-			((word32*)block)[2] ^= *((word32*)iv[2]);
-			((word32*)block)[3] ^= *((word32*)iv[3]);
-#if 1 /*STRICT_ALIGN*/
-			bcopy(input, iv, 16);
-			bcopy(block, outBuffer, 16);
-#else
-			*((word32*)iv[0]) = ((word32*)input)[0]; ((word32*)outBuffer)[0] = ((word32*)block)[0];
-			*((word32*)iv[1]) = ((word32*)input)[1]; ((word32*)outBuffer)[1] = ((word32*)block)[1];
-			*((word32*)iv[2]) = ((word32*)input)[2]; ((word32*)outBuffer)[2] = ((word32*)block)[2];
-			*((word32*)iv[3]) = ((word32*)input)[3]; ((word32*)outBuffer)[3] = ((word32*)block)[3];
-#endif
-			input += 16;
-			outBuffer += 16;
-		}
-		break;
-	
-	case MODE_CFB1:
-#if 1 /*STRICT_ALIGN */
-		bcopy(cipher->IV, iv, 16); 
-#else
-		*((word32*)iv[0]) = *((word32*)(cipher->IV));
-		*((word32*)iv[1]) = *((word32*)(cipher->IV+ 4));
-		*((word32*)iv[2]) = *((word32*)(cipher->IV+ 8));
-		*((word32*)iv[3]) = *((word32*)(cipher->IV+12));
-#endif
-		for (i = numBlocks; i > 0; i--) {
-			for (k = 0; k < 128; k++) {
-				*((word32*) block    ) = *((word32*)iv[0]);
-				*((word32*)(block+ 4)) = *((word32*)iv[1]);
-				*((word32*)(block+ 8)) = *((word32*)iv[2]);
-				*((word32*)(block+12)) = *((word32*)iv[3]);
-				rijndaelEncrypt(block, block, key->keySched, key->ROUNDS);
-				iv[0][0] = (iv[0][0] << 1) | (iv[0][1] >> 7);
-				iv[0][1] = (iv[0][1] << 1) | (iv[0][2] >> 7);
-				iv[0][2] = (iv[0][2] << 1) | (iv[0][3] >> 7);
-				iv[0][3] = (iv[0][3] << 1) | (iv[1][0] >> 7);
-				iv[1][0] = (iv[1][0] << 1) | (iv[1][1] >> 7);
-				iv[1][1] = (iv[1][1] << 1) | (iv[1][2] >> 7);
-				iv[1][2] = (iv[1][2] << 1) | (iv[1][3] >> 7);
-				iv[1][3] = (iv[1][3] << 1) | (iv[2][0] >> 7);
-				iv[2][0] = (iv[2][0] << 1) | (iv[2][1] >> 7);
-				iv[2][1] = (iv[2][1] << 1) | (iv[2][2] >> 7);
-				iv[2][2] = (iv[2][2] << 1) | (iv[2][3] >> 7);
-				iv[2][3] = (iv[2][3] << 1) | (iv[3][0] >> 7);
-				iv[3][0] = (iv[3][0] << 1) | (iv[3][1] >> 7);
-				iv[3][1] = (iv[3][1] << 1) | (iv[3][2] >> 7);
-				iv[3][2] = (iv[3][2] << 1) | (iv[3][3] >> 7);
-				iv[3][3] = (iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);
-				outBuffer[k/8] ^= (block[0] & 0x80) >> (k & 7);
-			}
-		}
-		break;
-
-	default:
-		return BAD_CIPHER_STATE;
-	}
-	
-	return 128*numBlocks;
-}
-
-int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
-		BYTE *input, int inputOctets, BYTE *outBuffer) {
-	int i, numBlocks, padLen;
-	word8 block[16];
-	word32 iv[4];
-
-	if (cipher == NULL ||
-		key == NULL ||
-		key->direction == DIR_ENCRYPT) {
-		return BAD_CIPHER_STATE;
-	}
-	if (input == NULL || inputOctets <= 0) {
-		return 0; /* nothing to do */
-	}
-	if (inputOctets % 16 != 0) {
-		return BAD_DATA;
-	}
-
-	numBlocks = inputOctets/16;
-
-	switch (cipher->mode) {
-	case MODE_ECB:
-		/* all blocks but last */
-		for (i = numBlocks - 1; i > 0; i--) { 
-			rijndaelDecrypt(input, outBuffer, key->keySched, key->ROUNDS);
-			input += 16;
-			outBuffer += 16;
-		}
-		/* last block */
-		rijndaelDecrypt(input, block, key->keySched, key->ROUNDS);
-		padLen = block[15];
-		if (padLen >= 16) {
-			return BAD_DATA;
-		}
-		for (i = 16 - padLen; i < 16; i++) {
-			if (block[i] != padLen) {
-				return BAD_DATA;
-			}
-		}
-		bcopy(block, outBuffer, 16 - padLen);
-		break;
-		
-	case MODE_CBC:
-		bcopy(cipher->IV, iv, 16);
-		/* all blocks but last */
-		for (i = numBlocks - 1; i > 0; i--) {
-			rijndaelDecrypt(input, block, key->keySched, key->ROUNDS);
-			((word32*)block)[0] ^= iv[0];
-			((word32*)block)[1] ^= iv[1];
-			((word32*)block)[2] ^= iv[2];
-			((word32*)block)[3] ^= iv[3];
-			bcopy(input, iv, 16);
-			bcopy(block, outBuffer, 16);
-			input += 16;
-			outBuffer += 16;
-		}
-		/* last block */
-		rijndaelDecrypt(input, block, key->keySched, key->ROUNDS);
-		((word32*)block)[0] ^= iv[0];
-		((word32*)block)[1] ^= iv[1];
-		((word32*)block)[2] ^= iv[2];
-		((word32*)block)[3] ^= iv[3];
-		padLen = block[15];
-		if (padLen <= 0 || padLen > 16) {
-			return BAD_DATA;
-		}
-		for (i = 16 - padLen; i < 16; i++) {
-			if (block[i] != padLen) {
-				return BAD_DATA;
-			}
-		}
-		bcopy(block, outBuffer, 16 - padLen);
-		break;
-	
-	default:
-		return BAD_CIPHER_STATE;
-	}
-	
-	return 16*numBlocks - padLen;
-}
-
-#ifdef INTERMEDIATE_VALUE_KAT
-/**
- *	cipherUpdateRounds:
- *
- *	Encrypts/Decrypts exactly one full block a specified number of rounds.
- *	Only used in the Intermediate Value Known Answer Test.	
- *
- *	Returns:
- *		TRUE - on success
- *		BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized)
- */
-int rijndael_cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
-		BYTE *input, int inputLen, BYTE *outBuffer, int rounds) {
-	int j;
-	word8 block[4][4];
-
-	if (cipher == NULL || key == NULL) {
-		return BAD_CIPHER_STATE;
-	}
-
-	for (j = 3; j >= 0; j--) {
-		/* parse input stream into rectangular array */
-  		*((word32*)block[j]) = *((word32*)(input+4*j));
-	}
-
-	switch (key->direction) {
-	case DIR_ENCRYPT:
-		rijndaelEncryptRound(block, key->keySched, key->ROUNDS, rounds);
-		break;
-		
-	case DIR_DECRYPT:
-		rijndaelDecryptRound(block, key->keySched, key->ROUNDS, rounds);
-		break;
-		
-	default:
-		return BAD_KEY_DIR;
-	} 
-
-	for (j = 3; j >= 0; j--) {
-		/* parse rectangular array into output ciphertext bytes */
-		*((word32*)(outBuffer+4*j)) = *((word32*)block[j]);
-	}
-	
-	return TRUE;
-}
-#endif /* INTERMEDIATE_VALUE_KAT */
diff --git a/src/racoon/missing/crypto/rijndael/rijndael-api-fst.h b/src/racoon/missing/crypto/rijndael/rijndael-api-fst.h
deleted file mode 100644
index 1d76a21..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael-api-fst.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*	$NetBSD: rijndael-api-fst.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael-api-fst.h,v 1.1.1.1 2001/08/08 09:56:27 sakane Exp $	*/
-
-/*
- * rijndael-api-fst.h   v2.3   April '2000
- *
- * Optimised ANSI C code
- *
- * #define INTERMEDIATE_VALUE_KAT to generate the Intermediate Value Known Answer Test.
- */
-
-#ifndef __RIJNDAEL_API_FST_H
-#define __RIJNDAEL_API_FST_H
-
-#include <crypto/rijndael/rijndael-alg-fst.h>
-
-/*  Defines:
-	Add any additional defines you need
-*/
-
-#define     DIR_ENCRYPT           0 /*  Are we encrpyting?  */
-#define     DIR_DECRYPT           1 /*  Are we decrpyting?  */
-#define     MODE_ECB              1 /*  Are we ciphering in ECB mode?   */
-#define     MODE_CBC              2 /*  Are we ciphering in CBC mode?   */
-#define     MODE_CFB1             3 /*  Are we ciphering in 1-bit CFB mode? */
-#define     TRUE                  1
-#define     FALSE                 0
-#define     BITSPERBLOCK        128 /* Default number of bits in a cipher block */
-
-/*  Error Codes - CHANGE POSSIBLE: inclusion of additional error codes  */
-#define     BAD_KEY_DIR          -1 /*  Key direction is invalid, e.g., unknown value */
-#define     BAD_KEY_MAT          -2 /*  Key material not of correct length */
-#define     BAD_KEY_INSTANCE     -3 /*  Key passed is not valid */
-#define     BAD_CIPHER_MODE      -4 /*  Params struct passed to cipherInit invalid */
-#define     BAD_CIPHER_STATE     -5 /*  Cipher in wrong state (e.g., not initialized) */
-#define     BAD_BLOCK_LENGTH     -6
-#define     BAD_CIPHER_INSTANCE  -7
-#define     BAD_DATA             -8 /*  Data contents are invalid, e.g., invalid padding */
-#define     BAD_OTHER            -9 /*  Unknown error */
-
-/*  CHANGE POSSIBLE:  inclusion of algorithm specific defines  */
-#define     MAX_KEY_SIZE         64 /* # of ASCII char's needed to represent a key */
-#define     MAX_IV_SIZE          16 /* # bytes needed to represent an IV  */
-
-/*  Typedefs:
-
-	Typedef'ed data storage elements.  Add any algorithm specific 
-parameters at the bottom of the structs as appropriate.
-*/
-
-/*  The structure for key information */
-typedef struct {
-    u_int8_t  direction;            /* Key used for encrypting or decrypting? */
-    int   keyLen;                   /* Length of the key  */
-    char  keyMaterial[MAX_KEY_SIZE+1];  /* Raw key data in ASCII, e.g., user input or KAT values */
-        /*  The following parameters are algorithm dependent, replace or add as necessary  */
-	int   ROUNDS;                   /* key-length-dependent number of rounds */
-    int   blockLen;                 /* block length */
-    union {
-    	u_int8_t xkS8[RIJNDAEL_MAXROUNDS+1][4][4];	/* key schedule		*/
-    	u_int32_t xkS32[RIJNDAEL_MAXROUNDS+1][4];	/* key schedule		*/
-    } xKeySched;
-#define	keySched	xKeySched.xkS8
-} keyInstance;
-
-/*  The structure for cipher information */
-typedef struct {                    /* changed order of the components */
-    u_int8_t mode;                  /* MODE_ECB, MODE_CBC, or MODE_CFB1 */
-    u_int8_t IV[MAX_IV_SIZE];       /* A possible Initialization Vector for ciphering */
-        /*  Add any algorithm specific parameters needed here  */
-    int   blockLen;                 /* Sample: Handles non-128 bit block sizes (if available) */
-} cipherInstance;
-
-/*  Function prototypes  */
-/*  CHANGED: nothing
-	TODO: implement the following extensions to setup 192-bit and 256-bit block lengths:
-        makeKeyEx():    parameter blockLen added
-                        -- this parameter is absolutely necessary if you want to
-                        setup the round keys in a variable block length setting 
-	    cipherInitEx(): parameter blockLen added (for obvious reasons)		
- */
-
-int rijndael_makeKey(keyInstance *key, u_int8_t direction, int keyLen, char *keyMaterial);
-
-int rijndael_cipherInit(cipherInstance *cipher, u_int8_t mode, char *IV);
-
-int rijndael_blockEncrypt(cipherInstance *cipher, keyInstance *key,
-        u_int8_t *input, int inputLen, u_int8_t *outBuffer);
-
-int rijndael_padEncrypt(cipherInstance *cipher, keyInstance *key,
-		u_int8_t *input, int inputOctets, u_int8_t *outBuffer);
-
-int rijndael_blockDecrypt(cipherInstance *cipher, keyInstance *key,
-        u_int8_t *input, int inputLen, u_int8_t *outBuffer);
-
-int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
-		u_int8_t *input, int inputOctets, u_int8_t *outBuffer);
-
-#ifdef INTERMEDIATE_VALUE_KAT
-int rijndael_cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
-        u_int8_t *input, int inputLen, u_int8_t *outBuffer, int Rounds);
-#endif /* INTERMEDIATE_VALUE_KAT */
-
-#endif /*  __RIJNDAEL_API_FST_H */
diff --git a/src/racoon/missing/crypto/rijndael/rijndael.h b/src/racoon/missing/crypto/rijndael/rijndael.h
deleted file mode 100644
index 59c3077..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/*	$NetBSD: rijndael.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael.h,v 1.1.1.1 2001/08/08 09:56:27 sakane Exp $	*/
-
-#include <crypto/rijndael/rijndael-api-fst.h>
diff --git a/src/racoon/missing/crypto/rijndael/rijndael_local.h b/src/racoon/missing/crypto/rijndael/rijndael_local.h
deleted file mode 100644
index e446378..0000000
--- a/src/racoon/missing/crypto/rijndael/rijndael_local.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/*	$NetBSD: rijndael_local.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: rijndael_local.h,v 1.1.1.1 2001/08/08 09:56:27 sakane Exp $	*/
-
-/* the file should not be used from outside */
-typedef u_int8_t		BYTE;
-typedef u_int8_t		word8;	
-typedef u_int16_t		word16;	
-typedef u_int32_t		word32;
-
-#define MAXKC		RIJNDAEL_MAXKC
-#define MAXROUNDS	RIJNDAEL_MAXROUNDS
diff --git a/src/racoon/missing/crypto/sha2/sha2.c b/src/racoon/missing/crypto/sha2/sha2.c
deleted file mode 100644
index cfde829..0000000
--- a/src/racoon/missing/crypto/sha2/sha2.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/*	$NetBSD: sha2.c,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/* Id: sha2.c,v 1.6 2004/09/21 14:35:25 ludvigm Exp */
-
-/*
- * sha2.c
- *
- * Version 1.0.0beta1
- *
- * Written by Aaron D. Gifford <me@aarongifford.com>
- *
- * Copyright 2000 Aaron D. Gifford.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holder nor the names of contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/time.h>
-#ifndef __linux__
-#include <machine/endian.h>
-#endif
-#include <crypto/sha2/sha2.h>
-#include <openssl/evp.h>
-
-/* get openssl/ssleay version number */
-#include <openssl/opensslv.h>
-
-#include <err.h>
-#include <string.h>
-#define bcopy(a, b, c) memcpy((b), (a), (c))
-#define bzero(a, b) memset((a), 0, (b))
-#define panic(a) err(1, (a))
-
-#if OPENSSL_VERSION_NUMBER >= 0x00907000L
-#define HAVE_EVP_097
-#endif
-
-/*
- * ASSERT NOTE:
- * Some sanity checking code is included using assert().  On my FreeBSD
- * system, this additional code can be removed by compiling with NDEBUG
- * defined.  Check your own systems manpage on assert() to see how to
- * compile WITHOUT the sanity checking code on your system.
- *
- * UNROLLED TRANSFORM LOOP NOTE:
- * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
- * loop version for the hash transform rounds (defined using macros
- * later in this file).  Either define on the command line, for example:
- *
- *   cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
- *
- * or define below:
- *
- *   #define SHA2_UNROLL_TRANSFORM
- *
- */
-
-#define assert(x)
-
-
-/*** SHA-256/384/512 Machine Architecture Definitions *****************/
-/*
- * BYTE_ORDER NOTE:
- *
- * Please make sure that your system defines BYTE_ORDER.  If your
- * architecture is little-endian, make sure it also defines
- * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
- * equivilent.
- *
- * If your system does not define the above, then you can do so by
- * hand like this:
- *
- *   #define LITTLE_ENDIAN 1234
- *   #define BIG_ENDIAN    4321
- *
- * And for little-endian machines, add:
- *
- *   #define BYTE_ORDER LITTLE_ENDIAN 
- *
- * Or for big-endian machines:
- *
- *   #define BYTE_ORDER BIG_ENDIAN
- *
- * The FreeBSD machine this was written on defines BYTE_ORDER
- * appropriately by including <sys/types.h> (which in turn includes
- * <machine/endian.h> where the appropriate definitions are actually
- * made).
- */
-#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
-#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
-#endif
-
-/*
- * Define the followingsha2_* types to types of the correct length on
- * the native archtecture.   Most BSD systems and Linux define u_intXX_t
- * types.  Machines with very recent ANSI C headers, can use the
- * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H
- * during compile or in the sha.h header file.
- *
- * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t
- * will need to define these three typedefs below (and the appropriate
- * ones in sha.h too) by hand according to their system architecture.
- *
- * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t
- * types and pointing out recent ANSI C support for uintXX_t in inttypes.h.
- */
-#if 0 /*def SHA2_USE_INTTYPES_H*/
-
-typedef uint8_t  sha2_byte;	/* Exactly 1 byte */
-typedef uint32_t sha2_word32;	/* Exactly 4 bytes */
-typedef uint64_t sha2_word64;	/* Exactly 8 bytes */
-
-#else /* SHA2_USE_INTTYPES_H */
-
-typedef u_int8_t  sha2_byte;	/* Exactly 1 byte */
-typedef u_int32_t sha2_word32;	/* Exactly 4 bytes */
-typedef u_int64_t sha2_word64;	/* Exactly 8 bytes */
-
-#endif /* SHA2_USE_INTTYPES_H */
-
-
-/*** SHA-256/384/512 Various Length Definitions ***********************/
-/* NOTE: Most of these are in sha2.h */
-#define SHA256_SHORT_BLOCK_LENGTH	(SHA256_BLOCK_LENGTH - 8)
-#define SHA384_SHORT_BLOCK_LENGTH	(SHA384_BLOCK_LENGTH - 16)
-#define SHA512_SHORT_BLOCK_LENGTH	(SHA512_BLOCK_LENGTH - 16)
-
-
-/*** ENDIAN REVERSAL MACROS *******************************************/
-#if BYTE_ORDER == LITTLE_ENDIAN
-#define REVERSE32(w,x)	{ \
-	sha2_word32 tmp = (w); \
-	tmp = (tmp >> 16) | (tmp << 16); \
-	(x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
-}
-#define REVERSE64(w,x)	{ \
-	sha2_word64 tmp = (w); \
-	tmp = (tmp >> 32) | (tmp << 32); \
-	tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
-	      ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
-	(x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
-	      ((tmp & 0x0000ffff0000ffffULL) << 16); \
-}
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-
-/*
- * Macro for incrementally adding the unsigned 64-bit integer n to the
- * unsigned 128-bit integer (represented using a two-element array of
- * 64-bit words):
- */
-#define ADDINC128(w,n)	{ \
-	(w)[0] += (sha2_word64)(n); \
-	if ((w)[0] < (n)) { \
-		(w)[1]++; \
-	} \
-}
-
-/*** THE SIX LOGICAL FUNCTIONS ****************************************/
-/*
- * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
- *
- *   NOTE:  The naming of R and S appears backwards here (R is a SHIFT and
- *   S is a ROTATION) because the SHA-256/384/512 description document
- *   (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
- *   same "backwards" definition.
- */
-/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
-#define R(b,x) 		((x) >> (b))
-/* 32-bit Rotate-right (used in SHA-256): */
-#define S32(b,x)	(((x) >> (b)) | ((x) << (32 - (b))))
-/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
-#define S64(b,x)	(((x) >> (b)) | ((x) << (64 - (b))))
-
-/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
-#define Ch(x,y,z)	(((x) & (y)) ^ ((~(x)) & (z)))
-#define Maj(x,y,z)	(((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
-
-/* Four of six logical functions used in SHA-256: */
-#define Sigma0_256(x)	(S32(2,  (x)) ^ S32(13, (x)) ^ S32(22, (x)))
-#define Sigma1_256(x)	(S32(6,  (x)) ^ S32(11, (x)) ^ S32(25, (x)))
-#define sigma0_256(x)	(S32(7,  (x)) ^ S32(18, (x)) ^ R(3 ,   (x)))
-#define sigma1_256(x)	(S32(17, (x)) ^ S32(19, (x)) ^ R(10,   (x)))
-
-/* Four of six logical functions used in SHA-384 and SHA-512: */
-#define Sigma0_512(x)	(S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
-#define Sigma1_512(x)	(S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
-#define sigma0_512(x)	(S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7,   (x)))
-#define sigma1_512(x)	(S64(19, (x)) ^ S64(61, (x)) ^ R( 6,   (x)))
-
-/*** INTERNAL FUNCTION PROTOTYPES *************************************/
-/* NOTE: These should not be accessed directly from outside this
- * library -- they are intended for private internal visibility/use
- * only.
- */
-void SHA512_Last(SHA512_CTX*);
-void SHA256_Transform(SHA256_CTX*, const sha2_word32*);
-void SHA512_Transform(SHA512_CTX*, const sha2_word64*);
-
-
-/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
-/* Hash constant words K for SHA-256: */
-const static sha2_word32 K256[64] = {
-	0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
-	0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
-	0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
-	0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
-	0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
-	0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
-	0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
-	0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
-	0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
-	0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
-	0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
-	0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
-	0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
-	0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
-	0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
-	0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
-};
-
-/* Initial hash value H for SHA-256: */
-const static sha2_word32 sha256_initial_hash_value[8] = {
-	0x6a09e667UL,
-	0xbb67ae85UL,
-	0x3c6ef372UL,
-	0xa54ff53aUL,
-	0x510e527fUL,
-	0x9b05688cUL,
-	0x1f83d9abUL,
-	0x5be0cd19UL
-};
-
-/* Hash constant words K for SHA-384 and SHA-512: */
-const static sha2_word64 K512[80] = {
-	0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
-	0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
-	0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
-	0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
-	0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
-	0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
-	0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
-	0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
-	0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
-	0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
-	0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
-	0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
-	0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
-	0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
-	0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
-	0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
-	0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
-	0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
-	0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
-	0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
-	0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
-	0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
-	0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
-	0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
-	0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
-	0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
-	0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
-	0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
-	0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
-	0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
-	0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
-	0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
-	0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
-	0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
-	0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
-	0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
-	0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
-	0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
-	0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
-	0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
-};
-
-/* Initial hash value H for SHA-384 */
-const static sha2_word64 sha384_initial_hash_value[8] = {
-	0xcbbb9d5dc1059ed8ULL,
-	0x629a292a367cd507ULL,
-	0x9159015a3070dd17ULL,
-	0x152fecd8f70e5939ULL,
-	0x67332667ffc00b31ULL,
-	0x8eb44a8768581511ULL,
-	0xdb0c2e0d64f98fa7ULL,
-	0x47b5481dbefa4fa4ULL
-};
-
-/* Initial hash value H for SHA-512 */
-const static sha2_word64 sha512_initial_hash_value[8] = {
-	0x6a09e667f3bcc908ULL,
-	0xbb67ae8584caa73bULL,
-	0x3c6ef372fe94f82bULL,
-	0xa54ff53a5f1d36f1ULL,
-	0x510e527fade682d1ULL,
-	0x9b05688c2b3e6c1fULL,
-	0x1f83d9abfb41bd6bULL,
-	0x5be0cd19137e2179ULL
-};
-
-/*
- * Constant used by SHA256/384/512_End() functions for converting the
- * digest to a readable hexadecimal character string:
- */
-static const char *sha2_hex_digits = "0123456789abcdef";
-
-
-/*** SHA-256: *********************************************************/
-void SHA256_Init(SHA256_CTX* context) {
-	if (context == (SHA256_CTX*)0) {
-		return;
-	}
-	bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
-	bzero(context->buffer, SHA256_BLOCK_LENGTH);
-	context->bitcount = 0;
-}
-
-#ifdef SHA2_UNROLL_TRANSFORM
-
-/* Unrolled SHA-256 round macros: */
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-
-#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)	\
-	REVERSE32(*data++, W256[j]); \
-	T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
-             K256[j] + W256[j]; \
-	(d) += T1; \
-	(h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
-	j++
-
-
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
-
-#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h)	\
-	T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
-	     K256[j] + (W256[j] = *data++); \
-	(d) += T1; \
-	(h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
-	j++
-
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-
-#define ROUND256(a,b,c,d,e,f,g,h)	\
-	s0 = W256[(j+1)&0x0f]; \
-	s0 = sigma0_256(s0); \
-	s1 = W256[(j+14)&0x0f]; \
-	s1 = sigma1_256(s1); \
-	T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
-	     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
-	(d) += T1; \
-	(h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
-	j++
-
-void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
-	sha2_word32	a, b, c, d, e, f, g, h, s0, s1;
-	sha2_word32	T1, *W256;
-	int		j;
-
-	W256 = (sha2_word32*)context->buffer;
-
-	/* Initialize registers with the prev. intermediate value */
-	a = context->state[0];
-	b = context->state[1];
-	c = context->state[2];
-	d = context->state[3];
-	e = context->state[4];
-	f = context->state[5];
-	g = context->state[6];
-	h = context->state[7];
-
-	j = 0;
-	do {
-		/* Rounds 0 to 15 (unrolled): */
-		ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
-		ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
-		ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
-		ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
-		ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
-		ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
-		ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
-		ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
-	} while (j < 16);
-
-	/* Now for the remaining rounds to 64: */
-	do {
-		ROUND256(a,b,c,d,e,f,g,h);
-		ROUND256(h,a,b,c,d,e,f,g);
-		ROUND256(g,h,a,b,c,d,e,f);
-		ROUND256(f,g,h,a,b,c,d,e);
-		ROUND256(e,f,g,h,a,b,c,d);
-		ROUND256(d,e,f,g,h,a,b,c);
-		ROUND256(c,d,e,f,g,h,a,b);
-		ROUND256(b,c,d,e,f,g,h,a);
-	} while (j < 64);
-
-	/* Compute the current intermediate hash value */
-	context->state[0] += a;
-	context->state[1] += b;
-	context->state[2] += c;
-	context->state[3] += d;
-	context->state[4] += e;
-	context->state[5] += f;
-	context->state[6] += g;
-	context->state[7] += h;
-
-	/* Clean up */
-	a = b = c = d = e = f = g = h = T1 = 0;
-}
-
-#else /* SHA2_UNROLL_TRANSFORM */
-
-void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
-	sha2_word32	a, b, c, d, e, f, g, h, s0, s1;
-	sha2_word32	T1, T2, *W256;
-	int		j;
-
-	W256 = (sha2_word32*)context->buffer;
-
-	/* Initialize registers with the prev. intermediate value */
-	a = context->state[0];
-	b = context->state[1];
-	c = context->state[2];
-	d = context->state[3];
-	e = context->state[4];
-	f = context->state[5];
-	g = context->state[6];
-	h = context->state[7];
-
-	j = 0;
-	do {
-#if BYTE_ORDER == LITTLE_ENDIAN
-		/* Copy data while converting to host byte order */
-		REVERSE32(*data++,W256[j]);
-		/* Apply the SHA-256 compression function to update a..h */
-		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
-		/* Apply the SHA-256 compression function to update a..h with copy */
-		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-		T2 = Sigma0_256(a) + Maj(a, b, c);
-		h = g;
-		g = f;
-		f = e;
-		e = d + T1;
-		d = c;
-		c = b;
-		b = a;
-		a = T1 + T2;
-
-		j++;
-	} while (j < 16);
-
-	do {
-		/* Part of the message block expansion: */
-		s0 = W256[(j+1)&0x0f];
-		s0 = sigma0_256(s0);
-		s1 = W256[(j+14)&0x0f];	
-		s1 = sigma1_256(s1);
-
-		/* Apply the SHA-256 compression function to update a..h */
-		T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + 
-		     (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
-		T2 = Sigma0_256(a) + Maj(a, b, c);
-		h = g;
-		g = f;
-		f = e;
-		e = d + T1;
-		d = c;
-		c = b;
-		b = a;
-		a = T1 + T2;
-
-		j++;
-	} while (j < 64);
-
-	/* Compute the current intermediate hash value */
-	context->state[0] += a;
-	context->state[1] += b;
-	context->state[2] += c;
-	context->state[3] += d;
-	context->state[4] += e;
-	context->state[5] += f;
-	context->state[6] += g;
-	context->state[7] += h;
-
-	/* Clean up */
-	a = b = c = d = e = f = g = h = T1 = T2 = 0;
-}
-
-#endif /* SHA2_UNROLL_TRANSFORM */
-
-void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
-	unsigned int	freespace, usedspace;
-
-	if (len == 0) {
-		/* Calling with no data is valid - we do nothing */
-		return;
-	}
-
-	/* Sanity check: */
-	assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0);
-
-	usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
-	if (usedspace > 0) {
-		/* Calculate how much free space is available in the buffer */
-		freespace = SHA256_BLOCK_LENGTH - usedspace;
-
-		if (len >= freespace) {
-			/* Fill the buffer completely and process it */
-			bcopy(data, &context->buffer[usedspace], freespace);
-			context->bitcount += freespace << 3;
-			len -= freespace;
-			data += freespace;
-			SHA256_Transform(context, (sha2_word32*)context->buffer);
-		} else {
-			/* The buffer is not yet full */
-			bcopy(data, &context->buffer[usedspace], len);
-			context->bitcount += len << 3;
-			/* Clean up: */
-			usedspace = freespace = 0;
-			return;
-		}
-	}
-	while (len >= SHA256_BLOCK_LENGTH) {
-		/* Process as many complete blocks as we can */
-		SHA256_Transform(context, (const sha2_word32*)data);
-		context->bitcount += SHA256_BLOCK_LENGTH << 3;
-		len -= SHA256_BLOCK_LENGTH;
-		data += SHA256_BLOCK_LENGTH;
-	}
-	if (len > 0) {
-		/* There's left-overs, so save 'em */
-		bcopy(data, context->buffer, len);
-		context->bitcount += len << 3;
-	}
-	/* Clean up: */
-	usedspace = freespace = 0;
-}
-
-void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
-	sha2_word32	*d = (sha2_word32*)digest;
-	unsigned int	usedspace;
-
-	/* Sanity check: */
-	assert(context != (SHA256_CTX*)0);
-
-	/* If no digest buffer is passed, we don't bother doing this: */
-	if (digest != (sha2_byte*)0) {
-		usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
-#if BYTE_ORDER == LITTLE_ENDIAN
-		/* Convert FROM host byte order */
-		REVERSE64(context->bitcount,context->bitcount);
-#endif
-		if (usedspace > 0) {
-			/* Begin padding with a 1 bit: */
-			context->buffer[usedspace++] = 0x80;
-
-			if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
-				/* Set-up for the last transform: */
-				bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
-			} else {
-				if (usedspace < SHA256_BLOCK_LENGTH) {
-					bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
-				}
-				/* Do second-to-last transform: */
-				SHA256_Transform(context, (sha2_word32*)context->buffer);
-
-				/* And set-up for the last transform: */
-				bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
-			}
-		} else {
-			/* Set-up for the last transform: */
-			bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
-
-			/* Begin padding with a 1 bit: */
-			*context->buffer = 0x80;
-		}
-		/* Set the bit count: */
-		*(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
-
-		/* Final transform: */
-		SHA256_Transform(context, (sha2_word32*)context->buffer);
-
-#if BYTE_ORDER == LITTLE_ENDIAN
-		{
-			/* Convert TO host byte order */
-			int	j;
-			for (j = 0; j < 8; j++) {
-				REVERSE32(context->state[j],context->state[j]);
-				*d++ = context->state[j];
-			}
-		}
-#else
-		bcopy(context->state, d, SHA256_DIGEST_LENGTH);
-#endif
-	}
-
-	/* Clean up state data: */
-	bzero(context, sizeof(*context));
-	usedspace = 0;
-}
-
-char *SHA256_End(SHA256_CTX* context, char buffer[]) {
-	sha2_byte	digest[SHA256_DIGEST_LENGTH], *d = digest;
-	int		i;
-
-	/* Sanity check: */
-	assert(context != (SHA256_CTX*)0);
-
-	if (buffer != (char*)0) {
-		SHA256_Final(digest, context);
-
-		for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
-			*buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
-			*buffer++ = sha2_hex_digits[*d & 0x0f];
-			d++;
-		}
-		*buffer = (char)0;
-	} else {
-		bzero(context, sizeof(*context));
-	}
-	bzero(digest, SHA256_DIGEST_LENGTH);
-	return buffer;
-}
-
-char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) {
-	SHA256_CTX	context;
-
-	SHA256_Init(&context);
-	SHA256_Update(&context, data, len);
-	return SHA256_End(&context, digest);
-}
-
-
-/*** SHA-512: *********************************************************/
-void SHA512_Init(SHA512_CTX* context) {
-	if (context == (SHA512_CTX*)0) {
-		return;
-	}
-	bcopy(sha512_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
-	bzero(context->buffer, SHA512_BLOCK_LENGTH);
-	context->bitcount[0] = context->bitcount[1] =  0;
-}
-
-#ifdef SHA2_UNROLL_TRANSFORM
-
-/* Unrolled SHA-512 round macros: */
-#if BYTE_ORDER == LITTLE_ENDIAN
-
-#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)	\
-	REVERSE64(*data++, W512[j]); \
-	T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
-             K512[j] + W512[j]; \
-	(d) += T1, \
-	(h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
-	j++
-
-
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
-
-#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h)	\
-	T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
-             K512[j] + (W512[j] = *data++); \
-	(d) += T1; \
-	(h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
-	j++
-
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-
-#define ROUND512(a,b,c,d,e,f,g,h)	\
-	s0 = W512[(j+1)&0x0f]; \
-	s0 = sigma0_512(s0); \
-	s1 = W512[(j+14)&0x0f]; \
-	s1 = sigma1_512(s1); \
-	T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
-             (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
-	(d) += T1; \
-	(h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
-	j++
-
-void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
-	sha2_word64	a, b, c, d, e, f, g, h, s0, s1;
-	sha2_word64	T1, *W512 = (sha2_word64*)context->buffer;
-	int		j;
-
-	/* Initialize registers with the prev. intermediate value */
-	a = context->state[0];
-	b = context->state[1];
-	c = context->state[2];
-	d = context->state[3];
-	e = context->state[4];
-	f = context->state[5];
-	g = context->state[6];
-	h = context->state[7];
-
-	j = 0;
-	do {
-		ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
-		ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
-		ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
-		ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
-		ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
-		ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
-		ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
-		ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
-	} while (j < 16);
-
-	/* Now for the remaining rounds up to 79: */
-	do {
-		ROUND512(a,b,c,d,e,f,g,h);
-		ROUND512(h,a,b,c,d,e,f,g);
-		ROUND512(g,h,a,b,c,d,e,f);
-		ROUND512(f,g,h,a,b,c,d,e);
-		ROUND512(e,f,g,h,a,b,c,d);
-		ROUND512(d,e,f,g,h,a,b,c);
-		ROUND512(c,d,e,f,g,h,a,b);
-		ROUND512(b,c,d,e,f,g,h,a);
-	} while (j < 80);
-
-	/* Compute the current intermediate hash value */
-	context->state[0] += a;
-	context->state[1] += b;
-	context->state[2] += c;
-	context->state[3] += d;
-	context->state[4] += e;
-	context->state[5] += f;
-	context->state[6] += g;
-	context->state[7] += h;
-
-	/* Clean up */
-	a = b = c = d = e = f = g = h = T1 = 0;
-}
-
-#else /* SHA2_UNROLL_TRANSFORM */
-
-void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
-	sha2_word64	a, b, c, d, e, f, g, h, s0, s1;
-	sha2_word64	T1, T2, *W512 = (sha2_word64*)context->buffer;
-	int		j;
-
-	/* Initialize registers with the prev. intermediate value */
-	a = context->state[0];
-	b = context->state[1];
-	c = context->state[2];
-	d = context->state[3];
-	e = context->state[4];
-	f = context->state[5];
-	g = context->state[6];
-	h = context->state[7];
-
-	j = 0;
-	do {
-#if BYTE_ORDER == LITTLE_ENDIAN
-		/* Convert TO host byte order */
-		REVERSE64(*data++, W512[j]);
-		/* Apply the SHA-512 compression function to update a..h */
-		T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
-		/* Apply the SHA-512 compression function to update a..h with copy */
-		T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
-		T2 = Sigma0_512(a) + Maj(a, b, c);
-		h = g;
-		g = f;
-		f = e;
-		e = d + T1;
-		d = c;
-		c = b;
-		b = a;
-		a = T1 + T2;
-
-		j++;
-	} while (j < 16);
-
-	do {
-		/* Part of the message block expansion: */
-		s0 = W512[(j+1)&0x0f];
-		s0 = sigma0_512(s0);
-		s1 = W512[(j+14)&0x0f];
-		s1 =  sigma1_512(s1);
-
-		/* Apply the SHA-512 compression function to update a..h */
-		T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
-		     (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
-		T2 = Sigma0_512(a) + Maj(a, b, c);
-		h = g;
-		g = f;
-		f = e;
-		e = d + T1;
-		d = c;
-		c = b;
-		b = a;
-		a = T1 + T2;
-
-		j++;
-	} while (j < 80);
-
-	/* Compute the current intermediate hash value */
-	context->state[0] += a;
-	context->state[1] += b;
-	context->state[2] += c;
-	context->state[3] += d;
-	context->state[4] += e;
-	context->state[5] += f;
-	context->state[6] += g;
-	context->state[7] += h;
-
-	/* Clean up */
-	a = b = c = d = e = f = g = h = T1 = T2 = 0;
-}
-
-#endif /* SHA2_UNROLL_TRANSFORM */
-
-void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
-	unsigned int	freespace, usedspace;
-
-	if (len == 0) {
-		/* Calling with no data is valid - we do nothing */
-		return;
-	}
-
-	/* Sanity check: */
-	assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0);
-
-	usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
-	if (usedspace > 0) {
-		/* Calculate how much free space is available in the buffer */
-		freespace = SHA512_BLOCK_LENGTH - usedspace;
-
-		if (len >= freespace) {
-			/* Fill the buffer completely and process it */
-			bcopy(data, &context->buffer[usedspace], freespace);
-			ADDINC128(context->bitcount, freespace << 3);
-			len -= freespace;
-			data += freespace;
-			SHA512_Transform(context, (sha2_word64*)context->buffer);
-		} else {
-			/* The buffer is not yet full */
-			bcopy(data, &context->buffer[usedspace], len);
-			ADDINC128(context->bitcount, len << 3);
-			/* Clean up: */
-			usedspace = freespace = 0;
-			return;
-		}
-	}
-	while (len >= SHA512_BLOCK_LENGTH) {
-		/* Process as many complete blocks as we can */
-		SHA512_Transform(context, (const sha2_word64*)data);
-		ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
-		len -= SHA512_BLOCK_LENGTH;
-		data += SHA512_BLOCK_LENGTH;
-	}
-	if (len > 0) {
-		/* There's left-overs, so save 'em */
-		bcopy(data, context->buffer, len);
-		ADDINC128(context->bitcount, len << 3);
-	}
-	/* Clean up: */
-	usedspace = freespace = 0;
-}
-
-void SHA512_Last(SHA512_CTX* context) {
-	unsigned int	usedspace;
-
-	usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
-#if BYTE_ORDER == LITTLE_ENDIAN
-	/* Convert FROM host byte order */
-	REVERSE64(context->bitcount[0],context->bitcount[0]);
-	REVERSE64(context->bitcount[1],context->bitcount[1]);
-#endif
-	if (usedspace > 0) {
-		/* Begin padding with a 1 bit: */
-		context->buffer[usedspace++] = 0x80;
-
-		if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
-			/* Set-up for the last transform: */
-			bzero(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
-		} else {
-			if (usedspace < SHA512_BLOCK_LENGTH) {
-				bzero(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
-			}
-			/* Do second-to-last transform: */
-			SHA512_Transform(context, (sha2_word64*)context->buffer);
-
-			/* And set-up for the last transform: */
-			bzero(context->buffer, SHA512_BLOCK_LENGTH - 2);
-		}
-	} else {
-		/* Prepare for final transform: */
-		bzero(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
-
-		/* Begin padding with a 1 bit: */
-		*context->buffer = 0x80;
-	}
-	/* Store the length of input data (in bits): */
-	*(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
-	*(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
-
-	/* Final transform: */
-	SHA512_Transform(context, (sha2_word64*)context->buffer);
-}
-
-void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
-	sha2_word64	*d = (sha2_word64*)digest;
-
-	/* Sanity check: */
-	assert(context != (SHA512_CTX*)0);
-
-	/* If no digest buffer is passed, we don't bother doing this: */
-	if (digest != (sha2_byte*)0) {
-		SHA512_Last(context);
-
-		/* Save the hash data for output: */
-#if BYTE_ORDER == LITTLE_ENDIAN
-		{
-			/* Convert TO host byte order */
-			int	j;
-			for (j = 0; j < 8; j++) {
-				REVERSE64(context->state[j],context->state[j]);
-				*d++ = context->state[j];
-			}
-		}
-#else
-		bcopy(context->state, d, SHA512_DIGEST_LENGTH);
-#endif
-	}
-
-	/* Zero out state data */
-	bzero(context, sizeof(*context));
-}
-
-char *SHA512_End(SHA512_CTX* context, char buffer[]) {
-	sha2_byte	digest[SHA512_DIGEST_LENGTH], *d = digest;
-	int		i;
-
-	/* Sanity check: */
-	assert(context != (SHA512_CTX*)0);
-
-	if (buffer != (char*)0) {
-		SHA512_Final(digest, context);
-
-		for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
-			*buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
-			*buffer++ = sha2_hex_digits[*d & 0x0f];
-			d++;
-		}
-		*buffer = (char)0;
-	} else {
-		bzero(context, sizeof(*context));
-	}
-	bzero(digest, SHA512_DIGEST_LENGTH);
-	return buffer;
-}
-
-char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) {
-	SHA512_CTX	context;
-
-	SHA512_Init(&context);
-	SHA512_Update(&context, data, len);
-	return SHA512_End(&context, digest);
-}
-
-
-/*** SHA-384: *********************************************************/
-void SHA384_Init(SHA384_CTX* context) {
-	if (context == (SHA384_CTX*)0) {
-		return;
-	}
-	bcopy(sha384_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
-	bzero(context->buffer, SHA384_BLOCK_LENGTH);
-	context->bitcount[0] = context->bitcount[1] = 0;
-}
-
-void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
-	SHA512_Update((SHA512_CTX*)context, data, len);
-}
-
-void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
-	sha2_word64	*d = (sha2_word64*)digest;
-
-	/* Sanity check: */
-	assert(context != (SHA384_CTX*)0);
-
-	/* If no digest buffer is passed, we don't bother doing this: */
-	if (digest != (sha2_byte*)0) {
-		SHA512_Last((SHA512_CTX*)context);
-
-		/* Save the hash data for output: */
-#if BYTE_ORDER == LITTLE_ENDIAN
-		{
-			/* Convert TO host byte order */
-			int	j;
-			for (j = 0; j < 6; j++) {
-				REVERSE64(context->state[j],context->state[j]);
-				*d++ = context->state[j];
-			}
-		}
-#else
-		bcopy(context->state, d, SHA384_DIGEST_LENGTH);
-#endif
-	}
-
-	/* Zero out state data */
-	bzero(context, sizeof(*context));
-}
-
-char *SHA384_End(SHA384_CTX* context, char buffer[]) {
-	sha2_byte	digest[SHA384_DIGEST_LENGTH], *d = digest;
-	int		i;
-
-	/* Sanity check: */
-	assert(context != (SHA384_CTX*)0);
-
-	if (buffer != (char*)0) {
-		SHA384_Final(digest, context);
-
-		for (i = 0; i < SHA384_DIGEST_LENGTH; i++) {
-			*buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
-			*buffer++ = sha2_hex_digits[*d & 0x0f];
-			d++;
-		}
-		*buffer = (char)0;
-	} else {
-		bzero(context, sizeof(*context));
-	}
-	bzero(digest, SHA384_DIGEST_LENGTH);
-	return buffer;
-}
-
-char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) {
-	SHA384_CTX	context;
-
-	SHA384_Init(&context);
-	SHA384_Update(&context, data, len);
-	return SHA384_End(&context, digest);
-}
-
-/*glue*/
-#ifdef HAVE_EVP_097
-
-/* SHA256 */
-#define data(ctx) ((SHA256_CTX *)(ctx)->md_data)
-static int sha256_init(EVP_MD_CTX *ctx)
-{
-  SHA256_Init(data(ctx));
-  return 1;
-}
-static int sha256_update(EVP_MD_CTX *ctx, const void *data, unsigned long count)
-{
-  SHA256_Update(data(ctx), data, count);
-  return 1;
-}
-static int sha256_final(EVP_MD_CTX *ctx, unsigned char *md)
-{
-  SHA256_Final(md, data(ctx));
-  return 1;
-}
-#undef data
-
-/* SHA384 */
-#define data(ctx) ((SHA384_CTX *)(ctx)->md_data)
-static int sha384_init(EVP_MD_CTX *ctx)
-{
-  SHA384_Init(data(ctx));
-  return 1;
-}
-static int sha384_update(EVP_MD_CTX *ctx, const void *data, unsigned long count)
-{
-  SHA384_Update(data(ctx), data, count);
-  return 1;
-}
-static int sha384_final(EVP_MD_CTX *ctx, unsigned char *md)
-{
-  SHA384_Final(md, data(ctx));
-  return 1;
-}
-#undef data
-
-/* SHA512 */
-#define data(ctx) ((SHA512_CTX *)(ctx)->md_data)
-static int sha512_init(EVP_MD_CTX *ctx)
-{
-  SHA512_Init(data(ctx));
-  return 1;
-}
-static int sha512_update(EVP_MD_CTX *ctx, const void *data, unsigned long count)
-{
-  SHA512_Update(data(ctx), data, count);
-  return 1;
-}
-static int sha512_final(EVP_MD_CTX *ctx, unsigned char *md)
-{
-  SHA512_Final(md, data(ctx));
-  return 1;
-}
-#undef data
-#endif
-
-static struct env_md_st sha2_256_md = {
-	0, /*NID_sha1*/
-	0, /*NID_sha1WithRSAEncryption*/
-	SHA256_DIGEST_LENGTH,
-#ifdef HAVE_EVP_097
-	0,			/* flags */
-	sha256_init,
-	sha256_update,
-	sha256_final,
-	NULL,			/* copy */
-	NULL,			/* cleanup */
-#else
-	SHA256_Init,
-	SHA256_Update,
-	SHA256_Final,
-#endif
-	NULL, NULL, {0, 0, 0, 0},
-	SHA256_BLOCK_LENGTH,
-	sizeof(struct env_md_st *) + sizeof(SHA256_CTX),
-};
-
-struct env_md_st *EVP_sha2_256(void)
-{
-	return(&sha2_256_md);
-}
-
-static struct env_md_st sha2_384_md = {
-	0, /*NID_sha1*/
-	0, /*NID_sha1WithRSAEncryption*/
-	SHA384_DIGEST_LENGTH,
-#ifdef HAVE_EVP_097
-	0,			/* flags */
-	sha384_init,
-	sha384_update,
-	sha384_final,
-	NULL,			/* copy */
-	NULL,			/* cleanup */
-#else
-	SHA384_Init,
-	SHA384_Update,
-	SHA384_Final,
-#endif
-	NULL, NULL, {0, 0, 0, 0},
-	SHA384_BLOCK_LENGTH,
-	sizeof(struct env_md_st *) + sizeof(SHA384_CTX),
-};
-
-struct env_md_st *EVP_sha2_384(void)
-{
-	return(&sha2_384_md);
-}
-
-static struct env_md_st sha2_512_md = {
-	0, /*NID_sha1*/
-	0, /*NID_sha1WithRSAEncryption*/
-	SHA512_DIGEST_LENGTH,
-#ifdef HAVE_EVP_097
-	0,			/* flags */
-	sha512_init,
-	sha512_update,
-	sha512_final,
-	NULL,			/* copy */
-	NULL,			/* cleanup */
-#else
-	SHA512_Init,
-	SHA512_Update,
-	SHA512_Final,
-#endif
-	NULL, NULL, {0, 0, 0, 0}, /*EVP_PKEY_RSA_method*/
-	SHA512_BLOCK_LENGTH,
-	sizeof(struct env_md_st *) + sizeof(SHA512_CTX),
-};
-
-struct env_md_st *EVP_sha2_512(void)
-{
-	return(&sha2_512_md);
-}
diff --git a/src/racoon/missing/crypto/sha2/sha2.h b/src/racoon/missing/crypto/sha2/sha2.h
deleted file mode 100644
index 42bcc2a..0000000
--- a/src/racoon/missing/crypto/sha2/sha2.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*	$NetBSD: sha2.h,v 1.4 2006/09/09 16:22:36 manu Exp $	*/
-
-/*	$KAME: sha2.h,v 1.2 2001/08/08 22:09:27 sakane Exp $	*/
-
-/*
- * sha2.h
- *
- * Version 1.0.0beta1
- *
- * Written by Aaron D. Gifford <me@aarongifford.com>
- *
- * Copyright 2000 Aaron D. Gifford.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the copyright holder nor the names of contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- */
-
-#ifndef __SHA2_H__
-#define __SHA2_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*** SHA-256/384/512 Various Length Definitions ***********************/
-#define SHA256_BLOCK_LENGTH		64
-#define SHA256_DIGEST_LENGTH		32
-#define SHA256_DIGEST_STRING_LENGTH	(SHA256_DIGEST_LENGTH * 2 + 1)
-#define SHA384_BLOCK_LENGTH		128
-#define SHA384_DIGEST_LENGTH		48
-#define SHA384_DIGEST_STRING_LENGTH	(SHA384_DIGEST_LENGTH * 2 + 1)
-#define SHA512_BLOCK_LENGTH		128
-#define SHA512_DIGEST_LENGTH		64
-#define SHA512_DIGEST_STRING_LENGTH	(SHA512_DIGEST_LENGTH * 2 + 1)
-
-
-/*** SHA-256/384/512 Context Structures *******************************/
-/* NOTE: If your architecture does not define either u_intXX_t types or
- * uintXX_t (from inttypes.h), you may need to define things by hand
- * for your system:
- */
-#if 0
-typedef unsigned char u_int8_t;		/* 1-byte  (8-bits)  */
-typedef unsigned int u_int32_t;		/* 4-bytes (32-bits) */
-typedef unsigned long long u_int64_t;	/* 8-bytes (64-bits) */
-#endif
-
-#ifndef HAVE_SHA2_IN_SHA_H
-/*
- * Most BSD systems already define u_intXX_t types, as does Linux.
- * Some systems, however, like Compaq's Tru64 Unix instead can use
- * uintXX_t types defined by very recent ANSI C standards and included
- * in the file:
- *
- *   #include <inttypes.h>
- *
- * If you choose to use <inttypes.h> then please define: 
- *
- *   #define SHA2_USE_INTTYPES_H
- *
- * Or on the command line during compile:
- *
- *   cc -DSHA2_USE_INTTYPES_H ...
- */
-#if 0 /*def SHA2_USE_INTTYPES_H*/
-
-typedef struct _SHA256_CTX {
-	uint32_t	state[8];
-	uint64_t	bitcount;
-	uint8_t	buffer[SHA256_BLOCK_LENGTH];
-} SHA256_CTX;
-typedef struct _SHA512_CTX {
-	uint64_t	state[8];
-	uint64_t	bitcount[2];
-	uint8_t	buffer[SHA512_BLOCK_LENGTH];
-} SHA512_CTX;
-
-#else /* SHA2_USE_INTTYPES_H */
-
-typedef struct _SHA256_CTX {
-	u_int32_t	state[8];
-	u_int64_t	bitcount;
-	u_int8_t	buffer[SHA256_BLOCK_LENGTH];
-} SHA256_CTX;
-typedef struct _SHA512_CTX {
-	u_int64_t	state[8];
-	u_int64_t	bitcount[2];
-	u_int8_t	buffer[SHA512_BLOCK_LENGTH];
-} SHA512_CTX;
-
-#endif /* SHA2_USE_INTTYPES_H */
-#endif /* HAVE_SHA2_IN_SHA_H */
-
-typedef SHA512_CTX SHA384_CTX;
-
-
-/*** SHA-256/384/512 Function Prototypes ******************************/
-
-#ifndef HAVE_SHA2_IN_SHA_H
-void SHA256_Init __P((SHA256_CTX *));
-void SHA256_Update __P((SHA256_CTX*, const u_int8_t*, size_t));
-void SHA256_Final __P((u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*));
-#endif /* HAVE_SHA2_IN_SHA_H */
-char* SHA256_End __P((SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]));
-char* SHA256_Data __P((const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]));
-
-#ifndef HAVE_SHA2_IN_SHA_H
-void SHA384_Init __P((SHA384_CTX*));
-void SHA384_Update __P((SHA384_CTX*, const u_int8_t*, size_t));
-void SHA384_Final __P((u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*));
-#endif /* HAVE_SHA2_IN_SHA_H */
-char* SHA384_End __P((SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]));
-char* SHA384_Data __P((const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]));
-
-#ifndef HAVE_SHA2_IN_SHA_H
-void SHA512_Init __P((SHA512_CTX*));
-void SHA512_Update __P((SHA512_CTX*, const u_int8_t*, size_t));
-void SHA512_Final __P((u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*));
-#endif /* HAVE_SHA2_IN_SHA_H */
-char* SHA512_End __P((SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]));
-char* SHA512_Data __P((const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]));
-
-struct env_md_st *EVP_sha2_256 __P((void));
-struct env_md_st *EVP_sha2_384 __P((void));
-struct env_md_st *EVP_sha2_512 __P((void));
-
-#ifdef HAVE_SHA2_IN_SHA_H
-#define EVP_sha2_256 EVP_sha256
-#define EVP_sha2_384 EVP_sha384
-#define EVP_sha2_512 EVP_sha512
-#endif
-
-#ifdef	__cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __SHA2_H__ */
-
diff --git a/src/racoon/nattraversal.c b/src/racoon/nattraversal.c
deleted file mode 100644
index 9fd4bcd..0000000
--- a/src/racoon/nattraversal.c
+++ /dev/null
@@ -1,528 +0,0 @@
-/*	$NetBSD: nattraversal.c,v 1.6.6.2 2009/05/18 17:01:07 tteras Exp $	*/
-
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#ifdef __linux__
-#include <linux/udp.h>
-#endif
-#if defined(__NetBSD__) || defined (__FreeBSD__)
-#include <netinet/udp.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "remoteconf.h"
-#include "sockmisc.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "oakley.h"
-#include "ipsec_doi.h"
-#include "vendorid.h"
-#include "handler.h"
-#include "crypto_openssl.h"
-#include "schedule.h"
-#include "nattraversal.h"
-#include "grabmyaddr.h"
-
-struct natt_ka_addrs {
-  struct sockaddr	*src;
-  struct sockaddr	*dst;
-  unsigned		in_use;
-
-  TAILQ_ENTRY(natt_ka_addrs) chain;
-};
-
-static TAILQ_HEAD(_natt_ka_addrs, natt_ka_addrs) ka_tree;
-
-/*
- * check if the given vid is NAT-T.
- */
-int
-natt_vendorid (int vid)
-{
-  return (
-#ifdef ENABLE_NATT_00
-	  vid == VENDORID_NATT_00 ||
-#endif
-#ifdef ENABLE_NATT_01
-	  vid == VENDORID_NATT_01 ||
-#endif
-#ifdef ENABLE_NATT_02
-	  vid == VENDORID_NATT_02 ||
-	  vid == VENDORID_NATT_02_N ||
-#endif
-#ifdef ENABLE_NATT_03
-	  vid == VENDORID_NATT_03 ||
-#endif
-#ifdef ENABLE_NATT_04
-	  vid == VENDORID_NATT_04 ||
-#endif
-#ifdef ENABLE_NATT_05
-	  vid == VENDORID_NATT_05 ||
-#endif
-#ifdef ENABLE_NATT_06
-	  vid == VENDORID_NATT_06 ||
-#endif
-#ifdef ENABLE_NATT_07
-	  vid == VENDORID_NATT_07 ||
-#endif
-#ifdef ENABLE_NATT_08
-	  vid == VENDORID_NATT_08 ||
-#endif
-	  /* Always enable NATT RFC if ENABLE_NATT
-	   */
-	  vid == VENDORID_NATT_RFC);
-}
-
-vchar_t *
-natt_hash_addr (struct ph1handle *iph1, struct sockaddr *addr)
-{
-  vchar_t *natd;
-  vchar_t *buf;
-  char *ptr;
-  void *addr_ptr, *addr_port;
-  size_t buf_size, addr_size;
-
-  plog (LLV_INFO, LOCATION, addr, "Hashing %s with algo #%d %s\n",
-	saddr2str(addr), iph1->approval->hashtype, 
-	(iph1->rmconf->nat_traversal == NATT_FORCE)?"(NAT-T forced)":"");
-  
-  if (addr->sa_family == AF_INET) {
-    addr_size = sizeof (struct in_addr);	/* IPv4 address */
-    addr_ptr = &((struct sockaddr_in *)addr)->sin_addr;
-    addr_port = &((struct sockaddr_in *)addr)->sin_port;
-  }
-  else if (addr->sa_family == AF_INET6) {
-    addr_size = sizeof (struct in6_addr);	/* IPv6 address */
-    addr_ptr = &((struct sockaddr_in6 *)addr)->sin6_addr;
-    addr_port = &((struct sockaddr_in6 *)addr)->sin6_port;
-  }
-  else {
-    plog (LLV_ERROR, LOCATION, addr, "Unsupported address family #0x%x\n", addr->sa_family);
-    return NULL;
-  }
-
-  buf_size = 2 * sizeof (cookie_t);	/* CKY-I + CKY+R */
-  buf_size += addr_size + 2;	/* Address + Port */
-  
-  if ((buf = vmalloc (buf_size)) == NULL)
-    return NULL;
-
-  ptr = buf->v;
-  
-  /* Copy-in CKY-I */
-  memcpy (ptr, iph1->index.i_ck, sizeof (cookie_t));
-  ptr += sizeof (cookie_t);
-  
-  /* Copy-in CKY-I */
-  memcpy (ptr, iph1->index.r_ck, sizeof (cookie_t));
-  ptr += sizeof (cookie_t);
-  
-  /* Copy-in Address (or zeroes if NATT_FORCE) */
-  if (iph1->rmconf->nat_traversal == NATT_FORCE)
-    memset (ptr, 0, addr_size);
-  else
-    memcpy (ptr, addr_ptr, addr_size);
-  ptr += addr_size;
-
-  /* Copy-in Port number */
-  memcpy (ptr, addr_port, 2);
-
-  natd = oakley_hash (buf, iph1);
-  vfree(buf);
-
-  return natd;
-}
-
-int 
-natt_compare_addr_hash (struct ph1handle *iph1, vchar_t *natd_received,
-			int natd_seq)
-{
-  vchar_t *natd_computed;
-  u_int32_t flag;
-  int verified = 0;
-
-  if (iph1->rmconf->nat_traversal == NATT_FORCE)
-    return verified;
-
-  if (natd_seq == 0) {
-    natd_computed = natt_hash_addr (iph1, iph1->local);
-    flag = NAT_DETECTED_ME;
-  }
-  else {
-    natd_computed = natt_hash_addr (iph1, iph1->remote);
-    flag = NAT_DETECTED_PEER;
-  }
-
-  if (natd_computed == NULL) {
-	plog(LLV_ERROR, LOCATION, NULL, "natd_computed allocation failed\n");
-	return verified; /* XXX should abort */
-  }
-
-  if (natd_received->l == natd_computed->l &&
-      memcmp (natd_received->v, natd_computed->v, natd_received->l) == 0) {
-    iph1->natt_flags &= ~flag;
-    verified = 1;
-  }
-
-  vfree (natd_computed);
-
-  return verified;
-}
-
-int
-natt_udp_encap (int encmode)
-{
-  return (encmode == IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC || 
-	  encmode == IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC ||
-	  encmode == IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT ||
-	  encmode == IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT);
-}
-
-int
-natt_fill_options (struct ph1natt_options *opts, int version)
-{
-  if (! opts)
-    return -1;
-
-  opts->version = version;
-
-  switch (version) {
-    case VENDORID_NATT_00:
-    case VENDORID_NATT_01:
-      opts->float_port = 0; /* No port floating for those drafts */
-      opts->payload_nat_d = ISAKMP_NPTYPE_NATD_DRAFT;
-      opts->payload_nat_oa = ISAKMP_NPTYPE_NATOA_DRAFT;
-      opts->mode_udp_tunnel = IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT;
-      opts->mode_udp_transport = IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT;
-      opts->encaps_type = UDP_ENCAP_ESPINUDP_NON_IKE;
-		break;
-
-    case VENDORID_NATT_02:
-    case VENDORID_NATT_02_N:
-    case VENDORID_NATT_03:
-      opts->float_port = lcconf->port_isakmp_natt;
-      opts->payload_nat_d = ISAKMP_NPTYPE_NATD_DRAFT;
-      opts->payload_nat_oa = ISAKMP_NPTYPE_NATOA_DRAFT;
-      opts->mode_udp_tunnel = IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT;
-      opts->mode_udp_transport = IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT;
-      opts->encaps_type = UDP_ENCAP_ESPINUDP;
-      break;
-    case VENDORID_NATT_04:
-    case VENDORID_NATT_05:
-    case VENDORID_NATT_06:
-    case VENDORID_NATT_07:
-    case VENDORID_NATT_08:
-      opts->float_port = lcconf->port_isakmp_natt;
-      opts->payload_nat_d = ISAKMP_NPTYPE_NATD_BADDRAFT;
-      opts->payload_nat_oa = ISAKMP_NPTYPE_NATOA_BADDRAFT;
-      opts->mode_udp_tunnel = IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC;
-      opts->mode_udp_transport = IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC;
-      opts->encaps_type = UDP_ENCAP_ESPINUDP;
-      break;
-    case VENDORID_NATT_RFC:
-      opts->float_port = lcconf->port_isakmp_natt;
-      opts->payload_nat_d = ISAKMP_NPTYPE_NATD_RFC;
-      opts->payload_nat_oa = ISAKMP_NPTYPE_NATOA_RFC;
-      opts->mode_udp_tunnel = IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC;
-      opts->mode_udp_transport = IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC;
-      opts->encaps_type = UDP_ENCAP_ESPINUDP;
-	  break;
-    default:
-      plog(LLV_ERROR, LOCATION, NULL, 
-	   "unsupported NAT-T version: %s\n",
-	   vid_string_by_id(version));
-      return -1;
-  }
- 
-  opts->mode_udp_diff = opts->mode_udp_tunnel - IPSECDOI_ATTR_ENC_MODE_TUNNEL;
-
-  return 0;
-}
-
-void
-natt_float_ports (struct ph1handle *iph1)
-{
-	if (! (iph1->natt_flags & NAT_DETECTED) )
-		return;
-	if (! iph1->natt_options->float_port){
-		/* Drafts 00 / 01, just schedule keepalive */
-		natt_keepalive_add_ph1 (iph1);
-		return;
-	}
-	
-	set_port (iph1->local, iph1->natt_options->float_port);
-	set_port (iph1->remote, iph1->natt_options->float_port);
-	iph1->natt_flags |= NAT_PORTS_CHANGED | NAT_ADD_NON_ESP_MARKER;
-	
-	natt_keepalive_add_ph1 (iph1);
-}
-
-void
-natt_handle_vendorid (struct ph1handle *iph1, int vid_numeric)
-{
-  if (! iph1->natt_options)
-    iph1->natt_options = racoon_calloc (1, sizeof (*iph1->natt_options));
-
-  if (! iph1->natt_options) {
-    plog (LLV_ERROR, LOCATION, NULL,
-	  "Allocating memory for natt_options failed!\n");
-    return;
-  }
-  
-  if (iph1->natt_options->version < vid_numeric)
-    if (natt_fill_options (iph1->natt_options, vid_numeric) == 0)
-      iph1->natt_flags |= NAT_ANNOUNCED;
-}
-
-static void
-natt_keepalive_delete (struct natt_ka_addrs *ka)
-{
-  TAILQ_REMOVE (&ka_tree, ka, chain);
-  racoon_free (ka->src);
-  racoon_free (ka->dst);
-  racoon_free (ka);
-}
-
-/* NAT keepalive functions */
-static void
-natt_keepalive_send (void *param)
-{
-  struct natt_ka_addrs	*ka, *next = NULL;
-  char keepalive_packet[] = { 0xff };
-  size_t len;
-  int s;
-
-  for (ka = TAILQ_FIRST(&ka_tree); ka; ka = next) {
-    next = TAILQ_NEXT(ka, chain);
-    
-    s = getsockmyaddr(ka->src);
-    if (s == -1) {
-      natt_keepalive_delete(ka);
-      continue;
-    }
-    plog (LLV_DEBUG, LOCATION, NULL, "KA: %s\n", 
-	  saddr2str_fromto("%s->%s", ka->src, ka->dst));
-    len = sendfromto(s, keepalive_packet, sizeof (keepalive_packet),
-		     ka->src, ka->dst, 1);
-    if (len == -1)
-      plog(LLV_ERROR, LOCATION, NULL, "KA: sendfromto failed: %s\n",
-	   strerror (errno));
-  }
-  
-  sched_new (lcconf->natt_ka_interval, natt_keepalive_send, NULL);
-}
-
-void
-natt_keepalive_init (void)
-{
-  TAILQ_INIT(&ka_tree);
-
-  /* To disable sending KAs set natt_ka_interval=0 */
-  if (lcconf->natt_ka_interval > 0)
-    sched_new (lcconf->natt_ka_interval, natt_keepalive_send, NULL);
-}
-
-int
-natt_keepalive_add (struct sockaddr *src, struct sockaddr *dst)
-{
-  struct natt_ka_addrs *ka = NULL, *new_addr;
-  
-  TAILQ_FOREACH (ka, &ka_tree, chain) {
-    if (cmpsaddrstrict(ka->src, src) == 0 && 
-	cmpsaddrstrict(ka->dst, dst) == 0) {
-      ka->in_use++;
-      plog (LLV_INFO, LOCATION, NULL, "KA found: %s (in_use=%u)\n",
-	    saddr2str_fromto("%s->%s", src, dst), ka->in_use);
-      return 0;
-    }
-  }
-
-  plog (LLV_INFO, LOCATION, NULL, "KA list add: %s\n", saddr2str_fromto("%s->%s", src, dst));
-
-  new_addr = (struct natt_ka_addrs *)racoon_malloc(sizeof(*new_addr));
-  if (! new_addr) {
-    plog (LLV_ERROR, LOCATION, NULL, "Can't allocate new KA list item\n");
-    return -1;
-  }
-
-  if ((new_addr->src = dupsaddr(src)) == NULL) {
-	racoon_free(new_addr);
-    	plog (LLV_ERROR, LOCATION, NULL, "Can't allocate new KA list item\n");
-	return -1;
-  }
-  if ((new_addr->dst = dupsaddr(dst)) == NULL) {
-	racoon_free(new_addr);
-    	plog (LLV_ERROR, LOCATION, NULL, "Can't allocate new KA list item\n");
-	return -1;
-  }
-  new_addr->in_use = 1;
-  TAILQ_INSERT_TAIL(&ka_tree, new_addr, chain);
-
-  return 0;
-}
-
-int
-natt_keepalive_add_ph1 (struct ph1handle *iph1)
-{
-  int ret = 0;
-  
-  /* Should only the NATed host send keepalives?
-     If yes, add '(iph1->natt_flags & NAT_DETECTED_ME)'
-     to the following condition. */
-  if (iph1->natt_flags & NAT_DETECTED &&
-      ! (iph1->natt_flags & NAT_KA_QUEUED)) {
-    ret = natt_keepalive_add (iph1->local, iph1->remote);
-    if (ret == 0)
-      iph1->natt_flags |= NAT_KA_QUEUED;
-  }
-
-  return ret;
-}
-
-void
-natt_keepalive_remove (struct sockaddr *src, struct sockaddr *dst)
-{
-  struct natt_ka_addrs *ka, *next = NULL;
-
-  plog (LLV_INFO, LOCATION, NULL, "KA remove: %s\n", saddr2str_fromto("%s->%s", src, dst));
-
-  for (ka = TAILQ_FIRST(&ka_tree); ka; ka = next) {
-    next = TAILQ_NEXT(ka, chain);
- 
-    plog (LLV_DEBUG, LOCATION, NULL, "KA tree dump: %s (in_use=%u)\n",
-	  saddr2str_fromto("%s->%s", src, dst), ka->in_use);
-
-    if (cmpsaddrstrict(ka->src, src) == 0 && 
-	cmpsaddrstrict(ka->dst, dst) == 0 &&
-	-- ka->in_use <= 0) {
-
-      plog (LLV_DEBUG, LOCATION, NULL, "KA removing this one...\n");
-
-      natt_keepalive_delete (ka);
-      /* Should we break here? Every pair of addresses should 
-         be inserted only once, but who knows :-) Lets traverse 
-	 the whole list... */
-    }
-  }
-}
-
-static struct remoteconf *
-natt_enabled_in_rmconf_stub (struct remoteconf *rmconf, void *data)
-{
-  return (rmconf->nat_traversal ? rmconf : NULL);
-}
-
-int
-natt_enabled_in_rmconf ()
-{
-  return foreachrmconf (natt_enabled_in_rmconf_stub, NULL) != NULL;
-}
-
-
-struct payload_list *
-isakmp_plist_append_natt_vids (struct payload_list *plist, vchar_t *vid_natt[MAX_NATT_VID_COUNT]){
-	int i, vid_natt_i = 0;
-
-	if(vid_natt == NULL)
-		return NULL;
-
-	for (i = 0; i < MAX_NATT_VID_COUNT; i++)
-		vid_natt[i]=NULL;
-	
-	/* Puts the olders VIDs last, as some implementations may choose the first
-	 * NATT VID given
-	 */
-
-	/* Always set RFC VID
-	 */
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_RFC)) != NULL)
-		vid_natt_i++;
-#ifdef ENABLE_NATT_08
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_08)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_07
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_07)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_06
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_06)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_05
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_05)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_04
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_04)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_03
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_03)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_02
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_02)) != NULL)
-		vid_natt_i++;
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_02_N)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_01
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_01)) != NULL)
-		vid_natt_i++;
-#endif
-#ifdef ENABLE_NATT_00
-	if ((vid_natt[vid_natt_i] = set_vendorid(VENDORID_NATT_00)) != NULL)
-		vid_natt_i++;
-#endif
-	/* set VID payload for NAT-T */
-	for (i = 0; i < vid_natt_i; i++)
-		plist = isakmp_plist_append(plist, vid_natt[i], ISAKMP_NPTYPE_VID);
-	
-	return plist;
-}
diff --git a/src/racoon/nattraversal.h b/src/racoon/nattraversal.h
deleted file mode 100644
index cec5815..0000000
--- a/src/racoon/nattraversal.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*	$NetBSD: nattraversal.h,v 1.6 2006/09/09 16:22:09 manu Exp $	*/
-
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _NATTRAVERSAL_H
-#define _NATTRAVERSAL_H
-
-#include "vendorid.h"
-
-#define	NAT_ANNOUNCED		(1L<<0)
-#define	NAT_DETECTED_ME		(1L<<1)
-#define	NAT_DETECTED_PEER	(1L<<2)
-#define	NAT_PORTS_CHANGED	(1L<<3)
-#define	NAT_KA_QUEUED		(1L<<4)
-#define	NAT_ADD_NON_ESP_MARKER	(1L<<5)
-
-#define	NATT_AVAILABLE(ph1)	((iph1)->natt_flags & NAT_ANNOUNCED)
-
-#define	NAT_DETECTED	(NAT_DETECTED_ME | NAT_DETECTED_PEER)
-
-#define	NON_ESP_MARKER_LEN	sizeof(u_int32_t)
-#define	NON_ESP_MARKER_USE(iph1)	((iph1)->natt_flags & NAT_ADD_NON_ESP_MARKER)
-
-/* These are the values from parsing "remote {}" 
-   block of the config file. */
-#define NATT_OFF	FLASE	/* = 0 */
-#define NATT_ON		TRUE	/* = 1 */
-#define NATT_FORCE	2
-
-struct ph1natt_options {
-  int		version;
-  u_int16_t	float_port;
-  u_int16_t	mode_udp_tunnel;
-  u_int16_t	mode_udp_transport;
-  u_int16_t	encaps_type; /* ESPINUDP / ESPINUDP_NON_IKE */
-  u_int16_t	mode_udp_diff;
-  u_int16_t	payload_nat_d;
-  u_int16_t	payload_nat_oa;
-};
-
-struct ph2natt {
-  u_int8_t	type;
-  u_int16_t	sport;
-  u_int16_t	dport;
-  struct sockaddr	*oa;
-  u_int16_t	frag;
-};
-
-int natt_vendorid (int vid);
-vchar_t *natt_hash_addr (struct ph1handle *iph1, struct sockaddr *addr);
-int natt_compare_addr_hash (struct ph1handle *iph1, vchar_t *natd_received, int natd_seq);
-int natt_udp_encap (int encmode);
-int natt_fill_options (struct ph1natt_options *opts, int version);
-void natt_float_ports (struct ph1handle *iph1);
-void natt_handle_vendorid (struct ph1handle *iph1, int vid_numeric);
-
-
-struct payload_list *
-isakmp_plist_append_natt_vids (struct payload_list *plist, vchar_t *vid_natt[MAX_NATT_VID_COUNT]);
-
-
-/* NAT keepalive functions */
-void natt_keepalive_init (void);
-int natt_keepalive_add (struct sockaddr *src, struct sockaddr *dst);
-int natt_keepalive_add_ph1 (struct ph1handle *iph1);
-void natt_keepalive_remove (struct sockaddr *src, struct sockaddr *dst);
-
-/* Walk through all rmconfigs and tell if NAT-T is enabled in at least one. */
-int natt_enabled_in_rmconf (void);
-
-#endif /* _NATTRAVERSAL_H */
diff --git a/src/racoon/netdb_dnssec.h b/src/racoon/netdb_dnssec.h
deleted file mode 100644
index a11209d..0000000
--- a/src/racoon/netdb_dnssec.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*	$NetBSD: netdb_dnssec.h,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
-
-/* Id: netdb_dnssec.h,v 1.3 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _NETDB_DNSSEC_H
-#define _NETDB_DNSSEC_H
-
-#ifndef T_CERT
-#define T_CERT	37		/* defined by RFC2538 section 2 */
-#endif
-
-/* RFC2538 section 2.1 */
-#define DNSSEC_TYPE_PKIX	1
-#define DNSSEC_TYPE_SPKI	2
-#define DNSSEC_TYPE_PGP		3
-#define DNSSEC_TYPE_URI		4
-#define DNSSEC_TYPE_OID		5
-
-/* RFC2535 section 3.2 */
-#define DNSSEC_ALG_RSAMD5	1
-#define DNSSEC_ALG_DH		2
-#define DNSSEC_ALG_DSA		3
-#define DNSSEC_ALG_ECC		4
-#define DNSSEC_ALG_PRIVATEDNS	5
-#define DNSSEC_ALG_PRIVATEOID	6
-
-/*
- * Structures returned by network data base library.  All addresses are
- * supplied in host order, and returned in network order (suitable for
- * use in system calls).
- */
-struct certinfo {
-	int ci_type;			/* certificate type */
-	int ci_keytag;			/* keytag */
-	int ci_algorithm;		/* algorithm */
-	int ci_flags;			/* currently, 1:valid or 0:uncertain */
-	size_t ci_certlen;		/* length of certificate */
-	char *ci_cert;			/* certificate */
-	struct certinfo *ci_next;	/* next structure */
-};
-
-extern void freecertinfo __P((struct certinfo *));
-extern int getcertsbyname __P((char *, struct certinfo **));
-
-#endif /* _NETDB_DNSSEC_H */
diff --git a/src/racoon/oakley.c b/src/racoon/oakley.c
deleted file mode 100644
index 5b6ad46..0000000
--- a/src/racoon/oakley.c
+++ /dev/null
@@ -1,3429 +0,0 @@
-/*	$NetBSD: oakley.c,v 1.9.6.4 2009/08/13 09:18:45 vanhu Exp $	*/
-
-/* Id: oakley.c,v 1.32 2006/05/26 12:19:46 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>	/* XXX for subjectaltname */
-#include <netinet/in.h>	/* XXX for subjectaltname */
-
-#include <openssl/x509.h>
-#include <openssl/err.h>
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-#include <openssl/engine.h>
-#include <openssl/pkcs7.h>
-#else
-#include <openssl/bytestring.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "str2val.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h" 
-#endif                
-#include "oakley.h"
-#include "admin.h"
-#include "privsep.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "policy.h"
-#include "handler.h"
-#include "ipsec_doi.h"
-#include "algorithm.h"
-#include "dhgroup.h"
-#include "sainfo.h"
-#include "proposal.h"
-#include "crypto_openssl.h"
-#include "dnssec.h"
-#include "sockmisc.h"
-#include "strnames.h"
-#include "gcmalloc.h"
-#include "rsalist.h"
-
-#ifdef HAVE_GSSAPI
-#include "gssapi.h"
-#endif
-
-#define OUTBOUND_SA	0
-#define INBOUND_SA	1
-
-#define INITDHVAL(a, s, d, t)                                                  \
-do {                                                                           \
-	vchar_t buf;                                                           \
-	buf.v = str2val((s), 16, &buf.l);                                      \
-	memset(&a, 0, sizeof(struct dhgroup));                                 \
-	a.type = (t);                                                          \
-	a.prime = vdup(&buf);                                                  \
-	a.gen1 = 2;                                                            \
-	a.gen2 = 0;                                                            \
-	racoon_free(buf.v);                                                    \
-} while(0);
-
-struct dhgroup dh_modp768;
-struct dhgroup dh_modp1024;
-struct dhgroup dh_modp1536;
-struct dhgroup dh_modp2048;
-struct dhgroup dh_modp3072;
-struct dhgroup dh_modp4096;
-struct dhgroup dh_modp6144;
-struct dhgroup dh_modp8192;
-
-
-static int oakley_check_dh_pub __P((vchar_t *, vchar_t **));
-static int oakley_compute_keymat_x __P((struct ph2handle *, int, int));
-static int get_cert_fromlocal __P((struct ph1handle *, int));
-static int get_plainrsa_fromlocal __P((struct ph1handle *, int));
-static int oakley_check_certid __P((struct ph1handle *iph1));
-static int check_typeofcertname __P((int, int));
-static cert_t *save_certbuf __P((struct isakmp_gen *));
-static cert_t *save_certx509 __P((X509 *));
-static int oakley_padlen __P((int, int));
-
-int
-oakley_get_defaultlifetime()
-{
-	return OAKLEY_ATTR_SA_LD_SEC_DEFAULT;
-}
-
-int
-oakley_dhinit()
-{
-	/* set DH MODP */
-	INITDHVAL(dh_modp768, OAKLEY_PRIME_MODP768,
-		OAKLEY_ATTR_GRP_DESC_MODP768, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp1024, OAKLEY_PRIME_MODP1024,
-		OAKLEY_ATTR_GRP_DESC_MODP1024, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp1536, OAKLEY_PRIME_MODP1536,
-		OAKLEY_ATTR_GRP_DESC_MODP1536, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp2048, OAKLEY_PRIME_MODP2048,
-		OAKLEY_ATTR_GRP_DESC_MODP2048, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp3072, OAKLEY_PRIME_MODP3072,
-		OAKLEY_ATTR_GRP_DESC_MODP3072, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp4096, OAKLEY_PRIME_MODP4096,
-		OAKLEY_ATTR_GRP_DESC_MODP4096, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp6144, OAKLEY_PRIME_MODP6144,
-		OAKLEY_ATTR_GRP_DESC_MODP6144, OAKLEY_ATTR_GRP_TYPE_MODP);
-	INITDHVAL(dh_modp8192, OAKLEY_PRIME_MODP8192,
-		OAKLEY_ATTR_GRP_DESC_MODP8192, OAKLEY_ATTR_GRP_TYPE_MODP);
-
-	return 0;
-}
-
-void
-oakley_dhgrp_free(dhgrp)
-	struct dhgroup *dhgrp;
-{
-	if (dhgrp->prime)
-		vfree(dhgrp->prime);
-	if (dhgrp->curve_a)
-		vfree(dhgrp->curve_a);
-	if (dhgrp->curve_b)
-		vfree(dhgrp->curve_b);
-	if (dhgrp->order)
-		vfree(dhgrp->order);
-	racoon_free(dhgrp);
-}
-
-/*
- * RFC2409 5
- * The length of the Diffie-Hellman public value MUST be equal to the
- * length of the prime modulus over which the exponentiation was
- * performed, prepending zero bits to the value if necessary.
- */
-static int
-oakley_check_dh_pub(prime, pub0)
-	vchar_t *prime, **pub0;
-{
-	vchar_t *tmp;
-	vchar_t *pub = *pub0;
-
-	if (prime->l == pub->l)
-		return 0;
-
-	if (prime->l < pub->l) {
-		/* what should i do ? */
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid public information was generated.\n");
-		return -1;
-	}
-
-	/* prime->l > pub->l */
-	tmp = vmalloc(prime->l);
-	if (tmp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get DH buffer.\n");
-		return -1;
-	}
-	memcpy(tmp->v + prime->l - pub->l, pub->v, pub->l);
-
-	vfree(*pub0);
-	*pub0 = tmp;
-
-	return 0;
-}
-
-/*
- * compute sharing secret of DH
- * IN:	*dh, *pub, *priv, *pub_p
- * OUT: **gxy
- */
-int
-oakley_dh_compute(dh, pub, priv, pub_p, gxy)
-	const struct dhgroup *dh;
-	vchar_t *pub, *priv, *pub_p, **gxy;
-{
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-	if ((*gxy = vmalloc(dh->prime->l)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get DH buffer.\n");
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-	switch (dh->type) {
-	case OAKLEY_ATTR_GRP_TYPE_MODP:
-		if (eay_dh_compute(dh->prime, dh->gen1, pub, priv, pub_p, gxy) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to compute dh value.\n");
-			return -1;
-		}
-		break;
-	case OAKLEY_ATTR_GRP_TYPE_ECP:
-	case OAKLEY_ATTR_GRP_TYPE_EC2N:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"dh type %d isn't supported.\n", dh->type);
-		return -1;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid dh type %d.\n", dh->type);
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s%zu): %8.6f", __func__,
-		s_attr_isakmp_group(dh->type), dh->prime->l << 3,
-		timedelta(&start, &end));
-#endif
-
-	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's shared.\n");
-	plogdump(LLV_DEBUG, (*gxy)->v, (*gxy)->l);
-
-	return 0;
-}
-
-/*
- * generate values of DH
- * IN:	*dh
- * OUT: **pub, **priv
- */
-int
-oakley_dh_generate(dh, pub, priv)
-	const struct dhgroup *dh;
-	vchar_t **pub, **priv;
-{
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-	gettimeofday(&start, NULL);
-#endif
-	switch (dh->type) {
-	case OAKLEY_ATTR_GRP_TYPE_MODP:
-		if (eay_dh_generate(dh->prime, dh->gen1, dh->gen2, pub, priv) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to compute dh value.\n");
-			return -1;
-		}
-		break;
-
-	case OAKLEY_ATTR_GRP_TYPE_ECP:
-	case OAKLEY_ATTR_GRP_TYPE_EC2N:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"dh type %d isn't supported.\n", dh->type);
-		return -1;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid dh type %d.\n", dh->type);
-		return -1;
-	}
-
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s%zu): %8.6f", __func__,
-		s_attr_isakmp_group(dh->type), dh->prime->l << 3,
-		timedelta(&start, &end));
-#endif
-
-	if (oakley_check_dh_pub(dh->prime, pub) != 0)
-		return -1;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's private.\n");
-	plogdump(LLV_DEBUG, (*priv)->v, (*priv)->l);
-	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's public.\n");
-	plogdump(LLV_DEBUG, (*pub)->v, (*pub)->l);
-
-	return 0;
-}
-
-/*
- * copy pre-defined dhgroup values.
- */
-int
-oakley_setdhgroup(group, dhgrp)
-	int group;
-	struct dhgroup **dhgrp;
-{
-	struct dhgroup *g;
-
-	*dhgrp = NULL;	/* just make sure, initialize */
-
-	g = alg_oakley_dhdef_group(group);
-	if (g == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid DH parameter grp=%d.\n", group);
-		return -1;
-	}
-
-	if (!g->type || !g->prime || !g->gen1) {
-		/* unsuported */
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unsupported DH parameters grp=%d.\n", group);
-		return -1;
-	}
-
-	*dhgrp = racoon_calloc(1, sizeof(struct dhgroup));
-	if (*dhgrp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get DH buffer.\n");
-		return 0;
-	}
-
-	/* set defined dh vlaues */
-	memcpy(*dhgrp, g, sizeof(*g));
-	(*dhgrp)->prime = vdup(g->prime);
-
-	return 0;
-}
-
-/*
- * PRF
- *
- * NOTE: we do not support prf with different input/output bitwidth,
- * so we do not implement RFC2409 Appendix B (DOORAK-MAC example) in
- * oakley_compute_keymat().  If you add support for such prf function,
- * modify oakley_compute_keymat() accordingly.
- */
-vchar_t *
-oakley_prf(key, buf, iph1)
-	vchar_t *key, *buf;
-	struct ph1handle *iph1;
-{
-	vchar_t *res = NULL;
-	int type;
-
-	if (iph1->approval == NULL) {
-		/*
-		 * it's before negotiating hash algorithm.
-		 * We use md5 as default.
-		 */
-		type = OAKLEY_ATTR_HASH_ALG_MD5;
-	} else
-		type = iph1->approval->hashtype;
-
-	res = alg_oakley_hmacdef_one(type, key, buf);
-	if (res == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid hmac algorithm %d.\n", type);
-		return NULL;
-	}
-
-	return res;
-}
-
-/*
- * hash
- */
-vchar_t *
-oakley_hash(buf, iph1)
-	vchar_t *buf;
-	struct ph1handle *iph1;
-{
-	vchar_t *res = NULL;
-	int type;
-
-	if (iph1->approval == NULL) {
-		/*
-		 * it's before negotiating hash algorithm.
-		 * We use md5 as default.
-		 */
-		type = OAKLEY_ATTR_HASH_ALG_MD5;
-	} else
-		type = iph1->approval->hashtype;
-
-	res = alg_oakley_hashdef_one(type, buf);
-	if (res == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid hash algoriym %d.\n", type);
-		return NULL;
-	}
-
-	return res;
-}
-
-/*
- * compute KEYMAT
- *   see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
- */
-int
-oakley_compute_keymat(iph2, side)
-	struct ph2handle *iph2;
-	int side;
-{
-	int error = -1;
-
-	/* compute sharing secret of DH when PFS */
-	if (iph2->approval->pfs_group && iph2->dhpub_p) {
-		if (oakley_dh_compute(iph2->pfsgrp, iph2->dhpub,
-				iph2->dhpriv, iph2->dhpub_p, &iph2->dhgxy) < 0)
-			goto end;
-	}
-
-	/* compute keymat */
-	if (oakley_compute_keymat_x(iph2, side, INBOUND_SA) < 0
-	 || oakley_compute_keymat_x(iph2, side, OUTBOUND_SA) < 0)
-		goto end;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "KEYMAT computed.\n");
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/*
- * compute KEYMAT.
- * KEYMAT = prf(SKEYID_d, protocol | SPI | Ni_b | Nr_b).
- * If PFS is desired and KE payloads were exchanged,
- *   KEYMAT = prf(SKEYID_d, g(qm)^xy | protocol | SPI | Ni_b | Nr_b)
- *
- * NOTE: we do not support prf with different input/output bitwidth,
- * so we do not implement RFC2409 Appendix B (DOORAK-MAC example).
- */
-static int
-oakley_compute_keymat_x(iph2, side, sa_dir)
-	struct ph2handle *iph2;
-	int side;
-	int sa_dir;
-{
-	vchar_t *buf = NULL, *res = NULL, *bp;
-	char *p;
-	int len;
-	int error = -1;
-	int pfs = 0;
-	int dupkeymat;	/* generate K[1-dupkeymat] */
-	struct saproto *pr;
-	struct satrns *tr;
-	int encklen, authklen, l;
-
-	pfs = ((iph2->approval->pfs_group && iph2->dhgxy) ? 1 : 0);
-	
-	len = pfs ? iph2->dhgxy->l : 0;
-	len += (1
-		+ sizeof(u_int32_t)	/* XXX SPI size */
-		+ iph2->nonce->l
-		+ iph2->nonce_p->l);
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get keymat buffer.\n");
-		goto end;
-	}
-
-	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-		p = buf->v;
-
-		/* if PFS */
-		if (pfs) {
-			memcpy(p, iph2->dhgxy->v, iph2->dhgxy->l);
-			p += iph2->dhgxy->l;
-		}
-
-		p[0] = pr->proto_id;
-		p += 1;
-
-		memcpy(p, (sa_dir == INBOUND_SA ? &pr->spi : &pr->spi_p),
-			sizeof(pr->spi));
-		p += sizeof(pr->spi);
-
-		bp = (side == INITIATOR ? iph2->nonce : iph2->nonce_p);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		bp = (side == INITIATOR ? iph2->nonce_p : iph2->nonce);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		/* compute IV */
-		plog(LLV_DEBUG, LOCATION, NULL, "KEYMAT compute with\n");
-		plogdump(LLV_DEBUG, buf->v, buf->l);
-
-		/* res = K1 */
-		res = oakley_prf(iph2->ph1->skeyid_d, buf, iph2->ph1);
-		if (res == NULL)
-			goto end;
-
-		/* compute key length needed */
-		encklen = authklen = 0;
-		switch (pr->proto_id) {
-		case IPSECDOI_PROTO_IPSEC_ESP:
-			for (tr = pr->head; tr; tr = tr->next) {
-				l = alg_ipsec_encdef_keylen(tr->trns_id,
-				    tr->encklen);
-				if (l > encklen)
-					encklen = l;
-
-				l = alg_ipsec_hmacdef_hashlen(tr->authtype);
-				if (l > authklen)
-					authklen = l;
-			}
-			break;
-		case IPSECDOI_PROTO_IPSEC_AH:
-			for (tr = pr->head; tr; tr = tr->next) {
-				l = alg_ipsec_hmacdef_hashlen(tr->trns_id);
-				if (l > authklen)
-					authklen = l;
-			}
-			break;
-		default:
-			break;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL, "encklen=%d authklen=%d\n",
-			encklen, authklen);
-
-		dupkeymat = (encklen + authklen) / 8 / res->l;
-		dupkeymat += 2;	/* safety mergin */
-		if (dupkeymat < 3)
-			dupkeymat = 3;
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"generating %zu bits of key (dupkeymat=%d)\n",
-			dupkeymat * 8 * res->l, dupkeymat);
-		if (0 < --dupkeymat) {
-			vchar_t *prev = res;	/* K(n-1) */
-			vchar_t *seed = NULL;	/* seed for Kn */
-			size_t l;
-
-			/*
-			 * generating long key (isakmp-oakley-08 5.5)
-			 *   KEYMAT = K1 | K2 | K3 | ...
-			 * where
-			 *   src = [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b
-			 *   K1 = prf(SKEYID_d, src)
-			 *   K2 = prf(SKEYID_d, K1 | src)
-			 *   K3 = prf(SKEYID_d, K2 | src)
-			 *   Kn = prf(SKEYID_d, K(n-1) | src)
-			 */
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"generating K1...K%d for KEYMAT.\n",
-				dupkeymat + 1);
-
-			seed = vmalloc(prev->l + buf->l);
-			if (seed == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get keymat buffer.\n");
-				if (prev && prev != res)
-					vfree(prev);
-				goto end;
-			}
-
-			while (dupkeymat--) {
-				vchar_t *this = NULL;	/* Kn */
-				int update_prev;
-
-				memcpy(seed->v, prev->v, prev->l);
-				memcpy(seed->v + prev->l, buf->v, buf->l);
-				this = oakley_prf(iph2->ph1->skeyid_d, seed,
-							iph2->ph1);
-				if (!this) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"oakley_prf memory overflow\n");
-					if (prev && prev != res)
-						vfree(prev);
-					vfree(this);
-					vfree(seed);
-					goto end;
-				}
-
-				update_prev = (prev && prev == res) ? 1 : 0;
-
-				l = res->l;
-				res = vrealloc(res, l + this->l);
-
-				if (update_prev)
-					prev = res;
-
-				if (res == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"failed to get keymat buffer.\n");
-					if (prev && prev != res)
-						vfree(prev);
-					vfree(this);
-					vfree(seed);
-					goto end;
-				}
-				memcpy(res->v + l, this->v, this->l);
-
-				if (prev && prev != res)
-					vfree(prev);
-				prev = this;
-				this = NULL;
-			}
-
-			if (prev && prev != res)
-				vfree(prev);
-			vfree(seed);
-		}
-
-		plogdump(LLV_DEBUG, res->v, res->l);
-
-		if (sa_dir == INBOUND_SA)
-			pr->keymat = res;
-		else
-			pr->keymat_p = res;
-		res = NULL;
-	}
-
-	error = 0;
-
-end:
-	if (error) {
-		for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-			if (pr->keymat) {
-				vfree(pr->keymat);
-				pr->keymat = NULL;
-			}
-			if (pr->keymat_p) {
-				vfree(pr->keymat_p);
-				pr->keymat_p = NULL;
-			}
-		}
-	}
-
-	if (buf != NULL)
-		vfree(buf);
-	if (res)
-		vfree(res);
-
-	return error;
-}
-
-#if notyet
-/*
- * NOTE: Must terminate by NULL.
- */
-vchar_t *
-oakley_compute_hashx(struct ph1handle *iph1, ...)
-{
-	vchar_t *buf, *res;
-	vchar_t *s;
-	caddr_t p;
-	int len;
-
-	va_list ap;
-
-	/* get buffer length */
-	va_start(ap, iph1);
-	len = 0;
-        while ((s = va_arg(ap, vchar_t *)) != NULL) {
-		len += s->l
-        }
-	va_end(ap);
-
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		return NULL;
-	}
-
-	/* set buffer */
-	va_start(ap, iph1);
-	p = buf->v;
-        while ((s = va_arg(ap, char *)) != NULL) {
-		memcpy(p, s->v, s->l);
-		p += s->l;
-	}
-	va_end(ap);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH with: \n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(iph1->skeyid_a, buf, iph1);
-	vfree(buf);
-	if (res == NULL)
-		return NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-	return res;
-}
-#endif
-
-/*
- * compute HASH(3) prf(SKEYID_a, 0 | M-ID | Ni_b | Nr_b)
- *   see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
- */
-vchar_t *
-oakley_compute_hash3(iph1, msgid, body)
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-	vchar_t *body;
-{
-	vchar_t *buf = 0, *res = 0;
-	int len;
-	int error = -1;
-
-	/* create buffer */
-	len = 1 + sizeof(u_int32_t) + body->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-
-	buf->v[0] = 0;
-
-	memcpy(buf->v + 1, (char *)&msgid, sizeof(msgid));
-
-	memcpy(buf->v + 1 + sizeof(u_int32_t), body->v, body->l);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH with: \n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(iph1->skeyid_a, buf, iph1);
-	if (res == NULL)
-		goto end;
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	return res;
-}
-
-/*
- * compute HASH type of prf(SKEYID_a, M-ID | buffer)
- *	e.g.
- *	for quick mode HASH(1):
- *		prf(SKEYID_a, M-ID | SA | Ni [ | KE ] [ | IDci | IDcr ])
- *	for quick mode HASH(2):
- *		prf(SKEYID_a, M-ID | Ni_b | SA | Nr [ | KE ] [ | IDci | IDcr ])
- *	for Informational exchange:
- *		prf(SKEYID_a, M-ID | N/D)
- */
-vchar_t *
-oakley_compute_hash1(iph1, msgid, body)
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-	vchar_t *body;
-{
-	vchar_t *buf = NULL, *res = NULL;
-	char *p;
-	int len;
-	int error = -1;
-
-	/* create buffer */
-	len = sizeof(u_int32_t) + body->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-
-	p = buf->v;
-
-	memcpy(buf->v, (char *)&msgid, sizeof(msgid));
-	p += sizeof(u_int32_t);
-
-	memcpy(p, body->v, body->l);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH with:\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(iph1->skeyid_a, buf, iph1);
-	if (res == NULL)
-		goto end;
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	return res;
-}
-
-/*
- * compute phase1 HASH
- * main/aggressive
- *   I-digest = prf(SKEYID, g^i | g^r | CKY-I | CKY-R | SAi_b | ID_i1_b)
- *   R-digest = prf(SKEYID, g^r | g^i | CKY-R | CKY-I | SAi_b | ID_r1_b)
- * for gssapi, also include all GSS tokens, and call gss_wrap on the result
- */
-vchar_t *
-oakley_ph1hash_common(iph1, sw)
-	struct ph1handle *iph1;
-	int sw;
-{
-	vchar_t *buf = NULL, *res = NULL, *bp;
-	char *p, *bp2;
-	int len, bl;
-	int error = -1;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsstokens = NULL;
-#endif
-
-	/* create buffer */
-	len = iph1->dhpub->l
-		+ iph1->dhpub_p->l
-		+ sizeof(cookie_t) * 2
-		+ iph1->sa->l
-		+ (sw == GENERATE ? iph1->id->l : iph1->id_p->l);
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
-		if (iph1->gi_i != NULL && iph1->gi_r != NULL) {
-			bp = (sw == GENERATE ? iph1->gi_i : iph1->gi_r);
-			len += bp->l;
-		}
-		if (sw == GENERATE)
-			gssapi_get_itokens(iph1, &gsstokens);
-		else
-			gssapi_get_rtokens(iph1, &gsstokens);
-		if (gsstokens == NULL)
-			return NULL;
-		len += gsstokens->l;
-	}
-#endif
-
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-
-	p = buf->v;
-
-	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	bp = (sw == GENERATE ? iph1->dhpub_p : iph1->dhpub);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	if (iph1->side == INITIATOR)
-		bp2 = (sw == GENERATE ?
-		      (char *)&iph1->index.i_ck : (char *)&iph1->index.r_ck);
-	else
-		bp2 = (sw == GENERATE ?
-		      (char *)&iph1->index.r_ck : (char *)&iph1->index.i_ck);
-	bl = sizeof(cookie_t);
-	memcpy(p, bp2, bl);
-	p += bl;
-
-	if (iph1->side == INITIATOR)
-		bp2 = (sw == GENERATE ?
-		      (char *)&iph1->index.r_ck : (char *)&iph1->index.i_ck);
-	else
-		bp2 = (sw == GENERATE ?
-		      (char *)&iph1->index.i_ck : (char *)&iph1->index.r_ck);
-	bl = sizeof(cookie_t);
-	memcpy(p, bp2, bl);
-	p += bl;
-
-	bp = iph1->sa;
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	bp = (sw == GENERATE ? iph1->id : iph1->id_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-#ifdef HAVE_GSSAPI
-	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
-		if (iph1->gi_i != NULL && iph1->gi_r != NULL) {
-			bp = (sw == GENERATE ? iph1->gi_i : iph1->gi_r);
-			memcpy(p, bp->v, bp->l);
-			p += bp->l;
-		}
-		memcpy(p, gsstokens->v, gsstokens->l);
-		p += gsstokens->l;
-	}
-#endif
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH with:\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(iph1->skeyid, buf, iph1);
-	if (res == NULL)
-		goto end;
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH (%s) computed:\n",
-		iph1->side == INITIATOR ? "init" : "resp");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-#ifdef HAVE_GSSAPI
-	if (gsstokens != NULL)
-		vfree(gsstokens);
-#endif
-	return res;
-}
-
-/*
- * compute HASH_I on base mode.
- * base:psk,rsa
- *   HASH_I = prf(SKEYID, g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
- * base:sig
- *   HASH_I = prf(hash(Ni_b | Nr_b), g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
- */
-vchar_t *
-oakley_ph1hash_base_i(iph1, sw)
-	struct ph1handle *iph1;
-	int sw;
-{
-	vchar_t *buf = NULL, *res = NULL, *bp;
-	vchar_t *hashkey = NULL;
-	vchar_t *hash = NULL;	/* for signature mode */
-	char *p;
-	int len;
-	int error = -1;
-
-	/* sanity check */
-	if (iph1->etype != ISAKMP_ETYPE_BASE) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid etype for this hash function\n");
-		return NULL;
-	}
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-		if (iph1->skeyid == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, "no SKEYID found.\n");
-			return NULL;
-		}
-		hashkey = iph1->skeyid;
-		break;
-
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-#endif
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-		/* make hash for seed */
-		len = iph1->nonce->l + iph1->nonce_p->l;
-		buf = vmalloc(len);
-		if (buf == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get hash buffer\n");
-			goto end;
-		}
-		p = buf->v;
-
-		bp = (sw == GENERATE ? iph1->nonce_p : iph1->nonce);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		bp = (sw == GENERATE ? iph1->nonce : iph1->nonce_p);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		hash = oakley_hash(buf, iph1);
-		if (hash == NULL)
-			goto end;
-		vfree(buf);
-		buf = NULL;
-
-		hashkey = hash;
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not supported authentication method %d\n",
-			iph1->approval->authmethod);
-		return NULL;
-
-	}
-
-	len = (sw == GENERATE ? iph1->dhpub->l : iph1->dhpub_p->l)
-		+ sizeof(cookie_t) * 2
-		+ iph1->sa->l
-		+ (sw == GENERATE ? iph1->id->l : iph1->id_p->l);
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-	p = buf->v;
-
-	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	memcpy(p, &iph1->index.i_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	memcpy(p, &iph1->index.r_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-
-	memcpy(p, iph1->sa->v, iph1->sa->l);
-	p += iph1->sa->l;
-
-	bp = (sw == GENERATE ? iph1->id : iph1->id_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH_I with:\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(hashkey, buf, iph1);
-	if (res == NULL)
-		goto end;
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH_I computed:\n");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-end:
-	if (hash != NULL)
-		vfree(hash);
-	if (buf != NULL)
-		vfree(buf);
-	return res;
-}
-
-/*
- * compute HASH_R on base mode for signature method.
- * base:
- * HASH_R = prf(hash(Ni_b | Nr_b), g^xi | g^xr | CKY-I | CKY-R | SAi_b | IDii_b)
- */
-vchar_t *
-oakley_ph1hash_base_r(iph1, sw)
-	struct ph1handle *iph1;
-	int sw;
-{
-	vchar_t *buf = NULL, *res = NULL, *bp;
-	vchar_t *hash = NULL;
-	char *p;
-	int len;
-	int error = -1;
-
-	/* sanity check */
-	if (iph1->etype != ISAKMP_ETYPE_BASE) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid etype for this hash function\n");
-		return NULL;
-	}
-
-	switch(AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-#endif
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not supported authentication method %d\n",
-			iph1->approval->authmethod);
-		return NULL;
-		break;
-	}
-
-	/* make hash for seed */
-	len = iph1->nonce->l + iph1->nonce_p->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-	p = buf->v;
-
-	bp = (sw == GENERATE ? iph1->nonce_p : iph1->nonce);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	bp = (sw == GENERATE ? iph1->nonce : iph1->nonce_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	hash = oakley_hash(buf, iph1);
-	if (hash == NULL)
-		goto end;
-	vfree(buf);
-	buf = NULL;
-
-	/* make really hash */
-	len = (sw == GENERATE ? iph1->dhpub_p->l : iph1->dhpub->l)
-		+ (sw == GENERATE ? iph1->dhpub->l : iph1->dhpub_p->l)
-		+ sizeof(cookie_t) * 2
-		+ iph1->sa->l
-		+ (sw == GENERATE ? iph1->id_p->l : iph1->id->l);
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get hash buffer\n");
-		goto end;
-	}
-	p = buf->v;
-
-
-	bp = (sw == GENERATE ? iph1->dhpub_p : iph1->dhpub);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	memcpy(p, &iph1->index.i_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	memcpy(p, &iph1->index.r_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-
-	memcpy(p, iph1->sa->v, iph1->sa->l);
-	p += iph1->sa->l;
-
-	bp = (sw == GENERATE ? iph1->id_p : iph1->id);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH_R with:\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* compute HASH */
-	res = oakley_prf(hash, buf, iph1);
-	if (res == NULL)
-		goto end;
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "HASH_R computed:\n");
-	plogdump(LLV_DEBUG, res->v, res->l);
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	if (hash)
-		vfree(hash);
-	return res;
-}
-
-/*
- * compute each authentication method in phase 1.
- * OUT:
- *	0:	OK
- *	-1:	error
- *	other:	error to be reply with notification.
- *	        the value is notification type.
- */
-int
-oakley_validate_auth(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *my_hash = NULL;
-	int result;
-#ifdef HAVE_GSSAPI
-	vchar_t *gsshash = NULL;
-#endif
-#ifdef ENABLE_STATS
-	struct timeval start, end;
-#endif
-
-#ifdef ENABLE_STATS
-	gettimeofday(&start, NULL);
-#endif
-
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-		/* validate HASH */
-	    {
-		char *r_hash;
-
-		if (iph1->id_p == NULL || iph1->pl_hash == NULL) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"few isakmp message received.\n");
-			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		}
-#ifdef ENABLE_HYBRID
-		if (AUTHMETHOD(iph1) == FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I &&
-		    ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0))
-		{
-			plog(LLV_ERROR, LOCATION, NULL, "No SIG was passed, "
-			    "hybrid auth is enabled, "
-			    "but peer is no Xauth compliant\n");
-			return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED;
-			break;
-		}
-#endif
-		r_hash = (caddr_t)(iph1->pl_hash + 1);
-
-		plog(LLV_DEBUG, LOCATION, NULL, "HASH received:\n");
-		plogdump(LLV_DEBUG, r_hash,
-			ntohs(iph1->pl_hash->h.len) - sizeof(*iph1->pl_hash));
-
-		switch (iph1->etype) {
-		case ISAKMP_ETYPE_IDENT:
-		case ISAKMP_ETYPE_AGG:
-			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
-			break;
-		case ISAKMP_ETYPE_BASE:
-			if (iph1->side == INITIATOR)
-				my_hash = oakley_ph1hash_common(iph1, VALIDATE);
-			else
-				my_hash = oakley_ph1hash_base_i(iph1, VALIDATE);
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid etype %d\n", iph1->etype);
-			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
-		}
-		if (my_hash == NULL)
-			return ISAKMP_INTERNAL_ERROR;
-
-		result = memcmp(my_hash->v, r_hash, my_hash->l);
-		vfree(my_hash);
-
-		if (result) {
-			plog(LLV_ERROR, LOCATION, NULL, "HASH mismatched\n");
-			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL, "HASH for PSK validated.\n");
-	    }
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-	    {
-		int error = 0;
-		int certtype = 0;
-
-		/* validation */
-		if (iph1->id_p == NULL) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"no ID payload was passed.\n");
-			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		}
-		if (iph1->sig_p == NULL) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"no SIG payload was passed.\n");
-			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		}
-
-		plog(LLV_DEBUG, LOCATION, NULL, "SIGN passed:\n");
-		plogdump(LLV_DEBUG, iph1->sig_p->v, iph1->sig_p->l);
-
-		/* get peer's cert */
-		switch (iph1->rmconf->getcert_method) {
-		case ISAKMP_GETCERT_PAYLOAD:
-			if (iph1->cert_p == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no peer's CERT payload found.\n");
-				return ISAKMP_INTERNAL_ERROR;
-			}
-			break;
-		case ISAKMP_GETCERT_LOCALFILE:
-			switch (iph1->rmconf->certtype) {
-				case ISAKMP_CERT_X509SIGN:
-					if (iph1->rmconf->peerscertfile == NULL) {
-						plog(LLV_ERROR, LOCATION, NULL,
-							"no peer's CERT file found.\n");
-						return ISAKMP_INTERNAL_ERROR;
-					}
-
-					/* don't use cached cert */
-					if (iph1->cert_p != NULL) {
-						oakley_delcert(iph1->cert_p);
-						iph1->cert_p = NULL;
-					}
-
-					error = get_cert_fromlocal(iph1, 0);
-#ifdef ANDROID_PATCHED
-					if (!error)
-						break;
-				default:
-					return ISAKMP_INTERNAL_ERROR;
-#else
-					break;
-
-				case ISAKMP_CERT_PLAINRSA:
-					error = get_plainrsa_fromlocal(iph1, 0);
-					break;
-			}
-			if (error)
-				return ISAKMP_INTERNAL_ERROR;
-			break;
-		case ISAKMP_GETCERT_DNS:
-			if (iph1->rmconf->peerscertfile != NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"why peer's CERT file is defined "
-					"though getcert method is dns ?\n");
-				return ISAKMP_INTERNAL_ERROR;
-			}
-
-			/* don't use cached cert */
-			if (iph1->cert_p != NULL) {
-				oakley_delcert(iph1->cert_p);
-				iph1->cert_p = NULL;
-			}
-
-			iph1->cert_p = dnssec_getcert(iph1->id_p);
-			if (iph1->cert_p == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no CERT RR found.\n");
-				return ISAKMP_INTERNAL_ERROR;
-#endif
-			}
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid getcert_mothod: %d\n",
-				iph1->rmconf->getcert_method);
-			return ISAKMP_INTERNAL_ERROR;
-		}
-
-		/* compare ID payload and certificate name */
-		if (iph1->rmconf->verify_cert &&
-		    (error = oakley_check_certid(iph1)) != 0)
-			return error;
-
-		/* verify certificate */
-		if (iph1->rmconf->verify_cert
-		 && iph1->rmconf->getcert_method == ISAKMP_GETCERT_PAYLOAD) {
-			certtype = iph1->rmconf->certtype;
-#ifdef ENABLE_HYBRID
-			switch (AUTHMETHOD(iph1)) {
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-				certtype = iph1->cert_p->type;
-				break;
-			default:
-				break;
-			}
-#endif
-			switch (certtype) {
-			case ISAKMP_CERT_X509SIGN: {
-				char path[MAXPATHLEN];
-				char *ca;
-
-				if (iph1->rmconf->cacertfile != NULL) {
-					getpathname(path, sizeof(path), 
-					    LC_PATHTYPE_CERT, 
-					    iph1->rmconf->cacertfile);
-					ca = path;
-				} else {
-					ca = NULL;
-				}
-
-				error = eay_check_x509cert(&iph1->cert_p->cert,
-					lcconf->pathinfo[LC_PATHTYPE_CERT], 
-					ca, 0);
-				break;
-			}
-			
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no supported certtype %d\n", certtype);
-				return ISAKMP_INTERNAL_ERROR;
-			}
-			if (error != 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"the peer's certificate is not verified.\n");
-				return ISAKMP_NTYPE_INVALID_CERT_AUTHORITY;
-			}
-		}
-	
-		/* Generate a warning if verify_cert == 0
-		 */
-		if (iph1->rmconf->verify_cert){
-			plog(LLV_DEBUG, LOCATION, NULL, "CERT validated\n");
-		}else{
-			plog(LLV_WARNING, LOCATION, NULL,
-				"CERT validation disabled by configuration\n");
-		}
-
-		/* compute hash */
-		switch (iph1->etype) {
-		case ISAKMP_ETYPE_IDENT:
-		case ISAKMP_ETYPE_AGG:
-			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
-			break;
-		case ISAKMP_ETYPE_BASE:
-			if (iph1->side == INITIATOR)
-				my_hash = oakley_ph1hash_base_r(iph1, VALIDATE);
-			else
-				my_hash = oakley_ph1hash_base_i(iph1, VALIDATE);
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid etype %d\n", iph1->etype);
-			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
-		}
-		if (my_hash == NULL)
-			return ISAKMP_INTERNAL_ERROR;
-
-
-		certtype = iph1->rmconf->certtype;
-#ifdef ENABLE_HYBRID
-		switch (AUTHMETHOD(iph1)) {
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-			certtype = iph1->cert_p->type;
-			break;
-		default:
-			break;
-		}
-#endif
-		/* check signature */
-		switch (certtype) {
-		case ISAKMP_CERT_X509SIGN:
-		case ISAKMP_CERT_DNS:
-			error = eay_check_x509sign(my_hash,
-					iph1->sig_p,
-					&iph1->cert_p->cert);
-			break;
-#ifndef ANDROID_PATCHED
-		case ISAKMP_CERT_PLAINRSA:
-			iph1->rsa_p = rsa_try_check_rsasign(my_hash,
-					iph1->sig_p, iph1->rsa_candidates);
-			error = iph1->rsa_p ? 0 : -1;
-
-			break;
-#endif
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no supported certtype %d\n",
-				certtype);
-			vfree(my_hash);
-			return ISAKMP_INTERNAL_ERROR;
-		}
-
-		vfree(my_hash);
-		if (error != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Invalid SIG.\n");
-			return ISAKMP_NTYPE_INVALID_SIGNATURE;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL, "SIG authenticated\n");
-	    }
-		break;
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	    {
-		if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
-			plog(LLV_ERROR, LOCATION, NULL, "No SIG was passed, "
-			    "hybrid auth is enabled, "
-			    "but peer is no Xauth compliant\n");
-			return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED;
-			break;
-		}
-		plog(LLV_INFO, LOCATION, NULL, "No SIG was passed, "
-		    "but hybrid auth is enabled\n");
-
-		return 0;
-		break;
-	    }
-#endif
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-		/* check if we're not into XAUTH_PSKEY_I instead */
-#ifdef ENABLE_HYBRID
-		if (iph1->rmconf->xauth)
-			break;
-#endif
-		switch (iph1->etype) {
-		case ISAKMP_ETYPE_IDENT:
-		case ISAKMP_ETYPE_AGG:
-			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
-			break;
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid etype %d\n", iph1->etype);
-			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
-		}
-
-		if (my_hash == NULL) {
-			if (gssapi_more_tokens(iph1))
-				return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
-			else
-				return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		}
-
-		gsshash = gssapi_unwraphash(iph1);
-		if (gsshash == NULL) {
-			vfree(my_hash);
-			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		}
-
-		result = memcmp(my_hash->v, gsshash->v, my_hash->l);
-		vfree(my_hash);
-		vfree(gsshash);
-
-		if (result) {
-			plog(LLV_ERROR, LOCATION, NULL, "HASH mismatched\n");
-			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL, "hash compared OK\n");
-		break;
-#endif
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		if (iph1->id_p == NULL || iph1->pl_hash == NULL) {
-			plog(LLV_ERROR, LOCATION, iph1->remote,
-				"few isakmp message received.\n");
-			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
-		}
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"not supported authmethod type %s\n",
-			s_oakley_attr_method(iph1->approval->authmethod));
-		return ISAKMP_INTERNAL_ERROR;
-	default:
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"invalid authmethod %d why ?\n",
-			iph1->approval->authmethod);
-		return ISAKMP_INTERNAL_ERROR;
-	}
-#ifdef ENABLE_STATS
-	gettimeofday(&end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f", __func__,
-		s_oakley_attr_method(iph1->approval->authmethod),
-		timedelta(&start, &end));
-#endif
-
-	return 0;
-}
-
-/* get my certificate
- * NOTE: include certificate type.
- */
-int
-oakley_getmycert(iph1)
-	struct ph1handle *iph1;
-{
-	switch (iph1->rmconf->certtype) {
-		case ISAKMP_CERT_X509SIGN:
-			if (iph1->cert)
-				return 0;
-			return get_cert_fromlocal(iph1, 1);
-
-#ifndef ANDROID_PATCHED
-		case ISAKMP_CERT_PLAINRSA:
-			if (iph1->rsa)
-				return 0;
-			return get_plainrsa_fromlocal(iph1, 1);
-#endif
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Unknown certtype #%d\n",
-			     iph1->rmconf->certtype);
-			return -1;
-	}
-
-}
-
-/*
- * get a CERT from local file.
- * IN:
- *	my != 0 my cert.
- *	my == 0 peer's cert.
- */
-static int
-get_cert_fromlocal(iph1, my)
-	struct ph1handle *iph1;
-	int my;
-{
-	char path[MAXPATHLEN];
-	vchar_t *cert = NULL;
-	cert_t **certpl;
-	char *certfile;
-	int error = -1;
-
-	if (my) {
-		certfile = iph1->rmconf->mycertfile;
-		certpl = &iph1->cert;
-	} else {
-		certfile = iph1->rmconf->peerscertfile;
-		certpl = &iph1->cert_p;
-	}
-	if (!certfile) {
-		plog(LLV_ERROR, LOCATION, NULL, "no CERT defined.\n");
-		return 0;
-	}
-
-	switch (iph1->rmconf->certtype) {
-	case ISAKMP_CERT_X509SIGN:
-	case ISAKMP_CERT_DNS:
-		/* make public file name */
-		getpathname(path, sizeof(path), LC_PATHTYPE_CERT, certfile);
-		cert = eay_get_x509cert(path);
-		if (cert) {
-			char *p = NULL;
-			p = eay_get_x509text(cert);
-			plog(LLV_DEBUG, LOCATION, NULL, "%s", p ? p : "\n");
-			racoon_free(p);
-		};
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"not supported certtype %d\n",
-			iph1->rmconf->certtype);
-		goto end;
-	}
-
-	if (!cert) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get %s CERT.\n",
-			my ? "my" : "peers");
-		goto end;
-	}
-
-	*certpl = oakley_newcert();
-	if (!*certpl) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cert buffer.\n");
-		goto end;
-	}
-	(*certpl)->pl = vmalloc(cert->l + 1);
-	if ((*certpl)->pl == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cert buffer\n");
-		oakley_delcert(*certpl);
-		*certpl = NULL;
-		goto end;
-	}
-	memcpy((*certpl)->pl->v + 1, cert->v, cert->l);
-	(*certpl)->pl->v[0] = iph1->rmconf->certtype;
-	(*certpl)->type = iph1->rmconf->certtype;
-	(*certpl)->cert.v = (*certpl)->pl->v + 1;
-	(*certpl)->cert.l = (*certpl)->pl->l - 1;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "created CERT payload:\n");
-	plogdump(LLV_DEBUG, (*certpl)->pl->v, (*certpl)->pl->l);
-
-	error = 0;
-
-end:
-	if (cert != NULL)
-		vfree(cert);
-
-	return error;
-}
-
-#ifndef ANDROID_PATCHED
-static int
-get_plainrsa_fromlocal(iph1, my)
-	struct ph1handle *iph1;
-	int my;
-{
-	char path[MAXPATHLEN];
-	vchar_t *cert = NULL;
-	char *certfile;
-	int error = -1;
-
-	iph1->rsa_candidates = rsa_lookup_keys(iph1, my);
-	if (!iph1->rsa_candidates || 
-	    rsa_list_count(iph1->rsa_candidates) == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"%s RSA key not found for %s\n",
-			my ? "Private" : "Public",
-			saddr2str_fromto("%s <-> %s", 
-			iph1->local, iph1->remote));
-		goto end;
-	}
-
-	if (my && rsa_list_count(iph1->rsa_candidates) > 1) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"More than one (=%lu) private "
-			"PlainRSA key found for %s\n",
-			rsa_list_count(iph1->rsa_candidates),
-			saddr2str_fromto("%s <-> %s", 
-			iph1->local, iph1->remote));
-		plog(LLV_WARNING, LOCATION, NULL,
-			"This may have unpredictable results, "
-			"i.e. wrong key could be used!\n");
-		plog(LLV_WARNING, LOCATION, NULL,
-			"Consider using only one single private "
-			"key for all peers...\n");
-	}
-	if (my) {
-		iph1->rsa = ((struct rsa_key *)
-		    genlist_next(iph1->rsa_candidates, NULL))->rsa;
-
-		genlist_free(iph1->rsa_candidates, NULL);
-		iph1->rsa_candidates = NULL;
-
-		if (iph1->rsa == NULL)
-			goto end;
-	}
-
-	error = 0;
-
-end:
-	return error;
-}
-#endif
-
-#ifdef ANDROID_CHANGES
-
-#if defined(OPENSSL_IS_BORINGSSL)
-/* EVP_PKEY_from_keystore is from system/security/keystore-engine. */
-extern EVP_PKEY* EVP_PKEY_from_keystore(const char *key_id);
-#endif
-
-static vchar_t* keystore_sign(vchar_t* src, const char* path) {
-	vchar_t* sig = NULL;
-	EVP_PKEY *evp = NULL;
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-	ENGINE *engine = ENGINE_by_id("keystore");
-	if (!engine) {
-		return NULL;
-	}
-	if (!ENGINE_init(engine)) {
-		ENGINE_free(engine);
-		return NULL;
-	}
-#endif
-
-	const char *key_id;
-	if (sscanf(path, pname, &key_id) != 1) {
-		do_plog(LLV_ERROR, "couldn't read private key info\n");
-		goto out;
-	}
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-	evp = ENGINE_load_private_key(engine, key_id, NULL, NULL);
-#else
-	evp = EVP_PKEY_from_keystore(key_id);
-#endif
-	if (!evp) {
-		do_plog(LLV_ERROR, "couldn't retrieve private key");
-		ERR_remove_thread_state(NULL);
-		goto out;
-	}
-
-	if (EVP_PKEY_id(evp) == EVP_PKEY_RSA) {
-		sig = eay_rsa_sign(src, EVP_PKEY_get0_RSA(evp));
-	}
-
-out:
-	if (evp) {
-		EVP_PKEY_free(evp);
-	}
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-	ENGINE_finish(engine);
-	ENGINE_free(engine);
-#endif
-
-	return sig;
-}
-#endif
-
-/* get signature */
-int
-oakley_getsign(iph1)
-	struct ph1handle *iph1;
-{
-	char path[MAXPATHLEN];
-	vchar_t *privkey = NULL;
-	int error = -1;
-
-	switch (iph1->rmconf->certtype) {
-	case ISAKMP_CERT_X509SIGN:
-	case ISAKMP_CERT_DNS:
-		if (iph1->rmconf->myprivfile == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL, "no cert defined.\n");
-			goto end;
-		}
-
-		/* make private file name */
-		getpathname(path, sizeof(path),
-			LC_PATHTYPE_CERT,
-			iph1->rmconf->myprivfile);
-#ifdef ANDROID_CHANGES
-		iph1->sig = keystore_sign(iph1->hash, path);
-#else
-		privkey = privsep_eay_get_pkcs1privkey(path);
-		if (privkey == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get private key.\n");
-			goto end;
-		}
-		plog(LLV_DEBUG2, LOCATION, NULL, "private key:\n");
-		plogdump(LLV_DEBUG2, privkey->v, privkey->l);
-
-		iph1->sig = eay_get_x509sign(iph1->hash, privkey);
-#endif
-		break;
-#ifndef ANDROID_PATCHED
-	case ISAKMP_CERT_PLAINRSA:
-		iph1->sig = eay_get_rsasign(iph1->hash, iph1->rsa);
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Unknown certtype #%d\n",
-		     iph1->rmconf->certtype);
-		goto end;
-	}
-
-	if (iph1->sig == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "failed to sign.\n");
-		goto end;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "SIGN computed:\n");
-	plogdump(LLV_DEBUG, iph1->sig->v, iph1->sig->l);
-
-	error = 0;
-
-end:
-	if (privkey != NULL)
-		vfree(privkey);
-
-	return error;
-}
-
-/*
- * compare certificate name and ID value.
- */
-static int
-oakley_check_certid(iph1)
-	struct ph1handle *iph1;
-{
-	struct ipsecdoi_id_b *id_b;
-	vchar_t *name = NULL;
-	char *altname = NULL;
-	int idlen, type;
-	int error;
-
-	if (iph1->id_p == NULL || iph1->cert_p == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "no ID nor CERT found.\n");
-		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-	}
-
-	id_b = (struct ipsecdoi_id_b *)iph1->id_p->v;
-	idlen = iph1->id_p->l - sizeof(*id_b);
-
-	switch (id_b->type) {
-	case IPSECDOI_ID_DER_ASN1_DN:
-		name = eay_get_x509asn1subjectname(&iph1->cert_p->cert);
-		if (!name) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get subjectName\n");
-			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-		}
-		if (idlen != name->l) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Invalid ID length in phase 1.\n");
-			vfree(name);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		error = memcmp(id_b + 1, name->v, idlen);
-		vfree(name);
-		if (error != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"ID mismatched with ASN1 SubjectName.\n");
-			plogdump(LLV_DEBUG, id_b + 1, idlen);
-			plogdump(LLV_DEBUG, name->v, idlen);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		return 0;
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR:
-	{
-		/*
-		 * converting to binary from string because openssl return
-		 * a string even if object is a binary.
-		 * XXX fix it !  access by ASN.1 directly without.
-		 */
-		struct addrinfo hints, *res;
-		caddr_t a = NULL;
-		int pos;
-
-		for (pos = 1; ; pos++) {
-			if (eay_get_x509subjectaltname(&iph1->cert_p->cert,
-					&altname, &type, pos) !=0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get subjectAltName\n");
-				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-			}
-
-			/* it's the end condition of the loop. */
-			if (!altname) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no proper subjectAltName.\n");
-				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-			}
-
-			if (check_typeofcertname(id_b->type, type) == 0)
-				break;
-
-			/* next name */
-			racoon_free(altname);
-			altname = NULL;
-		}
-		memset(&hints, 0, sizeof(hints));
-		hints.ai_family = PF_UNSPEC;
-		hints.ai_socktype = SOCK_RAW;
-		hints.ai_flags = AI_NUMERICHOST;
-		error = getaddrinfo(altname, NULL, &hints, &res);
-		if (error != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no proper subjectAltName.\n");
-			racoon_free(altname);
-			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-		}
-		switch (res->ai_family) {
-		case AF_INET:
-			a = (caddr_t)&((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr;
-			break;
-#ifdef INET6
-		case AF_INET6:
-			a = (caddr_t)&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr.s6_addr;
-			break;
-#endif
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-				"family not supported: %d.\n", res->ai_family);
-			racoon_free(altname);
-			freeaddrinfo(res);
-			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-		}
-		error = memcmp(id_b + 1, a, idlen);
-		freeaddrinfo(res);
-		vfree(name);
-		if (error != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"ID mismatched with subjectAltName.\n");
-			plogdump(LLV_DEBUG, id_b + 1, idlen);
-			plogdump(LLV_DEBUG, a, idlen);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		return 0;
-	}
-	case IPSECDOI_ID_FQDN:
-	case IPSECDOI_ID_USER_FQDN:
-	{
-		int pos;
-
-		for (pos = 1; ; pos++) {
-			if (eay_get_x509subjectaltname(&iph1->cert_p->cert,
-					&altname, &type, pos) != 0){
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get subjectAltName\n");
-				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-			}
-
-			/* it's the end condition of the loop. */
-			if (!altname) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"no proper subjectAltName.\n");
-				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
-			}
-
-			if (check_typeofcertname(id_b->type, type) == 0)
-				break;
-
-			/* next name */
-			racoon_free(altname);
-			altname = NULL;
-		}
-		if (idlen != strlen(altname)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Invalid ID length in phase 1.\n");
-			racoon_free(altname);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		if (check_typeofcertname(id_b->type, type) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"ID type mismatched. ID: %s CERT: %s.\n",
-				s_ipsecdoi_ident(id_b->type),
-				s_ipsecdoi_ident(type));
-			racoon_free(altname);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		error = memcmp(id_b + 1, altname, idlen);
-		if (error) {
-			plog(LLV_ERROR, LOCATION, NULL, "ID mismatched.\n");
-			plogdump(LLV_DEBUG, id_b + 1, idlen);
-			plogdump(LLV_DEBUG, altname, idlen);
-			racoon_free(altname);
-			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-		}
-		racoon_free(altname);
-		return 0;
-	}
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Inpropper ID type passed: %s.\n",
-			s_ipsecdoi_ident(id_b->type));
-		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
-	}
-	/*NOTREACHED*/
-}
-
-static int
-check_typeofcertname(doi, genid)
-	int doi, genid;
-{
-	switch (doi) {
-	case IPSECDOI_ID_IPV4_ADDR:
-	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV6_ADDR:
-	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
-	case IPSECDOI_ID_IPV4_ADDR_RANGE:
-	case IPSECDOI_ID_IPV6_ADDR_RANGE:
-		if (genid != GENT_IPADD)
-			return -1;
-		return 0;
-	case IPSECDOI_ID_FQDN:
-		if (genid != GENT_DNS)
-			return -1;
-		return 0;
-	case IPSECDOI_ID_USER_FQDN:
-		if (genid != GENT_EMAIL)
-			return -1;
-		return 0;
-	case IPSECDOI_ID_DER_ASN1_DN: /* should not be passed to this function*/
-	case IPSECDOI_ID_DER_ASN1_GN:
-	case IPSECDOI_ID_KEY_ID:
-	default:
-		return -1;
-	}
-	/*NOTREACHED*/
-}
-
-/*
- * save certificate including certificate type.
- */
-int
-oakley_savecert(iph1, gen)
-	struct ph1handle *iph1;
-	struct isakmp_gen *gen;
-{
-	cert_t **c;
-	u_int8_t type;
-	STACK_OF(X509) *certs=NULL;
-#if !defined(OPENSSL_IS_BORINGSSL)
-	PKCS7 *p7;
-#endif
-
-	type = *(u_int8_t *)(gen + 1) & 0xff;
-
-	switch (type) {
-	case ISAKMP_CERT_DNS:
-		plog(LLV_WARNING, LOCATION, NULL,
-			"CERT payload is unnecessary in DNSSEC. "
-			"ignore this CERT payload.\n");
-		return 0;
-	case ISAKMP_CERT_PKCS7:
-	case ISAKMP_CERT_PGP:
-	case ISAKMP_CERT_X509SIGN:
-	case ISAKMP_CERT_KERBEROS:
-	case ISAKMP_CERT_SPKI:
-		c = &iph1->cert_p;
-		break;
-	case ISAKMP_CERT_CRL:
-		c = &iph1->crl_p;
-		break;
-	case ISAKMP_CERT_X509KE:
-	case ISAKMP_CERT_X509ATTR:
-	case ISAKMP_CERT_ARL:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"No supported such CERT type %d\n", type);
-		return -1;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid CERT type %d\n", type);
-		return -1;
-	}
-
-	/* XXX choice the 1th cert, ignore after the cert. */ 
-	/* XXX should be processed. */
-	if (*c) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"ignore 2nd CERT payload.\n");
-		return 0;
-	}
-
-	if (type == ISAKMP_CERT_PKCS7) {
-		u_char *bp;
-#if defined(OPENSSL_IS_BORINGSSL)
-		size_t i;
-		STACK_OF(X509) *certs = sk_X509_new_null();
-		CBS cbs;
-#else
-		int i;
-#endif
-
-		/* Skip the header */
-		bp = (u_char *)(gen + 1);
-		/* And the first byte is the certificate type, 
-		 * we know that already
-		 */
-		bp++;
-#if defined(OPENSSL_IS_BORINGSSL)
-		CBS_init(&cbs, bp, ntohs(gen->len) - sizeof(*gen) - 1);
-		if (!PKCS7_get_certificates(certs, &cbs)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Failed to parse PKCS#7 CERT.\n");
-			sk_X509_pop_free(certs, X509_free);
-			return -1;
-		}
-
-		if (sk_X509_num(certs) == 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "CERT PKCS#7 bundle contains no certs.\n");
-			sk_X509_pop_free(certs, X509_free);
-			return -1;
-		}
-#else
-		p7 = d2i_PKCS7(NULL, (void *)&bp,
-		    ntohs(gen->len) - sizeof(*gen) - 1);
-
-		if (!p7) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Failed to parse PKCS#7 CERT.\n");
-			return -1;
-		}
-
-		/* Copied this from the openssl pkcs7 application;
-		 * there"s little by way of documentation for any of
-		 * it. I can only presume it"s correct.
-		 */
-		
-		i = OBJ_obj2nid(p7->type);
-		switch (i) {
-		case NID_pkcs7_signed:
-			certs=p7->d.sign->cert;
-			break;
-		case NID_pkcs7_signedAndEnveloped:
-			certs=p7->d.signed_and_enveloped->cert;
-			break;
-		default:
-			 break;
-		}
-
-		if (!certs) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "CERT PKCS#7 bundle contains no certs.\n");
-			PKCS7_free(p7);
-			return -1;
-		}
-#endif
-
-		for (i = 0; i < sk_X509_num(certs); i++) {
-			int len;
-			u_char *bp;
-			X509 *cert = sk_X509_value(certs,i);
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			     "Trying PKCS#7 cert %d.\n", i);
-
-			/* We'll just try each cert in turn */
-			*c = save_certx509(cert);
-
-			if (!*c) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				     "Failed to get CERT buffer.\n");
-				continue;
-			}
-
-			/* Ignore cert if it doesn't match identity
-			 * XXX If verify cert is disabled, we still just take
-			 * the first certificate....
-			 */
-			if(iph1->rmconf->verify_cert &&
-			   oakley_check_certid(iph1)) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-				     "Discarding CERT: does not match ID.\n");
-				oakley_delcert((*c));
-				*c = NULL;
-				continue;
-			}
-
-			{
-				char *p = eay_get_x509text(&(*c)->cert);
-				plog(LLV_DEBUG, LOCATION, NULL, "CERT saved:\n");
-				plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
-				plog(LLV_DEBUG, LOCATION, NULL, "%s", 
-				     p ? p : "\n");
-				racoon_free(p);
-			}
-			break;
-		}
-
-#if defined(OPENSSL_IS_BORINGSSL)
-		sk_X509_pop_free(certs, X509_free);
-#else
-		PKCS7_free(p7);
-#endif
-
-	} else {
-		*c = save_certbuf(gen);
-		if (!*c) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "Failed to get CERT buffer.\n");
-			return -1;
-		}
-
-		switch ((*c)->type) {
-		case ISAKMP_CERT_DNS:
-			plog(LLV_WARNING, LOCATION, NULL,
-			     "CERT payload is unnecessary in DNSSEC. "
-			     "ignore it.\n");
-			return 0;
-		case ISAKMP_CERT_PGP:
-		case ISAKMP_CERT_X509SIGN:
-		case ISAKMP_CERT_KERBEROS:
-		case ISAKMP_CERT_SPKI:
-			/* Ignore cert if it doesn't match identity
-			 * XXX If verify cert is disabled, we still just take
-			 * the first certificate....
-			 */
-			if(iph1->rmconf->verify_cert &&
-			   oakley_check_certid(iph1)){
-				plog(LLV_DEBUG, LOCATION, NULL,
-				     "Discarding CERT: does not match ID.\n");
-				oakley_delcert((*c));
-				*c = NULL;
-				return 0;
-			}
-
-			{
-				char *p = eay_get_x509text(&(*c)->cert);
-				plog(LLV_DEBUG, LOCATION, NULL, "CERT saved:\n");
-				plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
-				plog(LLV_DEBUG, LOCATION, NULL, "%s", p ? p : "\n");
-				racoon_free(p);
-			}
-			break;
-		case ISAKMP_CERT_CRL:
-			plog(LLV_DEBUG, LOCATION, NULL, "CRL saved:\n");
-			plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
-			break;
-		case ISAKMP_CERT_X509KE:
-		case ISAKMP_CERT_X509ATTR:
-		case ISAKMP_CERT_ARL:
-		default:
-			/* XXX */
-			oakley_delcert((*c));
-			*c = NULL;
-			return 0;
-		}
-	}
-	
-	return 0;
-}
-
-/*
- * save certificate including certificate type.
- */
-int
-oakley_savecr(iph1, gen)
-	struct ph1handle *iph1;
-	struct isakmp_gen *gen;
-{
-	cert_t **c;
-	u_int8_t type;
-
-	type = *(u_int8_t *)(gen + 1) & 0xff;
-
-	switch (type) {
-	case ISAKMP_CERT_DNS:
-		plog(LLV_WARNING, LOCATION, NULL,
-			"CERT payload is unnecessary in DNSSEC\n");
-		/*FALLTHRU*/
-	case ISAKMP_CERT_PKCS7:
-	case ISAKMP_CERT_PGP:
-	case ISAKMP_CERT_X509SIGN:
-	case ISAKMP_CERT_KERBEROS:
-	case ISAKMP_CERT_SPKI:
-		c = &iph1->cr_p;
-		break;
-	case ISAKMP_CERT_X509KE:
-	case ISAKMP_CERT_X509ATTR:
-	case ISAKMP_CERT_ARL:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"No supported such CR type %d\n", type);
-		return -1;
-	case ISAKMP_CERT_CRL:
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid CR type %d\n", type);
-		return -1;
-	}
-
-	*c = save_certbuf(gen);
-	if (!*c) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Failed to get CR buffer.\n");
-		return -1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "CR saved:\n");
-	plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
-
-	return 0;
-}
-
-static cert_t *
-save_certbuf(gen)
-	struct isakmp_gen *gen;
-{
-	cert_t *new;
-
-	if(ntohs(gen->len) <= sizeof(*gen)){
-		plog(LLV_ERROR, LOCATION, NULL,
-			 "Len is too small !!.\n");
-		return NULL;
-	}
-
-	new = oakley_newcert();
-	if (!new) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Failed to get CERT buffer.\n");
-		return NULL;
-	}
-
-	new->pl = vmalloc(ntohs(gen->len) - sizeof(*gen));
-	if (new->pl == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Failed to copy CERT from packet.\n");
-		oakley_delcert(new);
-		new = NULL;
-		return NULL;
-	}
-	memcpy(new->pl->v, gen + 1, new->pl->l);
-	new->type = new->pl->v[0] & 0xff;
-	new->cert.v = new->pl->v + 1;
-	new->cert.l = new->pl->l - 1;
-
-	return new;
-}
-
-static cert_t *
-save_certx509(cert)
-	X509 *cert;
-{
-	cert_t *new;
-        int len;
-        u_char *bp;
-
-	new = oakley_newcert();
-	if (!new) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Failed to get CERT buffer.\n");
-		return NULL;
-	}
-
-        len = i2d_X509(cert, NULL);
-	new->pl = vmalloc(len);
-	if (new->pl == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Failed to copy CERT from packet.\n");
-		oakley_delcert(new);
-		new = NULL;
-		return NULL;
-	}
-        bp = (u_char *) new->pl->v;
-        len = i2d_X509(cert, &bp);
-	new->type = ISAKMP_CERT_X509SIGN;
-	new->cert.v = new->pl->v;
-	new->cert.l = new->pl->l;
-
-	return new;
-}
-
-/*
- * get my CR.
- * NOTE: No Certificate Authority field is included to CR payload at the
- * moment. Becuase any certificate authority are accepted without any check.
- * The section 3.10 in RFC2408 says that this field SHOULD not be included,
- * if there is no specific certificate authority requested.
- */
-vchar_t *
-oakley_getcr(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf;
-
-	buf = vmalloc(1);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cr buffer\n");
-		return NULL;
-	}
-	if(iph1->rmconf->certtype == ISAKMP_CERT_NONE) {
-		buf->v[0] = iph1->rmconf->cacerttype;
-		plog(LLV_DEBUG, LOCATION, NULL, "create my CR: NONE, using %s instead\n",
-		s_isakmp_certtype(iph1->rmconf->cacerttype));
-	} else {
-		buf->v[0] = iph1->rmconf->certtype;
-		plog(LLV_DEBUG, LOCATION, NULL, "create my CR: %s\n",
-		s_isakmp_certtype(iph1->rmconf->certtype));
-	}
-	if (buf->l > 1) {
-		plogdump(LLV_DEBUG, buf->v, buf->l);
-	}
-
-	return buf;
-}
-
-/*
- * check peer's CR.
- */
-int
-oakley_checkcr(iph1)
-	struct ph1handle *iph1;
-{
-	if (iph1->cr_p == NULL)
-		return 0;
-
-	plog(LLV_DEBUG, LOCATION, iph1->remote,
-		"peer transmitted CR: %s\n",
-		s_isakmp_certtype(iph1->cr_p->type));
-
-	if (iph1->cr_p->type != iph1->rmconf->certtype) {
-		plog(LLV_ERROR, LOCATION, iph1->remote,
-			"such a cert type isn't supported: %d\n",
-			(char)iph1->cr_p->type);
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * check to need CR payload.
- */
-int
-oakley_needcr(type)
-	int type;
-{
-	switch (type) {
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-		return 1;
-	default:
-		return 0;
-	}
-	/*NOTREACHED*/
-}
-
-/*
- * compute SKEYID
- * see seciton 5. Exchanges in RFC 2409
- * psk: SKEYID = prf(pre-shared-key, Ni_b | Nr_b)
- * sig: SKEYID = prf(Ni_b | Nr_b, g^ir)
- * enc: SKEYID = prf(H(Ni_b | Nr_b), CKY-I | CKY-R)
- */
-int
-oakley_skeyid(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf = NULL, *bp;
-	char *p;
-	int len;
-	int error = -1;
-	
-	/* SKEYID */
-	switch (AUTHMETHOD(iph1)) {
-	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
-#ifdef ENABLE_HYBRID
-	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
-#endif
-		if (iph1->etype != ISAKMP_ETYPE_IDENT) {
-			iph1->authstr = getpskbyname(iph1->id_p);
-			if (iph1->authstr == NULL) {
-				if (iph1->rmconf->verify_identifier) {
-					plog(LLV_ERROR, LOCATION, iph1->remote,
-						"couldn't find the pskey.\n");
-					goto end;
-				}
-				plog(LLV_NOTIFY, LOCATION, iph1->remote,
-					"couldn't find the proper pskey, "
-					"try to get one by the peer's address.\n");
-			}
-		}
-		if (iph1->authstr == NULL) {
-			/*
-			 * If the exchange type is the main mode or if it's
-			 * failed to get the psk by ID, racoon try to get
-			 * the psk by remote IP address.
-			 * It may be nonsense.
-			 */
-			iph1->authstr = getpskbyaddr(iph1->remote);
-			if (iph1->authstr == NULL) {
-				plog(LLV_ERROR, LOCATION, iph1->remote,
-					"couldn't find the pskey for %s.\n",
-					saddrwop2str(iph1->remote));
-				goto end;
-			}
-		}
-		plog(LLV_DEBUG, LOCATION, NULL, "the psk found.\n");
-		/* should be secret PSK */
-		plog(LLV_DEBUG2, LOCATION, NULL, "psk: ");
-		plogdump(LLV_DEBUG2, iph1->authstr->v, iph1->authstr->l);
-
-		len = iph1->nonce->l + iph1->nonce_p->l;
-		buf = vmalloc(len);
-		if (buf == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get skeyid buffer\n");
-			goto end;
-		}
-		p = buf->v;
-
-		bp = (iph1->side == INITIATOR ? iph1->nonce : iph1->nonce_p);
-		plog(LLV_DEBUG, LOCATION, NULL, "nonce 1: ");
-		plogdump(LLV_DEBUG, bp->v, bp->l);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		bp = (iph1->side == INITIATOR ? iph1->nonce_p : iph1->nonce);
-		plog(LLV_DEBUG, LOCATION, NULL, "nonce 2: ");
-		plogdump(LLV_DEBUG, bp->v, bp->l);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		iph1->skeyid = oakley_prf(iph1->authstr, buf, iph1);
-		if (iph1->skeyid == NULL)
-			goto end;
-		break;
-
-	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
-	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
-	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
-#endif
-#ifdef HAVE_GSSAPI
-	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
-#endif
-		len = iph1->nonce->l + iph1->nonce_p->l;
-		buf = vmalloc(len);
-		if (buf == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get nonce buffer\n");
-			goto end;
-		}
-		p = buf->v;
-
-		bp = (iph1->side == INITIATOR ? iph1->nonce : iph1->nonce_p);
-		plog(LLV_DEBUG, LOCATION, NULL, "nonce1: ");
-		plogdump(LLV_DEBUG, bp->v, bp->l);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		bp = (iph1->side == INITIATOR ? iph1->nonce_p : iph1->nonce);
-		plog(LLV_DEBUG, LOCATION, NULL, "nonce2: ");
-		plogdump(LLV_DEBUG, bp->v, bp->l);
-		memcpy(p, bp->v, bp->l);
-		p += bp->l;
-
-		iph1->skeyid = oakley_prf(buf, iph1->dhgxy, iph1);
-		if (iph1->skeyid == NULL)
-			goto end;
-		break;
-	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
-	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
-#ifdef ENABLE_HYBRID
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
-	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
-#endif
-		plog(LLV_WARNING, LOCATION, NULL,
-			"not supported authentication method %s\n",
-			s_oakley_attr_method(iph1->approval->authmethod));
-		goto end;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid authentication method %d\n",
-			iph1->approval->authmethod);
-		goto end;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID computed:\n");
-	plogdump(LLV_DEBUG, iph1->skeyid->v, iph1->skeyid->l);
-
-	error = 0;
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	return error;
-}
-
-/*
- * compute SKEYID_[dae]
- * see seciton 5. Exchanges in RFC 2409
- * SKEYID_d = prf(SKEYID, g^ir | CKY-I | CKY-R | 0)
- * SKEYID_a = prf(SKEYID, SKEYID_d | g^ir | CKY-I | CKY-R | 1)
- * SKEYID_e = prf(SKEYID, SKEYID_a | g^ir | CKY-I | CKY-R | 2)
- */
-int
-oakley_skeyid_dae(iph1)
-	struct ph1handle *iph1;
-{
-	vchar_t *buf = NULL;
-	char *p;
-	int len;
-	int error = -1;
-
-	if (iph1->skeyid == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "no SKEYID found.\n");
-		goto end;
-	}
-
-	/* SKEYID D */
-	/* SKEYID_d = prf(SKEYID, g^xy | CKY-I | CKY-R | 0) */
-	len = iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get skeyid buffer\n");
-		goto end;
-	}
-	p = buf->v;
-
-	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
-	p += iph1->dhgxy->l;
-	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	*p = 0;
-	iph1->skeyid_d = oakley_prf(iph1->skeyid, buf, iph1);
-	if (iph1->skeyid_d == NULL)
-		goto end;
-
-	vfree(buf);
-	buf = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_d computed:\n");
-	plogdump(LLV_DEBUG, iph1->skeyid_d->v, iph1->skeyid_d->l);
-
-	/* SKEYID A */
-	/* SKEYID_a = prf(SKEYID, SKEYID_d | g^xy | CKY-I | CKY-R | 1) */
-	len = iph1->skeyid_d->l + iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get skeyid buffer\n");
-		goto end;
-	}
-	p = buf->v;
-	memcpy(p, iph1->skeyid_d->v, iph1->skeyid_d->l);
-	p += iph1->skeyid_d->l;
-	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
-	p += iph1->dhgxy->l;
-	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	*p = 1;
-	iph1->skeyid_a = oakley_prf(iph1->skeyid, buf, iph1);
-	if (iph1->skeyid_a == NULL)
-		goto end;
-
-	vfree(buf);
-	buf = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_a computed:\n");
-	plogdump(LLV_DEBUG, iph1->skeyid_a->v, iph1->skeyid_a->l);
-
-	/* SKEYID E */
-	/* SKEYID_e = prf(SKEYID, SKEYID_a | g^xy | CKY-I | CKY-R | 2) */
-	len = iph1->skeyid_a->l + iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get skeyid buffer\n");
-		goto end;
-	}
-	p = buf->v;
-	memcpy(p, iph1->skeyid_a->v, iph1->skeyid_a->l);
-	p += iph1->skeyid_a->l;
-	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
-	p += iph1->dhgxy->l;
-	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
-	p += sizeof(cookie_t);
-	*p = 2;
-	iph1->skeyid_e = oakley_prf(iph1->skeyid, buf, iph1);
-	if (iph1->skeyid_e == NULL)
-		goto end;
-
-	vfree(buf);
-	buf = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_e computed:\n");
-	plogdump(LLV_DEBUG, iph1->skeyid_e->v, iph1->skeyid_e->l);
-
-	error = 0;
-
-end:
-	if (buf != NULL)
-		vfree(buf);
-	return error;
-}
-
-/*
- * compute final encryption key.
- * see Appendix B.
- */
-int
-oakley_compute_enckey(iph1)
-	struct ph1handle *iph1;
-{
-	u_int keylen, prflen;
-	int error = -1;
-
-	/* RFC2409 p39 */
-	keylen = alg_oakley_encdef_keylen(iph1->approval->enctype,
-					iph1->approval->encklen);
-	if (keylen == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algoritym %d, "
-			"or invalid key length %d.\n",
-			iph1->approval->enctype,
-			iph1->approval->encklen);
-		goto end;
-	}
-	iph1->key = vmalloc(keylen >> 3);
-	if (iph1->key == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get key buffer\n");
-		goto end;
-	}
-
-	/* set prf length */
-	prflen = alg_oakley_hashdef_hashlen(iph1->approval->hashtype);
-	if (prflen == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid hash type %d.\n", iph1->approval->hashtype);
-		goto end;
-	}
-
-	/* see isakmp-oakley-08 5.3. */
-	if (iph1->key->l <= iph1->skeyid_e->l) {
-		/*
-		 * if length(Ka) <= length(SKEYID_e)
-		 *	Ka = first length(K) bit of SKEYID_e
-		 */
-		memcpy(iph1->key->v, iph1->skeyid_e->v, iph1->key->l);
-	} else {
-		vchar_t *buf = NULL, *res = NULL;
-		u_char *p, *ep;
-		int cplen;
-		int subkey;
-
-		/*
-		 * otherwise,
-		 *	Ka = K1 | K2 | K3
-		 * where
-		 *	K1 = prf(SKEYID_e, 0)
-		 *	K2 = prf(SKEYID_e, K1)
-		 *	K3 = prf(SKEYID_e, K2)
-		 */
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"len(SKEYID_e) < len(Ka) (%zu < %zu), "
-			"generating long key (Ka = K1 | K2 | ...)\n",
-			iph1->skeyid_e->l, iph1->key->l);
-
-		if ((buf = vmalloc(prflen >> 3)) == 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get key buffer\n");
-			goto end;
-		}
-		p = (u_char *)iph1->key->v;
-		ep = p + iph1->key->l;
-
-		subkey = 1;
-		while (p < ep) {
-			if (p == (u_char *)iph1->key->v) {
-				/* just for computing K1 */
-				buf->v[0] = 0;
-				buf->l = 1;
-			}
-			res = oakley_prf(iph1->skeyid_e, buf, iph1);
-			if (res == NULL) {
-				vfree(buf);
-				goto end;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"compute intermediate encryption key K%d\n",
-				subkey);
-			plogdump(LLV_DEBUG, buf->v, buf->l);
-			plogdump(LLV_DEBUG, res->v, res->l);
-
-			cplen = (res->l < ep - p) ? res->l : ep - p;
-			memcpy(p, res->v, cplen);
-			p += cplen;
-
-			buf->l = prflen >> 3;	/* to cancel K1 speciality */
-			if (res->l != buf->l) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"internal error: res->l=%zu buf->l=%zu\n",
-					res->l, buf->l);
-				vfree(res);
-				vfree(buf);
-				goto end;
-			}
-			memcpy(buf->v, res->v, res->l);
-			vfree(res);
-			subkey++;
-		}
-
-		vfree(buf);
-	}
-
-	/*
-	 * don't check any weak key or not.
-	 * draft-ietf-ipsec-ike-01.txt Appendix B.
-	 * draft-ietf-ipsec-ciph-aes-cbc-00.txt Section 2.3.
-	 */
-#if 0
-	/* weakkey check */
-	if (iph1->approval->enctype > ARRAYLEN(oakley_encdef)
-	 || oakley_encdef[iph1->approval->enctype].weakkey == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"encryption algoritym %d isn't supported.\n",
-			iph1->approval->enctype);
-		goto end;
-	}
-	if ((oakley_encdef[iph1->approval->enctype].weakkey)(iph1->key)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"weakkey was generated.\n");
-		goto end;
-	}
-#endif
-
-	plog(LLV_DEBUG, LOCATION, NULL, "final encryption key computed:\n");
-	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
-
-	error = 0;
-
-end:
-	return error;
-}
-
-/* allocated new buffer for CERT */
-cert_t *
-oakley_newcert()
-{
-	cert_t *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get cert's buffer\n");
-		return NULL;
-	}
-
-	new->pl = NULL;
-
-	return new;
-}
-
-/* delete buffer for CERT */
-void
-oakley_delcert(cert)
-	cert_t *cert;
-{
-	if (!cert)
-		return;
-	if (cert->pl)
-		VPTRINIT(cert->pl);
-	racoon_free(cert);
-}
-
-/*
- * compute IV and set to ph1handle
- *	IV = hash(g^xi | g^xr)
- * see 4.1 Phase 1 state in draft-ietf-ipsec-ike.
- */
-int
-oakley_newiv(iph1)
-	struct ph1handle *iph1;
-{
-	struct isakmp_ivm *newivm = NULL;
-	vchar_t *buf = NULL, *bp;
-	char *p;
-	int len;
-
-	/* create buffer */
-	len = iph1->dhpub->l + iph1->dhpub_p->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get iv buffer\n");
-		return -1;
-	}
-
-	p = buf->v;
-
-	bp = (iph1->side == INITIATOR ? iph1->dhpub : iph1->dhpub_p);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	bp = (iph1->side == INITIATOR ? iph1->dhpub_p : iph1->dhpub);
-	memcpy(p, bp->v, bp->l);
-	p += bp->l;
-
-	/* allocate IVm */
-	newivm = racoon_calloc(1, sizeof(struct isakmp_ivm));
-	if (newivm == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get iv buffer\n");
-		vfree(buf);
-		return -1;
-	}
-
-	/* compute IV */
-	newivm->iv = oakley_hash(buf, iph1);
-	if (newivm->iv == NULL) {
-		vfree(buf);
-		oakley_delivm(newivm);
-		return -1;
-	}
-
-	/* adjust length of iv */
-	newivm->iv->l = alg_oakley_encdef_blocklen(iph1->approval->enctype);
-	if (newivm->iv->l == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algoriym %d.\n",
-			iph1->approval->enctype);
-		vfree(buf);
-		oakley_delivm(newivm);
-		return -1;
-	}
-
-	/* create buffer to save iv */
-	if ((newivm->ive = vdup(newivm->iv)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"vdup (%s)\n", strerror(errno));
-		vfree(buf);
-		oakley_delivm(newivm);
-		return -1;
-	}
-
-	vfree(buf);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "IV computed:\n");
-	plogdump(LLV_DEBUG, newivm->iv->v, newivm->iv->l);
-
-	iph1->ivm = newivm;
-
-	return 0;
-}
-
-/*
- * compute IV for the payload after phase 1.
- * It's not limited for phase 2.
- * if pahse 1 was encrypted.
- *	IV = hash(last CBC block of Phase 1 | M-ID)
- * if phase 1 was not encrypted.
- *	IV = hash(phase 1 IV | M-ID)
- * see 4.2 Phase 2 state in draft-ietf-ipsec-ike.
- */
-struct isakmp_ivm *
-oakley_newiv2(iph1, msgid)
-	struct ph1handle *iph1;
-	u_int32_t msgid;
-{
-	struct isakmp_ivm *newivm = NULL;
-	vchar_t *buf = NULL;
-	char *p;
-	int len;
-	int error = -1;
-
-	/* create buffer */
-	len = iph1->ivm->iv->l + sizeof(msgid_t);
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get iv buffer\n");
-		goto end;
-	}
-
-	p = buf->v;
-
-	memcpy(p, iph1->ivm->iv->v, iph1->ivm->iv->l);
-	p += iph1->ivm->iv->l;
-
-	memcpy(p, &msgid, sizeof(msgid));
-
-	plog(LLV_DEBUG, LOCATION, NULL, "compute IV for phase2\n");
-	plog(LLV_DEBUG, LOCATION, NULL, "phase1 last IV:\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* allocate IVm */
-	newivm = racoon_calloc(1, sizeof(struct isakmp_ivm));
-	if (newivm == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get iv buffer\n");
-		goto end;
-	}
-
-	/* compute IV */
-	if ((newivm->iv = oakley_hash(buf, iph1)) == NULL)
-		goto end;
-
-	/* adjust length of iv */
-	newivm->iv->l = alg_oakley_encdef_blocklen(iph1->approval->enctype);
-	if (newivm->iv->l == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algoriym %d.\n",
-			iph1->approval->enctype);
-		goto end;
-	}
-
-	/* create buffer to save new iv */
-	if ((newivm->ive = vdup(newivm->iv)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "vdup (%s)\n", strerror(errno));
-		goto end;
-	}
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "phase2 IV computed:\n");
-	plogdump(LLV_DEBUG, newivm->iv->v, newivm->iv->l);
-
-end:
-	if (error && newivm != NULL){
-		oakley_delivm(newivm);
-		newivm=NULL;
-	}
-	if (buf != NULL)
-		vfree(buf);
-	return newivm;
-}
-
-void
-oakley_delivm(ivm)
-	struct isakmp_ivm *ivm;
-{
-	if (ivm == NULL)
-		return;
-
-	if (ivm->iv != NULL)
-		vfree(ivm->iv);
-	if (ivm->ive != NULL)
-		vfree(ivm->ive);
-	racoon_free(ivm);
-	plog(LLV_DEBUG, LOCATION, NULL, "IV freed\n");
-
-	return;
-}
-
-/*
- * decrypt packet.
- *   save new iv and old iv.
- */
-vchar_t *
-oakley_do_decrypt(iph1, msg, ivdp, ivep)
-	struct ph1handle *iph1;
-	vchar_t *msg, *ivdp, *ivep;
-{
-	vchar_t *buf = NULL, *new = NULL;
-	char *pl;
-	int len;
-	u_int8_t padlen;
-	int blen;
-	int error = -1;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "begin decryption.\n");
-
-	blen = alg_oakley_encdef_blocklen(iph1->approval->enctype);
-	if (blen == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algoriym %d.\n",
-			iph1->approval->enctype);
-		goto end;
-	}
-
-	/* save IV for next, but not sync. */
-	memset(ivep->v, 0, ivep->l);
-	memcpy(ivep->v, (caddr_t)&msg->v[msg->l - blen], blen);
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"IV was saved for next processing:\n");
-	plogdump(LLV_DEBUG, ivep->v, ivep->l);
-
-	pl = msg->v + sizeof(struct isakmp);
-
-	len = msg->l - sizeof(struct isakmp);
-
-	/* create buffer */
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to decrypt.\n");
-		goto end;
-	}
-	memcpy(buf->v, pl, len);
-
-	/* do decrypt */
-	new = alg_oakley_encdef_decrypt(iph1->approval->enctype,
-					buf, iph1->key, ivdp);
-	if (new == NULL || new->v == NULL || new->l == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"decryption %d failed.\n", iph1->approval->enctype);
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "with key:\n");
-	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
-
-	vfree(buf);
-	buf = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "decrypted payload by IV:\n");
-	plogdump(LLV_DEBUG, ivdp->v, ivdp->l);
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"decrypted payload, but not trimed.\n");
-	plogdump(LLV_DEBUG, new->v, new->l);
-
-	/* get padding length */
-	if (lcconf->pad_excltail)
-		padlen = new->v[new->l - 1] + 1;
-	else
-		padlen = new->v[new->l - 1];
-	plog(LLV_DEBUG, LOCATION, NULL, "padding len=%u\n", padlen);
-
-	/* trim padding */
-	if (lcconf->pad_strict) {
-		if (padlen > new->l) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalied padding len=%u, buflen=%zu.\n",
-				padlen, new->l);
-			plogdump(LLV_ERROR, new->v, new->l);
-			goto end;
-		}
-		new->l -= padlen;
-		plog(LLV_DEBUG, LOCATION, NULL, "trimmed padding\n");
-	} else {
-		plog(LLV_DEBUG, LOCATION, NULL, "skip to trim padding.\n");
-	}
-
-	/* create new buffer */
-	len = sizeof(struct isakmp) + new->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to decrypt.\n");
-		goto end;
-	}
-	memcpy(buf->v, msg->v, sizeof(struct isakmp));
-	memcpy(buf->v + sizeof(struct isakmp), new->v, new->l);
-	((struct isakmp *)buf->v)->len = htonl(buf->l);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "decrypted.\n");
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-#ifdef HAVE_PRINT_ISAKMP_C
-	isakmp_printpacket(buf, iph1->remote, iph1->local, 1);
-#endif
-
-	error = 0;
-
-end:
-	if (error && buf != NULL) {
-		vfree(buf);
-		buf = NULL;
-	}
-	if (new != NULL)
-		vfree(new);
-
-	return buf;
-}
-
-/*
- * encrypt packet.
- */
-vchar_t *
-oakley_do_encrypt(iph1, msg, ivep, ivp)
-	struct ph1handle *iph1;
-	vchar_t *msg, *ivep, *ivp;
-{
-	vchar_t *buf = 0, *new = 0;
-	char *pl;
-	int len;
-	u_int padlen;
-	int blen;
-	int error = -1;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "begin encryption.\n");
-
-	/* set cbc block length */
-	blen = alg_oakley_encdef_blocklen(iph1->approval->enctype);
-	if (blen == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algoriym %d.\n",
-			iph1->approval->enctype);
-		goto end;
-	}
-
-	pl = msg->v + sizeof(struct isakmp);
-	len = msg->l - sizeof(struct isakmp);
-
-	/* add padding */
-	padlen = oakley_padlen(len, blen);
-	plog(LLV_DEBUG, LOCATION, NULL, "pad length = %u\n", padlen);
-
-	/* create buffer */
-	buf = vmalloc(len + padlen);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to encrypt.\n");
-		goto end;
-	}
-        if (padlen) {
-                int i;
-		char *p = &buf->v[len];
-		if (lcconf->pad_random) {
-			for (i = 0; i < padlen; i++)
-				*p++ = eay_random() & 0xff;
-		}
-        }
-        memcpy(buf->v, pl, len);
-
-	/* make pad into tail */
-	if (lcconf->pad_excltail)
-		buf->v[len + padlen - 1] = padlen - 1;
-	else
-		buf->v[len + padlen - 1] = padlen;
-
-	plogdump(LLV_DEBUG, buf->v, buf->l);
-
-	/* do encrypt */
-	new = alg_oakley_encdef_encrypt(iph1->approval->enctype,
-					buf, iph1->key, ivep);
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"encryption %d failed.\n", iph1->approval->enctype);
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "with key:\n");
-	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
-
-	vfree(buf);
-	buf = NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "encrypted payload by IV:\n");
-	plogdump(LLV_DEBUG, ivep->v, ivep->l);
-
-	/* save IV for next */
-	memset(ivp->v, 0, ivp->l);
-	memcpy(ivp->v, (caddr_t)&new->v[new->l - blen], blen);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "save IV for next:\n");
-	plogdump(LLV_DEBUG, ivp->v, ivp->l);
-
-	/* create new buffer */
-	len = sizeof(struct isakmp) + new->l;
-	buf = vmalloc(len);
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to encrypt.\n");
-		goto end;
-	}
-	memcpy(buf->v, msg->v, sizeof(struct isakmp));
-	memcpy(buf->v + sizeof(struct isakmp), new->v, new->l);
-	((struct isakmp *)buf->v)->len = htonl(buf->l);
-
-	error = 0;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "encrypted.\n");
-
-end:
-	if (error && buf != NULL) {
-		vfree(buf);
-		buf = NULL;
-	}
-	if (new != NULL)
-		vfree(new);
-
-	return buf;
-}
-
-/* culculate padding length */
-static int
-oakley_padlen(len, base)
-	int len, base;
-{
-	int padlen;
-
-	padlen = base - len % base;
-
-	if (lcconf->pad_randomlen)
-		padlen += ((eay_random() % (lcconf->pad_maxsize + 1) + 1) *
-		    base);
-
-	return padlen;
-}
-
diff --git a/src/racoon/oakley.h b/src/racoon/oakley.h
deleted file mode 100644
index a8dbbd2..0000000
--- a/src/racoon/oakley.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*	$NetBSD: oakley.h,v 1.5 2006/10/06 12:02:27 manu Exp $	*/
-
-/* Id: oakley.h,v 1.13 2005/05/30 20:12:43 fredsen Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _OAKLEY_H
-#define _OAKLEY_H
-
-#include "vmbuf.h"
-
-/* refer to RFC 2409 */
-
-/* Attribute Classes */
-#define OAKLEY_ATTR_ENC_ALG		1 /* B */
-#define   OAKLEY_ATTR_ENC_ALG_DES		1
-#define   OAKLEY_ATTR_ENC_ALG_IDEA		2
-#define   OAKLEY_ATTR_ENC_ALG_BLOWFISH		3
-#define   OAKLEY_ATTR_ENC_ALG_RC5		4
-#define   OAKLEY_ATTR_ENC_ALG_3DES		5
-#define   OAKLEY_ATTR_ENC_ALG_CAST		6
-#define   OAKLEY_ATTR_ENC_ALG_AES		7
-#define   OAKLEY_ATTR_ENC_ALG_CAMELLIA		8	
-					/*	65001 - 65535 Private Use */
-#define OAKLEY_ATTR_HASH_ALG		2 /* B */
-#define   OAKLEY_ATTR_HASH_ALG_MD5		1
-#define   OAKLEY_ATTR_HASH_ALG_SHA		2
-#define   OAKLEY_ATTR_HASH_ALG_TIGER		3
-#if defined(WITH_SHA2)
-#define   OAKLEY_ATTR_HASH_ALG_SHA2_256		4
-#define   OAKLEY_ATTR_HASH_ALG_SHA2_384		5
-#define   OAKLEY_ATTR_HASH_ALG_SHA2_512		6
-#endif
-					/*	65001 - 65535 Private Use */
-#define OAKLEY_ATTR_AUTH_METHOD		3 /* B */
-#define   OAKLEY_ATTR_AUTH_METHOD_PSKEY		1
-#define   OAKLEY_ATTR_AUTH_METHOD_DSSSIG	2
-#define   OAKLEY_ATTR_AUTH_METHOD_RSASIG	3
-#define   OAKLEY_ATTR_AUTH_METHOD_RSAENC	4
-#define   OAKLEY_ATTR_AUTH_METHOD_RSAREV	5
-#define   OAKLEY_ATTR_AUTH_METHOD_EGENC		6
-#define   OAKLEY_ATTR_AUTH_METHOD_EGREV		7
-	/* Hybrid Auth */
-#ifdef ENABLE_HYBRID    
-#define   OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I	64221
-#define	  OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R	64222
-#define   OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I	64223
-#define   OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R	64224
-
-					/*	65001 - 65535 Private Use */
-
-        /* Plain Xauth */
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I	65001
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R	65002
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I	65003
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R	65004
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I	65005
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R	65006
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I	65007
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R	65008
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I	65009
-#define OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R	65010
-#endif
-
-					/*	65500 -> still private
-					 * to avoid clash with GSSAPI_KRB below 
-					 */
-#define FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I	65500
-
-
-	/*
-	 * The following are valid when the Vendor ID is one of
-	 * the following:
-	 *
-	 *	MD5("A GSS-API Authentication Method for IKE")
-	 *	MD5("GSSAPI") (recognized by Windows 2000)
-	 *	MD5("MS NT5 ISAKMPOAKLEY") (sent by Windows 2000)
-	 */
-#define   OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB	65001
-#define OAKLEY_ATTR_GRP_DESC		4 /* B */
-#define   OAKLEY_ATTR_GRP_DESC_MODP768		1
-#define   OAKLEY_ATTR_GRP_DESC_MODP1024		2
-#define   OAKLEY_ATTR_GRP_DESC_EC2N155		3
-#define   OAKLEY_ATTR_GRP_DESC_EC2N185		4
-#define   OAKLEY_ATTR_GRP_DESC_MODP1536		5
-#define   OAKLEY_ATTR_GRP_DESC_MODP2048		14
-#define   OAKLEY_ATTR_GRP_DESC_MODP3072		15
-#define   OAKLEY_ATTR_GRP_DESC_MODP4096		16
-#define   OAKLEY_ATTR_GRP_DESC_MODP6144		17
-#define   OAKLEY_ATTR_GRP_DESC_MODP8192		18
-					/*	32768 - 65535 Private Use */
-#define OAKLEY_ATTR_GRP_TYPE		5 /* B */
-#define   OAKLEY_ATTR_GRP_TYPE_MODP		1
-#define   OAKLEY_ATTR_GRP_TYPE_ECP		2
-#define   OAKLEY_ATTR_GRP_TYPE_EC2N		3
-					/*	65001 - 65535 Private Use */
-#define OAKLEY_ATTR_GRP_PI		6 /* V */
-#define OAKLEY_ATTR_GRP_GEN_ONE		7 /* V */
-#define OAKLEY_ATTR_GRP_GEN_TWO		8 /* V */
-#define OAKLEY_ATTR_GRP_CURVE_A		9 /* V */
-#define OAKLEY_ATTR_GRP_CURVE_B		10 /* V */
-#define OAKLEY_ATTR_SA_LD_TYPE		11 /* B */
-#define   OAKLEY_ATTR_SA_LD_TYPE_DEFAULT	1
-#define   OAKLEY_ATTR_SA_LD_TYPE_SEC		1
-#define   OAKLEY_ATTR_SA_LD_TYPE_KB		2
-#define   OAKLEY_ATTR_SA_LD_TYPE_MAX		3
-					/*	65001 - 65535 Private Use */
-#define OAKLEY_ATTR_SA_LD		12 /* V */
-#define   OAKLEY_ATTR_SA_LD_SEC_DEFAULT		28800 /* 8 hours */
-#define OAKLEY_ATTR_PRF			13 /* B */
-#define OAKLEY_ATTR_KEY_LEN		14 /* B */
-#define OAKLEY_ATTR_FIELD_SIZE		15 /* B */
-#define OAKLEY_ATTR_GRP_ORDER		16 /* V */
-#define OAKLEY_ATTR_BLOCK_SIZE		17 /* B */
-				/*	16384 - 32767 Private Use */
-
-	/*
-	 * The following are valid when the Vendor ID is one of
-	 * the following:
-	 *
-	 *	MD5("A GSS-API Authentication Method for IKE")
-	 *	MD5("GSSAPI") (recognized by Windows 2000)
-	 *	MD5("MS NT5 ISAKMPOAKLEY") (sent by Windows 2000)
-	 */
-#define OAKLEY_ATTR_GSS_ID		16384
-
-#define MAXPADLWORD	20
-
-struct dhgroup {
-	int type;
-	vchar_t *prime;
-	int gen1;
-	int gen2;
-	vchar_t *curve_a;
-	vchar_t *curve_b;
-	vchar_t *order;
-};
-
-/* certificate holder */
-typedef struct cert_t_tag {
-	u_int8_t type;		/* type of CERT, must be same to pl->v[0]*/
-	vchar_t cert;		/* pointer to the CERT */
-	vchar_t *pl;		/* CERT payload minus isakmp general header */
-} cert_t;
-
-struct ph1handle;
-struct ph2handle;
-struct isakmp_ivm;
-
-extern int oakley_get_defaultlifetime __P((void));
-
-extern int oakley_dhinit __P((void));
-extern void oakley_dhgrp_free __P((struct dhgroup *));
-extern int oakley_dh_compute __P((const struct dhgroup *,
-	vchar_t *, vchar_t *, vchar_t *, vchar_t **));
-extern int oakley_dh_generate __P((const struct dhgroup *,
-	vchar_t **, vchar_t **));
-extern int oakley_setdhgroup __P((int, struct dhgroup **));
-
-extern vchar_t *oakley_prf __P((vchar_t *, vchar_t *, struct ph1handle *));
-extern vchar_t *oakley_hash __P((vchar_t *, struct ph1handle *));
-
-extern int oakley_compute_keymat __P((struct ph2handle *, int));
-
-#if notyet
-extern vchar_t *oakley_compute_hashx __P((void));
-#endif
-extern vchar_t *oakley_compute_hash3 __P((struct ph1handle *,
-	u_int32_t, vchar_t *));
-extern vchar_t *oakley_compute_hash1 __P((struct ph1handle *,
-	u_int32_t, vchar_t *));
-extern vchar_t *oakley_ph1hash_common __P((struct ph1handle *, int));
-extern vchar_t *oakley_ph1hash_base_i __P((struct ph1handle *, int));
-extern vchar_t *oakley_ph1hash_base_r __P((struct ph1handle *, int));
-
-extern int oakley_validate_auth __P((struct ph1handle *));
-extern int oakley_getmycert __P((struct ph1handle *));
-extern int oakley_getsign __P((struct ph1handle *));
-extern vchar_t *oakley_getcr __P((struct ph1handle *));
-extern int oakley_checkcr __P((struct ph1handle *));
-extern int oakley_needcr __P((int));
-struct isakmp_gen;
-extern int oakley_savecert __P((struct ph1handle *, struct isakmp_gen *));
-extern int oakley_savecr __P((struct ph1handle *, struct isakmp_gen *));
-
-extern int oakley_skeyid __P((struct ph1handle *));
-extern int oakley_skeyid_dae __P((struct ph1handle *));
-
-extern int oakley_compute_enckey __P((struct ph1handle *));
-extern cert_t *oakley_newcert __P((void));
-extern void oakley_delcert __P((cert_t *));
-extern int oakley_newiv __P((struct ph1handle *));
-extern struct isakmp_ivm *oakley_newiv2 __P((struct ph1handle *, u_int32_t));
-extern void oakley_delivm __P((struct isakmp_ivm *));
-extern vchar_t *oakley_do_decrypt __P((struct ph1handle *,
-	vchar_t *, vchar_t *, vchar_t *));
-extern vchar_t *oakley_do_encrypt __P((struct ph1handle *,
-	vchar_t *, vchar_t *, vchar_t *));
-
-#ifdef ENABLE_HYBRID
-#define AUTHMETHOD(iph1)						     \
-    (((iph1)->rmconf->xauth &&						     \
-    (iph1)->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I) ? \
-	FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I : (iph1)->approval->authmethod)
-#define RMAUTHMETHOD(iph1)						     \
-    (((iph1)->rmconf->xauth &&						     \
-    (iph1)->rmconf->proposal->authmethod ==                                  \
-	OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I) ?                             \
-	FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I :                                  \
-	(iph1)->rmconf->proposal->authmethod)
-#else
-#define AUTHMETHOD(iph1) (iph1)->approval->authmethod
-#define RMAUTHMETHOD(iph1) (iph1)->rmconf->proposal->authmethod
-#endif /* ENABLE_HYBRID */
-
-#endif /* _OAKLEY_H */
diff --git a/src/racoon/pfkey.c b/src/racoon/pfkey.c
deleted file mode 100644
index e73acc8..0000000
--- a/src/racoon/pfkey.c
+++ /dev/null
@@ -1,3157 +0,0 @@
-/*	$NetBSD: pfkey.c,v 1.18.4.5 2008/03/05 22:14:24 mgrooms Exp $	*/
-
-/* $Id: pfkey.c,v 1.18.4.5 2008/03/05 22:14:24 mgrooms Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <netdb.h>
-#include <errno.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-
-#ifdef ENABLE_NATT
-# ifdef __linux__
-#  include <linux/udp.h>
-# endif
-# if defined(__NetBSD__) || defined(__FreeBSD__) ||	\
-  (defined(__APPLE__) && defined(__MACH__))
-#  include <netinet/udp.h>
-# endif
-#endif
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-#ifndef ANDROID_CHANGES
-#include <sys/sysctl.h>
-#endif
-
-#include <net/route.h>
-#include <net/pfkeyv2.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-#include <fcntl.h>
-
-#include "libpfkey.h"
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "schedule.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "handler.h"
-#include "policy.h"
-#include "proposal.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_inf.h"
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "pfkey.h"
-#include "algorithm.h"
-#include "sainfo.h"
-#include "admin.h"
-#include "privsep.h"
-#include "strnames.h"
-#include "backupsa.h"
-#include "gcmalloc.h"
-#include "nattraversal.h"
-#include "crypto_openssl.h"
-#include "grabmyaddr.h"
-
-#if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC)
-#define SADB_X_EALG_AESCBC  SADB_X_EALG_RIJNDAELCBC
-#endif
-
-/* prototype */
-static u_int ipsecdoi2pfkey_aalg __P((u_int));
-static u_int ipsecdoi2pfkey_ealg __P((u_int));
-static u_int ipsecdoi2pfkey_calg __P((u_int));
-static u_int ipsecdoi2pfkey_alg __P((u_int, u_int));
-static u_int keylen_aalg __P((u_int));
-static u_int keylen_ealg __P((u_int, int));
-
-static int pk_recvgetspi __P((caddr_t *));
-static int pk_recvupdate __P((caddr_t *));
-static int pk_recvadd __P((caddr_t *));
-static int pk_recvdelete __P((caddr_t *));
-static int pk_recvacquire __P((caddr_t *));
-static int pk_recvexpire __P((caddr_t *));
-static int pk_recvflush __P((caddr_t *));
-static int getsadbpolicy __P((caddr_t *, int *, int, struct ph2handle *));
-static int pk_recvspdupdate __P((caddr_t *));
-static int pk_recvspdadd __P((caddr_t *));
-static int pk_recvspddelete __P((caddr_t *));
-static int pk_recvspdexpire __P((caddr_t *));
-static int pk_recvspdget __P((caddr_t *));
-static int pk_recvspddump __P((caddr_t *));
-static int pk_recvspdflush __P((caddr_t *));
-static struct sadb_msg *pk_recv __P((int, int *));
-
-static int (*pkrecvf[]) __P((caddr_t *)) = {
-NULL,
-pk_recvgetspi,
-pk_recvupdate,
-pk_recvadd,
-pk_recvdelete,
-NULL,	/* SADB_GET */
-pk_recvacquire,
-NULL,	/* SABD_REGISTER */
-pk_recvexpire,
-pk_recvflush,
-NULL,	/* SADB_DUMP */
-NULL,	/* SADB_X_PROMISC */
-NULL,	/* SADB_X_PCHANGE */
-pk_recvspdupdate,
-pk_recvspdadd,
-pk_recvspddelete,
-pk_recvspdget,
-NULL,	/* SADB_X_SPDACQUIRE */
-pk_recvspddump,
-pk_recvspdflush,
-NULL,	/* SADB_X_SPDSETIDX */
-pk_recvspdexpire,
-NULL,	/* SADB_X_SPDDELETE2 */
-NULL,	/* SADB_X_NAT_T_NEW_MAPPING */
-NULL,	/* SADB_X_MIGRATE */
-#if (SADB_MAX > 24)
-#error "SADB extra message?"
-#endif
-};
-
-static int addnewsp __P((caddr_t *));
-
-/* cope with old kame headers - ugly */
-#ifndef SADB_X_AALG_MD5
-#define SADB_X_AALG_MD5		SADB_AALG_MD5	
-#endif
-#ifndef SADB_X_AALG_SHA
-#define SADB_X_AALG_SHA		SADB_AALG_SHA
-#endif
-#ifndef SADB_X_AALG_NULL
-#define SADB_X_AALG_NULL	SADB_AALG_NULL
-#endif
-
-#ifndef SADB_X_EALG_BLOWFISHCBC
-#define SADB_X_EALG_BLOWFISHCBC	SADB_EALG_BLOWFISHCBC
-#endif
-#ifndef SADB_X_EALG_CAST128CBC
-#define SADB_X_EALG_CAST128CBC	SADB_EALG_CAST128CBC
-#endif
-#ifndef SADB_X_EALG_RC5CBC
-#ifdef SADB_EALG_RC5CBC
-#define SADB_X_EALG_RC5CBC	SADB_EALG_RC5CBC
-#endif
-#endif
-
-/*
- * PF_KEY packet handler
- *	0: success
- *	-1: fail
- */
-int
-pfkey_handler()
-{
-	struct sadb_msg *msg;
-	int len;
-	caddr_t mhp[SADB_EXT_MAX + 1];
-	int error = -1;
-
-	/* receive pfkey message. */
-	len = 0;
-	msg = (struct sadb_msg *)pk_recv(lcconf->sock_pfkey, &len);
-	if (msg == NULL) {
-		if (len < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to recv from pfkey (%s)\n",
-				strerror(errno));
-			goto end;
-		} else {
-			/* short message - msg not ready */
-			return 0;
-		}
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "get pfkey %s message\n",
-		s_pfkey_type(msg->sadb_msg_type));
-	plogdump(LLV_DEBUG2, msg, msg->sadb_msg_len << 3);
-
-	/* validity check */
-	if (msg->sadb_msg_errno) {
-		int pri;
-
-		/* when SPD is empty, treat the state as no error. */
-		if (msg->sadb_msg_type == SADB_X_SPDDUMP &&
-		    msg->sadb_msg_errno == ENOENT)
-			pri = LLV_DEBUG;
-		else
-			pri = LLV_ERROR;
-
-		plog(pri, LOCATION, NULL,
-			"pfkey %s failed: %s\n",
-			s_pfkey_type(msg->sadb_msg_type),
-			strerror(msg->sadb_msg_errno));
-
-		goto end;
-	}
-
-	/* check pfkey message. */
-	if (pfkey_align(msg, mhp)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed pfkey align (%s)\n",
-			ipsec_strerror());
-		goto end;
-	}
-	if (pfkey_check(mhp)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed pfkey check (%s)\n",
-			ipsec_strerror());
-		goto end;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-
-	/* safety check */
-	if (msg->sadb_msg_type >= ARRAYLEN(pkrecvf)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unknown PF_KEY message type=%u\n",
-			msg->sadb_msg_type);
-		goto end;
-	}
-
-	if (pkrecvf[msg->sadb_msg_type] == NULL) {
-		plog(LLV_INFO, LOCATION, NULL,
-			"unsupported PF_KEY message %s\n",
-			s_pfkey_type(msg->sadb_msg_type));
-		goto end;
-	}
-
-	if ((pkrecvf[msg->sadb_msg_type])(mhp) < 0)
-		goto end;
-
-	error = 0;
-end:
-	if (msg)
-		racoon_free(msg);
-	return(error);
-}
-
-/*
- * dump SADB
- */
-vchar_t *
-pfkey_dump_sadb(satype)
-	int satype;
-{
-	int s = -1;
-	vchar_t *buf = NULL;
-	pid_t pid = getpid();
-	struct sadb_msg *msg = NULL;
-	size_t bl, ml;
-	int len;
-
-	if ((s = privsep_pfkey_open()) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed pfkey open: %s\n",
-			ipsec_strerror());
-		return NULL;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_dump\n");
-	if (pfkey_send_dump(s, satype) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed dump: %s\n", ipsec_strerror());
-		goto fail;
-	}
-
-	while (1) {
-		if (msg)
-			racoon_free(msg);
-		msg = pk_recv(s, &len);
-		if (msg == NULL) {
-			if (len < 0)
-				goto done;
-			else
-				continue;
-		}
-
-		if (msg->sadb_msg_type != SADB_DUMP || msg->sadb_msg_pid != pid)
-		{
-		    plog(LLV_DEBUG, LOCATION, NULL,
-			 "discarding non-sadb dump msg %p, our pid=%i\n", msg, pid);
-		    plog(LLV_DEBUG, LOCATION, NULL,
-			 "type %i, pid %i\n", msg->sadb_msg_type, msg->sadb_msg_pid);
-		    continue;
-		}
-		
-
-		ml = msg->sadb_msg_len << 3;
-		bl = buf ? buf->l : 0;
-		buf = vrealloc(buf, bl + ml);
-		if (buf == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to reallocate buffer to dump.\n");
-			goto fail;
-		}
-		memcpy(buf->v + bl, msg, ml);
-
-		if (msg->sadb_msg_seq == 0)
-			break;
-	}
-	goto done;
-
-fail:
-	if (buf)
-		vfree(buf);
-	buf = NULL;
-done:
-	if (msg)
-		racoon_free(msg);
-	if (s >= 0)
-		privsep_pfkey_close(s);
-	return buf;
-}
-
-#ifdef ENABLE_ADMINPORT
-/*
- * flush SADB
- */
-void
-pfkey_flush_sadb(proto)
-	u_int proto;
-{
-	int satype;
-
-	/* convert to SADB_SATYPE */
-	if ((satype = admin2pfkey_proto(proto)) < 0)
-		return;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_flush\n");
-	if (pfkey_send_flush(lcconf->sock_pfkey, satype) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed send flush (%s)\n", ipsec_strerror());
-		return;
-	}
-
-	return;
-}
-#endif
-
-/*
- * These are the SATYPEs that we manage.  We register to get
- * PF_KEY messages related to these SATYPEs, and we also use
- * this list to determine which SATYPEs to delete SAs for when
- * we receive an INITIAL-CONTACT.
- */
-const struct pfkey_satype pfkey_satypes[] = {
-	{ SADB_SATYPE_AH,	"AH" },
-	{ SADB_SATYPE_ESP,	"ESP" },
-	{ SADB_X_SATYPE_IPCOMP,	"IPCOMP" },
-};
-const int pfkey_nsatypes =
-    sizeof(pfkey_satypes) / sizeof(pfkey_satypes[0]);
-
-/*
- * PF_KEY initialization
- */
-int
-pfkey_init()
-{
-	int i, reg_fail;
-
-	if ((lcconf->sock_pfkey = privsep_pfkey_open()) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed pfkey open (%s)\n", ipsec_strerror());
-		return -1;
-	}
-	if (fcntl(lcconf->sock_pfkey, F_SETFL, O_NONBLOCK) == -1)
-		plog(LLV_WARNING, LOCATION, NULL,
-		    "failed to set the pfkey socket to NONBLOCK\n");
-
-	for (i = 0, reg_fail = 0; i < pfkey_nsatypes; i++) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-		    "call pfkey_send_register for %s\n",
-		    pfkey_satypes[i].ps_name);
-		if (pfkey_send_register(lcconf->sock_pfkey,
-					pfkey_satypes[i].ps_satype) < 0 ||
-		    pfkey_recv_register(lcconf->sock_pfkey) < 0) {
-			plog(LLV_WARNING, LOCATION, NULL,
-			    "failed to register %s (%s)\n",
-			    pfkey_satypes[i].ps_name,
-			    ipsec_strerror());
-			reg_fail++;
-		}
-	}
-
-	if (reg_fail == pfkey_nsatypes) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to regist any protocol.\n");
-		pfkey_close(lcconf->sock_pfkey);
-		return -1;
-	}
-
-	initsp();
-
-	if (pfkey_send_spddump(lcconf->sock_pfkey) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec sending spddump failed: %s\n",
-			ipsec_strerror());
-		pfkey_close(lcconf->sock_pfkey);
-		return -1;
-	}
-#if 0
-	if (pfkey_promisc_toggle(1) < 0) {
-		pfkey_close(lcconf->sock_pfkey);
-		return -1;
-	}
-#endif
-	return 0;
-}
-
-/* %%% for conversion */
-/* IPSECDOI_ATTR_AUTH -> SADB_AALG */
-static u_int
-ipsecdoi2pfkey_aalg(hashtype)
-	u_int hashtype;
-{
-	switch (hashtype) {
-	case IPSECDOI_ATTR_AUTH_HMAC_MD5:
-		return SADB_AALG_MD5HMAC;
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA1:
-		return SADB_AALG_SHA1HMAC;
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256:
-#if (defined SADB_X_AALG_SHA2_256) && !defined(SADB_X_AALG_SHA2_256HMAC)
-		return SADB_X_AALG_SHA2_256;
-#else
-		return SADB_X_AALG_SHA2_256HMAC;
-#endif
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384:
-#if (defined SADB_X_AALG_SHA2_384) && !defined(SADB_X_AALG_SHA2_384HMAC)
-		return SADB_X_AALG_SHA2_384;
-#else
-		return SADB_X_AALG_SHA2_384HMAC;
-#endif
-	case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512:
-#if (defined SADB_X_AALG_SHA2_512) && !defined(SADB_X_AALG_SHA2_512HMAC)
-		return SADB_X_AALG_SHA2_512;
-#else
-		return SADB_X_AALG_SHA2_512HMAC;
-#endif
-	case IPSECDOI_ATTR_AUTH_KPDK:		/* need special care */
-		return SADB_AALG_NONE;
-
-	/* not supported */
-	case IPSECDOI_ATTR_AUTH_DES_MAC:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Not supported hash type: %u\n", hashtype);
-		return ~0;
-
-	case 0: /* reserved */
-	default:
-		return SADB_AALG_NONE;
-
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid hash type: %u\n", hashtype);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* IPSECDOI_ESP -> SADB_EALG */
-static u_int
-ipsecdoi2pfkey_ealg(t_id)
-	u_int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_ESP_DES_IV64:		/* sa_flags |= SADB_X_EXT_OLD */
-		return SADB_EALG_DESCBC;
-	case IPSECDOI_ESP_DES:
-		return SADB_EALG_DESCBC;
-	case IPSECDOI_ESP_3DES:
-		return SADB_EALG_3DESCBC;
-#ifdef SADB_X_EALG_RC5CBC
-	case IPSECDOI_ESP_RC5:
-		return SADB_X_EALG_RC5CBC;
-#endif
-	case IPSECDOI_ESP_CAST:
-		return SADB_X_EALG_CAST128CBC;
-	case IPSECDOI_ESP_BLOWFISH:
-		return SADB_X_EALG_BLOWFISHCBC;
-	case IPSECDOI_ESP_DES_IV32:	/* flags |= (SADB_X_EXT_OLD|
-							SADB_X_EXT_IV4B)*/
-		return SADB_EALG_DESCBC;
-	case IPSECDOI_ESP_NULL:
-		return SADB_EALG_NULL;
-#ifdef SADB_X_EALG_AESCBC
-	case IPSECDOI_ESP_AES:
-		return SADB_X_EALG_AESCBC;
-#endif
-#ifdef SADB_X_EALG_TWOFISHCBC
-	case IPSECDOI_ESP_TWOFISH:
-		return SADB_X_EALG_TWOFISHCBC;
-#endif
-#ifdef SADB_X_EALG_CAMELLIACBC
-	case IPSECDOI_ESP_CAMELLIA:
-		return SADB_X_EALG_CAMELLIACBC;
-#endif
-
-	/* not supported */
-	case IPSECDOI_ESP_3IDEA:
-	case IPSECDOI_ESP_IDEA:
-	case IPSECDOI_ESP_RC4:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Not supported transform: %u\n", t_id);
-		return ~0;
-
-	case 0: /* reserved */
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid transform id: %u\n", t_id);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* IPCOMP -> SADB_CALG */
-static u_int
-ipsecdoi2pfkey_calg(t_id)
-	u_int t_id;
-{
-	switch (t_id) {
-	case IPSECDOI_IPCOMP_OUI:
-		return SADB_X_CALG_OUI;
-	case IPSECDOI_IPCOMP_DEFLATE:
-		return SADB_X_CALG_DEFLATE;
-	case IPSECDOI_IPCOMP_LZS:
-		return SADB_X_CALG_LZS;
-
-	case 0: /* reserved */
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid transform id: %u\n", t_id);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* IPSECDOI_PROTO -> SADB_SATYPE */
-u_int
-ipsecdoi2pfkey_proto(proto)
-	u_int proto;
-{
-	switch (proto) {
-	case IPSECDOI_PROTO_IPSEC_AH:
-		return SADB_SATYPE_AH;
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		return SADB_SATYPE_ESP;
-	case IPSECDOI_PROTO_IPCOMP:
-		return SADB_X_SATYPE_IPCOMP;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid ipsec_doi proto: %u\n", proto);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-static u_int
-ipsecdoi2pfkey_alg(algclass, type)
-	u_int algclass, type;
-{
-	switch (algclass) {
-	case IPSECDOI_ATTR_AUTH:
-		return ipsecdoi2pfkey_aalg(type);
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		return ipsecdoi2pfkey_ealg(type);
-	case IPSECDOI_PROTO_IPCOMP:
-		return ipsecdoi2pfkey_calg(type);
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid ipsec_doi algclass: %u\n", algclass);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* SADB_SATYPE -> IPSECDOI_PROTO */
-u_int
-pfkey2ipsecdoi_proto(satype)
-	u_int satype;
-{
-	switch (satype) {
-	case SADB_SATYPE_AH:
-		return IPSECDOI_PROTO_IPSEC_AH;
-	case SADB_SATYPE_ESP:
-		return IPSECDOI_PROTO_IPSEC_ESP;
-	case SADB_X_SATYPE_IPCOMP:
-		return IPSECDOI_PROTO_IPCOMP;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid pfkey proto: %u\n", satype);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
-u_int
-ipsecdoi2pfkey_mode(mode)
-	u_int mode;
-{
-	switch (mode) {
-	case IPSECDOI_ATTR_ENC_MODE_TUNNEL:
-#ifdef ENABLE_NATT
-	case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC:
-	case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT:
-#endif
-		return IPSEC_MODE_TUNNEL;
-	case IPSECDOI_ATTR_ENC_MODE_TRNS:
-#ifdef ENABLE_NATT
-	case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC:
-	case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT:
-#endif
-		return IPSEC_MODE_TRANSPORT;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
-u_int
-pfkey2ipsecdoi_mode(mode)
-	u_int mode;
-{
-	switch (mode) {
-	case IPSEC_MODE_TUNNEL:
-		return IPSECDOI_ATTR_ENC_MODE_TUNNEL;
-	case IPSEC_MODE_TRANSPORT:
-		return IPSECDOI_ATTR_ENC_MODE_TRNS;
-	case IPSEC_MODE_ANY:
-		return IPSECDOI_ATTR_ENC_MODE_ANY;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode);
-		return ~0;
-	}
-	/*NOTREACHED*/
-}
-
-/* default key length for encryption algorithm */
-static u_int
-keylen_aalg(hashtype)
-	u_int hashtype;
-{
-	int res;
-
-	if (hashtype == 0)
-		return SADB_AALG_NONE;
-
-	res = alg_ipsec_hmacdef_hashlen(hashtype);
-	if (res == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid hmac algorithm %u.\n", hashtype);
-		return ~0;
-	}
-	return res;
-}
-
-/* default key length for encryption algorithm */
-static u_int
-keylen_ealg(enctype, encklen)
-	u_int enctype;
-	int encklen;
-{
-	int res;
-
-	res = alg_ipsec_encdef_keylen(enctype, encklen);
-	if (res == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid encryption algorithm %u.\n", enctype);
-		return ~0;
-	}
-	return res;
-}
-
-int
-pfkey_convertfromipsecdoi(proto_id, t_id, hashtype,
-		e_type, e_keylen, a_type, a_keylen, flags)
-	u_int proto_id;
-	u_int t_id;
-	u_int hashtype;
-	u_int *e_type;
-	u_int *e_keylen;
-	u_int *a_type;
-	u_int *a_keylen;
-	u_int *flags;
-{
-	*flags = 0;
-	switch (proto_id) {
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		if ((*e_type = ipsecdoi2pfkey_ealg(t_id)) == ~0)
-			goto bad;
-		if ((*e_keylen = keylen_ealg(t_id, *e_keylen)) == ~0)
-			goto bad;
-		*e_keylen >>= 3;
-
-		if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0)
-			goto bad;
-		if ((*a_keylen = keylen_aalg(hashtype)) == ~0)
-			goto bad;
-		*a_keylen >>= 3;
-
-		if (*e_type == SADB_EALG_NONE) {
-			plog(LLV_ERROR, LOCATION, NULL, "no ESP algorithm.\n");
-			goto bad;
-		}
-		break;
-
-	case IPSECDOI_PROTO_IPSEC_AH:
-		if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0)
-			goto bad;
-		if ((*a_keylen = keylen_aalg(hashtype)) == ~0)
-			goto bad;
-		*a_keylen >>= 3;
-
-		if (t_id == IPSECDOI_ATTR_AUTH_HMAC_MD5 
-		 && hashtype == IPSECDOI_ATTR_AUTH_KPDK) {
-			/* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */
-			*a_type = SADB_X_AALG_MD5;
-			*flags |= SADB_X_EXT_OLD;
-		}
-		*e_type = SADB_EALG_NONE;
-		*e_keylen = 0;
-		if (*a_type == SADB_AALG_NONE) {
-			plog(LLV_ERROR, LOCATION, NULL, "no AH algorithm.\n");
-			goto bad;
-		}
-		break;
-
-	case IPSECDOI_PROTO_IPCOMP:
-		if ((*e_type = ipsecdoi2pfkey_calg(t_id)) == ~0)
-			goto bad;
-		*e_keylen = 0;
-
-		*flags = SADB_X_EXT_RAWCPI;
-
-		*a_type = SADB_AALG_NONE;
-		*a_keylen = 0;
-		if (*e_type == SADB_X_CALG_NONE) {
-			plog(LLV_ERROR, LOCATION, NULL, "no IPCOMP algorithm.\n");
-			goto bad;
-		}
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL, "unknown IPsec protocol.\n");
-		goto bad;
-	}
-
-	return 0;
-
-    bad:
-	errno = EINVAL;
-	return -1;
-}
-
-/* called from scheduler */
-void
-pfkey_timeover_stub(p)
-	void *p;
-{
-
-	pfkey_timeover((struct ph2handle *)p);
-}
-
-void
-pfkey_timeover(iph2)
-	struct ph2handle *iph2;
-{
-	plog(LLV_ERROR, LOCATION, NULL,
-		"%s give up to get IPsec-SA due to time up to wait.\n",
-		saddrwop2str(iph2->dst));
-	SCHED_KILL(iph2->sce);
-
-	/* If initiator side, send error to kernel by SADB_ACQUIRE. */
-	if (iph2->side == INITIATOR)
-		pk_sendeacquire(iph2);
-
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-
-	return;
-}
-
-/*%%%*/
-/* send getspi message per ipsec protocol per remote address */
-/*
- * the local address and remote address in ph1handle are dealed
- * with destination address and source address respectively.
- * Because SPI is decided by responder.
- */
-int
-pk_sendgetspi(iph2)
-	struct ph2handle *iph2;
-{
-	struct sockaddr *src = NULL, *dst = NULL;
-	u_int satype, mode;
-	struct saprop *pp;
-	struct saproto *pr;
-	u_int32_t minspi, maxspi;
-	int proxy = 0;
-
-	if (iph2->side == INITIATOR) {
-		pp = iph2->proposal;
-		proxy = iph2->ph1->rmconf->support_proxy;
-	} else {
-		pp = iph2->approval;
-		if (iph2->sainfo && iph2->sainfo->id_i)
-			proxy = 1;
-	}
-
-	/* for mobile IPv6 */
-	if (proxy && iph2->src_id && iph2->dst_id &&
-	    ipsecdoi_transportmode(pp)) {
-		src = iph2->src_id;
-		dst = iph2->dst_id;
-	} else {
-		src = iph2->src;
-		dst = iph2->dst;
-	}
-
-	for (pr = pp->head; pr != NULL; pr = pr->next) {
-
-		/* validity check */
-		satype = ipsecdoi2pfkey_proto(pr->proto_id);
-		if (satype == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proto_id %d\n", pr->proto_id);
-			return -1;
-		}
-		/* this works around a bug in Linux kernel where it allocates 4 byte
-		   spi's for IPCOMP */
-		else if (satype == SADB_X_SATYPE_IPCOMP) {
-			minspi = 0x100;
-			maxspi = 0xffff;
-		}
-		else {
-			minspi = 0;
-			maxspi = 0;
-		}
-		mode = ipsecdoi2pfkey_mode(pr->encmode);
-		if (mode == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid encmode %d\n", pr->encmode);
-			return -1;
-		}
-
-#ifdef ENABLE_NATT
-		/* XXX should we do a copy of src/dst for each pr ?
-		 */
-		if (! pr->udp_encap) {
-			/* Remove port information, that SA doesn't use it */
-			set_port(src, 0);
-			set_port(dst, 0);
-		}
-#endif
-		plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_getspi\n");
-		if (pfkey_send_getspi(
-				lcconf->sock_pfkey,
-				satype,
-				mode,
-				dst,			/* src of SA */
-				src,			/* dst of SA */
-				minspi, maxspi,
-				pr->reqid_in, iph2->seq) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"ipseclib failed send getspi (%s)\n",
-				ipsec_strerror());
-			return -1;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"pfkey GETSPI sent: %s\n",
-			sadbsecas2str(dst, src, satype, 0, mode));
-	}
-
-	return 0;
-}
-
-/*
- * receive GETSPI from kernel.
- */
-static int
-pk_recvgetspi(mhp) 
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_sa *sa;
-	struct ph2handle *iph2;
-	struct sockaddr *dst;
-	int proto_id;
-	int allspiok, notfound;
-	struct saprop *pp;
-	struct saproto *pr;
-
-	/* validity check */
-	if (mhp[SADB_EXT_SA] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb getspi message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); /* note SA dir */
-
-	/* the message has to be processed or not ? */
-	if (msg->sadb_msg_pid != getpid()) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"%s message is not interesting "
-			"because pid %d is not mine.\n",
-			s_pfkey_type(msg->sadb_msg_type),
-			msg->sadb_msg_pid);
-		return -1;
-	}
-
-	iph2 = getph2byseq(msg->sadb_msg_seq);
-	if (iph2 == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"seq %d of %s message not interesting.\n",
-			msg->sadb_msg_seq,
-			s_pfkey_type(msg->sadb_msg_type));
-		return -1;
-	}
-
-	if (iph2->status != PHASE2ST_GETSPISENT) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatch (db:%d msg:%d)\n",
-			iph2->status, PHASE2ST_GETSPISENT);
-		return -1;
-	}
-
-	/* set SPI, and check to get all spi whether or not */
-	allspiok = 1;
-	notfound = 1;
-	proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-	pp = iph2->side == INITIATOR ? iph2->proposal : iph2->approval;
-
-	for (pr = pp->head; pr != NULL; pr = pr->next) {
-		if (pr->proto_id == proto_id && pr->spi == 0) {
-			pr->spi = sa->sadb_sa_spi;
-			notfound = 0;
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"pfkey GETSPI succeeded: %s\n",
-				sadbsecas2str(iph2->dst, iph2->src,
-				    msg->sadb_msg_satype,
-				    sa->sadb_sa_spi,
-				    ipsecdoi2pfkey_mode(pr->encmode)));
-		}
-		if (pr->spi == 0)
-			allspiok = 0;	/* not get all spi */
-	}
-
-	if (notfound) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"get spi for unknown address %s\n",
-			saddrwop2str(iph2->dst));
-		return -1;
-	}
-
-	if (allspiok) {
-		/* update status */
-		iph2->status = PHASE2ST_GETSPIDONE;
-		if (isakmp_post_getspi(iph2) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to start post getspi.\n");
-			unbindph12(iph2);
-			remph2(iph2);
-			delph2(iph2);
-			iph2 = NULL;
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-/*
- * set inbound SA
- */
-int
-pk_sendupdate(iph2)
-	struct ph2handle *iph2;
-{
-	struct saproto *pr;
-	struct pfkey_send_sa_args sa_args;
-	int proxy = 0;
-
-	/* sanity check */
-	if (iph2->approval == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no approvaled SAs found.\n");
-	}
-
-	if (iph2->side == INITIATOR)
-		proxy = iph2->ph1->rmconf->support_proxy;
-	else if (iph2->sainfo && iph2->sainfo->id_i)
-		proxy = 1;
-
-	/* fill in some needed for pfkey_send_update2 */
-	memset (&sa_args, 0, sizeof (sa_args));
-	sa_args.so = lcconf->sock_pfkey;
-	sa_args.l_addtime = iph2->approval->lifetime;
-	sa_args.seq = iph2->seq; 
-	sa_args.wsize = 4;
-
-	/* for mobile IPv6 */
-	if (proxy && iph2->src_id && iph2->dst_id &&
-	    ipsecdoi_transportmode(iph2->approval)) {
-		sa_args.dst = iph2->src_id;
-		sa_args.src = iph2->dst_id;
-	} else {
-		sa_args.dst = iph2->src;
-		sa_args.src = iph2->dst;
-	}
-
-	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-		/* validity check */
-		sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id);
-		if (sa_args.satype == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proto_id %d\n", pr->proto_id);
-			return -1;
-		}
-		else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) {
-			/* IPCOMP has no replay window */
-			sa_args.wsize = 0;
-		}
-#ifdef ENABLE_SAMODE_UNSPECIFIED
-		sa_args.mode = IPSEC_MODE_ANY;
-#else
-		sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode);
-		if (sa_args.mode == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid encmode %d\n", pr->encmode);
-			return -1;
-		}
-#endif
-		/* set algorithm type and key length */
-		sa_args.e_keylen = pr->head->encklen;
-		if (pfkey_convertfromipsecdoi(
-				pr->proto_id,
-				pr->head->trns_id,
-				pr->head->authtype,
-				&sa_args.e_type, &sa_args.e_keylen,
-				&sa_args.a_type, &sa_args.a_keylen, 
-				&sa_args.flags) < 0)
-			return -1;
-
-#if 0
-		sa_args.l_bytes = iph2->approval->lifebyte * 1024,
-#else
-		sa_args.l_bytes = 0;
-#endif
-
-#ifdef HAVE_SECCTX
-		if (*iph2->approval->sctx.ctx_str) {
-			sa_args.ctxdoi = iph2->approval->sctx.ctx_doi;
-			sa_args.ctxalg = iph2->approval->sctx.ctx_alg;
-			sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen;
-			sa_args.ctxstr = iph2->approval->sctx.ctx_str;
-		}
-#endif /* HAVE_SECCTX */
-
-#ifdef ENABLE_NATT
-		if (pr->udp_encap) {
-			sa_args.l_natt_type = iph2->ph1->natt_options->encaps_type;
-			sa_args.l_natt_sport = extract_port (iph2->ph1->remote);
-			sa_args.l_natt_dport = extract_port (iph2->ph1->local);
-			sa_args.l_natt_oa = NULL;  // FIXME: Here comes OA!!!
-#ifdef SADB_X_EXT_NAT_T_FRAG
-			sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag;
-#endif
-		} else {
-			/* Remove port information, that SA doesn't use it */
-			set_port(sa_args.src, 0);
-			set_port(sa_args.dst, 0);
-		}
-
-#endif
-		/* more info to fill in */
-		sa_args.spi = pr->spi;
-		sa_args.reqid = pr->reqid_in;
-		sa_args.keymat = pr->keymat->v;
-
-		plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_update2\n");
-		if (pfkey_send_update2(&sa_args) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"libipsec failed send update (%s)\n",
-				ipsec_strerror());
-			return -1;
-		}
-
-#ifndef ANDROID_PATCHED
-		if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA])
-			continue;
-
-		/*
-		 * It maybe good idea to call backupsa_to_file() after
-		 * racoon will receive the sadb_update messages.
-		 * But it is impossible because there is not key in the
-		 * information from the kernel.
-		 */
-		
-		/* change some things before backing up */
-		sa_args.wsize = 4;
-		sa_args.l_bytes = iph2->approval->lifebyte * 1024;
-		
-		if (backupsa_to_file(&sa_args) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"backuped SA failed: %s\n",
-				sadbsecas2str(sa_args.src, sa_args.dst,
-				sa_args.satype, sa_args.spi, sa_args.mode));
-		}
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"backuped SA: %s\n",
-			sadbsecas2str(sa_args.src, sa_args.dst,
-			sa_args.satype, sa_args.spi, sa_args.mode));
-#endif
-	}
-
-	return 0;
-}
-
-static int
-pk_recvupdate(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	struct ph2handle *iph2;
-	u_int proto_id, encmode, sa_mode;
-	int incomplete = 0;
-	struct saproto *pr;
-
-	/* ignore this message because of local test mode. */
-	if (f_local)
-		return 0;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_SA] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb update message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-	sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-
-	sa_mode = mhp[SADB_X_EXT_SA2] == NULL
-		? IPSEC_MODE_ANY
-		: ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
-
-	/* the message has to be processed or not ? */
-	if (msg->sadb_msg_pid != getpid()) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"%s message is not interesting "
-			"because pid %d is not mine.\n",
-			s_pfkey_type(msg->sadb_msg_type),
-			msg->sadb_msg_pid);
-		return -1;
-	}
-
-	iph2 = getph2byseq(msg->sadb_msg_seq);
-	if (iph2 == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"seq %d of %s message not interesting.\n",
-			msg->sadb_msg_seq,
-			s_pfkey_type(msg->sadb_msg_type));
-		return -1;
-	}
-
-	if (iph2->status != PHASE2ST_ADDSA) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"status mismatch (db:%d msg:%d)\n",
-			iph2->status, PHASE2ST_ADDSA);
-		return -1;
-	}
-
-	/* check to complete all keys ? */
-	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-		proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-		if (proto_id == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proto_id %d\n", msg->sadb_msg_satype);
-			return -1;
-		}
-		encmode = pfkey2ipsecdoi_mode(sa_mode);
-		if (encmode == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid encmode %d\n", sa_mode);
-			return -1;
-		}
-
-		if (pr->proto_id == proto_id
-		 && pr->spi == sa->sadb_sa_spi) {
-			pr->ok = 1;
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"pfkey UPDATE succeeded: %s\n",
-				sadbsecas2str(iph2->dst, iph2->src,
-				    msg->sadb_msg_satype,
-				    sa->sadb_sa_spi,
-				    sa_mode));
-
-			plog(LLV_INFO, LOCATION, NULL,
-				"IPsec-SA established: %s\n",
-				sadbsecas2str(iph2->dst, iph2->src,
-					msg->sadb_msg_satype, sa->sadb_sa_spi,
-					sa_mode));
-		}
-
-		if (pr->ok == 0)
-			incomplete = 1;
-	}
-
-	if (incomplete)
-		return 0;
-
-	/* turn off the timer for calling pfkey_timeover() */
-	SCHED_KILL(iph2->sce);
-	
-	/* update status */
-	iph2->status = PHASE2ST_ESTABLISHED;
-
-#ifdef ENABLE_STATS
-	gettimeofday(&iph2->end, NULL);
-	syslog(LOG_NOTICE, "%s(%s): %8.6f",
-		"phase2", "quick", timedelta(&iph2->start, &iph2->end));
-#endif
-
-	/* count up */
-	iph2->ph1->ph2cnt++;
-
-	/* turn off schedule */
-	SCHED_KILL(iph2->scr);
-
-	/* Force the update of ph2's ports, as there is at least one
-	 * situation where they'll mismatch with ph1's values
-	 */
-
-#ifdef ENABLE_NATT
-	set_port(iph2->src, extract_port(iph2->ph1->local));
-	set_port(iph2->dst, extract_port(iph2->ph1->remote));
-#endif
-
-	/*
-	 * since we are going to reuse the phase2 handler, we need to
-	 * remain it and refresh all the references between ph1 and ph2 to use.
-	 */
-	unbindph12(iph2);
-
-	iph2->sce = sched_new(iph2->approval->lifetime,
-	    isakmp_ph2expire_stub, iph2);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	return 0;
-}
-
-/*
- * set outbound SA
- */
-int
-pk_sendadd(iph2)
-	struct ph2handle *iph2;
-{
-	struct saproto *pr;
-	int proxy = 0;
-	struct pfkey_send_sa_args sa_args;
-
-	/* sanity check */
-	if (iph2->approval == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no approvaled SAs found.\n");
-		return -1;
-	}
-
-	if (iph2->side == INITIATOR)
-		proxy = iph2->ph1->rmconf->support_proxy;
-	else if (iph2->sainfo && iph2->sainfo->id_i)
-		proxy = 1;
-
-	/* fill in some needed for pfkey_send_update2 */
-	memset (&sa_args, 0, sizeof (sa_args));
-	sa_args.so = lcconf->sock_pfkey;
-	sa_args.l_addtime = iph2->approval->lifetime;
-	sa_args.seq = iph2->seq;
-	sa_args.wsize = 4;
-
-	/* for mobile IPv6 */
-	if (proxy && iph2->src_id && iph2->dst_id &&
-	    ipsecdoi_transportmode(iph2->approval)) {
-		sa_args.src = iph2->src_id;
-		sa_args.dst = iph2->dst_id;
-	} else {
-		sa_args.src = iph2->src;
-		sa_args.dst = iph2->dst;
-	}
-
-	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
-		/* validity check */
-		sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id);
-		if (sa_args.satype == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proto_id %d\n", pr->proto_id);
-			return -1;
-		}
-		else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) {
-			/* no replay window for IPCOMP */
-			sa_args.wsize = 0;
-		}
-#ifdef ENABLE_SAMODE_UNSPECIFIED
-		sa_args.mode = IPSEC_MODE_ANY;
-#else
-		sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode);
-		if (sa_args.mode == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid encmode %d\n", pr->encmode);
-			return -1;
-		}
-#endif
-
-		/* set algorithm type and key length */
-		sa_args.e_keylen = pr->head->encklen;
-		if (pfkey_convertfromipsecdoi(
-				pr->proto_id,
-				pr->head->trns_id,
-				pr->head->authtype,
-				&sa_args.e_type, &sa_args.e_keylen,
-				&sa_args.a_type, &sa_args.a_keylen, 
-				&sa_args.flags) < 0)
-			return -1;
-
-#if 0
-		sa_args.l_bytes = iph2->approval->lifebyte * 1024,
-#else
-		sa_args.l_bytes = 0;
-#endif
-
-#ifdef HAVE_SECCTX
-		if (*iph2->approval->sctx.ctx_str) {
-			sa_args.ctxdoi = iph2->approval->sctx.ctx_doi;
-			sa_args.ctxalg = iph2->approval->sctx.ctx_alg;
-			sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen;
-			sa_args.ctxstr = iph2->approval->sctx.ctx_str;
-		}
-#endif /* HAVE_SECCTX */
-
-#ifdef ENABLE_NATT
-		plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2 "
-		    "(NAT flavor)\n");
-
-		if (pr->udp_encap) {
-			sa_args.l_natt_type = UDP_ENCAP_ESPINUDP;
-			sa_args.l_natt_sport = extract_port(iph2->ph1->local);
-			sa_args.l_natt_dport = extract_port(iph2->ph1->remote);
-			sa_args.l_natt_oa = NULL; // FIXME: Here comes OA!!!
-#ifdef SADB_X_EXT_NAT_T_FRAG
-			sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag;
-#endif
-		} else {
-			/* Remove port information, that SA doesn't use it */
-			set_port(sa_args.src, 0);
-			set_port(sa_args.dst, 0);
-		}
-
-#else
-		/* Remove port information, it is not used without NAT-T */
-		set_port(sa_args.src, 0);
-		set_port(sa_args.dst, 0);
-#endif
-
-		/* more info to fill in */
-		sa_args.spi = pr->spi_p;
-		sa_args.reqid = pr->reqid_out;
-		sa_args.keymat = pr->keymat_p->v;
-
-		plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2\n");
-		if (pfkey_send_add2(&sa_args) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"libipsec failed send add (%s)\n",
-				ipsec_strerror());
-			return -1;
-		}
-
-#ifndef ANDROID_PATCHED
-		if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA])
-			continue;
-
-		/*
-		 * It maybe good idea to call backupsa_to_file() after
-		 * racoon will receive the sadb_update messages.
-		 * But it is impossible because there is not key in the
-		 * information from the kernel.
-		 */
-		if (backupsa_to_file(&sa_args) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"backuped SA failed: %s\n",
-				sadbsecas2str(sa_args.src, sa_args.dst,
-				sa_args.satype, sa_args.spi, sa_args.mode));
-		}
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"backuped SA: %s\n",
-			sadbsecas2str(sa_args.src, sa_args.dst,
-			sa_args.satype, sa_args.spi, sa_args.mode));
-#endif
-	}
-	return 0;
-}
-
-static int
-pk_recvadd(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	struct ph2handle *iph2;
-	u_int sa_mode;
-
-	/* ignore this message because of local test mode. */
-	if (f_local)
-		return 0;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_SA] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb add message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-	sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-
-	sa_mode = mhp[SADB_X_EXT_SA2] == NULL
-		? IPSEC_MODE_ANY
-		: ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
-
-	/* the message has to be processed or not ? */
-	if (msg->sadb_msg_pid != getpid()) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"%s message is not interesting "
-			"because pid %d is not mine.\n",
-			s_pfkey_type(msg->sadb_msg_type),
-			msg->sadb_msg_pid);
-		return -1;
-	}
-
-	iph2 = getph2byseq(msg->sadb_msg_seq);
-	if (iph2 == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"seq %d of %s message not interesting.\n",
-			msg->sadb_msg_seq,
-			s_pfkey_type(msg->sadb_msg_type));
-		return -1;
-	}
-
-	/*
-	 * NOTE don't update any status of phase2 handle
-	 * because they must be updated by SADB_UPDATE message
-	 */
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"IPsec-SA established: %s\n",
-		sadbsecas2str(iph2->src, iph2->dst,
-			msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode));
-
-	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
-	return 0;
-}
-
-static int
-pk_recvexpire(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	struct ph2handle *iph2;
-	u_int proto_id, sa_mode;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_SA] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || (mhp[SADB_EXT_LIFETIME_HARD] != NULL
-	  && mhp[SADB_EXT_LIFETIME_SOFT] != NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb expire message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-	src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-	sa_mode = mhp[SADB_X_EXT_SA2] == NULL
-		? IPSEC_MODE_ANY
-		: ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode;
-
-	proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-	if (proto_id == ~0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid proto_id %d\n", msg->sadb_msg_satype);
-		return -1;
-	}
-
-	plog(LLV_INFO, LOCATION, NULL,
-		"IPsec-SA expired: %s\n",
-		sadbsecas2str(src, dst,
-			msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode));
-
-	iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
-	if (iph2 == NULL) {
-		/*
-		 * Ignore it because two expire messages are come up.
-		 * phase2 handler has been deleted already when 2nd message
-		 * is received.
-		 */
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"no such a SA found: %s\n",
-			sadbsecas2str(src, dst,
-			    msg->sadb_msg_satype, sa->sadb_sa_spi,
-			    sa_mode));
-		return 0;
-	}
-	if (iph2->status != PHASE2ST_ESTABLISHED) {
-		/*
-		 * If the status is not equal to PHASE2ST_ESTABLISHED,
-		 * racoon ignores this expire message.  There are two reason.
-		 * One is that the phase 2 probably starts because there is
-		 * a potential that racoon receives the acquire message
-		 * without receiving a expire message.  Another is that racoon
-		 * may receive the multiple expire messages from the kernel.
-		 */
-		plog(LLV_WARNING, LOCATION, NULL,
-			"the expire message is received "
-			"but the handler has not been established.\n");
-		return 0;
-	}
-
-	/* turn off the timer for calling isakmp_ph2expire() */ 
-	SCHED_KILL(iph2->sce);
-
-	iph2->status = PHASE2ST_EXPIRED;
-
-	/* INITIATOR, begin phase 2 exchange. */
-	/* allocate buffer for status management of pfkey message */
-	if (iph2->side == INITIATOR) {
-
-		initph2(iph2);
-
-		/* update status for re-use */
-		iph2->status = PHASE2ST_STATUS2;
-
-		/* start isakmp initiation by using ident exchange */
-		if (isakmp_post_acquire(iph2) < 0) {
-			plog(LLV_ERROR, LOCATION, iph2->dst,
-				"failed to begin ipsec sa "
-				"re-negotication.\n");
-			unbindph12(iph2);
-			remph2(iph2);
-			delph2(iph2);
-			return -1;
-		}
-
-		return 0;
-		/*NOTREACHED*/
-	}
-
-	/* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */
-	/* RESPONDER always delete ph2handle, keep silent.  RESPONDER doesn't
-	 * manage IPsec SA, so delete the list */
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-
-	return 0;
-}
-
-static int
-pk_recvacquire(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_x_policy *xpl;
-	struct secpolicy *sp_out = NULL, *sp_in = NULL;
-#define MAXNESTEDSA	5	/* XXX */
-	struct ph2handle *iph2[MAXNESTEDSA];
-	struct sockaddr *src, *dst;
-	int n;	/* # of phase 2 handler */
-	int remoteid=0;
-#ifdef HAVE_SECCTX
-	struct sadb_x_sec_ctx *m_sec_ctx;
-#endif /* HAVE_SECCTX */
-	struct policyindex spidx;
-
-
-	/* ignore this message because of local test mode. */
-	if (f_local)
-		return 0;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb acquire message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-#ifdef HAVE_SECCTX
-	m_sec_ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-
-	if (m_sec_ctx != NULL) {
-		plog(LLV_INFO, LOCATION, NULL, "security context doi: %u\n",
-		     m_sec_ctx->sadb_x_ctx_doi);
-		plog(LLV_INFO, LOCATION, NULL, 
-		     "security context algorithm: %u\n",
-		     m_sec_ctx->sadb_x_ctx_alg);
-		plog(LLV_INFO, LOCATION, NULL, "security context length: %u\n",
-		     m_sec_ctx->sadb_x_ctx_len);
-		plog(LLV_INFO, LOCATION, NULL, "security context: %s\n",
-		     ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx)));
-	}
-#endif /* HAVE_SECCTX */
-
-	/* ignore if type is not IPSEC_POLICY_IPSEC */
-	if (xpl->sadb_x_policy_type != IPSEC_POLICY_IPSEC) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"ignore ACQUIRE message. type is not IPsec.\n");
-		return 0;
-	}
-
-	/* ignore it if src is multicast address */
-    {
-	struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-	if ((sa->sa_family == AF_INET
-	  && IN_MULTICAST(ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr)))
-#ifdef INET6
-	 || (sa->sa_family == AF_INET6
-	  && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)sa)->sin6_addr))
-#endif
-	) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"ignore due to multicast address: %s.\n",
-			saddrwop2str(sa));
-		return 0;
-	}
-    }
-   	
-    	/* ignore, if we do not listen on source address */
-	{
-		/* reasons behind:
-		 * - if we'll contact peer from address we do not listen -
-		 *   we will be unable to complete negotiation;
-		 * - if we'll negotiate using address we're listening -
-		 *   remote peer will send packets to address different
-		 *   than one in the policy, so kernel will drop them;
-		 * => therefore this acquire is not for us! --Aidas
-		 */
-		struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-		struct myaddrs *p;
-		int do_listen = 0;
-		for (p = lcconf->myaddrs; p; p = p->next) {
-			if (!cmpsaddrwop(p->addr, sa)) {
-				do_listen = 1;
-				break;
-			}
-		}
-
-		if (!do_listen) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"ignore because do not listen on source address : %s.\n",
-				saddrwop2str(sa));
-			return 0;
-		}
-	}
-
-	/*
-	 * If there is a phase 2 handler against the policy identifier in
-	 * the acquire message, and if
-	 *    1. its state is less than PHASE2ST_ESTABLISHED, then racoon
-	 *       should ignore such a acquire message because the phase 2
-	 *       is just negotiating.
-	 *    2. its state is equal to PHASE2ST_ESTABLISHED, then racoon
-	 *       has to prcesss such a acquire message because racoon may
-	 *       lost the expire message.
-	 */
-	iph2[0] = getph2byid(src, dst, xpl->sadb_x_policy_id);
-	if (iph2[0] != NULL) {
-		if (iph2[0]->status < PHASE2ST_ESTABLISHED) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"ignore the acquire because ph2 found\n");
-			return -1;
-		}
-		if (iph2[0]->status == PHASE2ST_EXPIRED)
-			iph2[0] = NULL;
-		/*FALLTHROUGH*/
-	}
-
-	/* search for proper policyindex */
-	sp_out = getspbyspid(xpl->sadb_x_policy_id);
-	if (sp_out == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "no policy found: id:%d.\n",
-			xpl->sadb_x_policy_id);
-		return -1;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"suitable outbound SP found: %s.\n", spidx2str(&sp_out->spidx));
-
-	/* get inbound policy */
-    {
-
-	memset(&spidx, 0, sizeof(spidx));
-	spidx.dir = IPSEC_DIR_INBOUND;
-	memcpy(&spidx.src, &sp_out->spidx.dst, sizeof(spidx.src));
-	memcpy(&spidx.dst, &sp_out->spidx.src, sizeof(spidx.dst));
-	spidx.prefs = sp_out->spidx.prefd;
-	spidx.prefd = sp_out->spidx.prefs;
-	spidx.ul_proto = sp_out->spidx.ul_proto;
-
-#ifdef HAVE_SECCTX
-	if (m_sec_ctx) {
-		spidx.sec_ctx.ctx_doi = m_sec_ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_alg = m_sec_ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_strlen = m_sec_ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str,
-		      ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx)),
-		      spidx.sec_ctx.ctx_strlen);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp_in = getsp(&spidx);
-	if (sp_in) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"suitable inbound SP found: %s.\n",
-			spidx2str(&sp_in->spidx));
-	} else {
-		plog(LLV_NOTIFY, LOCATION, NULL,
-			"no in-bound policy found: %s\n",
-			spidx2str(&spidx));
-	}
-    }
-
-	memset(iph2, 0, MAXNESTEDSA);
-
-	n = 0;
-
-	/* allocate a phase 2 */
-	iph2[n] = newph2();
-	if (iph2[n] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate phase2 entry.\n");
-		return -1;
-	}
-	iph2[n]->side = INITIATOR;
-	iph2[n]->spid = xpl->sadb_x_policy_id;
-	iph2[n]->satype = msg->sadb_msg_satype;
-	iph2[n]->seq = msg->sadb_msg_seq;
-	iph2[n]->status = PHASE2ST_STATUS2;
-
-	/* set end addresses of SA */
-	iph2[n]->dst = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]));
-	if (iph2[n]->dst == NULL) {
-		delph2(iph2[n]);
-		return -1;
-	}
-	iph2[n]->src = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]));
-	if (iph2[n]->src == NULL) {
-		delph2(iph2[n]);
-		return -1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"new acquire %s\n", spidx2str(&sp_out->spidx));
-
-	/* get sainfo */
-    {
-	vchar_t *idsrc, *iddst;
-
-	idsrc = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.src,
-				sp_out->spidx.prefs, sp_out->spidx.ul_proto);
-	if (idsrc == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID for %s\n",
-			spidx2str(&sp_out->spidx));
-		delph2(iph2[n]);
-		return -1;
-	}
-	iddst = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.dst,
-				sp_out->spidx.prefd, sp_out->spidx.ul_proto);
-	if (iddst == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get ID for %s\n",
-			spidx2str(&sp_out->spidx));
-		vfree(idsrc);
-		delph2(iph2[n]);
-		return -1;
-	}
-	{
-		struct remoteconf *conf;
-		conf = getrmconf(iph2[n]->dst);
-		if (conf != NULL)
-			remoteid=conf->ph1id;
-		else{
-			plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
-			remoteid=0;
-		}
-	}
-	iph2[n]->sainfo = getsainfo(idsrc, iddst, NULL, remoteid);
-	vfree(idsrc);
-	vfree(iddst);
-	if (iph2[n]->sainfo == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get sainfo.\n");
-		delph2(iph2[n]);
-		return -1;
-		/* XXX should use the algorithm list from register message */
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"selected sainfo: %s\n", sainfo2str(iph2[n]->sainfo));
-    }
-
-	if (set_proposal_from_policy(iph2[n], sp_out, sp_in) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to create saprop.\n");
-		delph2(iph2[n]);
-		return -1;
-	}
-#ifdef HAVE_SECCTX
-	if (m_sec_ctx) {
-		set_secctx_in_proposal(iph2[n], spidx);
-	}
-#endif /* HAVE_SECCTX */
-
-	insph2(iph2[n]);
-
-	/* start isakmp initiation by using ident exchange */
-	/* XXX should be looped if there are multiple phase 2 handler. */
-	if (isakmp_post_acquire(iph2[n]) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to begin ipsec sa negotication.\n");
-		goto err;
-	}
-
-	return 0;
-
-err:
-	while (n >= 0) {
-		unbindph12(iph2[n]);
-		remph2(iph2[n]);
-		delph2(iph2[n]);
-		iph2[n] = NULL;
-		n--;
-	}
-	return -1;
-}
-
-static int
-pk_recvdelete(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_sa *sa;
-	struct sockaddr *src, *dst;
-	struct ph2handle *iph2 = NULL;
-	u_int proto_id;
-
-	/* ignore this message because of local test mode. */
-	if (f_local)
-		return 0;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_SA] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb delete message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-	sa = (struct sadb_sa *)mhp[SADB_EXT_SA];
-	src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
-	dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
-
-	/* the message has to be processed or not ? */
-	if (msg->sadb_msg_pid == getpid()) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"%s message is not interesting "
-			"because the message was originated by me.\n",
-			s_pfkey_type(msg->sadb_msg_type));
-		return -1;
-	}
-
-	proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
-	if (proto_id == ~0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid proto_id %d\n", msg->sadb_msg_satype);
-		return -1;
-	}
-
-	iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
-	if (iph2 == NULL) {
-		/* ignore */
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no iph2 found: %s\n",
-			sadbsecas2str(src, dst, msg->sadb_msg_satype,
-				sa->sadb_sa_spi, IPSEC_MODE_ANY));
-		return 0;
-	}
-
-	plog(LLV_ERROR, LOCATION, NULL,
-		"pfkey DELETE received: %s\n",
-		sadbsecas2str(iph2->src, iph2->dst,
-			msg->sadb_msg_satype, sa->sadb_sa_spi, IPSEC_MODE_ANY));
-
-	/* send delete information */
-	if (iph2->status == PHASE2ST_ESTABLISHED)
-		isakmp_info_send_d2(iph2);
-
-	unbindph12(iph2);
-	remph2(iph2);
-	delph2(iph2);
-
-	return 0;
-}
-
-static int
-pk_recvflush(mhp)
-	caddr_t *mhp;
-{
-	/* ignore this message because of local test mode. */
-	if (f_local)
-		return 0;
-
-	/* sanity check */
-	if (mhp[0] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb flush message passed.\n");
-		return -1;
-	}
-
-	flushph2();
-
-	return 0;
-}
-
-static int
-getsadbpolicy(policy0, policylen0, type, iph2)
-	caddr_t *policy0;
-	int *policylen0, type;
-	struct ph2handle *iph2;
-{
-	struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
-	struct sadb_x_policy *xpl;
-	struct sadb_x_ipsecrequest *xisr;
-	struct saproto *pr;
-	struct saproto **pr_rlist;
-	int rlist_len = 0;
-	caddr_t policy, p;
-	int policylen;
-	int xisrlen;
-	u_int satype, mode;
-	int len = 0;
-#ifdef HAVE_SECCTX
-	int ctxlen = 0;
-#endif /* HAVE_SECCTX */
-
-
-	/* get policy buffer size */
-	policylen = sizeof(struct sadb_x_policy);
-	if (type != SADB_X_SPDDELETE) {
-		for (pr = iph2->approval->head; pr; pr = pr->next) {
-			xisrlen = sizeof(*xisr);
-			if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) {
-				xisrlen += (sysdep_sa_len(iph2->src)
-				          + sysdep_sa_len(iph2->dst));
-			}
-
-			policylen += PFKEY_ALIGN8(xisrlen);
-		}
-	}
-
-#ifdef HAVE_SECCTX
-	if (*spidx->sec_ctx.ctx_str) {
-		ctxlen = sizeof(struct sadb_x_sec_ctx)
-				+ PFKEY_ALIGN8(spidx->sec_ctx.ctx_strlen);
-		policylen += ctxlen;
-	}
-#endif /* HAVE_SECCTX */
-
-	/* make policy structure */
-	policy = racoon_malloc(policylen);
-	memset((void*)policy, 0xcd, policylen);
-	if (!policy) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"buffer allocation failed.\n");
-		return -1;
-	}
-
-	xpl = (struct sadb_x_policy *)policy;
-	xpl->sadb_x_policy_len = PFKEY_UNIT64(policylen);
-	xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
-	xpl->sadb_x_policy_type = IPSEC_POLICY_IPSEC;
-	xpl->sadb_x_policy_dir = spidx->dir;
-	xpl->sadb_x_policy_id = 0;
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	xpl->sadb_x_policy_priority = PRIORITY_DEFAULT;
-#endif
-	len++;
-
-#ifdef HAVE_SECCTX
-	if (*spidx->sec_ctx.ctx_str) {
-		struct sadb_x_sec_ctx *p;
-
-		p = (struct sadb_x_sec_ctx *)(xpl + len);
-		memset(p, 0, ctxlen);
-		p->sadb_x_sec_len = PFKEY_UNIT64(ctxlen);
-		p->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX;
-		p->sadb_x_ctx_len = spidx->sec_ctx.ctx_strlen;
-		p->sadb_x_ctx_doi = spidx->sec_ctx.ctx_doi;
-		p->sadb_x_ctx_alg = spidx->sec_ctx.ctx_alg;
- 
-		memcpy(p + 1,spidx->sec_ctx.ctx_str,spidx->sec_ctx.ctx_strlen);
-		len += ctxlen;
-	}
-#endif /* HAVE_SECCTX */
-
-	/* no need to append policy information any more if type is SPDDELETE */
-	if (type == SADB_X_SPDDELETE)
-		goto end;
-
-	xisr = (struct sadb_x_ipsecrequest *)(xpl + len);
-
-	/* The order of things is reversed for use in add policy messages */
-	for (pr = iph2->approval->head; pr; pr = pr->next) rlist_len++;
-	pr_rlist = racoon_malloc((rlist_len+1)*sizeof(struct saproto*));
-	if (!pr_rlist) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"buffer allocation failed.\n");
-		return -1;
-	}
-	pr_rlist[rlist_len--] = NULL;
-	for (pr = iph2->approval->head; pr; pr = pr->next) pr_rlist[rlist_len--] = pr;
-	rlist_len = 0;
-
-	for (pr = pr_rlist[rlist_len++]; pr; pr = pr_rlist[rlist_len++]) {
-
-		satype = doi2ipproto(pr->proto_id);
-		if (satype == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid proto_id %d\n", pr->proto_id);
-			goto err;
-		}
-		mode = ipsecdoi2pfkey_mode(pr->encmode);
-		if (mode == ~0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid encmode %d\n", pr->encmode);
-			goto err;
-		}
-
-		/* 
-		 * the policy level cannot be unique because the policy
-		 * is defined later than SA, so req_id cannot be bound to SA.
-		 */
-		xisr->sadb_x_ipsecrequest_proto = satype;
-		xisr->sadb_x_ipsecrequest_mode = mode;
-		if(iph2->proposal->head->reqid_in > 0){
-			xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE;
-			xisr->sadb_x_ipsecrequest_reqid = iph2->proposal->head->reqid_in;
-		}else{
-			xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE;
-			xisr->sadb_x_ipsecrequest_reqid = 0;
-		}
-		p = (caddr_t)(xisr + 1);
-
-		xisrlen = sizeof(*xisr);
-
-		if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) {
-			int src_len, dst_len;
-
-			src_len = sysdep_sa_len(iph2->src);
-			dst_len = sysdep_sa_len(iph2->dst);
-			xisrlen += src_len + dst_len;
-
-			memcpy(p, iph2->src, src_len);
-			p += src_len;
-
-			memcpy(p, iph2->dst, dst_len);
-			p += dst_len;
-		}
-
-		xisr->sadb_x_ipsecrequest_len = PFKEY_ALIGN8(xisrlen);
-		xisr = (struct sadb_x_ipsecrequest *)p;
-		
-	}
-	racoon_free(pr_rlist);
-
-end:
-	*policy0 = policy;
-	*policylen0 = policylen;
-
-	return 0;
-
-err:
-	if (policy)
-		racoon_free(policy);
-	if (pr_rlist) racoon_free(pr_rlist);
-
-	return -1;
-}
-
-int
-pk_sendspdupdate2(iph2)
-	struct ph2handle *iph2;
-{
-	struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
-	caddr_t policy = NULL;
-	int policylen = 0;
-	u_int64_t ltime, vtime;
-
-	ltime = iph2->approval->lifetime;
-	vtime = 0;
-
-	if (getsadbpolicy(&policy, &policylen, SADB_X_SPDUPDATE, iph2)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getting sadb policy failed.\n");
-		return -1;
-	}
-
-	if (pfkey_send_spdupdate2(
-			lcconf->sock_pfkey,
-			(struct sockaddr *)&spidx->src,
-			spidx->prefs,
-			(struct sockaddr *)&spidx->dst,
-			spidx->prefd,
-			spidx->ul_proto,
-			ltime, vtime,
-			policy, policylen, 0) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed send spdupdate2 (%s)\n",
-			ipsec_strerror());
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdupdate2\n");
-
-end:
-	if (policy)
-		racoon_free(policy);
-
-	return 0;
-}
-
-static int
-pk_recvspdupdate(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
- 	struct sadb_lifetime *lt;
-	struct policyindex spidx;
-	struct secpolicy *sp;
- 	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spdupdate message passed.\n");
-		return -1;
-	}
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp = getsp(&spidx);
-	if (sp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"such policy does not already exist: \"%s\"\n",
-			spidx2str(&spidx));
-	} else {
-		remsp(sp);
-		delsp(sp);
-	}
-
-	if (addnewsp(mhp) < 0)
-		return -1;
-
-	return 0;
-}
-
-/*
- * this function has to be used by responder side.
- */
-int
-pk_sendspdadd2(iph2)
-	struct ph2handle *iph2;
-{
-	struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
-	caddr_t policy = NULL;
-	int policylen = 0;
-	u_int64_t ltime, vtime;
-
-	ltime = iph2->approval->lifetime;
-	vtime = 0;
-
-	if (getsadbpolicy(&policy, &policylen, SADB_X_SPDADD, iph2)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getting sadb policy failed.\n");
-		return -1;
-	}
-
-	if (pfkey_send_spdadd2(
-			lcconf->sock_pfkey,
-			(struct sockaddr *)&spidx->src,
-			spidx->prefs,
-			(struct sockaddr *)&spidx->dst,
-			spidx->prefd,
-			spidx->ul_proto,
-			ltime, vtime,
-			policy, policylen, 0) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed send spdadd2 (%s)\n",
-			ipsec_strerror());
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdadd2\n");
-
-end:
-	if (policy)
-		racoon_free(policy);
-
-	return 0;
-}
-
-static int
-pk_recvspdadd(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
-	struct sadb_lifetime *lt;
-	struct policyindex spidx;
-	struct secpolicy *sp;
-	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spdadd message passed.\n");
-		return -1;
-	}
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp = getsp(&spidx);
-	if (sp != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"such policy already exists. "
-			"anyway replace it: %s\n",
-			spidx2str(&spidx));
-		remsp(sp);
-		delsp(sp);
-	}
-
-	if (addnewsp(mhp) < 0)
-		return -1;
-
-	return 0;
-}
-
-/*
- * this function has to be used by responder side.
- */
-int
-pk_sendspddelete(iph2)
-	struct ph2handle *iph2;
-{
-	struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen;
-	caddr_t policy = NULL;
-	int policylen;
-
-	if (getsadbpolicy(&policy, &policylen, SADB_X_SPDDELETE, iph2)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getting sadb policy failed.\n");
-		return -1;
-	}
-
-	if (pfkey_send_spddelete(
-			lcconf->sock_pfkey,
-			(struct sockaddr *)&spidx->src,
-			spidx->prefs,
-			(struct sockaddr *)&spidx->dst,
-			spidx->prefd,
-			spidx->ul_proto,
-			policy, policylen, 0) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"libipsec failed send spddelete (%s)\n",
-			ipsec_strerror());
-		goto end;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spddelete\n");
-
-end:
-	if (policy)
-		racoon_free(policy);
-
-	return 0;
-}
-
-static int
-pk_recvspddelete(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
-	struct sadb_lifetime *lt;
-	struct policyindex spidx;
-	struct secpolicy *sp;
-	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spddelete message passed.\n");
-		return -1;
-	}
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp = getsp(&spidx);
-	if (sp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no policy found: %s\n",
-			spidx2str(&spidx));
-		return -1;
-	}
-
-	remsp(sp);
-	delsp(sp);
-
-	return 0;
-}
-
-static int
-pk_recvspdexpire(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
-	struct sadb_lifetime *lt;
-	struct policyindex spidx;
-	struct secpolicy *sp;
-	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[0] == NULL
-	 || mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spdexpire message passed.\n");
-		return -1;
-	}
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp = getsp(&spidx);
-	if (sp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"no policy found: %s\n",
-			spidx2str(&spidx));
-		return -1;
-	}
-
-	remsp(sp);
-	delsp(sp);
-
-	return 0;
-}
-
-static int
-pk_recvspdget(mhp)
-	caddr_t *mhp;
-{
-	/* sanity check */
-	if (mhp[0] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spdget message passed.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static int
-pk_recvspddump(mhp)
-	caddr_t *mhp;
-{
-	struct sadb_msg *msg;
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
-	struct sadb_lifetime *lt;
-	struct policyindex spidx;
-	struct secpolicy *sp;
-	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[0] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spddump message passed.\n");
-		return -1;
-	}
-	msg = (struct sadb_msg *)mhp[0];
-
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-	if (saddr == NULL || daddr == NULL || xpl == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spddump message passed.\n");
-		return -1;
-	}
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	sp = getsp(&spidx);
-	if (sp != NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"such policy already exists. "
-			"anyway replace it: %s\n",
-			spidx2str(&spidx));
-		remsp(sp);
-		delsp(sp);
-	}
-
-	if (addnewsp(mhp) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int
-pk_recvspdflush(mhp)
-	caddr_t *mhp;
-{
-	/* sanity check */
-	if (mhp[0] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spdflush message passed.\n");
-		return -1;
-	}
-
-	flushsp();
-
-	return 0;
-}
-
-#ifndef ANDROID_PATCHED
-
-/*
- * send error against acquire message to kenrel.
- */
-int
-pk_sendeacquire(iph2)
-	struct ph2handle *iph2;
-{
-	struct sadb_msg *newmsg;
-	int len;
-
-	len = sizeof(struct sadb_msg);
-	newmsg = racoon_calloc(1, len);
-	if (newmsg == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get buffer to send acquire.\n");
-		return -1;
-	}
-
-	memset(newmsg, 0, len);
-	newmsg->sadb_msg_version = PF_KEY_V2;
-	newmsg->sadb_msg_type = SADB_ACQUIRE;
-	newmsg->sadb_msg_errno = ENOENT;	/* XXX */
-	newmsg->sadb_msg_satype = iph2->satype;
-	newmsg->sadb_msg_len = PFKEY_UNIT64(len);
-	newmsg->sadb_msg_reserved = 0;
-	newmsg->sadb_msg_seq = iph2->seq;
-	newmsg->sadb_msg_pid = (u_int32_t)getpid();
-
-	/* send message */
-	len = pfkey_send(lcconf->sock_pfkey, newmsg, len);
-
-	racoon_free(newmsg);
-
-	return 0;
-}
-
-#else
-
-int pk_sendeacquire(struct ph2handle *iph2)
-{
-	exit(1);
-}
-
-#endif
-
-/*
- * check if the algorithm is supported or not.
- * OUT	 0: ok
- *	-1: ng
- */
-int
-pk_checkalg(class, calg, keylen)
-	int class, calg, keylen;
-{
-	int sup, error;
-	u_int alg;
-	struct sadb_alg alg0;
-
-	switch (algclass2doi(class)) {
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		sup = SADB_EXT_SUPPORTED_ENCRYPT;
-		break;
-	case IPSECDOI_ATTR_AUTH:
-		sup = SADB_EXT_SUPPORTED_AUTH;
-		break;
-	case IPSECDOI_PROTO_IPCOMP:
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"compression algorithm can not be checked "
-			"because sadb message doesn't support it.\n");
-		return 0;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid algorithm class.\n");
-		return -1;
-	}
-	alg = ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg));
-	if (alg == ~0)
-		return -1;
-
-	if (keylen == 0) {
-		if (ipsec_get_keylen(sup, alg, &alg0)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"%s.\n", ipsec_strerror());
-			return -1;
-		}
-		keylen = alg0.sadb_alg_minbits;
-	}
-
-	error = ipsec_check_keylen(sup, alg, keylen);
-	if (error)
-		plog(LLV_ERROR, LOCATION, NULL,
-			"%s.\n", ipsec_strerror());
-
-	return error;
-}
-
-/*
- * differences with pfkey_recv() in libipsec/pfkey.c:
- * - never performs busy wait loop.
- * - returns NULL and set *lenp to negative on fatal failures
- * - returns NULL and set *lenp to non-negative on non-fatal failures
- * - returns non-NULL on success
- */
-static struct sadb_msg *
-pk_recv(so, lenp)
-	int so;
-	int *lenp;
-{
-	struct sadb_msg buf, *newmsg;
-	int reallen;
-	int retry = 0;
-
-	*lenp = -1;
-	do
-	{
-	    plog(LLV_DEBUG, LOCATION, NULL, "pk_recv: retry[%d] recv() \n", retry );
-	    *lenp = recv(so, (caddr_t)&buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT);
-	    retry++;
-	}
-	while (*lenp < 0 && errno == EAGAIN && retry < 3);
-
-	if (*lenp < 0)
-		return NULL;	/*fatal*/
-
-	else if (*lenp < sizeof(buf))
-		return NULL;
-
-	reallen = PFKEY_UNUNIT64(buf.sadb_msg_len);
-	if ((newmsg = racoon_calloc(1, reallen)) == NULL)
-		return NULL;
-
-	*lenp = recv(so, (caddr_t)newmsg, reallen, MSG_PEEK);
-	if (*lenp < 0) {
-		racoon_free(newmsg);
-		return NULL;	/*fatal*/
-	} else if (*lenp != reallen) {
-		racoon_free(newmsg);
-		return NULL;
-	}
-
-	*lenp = recv(so, (caddr_t)newmsg, reallen, 0);
-	if (*lenp < 0) {
-		racoon_free(newmsg);
-		return NULL;	/*fatal*/
-	} else if (*lenp != reallen) {
-		racoon_free(newmsg);
-		return NULL;
-	}
-
-	return newmsg;
-}
-
-/* see handler.h */
-u_int32_t
-pk_getseq()
-{
-	return eay_random();
-}
-
-static int
-addnewsp(mhp)
-	caddr_t *mhp;
-{
-	struct secpolicy *new = NULL;
-	struct sadb_address *saddr, *daddr;
-	struct sadb_x_policy *xpl;
-	struct sadb_lifetime *lt;
-	u_int64_t created;
-
-	/* sanity check */
-	if (mhp[SADB_EXT_ADDRESS_SRC] == NULL
-	 || mhp[SADB_EXT_ADDRESS_DST] == NULL
-	 || mhp[SADB_X_EXT_POLICY] == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"inappropriate sadb spd management message passed.\n");
-		goto bad;
-	}
-
-	saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC];
-	daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST];
-	xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY];
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-	lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD];
-	if(lt != NULL)
-		created = lt->sadb_lifetime_addtime;
-	else
-		created = 0;
-
-#ifdef __linux__
-	/* bsd skips over per-socket policies because there will be no
-	 * src and dst extensions in spddump messages. On Linux the only
-	 * way to achieve the same is check for policy id.
-	 */
-	if (xpl->sadb_x_policy_id % 8 >= 3) return 0;
-#endif
-
-	new = newsp();
-	if (new == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer\n");
-		goto bad;
-	}
-
-	new->spidx.dir = xpl->sadb_x_policy_dir;
-	new->id = xpl->sadb_x_policy_id;
-	new->policy = xpl->sadb_x_policy_type;
-	new->req = NULL;
-
-	/* check policy */
-	switch (xpl->sadb_x_policy_type) {
-	case IPSEC_POLICY_DISCARD:
-	case IPSEC_POLICY_NONE:
-	case IPSEC_POLICY_ENTRUST:
-	case IPSEC_POLICY_BYPASS:
-		break;
-
-	case IPSEC_POLICY_IPSEC:
-	    {
-		int tlen;
-		struct sadb_x_ipsecrequest *xisr;
-		struct ipsecrequest **p_isr = &new->req;
-
-		/* validity check */
-		if (PFKEY_EXTLEN(xpl) < sizeof(*xpl)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid msg length.\n");
-			goto bad;
-		}
-
-		tlen = PFKEY_EXTLEN(xpl) - sizeof(*xpl);
-		xisr = (struct sadb_x_ipsecrequest *)(xpl + 1);
-
-		while (tlen > 0) {
-
-			/* length check */
-			if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid msg length.\n");
-				goto bad;
-			}
-
-			/* allocate request buffer */
-			*p_isr = newipsecreq();
-			if (*p_isr == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get new ipsecreq.\n");
-				goto bad;
-			}
-
-			/* set values */
-			(*p_isr)->next = NULL;
-
-			switch (xisr->sadb_x_ipsecrequest_proto) {
-			case IPPROTO_ESP:
-			case IPPROTO_AH:
-			case IPPROTO_IPCOMP:
-				break;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid proto type: %u\n",
-					xisr->sadb_x_ipsecrequest_proto);
-				goto bad;
-			}
-			(*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto;
-
-			switch (xisr->sadb_x_ipsecrequest_mode) {
-			case IPSEC_MODE_TRANSPORT:
-			case IPSEC_MODE_TUNNEL:
-				break;
-			case IPSEC_MODE_ANY:
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid mode: %u\n",
-					xisr->sadb_x_ipsecrequest_mode);
-				goto bad;
-			}
-			(*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode;
-
-			switch (xisr->sadb_x_ipsecrequest_level) {
-			case IPSEC_LEVEL_DEFAULT:
-			case IPSEC_LEVEL_USE:
-			case IPSEC_LEVEL_REQUIRE:
-				break;
-			case IPSEC_LEVEL_UNIQUE:
-				(*p_isr)->saidx.reqid =
-					xisr->sadb_x_ipsecrequest_reqid;
-				break;
-
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"invalid level: %u\n",
-					xisr->sadb_x_ipsecrequest_level);
-				goto bad;
-			}
-			(*p_isr)->level = xisr->sadb_x_ipsecrequest_level;
-
-			/* set IP addresses if there */
-			if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
-				struct sockaddr *paddr;
-
-				paddr = (struct sockaddr *)(xisr + 1);
-				bcopy(paddr, &(*p_isr)->saidx.src,
-					sysdep_sa_len(paddr));
-
-				paddr = (struct sockaddr *)((caddr_t)paddr
-							+ sysdep_sa_len(paddr));
-				bcopy(paddr, &(*p_isr)->saidx.dst,
-					sysdep_sa_len(paddr));
-			}
-
-			(*p_isr)->sp = new;
-
-			/* initialization for the next. */
-			p_isr = &(*p_isr)->next;
-			tlen -= xisr->sadb_x_ipsecrequest_len;
-
-			/* validity check */
-			if (tlen < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"becoming tlen < 0\n");
-			}
-
-			xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr
-			                 + xisr->sadb_x_ipsecrequest_len);
-		}
-	    }
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid policy type.\n");
-		goto bad;
-	}
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			xpl->sadb_x_policy_priority,
-			created,
-			&new->spidx);
-#else
-	KEY_SETSECSPIDX(xpl->sadb_x_policy_dir,
-			saddr + 1,
-			daddr + 1,
-			saddr->sadb_address_prefixlen,
-			daddr->sadb_address_prefixlen,
-			saddr->sadb_address_proto,
-			created,
-			&new->spidx);
-#endif
-
-#ifdef HAVE_SECCTX
-	if (mhp[SADB_X_EXT_SEC_CTX] != NULL) {
-		struct sadb_x_sec_ctx *ctx;
-
-		ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX];
-		new->spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg;
-		new->spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi;
-		new->spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len;
-		memcpy(new->spidx.sec_ctx.ctx_str,ctx + 1,ctx->sadb_x_ctx_len);
-	}
-#endif /* HAVE_SECCTX */
-
-	inssp(new);
-
-	return 0;
-bad:
-	if (new != NULL) {
-		if (new->req != NULL)
-			racoon_free(new->req);
-		racoon_free(new);
-	}
-	return -1;
-}
-
-/* proto/mode/src->dst spi */
-const char *
-sadbsecas2str(src, dst, proto, spi, mode)
-	struct sockaddr *src, *dst;
-	int proto;
-	u_int32_t spi;
-	int mode;
-{
-	static char buf[256];
-	u_int doi_proto, doi_mode = 0;
-	char *p;
-	int blen, i;
-
-	doi_proto = pfkey2ipsecdoi_proto(proto);
-	if (doi_proto == ~0)
-		return NULL;
-	if (mode) {
-		doi_mode = pfkey2ipsecdoi_mode(mode);
-		if (doi_mode == ~0)
-			return NULL;
-	}
-
-	blen = sizeof(buf) - 1;
-	p = buf;
-
-	i = snprintf(p, blen, "%s%s%s ",
-		s_ipsecdoi_proto(doi_proto),
-		mode ? "/" : "",
-		mode ? s_ipsecdoi_encmode(doi_mode) : "");
-	if (i < 0 || i >= blen)
-		return NULL;
-	p += i;
-	blen -= i;
-
-	i = snprintf(p, blen, "%s->", saddr2str(src));
-	if (i < 0 || i >= blen)
-		return NULL;
-	p += i;
-	blen -= i;
-
-	i = snprintf(p, blen, "%s ", saddr2str(dst));
-	if (i < 0 || i >= blen)
-		return NULL;
-	p += i;
-	blen -= i;
-
-	if (spi) {
-		snprintf(p, blen, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi),
-		    (unsigned long)ntohl(spi));
-	}
-
-	return buf;
-}
diff --git a/src/racoon/pfkey.h b/src/racoon/pfkey.h
deleted file mode 100644
index 547f94a..0000000
--- a/src/racoon/pfkey.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*	$NetBSD: pfkey.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: pfkey.h,v 1.3 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _PFKEY_H
-#define _PFKEY_H
-
-struct pfkey_satype {
-	u_int8_t	ps_satype;
-	const char	*ps_name;
-};
-
-extern const struct pfkey_satype pfkey_satypes[];
-extern const int pfkey_nsatypes;
-
-extern int pfkey_handler __P((void));
-extern vchar_t *pfkey_dump_sadb __P((int));
-extern void pfkey_flush_sadb __P((u_int));
-extern int pfkey_init __P((void));
-
-extern struct pfkey_st *pfkey_getpst __P((caddr_t *, int, int));
-
-extern int pk_checkalg __P((int, int, int));
-
-struct ph2handle;
-extern int pk_sendgetspi __P((struct ph2handle *));
-extern int pk_sendupdate __P((struct ph2handle *));
-extern int pk_sendadd __P((struct ph2handle *));
-extern int pk_sendeacquire __P((struct ph2handle *));
-extern int pk_sendspdupdate2 __P((struct ph2handle *));
-extern int pk_sendspdadd2 __P((struct ph2handle *));
-extern int pk_sendspddelete __P((struct ph2handle *));
-
-extern void pfkey_timeover_stub __P((void *));
-extern void pfkey_timeover __P((struct ph2handle *));
-
-extern u_int pfkey2ipsecdoi_proto __P((u_int));
-extern u_int ipsecdoi2pfkey_proto __P((u_int));
-extern u_int pfkey2ipsecdoi_mode __P((u_int));
-extern u_int ipsecdoi2pfkey_mode __P((u_int));
-
-extern int pfkey_convertfromipsecdoi __P(( u_int, u_int, u_int,
-	u_int *, u_int *, u_int *, u_int *, u_int *));
-extern u_int32_t pk_getseq __P((void));
-extern const char *sadbsecas2str
-	__P((struct sockaddr *, struct sockaddr *, int, u_int32_t, int));
-
-#endif /* _PFKEY_H */
diff --git a/src/racoon/plainrsa-gen.8 b/src/racoon/plainrsa-gen.8
deleted file mode 100644
index 377de2d..0000000
--- a/src/racoon/plainrsa-gen.8
+++ /dev/null
@@ -1,138 +0,0 @@
-.\"	$NetBSD: plainrsa-gen.8,v 1.13 2006/09/19 18:54:39 wiz Exp $
-.\"
-.\" Id: plainrsa-gen.8,v 1.4 2005/04/18 11:07:55 manubsd Exp
-.\"
-.\" Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
-.\" Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the project nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd June 14, 2004
-.Dt PLAINRSA-GEN 8
-.Os
-.\"
-.Sh NAME
-.Nm plainrsa-gen
-.Nd generator for Plain RSA keys
-.\"
-.Sh SYNOPSIS
-.Nm plainrsa-gen
-.Bk -words
-.Op Fl b Ar bits
-.Op Fl e Ar pubexp
-.Op Fl f Ar outfile
-.Op Fl h
-.Ek
-.\"
-.Sh DESCRIPTION
-.Nm
-can be used to generate
-.Li Plain RSA keys
-for authentication purposes.
-Using
-.Li Plain RSA keys
-is optional.
-Other possibilities are
-.Li Pre-shared keys
-or
-.Li X.509 certificates .
-.\"
-.Bl -tag -width Ds
-.It Fl b Ar bits
-bit length of the key.
-Default is
-.Li 1024 ,
-recommended length is
-.Li 2048
-or even
-.Li 4096
-bits.
-Note that generating longer keys takes longer time.
-.It Fl e Ar pubexp
-value of RSA public exponent.
-Default is
-.Li 0x3 .
-Don't change this unless you really know what you are doing!
-.It Fl f Ar outfile
-.Ar outfile
-instead of
-.Li stdout .
-If the file already exists it won't be overwritten.
-You wouldn't like to lose your private key by accident, would you?
-.El
-.\"
-.Sh OUTPUT FILE FORMAT
-This is the secret
-.Li private key
-that should
-.Ic never
-leave your computer:
-.Bd -literal
-: RSA	{
-	# RSA 1024 bits
-	# pubkey=0sAQOrWlcwbAIdNSMhDt...
-	Modulus: 0xab5a57306c021d3523...
-	PublicExponent: 0x03
-	PrivateExponent: 0x723c3a2048...
-	Prime1: 0xd309b30e6adf9d85c01...
-	Prime2: 0xcfdc2a8aa5b2b3c90e3...
-	Exponent1: 0x8cb122099c9513ae...
-	Exponent2: 0x8a92c7071921cd30...
-	Coefficient: 0x722751305eafe9...
-  }
-.Ed
-.Pp
-The line
-.Li pubkey=0sAQOrW...
-of the
-.Li private key
-contains a
-.Li public key
-that should be stored in the other peer's configuration in this format:
-.Bd -literal
-: PUB 0sAQOrWlcwbAIdNSMhDt...
-.Ed
-.\"
-.Pp
-You can also specify
-.Li from
-and
-.Li to
-addresses for which the key is valid:
-.Bd -literal
-0.0.0.0/0 10.20.30.0/24 : PUB 0sAQOrWlcwbAIdNSMhDt...
-.Ed
-.\"
-.Sh SEE ALSO
-.Xr racoon.conf 5 ,
-.Xr racoon 8
-.\"
-.Sh HISTORY
-.Nm
-was written by
-.An Michal Ludvig Aq michal@logix.cz
-and first appeared in
-.Ic ipsec-tools 0.4 .
diff --git a/src/racoon/plainrsa-gen.c b/src/racoon/plainrsa-gen.c
deleted file mode 100644
index 1bd5f67..0000000
--- a/src/racoon/plainrsa-gen.c
+++ /dev/null
@@ -1,208 +0,0 @@
-/*	$NetBSD: plainrsa-gen.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: plainrsa-gen.c,v 1.6 2005/04/21 09:08:40 monas Exp */
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* This file contains a generator for FreeS/WAN-style ipsec.secrets RSA keys. */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include <openssl/bio.h>
-#include <openssl/bn.h>
-#include <openssl/err.h>
-#include <openssl/objects.h>
-#include <openssl/rsa.h>
-#include <openssl/evp.h>
-#ifdef HAVE_OPENSSL_ENGINE_H
-#include <openssl/engine.h>
-#endif
-
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "crypto_openssl.h"
-
-#include "package_version.h"
-
-void
-usage (char *argv0)
-{
-	fprintf(stderr, "Plain RSA key generator, part of %s\n", TOP_PACKAGE_STRING);
-	fprintf(stderr, "By Michal Ludvig (http://www.logix.cz/michal)\n");
-	fprintf(stderr, "\n");
-	fprintf(stderr, "Usage: %s [options]\n", argv0);
-	fprintf(stderr, "\n");
-	fprintf(stderr, "  -b bits       Generate <bits> long RSA key (default=1024)\n");
-	fprintf(stderr, "  -e pubexp     Public exponent to use (default=0x3)\n");
-	fprintf(stderr, "  -f filename   Filename to store the key to (default=stdout)\n");
-	fprintf(stderr, "  -h            Help\n");
-	fprintf(stderr, "\n");
-	fprintf(stderr, "Report bugs to <ipsec-tools-devel@lists.sourceforge.net>\n");
-	exit(1);
-}
-
-/*
- * See RFC 2065, section 3.5 for details about the output format.
- */
-vchar_t *
-mix_b64_pubkey(RSA *key)
-{
-	char *binbuf;
-	long binlen, ret;
-	vchar_t *res;
-	
-	binlen = 1 + BN_num_bytes(key->e) + BN_num_bytes(key->n);
-	binbuf = malloc(binlen);
-	memset(binbuf, 0, binlen);
-	binbuf[0] = BN_bn2bin(key->e, (unsigned char *) &binbuf[1]);
-	ret = BN_bn2bin(key->n, (unsigned char *) (&binbuf[binbuf[0] + 1]));
-	if (1 + binbuf[0] + ret != binlen) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Pubkey generation failed. This is really strange...\n");
-		return NULL;
-	}
-
-	return base64_encode(binbuf, binlen);
-}
-
-char *
-lowercase(char *input)
-{
-	char *ptr = input;
-	while (*ptr) {
-		if (*ptr >= 'A' && *ptr <= 'F')
-			*ptr -= 'A' - 'a';
-		*ptr++;
-	}
-
-	return input;
-}
-
-int
-gen_rsa_key(FILE *fp, size_t bits, unsigned long exp)
-{
-	RSA *key;
-	vchar_t *pubkey64 = NULL;
-
-	key = RSA_generate_key(bits, exp, NULL, NULL);
-	if (!key) {
-		fprintf(stderr, "RSA_generate_key(): %s\n", eay_strerror());
-		return -1;
-	}
-	
-	pubkey64 = mix_b64_pubkey(key);
-	if (!pubkey64) {
-		fprintf(stderr, "mix_b64_pubkey(): %s\n", eay_strerror());
-		return -1;
-	}
-	
-	fprintf(fp, "# : PUB 0s%s\n", pubkey64->v);
-	fprintf(fp, ": RSA\t{\n");
-	fprintf(fp, "\t# RSA %zu bits\n", bits);
-	fprintf(fp, "\t# pubkey=0s%s\n", pubkey64->v);
-	fprintf(fp, "\tModulus: 0x%s\n", lowercase(BN_bn2hex(key->n)));
-	fprintf(fp, "\tPublicExponent: 0x%s\n", lowercase(BN_bn2hex(key->e)));
-	fprintf(fp, "\tPrivateExponent: 0x%s\n", lowercase(BN_bn2hex(key->d)));
-	fprintf(fp, "\tPrime1: 0x%s\n", lowercase(BN_bn2hex(key->p)));
-	fprintf(fp, "\tPrime2: 0x%s\n", lowercase(BN_bn2hex(key->q)));
-	fprintf(fp, "\tExponent1: 0x%s\n", lowercase(BN_bn2hex(key->dmp1)));
-	fprintf(fp, "\tExponent2: 0x%s\n", lowercase(BN_bn2hex(key->dmq1)));
-	fprintf(fp, "\tCoefficient: 0x%s\n", lowercase(BN_bn2hex(key->iqmp)));
-	fprintf(fp, "  }\n");
-
-	vfree(pubkey64);
-
-	return 0;
-}
-
-int
-main (int argc, char *argv[])
-{
-	FILE *fp = stdout;
-	size_t bits = 1024;
-	unsigned int pubexp = 0x3;
-	struct stat st;
-	extern char *optarg;
-	extern int optind;
-	int c;
-	char *fname = NULL;
-
-	while ((c = getopt(argc, argv, "e:b:f:h")) != -1)
-		switch (c) {
-			case 'e':
-				if (strncmp(optarg, "0x", 2) == 0)
-					sscanf(optarg, "0x%x", &pubexp);
-				else
-					pubexp = atoi(optarg);
-				break;
-			case 'b':
-				bits = atoi(optarg);
-				break;
-			case 'f':
-				fname = optarg;
-				break;
-			case 'h':
-			default:
-				usage(argv[0]);
-		}
-
-	if (fname) {
-		if (stat(fname, &st) >= 0) {
-			fprintf(stderr, "%s: file exists! Please use a different name.\n", fname);
-			exit(1);
-		}
-
-		umask(0077);
-		fp = fopen(fname, "w");
-		if (fp == NULL) {
-			fprintf(stderr, "%s: %s\n", fname, strerror(errno));
-			exit(1);
-		}
-	}
-
-	ploginit();
-	eay_init();
-
-	gen_rsa_key(fp, bits, pubexp);
-
-	fclose(fp);
-
-	return 0;
-}
diff --git a/src/racoon/plog.c b/src/racoon/plog.c
deleted file mode 100644
index 008260d..0000000
--- a/src/racoon/plog.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*	$NetBSD: plog.c,v 1.4.6.2 2009/04/20 13:35:36 tteras Exp $	*/
-
-/* Id: plog.c,v 1.11 2006/06/20 09:57:31 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <ctype.h>
-#include <err.h>
-
-#include "var.h"
-#include "misc.h"
-#include "plog.h"
-#include "logger.h"
-#include "debug.h"
-#include "gcmalloc.h"
-
-#ifndef VA_COPY
-# define VA_COPY(dst,src) memcpy(&(dst), &(src), sizeof(va_list))
-#endif
-
-char *pname = NULL;
-u_int32_t loglevel = LLV_BASE;
-int f_foreground = 0;
-
-int print_location = 0;
-
-static struct log *logp = NULL;
-static char *logfile = NULL;
-
-static char *plog_common __P((int, const char *, const char *));
-
-static struct plogtags {
-	char *name;
-	int priority;
-} ptab[] = {
-	{ "(not defined)",	0, },
-	{ "ERROR",		LOG_INFO, },
-	{ "WARNING",		LOG_INFO, },
-	{ "NOTIFY",		LOG_INFO, },
-	{ "INFO",		LOG_INFO, },
-	{ "DEBUG",		LOG_DEBUG, },
-	{ "DEBUG2",		LOG_DEBUG, },
-};
-
-static char *
-plog_common(pri, fmt, func)
-	int pri;
-	const char *fmt, *func;
-{
-	static char buf[800];	/* XXX shoule be allocated every time ? */
-	char *p;
-	int reslen, len;
-
-	p = buf;
-	reslen = sizeof(buf);
-
-	if (logfile || f_foreground) {
-		time_t t;
-		struct tm *tm;
-
-		t = time(0);
-		tm = localtime(&t);
-		len = strftime(p, reslen, "%Y-%m-%d %T: ", tm);
-		p += len;
-		reslen -= len;
-	}
-
-	if (pri < ARRAYLEN(ptab)) {
-		len = snprintf(p, reslen, "%s: ", ptab[pri].name);
-		if (len >= 0 && len < reslen) {
-			p += len;
-			reslen -= len;
-		} else
-			*p = '\0';
-	}
-
-	if (print_location)
-		snprintf(p, reslen, "%s: %s", func, fmt);
-	else
-		snprintf(p, reslen, "%s", fmt);
-#ifdef BROKEN_PRINTF
-	while ((p = strstr(buf,"%z")) != NULL)
-		p[1] = 'l';
-#endif
-
-	return buf;
-}
-
-void
-_plog(int pri, const char *func, struct sockaddr *sa, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	plogv(pri, func, sa, fmt, ap);
-	va_end(ap);
-}
-
-void
-plogv(int pri, const char *func, struct sockaddr *sa,
-	const char *fmt, va_list ap)
-{
-	char *newfmt;
-	va_list ap_bak;
-
-	if (pri > loglevel)
-		return;
-
-	newfmt = plog_common(pri, fmt, func);
-
-	VA_COPY(ap_bak, ap);
-	
-	if (f_foreground)
-		vprintf(newfmt, ap);
-
-	if (logfile)
-		log_vaprint(logp, newfmt, ap_bak);
-	else {
-		if (pri < ARRAYLEN(ptab))
-			vsyslog(ptab[pri].priority, newfmt, ap_bak);
-		else
-			vsyslog(LOG_ALERT, newfmt, ap_bak);
-	}
-}
-
-void
-plogdump(pri, data, len)
-	int pri;
-	void *data;
-	size_t len;
-{
-	caddr_t buf;
-	size_t buflen;
-	int i, j;
-
-	if (pri > loglevel)
-		return;
-
-	/*
-	 * 2 words a bytes + 1 space 4 bytes + 1 newline 32 bytes
-	 * + 2 newline + '\0'
-	 */
-	buflen = (len * 2) + (len / 4) + (len / 32) + 3;
-	buf = racoon_malloc(buflen);
-
-	i = 0;
-	j = 0;
-	while (j < len) {
-		if (j % 32 == 0)
-			buf[i++] = '\n';
-		else
-		if (j % 4 == 0)
-			buf[i++] = ' ';
-		snprintf(&buf[i], buflen - i, "%02x",
-			((unsigned char *)data)[j] & 0xff);
-		i += 2;
-		j++;
-	}
-	if (buflen - i >= 2) {
-		buf[i++] = '\n';
-		buf[i] = '\0';
-	}
-	plog(pri, LOCATION, NULL, "%s", buf);
-
-	racoon_free(buf);
-}
-
-void
-ploginit()
-{
-	if (logfile) {
-		logp = log_open(250, logfile);
-		if (logp == NULL)
-			errx(1, "ERROR: failed to open log file %s.", logfile);
-		return;
-	}
-
-        openlog(pname, LOG_NDELAY, LOG_DAEMON);
-}
-
-void
-plogset(file)
-	char *file;
-{
-	if (logfile != NULL)
-		racoon_free(logfile);
-	logfile = racoon_strdup(file);
-	STRDUP_FATAL(logfile);
-}
-
-/*
-   Returns a printable string from (possibly) binary data ;
-   concatenates all unprintable chars to one space.
-   XXX Maybe the printable chars range is too large...
- */
-char*
-binsanitize(binstr, n)
-	char *binstr;
-	size_t n;
-{
-	int p,q;
-	char* d;
-
-	d = racoon_malloc(n + 1);
-	for (p = 0, q = 0; p < n; p++) {
-		if (isgraph((int)binstr[p])) {
-			d[q++] = binstr[p];
-		} else {
-			if (q && d[q - 1] != ' ')
-				d[q++] = ' ';
-		}
-	}
-	d[q++] = '\0';
-
-	return d;
-}
-	
diff --git a/src/racoon/plog.h b/src/racoon/plog.h
deleted file mode 100644
index b8cb027..0000000
--- a/src/racoon/plog.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*	$NetBSD: plog.h,v 1.4.6.1 2007/11/06 16:41:27 vanhu Exp $	*/
-
-/* Id: plog.h,v 1.7 2006/06/20 09:57:31 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _PLOG_H
-#define _PLOG_H
-
-#ifdef ANDROID_PATCHED
-
-#define LLV_ERROR   0
-#define LLV_WARNING 1
-#define LLV_NOTIFY  2
-#define LLV_INFO    3
-#define LLV_DEBUG   4
-#define LLV_DEBUG2  5
-
-#define loglevel LLV_DEBUG2
-
-#define plog(level, location, address, ...)                 \
-    do {                                                    \
-        if ((level) >= LLV_ERROR && (level) <= LLV_INFO) {  \
-            do_plog((level), __VA_ARGS__);                  \
-        }                                                   \
-    } while (0)
-
-#define plogdump(...)
-
-extern void do_plog(int level, char *format, ...);
-extern char *binsanitize(char *binary, size_t size);
-extern char *pname;
-
-#else
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#include <syslog.h>
-
-/*
- * INFO: begin negotiation, SA establishment/deletion/expiration.
- * NOTIFY: just notifiable.
- * WARNING: not error strictly.
- * ERROR: system call error. also invalid parameter/format.
- * DEBUG1: debugging informatioin.
- * DEBUG2: too more verbose. e.g. parsing config.
- */
-#define LLV_ERROR	1
-#define LLV_WARNING	2
-#define LLV_NOTIFY	3
-#define LLV_INFO	4
-#define LLV_DEBUG	5
-#define LLV_DEBUG2	6
- 
-#define LLV_BASE	LLV_INFO /* by default log less than this value. */
-
-extern char *pname;
-extern u_int32_t loglevel;
-extern int f_foreground;
-extern int print_location;
-
-struct sockaddr;
-#define plog(pri, ...) \
-	do { \
-		if ((pri) <= loglevel) \
-			_plog((pri), __VA_ARGS__); \
-	} while (0)
-extern void _plog __P((int, const char *, struct sockaddr *, const char *, ...))
-	__attribute__ ((__format__ (__printf__, 4, 5)));
-extern void plogv __P((int, const char *, struct sockaddr *,
-	const char *, va_list));
-extern void plogdump __P((int, void *, size_t));
-extern void ploginit __P((void));
-extern void plogset __P((char *));
-
-extern char* binsanitize __P((char*, size_t));
-
-#endif
-
-#endif /* _PLOG_H */
diff --git a/src/racoon/policy.c b/src/racoon/policy.c
deleted file mode 100644
index 29a6818..0000000
--- a/src/racoon/policy.c
+++ /dev/null
@@ -1,488 +0,0 @@
-/*	$NetBSD: policy.c,v 1.6.4.1 2007/08/01 11:52:21 vanhu Exp $	*/
-
-/*	$KAME: policy.c,v 1.46 2001/11/16 04:08:10 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "policy.h"
-#include "localconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "oakley.h"
-#include "handler.h"
-#include "strnames.h"
-#include "gcmalloc.h"
-
-static TAILQ_HEAD(_sptree, secpolicy) sptree;
-
-/* perform exact match against security policy table. */
-struct secpolicy *
-getsp(spidx)
-	struct policyindex *spidx;
-{
-	struct secpolicy *p;
-
-	for (p = TAILQ_FIRST(&sptree); p; p = TAILQ_NEXT(p, chain)) {
-		if (!cmpspidxstrict(spidx, &p->spidx))
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * perform non-exact match against security policy table, only if this is
- * transport mode SA negotiation.  for example, 0.0.0.0/0 -> 0.0.0.0/0
- * entry in policy.txt can be returned when we're negotiating transport
- * mode SA.  this is how the kernel works.
- */
-#if 1
-struct secpolicy *
-getsp_r(spidx)
-	struct policyindex *spidx;
-{
-	struct secpolicy *p;
-
-	for (p = TAILQ_FIRST(&sptree); p; p = TAILQ_NEXT(p, chain)) {
-		if (!cmpspidxwild(spidx, &p->spidx))
-			return p;
-	}
-
-	return NULL;
-}
-#else
-struct secpolicy *
-getsp_r(spidx, iph2)
-	struct policyindex *spidx;
-	struct ph2handle *iph2;
-{
-	struct secpolicy *p;
-	u_int8_t prefixlen;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "checking for transport mode\n");
-
-	if (spidx->src.ss_family != spidx->dst.ss_family) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"address family mismatch, src:%d dst:%d\n",
-				spidx->src.ss_family,
-				spidx->dst.ss_family);
-		return NULL;
-	}
-	switch (spidx->src.ss_family) {
-	case AF_INET:
-		prefixlen = sizeof(struct in_addr) << 3;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		prefixlen = sizeof(struct in6_addr) << 3;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid family: %d\n", spidx->src.ss_family);
-		return NULL;
-	}
-
-	/* is it transport mode SA negotiation? */
-	plog(LLV_DEBUG, LOCATION, NULL, "src1: %s\n",
-		saddr2str(iph2->src));
-	plog(LLV_DEBUG, LOCATION, NULL, "src2: %s\n",
-		saddr2str((struct sockaddr *)&spidx->src));
-	if (cmpsaddrwop(iph2->src, (struct sockaddr *)&spidx->src)
-	 || spidx->prefs != prefixlen)
-		return NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "dst1: %s\n",
-		saddr2str(iph2->dst));
-	plog(LLV_DEBUG, LOCATION, NULL, "dst2: %s\n",
-		saddr2str((struct sockaddr *)&spidx->dst));
-	if (cmpsaddrwop(iph2->dst, (struct sockaddr *)&spidx->dst)
-	 || spidx->prefd != prefixlen)
-		return NULL;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "looks to be transport mode\n");
-
-	for (p = TAILQ_FIRST(&sptree); p; p = TAILQ_NEXT(p, chain)) {
-		if (!cmpspidx_wild(spidx, &p->spidx))
-			return p;
-	}
-
-	return NULL;
-}
-#endif
-
-struct secpolicy *
-getspbyspid(spid)
-	u_int32_t spid;
-{
-	struct secpolicy *p;
-
-	for (p = TAILQ_FIRST(&sptree); p; p = TAILQ_NEXT(p, chain)) {
-		if (p->id == spid)
-			return p;
-	}
-
-	return NULL;
-}
-
-/*
- * compare policyindex.
- * a: subject b: db
- * OUT:	0:	equal
- *	1:	not equal
- */
-int
-cmpspidxstrict(a, b)
-	struct policyindex *a, *b;
-{
-	plog(LLV_DEBUG, LOCATION, NULL, "sub:%p: %s\n", a, spidx2str(a));
-	plog(LLV_DEBUG, LOCATION, NULL, "db :%p: %s\n", b, spidx2str(b));
-
-	/* XXX don't check direction now, but it's to be checked carefully. */
-	if (a->dir != b->dir
-	 || a->prefs != b->prefs
-	 || a->prefd != b->prefd
-	 || a->ul_proto != b->ul_proto)
-		return 1;
-
-	if (cmpsaddrstrict((struct sockaddr *)&a->src,
-			   (struct sockaddr *)&b->src))
-		return 1;
-	if (cmpsaddrstrict((struct sockaddr *)&a->dst,
-			   (struct sockaddr *)&b->dst))
-		return 1;
-
-#ifdef HAVE_SECCTX
-	if (a->sec_ctx.ctx_alg != b->sec_ctx.ctx_alg
-	    || a->sec_ctx.ctx_doi != b->sec_ctx.ctx_doi
-	    || !within_range(a->sec_ctx.ctx_str, b->sec_ctx.ctx_str))
-		return 1;
-#endif
-	return 0;
-}
-
-/*
- * compare policyindex, with wildcard address/protocol match.
- * a: subject b: db, can contain wildcard things.
- * OUT:	0:	equal
- *	1:	not equal
- */
-int
-cmpspidxwild(a, b)
-	struct policyindex *a, *b;
-{
-	struct sockaddr_storage sa1, sa2;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "sub:%p: %s\n", a, spidx2str(a));
-	plog(LLV_DEBUG, LOCATION, NULL, "db: %p: %s\n", b, spidx2str(b));
-
-	if (!(b->dir == IPSEC_DIR_ANY || a->dir == b->dir))
-		return 1;
-
-	if (!(a->ul_proto == IPSEC_ULPROTO_ANY ||
-	      b->ul_proto == IPSEC_ULPROTO_ANY ||
-	      a->ul_proto == b->ul_proto))
-		return 1;
-
-	if (a->src.ss_family != b->src.ss_family)
-		return 1;
-	if (a->dst.ss_family != b->dst.ss_family)
-		return 1;
-
-#ifndef __linux__
-	/* compare src address */
-	if (sizeof(sa1) < a->src.ss_len || sizeof(sa2) < b->src.ss_len) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unexpected error: "
-			"src.ss_len:%d dst.ss_len:%d\n",
-			a->src.ss_len, b->src.ss_len);
-		return 1;
-	}
-#endif
-	mask_sockaddr((struct sockaddr *)&sa1, (struct sockaddr *)&a->src,
-		b->prefs);
-	mask_sockaddr((struct sockaddr *)&sa2, (struct sockaddr *)&b->src,
-		b->prefs);
-	plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
-		a, b->prefs, saddr2str((struct sockaddr *)&sa1));
-	plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
-		b, b->prefs, saddr2str((struct sockaddr *)&sa2));
-	if (cmpsaddrwild((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
-		return 1;
-
-#ifndef __linux__
-	/* compare dst address */
-	if (sizeof(sa1) < a->dst.ss_len || sizeof(sa2) < b->dst.ss_len) {
-		plog(LLV_ERROR, LOCATION, NULL, "unexpected error\n");
-		exit(1);
-	}
-#endif
-	mask_sockaddr((struct sockaddr *)&sa1, (struct sockaddr *)&a->dst,
-		b->prefd);
-	mask_sockaddr((struct sockaddr *)&sa2, (struct sockaddr *)&b->dst,
-		b->prefd);
-	plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
-		a, b->prefd, saddr2str((struct sockaddr *)&sa1));
-	plog(LLV_DEBUG, LOCATION, NULL, "%p masked with /%d: %s\n",
-		b, b->prefd, saddr2str((struct sockaddr *)&sa2));
-	if (cmpsaddrwild((struct sockaddr *)&sa1, (struct sockaddr *)&sa2))
-		return 1;
-
-#ifdef HAVE_SECCTX
-	if (a->sec_ctx.ctx_alg != b->sec_ctx.ctx_alg
-	    || a->sec_ctx.ctx_doi != b->sec_ctx.ctx_doi
-	    || !within_range(a->sec_ctx.ctx_str, b->sec_ctx.ctx_str))
-		return 1;
-#endif
-	return 0;
-}
-
-struct secpolicy *
-newsp()
-{
-	struct secpolicy *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-void
-delsp(sp)
-	struct secpolicy *sp;
-{
-	struct ipsecrequest *req = NULL, *next;
-
-	for (req = sp->req; req; req = next) {
-		next = req->next;
-		racoon_free(req);
-	}
-	
-	racoon_free(sp);
-}
-
-void
-delsp_bothdir(spidx0)
-	struct policyindex *spidx0;
-{
-	struct policyindex spidx;
-	struct secpolicy *sp;
-	struct sockaddr_storage src, dst;
-	u_int8_t prefs, prefd;
-
-	memcpy(&spidx, spidx0, sizeof(spidx));
-	switch (spidx.dir) {
-	case IPSEC_DIR_INBOUND:
-#ifdef HAVE_POLICY_FWD
-	case IPSEC_DIR_FWD:
-#endif
-		src   = spidx.src;
-		dst   = spidx.dst;
-		prefs = spidx.prefs;
-		prefd = spidx.prefd;
-		break;
-	case IPSEC_DIR_OUTBOUND:
-		src   = spidx.dst;
-		dst   = spidx.src;
-		prefs = spidx.prefd;
-		prefd = spidx.prefs;
-		break;
-	default:
-		return;
-	}
-
-	spidx.src   = src;
-	spidx.dst   = dst;
-	spidx.prefs = prefs;
-	spidx.prefd = prefd;
-	spidx.dir   = IPSEC_DIR_INBOUND;
-
-	sp = getsp(&spidx);
-	if (sp) {
-		remsp(sp);
-		delsp(sp);
-	}
-
-#ifdef HAVE_POLICY_FWD
-	spidx.dir   = IPSEC_DIR_FWD;
-
-	sp = getsp(&spidx);
-	if (sp) {
-		remsp(sp);
-		delsp(sp);
-	}
-#endif
-
-	spidx.src   = dst;
-	spidx.dst   = src;
-	spidx.prefs = prefd;
-	spidx.prefd = prefs;
-	spidx.dir   = IPSEC_DIR_OUTBOUND;
-
-	sp = getsp(&spidx);
-	if (sp) {
-		remsp(sp);
-		delsp(sp);
-	}
-}
-
-void
-inssp(new)
-	struct secpolicy *new;
-{
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-	struct secpolicy *p;
-
-	TAILQ_FOREACH(p, &sptree, chain) {
-		if (new->spidx.priority < p->spidx.priority) {
-			TAILQ_INSERT_BEFORE(p, new, chain);
-			return;
-		}
-	}
-	if (p == NULL)
-#endif
-		TAILQ_INSERT_TAIL(&sptree, new, chain);
-
-	return;
-}
-
-void
-remsp(sp)
-	struct secpolicy *sp;
-{
-	TAILQ_REMOVE(&sptree, sp, chain);
-}
-
-void
-flushsp()
-{
-	struct secpolicy *p, *next;
-
-	for (p = TAILQ_FIRST(&sptree); p; p = next) {
-		next = TAILQ_NEXT(p, chain);
-		remsp(p);
-		delsp(p);
-	}
-}
-
-void
-initsp()
-{
-	TAILQ_INIT(&sptree);
-}
-
-struct ipsecrequest *
-newipsecreq()
-{
-	struct ipsecrequest *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-const char *
-spidx2str(spidx)
-	const struct policyindex *spidx;
-{
-	/* addr/pref[port] addr/pref[port] ul dir act */
-	static char buf[256];
-	char *p, *a, *b;
-	int blen, i;
-
-	blen = sizeof(buf) - 1;
-	p = buf;
-
-	a = saddr2str((const struct sockaddr *)&spidx->src);
-	for (b = a; *b != '\0'; b++)
-		if (*b == '[') {
-			*b = '\0';
-			b++;
-			break;
-		}
-	i = snprintf(p, blen, "%s/%d[%s ", a, spidx->prefs, b);
-	if (i < 0 || i >= blen)
-		return NULL;
-	p += i;
-	blen -= i;
-
-	a = saddr2str((const struct sockaddr *)&spidx->dst);
-	for (b = a; *b != '\0'; b++)
-		if (*b == '[') {
-			*b = '\0';
-			b++;
-			break;
-		}
-	i = snprintf(p, blen, "%s/%d[%s ", a, spidx->prefd, b);
-	if (i < 0 || i >= blen)
-		return NULL;
-	p += i;
-	blen -= i;
-
-	i = snprintf(p, blen, "proto=%s dir=%s",
-		s_proto(spidx->ul_proto), s_direction(spidx->dir));
-
-#ifdef HAVE_SECCTX
-	if (spidx->sec_ctx.ctx_strlen) {
-		p += i;
-		blen -= i;
-		snprintf(p, blen, " sec_ctx:doi=%d,alg=%d,len=%d,str=%s",
-			 spidx->sec_ctx.ctx_doi, spidx->sec_ctx.ctx_alg,
-			 spidx->sec_ctx.ctx_strlen, spidx->sec_ctx.ctx_str);
-	}
-#endif
-	return buf;
-}
diff --git a/src/racoon/policy.h b/src/racoon/policy.h
deleted file mode 100644
index 8c47451..0000000
--- a/src/racoon/policy.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*	$NetBSD: policy.h,v 1.5.4.2 2007/06/07 20:34:19 manu Exp $	*/
-
-/* Id: policy.h,v 1.5 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _POLICY_H
-#define _POLICY_H
-
-#include <sys/queue.h>
-
-
-#ifdef HAVE_SECCTX
-#define MAX_CTXSTR_SIZE 50
-struct security_ctx {
-	u_int8_t ctx_doi;       /* Security Context DOI */
-	u_int8_t ctx_alg;       /* Security Context Algorithm */
-	u_int16_t ctx_strlen;   /* Security Context stringlength
-				 * (includes terminating NULL)
-				 */
-	char ctx_str[MAX_CTXSTR_SIZE];  /* Security Context string */
-};
-#endif
-
-/* refs. ipsec.h */
-/*
- * Security Policy Index
- * NOTE: Ensure to be same address family and upper layer protocol.
- * NOTE: ul_proto, port number, uid, gid:
- *	ANY: reserved for waldcard.
- *	0 to (~0 - 1): is one of the number of each value.
- */
-struct policyindex {
-	u_int8_t dir;			/* direction of packet flow, see blow */
-	struct sockaddr_storage src;	/* IP src address for SP */
-	struct sockaddr_storage dst;	/* IP dst address for SP */
-	u_int8_t prefs;			/* prefix length in bits for src */
-	u_int8_t prefd;			/* prefix length in bits for dst */
-	u_int16_t ul_proto;		/* upper layer Protocol */
-	u_int32_t priority;		/* priority for the policy */
- 	u_int64_t created;		/* Used for generated SPD entries deletion */
-#ifdef HAVE_SECCTX
-	struct security_ctx sec_ctx;    /* Security Context */
-#endif
-};
-
-/* Security Policy Data Base */
-struct secpolicy {
-	TAILQ_ENTRY(secpolicy) chain;
-
-	struct policyindex spidx;	/* selector */
-	u_int32_t id;			/* It's unique number on the system. */
-
-	u_int policy;		/* DISCARD, NONE or IPSEC, see keyv2.h */
-	struct ipsecrequest *req;
-				/* pointer to the ipsec request tree, */
-				/* if policy == IPSEC else this value == NULL.*/
-};
-
-/* Security Assocciation Index */
-/* NOTE: Ensure to be same address family */
-struct secasindex {
-	struct sockaddr_storage src;	/* srouce address for SA */
-	struct sockaddr_storage dst;	/* destination address for SA */
-	u_int16_t proto;		/* IPPROTO_ESP or IPPROTO_AH */
-	u_int8_t mode;			/* mode of protocol, see ipsec.h */
-	u_int32_t reqid;		/* reqid id who owned this SA */
-					/* see IPSEC_MANUAL_REQID_MAX. */
-};
-
-/* Request for IPsec */
-struct ipsecrequest {
-	struct ipsecrequest *next;
-				/* pointer to next structure */
-				/* If NULL, it means the end of chain. */
-
-	struct secasindex saidx;/* hint for search proper SA */
-				/* if __ss_len == 0 then no address specified.*/
-	u_int level;		/* IPsec level defined below. */
-
-	struct secpolicy *sp;	/* back pointer to SP */
-};
-
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-#define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, _priority, _created, idx)              \
-do {                                                                         \
-	memset((idx), 0, sizeof(struct policyindex));                        \
-	(idx)->dir = (_dir);                                                 \
-	(idx)->prefs = (ps);                                                 \
-	(idx)->prefd = (pd);                                                 \
-	(idx)->ul_proto = (ulp);                                             \
-	(idx)->priority = (_priority);                                        \
-	(idx)->created = (_created);                                        \
-	memcpy(&(idx)->src, (s), sysdep_sa_len((struct sockaddr *)(s)));          \
-	memcpy(&(idx)->dst, (d), sysdep_sa_len((struct sockaddr *)(d)));          \
-} while (0)
-#else
-#define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, _created, idx)              \
-do {                                                                         \
-	memset((idx), 0, sizeof(struct policyindex));                        \
-	(idx)->dir = (_dir);                                                 \
-	(idx)->prefs = (ps);                                                 \
-	(idx)->prefd = (pd);                                                 \
-	(idx)->ul_proto = (ulp);                                             \
-	(idx)->created = (_created);                                        \
-	memcpy(&(idx)->src, (s), sysdep_sa_len((struct sockaddr *)(s)));          \
-	memcpy(&(idx)->dst, (d), sysdep_sa_len((struct sockaddr *)(d)));          \
-} while (0)
-#endif
-
-struct ph2handle;
-struct policyindex;
-extern struct secpolicy *getsp __P((struct policyindex *));
-extern struct secpolicy *getsp_r __P((struct policyindex *));
-struct secpolicy *getspbyspid __P((u_int32_t));
-extern int cmpspidxstrict __P((struct policyindex *, struct policyindex *));
-extern int cmpspidxwild __P((struct policyindex *, struct policyindex *));
-extern struct secpolicy *newsp __P((void));
-extern void delsp __P((struct secpolicy *));
-extern void delsp_bothdir __P((struct policyindex *));
-extern void inssp __P((struct secpolicy *));
-extern void remsp __P((struct secpolicy *));
-extern void flushsp __P((void));
-extern void initsp __P((void));
-extern struct ipsecrequest *newipsecreq __P((void));
-
-extern const char *spidx2str __P((const struct policyindex *));
-#ifdef HAVE_SECCTX
-#include <selinux/selinux.h>
-extern int get_security_context __P((vchar_t *, struct policyindex *));
-extern void init_avc __P((void));
-extern int within_range __P((security_context_t, security_context_t));
-extern void set_secctx_in_proposal __P((struct ph2handle *, struct policyindex));
-#endif
-
-#endif /* _POLICY_H */
diff --git a/src/racoon/privsep.c b/src/racoon/privsep.c
deleted file mode 100644
index 9e60b89..0000000
--- a/src/racoon/privsep.c
+++ /dev/null
@@ -1,1339 +0,0 @@
-/*	$NetBSD: privsep.c,v 1.6 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: privsep.c,v 1.15 2005/08/08 11:23:44 vanhu Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <unistd.h>
-#include <string.h>
-#ifdef __NetBSD__
-#include <stdlib.h>	/* for setproctitle */
-#endif
-#include <errno.h>
-#include <signal.h>
-#include <pwd.h>
-
-#include <sys/socket.h>
-#include <sys/param.h>
-
-#include "gcmalloc.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "plog.h"
-#include "var.h"
-#include "libpfkey.h"
-
-#include "crypto_openssl.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#ifdef ENABLE_HYBRID
-#include "resolv.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-#include "localconf.h"
-#include "remoteconf.h"
-#include "admin.h"
-#include "sockmisc.h"
-#include "privsep.h"
-
-static int privsep_sock[2] = { -1, -1 };
-
-static int privsep_recv(int, struct privsep_com_msg **, size_t *);
-static int privsep_send(int, struct privsep_com_msg *, size_t);
-static int safety_check(struct privsep_com_msg *, int i);
-static int port_check(int);
-static int unsafe_env(char *const *);
-static int unknown_name(int);
-static int unsafe_path(char *, int);
-
-static int
-privsep_send(sock, buf, len)
-	int sock;
-	struct privsep_com_msg *buf;
-	size_t len;
-{
-	if (buf == NULL)
-		return 0;
-
-	if (sendto(sock, (char *)buf, len, 0, NULL, 0) == -1) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "privsep_send failed: %s\n", 
-		    strerror(errno));
-		return -1;
-	}
-
-	racoon_free((char *)buf);
-
-	return 0;
-}
-
-
-static int
-privsep_recv(sock, bufp, lenp)
-	int sock;
-	struct privsep_com_msg **bufp;
-	size_t *lenp;
-{
-	struct admin_com com;
-	struct admin_com *combuf;
-	size_t len;
-
-	*bufp = NULL;
-	*lenp = 0;
-
-	/* Get the header */
-	while ((len = recvfrom(sock, (char *)&com, 
-	    sizeof(com), MSG_PEEK, NULL, NULL)) == -1) {
-		if (errno == EINTR)
-			continue;
-
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "privsep_recv failed: %s\n",
-		    strerror(errno));
-		return -1;
-	}
-	
-	/* Check for short packets */
-	if (len < sizeof(com)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "corrupted privsep message (short header)\n");
-		return -1;
-	}
-
-	/* Allocate buffer for the whole message */
-	if ((combuf = (struct admin_com *)racoon_malloc(com.ac_len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "failed to allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-
-	/* Get the whole buffer */
-	while ((len = recvfrom(sock, (char *)combuf, 
-	    com.ac_len, 0, NULL, NULL)) == -1) {
-		if (errno == EINTR)
-			continue;
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "failed to recv privsep command: %s\n", 
-		    strerror(errno));
-		return -1;
-	}
-
-	/* We expect len to match */
-	if (len != com.ac_len) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "corrupted privsep message (short packet)\n");
-		return -1;
-	}
-
-	*bufp = (struct privsep_com_msg *)combuf;
-	*lenp = len;
-
-	return 0;
-}
-
-int
-privsep_init(void)
-{
-	int i;
-	pid_t child_pid;
-
-	/* If running as root, we don't use the privsep code path */
-	if (lcconf->uid == 0)
-		return 0;
-
-	/* 
-	 * When running privsep, certificate and script paths 
-	 * are mandatory, as they enable us to check path safety
-	 * in the privilegied instance
-	 */
-	if ((lcconf->pathinfo[LC_PATHTYPE_CERT] == NULL) ||
-	    (lcconf->pathinfo[LC_PATHTYPE_SCRIPT] == NULL)) {
-		plog(LLV_ERROR, LOCATION, NULL, "privilege separation "
-		   "require path cert and path script in the config file\n");
-		return -1;
-	}
-
-	if (socketpair(PF_LOCAL, SOCK_DGRAM, 0, privsep_sock) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate privsep_sock: %s\n", strerror(errno));
-		return -1;
-	}
-
-	switch (child_pid = fork()) {
-	case -1:
-		plog(LLV_ERROR, LOCATION, NULL, "Cannot fork privsep: %s\n", 
-		    strerror(errno));
-		return -1;
-		break;
-
-	case 0: /* Child: drop privileges */
-		if (lcconf->chroot != NULL) {
-			if (chdir(lcconf->chroot) != 0) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Cannot chdir(%s): %s\n", lcconf->chroot, 
-				    strerror(errno));
-				return -1;
-			}
-			if (chroot(lcconf->chroot) != 0) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Cannot chroot(%s): %s\n", lcconf->chroot, 
-				    strerror(errno));
-				return -1;
-			}
-		}
-
-		if (setgid(lcconf->gid) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot setgid(%d): %s\n", lcconf->gid,
-			    strerror(errno));
-			return -1;
-		}
-
-		if (setegid(lcconf->gid) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot setegid(%d): %s\n", lcconf->gid,
-			    strerror(errno));
-			return -1;
-		}
-
-		if (setuid(lcconf->uid) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot setuid(%d): %s\n", lcconf->uid,
-			    strerror(errno));
-			return -1;
-		}
-
-		if (seteuid(lcconf->uid) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			    "Cannot seteuid(%d): %s\n", lcconf->uid,
-			    strerror(errno));
-			return -1;
-		}
-
-		return 0;
-		break;
-
-	default: /* Parent: privilegied process */
-		break;
-	}
-
-	/* 
-	 * Close everything except the socketpair, 
-	 * and stdout if running in the forground.
-	 */
-	for (i = sysconf(_SC_OPEN_MAX); i > 0; i--) {
-		if (i == privsep_sock[0])
-			continue;
-		if (i == privsep_sock[1])
-			continue;
-		if ((f_foreground) && (i == 1))
-			continue;
-		(void)close(i);
-	}
-
-	/* Above trickery closed the log file, reopen it */
-	ploginit();
-
-	plog(LLV_INFO, LOCATION, NULL, 
-	    "racoon privilegied process running with PID %d\n", getpid());
-
-#ifdef __NetBSD__
-	setproctitle("[priv]");
-#endif
-	
-	/* 
-	 * Don't catch any signal 
-	 * This duplicate session:signals[], which is static...
-	 */
-	signal(SIGHUP, SIG_DFL);
-	signal(SIGINT, SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-	signal(SIGUSR1, SIG_DFL);
-	signal(SIGUSR2, SIG_DFL);
-	signal(SIGCHLD, SIG_DFL);
-
-	while (1) {
-		size_t len;
-		struct privsep_com_msg *combuf;
-		struct privsep_com_msg *reply;
-		char *data;
-		size_t *buflen;
-		size_t totallen;
-		char *bufs[PRIVSEP_NBUF_MAX];
-		int i;
-
-		if (privsep_recv(privsep_sock[0], &combuf, &len) != 0)
-			goto out;
-
-		/* Safety checks and gather the data */
-		if (len < sizeof(*combuf)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "corrupted privsep message (short buflen)\n");
-			goto out;
-		}
-
-		data = (char *)(combuf + 1);
-		totallen = sizeof(*combuf);
-		for (i = 0; i < PRIVSEP_NBUF_MAX; i++) {
-			bufs[i] = (char *)data;
-			data += combuf->bufs.buflen[i];
-			totallen += combuf->bufs.buflen[i];
-		}
-
-		if (totallen > len) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "corrupted privsep message (bufs too big)\n");
-			goto out;
-		}
-	
-		/* Prepare the reply buffer */
-		if ((reply = racoon_malloc(sizeof(*reply))) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot allocate reply buffer: %s\n", 
-			    strerror(errno));
-			goto out;
-		}
-		bzero(reply, sizeof(*reply));
-		reply->hdr.ac_cmd = combuf->hdr.ac_cmd;
-		reply->hdr.ac_len = sizeof(*reply);
-
-		switch(combuf->hdr.ac_cmd) {
-		/* 
-		 * XXX Improvement: instead of returning the key, 
-		 * stuff eay_get_pkcs1privkey and eay_get_x509sign
-		 * together and sign the hash in the privilegied 
-		 * instance? 
-		 * pro: the key remains inaccessible to unpriv
-		 * con: a compromised unpriv racoon can still sign anything
-		 */
-		case PRIVSEP_EAY_GET_PKCS1PRIVKEY: {
-			vchar_t *privkey;
-
-			/* Make sure the string is NULL terminated */
-			if (safety_check(combuf, 0) != 0)
-				break;
-			bufs[0][combuf->bufs.buflen[0] - 1] = '\0';
-
-			if (unsafe_path(bufs[0], LC_PATHTYPE_CERT) != 0) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "privsep_eay_get_pkcs1privkey: "
-				    "unsafe cert \"%s\"\n", bufs[0]);
-			}
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "eay_get_pkcs1privkey(\"%s\")\n", bufs[0]);
-
-			if ((privkey = eay_get_pkcs1privkey(bufs[0])) == NULL){
-				reply->hdr.ac_errno = errno;
-				break;
-			}
-
-			reply->bufs.buflen[0] = privkey->l;
-			reply->hdr.ac_len = sizeof(*reply) + privkey->l;
-			reply = racoon_realloc(reply, reply->hdr.ac_len);
-			if (reply == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "Cannot allocate reply buffer: %s\n", 
-				    strerror(errno));
-				goto out;
-			}
-
-			memcpy(reply + 1, privkey->v, privkey->l);
-			vfree(privkey);
-			break;
-		}
-		
-		case PRIVSEP_SCRIPT_EXEC: {
-			char *script;
-			int name;
-			char **envp = NULL;
-			int envc = 0;
-			int count = 0;
-			int i;
-
-			/*
-			 * First count the bufs, and make sure strings
-			 * are NULL terminated. 
-			 *
-			 * We expect: script, name, envp[], void
-			 */ 
-			if (safety_check(combuf, 0) != 0)
-				break;
-			bufs[0][combuf->bufs.buflen[0] - 1] = '\0';
-			count++;	/* script */
-
-			count++;	/* name */
-
-			for (; count < PRIVSEP_NBUF_MAX; count++) {
-				if (combuf->bufs.buflen[count] == 0)
-					break;
-				bufs[count]
-				    [combuf->bufs.buflen[count] - 1] = '\0';
-				envc++;
-			}
-
-			/* count a void buf and perform safety check */
-			count++;
-			if (count >= PRIVSEP_NBUF_MAX) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "privsep_script_exec: too many args\n");
-				goto out;
-			}
-
-
-			/* 
-			 * Allocate the arrays for envp 
-			 */
-			envp = racoon_malloc((envc + 1) * sizeof(char *));
-			if (envp == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "cannot allocate memory: %s\n",
-				    strerror(errno));
-				goto out;
-			}
-			bzero(envp, (envc + 1) * sizeof(char *));
-
-	
-			/*
-			 * Populate script, name and envp 
-			 */
-			count = 0;
-			script = bufs[count++];
-
-			if (combuf->bufs.buflen[count] != sizeof(name)) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "privsep_script_exec: corrupted message\n");
-				goto out;
-			}
-			memcpy((char *)&name, bufs[count++], sizeof(name));
-
-			for (i = 0; combuf->bufs.buflen[count]; count++)
-				envp[i++] = bufs[count];
-
-			count++;		/* void */
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "script_exec(\"%s\", %d, %p)\n", 
-			    script, name, envp);
-
-			/* 
-			 * Check env for dangerous variables
-			 * Check script path and name
-			 * Perform fork and execve
-			 */
-			if ((unsafe_env(envp) == 0) &&
-			    (unknown_name(name) == 0) &&
-			    (unsafe_path(script, LC_PATHTYPE_SCRIPT) == 0))
-				(void)script_exec(script, name, envp);
-			else
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "privsep_script_exec: "
-				    "unsafe script \"%s\"\n", script);
-
-			racoon_free(envp);
-			break;
-		}
-
-		case PRIVSEP_GETPSK: {
-			vchar_t *psk;
-			int keylen;
-
-			/* Make sure the string is NULL terminated */
-			if (safety_check(combuf, 0) != 0)
-				break;
-			bufs[0][combuf->bufs.buflen[0] - 1] = '\0';
-
-			if (combuf->bufs.buflen[1] != sizeof(keylen)) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "privsep_getpsk: corrupted message\n");
-				goto out;
-			}
-			memcpy(&keylen, bufs[1], sizeof(keylen));
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "getpsk(\"%s\", %d)\n", bufs[0], keylen);
-
-			if ((psk = getpsk(bufs[0], keylen)) == NULL) {
-				reply->hdr.ac_errno = errno;
-				break;
-			}
-
-			reply->bufs.buflen[0] = psk->l;
-			reply->hdr.ac_len = sizeof(*reply) + psk->l;
-			reply = racoon_realloc(reply, reply->hdr.ac_len); 
-			if (reply == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "Cannot allocate reply buffer: %s\n", 
-				    strerror(errno));
-				goto out;
-			}
-
-			memcpy(reply + 1, psk->v, psk->l);
-			vfree(psk);
-			break;
-		}
-
-#ifdef ENABLE_HYBRID
-		case PRIVSEP_ACCOUNTING_SYSTEM: {
-			int pool_size;
-			int port;
-			int inout;
-			struct sockaddr *raddr;
-
-			if (safety_check(combuf, 0) != 0)
-				break;
-			if (safety_check(combuf, 1) != 0)
-				break;
-			if (safety_check(combuf, 2) != 0)
-				break;
-			if (safety_check(combuf, 3) != 0)
-				break;
-
-			memcpy(&port, bufs[0], sizeof(port));
-			raddr = (struct sockaddr *)bufs[1];
-
-			bufs[2][combuf->bufs.buflen[2] - 1] = '\0';
-			memcpy(&inout, bufs[3], sizeof(port));
-
-			if (port_check(port) != 0)
-				break;
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "accounting_system(%d, %s, %s)\n", 
-			    port, saddr2str(raddr), bufs[2]); 
-
-			errno = 0;
-			if (isakmp_cfg_accounting_system(port, 
-			    raddr, bufs[2], inout) != 0) {
-				if (errno == 0)
-					reply->hdr.ac_errno = EINVAL;
-				else
-					reply->hdr.ac_errno = errno;
-			}
-			break;
-		}
-		case PRIVSEP_XAUTH_LOGIN_SYSTEM: {
-			if (safety_check(combuf, 0) != 0)
-				break;
-			bufs[0][combuf->bufs.buflen[0] - 1] = '\0';
-
-			if (safety_check(combuf, 1) != 0)
-				break;
-			bufs[1][combuf->bufs.buflen[1] - 1] = '\0';
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "xauth_login_system(\"%s\", <password>)\n", 
-			    bufs[0]);
-
-			errno = 0;
-			if (xauth_login_system(bufs[0], bufs[1]) != 0) {
-				if (errno == 0)
-					reply->hdr.ac_errno = EINVAL;
-				else
-					reply->hdr.ac_errno = errno;
-			}
-			break;
-		}
-#ifdef HAVE_LIBPAM
-		case PRIVSEP_ACCOUNTING_PAM: {
-			int port;
-			int inout;
-			int pool_size;
-
-			if (safety_check(combuf, 0) != 0)
-				break;
-			if (safety_check(combuf, 1) != 0)
-				break;
-			if (safety_check(combuf, 2) != 0)
-				break;
-
-			memcpy(&port, bufs[0], sizeof(port));
-			memcpy(&inout, bufs[1], sizeof(inout));
-			memcpy(&pool_size, bufs[2], sizeof(pool_size));
-
-			if (pool_size != isakmp_cfg_config.pool_size)
-				if (isakmp_cfg_resize_pool(pool_size) != 0)
-					break;
-
-			if (port_check(port) != 0)
-				break;
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "isakmp_cfg_accounting_pam(%d, %d)\n", 
-			    port, inout); 
-
-			errno = 0;
-			if (isakmp_cfg_accounting_pam(port, inout) != 0) {
-				if (errno == 0)
-					reply->hdr.ac_errno = EINVAL;
-				else
-					reply->hdr.ac_errno = errno;
-			}
-			break;
-		}
-
-		case PRIVSEP_XAUTH_LOGIN_PAM: {
-			int port;
-			int pool_size;
-			struct sockaddr *raddr;
-
-			if (safety_check(combuf, 0) != 0)
-				break;
-			if (safety_check(combuf, 1) != 0)
-				break;
-			if (safety_check(combuf, 2) != 0)
-				break;
-			if (safety_check(combuf, 3) != 0)
-				break;
-			if (safety_check(combuf, 4) != 0)
-				break;
-
-			memcpy(&port, bufs[0], sizeof(port));
-			memcpy(&pool_size, bufs[1], sizeof(pool_size));
-			raddr = (struct sockaddr *)bufs[2];
-			
-			bufs[3][combuf->bufs.buflen[3] - 1] = '\0';
-			bufs[4][combuf->bufs.buflen[4] - 1] = '\0';
-
-			if (pool_size != isakmp_cfg_config.pool_size)
-				if (isakmp_cfg_resize_pool(pool_size) != 0)
-					break;
-
-			if (port_check(port) != 0)
-				break;
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "xauth_login_pam(%d, %s, \"%s\", <password>)\n", 
-			    port, saddr2str(raddr), bufs[3]); 
-
-			errno = 0;
-			if (xauth_login_pam(port, 
-			    raddr, bufs[3], bufs[4]) != 0) {
-				if (errno == 0)
-					reply->hdr.ac_errno = EINVAL;
-				else
-					reply->hdr.ac_errno = errno;
-			}
-			break;
-		}
-
-		case PRIVSEP_CLEANUP_PAM: {
-			int port;
-			int pool_size;
-
-			if (safety_check(combuf, 0) != 0)
-				break;
-			if (safety_check(combuf, 1) != 0)
-				break;
-
-			memcpy(&port, bufs[0], sizeof(port));
-			memcpy(&pool_size, bufs[1], sizeof(pool_size));
-
-			if (pool_size != isakmp_cfg_config.pool_size)
-				if (isakmp_cfg_resize_pool(pool_size) != 0)
-					break;
-
-			if (port_check(port) != 0)
-				break;
-
-			plog(LLV_DEBUG, LOCATION, NULL, 
-			    "cleanup_pam(%d)\n", port);
-
-			cleanup_pam(port);
-			reply->hdr.ac_errno = 0;
-
-			break;
-		}
-#endif /* HAVE_LIBPAM */
-#endif /* ENABLE_HYBRID */
-
-		default:
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "unexpected privsep command %d\n", 
-			    combuf->hdr.ac_cmd);
-			goto out;
-			break;
-		}
-
-		/* This frees reply */
-		if (privsep_send(privsep_sock[0], 
-		    reply, reply->hdr.ac_len) != 0)
-			goto out;
-
-		racoon_free(combuf);
-	}
-
-out:
-	plog(LLV_INFO, LOCATION, NULL, "privsep exit\n");
-	_exit(0);
-}
-
-
-vchar_t *
-privsep_eay_get_pkcs1privkey(path) 
-	char *path;
-{
-	vchar_t *privkey;
-	struct privsep_com_msg *msg;
-	size_t len;
-
-	if (geteuid() == 0)
-		return eay_get_pkcs1privkey(path);
-
-	len = sizeof(*msg) + strlen(path) + 1;
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return NULL;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_EAY_GET_PKCS1PRIVKEY;
-	msg->hdr.ac_len = len;
-	msg->bufs.buflen[0] = len - sizeof(*msg);
-	memcpy(msg + 1, path, msg->bufs.buflen[0]);
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return NULL;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return NULL;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		goto out;
-	}
-
-	if ((privkey = vmalloc(len - sizeof(*msg))) == NULL)
-		goto out;
-
-	memcpy(privkey->v, msg + 1, privkey->l);
-	racoon_free(msg);
-	return privkey;
-
-out:
-	racoon_free(msg);
-	return NULL;
-}
-
-/*
- * No prigilege separation trick here, we just open PFKEY before
- * dropping root privs and we remember it later.
- */
-static int  pfkey_socket = -1;
-int
-privsep_pfkey_open(void)
-{
-	int ps;
-
-	if (pfkey_socket != -1)
-		return pfkey_socket;
-
-	ps = pfkey_open();
-	if (ps != -1)
-		pfkey_socket = ps;
-
-	return ps;
-}
-
-/*
- * Consequence of the above trickery: don't 
- * really close PFKEY as we never re-open it.
- */
-void
-privsep_pfkey_close(ps)
-	int ps;
-{
-	return;
-}
-
-int
-privsep_script_exec(script, name, envp)
-	char *script;
-	int name;
-	char *const envp[];
-{
-	int count = 0;
-	char *const *c;
-	char *data;
-	size_t len;
-	struct privsep_com_msg *msg;
-
-	if (geteuid() == 0)
-		return script_exec(script, name, envp);
-
-	if ((msg = racoon_malloc(sizeof(*msg))) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-
-	bzero(msg, sizeof(*msg));
-	msg->hdr.ac_cmd = PRIVSEP_SCRIPT_EXEC;
-	msg->hdr.ac_len = sizeof(*msg);
-
-	/*
-	 * We send: 
-	 * script, name, envp[0], ... envp[N], void
-	 */
-
-	/*
-	 * Safety check on the counts: PRIVSEP_NBUF_MAX max
-	 */
-	count = 0;
-	count++;					/* script */
-	count++;					/* name */
-	for (c = envp; *c; c++)				/* envp */
-		count++;
-	count++;					/* void */
-
-	if (count > PRIVSEP_NBUF_MAX) {
-		plog(LLV_ERROR, LOCATION, NULL, "Unexpected error: "
-		    "privsep_script_exec count > PRIVSEP_NBUF_MAX\n");
-		racoon_free(msg);
-		return -1;
-	}
-
-
-	/*
-	 * Compute the length
-	 */
-	count = 0;
-	msg->bufs.buflen[count] = strlen(script) + 1;	/* script */
-	msg->hdr.ac_len += msg->bufs.buflen[count++];
-
-	msg->bufs.buflen[count] = sizeof(name);		/* name */
-	msg->hdr.ac_len += msg->bufs.buflen[count++];
-
-	for (c = envp; *c; c++) {			/* envp */
-		msg->bufs.buflen[count] = strlen(*c) + 1;
-		msg->hdr.ac_len += msg->bufs.buflen[count++];
-	}
-
-	msg->bufs.buflen[count] = 0; 			/* void */
-	msg->hdr.ac_len += msg->bufs.buflen[count++];
-
-	if ((msg = racoon_realloc(msg, msg->hdr.ac_len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	
-	/*
-	 * Now copy the data
-	 */
-	data = (char *)(msg + 1);
-	count = 0;
-
-	memcpy(data, (char *)script, msg->bufs.buflen[count]);	/* script */
-	data += msg->bufs.buflen[count++];
-
-	memcpy(data, (char *)&name, msg->bufs.buflen[count]);	/* name */
-	data += msg->bufs.buflen[count++];
-
-	for (c = envp; *c; c++) {				/* envp */
-		memcpy(data, *c, msg->bufs.buflen[count]); 
-		data += msg->bufs.buflen[count++];
-	}
-
-	count++;						/* void */
-
-	/*
-	 * And send it!
-	 */
-	if (privsep_send(privsep_sock[1], msg, msg->hdr.ac_len) != 0)
-		return -1;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return -1;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		racoon_free(msg);
-		return -1;
-	}
-
-	racoon_free(msg);
-	return 0;
-}
-
-vchar_t *
-privsep_getpsk(str, keylen)
-	const char *str;
-	int keylen;
-{
-	vchar_t *psk;
-	struct privsep_com_msg *msg;
-	size_t len;
-	int *keylenp;
-	char *data;
-
-	if (geteuid() == 0)
-		return getpsk(str, keylen);
-
-	len = sizeof(*msg) + strlen(str) + 1 + sizeof(keylen);
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return NULL;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_GETPSK;
-	msg->hdr.ac_len = len;
-
-	data = (char *)(msg + 1);
-	msg->bufs.buflen[0] = strlen(str) + 1;
-	memcpy(data, str, msg->bufs.buflen[0]);
-
-	data += msg->bufs.buflen[0];
-	msg->bufs.buflen[1] = sizeof(keylen);
-	memcpy(data, &keylen, sizeof(keylen));
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return NULL;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return NULL;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		goto out;
-	}
-
-	if ((psk = vmalloc(len - sizeof(*msg))) == NULL)
-		goto out;
-
-	memcpy(psk->v, msg + 1, psk->l);
-	racoon_free(msg);
-	return psk;
-
-out:
-	racoon_free(msg);
-	return NULL;
-}
-
-#ifdef ENABLE_HYBRID
-int
-privsep_xauth_login_system(usr, pwd)
-	char *usr;
-	char *pwd;
-{
-	struct privsep_com_msg *msg;
-	size_t len;
-	char *data;
-
-	if (geteuid() == 0)
-		return xauth_login_system(usr, pwd);
-
-	len = sizeof(*msg) + strlen(usr) + 1 + strlen(pwd) + 1;
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_XAUTH_LOGIN_SYSTEM;
-	msg->hdr.ac_len = len;
-
-	data = (char *)(msg + 1);
-	msg->bufs.buflen[0] = strlen(usr) + 1;
-	memcpy(data, usr, msg->bufs.buflen[0]);
-	data += msg->bufs.buflen[0];
-
-	msg->bufs.buflen[1] = strlen(pwd) + 1;
-	memcpy(data, pwd, msg->bufs.buflen[1]);
-	
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return -1;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return -1;
-
-	if (msg->hdr.ac_errno != 0) {
-		racoon_free(msg);
-		return -1;
-	}
-
-	racoon_free(msg);
-	return 0;
-}
-
-int 
-privsep_accounting_system(port, raddr, usr, inout)
-	int port;
-	struct sockaddr *raddr;
-	char *usr;
-	int inout;
-{
-	struct privsep_com_msg *msg;
-	size_t len;
-	char *data;
-	int result;
-
-	if (geteuid() == 0)
-		return isakmp_cfg_accounting_system(port, raddr,
-						    usr, inout);
-
-	len = sizeof(*msg) 
-	    + sizeof(port)
-	    + sysdep_sa_len(raddr) 
-	    + strlen(usr) + 1
-	    + sizeof(inout);
-
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_ACCOUNTING_SYSTEM;
-	msg->hdr.ac_len = len;
-	msg->bufs.buflen[0] = sizeof(port);
-	msg->bufs.buflen[1] = sysdep_sa_len(raddr);
-	msg->bufs.buflen[2] = strlen(usr) + 1;
-	msg->bufs.buflen[3] = sizeof(inout);
-
-	data = (char *)(msg + 1);
-	memcpy(data, &port, msg->bufs.buflen[0]);
-
-	data += msg->bufs.buflen[0];
-	memcpy(data, raddr, msg->bufs.buflen[1]);
-
-	data += msg->bufs.buflen[1];
-	memcpy(data, usr, msg->bufs.buflen[2]);
-
-	data += msg->bufs.buflen[2];
-	memcpy(data, &inout, msg->bufs.buflen[3]);
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return -1;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return -1;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		goto out;
-	}
-
-	racoon_free(msg);
-	return 0;
-
-out:
-	racoon_free(msg);
-	return -1;
-}
-
-static int
-port_check(port)
-	int port;
-{
-	if ((port < 0) || (port >= isakmp_cfg_config.pool_size)) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "privsep: port %d outside of allowed range [0,%zu]\n",
-		    port, isakmp_cfg_config.pool_size - 1);
-		return -1;
-	}
-
-	return 0;
-}
-#endif
-
-static int 
-safety_check(msg, index)
-	struct privsep_com_msg *msg;
-	int index;
-{
-	if (index >= PRIVSEP_NBUF_MAX) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "privsep: Corrupted message, too many buffers\n");
-		return -1;
-	}
-		
-	if (msg->bufs.buflen[index] == 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "privsep: Corrupted message, unexpected void buffer\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * Filter unsafe environement variables
- */
-static int
-unsafe_env(envp)
-	char *const *envp;
-{
-	char *const *e;
-	char *const *be;
-	char *const bad_env[] = { "PATH=", "LD_LIBRARY_PATH=", "IFS=", NULL };
-
-	for (e = envp; *e; e++) {
-		for (be = bad_env; *be; be++) {
-			if (strncmp(*e, *be, strlen(*be)) == 0) {
-				goto found;
-			}
-		}
-	}
-
-	return 0;
-found:
-	plog(LLV_ERROR, LOCATION, NULL, 
-	    "privsep_script_exec: unsafe environement variable\n");
-	return -1;
-}
-
-/*
- * Check path safety
- */
-static int 
-unsafe_path(script, pathtype)
-	char *script;
-	int pathtype;
-{
-	char *path;
-	char rpath[MAXPATHLEN + 1];
-	size_t len;
-
-	if (script == NULL) 
-		return -1;
-
-	path = lcconf->pathinfo[pathtype];
-
-	/* No path was given for scripts: skip the check */
-	if (path == NULL)
-		return 0;
-
-	if (realpath(script, rpath) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "script path \"%s\" is invalid\n", script);
-		return -1;
-	}
-
-	len = strlen(path);
-	if (strncmp(path, rpath, len) != 0)
-		return -1;
-
-	return 0;
-}
-
-static int 
-unknown_name(name)
-	int name;
-{
-	if ((name < 0) || (name > SCRIPT_MAX)) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "privsep_script_exec: unsafe name index\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-#ifdef HAVE_LIBPAM
-int 
-privsep_accounting_pam(port, inout)
-	int port;
-	int inout;
-{
-	struct privsep_com_msg *msg;
-	size_t len;
-	int *port_data;
-	int *inout_data;
-	int *pool_size_data;
-	int result;
-
-	if (geteuid() == 0)
-		return isakmp_cfg_accounting_pam(port, inout);
-
-	len = sizeof(*msg) 
-	    + sizeof(port) 
-	    + sizeof(inout)
-	    + sizeof(isakmp_cfg_config.pool_size);
-
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_ACCOUNTING_PAM;
-	msg->hdr.ac_len = len;
-	msg->bufs.buflen[0] = sizeof(port);
-	msg->bufs.buflen[1] = sizeof(inout);
-	msg->bufs.buflen[2] = sizeof(isakmp_cfg_config.pool_size);
-
-	port_data = (int *)(msg + 1);
-	inout_data = (int *)(port_data + 1);
-	pool_size_data = (int *)(inout_data + 1);
-
-	*port_data = port;
-	*inout_data = inout;
-	*pool_size_data = isakmp_cfg_config.pool_size;
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return -1;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return -1;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		goto out;
-	}
-
-	racoon_free(msg);
-	return 0;
-
-out:
-	racoon_free(msg);
-	return -1;
-}
-
-int 
-privsep_xauth_login_pam(port, raddr, usr, pwd)
-	int port;
-	struct sockaddr *raddr;
-	char *usr;
-	char *pwd;
-{
-	struct privsep_com_msg *msg;
-	size_t len;
-	char *data;
-	int result;
-
-	if (geteuid() == 0)
-		return xauth_login_pam(port, raddr, usr, pwd);
-
-	len = sizeof(*msg) 
-	    + sizeof(port)
-	    + sizeof(isakmp_cfg_config.pool_size)
-	    + sysdep_sa_len(raddr) 
-	    + strlen(usr) + 1
-	    + strlen(pwd) + 1;
-
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return -1;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_XAUTH_LOGIN_PAM;
-	msg->hdr.ac_len = len;
-	msg->bufs.buflen[0] = sizeof(port);
-	msg->bufs.buflen[1] = sizeof(isakmp_cfg_config.pool_size);
-	msg->bufs.buflen[2] = sysdep_sa_len(raddr);
-	msg->bufs.buflen[3] = strlen(usr) + 1;
-	msg->bufs.buflen[4] = strlen(pwd) + 1;
-
-	data = (char *)(msg + 1);
-	memcpy(data, &port, msg->bufs.buflen[0]);
-
-	data += msg->bufs.buflen[0];
-	memcpy(data, &isakmp_cfg_config.pool_size, msg->bufs.buflen[1]);
-
-	data += msg->bufs.buflen[1];
-	memcpy(data, raddr, msg->bufs.buflen[2]);
-
-	data += msg->bufs.buflen[2];
-	memcpy(data, usr, msg->bufs.buflen[3]);
-
-	data += msg->bufs.buflen[3];
-	memcpy(data, pwd, msg->bufs.buflen[4]);
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return -1;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return -1;
-
-	if (msg->hdr.ac_errno != 0) {
-		errno = msg->hdr.ac_errno;
-		goto out;
-	}
-
-	racoon_free(msg);
-	return 0;
-
-out:
-	racoon_free(msg);
-	return -1;
-}
-
-void
-privsep_cleanup_pam(port)
-	int port;
-{
-	struct privsep_com_msg *msg;
-	size_t len;
-	char *data;
-	int result;
-
-	if (geteuid() == 0)
-		return cleanup_pam(port);
-
-	len = sizeof(*msg) 
-	    + sizeof(port)
-	    + sizeof(isakmp_cfg_config.pool_size);
-
-	if ((msg = racoon_malloc(len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "Cannot allocate memory: %s\n", strerror(errno));
-		return;
-	}
-	bzero(msg, len);
-	msg->hdr.ac_cmd = PRIVSEP_CLEANUP_PAM;
-	msg->hdr.ac_len = len;
-	msg->bufs.buflen[0] = sizeof(port);
-	msg->bufs.buflen[1] = sizeof(isakmp_cfg_config.pool_size);
-
-	data = (char *)(msg + 1);
-	memcpy(data, &port, msg->bufs.buflen[0]);
-
-	data += msg->bufs.buflen[0];
-	memcpy(data, &isakmp_cfg_config.pool_size, msg->bufs.buflen[1]);
-
-	if (privsep_send(privsep_sock[1], msg, len) != 0)
-		return;
-
-	if (privsep_recv(privsep_sock[1], &msg, &len) != 0)
-		return;
-
-	if (msg->hdr.ac_errno != 0)
-		errno = msg->hdr.ac_errno;
-
-	racoon_free(msg);
-	return;
-}
-#endif
diff --git a/src/racoon/privsep.h b/src/racoon/privsep.h
deleted file mode 100644
index 0fa4363..0000000
--- a/src/racoon/privsep.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*	$NetBSD: privsep.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: privsep.h,v 1.5 2005/06/07 12:22:11 fredsen Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _PRIVSEP_H
-#define _PRIVSEP_H
-
-#define PRIVSEP_EAY_GET_PKCS1PRIVKEY	0x0801	/* admin_com_bufs follows */
-#define PRIVSEP_SCRIPT_EXEC		0x0803	/* admin_com_bufs follows */
-#define PRIVSEP_GETPSK			0x0804	/* admin_com_bufs follows */
-#define PRIVSEP_XAUTH_LOGIN_SYSTEM	0x0805	/* admin_com_bufs follows */
-#define PRIVSEP_ACCOUNTING_PAM		0x0806	/* admin_com_bufs follows */
-#define PRIVSEP_XAUTH_LOGIN_PAM		0x0807	/* admin_com_bufs follows */
-#define PRIVSEP_CLEANUP_PAM		0x0808	/* admin_com_bufs follows */
-#define PRIVSEP_ACCOUNTING_SYSTEM	0x0809	/* admin_com_bufs follows */
-
-#define PRIVSEP_NBUF_MAX 24
-#define PRIVSEP_BUFLEN_MAX 4096
-struct admin_com_bufs {
-	size_t buflen[PRIVSEP_NBUF_MAX];
-	/* Followed by the buffers */
-};
-
-struct privsep_com_msg {
-	struct admin_com hdr;
-	struct admin_com_bufs bufs;
-};
-
-int privsep_init __P((void));
-
-vchar_t *privsep_eay_get_pkcs1privkey __P((char *));
-int privsep_pfkey_open __P((void));
-void privsep_pfkey_close __P((int));
-int privsep_script_exec __P((char *, int, char * const *));
-vchar_t *privsep_getpsk __P((const char *, const int));
-int privsep_xauth_login_system __P((char *, char *));
-#ifdef HAVE_LIBPAM
-int privsep_accounting_pam __P((int, int));
-int privsep_xauth_login_pam __P((int, struct sockaddr *, char *, char *));
-void privsep_cleanup_pam __P((int));
-#endif
-int privsep_accounting_system __P((int, struct sockaddr *, char *, int));
-#endif /* _PRIVSEP_H */
diff --git a/src/racoon/proposal.c b/src/racoon/proposal.c
deleted file mode 100644
index 26c9274..0000000
--- a/src/racoon/proposal.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/*	$NetBSD: proposal.c,v 1.13.4.2 2008/07/22 13:25:42 vanhu Exp $	*/
-
-/* $Id: proposal.c,v 1.13.4.2 2008/07/22 13:25:42 vanhu Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "policy.h"
-#include "pfkey.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "algorithm.h"
-#include "proposal.h"
-#include "sainfo.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "oakley.h"
-#include "handler.h"
-#include "strnames.h"
-#include "gcmalloc.h"
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-
-static uint g_nextreqid = 1;
-
-/* %%%
- * modules for ipsec sa spec
- */
-struct saprop *
-newsaprop()
-{
-	struct saprop *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-struct saproto *
-newsaproto()
-{
-	struct saproto *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-/* set saprop to last part of the prop tree */
-void
-inssaprop(head, new)
-	struct saprop **head;
-	struct saprop *new;
-{
-	struct saprop *p;
-
-	if (*head == NULL) {
-		*head = new;
-		return;
-	}
-
-	for (p = *head; p->next; p = p->next)
-		;
-	p->next = new;
-
-	return;
-}
-
-/* set saproto to the end of the proto tree in saprop */
-void
-inssaproto(pp, new)
-	struct saprop *pp;
-	struct saproto *new;
-{
-	struct saproto *p;
-
-	for (p = pp->head; p && p->next; p = p->next)
-		;
-	if (p == NULL)
-		pp->head = new;
-	else
-		p->next = new;
-
-	return;
-}
-
-/* set saproto to the top of the proto tree in saprop */
-void
-inssaprotorev(pp, new)
-      struct saprop *pp;
-      struct saproto *new;
-{
-      new->next = pp->head;
-      pp->head = new;
-
-      return;
-}
-
-struct satrns *
-newsatrns()
-{
-	struct satrns *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-/* set saproto to last part of the proto tree in saprop */
-void
-inssatrns(pr, new)
-	struct saproto *pr;
-	struct satrns *new;
-{
-	struct satrns *tr;
-
-	for (tr = pr->head; tr && tr->next; tr = tr->next)
-		;
-	if (tr == NULL)
-		pr->head = new;
-	else
-		tr->next = new;
-
-	return;
-}
-
-/*
- * take a single match between saprop.  allocate a new proposal and return it
- * for future use (like picking single proposal from a bundle).
- *	pp1: peer's proposal.
- *	pp2: my proposal.
- * NOTE: In the case of initiator, must be ensured that there is no
- * modification of the proposal by calling cmp_aproppair_i() before
- * this function.
- * XXX cannot understand the comment!
- */
-struct saprop *
-cmpsaprop_alloc(ph1, pp1, pp2, side)
-	struct ph1handle *ph1;
-	const struct saprop *pp1, *pp2;
-	int side;
-{
-	struct saprop *newpp = NULL;
-	struct saproto *pr1, *pr2, *newpr = NULL;
-	struct satrns *tr1, *tr2, *newtr;
-	const int ordermatters = 0;
-	int npr1, npr2;
-	int spisizematch;
-
-	newpp = newsaprop();
-	if (newpp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate saprop.\n");
-		return NULL;
-	}
-	newpp->prop_no = pp1->prop_no;
-
-	/* see proposal.h about lifetime/key length and PFS selection. */
-
-	/* check time/bytes lifetime and PFS */
-	switch (ph1->rmconf->pcheck_level) {
-	case PROP_CHECK_OBEY:
-		newpp->lifetime = pp1->lifetime;
-		newpp->lifebyte = pp1->lifebyte;
-		newpp->pfs_group = pp1->pfs_group;
-		break;
-
-	case PROP_CHECK_STRICT:
-		if (pp1->lifetime > pp2->lifetime) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"long lifetime proposed: "
-				"my:%d peer:%d\n",
-				(int)pp2->lifetime, (int)pp1->lifetime);
-			goto err;
-		}
-		if (pp1->lifebyte > pp2->lifebyte) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"long lifebyte proposed: "
-				"my:%d peer:%d\n",
-				pp2->lifebyte, pp1->lifebyte);
-			goto err;
-		}
-		newpp->lifetime = pp1->lifetime;
-		newpp->lifebyte = pp1->lifebyte;
-
-    prop_pfs_check:
-		if (pp2->pfs_group != 0 && pp1->pfs_group != pp2->pfs_group) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfs group mismatched: "
-				"my:%d peer:%d\n",
-				pp2->pfs_group, pp1->pfs_group);
-			goto err;
-		}
-		newpp->pfs_group = pp1->pfs_group;
-		break;
-
-	case PROP_CHECK_CLAIM:
-		/* lifetime */
-		if (pp1->lifetime <= pp2->lifetime) {
-			newpp->lifetime = pp1->lifetime;
-		} else {
-			newpp->lifetime = pp2->lifetime;
-			newpp->claim |= IPSECDOI_ATTR_SA_LD_TYPE_SEC;
-			plog(LLV_NOTIFY, LOCATION, NULL,
-				"use own lifetime: "
-				"my:%d peer:%d\n",
-				(int)pp2->lifetime, (int)pp1->lifetime);
-		}
-
-		/* lifebyte */
-		if (pp1->lifebyte > pp2->lifebyte) {
-			newpp->lifebyte = pp2->lifebyte;
-			newpp->claim |= IPSECDOI_ATTR_SA_LD_TYPE_SEC;
-			plog(LLV_NOTIFY, LOCATION, NULL,
-				"use own lifebyte: "
-				"my:%d peer:%d\n",
-				pp2->lifebyte, pp1->lifebyte);
-		}
-		newpp->lifebyte = pp1->lifebyte;
-
-    		goto prop_pfs_check;
-		break;
-
-	case PROP_CHECK_EXACT:
-		if (pp1->lifetime != pp2->lifetime) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"lifetime mismatched: "
-				"my:%d peer:%d\n",
-				(int)pp2->lifetime, (int)pp1->lifetime);
-			goto err;
-		}
-
-		if (pp1->lifebyte != pp2->lifebyte) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"lifebyte mismatched: "
-				"my:%d peer:%d\n",
-				pp2->lifebyte, pp1->lifebyte);
-			goto err;
-		}
-		if (pp1->pfs_group != pp2->pfs_group) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfs group mismatched: "
-				"my:%d peer:%d\n",
-				pp2->pfs_group, pp1->pfs_group);
-			goto err;
-		}
-		newpp->lifetime = pp1->lifetime;
-		newpp->lifebyte = pp1->lifebyte;
-		newpp->pfs_group = pp1->pfs_group;
-		break;
-
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid pcheck_level why?.\n");
-		goto err;
-	}
-
-#ifdef HAVE_SECCTX
-	/* check the security_context properties.
-	 * It is possible for one side to have a security context
-	 * and the other side doesn't. If so, this is an error.
-	 */
-
-	if (*pp1->sctx.ctx_str && !(*pp2->sctx.ctx_str)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "My proposal missing security context\n");
-		goto err;
-	}
-	if (!(*pp1->sctx.ctx_str) && *pp2->sctx.ctx_str) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		     "Peer is missing security context\n");
-		goto err;
-	}
-
-	if (*pp1->sctx.ctx_str && *pp2->sctx.ctx_str) {
-		if (pp1->sctx.ctx_doi == pp2->sctx.ctx_doi)
-			newpp->sctx.ctx_doi = pp1->sctx.ctx_doi;
-		else {
-			plog(LLV_ERROR, LOCATION, NULL, 
-			     "sec doi mismatched: my:%d peer:%d\n",
-			     pp2->sctx.ctx_doi, pp1->sctx.ctx_doi);
-			     goto err;
-		}
-
-		if (pp1->sctx.ctx_alg == pp2->sctx.ctx_alg)
-			newpp->sctx.ctx_alg = pp1->sctx.ctx_alg;
-		else {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "sec alg mismatched: my:%d peer:%d\n",
-			     pp2->sctx.ctx_alg, pp1->sctx.ctx_alg);
-			goto err;
-		}
-
-		if ((pp1->sctx.ctx_strlen != pp2->sctx.ctx_strlen) ||
-		     memcmp(pp1->sctx.ctx_str, pp2->sctx.ctx_str,
-		     pp1->sctx.ctx_strlen) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			     "sec ctx string mismatched: my:%s peer:%s\n",
-			     pp2->sctx.ctx_str, pp1->sctx.ctx_str);
-				goto err;
-		} else {
-			newpp->sctx.ctx_strlen = pp1->sctx.ctx_strlen;
-			memcpy(newpp->sctx.ctx_str, pp1->sctx.ctx_str,
-				pp1->sctx.ctx_strlen);
-		}
-	}
-#endif /* HAVE_SECCTX */
-
-	npr1 = npr2 = 0;
-	for (pr1 = pp1->head; pr1; pr1 = pr1->next)
-		npr1++;
-	for (pr2 = pp2->head; pr2; pr2 = pr2->next)
-		npr2++;
-	if (npr1 != npr2)
-		goto err;
-
-	/* check protocol order */
-	pr1 = pp1->head;
-	pr2 = pp2->head;
-
-	while (1) {
-		if (!ordermatters) {
-			/*
-			 * XXX does not work if we have multiple proposals
-			 * with the same proto_id
-			 */
-			switch (side) {
-			case RESPONDER:
-				if (!pr2)
-					break;
-				for (pr1 = pp1->head; pr1; pr1 = pr1->next) {
-					if (pr1->proto_id == pr2->proto_id)
-						break;
-				}
-				break;
-			case INITIATOR:
-				if (!pr1)
-					break;
-				for (pr2 = pp2->head; pr2; pr2 = pr2->next) {
-					if (pr2->proto_id == pr1->proto_id)
-						break;
-				}
-				break;
-			}
-		}
-		if (!pr1 || !pr2)
-			break;
-
-		if (pr1->proto_id != pr2->proto_id) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"proto_id mismatched: "
-				"my:%s peer:%s\n",
-				s_ipsecdoi_proto(pr2->proto_id),
-				s_ipsecdoi_proto(pr1->proto_id));
-			goto err;
-		}
-		spisizematch = 0;
-		if (pr1->spisize == pr2->spisize)
-			spisizematch = 1;
-		else if (pr1->proto_id == IPSECDOI_PROTO_IPCOMP) {
-			/*
-			 * draft-shacham-ippcp-rfc2393bis-05.txt:
-			 * need to accept 16bit and 32bit SPI (CPI) for IPComp.
-			 */
-			if (pr1->spisize == sizeof(u_int16_t) &&
-			    pr2->spisize == sizeof(u_int32_t)) {
-				spisizematch = 1;
-			} else if (pr2->spisize == sizeof(u_int16_t) &&
-				 pr1->spisize == sizeof(u_int32_t)) {
-				spisizematch = 1;
-			}
-			if (spisizematch) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				    "IPComp SPI size promoted "
-				    "from 16bit to 32bit\n");
-			}
-		}
-		if (!spisizematch) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"spisize mismatched: "
-				"my:%d peer:%d\n",
-				(int)pr2->spisize, (int)pr1->spisize);
-			goto err;
-		}
-
-#ifdef ENABLE_NATT
-		if ((ph1->natt_flags & NAT_DETECTED) && 
-		    natt_udp_encap (pr2->encmode))
-		{
-			plog(LLV_INFO, LOCATION, NULL, "Adjusting my encmode %s->%s\n",
-			     s_ipsecdoi_encmode(pr2->encmode),
-			     s_ipsecdoi_encmode(pr2->encmode - ph1->natt_options->mode_udp_diff));
-			pr2->encmode -= ph1->natt_options->mode_udp_diff;
-			pr2->udp_encap = 1;
-		}
-
-		if ((ph1->natt_flags & NAT_DETECTED) &&
-		    natt_udp_encap (pr1->encmode))
-		{
-			plog(LLV_INFO, LOCATION, NULL, "Adjusting peer's encmode %s(%d)->%s(%d)\n",
-			     s_ipsecdoi_encmode(pr1->encmode),
-			     pr1->encmode,
-			     s_ipsecdoi_encmode(pr1->encmode - ph1->natt_options->mode_udp_diff),
-			     pr1->encmode - ph1->natt_options->mode_udp_diff);
-			pr1->encmode -= ph1->natt_options->mode_udp_diff;
-			pr1->udp_encap = 1;
-		}
-#endif
-
-		if (pr1->encmode != pr2->encmode) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"encmode mismatched: "
-				"my:%s peer:%s\n",
-				s_ipsecdoi_encmode(pr2->encmode),
-				s_ipsecdoi_encmode(pr1->encmode));
-			goto err;
-		}
-
-		for (tr1 = pr1->head; tr1; tr1 = tr1->next) {
-			for (tr2 = pr2->head; tr2; tr2 = tr2->next) {
-				if (cmpsatrns(pr1->proto_id, tr1, tr2, ph1->rmconf->pcheck_level) == 0)
-					goto found;
-			}
-		}
-
-		goto err;
-
-	    found:
-		newpr = newsaproto();
-		if (newpr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to allocate saproto.\n");
-			goto err;
-		}
-		newpr->proto_id = pr1->proto_id;
-		newpr->spisize = pr1->spisize;
-		newpr->encmode = pr1->encmode;
-		newpr->spi = pr2->spi;		/* copy my SPI */
-		newpr->spi_p = pr1->spi;	/* copy peer's SPI */
-		newpr->reqid_in = pr2->reqid_in;
-		newpr->reqid_out = pr2->reqid_out;
-#ifdef ENABLE_NATT
-		newpr->udp_encap = pr1->udp_encap | pr2->udp_encap;
-#endif
-
-		newtr = newsatrns();
-		if (newtr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to allocate satrns.\n");
-			racoon_free(newpr);
-			goto err;
-		}
-		newtr->trns_no = tr1->trns_no;
-		newtr->trns_id = tr1->trns_id;
-		newtr->encklen = tr1->encklen;
-		newtr->authtype = tr1->authtype;
-
-		inssatrns(newpr, newtr);
-		inssaproto(newpp, newpr);
-
-		pr1 = pr1->next;
-		pr2 = pr2->next;
-	}
-
-	/* XXX should check if we have visited all items or not */
-	if (!ordermatters) {
-		switch (side) {
-		case RESPONDER:
-			if (!pr2)
-				pr1 = NULL;
-			break;
-		case INITIATOR:
-			if (!pr1)
-				pr2 = NULL;
-			break;
-		}
-	}
-
-	/* should be matched all protocols in a proposal */
-	if (pr1 != NULL || pr2 != NULL)
-		goto err;
-
-	return newpp;
-
-err:
-	flushsaprop(newpp);
-	return NULL;
-}
-
-/* take a single match between saprop.  returns 0 if pp1 equals to pp2. */
-int
-cmpsaprop(pp1, pp2)
-	const struct saprop *pp1, *pp2;
-{
-	if (pp1->pfs_group != pp2->pfs_group) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"pfs_group mismatch. mine:%d peer:%d\n",
-			pp1->pfs_group, pp2->pfs_group);
-		/* FALLTHRU */
-	}
-
-	if (pp1->lifetime > pp2->lifetime) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"less lifetime proposed. mine:%d peer:%d\n",
-			(int)pp1->lifetime, (int)pp2->lifetime);
-		/* FALLTHRU */
-	}
-	if (pp1->lifebyte > pp2->lifebyte) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"less lifebyte proposed. mine:%d peer:%d\n",
-			pp1->lifebyte, pp2->lifebyte);
-		/* FALLTHRU */
-	}
-
-	return 0;
-}
-
-/*
- * take a single match between satrns.  returns 0 if tr1 equals to tr2.
- * tr1: peer's satrns
- * tr2: my satrns
- */
-int
-cmpsatrns(proto_id, tr1, tr2, check_level)
-	int proto_id;
-	const struct satrns *tr1, *tr2;
-	int check_level;
-{
-	if (tr1->trns_id != tr2->trns_id) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"trns_id mismatched: "
-			"my:%s peer:%s\n",
-			s_ipsecdoi_trns(proto_id, tr2->trns_id),
-			s_ipsecdoi_trns(proto_id, tr1->trns_id));
-		return 1;
-	}
-
-	if (tr1->authtype != tr2->authtype) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"authtype mismatched: "
-			"my:%s peer:%s\n",
-			s_ipsecdoi_attr_v(IPSECDOI_ATTR_AUTH, tr2->authtype),
-			s_ipsecdoi_attr_v(IPSECDOI_ATTR_AUTH, tr1->authtype));
-		return 1;
-	}
-
-	/* Check key length regarding checkmode
-	 * XXX Shall we send some kind of notify message when key length rejected ?
-	 */
-	switch(check_level){
-	case PROP_CHECK_OBEY:
-		return 0;
-		break;
-
-	case PROP_CHECK_STRICT:
-		/* FALLTHROUGH */
-	case PROP_CHECK_CLAIM:
-		if (tr1->encklen < tr2->encklen) {
-		plog(LLV_WARNING, LOCATION, NULL,
-				 "low key length proposed, "
-				 "mine:%d peer:%d.\n",
-			tr2->encklen, tr1->encklen);
-			return 1;
-		}
-		break;
-	case PROP_CHECK_EXACT:
-		if (tr1->encklen != tr2->encklen) {
-			plog(LLV_WARNING, LOCATION, NULL,
-				 "key length mismatched, "
-				 "mine:%d peer:%d.\n",
-				 tr2->encklen, tr1->encklen);
-			return 1;
-		}
-		break;
-	}
-
-	return 0;
-}
-
-int
-set_satrnsbysainfo(pr, sainfo)
-	struct saproto *pr;
-	struct sainfo *sainfo;
-{
-	struct sainfoalg *a, *b;
-	struct satrns *newtr;
-	int t;
-
-	switch (pr->proto_id) {
-	case IPSECDOI_PROTO_IPSEC_AH:
-		if (sainfo->algs[algclass_ipsec_auth] == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no auth algorithm found\n");
-			goto err;
-		}
-		t = 1;
-		for (a = sainfo->algs[algclass_ipsec_auth]; a; a = a->next) {
-
-			if (a->alg == IPSECDOI_ATTR_AUTH_NONE)
-				continue;
-				
-			/* allocate satrns */
-			newtr = newsatrns();
-			if (newtr == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate satrns.\n");
-				goto err;
-			}
-
-			newtr->trns_no = t++;
-			newtr->trns_id = ipsecdoi_authalg2trnsid(a->alg);
-			newtr->authtype = a->alg;
-
-			inssatrns(pr, newtr);
-		}
-		break;
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		if (sainfo->algs[algclass_ipsec_enc] == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no encryption algorithm found\n");
-			goto err;
-		}
-		t = 1;
-		for (a = sainfo->algs[algclass_ipsec_enc]; a; a = a->next) {
-			for (b = sainfo->algs[algclass_ipsec_auth]; b; b = b->next) {
-				/* allocate satrns */
-				newtr = newsatrns();
-				if (newtr == NULL) {
-					plog(LLV_ERROR, LOCATION, NULL,
-						"failed to allocate satrns.\n");
-					goto err;
-				}
-
-				newtr->trns_no = t++;
-				newtr->trns_id = a->alg;
-				newtr->encklen = a->encklen;
-				newtr->authtype = b->alg;
-
-				inssatrns(pr, newtr);
-			}
-		}
-		break;
-	case IPSECDOI_PROTO_IPCOMP:
-		if (sainfo->algs[algclass_ipsec_comp] == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"no ipcomp algorithm found\n");
-			goto err;
-		}
-		t = 1;
-		for (a = sainfo->algs[algclass_ipsec_comp]; a; a = a->next) {
-
-			/* allocate satrns */
-			newtr = newsatrns();
-			if (newtr == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate satrns.\n");
-				goto err;
-			}
-
-			newtr->trns_no = t++;
-			newtr->trns_id = a->alg;
-			newtr->authtype = IPSECDOI_ATTR_AUTH_NONE; /*no auth*/
-
-			inssatrns(pr, newtr);
-		}
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unknown proto_id (%d).\n", pr->proto_id);
-		goto err;
-	}
-
-	/* no proposal found */
-	if (pr->head == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "no algorithms found.\n");
-		return -1;
-	}
-
-	return 0;
-
-err:
-	flushsatrns(pr->head);
-	return -1;
-}
-
-struct saprop *
-aproppair2saprop(p0)
-	struct prop_pair *p0;
-{
-	struct prop_pair *p, *t;
-	struct saprop *newpp;
-	struct saproto *newpr;
-	struct satrns *newtr;
-	u_int8_t *spi;
-
-	if (p0 == NULL)
-		return NULL;
-
-	/* allocate ipsec a sa proposal */
-	newpp = newsaprop();
-	if (newpp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate saprop.\n");
-		return NULL;
-	}
-	newpp->prop_no = p0->prop->p_no;
-	/* lifetime & lifebyte must be updated later */
-
-	for (p = p0; p; p = p->next) {
-
-		/* allocate ipsec sa protocol */
-		newpr = newsaproto();
-		if (newpr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to allocate saproto.\n");
-			goto err;
-		}
-
-		/* check spi size */
-		/* XXX should be handled isakmp cookie */
-		if (sizeof(newpr->spi) < p->prop->spi_size) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"invalid spi size %d.\n", p->prop->spi_size);
-			racoon_free(newpr);
-			goto err;
-		}
-
-		/*
-		 * XXX SPI bits are left-filled, for use with IPComp.
-		 * we should be switching to variable-length spi field...
-		 */
-		newpr->proto_id = p->prop->proto_id;
-		newpr->spisize = p->prop->spi_size;
-		memset(&newpr->spi, 0, sizeof(newpr->spi));
-		spi = (u_int8_t *)&newpr->spi;
-		spi += sizeof(newpr->spi);
-		spi -= p->prop->spi_size;
-		memcpy(spi, p->prop + 1, p->prop->spi_size);
-		newpr->reqid_in = 0;
-		newpr->reqid_out = 0;
-
-		for (t = p; t; t = t->tnext) {
-
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"prop#=%d prot-id=%s spi-size=%d "
-				"#trns=%d trns#=%d trns-id=%s\n",
-				t->prop->p_no,
-				s_ipsecdoi_proto(t->prop->proto_id),
-				t->prop->spi_size, t->prop->num_t,
-				t->trns->t_no,
-				s_ipsecdoi_trns(t->prop->proto_id,
-				t->trns->t_id));
-
-			/* allocate ipsec sa transform */
-			newtr = newsatrns();
-			if (newtr == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate satrns.\n");
-				racoon_free(newpr);
-				goto err;
-			}
-
-			if (ipsecdoi_t2satrns(t->trns, 
-			    newpp, newpr, newtr) < 0) {
-				flushsaprop(newpp);
-				racoon_free(newtr);
-				racoon_free(newpr);
-				return NULL;
-			}
-
-			inssatrns(newpr, newtr);
-		}
-
-		/*
-		 * If the peer does not specify encryption mode, use 
-		 * transport mode by default.  This is to conform to
-		 * draft-shacham-ippcp-rfc2393bis-08.txt (explicitly specifies
-		 * that unspecified == transport), as well as RFC2407
-		 * (unspecified == implementation dependent default).
-		 */
-		if (newpr->encmode == 0)
-			newpr->encmode = IPSECDOI_ATTR_ENC_MODE_TRNS;
-
-		inssaproto(newpp, newpr);
-	}
-
-	return newpp;
-
-err:
-	flushsaprop(newpp);
-	return NULL;
-}
-
-void
-flushsaprop(head)
-	struct saprop *head;
-{
-	struct saprop *p, *save;
-
-	for (p = head; p != NULL; p = save) {
-		save = p->next;
-		flushsaproto(p->head);
-		racoon_free(p);
-	}
-
-	return;
-}
-
-void
-flushsaproto(head)
-	struct saproto *head;
-{
-	struct saproto *p, *save;
-
-	for (p = head; p != NULL; p = save) {
-		save = p->next;
-		flushsatrns(p->head);
-		vfree(p->keymat);
-		vfree(p->keymat_p);
-		racoon_free(p);
-	}
-
-	return;
-}
-
-void
-flushsatrns(head)
-	struct satrns *head;
-{
-	struct satrns *p, *save;
-
-	for (p = head; p != NULL; p = save) {
-		save = p->next;
-		racoon_free(p);
-	}
-
-	return;
-}
-
-/*
- * print multiple proposals
- */
-void
-printsaprop(pri, pp)
-	const int pri;
-	const struct saprop *pp;
-{
-	const struct saprop *p;
-
-	if (pp == NULL) {
-		plog(pri, LOCATION, NULL, "(null)");
-		return;
-	}
-
-	for (p = pp; p; p = p->next) {
-		printsaprop0(pri, p);
-	}
-
-	return;
-}
-
-/*
- * print one proposal.
- */
-void
-printsaprop0(pri, pp)
-	int pri;
-	const struct saprop *pp;
-{
-	const struct saproto *p;
-
-	if (pp == NULL)
-		return;
-
-	for (p = pp->head; p; p = p->next) {
-		printsaproto(pri, p);
-	}
-
-	return;
-}
-
-void
-printsaproto(pri, pr)
-	const int pri;
-	const struct saproto *pr;
-{
-	struct satrns *tr;
-
-	if (pr == NULL)
-		return;
-
-	plog(pri, LOCATION, NULL,
-		" (proto_id=%s spisize=%d spi=%08lx spi_p=%08lx "
-		"encmode=%s reqid=%d:%d)\n",
-		s_ipsecdoi_proto(pr->proto_id),
-		(int)pr->spisize,
-		(unsigned long)ntohl(pr->spi),
-		(unsigned long)ntohl(pr->spi_p),
-		s_ipsecdoi_attr_v(IPSECDOI_ATTR_ENC_MODE, pr->encmode),
-		(int)pr->reqid_in, (int)pr->reqid_out);
-
-	for (tr = pr->head; tr; tr = tr->next) {
-		printsatrns(pri, pr->proto_id, tr);
-	}
-
-	return;
-}
-
-void
-printsatrns(pri, proto_id, tr)
-	const int pri;
-	const int proto_id;
-	const struct satrns *tr;
-{
-	if (tr == NULL)
-		return;
-
-	switch (proto_id) {
-	case IPSECDOI_PROTO_IPSEC_AH:
-		plog(pri, LOCATION, NULL,
-			"  (trns_id=%s authtype=%s)\n",
-			s_ipsecdoi_trns(proto_id, tr->trns_id),
-			s_ipsecdoi_attr_v(IPSECDOI_ATTR_AUTH, tr->authtype));
-		break;
-	case IPSECDOI_PROTO_IPSEC_ESP:
-		plog(pri, LOCATION, NULL,
-			"  (trns_id=%s encklen=%d authtype=%s)\n",
-			s_ipsecdoi_trns(proto_id, tr->trns_id),
-			tr->encklen,
-			s_ipsecdoi_attr_v(IPSECDOI_ATTR_AUTH, tr->authtype));
-		break;
-	case IPSECDOI_PROTO_IPCOMP:
-		plog(pri, LOCATION, NULL,
-			"  (trns_id=%s)\n",
-			s_ipsecdoi_trns(proto_id, tr->trns_id));
-		break;
-	default:
-		plog(pri, LOCATION, NULL,
-			"(unknown proto_id %d)\n", proto_id);
-	}
-
-	return;
-}
-
-void
-print_proppair0(pri, p, level)
-	int pri; 
-	struct prop_pair *p;
-	int level;
-{
-	char spc[21];
-
-	memset(spc, ' ', sizeof(spc));
-	spc[sizeof(spc) - 1] = '\0';
-	if (level < 20) {
-		spc[level] = '\0';
-	}
-
-	plog(pri, LOCATION, NULL,
-		"%s%p: next=%p tnext=%p\n", spc, p, p->next, p->tnext);
-	if (p->next)
-		print_proppair0(pri, p->next, level + 1);
-	if (p->tnext)
-		print_proppair0(pri, p->tnext, level + 1);
-}
-
-void
-print_proppair(pri, p)
-	int pri;
-	struct prop_pair *p;
-{
-	print_proppair0(pri, p, 1);
-}
-
-int
-set_proposal_from_policy(iph2, sp_main, sp_sub)
-	struct ph2handle *iph2;
-	struct secpolicy *sp_main, *sp_sub;
-{
-	struct saprop *newpp;
-	struct ipsecrequest *req;
-	int encmodesv = IPSECDOI_ATTR_ENC_MODE_TRNS; /* use only when complex_bundle */
-
-	newpp = newsaprop();
-	if (newpp == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate saprop.\n");
-		goto err;
-	}
-	newpp->prop_no = 1;
-	newpp->lifetime = iph2->sainfo->lifetime;
-	newpp->lifebyte = iph2->sainfo->lifebyte;
-	newpp->pfs_group = iph2->sainfo->pfs_group;
-
-	if (lcconf->complex_bundle)
-		goto skip1;
-
-	/*
-	 * decide the encryption mode of this SA bundle.
-	 * the mode becomes tunnel mode when there is even one policy
-	 * of tunnel mode in the SPD.  otherwise the mode becomes
-	 * transport mode.
-	 */
-	for (req = sp_main->req; req; req = req->next) {
-		if (req->saidx.mode == IPSEC_MODE_TUNNEL) {
-			encmodesv = pfkey2ipsecdoi_mode(req->saidx.mode);
-#ifdef ENABLE_NATT
-			if (iph2->ph1 && (iph2->ph1->natt_flags & NAT_DETECTED))
-				encmodesv += iph2->ph1->natt_options->mode_udp_diff;
-#endif
-			break;
-		}
-	}
-
-    skip1:
-	for (req = sp_main->req; req; req = req->next) {
-		struct saproto *newpr;
-		caddr_t paddr = NULL;
-
-		/*
-		 * check if SA bundle ?
-		 * nested SAs negotiation is NOT supported.
-		 *       me +--- SA1 ---+ peer1
-		 *       me +--- SA2 --------------+ peer2
-		 */
-#ifdef __linux__
-		if (req->saidx.src.ss_family && req->saidx.dst.ss_family) {
-#else
-		if (req->saidx.src.ss_len && req->saidx.dst.ss_len) {
-#endif
-			/* check the end of ip addresses of SA */
-			if (iph2->side == INITIATOR)
-				paddr = (caddr_t)&req->saidx.dst;
-			else
-				paddr = (caddr_t)&req->saidx.src;
-		}
-
-		/* allocate ipsec sa protocol */
-		newpr = newsaproto();
-		if (newpr == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to allocate saproto.\n");
-			goto err;
-		}
-
-		newpr->proto_id = ipproto2doi(req->saidx.proto);
-		if (newpr->proto_id == IPSECDOI_PROTO_IPCOMP)
-			newpr->spisize = 2;
-		else
-			newpr->spisize = 4;
-		if (lcconf->complex_bundle) {
-			newpr->encmode = pfkey2ipsecdoi_mode(req->saidx.mode);
-#ifdef ENABLE_NATT
-			if (iph2->ph1 && (iph2->ph1->natt_flags & NAT_DETECTED))
-				newpr->encmode += 
-				    iph2->ph1->natt_options->mode_udp_diff;
-#endif
-		}
-		else
-			newpr->encmode = encmodesv;
-
-		if (iph2->side == INITIATOR)
-			newpr->reqid_out = req->saidx.reqid;
-		else
-			newpr->reqid_in = req->saidx.reqid;
-
-		if (set_satrnsbysainfo(newpr, iph2->sainfo) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to get algorithms.\n");
-			racoon_free(newpr);
-			goto err;
-		}
-
-		/* set new saproto */
-		inssaprotorev(newpp, newpr);
-	}
-
-	/* get reqid_in from inbound policy */
-	if (sp_sub) {
-		struct saproto *pr;
-
-		req = sp_sub->req;
-		pr = newpp->head;
-		while (req && pr) {
-			if (iph2->side == INITIATOR)
-				pr->reqid_in = req->saidx.reqid;
-			else
-				pr->reqid_out = req->saidx.reqid;
-			pr = pr->next;
-			req = req->next;
-		}
-		if (pr || req) {
-			plog(LLV_NOTIFY, LOCATION, NULL,
-				"There is a difference "
-				"between the in/out bound policies in SPD.\n");
-		}
-	}
-
-	iph2->proposal = newpp;
-
-	printsaprop0(LLV_DEBUG, newpp);
-
-	return 0;
-err:
-	flushsaprop(newpp);
-	return -1;
-}
-
-/*
- * generate a policy from peer's proposal.
- * this function unconditionally choices first proposal in SA payload
- * passed by peer.
- */
-int
-set_proposal_from_proposal(iph2)
-	struct ph2handle *iph2;
-{
-        struct saprop *newpp = NULL, *pp0, *pp_peer = NULL;
-	struct saproto *newpr = NULL, *pr;
-	struct prop_pair **pair;
-	int error = -1;
-	int i;
-
-	/* get proposal pair */
-	pair = get_proppair(iph2->sa, IPSECDOI_TYPE_PH2);
-	if (pair == NULL)
-		goto end;
-
-	/*
-	 * make my proposal according as the client proposal.
-	 * XXX assumed there is only one proposal even if it's the SA bundle.
-	 */
-        for (i = 0; i < MAXPROPPAIRLEN; i++) {
-                if (pair[i] == NULL)
-                        continue;
-
-		if (pp_peer != NULL)
-			flushsaprop(pp_peer);
-
-		pp_peer = aproppair2saprop(pair[i]);
-		if (pp_peer == NULL)
-			goto end;
-
-		pp0 = newsaprop();
-		if (pp0 == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to allocate saprop.\n");
-			goto end;
-		}
-		pp0->prop_no = 1;
-		pp0->lifetime = iph2->sainfo->lifetime;
-		pp0->lifebyte = iph2->sainfo->lifebyte;
-		pp0->pfs_group = iph2->sainfo->pfs_group;
-
-#ifdef HAVE_SECCTX
-		if (*pp_peer->sctx.ctx_str) {
-			pp0->sctx.ctx_doi = pp_peer->sctx.ctx_doi;
-			pp0->sctx.ctx_alg = pp_peer->sctx.ctx_alg;
-			pp0->sctx.ctx_strlen = pp_peer->sctx.ctx_strlen;
-			memcpy(pp0->sctx.ctx_str, pp_peer->sctx.ctx_str,
-			       pp_peer->sctx.ctx_strlen);
-		}
-#endif /* HAVE_SECCTX */
-
-		if (pp_peer->next != NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pp_peer is inconsistency, ignore it.\n");
-			/*FALLTHROUGH*/
-		}
-
-		for (pr = pp_peer->head; pr; pr = pr->next)
-		{
-			struct remoteconf *conf;
-
-			newpr = newsaproto();
-			if (newpr == NULL)
-			{
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to allocate saproto.\n");
-				racoon_free(pp0);
-				goto end;
-			}
-			newpr->proto_id = pr->proto_id;
-			newpr->spisize = pr->spisize;
-			newpr->encmode = pr->encmode;
-			newpr->spi = 0;
-			newpr->spi_p = pr->spi;     /* copy peer's SPI */
-			newpr->reqid_in = 0;
-			newpr->reqid_out = 0;
-
-			conf = getrmconf(iph2->dst);
-			if (conf != NULL &&
-				conf->gen_policy == GENERATE_POLICY_UNIQUE){
-				newpr->reqid_in = g_nextreqid ;
-				newpr->reqid_out = g_nextreqid ++;
-				/* 
-				 * XXX there is a (very limited) 
-				 * risk of reusing the same reqid
-				 * as another SP entry for the same peer
-				 */
-				if(g_nextreqid >= IPSEC_MANUAL_REQID_MAX)
-					g_nextreqid = 1;
-			}else{
-				newpr->reqid_in = 0;
-				newpr->reqid_out = 0;
-			}
- 
-			if (set_satrnsbysainfo(newpr, iph2->sainfo) < 0)
-			{
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to get algorithms.\n");
-				racoon_free(newpr);
-				racoon_free(pp0);
-				goto end;
-			}
-			inssaproto(pp0, newpr);
-		}
-
-		inssaprop(&newpp, pp0);
-        }
-
-	plog(LLV_DEBUG, LOCATION, NULL, "make a proposal from peer's:\n");
-	printsaprop0(LLV_DEBUG, newpp);  
-
-	iph2->proposal = newpp;
-
-	error = 0;
-
-end:
-	if (error && newpp)
-		flushsaprop(newpp);
-
-	if (pp_peer)
-		flushsaprop(pp_peer);
-	if (pair)
-		free_proppair(pair);
-	return error;
-}
diff --git a/src/racoon/proposal.h b/src/racoon/proposal.h
deleted file mode 100644
index 60fc531..0000000
--- a/src/racoon/proposal.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/*	$NetBSD: proposal.h,v 1.6 2006/12/09 05:52:57 manu Exp $	*/
-
-/* Id: proposal.h,v 1.5 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _PROPOSAL_H
-#define _PROPOSAL_H
-
-#include <sys/queue.h>
-
-/*
- *   A. chained list of transform, only for single proto_id
- *      (this is same as set of transforms in single proposal payload)
- *   B. proposal.  this will point to multiple (A) items (order is important
- *      here so pointer to (A) must be ordered array, or chained list). 
- *      this covers multiple proposal on a packet if proposal # is the same.
- *   C. finally, (B) needs to be connected as chained list.
- * 
- * 	head ---> prop[.......] ---> prop[...] ---> prop[...] ---> ...
- * 	               | | | |
- * 	               | | | +- proto4  <== must preserve order here
- * 	               | | +--- proto3
- * 	               | +----- proto2
- * 	               +------- proto1[trans1, trans2, trans3, ...]
- *
- *   incoming packets needs to be parsed to construct the same structure
- *   (check "prop_pair" too).
- */
-/* SA proposal specification */
-struct saprop {
-	int prop_no;
-	time_t lifetime;
-	int lifebyte;
-	int pfs_group;			/* pfs group */
-	int claim;			/* flag to send RESPONDER-LIFETIME. */
-					/* XXX assumed DOI values are 1 or 2. */
-#ifdef HAVE_SECCTX
-	struct security_ctx sctx;       /* security context structure */
-#endif
-	struct saproto *head;
-	struct saprop *next;
-};
-
-/* SA protocol specification */
-struct saproto {
-	int proto_id;
-	size_t spisize;			/* spi size */
-	int encmode;			/* encryption mode */
-
-	int udp_encap;			/* UDP encapsulation */
-
-	/* XXX should be vchar_t * */
-	/* these are network byte order */
-	u_int32_t spi;			/* inbound. i.e. --SA-> me */
-	u_int32_t spi_p;		/* outbound. i.e. me -SA-> */
-
-	vchar_t *keymat;		/* KEYMAT */
-	vchar_t *keymat_p;		/* peer's KEYMAT */
-
-	int reqid_out;			/* request id (outbound) */
-	int reqid_in;			/* request id (inbound) */
-
-	int ok;				/* if 1, success to set SA in kenrel */
-
-	struct satrns *head;		/* header of transform */
-	struct saproto *next;		/* next protocol */
-};
-
-/* SA algorithm specification */
-struct satrns {
-	int trns_no;
-	int trns_id;			/* transform id */
-	int encklen;			/* key length of encryption algorithm */
-	int authtype;			/* authentication algorithm if ESP */
-
-	struct satrns *next;		/* next transform */
-};
-
-/*
- * prop_pair: (proposal number, transform number)
- *
- *	(SA (P1 (T1 T2)) (P1' (T1' T2')) (P2 (T1" T2")))
- *
- *              p[1]      p[2]
- *      top     (P1,T1)   (P2",T1")
- *		 |  |tnext     |tnext
- *		 |  v          v
- *		 | (P1, T2)   (P2", T2")
- *		 v next
- *		(P1', T1')
- *		    |tnext
- *		    v
- *		   (P1', T2')
- *
- * when we convert it to saprop in prop2saprop(), it should become like:
- * 
- * 		 (next)
- * 	saprop --------------------> saprop	
- * 	 | (head)                     | (head)
- * 	 +-> saproto                  +-> saproto
- * 	      | | (head)                     | (head)
- * 	      | +-> satrns(P1 T1)            +-> satrns(P2" T1")
- * 	      |      | (next)                     | (next)
- * 	      |      v                            v
- * 	      |     satrns(P1, T2)               satrns(P2", T2")
- * 	      v (next)
- * 	     saproto
- * 		| (head)
- * 		+-> satrns(P1' T1')
- * 		     | (next)
- * 		     v
- * 		    satrns(P1', T2')
- */
-struct prop_pair {
-	struct isakmp_pl_p *prop;
-	struct isakmp_pl_t *trns;
-	struct prop_pair *next;	/* next prop_pair with same proposal # */
-				/* (bundle case) */
-	struct prop_pair *tnext; /* next prop_pair in same proposal payload */
-				/* (multiple tranform case) */
-};
-#define MAXPROPPAIRLEN	256	/* It's enough because field size is 1 octet. */
-
-/*
- * Lifetime length selection refered to the section 4.5.4 of RFC2407.  It does
- * not completely conform to the description of RFC.  There are four types of
- * the behavior.  If the value of "proposal_check" in "remote" directive is;
- *     "obey"
- *         the responder obey the initiator anytime.
- *     "strict"
- *         If the responder's length is longer than the initiator's one, the
- *         responder uses the intitiator's one.  Otherwise rejects the proposal.
- *         If PFS is not required by the responder, the responder obeys the
- *         proposal.  If PFS is required by both sides and if the responder's
- *         group is not equal to the initiator's one, then the responder reject
- *         the proposal.
- *     "claim"
- *         If the responder's length is longer than the initiator's one, the
- *         responder use the intitiator's one.  If the responder's length is
- *         shorter than the initiator's one, the responder uses own length
- *         AND send RESPONDER-LIFETIME notify message to a initiator in the
- *         case of lifetime.
- *         About PFS, this directive is same as "strict".
- *     "exact"
- *         If the initiator's length is not equal to the responder's one, the
- *         responder rejects the proposal.
- *         If PFS is required and if the responder's group is not equal to
- *         the initiator's one, then the responder reject the proposal.
- * XXX should be defined the behavior of key length.
- */
-#define PROP_CHECK_OBEY		1
-#define PROP_CHECK_STRICT	2
-#define PROP_CHECK_CLAIM	3
-#define PROP_CHECK_EXACT	4
-
-struct sainfo;
-struct ph1handle;
-struct secpolicy;
-extern struct saprop *newsaprop __P((void));
-extern struct saproto *newsaproto __P((void));
-extern void inssaprop __P((struct saprop **, struct saprop *));
-extern void inssaproto __P((struct saprop *, struct saproto *));
-extern void inssaprotorev __P((struct saprop *, struct saproto *));
-extern struct satrns *newsatrns __P((void));
-extern void inssatrns __P((struct saproto *, struct satrns *));
-extern struct saprop *cmpsaprop_alloc __P((struct ph1handle *,
-	const struct saprop *, const struct saprop *, int));
-extern int cmpsaprop __P((const struct saprop *, const struct saprop *));
-extern int cmpsatrns __P((int, const struct satrns *, const struct satrns *, int));
-extern int set_satrnsbysainfo __P((struct saproto *, struct sainfo *));
-extern struct saprop *aproppair2saprop __P((struct prop_pair *));
-extern void free_proppair __P((struct prop_pair **));
-extern void flushsaprop __P((struct saprop *));
-extern void flushsaproto __P((struct saproto *));
-extern void flushsatrns __P((struct satrns *));
-extern void printsaprop __P((const int, const struct saprop *));
-extern void printsaprop0 __P((const int, const struct saprop *));
-extern void printsaproto __P((const int, const struct saproto *));
-extern void printsatrns __P((const int, const int, const struct satrns *));
-extern void print_proppair0 __P((int, struct prop_pair *, int));
-extern void print_proppair __P((int, struct prop_pair *));
-extern int set_proposal_from_policy __P((struct ph2handle *,
-	struct secpolicy *, struct secpolicy *));
-extern int set_proposal_from_proposal __P((struct ph2handle *));
-
-#endif /* _PROPOSAL_H */
diff --git a/src/racoon/prsa_par.h b/src/racoon/prsa_par.h
deleted file mode 100644
index 3bdb11d..0000000
--- a/src/racoon/prsa_par.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.3.  */
-
-/* Skeleton interface for Bison's Yacc-like parsers in C
-
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     COLON = 258,
-     HEX = 259,
-     OBRACE = 260,
-     EBRACE = 261,
-     TAG_RSA = 262,
-     TAG_PUB = 263,
-     TAG_PSK = 264,
-     MODULUS = 265,
-     PUBLIC_EXPONENT = 266,
-     PRIVATE_EXPONENT = 267,
-     PRIME1 = 268,
-     PRIME2 = 269,
-     EXPONENT1 = 270,
-     EXPONENT2 = 271,
-     COEFFICIENT = 272,
-     ADDR4 = 273,
-     ADDR6 = 274,
-     ADDRANY = 275,
-     SLASH = 276,
-     NUMBER = 277,
-     BASE64 = 278
-   };
-#endif
-/* Tokens.  */
-#define COLON 258
-#define HEX 259
-#define OBRACE 260
-#define EBRACE 261
-#define TAG_RSA 262
-#define TAG_PUB 263
-#define TAG_PSK 264
-#define MODULUS 265
-#define PUBLIC_EXPONENT 266
-#define PRIVATE_EXPONENT 267
-#define PRIME1 268
-#define PRIME2 269
-#define EXPONENT1 270
-#define EXPONENT2 271
-#define COEFFICIENT 272
-#define ADDR4 273
-#define ADDR6 274
-#define ADDRANY 275
-#define SLASH 276
-#define NUMBER 277
-#define BASE64 278
-
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-#line 130 "prsa_par.y"
-{
-	BIGNUM *bn;
-	RSA *rsa;
-	char *chr;
-	long num;
-	struct netaddr *naddr;
-}
-/* Line 1489 of yacc.c.  */
-#line 103 "prsa_par.h"
-	YYSTYPE;
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-
-extern YYSTYPE prsalval;
-
diff --git a/src/racoon/prsa_par.y b/src/racoon/prsa_par.y
deleted file mode 100644
index f21a82b..0000000
--- a/src/racoon/prsa_par.y
+++ /dev/null
@@ -1,350 +0,0 @@
-/*	$NetBSD: prsa_par.y,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: prsa_par.y,v 1.3 2004/11/08 12:04:23 ludvigm Exp */
-
-%{
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* This file contains a parser for FreeS/WAN-style ipsec.secrets RSA keys. */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <sys/types.h>
-
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "oakley.h"
-#include "isakmp_var.h"
-#include "handler.h"
-#include "crypto_openssl.h"
-#include "sockmisc.h"
-#include "rsalist.h"
-
-extern void prsaerror(const char *str, ...);
-extern int prsawrap (void);
-extern int prsalex (void);
-
-extern char *prsatext;
-extern int prsa_cur_lineno;
-extern char *prsa_cur_fname;
-extern FILE *prsain;
-
-int prsa_cur_lineno = 0;
-char *prsa_cur_fname = NULL;
-struct genlist *prsa_cur_list = NULL;
-enum rsa_key_type prsa_cur_type = RSA_TYPE_ANY;
-
-static RSA *rsa_cur;
-
-void
-prsaerror(const char *s, ...)
-{
-	char fmt[512];
-
-	va_list ap;
-#ifdef HAVE_STDARG_H
-	va_start(ap, s);
-#else
-	va_start(ap);
-#endif
-	snprintf(fmt, sizeof(fmt), "%s:%d: %s",
-		prsa_cur_fname, prsa_cur_lineno, s);
-	plogv(LLV_ERROR, LOCATION, NULL, fmt, ap);
-	va_end(ap);
-}
-
-void
-prsawarning(const char *s, ...)
-{
-	char fmt[512];
-
-	va_list ap;
-#ifdef HAVE_STDARG_H
-	va_start(ap, s);
-#else
-	va_start(ap);
-#endif
-	snprintf(fmt, sizeof(fmt), "%s:%d: %s",
-		prsa_cur_fname, prsa_cur_lineno, s);
-	plogv(LLV_WARNING, LOCATION, NULL, fmt, ap);
-	va_end(ap);
-}
-
-int
-prsawrap()
-{
-	return 1;
-} 
-%}
-%union {
-	BIGNUM *bn;
-	RSA *rsa;
-	char *chr;
-	long num;
-	struct netaddr *naddr;
-}
-
-%token COLON HEX
-%token OBRACE EBRACE COLON HEX
-%token TAG_RSA TAG_PUB TAG_PSK
-%token MODULUS PUBLIC_EXPONENT PRIVATE_EXPONENT 
-%token PRIME1 PRIME2 EXPONENT1 EXPONENT2 COEFFICIENT
-%token ADDR4 ADDR6 ADDRANY SLASH NUMBER BASE64
-
-%type <bn>	HEX
-%type <num>	NUMBER
-%type <chr>	ADDR4 ADDR6 BASE64
-
-%type <rsa>	rsa_statement
-%type <num>	prefix
-%type <naddr>	addr4 addr6 addr
-
-%%
-statements:
-	statements statement
-	| statement
-	;
-
-statement:
-	addr addr COLON rsa_statement
-	{
-		rsa_key_insert(prsa_cur_list, $1, $2, $4);
-	}
-	| addr COLON rsa_statement 
-	{
-		rsa_key_insert(prsa_cur_list, NULL, $1, $3);
-	}
-	| COLON rsa_statement 
-	{
-		rsa_key_insert(prsa_cur_list, NULL, NULL, $2);
-	}
-	;
-
-rsa_statement:
-	TAG_RSA OBRACE params EBRACE
-	{
-		if (prsa_cur_type == RSA_TYPE_PUBLIC) {
-			prsawarning("Using private key for public key purpose.\n");
-			if (!rsa_cur->n || !rsa_cur->e) {
-				prsaerror("Incomplete key. Mandatory parameters are missing!\n");
-				YYABORT;
-			}
-		}
-		else {
-			if (!rsa_cur->n || !rsa_cur->e || !rsa_cur->d) {
-				prsaerror("Incomplete key. Mandatory parameters are missing!\n");
-				YYABORT;
-			}
-			if (!rsa_cur->p || !rsa_cur->q || !rsa_cur->dmp1
-			    || !rsa_cur->dmq1 || !rsa_cur->iqmp) {
-				if (rsa_cur->p) BN_clear_free(rsa_cur->p);
-				if (rsa_cur->q) BN_clear_free(rsa_cur->q);
-				if (rsa_cur->dmp1) BN_clear_free(rsa_cur->dmp1);
-				if (rsa_cur->dmq1) BN_clear_free(rsa_cur->dmq1);
-				if (rsa_cur->iqmp) BN_clear_free(rsa_cur->iqmp);
-
-				rsa_cur->p = NULL;
-				rsa_cur->q = NULL;
-				rsa_cur->dmp1 = NULL;
-				rsa_cur->dmq1 = NULL;
-				rsa_cur->iqmp = NULL;
-			}
-		}
-		$$ = rsa_cur;
-		rsa_cur = RSA_new();
-	}
-	| TAG_PUB BASE64
-	{
-		if (prsa_cur_type == RSA_TYPE_PRIVATE) {
-			prsaerror("Public key in private-key file!\n");
-			YYABORT;
-		}
-		$$ = base64_pubkey2rsa($2);
-	}
-	| TAG_PUB HEX
-	{
-		if (prsa_cur_type == RSA_TYPE_PRIVATE) {
-			prsaerror("Public key in private-key file!\n");
-			YYABORT;
-		}
-		$$ = bignum_pubkey2rsa($2);
-	}
-	;
-
-addr:
-	addr4
-	| addr6
-	| ADDRANY
-	{
-		$$ = NULL;
-	}
-	;
-
-addr4:
-	ADDR4 prefix
-	{
-		int err;
-		struct sockaddr_in *sap;
-		
-		if ($2 == -1) $2 = 32;
-		if ($2 < 0 || $2 > 32) {
-			prsaerror ("Invalid IPv4 prefix\n");
-			YYABORT;
-		}
-		$$ = calloc (sizeof(struct netaddr), 1);
-		$$->prefix = $2;
-		sap = (struct sockaddr_in *)(&$$->sa);
-		sap->sin_family = AF_INET;
-		err = inet_pton(AF_INET, $1, (struct in_addr*)(&sap->sin_addr));
-		if (err <= 0) {
-			prsaerror("inet_pton(%s): %s\n", $1, strerror(errno));
-			YYABORT;
-		}
-	}
-	;
-
-addr6:
-	ADDR6 prefix
-	{
-		int err;
-		struct sockaddr_in6 *sap;
-		
-		if ($2 == -1) $2 = 128;
-		if ($2 < 0 || $2 > 128) {
-			prsaerror ("Invalid IPv6 prefix\n");
-			YYABORT;
-		}
-		$$ = calloc (sizeof(struct netaddr), 1);
-		$$->prefix = $2;
-		sap = (struct sockaddr_in6 *)(&$$->sa);
-		sap->sin6_family = AF_INET6;
-		err = inet_pton(AF_INET6, $1, (struct in6_addr*)(&sap->sin6_addr));
-		if (err <= 0) {
-			prsaerror("inet_pton(%s): %s\n", $1, strerror(errno));
-			YYABORT;
-		}
-	}
-	;
-
-prefix:
-	/* nothing */ { $$ = -1; }
-	| SLASH NUMBER { $$ = $2; }
-	;
-params:
-	params param
-	| param
-	;
-
-param:
-	MODULUS COLON HEX 
-	{ if (!rsa_cur->n) rsa_cur->n = $3; else { prsaerror ("Modulus already defined\n"); YYABORT; } }
-	| PUBLIC_EXPONENT COLON HEX 
-	{ if (!rsa_cur->e) rsa_cur->e = $3; else { prsaerror ("PublicExponent already defined\n"); YYABORT; } }
-	| PRIVATE_EXPONENT COLON HEX 
-	{ if (!rsa_cur->d) rsa_cur->d = $3; else { prsaerror ("PrivateExponent already defined\n"); YYABORT; } }
-	| PRIME1 COLON HEX 
-	{ if (!rsa_cur->p) rsa_cur->p = $3; else { prsaerror ("Prime1 already defined\n"); YYABORT; } }
-	| PRIME2 COLON HEX 
-	{ if (!rsa_cur->q) rsa_cur->q = $3; else { prsaerror ("Prime2 already defined\n"); YYABORT; } }
-	| EXPONENT1 COLON HEX 
-	{ if (!rsa_cur->dmp1) rsa_cur->dmp1 = $3; else { prsaerror ("Exponent1 already defined\n"); YYABORT; } }
-	| EXPONENT2 COLON HEX 
-	{ if (!rsa_cur->dmq1) rsa_cur->dmq1 = $3; else { prsaerror ("Exponent2 already defined\n"); YYABORT; } }
-	| COEFFICIENT COLON HEX 
-	{ if (!rsa_cur->iqmp) rsa_cur->iqmp = $3; else { prsaerror ("Coefficient already defined\n"); YYABORT; } }
-	;
-%%
-
-int prsaparse(void);
-
-int
-prsa_parse_file(struct genlist *list, char *fname, enum rsa_key_type type)
-{
-	FILE *fp = NULL;
-	int ret;
-	
-	if (!fname)
-		return -1;
-	if (type == RSA_TYPE_PRIVATE) {
-		struct stat st;
-		if (stat(fname, &st) < 0)
-			return -1;
-		if (st.st_mode & (S_IRWXG | S_IRWXO)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Too slack permissions on private key '%s'\n", 
-				fname);
-			plog(LLV_ERROR, LOCATION, NULL,
-				"Should be at most 0600, now is 0%o\n",
-				st.st_mode & 0777);
-			return -1;
-		}
-	}
-	fp = fopen(fname, "r");
-	if (!fp)
-		return -1;
-	prsain = fp;
-	prsa_cur_lineno = 1;
-	prsa_cur_fname = fname;
-	prsa_cur_list = list;
-	prsa_cur_type = type;
-	rsa_cur = RSA_new();
-	ret = prsaparse();
-	if (rsa_cur) {
-		RSA_free(rsa_cur);
-		rsa_cur = NULL;
-	}
-	fclose (fp);
-	prsain = NULL;
-	return ret;
-}
diff --git a/src/racoon/prsa_tok.l b/src/racoon/prsa_tok.l
deleted file mode 100644
index 83e3d14..0000000
--- a/src/racoon/prsa_tok.l
+++ /dev/null
@@ -1,89 +0,0 @@
-/*	$NetBSD: prsa_tok.l,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: prsa_tok.l,v 1.2 2004/07/12 20:43:51 ludvigm Exp */
-
-%{
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/* This file contains a tokeniser for FreeS/WAN-style ipsec.secrets RSA keys. */
-
-#include <string.h>
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-#include "prsa_par.h"
-
-extern int prsalex (void);
-extern int prsa_cur_lineno;
-
-%}
-
-comment		\#.*
-digit		[0-9]
-octet		(([01]?{digit}?{digit})|((2([0-4]{digit}))|(25[0-5])))
-addr4		{octet}\.{octet}\.{octet}\.{octet}
-hex		[0-9a-fA-F]
-word6		{hex}{0,4}
-base64		[A-Za-z0-9+/=]
-addr6		(::({word6}|{addr4})?|({word6}:)+:?({word6}|{addr4})?)
-%%
-\{		{ return OBRACE; }
-\}		{ return EBRACE; }
-:		{ return COLON; }
-RSA		{ return TAG_RSA; }
-PSK		{ return TAG_PSK; }
-PUB		{ return TAG_PUB; }
-0x[0-9a-fA-F]+	{ 
-			BIGNUM *bn = BN_new();
-			BN_hex2bn(&bn, prsatext+2);
-			prsalval.bn = bn;
-			return HEX;
-		}
-0s{base64}+	{
-			prsalval.chr = strdup(prsatext);
-			return BASE64;
-		}
-Modulus		{ return MODULUS; }
-PublicExponent	{ return PUBLIC_EXPONENT; }
-PrivateExponent	{ return PRIVATE_EXPONENT; }
-Prime1		{ return PRIME1; }
-Prime2		{ return PRIME2; }
-Exponent1	{ return EXPONENT1; }
-Exponent2	{ return EXPONENT2; }
-Coefficient	{ return COEFFICIENT; }
-\/		{ return SLASH; }
-{digit}+	{ prsalval.num = atol(prsatext); return NUMBER; }
-any		{ return ADDRANY; }
-{addr4}		{ prsalval.chr = strdup(prsatext); return ADDR4; }
-{addr6}		{ prsalval.chr = strdup(prsatext); return ADDR6; }
-[ \t]*		;
-\n		{ prsa_cur_lineno++; }
-\#.*		;
-%%
diff --git a/src/racoon/racoon.8 b/src/racoon/racoon.8
deleted file mode 100644
index a6d39d7..0000000
--- a/src/racoon/racoon.8
+++ /dev/null
@@ -1,155 +0,0 @@
-.\"	$NetBSD: racoon.8,v 1.10 2006/09/09 16:22:10 manu Exp $
-.\"
-.\" Id: racoon.8,v 1.4 2005/04/18 11:07:55 manubsd Exp
-.\"
-.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the project nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd November 20, 2000
-.Dt RACOON 8
-.Os
-.\"
-.Sh NAME
-.Nm racoon
-.Nd IKE (ISAKMP/Oakley) key management daemon
-.\"
-.Sh SYNOPSIS
-.Nm racoon
-.Bk -words
-.Op Fl 46BdFLv
-.Ek
-.Bk -words
-.Op Fl f Ar configfile
-.Ek
-.Bk -words
-.Op Fl l Ar logfile
-.Ek
-.Bk -words
-.Op Fl P Ar isakmp-natt-port
-.Ek
-.Bk -words
-.Op Fl p Ar isakmp-port
-.Ek
-.\"
-.Sh DESCRIPTION
-.Nm
-speaks the IKE
-.Pq ISAKMP/Oakley
-key management protocol,
-to establish security associations with other hosts.
-The SPD
-.Pq Security Policy Database
-in the kernel usually triggers
-.Nm .
-.Nm
-usually sends all informational messages, warnings and error messages to
-.Xr syslogd 8
-with the facility
-.Dv LOG_DAEMON
-and the priority
-.Dv LOG_INFO .
-Debugging messages are sent with the priority
-.Dv LOG_DEBUG .
-You should configure
-.Xr syslog.conf 5
-appropriately to see these messages.
-.Bl -tag -width Ds
-.It Fl 4
-.It Fl 6
-Specify the default address family for the sockets.
-.It Fl B
-Install SA(s) from the file which is specified in
-.Xr racoon.conf 5 .
-.It Fl d
-Increase the debug level.
-Multiple
-.Fl d
-arguments will increase the debug level even more.
-.It Fl F
-Run
-.Nm
-in the foreground.
-.It Fl f Ar configfile
-Use
-.Ar configfile
-as the configuration file instead of the default.
-.It Fl L
-Include
-.Ar file_name:line_number:function_name
-in all messages.
-.It Fl l Ar logfile
-Use
-.Ar logfile
-as the logging file instead of
-.Xr syslogd 8 .
-.It Fl P Ar isakmp-natt-port
-Use
-.Ar isakmp-natt-port
-for NAT-Traversal port-floating.
-The default is 4500.
-.It Fl p Ar isakmp-port
-Listen to the ISAKMP key exchange on port
-.Ar isakmp-port
-instead of the default port number, 500.
-.It Fl v
-This flag causes the packet dump be more verbose, with higher
-debugging level.
-.El
-.Pp
-.Nm
-assumes the presence of the kernel random number device
-.Xr rnd 4
-at
-.Pa /dev/urandom .
-.\"
-.Sh RETURN VALUES
-The command exits with 0 on success, and non-zero on errors.
-.\"
-.Sh FILES
-.Bl -tag -width /etc/racoon.conf -compact
-.It Pa /etc/racoon.conf
-default configuration file.
-.El
-.\"
-.Sh SEE ALSO
-.Xr ipsec 4 ,
-.Xr racoon.conf 5 ,
-.Xr syslog.conf 5 ,
-.Xr setkey 8 ,
-.Xr syslogd 8
-.\"
-.Sh HISTORY
-The
-.Nm
-command first appeared in the
-.Dq YIPS
-Yokogawa IPsec implementation.
-.\"
-.Sh SECURITY CONSIDERATIONS
-The use of IKE phase 1 aggressive mode is not recommended,
-as described in
-.Pa http://www.kb.cert.org/vuls/id/886601 .
diff --git a/src/racoon/racoon.conf.5 b/src/racoon/racoon.conf.5
deleted file mode 100644
index 9ddee80..0000000
--- a/src/racoon/racoon.conf.5
+++ /dev/null
@@ -1,1420 +0,0 @@
-.\"	$NetBSD: racoon.conf.5,v 1.34.4.3 2007/09/03 18:07:29 mgrooms Exp $
-.\"
-.\"	Id: racoon.conf.5,v 1.54 2006/08/22 18:17:17 manubsd Exp
-.\"
-.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the project nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd September 19, 2006
-.Dt RACOON.CONF 5
-.Os
-.\"
-.Sh NAME
-.Nm racoon.conf
-.Nd configuration file for racoon
-.\"
-.\" .Sh SYNOPSIS
-.\"
-.Sh DESCRIPTION
-.Nm
-is the configuration file for the
-.Xr racoon 8
-ISAKMP daemon.
-.Xr racoon 8
-negotiates security associations for itself (ISAKMP SA, or phase 1 SA)
-and for kernel IPsec (IPsec SA, or phase 2 SA).
-The file consists of a sequence of directives and statements.
-Each directive is composed by a tag and statements, enclosed by
-.Ql {
-and
-.Ql } .
-Lines beginning with
-.Ql #
-are comments.
-.\"
-.Ss Meta Syntax
-Keywords and special characters that the parser expects exactly are
-displayed using
-.Ic this
-font.
-Parameters are specified with
-.Ar this
-font.
-Square brackets
-.Po
-.Ql \&[
-and
-.Ql \&]
-.Pc
-are used to show optional keywords and parameters.
-Note that
-you have to pay attention when this manual is describing
-.Ar port
-numbers.
-The
-.Ar port
-number is always enclosed by
-.Ql \&[
-and
-.Ql \&] .
-In this case, the port number is not an optional keyword.
-If it is possible to omit the
-.Ar port
-number,
-the expression becomes
-.Bq Bq Ar port .
-The vertical bar
-.Pq Ql \&|
-is used to indicate
-a choice between optional parameters.
-Parentheses
-.Po
-.Ql \&(
-and
-.Ql \&)
-.Pc
-are used to group keywords and parameters when necessary.
-Major parameters are listed below.
-.Pp
-.Bl -tag -width addressx -compact
-.It Ar number
-means a hexadecimal or a decimal number.
-The former must be prefixed with
-.Ql Li 0x .
-.It Ar string
-.It Ar path
-.It Ar file
-means any string enclosed in
-.Ql \&"
-.Pq double quotes .
-.It Ar address
-means IPv6 and/or IPv4 address.
-.It Ar port
-means a TCP/UDP port number.
-The port number is always enclosed by
-.Ql \&[
-and
-.Ql \&] .
-.It Ar timeunit
-is one of following:
-.Ic sec , secs , second , seconds ,
-.Ic min , mins , minute , minutes ,
-.Ic hour , hours .
-.El
-.\"
-.Ss Privilege separation
-.Bl -tag -width Ds -compact
-.It Ic privsep { Ar statements Ic }
-Specifies privilege separation parameters.
-When enabled, these enable
-.Xr racoon 8
-to operate with an unprivileged instance doing most of the work, while
-a privileged instance takes care of performing the following operations
-as root: reading PSK and private keys, launching hook scripts, and
-validating passwords against system databases or against PAM.
-Please note that using privilege separation makes changes to the
-.Ar listen
-and
-.Ar paths
-sections ignored upon configuration reloads.
-A
-.Xr racoon 8
-restart is required if you want such changes to be taken into account.
-.Pp
-.Bl -tag -width Ds -compact
-.It Ic user Ar user ;
-The user to which the unprivileged instance of
-.Xr racoon 8 ,
-should switch.
-This can be a quoted user name or a numeric UID.
-.It Ic group Ar group ;
-The group the unprivilegied instance of
-.Xr racoon 8 ,
-should switch.
-This can be a quoted group name or a numeric GID.
-.It Ic chroot Ar path ;
-A directory to which the unprivileged instance of
-.Xr racoon 8
-should
-.Xr chroot 2 .
-This directory should hold a tree where the following files must be
-reachable:
-.Bl -tag -width Ds -compact
-.It Pa /dev/random
-.It Pa /dev/urandom
-.It The certificates
-.It The file containing the Xauth banner
-.El
-.Pp
-The PSK file, the private keys, and the hook scripts are accessed through the
-privileged instance of
-.Xr racoon 8
-and do not need to be reachable in the
-.Xr chroot 2 Ap ed
-tree.
-.El
-.El
-.Ss Path Specification
-This section specifies various paths used by racoon.
-When running in privilege separation mode,
-.Ic certificate
-and
-.Ic script
-paths are mandatory. A
-.Xr racoon 8
-restart is required if you want path changes to be taken into account.
-.Bl -tag -width Ds -compact
-.It Ic path include Ar path ;
-Specifies a path to include a file.
-See
-.Sx File Inclusion .
-.It Ic path pre_shared_key Ar file ;
-Specifies a file containing pre-shared key(s) for various ID(s).
-See
-.Sx Pre-shared key File .
-.It Ic path certificate Ar path ;
-.Xr racoon 8
-will search this directory if a certificate or certificate request is received.
-If you run with privilege separation,
-.Xr racoon 8
-will refuse to use a certificate stored outside of this directory.
-.It Ic path backupsa Ar file ;
-Specifies a file to which SA information negotiated by
-racoon should be stored.
-.Xr racoon 8
-will install SA(s) from the file when started with the
-.Fl B
-flag.
-The file is growing because
-.Xr racoon 8
-simply adds SAs to it.
-You should maintain the file manually.
-.It Ic path script Ar path ;
-.Xr racoon 8
-will search this directory for scripts hooks.
-If you run with privilege separation,
-.Xr racoon 8
-will refuse to execute a script stored outside of this directory.
-.It Ic path pidfile Ar file ;
-Specifies file where to store PID of process.
-If path starts with
-.Pa /
-it is treated as an absolute path. Otherwise, it is treated as a relative 
-path to the VARRUN directory specified at compilation time.
-Default is
-.Pa racoon.pid .
-.El
-.\"
-.Ss File Inclusion
-.Bl -tag -width Ds -compact
-.It Ic include Ar file
-Specifies other configuration files to be included.
-.El
-.\"
-.Ss Identifier Specification
-is obsolete.
-It must be defined at each
-.Ic remote
-directive.
-.\"
-.Ss Timer Specification
-.Bl -tag -width Ds -compact
-.It Ic timer { Ar statements Ic }
-This section specifies various timer values used by racoon.
-.Pp
-.Bl -tag -width Ds -compact
-.It Ic counter Ar number ;
-The maximum number of retries to send.
-The default is 5.
-.It Ic interval Ar number Ar timeunit ;
-The interval to resend, in seconds.
-The default time is 10 seconds.
-.It Ic persend Ar number ;
-The number of packets per send.
-The default is 1.
-.It Ic phase1 Ar number Ar timeunit ;
-The maximum time it should take to complete phase 1.
-The default time is 15 seconds.
-.It Ic phase2 Ar number Ar timeunit ;
-The maximum time it should take to complete phase 2.
-The default time is 10 seconds.
-.It Ic natt_keepalive Ar number Ar timeunit ;
-The interval between sending NAT-Traversal keep-alive packets.
-The default time is 20 seconds.
-Set to 0s to disable keep-alive packets.
-.El
-.El
-.\"
-.Ss Listening Port Specification
-.Bl -tag -width Ds -compact
-.It Ic listen { Ar statements Ic }
-If no
-.Ar listen
-directive is specified,
-.Xr racoon 8
-will listen on all available interface addresses.
-The following is the list of valid statements:
-.Pp
-.Bl -tag -width Ds -compact
-.\" How do I express bold brackets; `[' and `]' .
-.\" Answer: For bold brackets, do "Ic \&[ foo \&]".
-.\" Is the "Bq Ic [ Ar port ] ;" buggy ?
-.It Ic isakmp Ar address Bq Bq Ar port ;
-If this is specified,
-.Xr racoon 8
-will only listen on the defined
-.Ar address .
-The default port is 500, which is specified by IANA.
-You can provide more than one address definition.
-.It Ic isakmp_natt Ar address Bq Ar port ;
-Same as
-.Ic isakmp
-but also sets the socket options to accept UDP-encapsulated ESP traffic for
-NAT-Traversal.
-If you plan to use NAT-T, you should provide at least one address
-with port 4500, which is specified by IANA.
-There is no default.
-.It Ic strict_address ;
-Requires that all addresses for ISAKMP be bound.
-This statement will be ignored if you do not specify address definitions.
-.El
-When running in privilege separation mode, you need to restart
-.Xr racoon 8
-to have changes to the
-.Ar listen
-section taken into account.
-.Pp
-The
-.Ar listen
-section can also be used to specify the admin socket mode and ownership
-if racoon was built with support for admin port.
-.Bl -tag -width Ds -compact
-.It Ic adminsock Ar path Op Ar owner\ group\ mode ;
-The
-.Ar path ,
-.Ar owner ,
-and
-.Ar group
-values specify the socket path, owner, and group. They must be quoted.
-The defaults are
-.Pa /var/racoon/racoon.sock ,
-UID 0, and GID 0.
-.Ar mode
-is the access mode in octal. The default is 0600.
-.It Ic adminsock disabled ;
-This directive tells racoon to not listen on the admin socket.
-.El
-.El
-.\"
-.Ss Miscellaneous Global Parameters
-.Bl -tag -width Ds -compact
-.It Ic gss_id_enc Ar enctype ;
-Older versions of
-.Xr racoon 8
-used ISO-Latin-1 as the encoding of the GSS-API identifier attribute.
-For interoperability with Microsoft Windows' GSS-API authentication
-scheme, the default encoding has been changed to UTF-16LE.
-The
-.Ic gss_id_enc
-parameter allows
-.Xr racoon 8
-to be configured to use the old encoding for compatibility with existing
-.Xr racoon 8
-installations.
-The following are valid values for
-.Ar enctype :
-.Pp
-.Bl -tag -width Ds -compact
-.It Ic utf-16le
-Use UTF-16LE to encode the GSS-API identifier attribute.
-This is the default encoding.
-This encoding is compatible with Microsoft Windows.
-.It Ic latin1
-Use ISO-Latin-1 to encode the GSS-API identifier attribute.
-This is the encoding used by older versions of
-.Xr racoon 8 .
-.El
-.El
-.\"
-.Ss Remote Nodes Specifications
-.Bl -tag -width Ds -compact
-.It Xo
-.Ic remote ( Ar address | Ic anonymous )
-.Bq Bq Ar port
-.Bq Ic inherit Ar parent
-.Ic { Ar statements Ic }
-.Xc
-Specifies the IKE phase 1 parameters for each remote node.
-The default port is 500.
-If
-.Ic anonymous
-is specified, the statements will apply to any peer that does not match a
-more specific
-.Ic remote
-directive.
-.Pp
-Sections with
-.Ic inherit Ar parent
-statements (where
-.Ar parent
-is either
-.Ar address
-or a keyword
-.Ic anonymous )
-that have all values predefined to those of a given
-.Ar parent .
-In these sections it is enough to redefine only the changed parameters.
-.Pp
-The following are valid statements.
-.Pp
-.Bl -tag -width Ds -compact
-.\"
-.It Ic exchange_mode ( main | aggressive | base ) ;
-Defines the exchange mode for phase 1 when racoon is the initiator.
-It also means the acceptable exchange mode when racoon is the responder.
-More than one mode can be specified by separating them with a comma.
-All of the modes are acceptable.
-The first exchange mode is what racoon uses when it is the initiator.
-.\"
-.It Ic doi Ic ipsec_doi ;
-Means to use IPsec DOI as specified in RFC 2407.
-You can omit this statement.
-.\"
-.It Ic situation Ic identity_only ;
-Means to use SIT_IDENTITY_ONLY as specified in RFC 2407.
-You can omit this statement.
-.\"
-.It Ic identifier Ar idtype ;
-This statment is obsolete. Instead, use
-.Ic my_identifier .
-.\"
-.It Xo
-.Ic my_identifier Bq Ar qualifier
-.Ar idtype ... ;
-.Xc
-Specifies the identifier sent to the remote host
-and the type to use in the phase 1 negotiation.
-.Ic address, fqdn , user_fqdn , keyid ,
-and
-.Ic asn1dn
-can be used as an
-.Ar idtype .
-The
-.Ar qualifier
-is currently only used for
-.Ic keyid ,
-and can be either
-.Ic file
-or
-.Ic tag .
-The possible values are :
-.Bl -tag -width Ds -compact
-.It Ic my_identifier Ic address Bq Ar address ;
-The type is the IP address.
-This is the default type if you do not specify an identifier to use.
-.It Ic my_identifier Ic user_fqdn Ar string ;
-The type is a USER_FQDN (user fully-qualified domain name).
-.It Ic my_identifier Ic fqdn Ar string ;
-The type is a FQDN (fully-qualified domain name).
-.It Xo
-.Ic my_identifier Ic keyid Bq Ic file
-.Ar file ;
-.Xc
-The type is a KEY_ID, read from the file.
-.It Ic my_identifier Ic keyid Ic tag Ar string ;
-The type is a KEY_ID, specified in the quoted string.
-.It Ic my_identifier Ic asn1dn Bq Ar string ;
-The type is an ASN.1 distinguished name.
-If
-.Ar string
-is omitted,
-.Xr racoon 8
-will get the DN from the Subject field in the certificate.
-.El
-.\"
-.It Ic xauth_login Bq Ar string ;
-Specifies the login to use in client-side Hybrid authentication.
-It is available only if
-.Xr racoon 8
-has been built with this option.
-The associated password is looked up in the pre-shared key files,
-using the login
-.Ic string
-as the key id.
-.\"
-.It Ic peers_identifier Ar idtype ... ;
-Specifies the peer's identifier to be received.
-If it is not defined then
-.Xr racoon 8
-will not verify the peer's identifier in ID payload transmitted from the peer.
-If it is defined, the behavior of the verification depends on the flag of
-.Ic verify_identifier .
-The usage of
-.Ar idtype
-is the same as
-.Ic my_identifier
-except that the individual component values of an
-.Ic asn1dn
-identifier may specified as
-.Ic *
-to match any value (e.g. "C=XX, O=MyOrg, OU=*, CN=Mine").
-Alternative acceptable peer identifiers may be specified by repeating the
-.Ic peers_identifier
-statement.
-.\"
-.It Ic verify_identifier (on | off) ;
-If you want to verify the peer's identifier,
-set this to on.
-In this case, if the value defined by
-.Ic peers_identifier
-is not the same as the peer's identifier in the ID payload,
-the negotiation will fail.
-The default is off.
-.\"
-.It Ic certificate_type Ar certspec ;
-Specifies a certificate specification.
-.Ar certspec
-is one of followings:
-.Bl -tag -width Ds -compact
-.It Ic x509 Ar certfile Ar privkeyfile ;
-.Ar certfile
-means a file name of a certificate.
-.Ar privkeyfile
-means a file name of a secret key.
-.El
-.Bl -tag -width Ds -compact
-.It Ic plain_rsa Ar privkeyfile ;
-.Ar privkeyfile
-means a file name of a private key generated by plainrsa-gen(8).  Required
-for RSA authentication.
-.El
-.It Ic ca_type Ar cacertspec ;
-Specifies a root certificate authority specification.
-.Ar cacertspec
-is one of followings:
-.Bl -tag -width Ds -compact
-.It Ic x509 Ar cacertfile ;
-.Ar cacertfile
-means a file name of the root certificate authority.
-Default is
-.Pa /etc/openssl/cert.pem
-.El
-.\"
-.It Ic mode_cfg (on | off) ;
-Gather network information through ISAKMP mode configuration.
-Default is off.
-.\"
-.It Ic weak_phase1_check (on | off) ;
-Tells racoon to act on unencrypted deletion messages during phase 1.
-This is a small security risk, so the default is off, meaning that
-racoon will keep on trying to establish a connection even if the
-user credentials are wrong, for instance.
-.\"
-.It Ic peers_certfile ( dnssec | Ar certfile | Ic plain_rsa Ar pubkeyfile ) ;
-If
-.Ic dnssec
-is defined,
-.Xr racoon 8
-will ignore the CERT payload from the peer,
-and try to get the peer's certificate from DNS instead.
-If
-.Ar certfile
-is defined,
-.Xr racoon 8
-will ignore the CERT payload from the peer,
-and will use this certificate as the peer's certificate.
-If
-.Ic plain_rsa
-is defined,
-.Xr racoon 8
-will expect
-.Ar pubkeyfile
-to be the peer's public key that was generated
-by plainrsa-gen(8).
-.\"
-.It Ic script Ar script Ic phase1_up
-.It Ic script Ar script Ic phase1_down
-Shell scripts that get executed when a phase 1 SA goes up or down.
-Both scripts get either
-.Ic phase1_up
-or
-.Ic phase1_down
-as first argument, and the following
-variables are set in their environment:
-.Bl -tag -width Ds -compact
-.It Ev LOCAL_ADDR
-The local address of the phase 1 SA.
-.It Ev LOCAL_PORT
-The local port used for IKE for the phase 1 SA.
-.It Ev REMOTE_ADDR
-The remote address of the phase 1 SA.
-.It Ev REMOTE_PORT
-The remote port used for IKE for the phase 1 SA.
-.El
-The following variables are only set if
-.Ic mode_cfg
-was enabled:
-.Bl -tag -width Ds -compact
-.It INTERNAL_ADDR4
-An IPv4 internal address obtained by ISAKMP mode config.
-.It INTERNAL_NETMASK4
-An IPv4 internal netmask obtained by ISAKMP mode config.
-.It INTERNAL_CIDR4
-An IPv4 internal netmask obtained by ISAKMP mode config, in CIDR notation.
-.It INTERNAL_DNS4
-The first internal DNS server IPv4 address obtained by ISAKMP mode config.
-.It INTERNAL_DNS4_LIST
-A list of internal DNS servers IPv4 address obtained by ISAKMP mode config,
-separated by spaces.
-.It INTERNAL_WINS4
-The first internal WINS server IPv4 address obtained by ISAKMP mode config.
-.It INTERNAL_WINS4_LIST
-A list of internal WINS servers IPv4 address obtained by ISAKMP mode config,
-separated by spaces.
-.It SPLIT_INCLUDE
-The space separated list of IPv4 addresses and masks (address slash mask)
-that define the networks to be encrypted (as opposed to the default where
-all the traffic should be encrypted) ; obtained by ISAKMP mode config ;
-SPLIT_INCLUDE and SPLIT_LOCAL are mutually exclusive.
-.It SPLIT_LOCAL
-The space separated list of IPv4 addresses and masks (address slash mask)
-that define the networks to be considered local, and thus excluded from the
-tunnels ; obtained by ISAKMP mode config.
-.It DEFAULT_DOMAIN
-The DNS default domain name obtained by ISAKMP mode config.
-.El
-.\"
-.\"
-.It Ic send_cert (on | off) ;
-If you do not want to send a certificate, set this to off.
-The default is on.
-.\"
-.It Ic send_cr (on | off) ;
-If you do not want to send a certificate request, set this to off.
-The default is on.
-.\"
-.It Ic verify_cert (on | off) ;
-By default, the identifier sent by the remote host (as specified in its
-.Ic my_identifier
-statement) is compared with the credentials in the certificate
-used to authenticate the remote host as follows:
-.Bl -tag -width Ds -compact
-.It Type Ic asn1dn:
-The entire certificate subject name is compared with the identifier,
-e.g. "C=XX, O=YY, ...".
-.It Type Ic address, fqdn, or user_fqdn:
-The certificate's subjectAltName is compared with the identifier.
-.El
-If the two do not match the negotiation will fail.
-If you do not want to verify the identifier using the peer's certificate,
-set this to off.
-.\"
-.It Ic lifetime time Ar number Ar timeunit ;
-Define a lifetime of a certain time
-which will be proposed in the phase 1 negotiations.
-Any proposal will be accepted, and the attribute(s) will not be proposed to
-the peer if you do not specify it (them).
-They can be individually specified in each proposal.
-.\"
-.It Ic ike_frag (on | off | force) ;
-Enable receiver-side IKE fragmentation if
-.Xr racoon 8
-has been built with this feature.
-If set to on, racoon will advertise
-itself as being capable of receiving packets split by IKE fragmentation.
-This extension is there to work around broken firewalls that do not
-work with fragmented UDP packets.
-IKE fragmentation is always enabled on the sender-side, and it is
-used if the peer advertises itself as IKE fragmentation capable.
-By selecting force, IKE Fragmentation will
-be used when racoon is acting as the initiator even before the remote
-peer has advertised itself as IKE fragmentation capable.
-.\"
-.It Ic esp_frag Ar fraglen ;
-This option is only relevant if you use NAT traversal in tunnel mode.
-Its purpose is to work around broken DSL routers that reject UDP
-fragments, by fragmenting the IP packets before ESP encapsulation.
-The result is ESP over UDP of fragmented packets instead of fragmented
-ESP over UDP packets (i.e., IP:UDP:ESP:frag(IP) instead of
-frag(IP:UDP:ESP:IP)).
-.Ar fraglen
-is the maximum size of the fragments.
-552 should work anywhere,
-but the higher
-.Ar fraglen
-is, the better the performance.
-.Pp
-Note that because PMTU discovery is broken on many sites, you will
-have to use MSS clamping if you want TCP to work correctly.
-.\"
-.It Ic initial_contact (on | off) ;
-Enable this to send an INITIAL-CONTACT message.
-The default value is
-.Ic on .
-This message is useful only when the responder implementation chooses an
-old SA when there are multiple SAs with different established time and the
-initiator reboots.
-If racoon did not send the message,
-the responder would use an old SA even when a new SA was established.
-For systems that use a KAME derived IPSEC stack, the
-.Xr sysctl 8
-variable net.key.preferred_oldsa can be used to control this preference.
-When the value is zero, the stack always uses a new SA.
-.\"
-.It Ic passive (on | off) ;
-If you do not want to initiate the negotiation, set this to on.
-The default value is
-.Ic off .
-It is useful for a server.
-.\"
-.It Ic proposal_check Ar level ;
-Specifies the action of lifetime length, key length and PFS of the phase 2
-selection on the responder side, and the action of lifetime check in
-phase 1.
-The default level is
-.Ic strict .
-If the
-.Ar level
-is:
-.Bl -tag -width Ds -compact
-.It Ic obey
-The responder will obey the initiator anytime.
-.It Ic strict
-If the responder's lifetime length is longer than the initiator's or
-the responder's key length is shorter than the initiator's,
-the responder will use the initiator's value.
-Otherwise, the proposal will be rejected.
-If PFS is not required by the responder, the responder will obey the proposal.
-If PFS is required by both sides and the responder's group is not equal to
-the initiator's, then the responder will reject the proposal.
-.It Ic claim
-If the responder's lifetime length is longer than the initiator's or
-the responder's key length is shorter than the initiator's,
-the responder will use the initiator's value.
-If the responder's lifetime length is shorter than the initiator's,
-the responder uses its own length AND sends a RESPONDER-LIFETIME notify
-message to an initiator in the case of lifetime (phase 2 only).
-For PFS, this directive behaves the same as
-.Ic strict .
-.It Ic exact
-If the initiator's lifetime or key length is not equal to the responder's,
-the responder will reject the proposal.
-If PFS is required by both sides and the responder's group is not equal to
-the initiator's, then the responder will reject the proposal.
-.El
-.\"
-.It Ic support_proxy (on | off) ;
-If this value is set to on, then both values of ID payloads in the
-phase 2 exchange are always used as the addresses of end-point of
-IPsec-SAs.
-The default is off.
-.\"
-.It Ic generate_policy (on | off | require | unique) ;
-This directive is for the responder.
-Therefore you should set
-.Ic passive
-to on in order that
-.Xr racoon 8
-only becomes a responder.
-If the responder does not have any policy in SPD during phase 2
-negotiation, and the directive is set to on, then
-.Xr racoon 8
-will choose the first proposal in the
-SA payload from the initiator, and generate policy entries from the proposal.
-It is useful to negotiate with clients whose IP address is allocated
-dynamically.
-Note that an inappropriate policy might be installed into the responder's SPD
-by the initiator,
-so other communications might fail if such policies are installed
-due to a policy mismatch between the initiator and the responder.
-.Ic on
-and
-.Ic require
-values mean the same thing (generate a require policy).
-.Ic unique
-tells racoon to set up unique policies, with a monotoning increasing
-reqid number (between 1 and IPSEC_MANUAL_REQID_MAX).
-This directive is ignored in the initiator case.
-The default value is
-.Ic off .
-.\"
-.\"
-.It Ic nat_traversal (on | off | force) ;
-This directive enables use of the NAT-Traversal IPsec extension
-(NAT-T).
-NAT-T allows one or both peers to reside behind a NAT gateway (i.e.,
-doing address- or port-translation).
-If a NAT gateway is detected during the phase 1 handshake, racoon will
-attempt to negotiate the use of NAT-T with the remote peer.
-If the negotiation succeeds, all ESP and AH packets for the given connection
-will be encapsulated into UDP datagrams (port 4500, by default).
-Possible values are:
-.Bl -tag -width Ds -compact
-.It Ic on
-NAT-T is used when a NAT gateway is detected between the peers.
-.It Ic off
-NAT-T is not proposed/accepted.
-This is the default.
-.It Ic force
-NAT-T is used regardless of whether a NAT gateway is detected between the
-peers or not.
-.El
-Please note that NAT-T support is a compile-time option.
-Although it is enabled in the source distribution by default, it
-may not be available in your particular build.
-In that case you will get a
-warning when using any NAT-T related config options.
-.\"
-.It Ic dpd_delay Ar delay ;
-This option activates the DPD and sets the time (in seconds) allowed
-between 2 proof of liveliness requests.
-The default value is
-.Ic 0 ,
-which disables DPD monitoring, but still negotiates DPD support.
-.\"
-.It Ic dpd_retry Ar delay ;
-If
-.Ic dpd_delay
-is set, this sets the delay (in seconds) to wait for a proof of
-liveliness before considering it as failed and send another request.
-The default value is
-.Ic 5 .
-.\"
-.It Ic dpd_maxfail Ar number ;
-If
-.Ic dpd_delay
-is set, this sets the maximum number of liveliness proofs to request
-(without reply) before considering the peer is dead.
-The default value is
-.Ic 5 .
-.\"
-.It Ic nonce_size Ar number ;
-define the byte size of nonce value.
-Racoon can send any value although
-RFC2409 specifies that the value MUST be between 8 and 256 bytes.
-The default size is 16 bytes.
-.\"
-.It Ic ph1id Ar number ;
-An optionnal number to identify the remote proposal and to link it
-only with sainfos who have the same number.
-Defaults to 0.
-.\"
-.It Xo
-.Ic proposal { Ar sub-substatements Ic }
-.Xc
-.Bl -tag -width Ds -compact
-.\"
-.It Ic encryption_algorithm Ar algorithm ;
-Specifies the encryption algorithm used for the phase 1 negotiation.
-This directive must be defined.
-.Ar algorithm
-is one of following:
-.Ic des, 3des, blowfish, cast128, aes, camellia
-.\".Ic rc5 , idea
-for Oakley.
-For other transforms, this statement should not be used.
-.\"
-.It Ic hash_algorithm Ar algorithm ;
-Defines the hash algorithm used for the phase 1 negotiation.
-This directive must be defined.
-.Ar algorithm
-is one of following:
-.Ic md5, sha1, sha256, sha384, sha512
-for Oakley.
-.\"
-.It Ic authentication_method Ar type ;
-Defines the authentication method used for the phase 1 negotiation.
-This directive must be defined.
-.Ar type
-is one of:
-.Ic pre_shared_key , rsasig
-(for plain RSA authentication),
-.Ic gssapi_krb , hybrid_rsa_server ,
-.Ic hybrid_rsa_client , xauth_rsa_server , xauth_rsa_client , xauth_psk_server
-or
-.Ic xauth_psk_client .
-.\"
-.It Ic dh_group Ar group ;
-Defines the group used for the Diffie-Hellman exponentiations.
-This directive must be defined.
-.Ar group
-is one of following:
-.Ic modp768 , modp1024 , modp1536 ,
-.Ic modp2048 , modp3072 , modp4096 ,
-.Ic modp6144 , modp8192 .
-Or you can define 1, 2, 5, 14, 15, 16, 17, or 18 as the DH group number.
-When you want to use aggressive mode,
-you must define the same DH group in each proposal.
-.It Ic lifetime time Ar number Ar timeunit ;
-Defines the lifetime of the phase 1 SA proposal.
-Refer to the description of the
-.Ic lifetime
-directive defined in the
-.Ic remote
-directive.
-.It Ic gss_id Ar string ;
-Defines the GSS-API endpoint name, to be included as an attribute in the SA,
-if the
-.Ic gssapi_krb
-authentication method is used.
-If this is not defined, the default value of
-.Ql host/hostname
-is used, where hostname is the value returned by the
-.Xr hostname 1
-command.
-.El
-.El
-.El
-.\"
-.Ss Policy Specifications
-The policy directive is obsolete, policies are now in the SPD.
-.Xr racoon 8
-will obey the policy configured into the kernel by
-.Xr setkey 8 ,
-and will construct phase 2 proposals by combining
-.Ic sainfo
-specifications in
-.Nm ,
-and policies in the kernel.
-.\"
-.Ss Sainfo Specifications
-.Bl -tag -width Ds -compact
-.It Xo
-.Ic sainfo ( Ar source_id destination_id | Ar source_id Ic anonymous | Ic anonymous Ar destination_id | Ic anonymous ) [ from Ar idtype [ Ar string ] ] [ Ic group Ar string ]
-.Ic { Ar statements Ic }
-.Xc
-defines the parameters of the IKE phase 2 (IPsec-SA establishment).
-.Ar source_id
-and
-.Ar destination_id
-are constructed like:
-.Pp
-.Ic address Ar address
-.Bq Ic / Ar prefix
-.Bq Ic [ Ar port ]
-.Ar ul_proto
-.Pp
-or
-.Pp
-.Ic subnet Ar address
-.Bq Ic / Ar prefix
-.Bq Ic [ Ar port ]
-.Ar ul_proto
-.Pp
-or
-.Pp
-.Ar idtype Ar string
-.Pp
-An id string should be expressed to match the exact value of an ID payload
-(source is the local end, destination is the remote end).
-This is not like a filter rule.
-For example, if you define 3ffe:501:4819::/48 as
-.Ar source_id .
-3ffe:501:4819:1000:/64 will not match.
-.Pp
-In the case of a longest prefix (selecting a single host),
-.Ar address
-instructs to send ID type of ADDRESS while
-.Ar subnet
-instructs to send ID type of SUBNET.
-Otherwise, these instructions are identical.
-.Pp
-The group keyword allows an XAuth group membership check to be performed
-for this sainfo section.
-When the mode_cfg auth source is set to
-.Ic system
-or
-.Ic ldap ,
-the XAuth user is verified to be a member of the specified group
-before allowing a matching SA to be negotiated.
-.Pp
-.Bl -tag -width Ds -compact
-.\"
-.It Ic pfs_group Ar group ;
-define the group of Diffie-Hellman exponentiations.
-If you do not require PFS then you can omit this directive.
-Any proposal will be accepted if you do not specify one.
-.Ar group
-is one of following:
-.Ic modp768 , modp1024 , modp1536 ,
-.Ic modp2048 , modp3072 , modp4096 ,
-.Ic modp6144 , modp8192 .
-Or you can define 1, 2, 5, 14, 15, 16, 17, or 18 as the DH group number.
-.\"
-.It Ic lifetime time Ar number Ar timeunit ;
-define how long an IPsec-SA will be used, in timeunits.
-Any proposal will be accepted, and no attribute(s) will be proposed to
-the peer if you do not specify it(them).
-See the
-.Ic proposal_check
-directive.
-.\"
-.It Ic remoteid Ar number ;
-Sainfos will only be used if their remoteid matches the ph1id of the
-remote section used for phase 1.
-Defaults to 0, which is also the default for ph1id.
-.\"
-.It Ic my_identifier Ar idtype ... ;
-is obsolete.
-It does not make sense to specify an identifier in the phase 2.
-.El
-.\"
-.Pp
-.Xr racoon 8
-does not have a list of security protocols to be negotiated.
-The list of security protocols are passed by SPD in the kernel.
-Therefore you have to define all of the potential algorithms
-in the phase 2 proposals even if there are algorithms which will not be used.
-These algorithms are define by using the following three directives,
-with a single comma as the separator.
-For algorithms that can take variable-length keys, algorithm names
-can be followed by a key length, like
-.Dq Li blowfish 448 .
-.Xr racoon 8
-will compute the actual phase 2 proposals by computing
-the permutation of the specified algorithms,
-and then combining them with the security protocol specified by the SPD.
-For example, if
-.Ic des , 3des , hmac_md5 ,
-and
-.Ic hmac_sha1
-are specified as algorithms, we have four combinations for use with ESP,
-and two for AH.
-Then, based on the SPD settings,
-.Xr racoon 8
-will construct the actual proposals.
-If the SPD entry asks for ESP only, there will be 4 proposals.
-If it asks for both AH and ESP, there will be 8 proposals.
-Note that the kernel may not support the algorithm you have specified.
-.\"
-.Bl -tag -width Ds -compact
-.It Ic encryption_algorithm Ar algorithms ;
-.Ic des , 3des , des_iv64 , des_iv32 ,
-.Ic rc5 , rc4 , idea , 3idea ,
-.Ic cast128 , blowfish , null_enc ,
-.Ic twofish , rijndael , aes , camellia
-.Pq used with ESP
-.\"
-.It Ic authentication_algorithm Ar algorithms ;
-.Ic des , 3des , des_iv64 , des_iv32 ,
-.Ic hmac_md5 , hmac_sha1 , hmac_sha256, hmac_sha384, hmac_sha512, non_auth
-.Pq used with ESP authentication and AH
-.\"
-.It Ic compression_algorithm Ar algorithms ;
-.Ic deflate
-.Pq used with IPComp
-.El
-.El
-.\"
-.Ss Logging level
-.Bl -tag -width Ds -compact
-.It Ic log Ar level ;
-Defines the logging level.
-.Ar level
-is one of following:
-.Ic error , warning , notify , info , debug
-and
-.Ic debug2 .
-The default is
-.Ic info .
-If you set the logging level too high on slower machines,
-IKE negotiation can fail due to timing constraint changes.
-.El
-.\"
-.Ss Specifies the way to pad
-.Bl -tag -width Ds -compact
-.It Ic padding { Ar statements Ic }
-specifies the padding format.
-The following are valid statements:
-.Bl -tag -width Ds -compact
-.It Ic randomize (on | off) ;
-Enables the use of a randomized value for padding.
-The default is on.
-.It Ic randomize_length (on | off) ;
-The pad length will be random.
-The default is off.
-.It Ic maximum_length Ar number ;
-Defines a maximum padding length.
-If
-.Ic randomize_length
-is off, this is ignored.
-The default is 20 bytes.
-.It Ic exclusive_tail (on | off) ;
-Means to put the number of pad bytes minus one into the last part
-of the padding.
-The default is on.
-.It Ic strict_check (on | off) ;
-Means to constrain the peer to set the number of pad bytes.
-The default is off.
-.El
-.El
-.Ss ISAKMP mode configuration settings
-.Bl -tag -width Ds -compact
-.It Ic mode_cfg { Ar statements Ic }
-Defines the information to return for remote hosts' ISAKMP mode config
-requests.
-Also defines the authentication source for remote peers
-authenticating through Xauth.
-.Pp
-The following are valid statements:
-.Bl -tag -width Ds -compact
-.It Ic auth_source (system | radius | pam | ldap) ;
-Specifies the source for authentication of users through Xauth.
-.Ar system
-means to use the Unix user database.
-This is the default.
-.Ar radius
-means to use a RADIUS server.
-It works only if
-.Xr racoon 8
-was built with libradius support. Radius configuration is hanlded by
-.Xr radius.conf 5 .
-.Ar pam
-means to use PAM.
-It works only if
-.Xr racoon 8
-was built with libpam support.
-.Ar ldap
-means to use LDAP.
-It works only if
-.Xr racoon 8
-was built with libldap support. LDAP configuration is handled by
-statements in the
-.Ic ldapcfg
-section.
-.It Ic auth_groups Ar "group1", ... ;
-Specifies the group memberships for Xauth in quoted group name strings.
-When defined, the authenticating user must be a member of at least one
-group for Xauth to succeed.
-.It Ic group_source (system | ldap) ;
-Specifies the source for group validataion of users through Xauth.
-.Ar system
-means to use the Unix user database.
-This is the default.
-.Ar ldap
-means to use LDAP.
-It works only if
-.Xr racoon 8
-was built with libldap support and requires LDAP authentication.
-LDAP configuration is handled by statements in the
-.Ic ldapcfg
-section.
-.It Ic conf_source (local | radius | ldap) ;
-Specifies the source for IP addresses and netmask allocated through ISAKMP
-mode config.
-.Ar local
-means to use the local IP pool defined by the
-.Ic network4
-and
-.Ic pool_size
-statements.
-This is the default.
-.Ar radius
-means to use a RADIUS server.
-It works only if
-.Xr racoon 8
-was built with libradius support and requires RADIUS authentiation.
-RADIUS configuration is handled by
-.Xr radius.conf 5 .
-.Ar ldap
-means to use an LDAP server.
-It works only if
-.Xr racoon 8
-was built with libldap support and requires LDAP authentication.
-LDAP configuration is handled by
-statements in the
-.Ic ldapcfg
-section.
-.It Ic accounting (none | system | radius | pam) ;
-Enables or disables accounting for Xauth logins and logouts.
-The default is
-.Ar none
-which disable accounting.
-Specifying
-.Ar system
-enables system accounting through
-.Xr utmp 5 .
-Specifying
-.Ar radius
-enables RADIUS accounting.
-It works only if
-.Xr racoon 8
-was built with libradius support and requires RADIUS authentication.
-RADIUS configuration is handled by
-.Xr radius.conf 5 .
-Specifying
-.Ar pam
-enables PAM accounting.
-It works only if
-.Xr racoon 8
-was build with libpam support and requires PAM authentication.
-.It Ic pool_size Ar size
-Specify the size of the IP address pool, either local or allocated
-through RADIUS.
-.Ic conf_source
-selects the local pool or the RADIUS configuration, but in both
-configurations, you cannot have more than
-.Ar size
-users connected at the same time.
-The default is 255.
-.It Ic network4 Ar address ;
-.It Ic netmask4 Ar address ;
-The local IP pool base address and network mask from which dynamically
-allocated IPv4 addresses should be taken.
-This is used if
-.Ic conf_source
-is set to
-.Ar local
-or if the RADIUS server returned
-.Ar 255.255.255.254 .
-Default is
-.Ar 0.0.0.0/0.0.0.0 .
-.It Ic dns4 Ar addresses ;
-A list of IPv4 addresses for DNS servers, separated by commas, or on multiple
-.Ic dns4
-lines.
-.It Ic wins4 Ar addresses ;
-A list of IPv4 address for WINS servers. The keyword
-.It nbns4
-can also be used as an alias for
-.It wins4 .
-.It Ic split_network (include | local_lan) Ar network/mask, ...
-The network configuration to send, in cidr notation (e.g. 192.168.1.0/24).
-If
-.Ic include
-is specified, the tunnel should be only used to encrypt the indicated
-destinations ; otherwise, if
-.Ic local_lan
-is used, everything will pass through the tunnel but those destinations.
-.It Ic default_domain Ar domain ;
-The default DNS domain to send.
-.It Ic split_dns Ar "domain", ...
-The split dns configuration to send, in quoted domain name strings.
-This list can be used to describe a list of domain names for which
-a peer should query a modecfg assigned dns server.
-DNS queries for all other domains would be handled locally.
-(Cisco VPN client only).
-.It Ic banner Ar path ;
-The path of a file displayed on the client at connection time.
-Default is
-.Ar /etc/motd .
-.It Ic auth_throttle Ar delay ;
-On each failed Xauth authentication attempt, refuse new attempts for a set
-.Ar delay
-of seconds.
-This is to avoid dictionary attacks on Xauth passwords.
-Default is one second.
-Set to zero to disable authentication delay.
-.It Ic pfs_group Ar group ;
-Sets the PFS group used in the client proposal (Cisco VPN client only).
-Default is 0.
-.It Ic save_passwd (on | off) ;
-Allow the client to save the Xauth password (Cisco VPN client only).
-Default is off.
-.El
-.El
-.Ss Ldap configuration settings
-.Bl -tag -width Ds -compact
-.It Ic ldapcfg { Ar statements Ic }
-Defines the parameters that will be used to communicate with an ldap
-server for
-.Ic xauth
-authentication.
-.Pp
-The following are valid statements:
-.Bl -tag -width Ds -compact
-.It Ic version (2 | 3) ;
-The ldap protocol version used to communicate with the server.
-The default is
-.Ic 3 .
-.It Ic host Ar (hostname | address) ;
-The host name or ip address of the ldap server.
-The default is
-.Ic localhost .
-.It Ic port Ar number;
-The port that the ldap server is configured to listen on.
-The default is
-.Ic 389 .
-.It Ic base Ar distinguished name;
-The ldap search base.
-This option has no default value.
-.It Ic subtree (on | off) ;
-Use the subtree ldap search scope.
-Otherwise, use the one level search scope.
-The default is
-.Ic off .
-.It Ic bind_dn Ar distinguised name;
-The user dn used to optionaly bind as before performing ldap search operations.
-If this option is not specified, anonymous binds are used.
-.It Ic bind_pw Ar string;
-The password used when binding as
-.Ic bind_dn .
-.It Ic attr_user Ar attribute name;
-The attribute used to specify a users name in an ldap directory.
-For example,
-if a user dn is "cn=jdoe,dc=my,dc=net" then the attribute would be "cn".
-The default value is
-.Ic cn .
-.It Ic attr_addr Ar attribute name;
-.It Ic attr_mask Ar attribute name;
-The attributes used to specify a users network address and subnet mask in an
-ldap directory.
-These values are forwarded during mode_cfg negotiation when
-the conf_source is set to ldap.
-The default values are
-.Ic racoon-address
-and
-.Ic racoon-netmask .
-.It Ic attr_group Ar attribute name;
-The attribute used to specify a group name in an ldap directory.
-For example,
-if a group dn is "cn=users,dc=my,dc=net" then the attribute would be "cn".
-The default value is
-.Ic cn .
-.It Ic attr_member Ar attribute name;
-The attribute used to specify group membership in an ldap directory.
-The default value is
-.Ic member .
-.El
-.El
-.Ss Special directives
-.Bl -tag -width Ds -compact
-.It Ic complex_bundle (on | off) ;
-defines the interpretation of proposal in the case of SA bundle.
-Normally
-.Dq IP AH ESP IP payload
-is proposed as
-.Dq AH tunnel and ESP tunnel .
-The interpretation is more common to other IKE implementations, however,
-it allows very limited set of combinations for proposals.
-With the option enabled, it will be proposed as
-.Dq AH transport and ESP tunnel .
-The default value is
-.Ic off .
-.El
-.\"
-.Ss Pre-shared key File
-The pre-shared key file defines pairs of identifiers and corresponding
-shared secret keys which are used in the pre-shared key authentication
-method in phase 1.
-The pair in each line is separated by some number of blanks and/or tab
-characters like in the
-.Xr hosts 5
-file.
-Key can include blanks because everything after the first blanks
-is interpreted as the secret key.
-Lines starting with
-.Ql #
-are ignored.
-Keys which start with
-.Ql 0x
-are interpreted as hexadecimal strings.
-Note that the file must be owned by the user ID running
-.Xr racoon 8
-.Pq usually the privileged user ,
-and must not be accessible by others.
-.\"
-.Sh EXAMPLES
-The following shows how the remote directive should be configured.
-.Bd -literal -offset
-path pre_shared_key "/usr/local/v6/etc/psk.txt" ;
-remote anonymous
-{
-	exchange_mode aggressive,main,base;
-	lifetime time 24 hour;
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method pre_shared_key;
-		dh_group 2;
-	}
-}
-
-sainfo anonymous
-{
-	pfs_group 2;
-	lifetime time 12 hour ;
-	encryption_algorithm 3des, blowfish 448, twofish, rijndael ;
-	authentication_algorithm hmac_sha1, hmac_md5 ;
-	compression_algorithm deflate ;
-}
-.Ed
-.Pp
-If you are configuring plain RSA authentication, the remote directive
-should look like the following:
-.Bd -literal -offset
-path certificate "/usr/local/v6/etc" ;
-remote anonymous
-{
-        exchange_mode main,base ;
-        lifetime time 12 hour ;
-        certificate_type plain_rsa "/usr/local/v6/etc/myrsakey.priv";
-        peers_certfile plain_rsa "/usr/local/v6/etc/yourrsakey.pub";
-        proposal {
-                        encryption_algorithm aes ;
-                        hash_algorithm sha1 ;
-                        authentication_method rsasig ;
-                        dh_group 2 ;
-        }
-}
-.Ed
-.Pp
-The following is a sample for the pre-shared key file.
-.Bd -literal -offset
-10.160.94.3     mekmitasdigoat
-172.16.1.133    0x12345678
-194.100.55.1    whatcertificatereally
-3ffe:501:410:ffff:200:86ff:fe05:80fa    mekmitasdigoat
-3ffe:501:410:ffff:210:4bff:fea2:8baa    mekmitasdigoat
-foo@kame.net    mekmitasdigoat
-foo.kame.net    hoge
-.Ed
-.\"
-.Sh SEE ALSO
-.Xr racoon 8 ,
-.Xr racoonctl 8 ,
-.Xr setkey 8
-.\"
-.Sh HISTORY
-The
-.Nm
-configuration file first appeared in the
-.Dq YIPS
-Yokogawa IPsec implementation.
-.\"
-.Sh BUGS
-Some statements may not be handled by
-.Xr racoon 8
-yet.
-.Pp
-Diffie-Hellman computation can take a very long time, and may cause
-unwanted timeouts, specifically when a large D-H group is used.
-.\"
-.Sh SECURITY CONSIDERATIONS
-The use of IKE phase 1 aggressive mode is not recommended,
-as described in
-.Li http://www.kb.cert.org/vuls/id/886601 .
diff --git a/src/racoon/racoonctl.8 b/src/racoon/racoonctl.8
deleted file mode 100644
index b27b188..0000000
--- a/src/racoon/racoonctl.8
+++ /dev/null
@@ -1,199 +0,0 @@
-.\"	$NetBSD: racoonctl.8,v 1.13 2006/09/09 16:22:10 manu Exp $
-.\"
-.\" Id: racoonctl.8,v 1.6 2006/05/07 21:32:59 manubsd Exp
-.\"
-.\" Copyright (C) 2004 Emmanuel Dreyfus
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\" 3. Neither the name of the project nor the names of its contributors
-.\"    may be used to endorse or promote products derived from this software
-.\"    without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd November 16, 2004
-.Dt RACOONCTL 8
-.Os
-.\"
-.Sh NAME
-.Nm racoonctl
-.Nd racoon administrative control tool
-.\"
-.Sh SYNOPSIS
-.Nm
-reload-config
-.Nm
-show-schedule
-.Nm
-.Op Fl l Op Fl l
-show-sa
-.Op isakmp|esp|ah|ipsec
-.Nm
-flush-sa
-.Op isakmp|esp|ah|ipsec
-.Nm
-delete-sa
-.Ar saopts
-.Nm
-establish-sa
-.Op Fl u Ar identity
-.Ar saopts
-.Nm
-vpn-connect
-.Op Fl u identity
-.Ar vpn_gateway
-.Nm
-vpn-disconnect
-.Ar vpn_gateway
-.Nm
-show-event
-.Op Fl l
-.Nm
-logout-user
-.Ar login
-.\"
-.Sh DESCRIPTION
-.Nm
-is used to control
-.Xr racoon 8
-operation, if ipsec-tools was configured with adminport support.
-Communication between
-.Nm
-and
-.Xr racoon 8
-is done through a UNIX socket.
-By changing the default mode and ownership
-of the socket, you can allow non-root users to alter
-.Xr racoon 8
-behavior, so do that with caution.
-.Pp
-The following commands are available:
-.Bl -tag -width Ds
-.It reload-config
-This should cause
-.Xr racoon 8
-to reload its configuration file.
-.It show-schedule
-Unknown command.
-.It show-sa Op isakmp|esp|ah|ipsec
-Dump the SA: All the SAs if no SA class is provided, or either ISAKMP SAs,
-IPsec ESP SAs, IPsec AH SAs, or all IPsec SAs.
-Use
-.Fl l
-to increase verbosity.
-.It flush-sa Op isakmp|esp|ah|ipsec
-is used to flush all SAs if no SA class is provided, or a class of SAs,
-either ISAKMP SAs, IPsec ESP SAs, IPsec AH SAs, or all IPsec SAs.
-.It Xo establish-sa
-.Oo Fl u Ar username
-.Oc Ar saopts
-.Xc
-Establish an SA, either an ISAKMP SA, IPsec ESP SA, or IPsec AH SA.
-The optional
-.Fl u Ar username
-can be used when establishing an ISAKMP SA while hybrid auth is in use.
-.Nm
-will prompt you for the password associated with
-.Ar username
-and these credentials will be used in the Xauth exchange.
-.Pp
-.Ar saopts
-has the following format:
-.Bl -tag -width Bl
-.It isakmp {inet|inet6} Ar src Ar dst
-.It {esp|ah} {inet|inet6} Ar src/prefixlen/port Ar dst/prefixlen/port
-{icmp|tcp|udp|any}
-.El
-.It Xo vpn-connect
-.Oo Fl u Ar username
-.Oc Ar vpn_gateway
-.Xc
-This is a particular case of the previous command.
-It will establish an ISAKMP SA with
-.Ar vpn_gateway .
-.It delete-sa Ar saopts
-Delete an SA, either an ISAKMP SA, IPsec ESP SA, or IPsec AH SA.
-.It vpn-disconnect Ar vpn_gateway
-This is a particular case of the previous command.
-It will kill all SAs associated with
-.Ar vpn_gateway .
-.It show-event Op Fl l
-Dump all events reported by
-.Xr racoon 8 ,
-then quit.
-The
-.Fl l
-flag causes
-.Nm
-to not stop once all the events have been read, but rather to loop
-awaiting and reporting new events.
-.It logout-user Ar login
-Delete all SA established on behalf of the Xauth user
-.Ar login .
-.El
-.Pp
-Command shortcuts are available:
-.Bl -tag -width XXX -compact -offset indent
-.It rc
-reload-config
-.It ss
-show-sa
-.It sc
-show-schedule
-.It fs
-flush-sa
-.It ds
-delete-sa
-.It es
-establish-sa
-.It vc
-vpn-connect
-.It vd
-vpn-disconnect
-.It se
-show-event
-.It lu
-logout-user
-.El
-.\"
-.Sh RETURN VALUES
-The command should exit with 0 on success, and non-zero on errors.
-.\"
-.Sh FILES
-.Bl -tag -width 30n -compact
-.It Pa /var/racoon/racoon.sock No or
-.It Pa /var/run/racoon.sock
-.Xr racoon 8
-control socket.
-.El
-.\"
-.Sh SEE ALSO
-.Xr ipsec 4 ,
-.Xr racoon 8
-.Sh HISTORY
-Once was
-.Ic kmpstat
-in the KAME project.
-It turned into
-.Nm
-but remained undocumented for a while.
-.An Emmanuel Dreyfus Aq manu@NetBSD.org
-wrote this man page.
diff --git a/src/racoon/racoonctl.c b/src/racoon/racoonctl.c
deleted file mode 100644
index 1dd26f0..0000000
--- a/src/racoon/racoonctl.c
+++ /dev/null
@@ -1,1654 +0,0 @@
-/*	$NetBSD: racoonctl.c,v 1.7.6.2 2009/04/20 13:32:57 tteras Exp $	*/
-
-/*	Id: racoonctl.c,v 1.11 2006/04/06 17:06:25 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <net/pfkeyv2.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-#include <netdb.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <err.h>
-#include <sys/ioctl.h> 
-#include <resolv.h>
-
-#include "var.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "gcmalloc.h"
-
-#include "racoonctl.h"
-#include "admin.h"
-#include "schedule.h"
-#include "handler.h"
-#include "sockmisc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#include "isakmp_unity.h"
-#include "ipsec_doi.h"
-#include "evt.h"
-
-char *adminsock_path = ADMINSOCK_PATH;
-
-static void usage __P((void));
-static vchar_t *get_combuf __P((int, char **));
-static int handle_recv __P((vchar_t *));
-static vchar_t *f_reload __P((int, char **));
-static vchar_t *f_getsched __P((int, char **));
-static vchar_t *f_getsa __P((int, char **));
-static vchar_t *f_flushsa __P((int, char **));
-static vchar_t *f_deletesa __P((int, char **));
-static vchar_t *f_exchangesa __P((int, char **));
-static vchar_t *f_vpnc __P((int, char **));
-static vchar_t *f_vpnd __P((int, char **));
-static vchar_t *f_getevt __P((int, char **));
-#ifdef ENABLE_HYBRID
-static vchar_t *f_logoutusr __P((int, char **));
-#endif
-
-struct cmd_tag {
-	vchar_t *(*func) __P((int, char **));
-	int cmd;
-	char *str;
-} cmdtab[] = {
-	{ f_reload,	ADMIN_RELOAD_CONF,	"reload-config" },
-	{ f_reload,	ADMIN_RELOAD_CONF,	"rc" },
-	{ f_getsched,	ADMIN_SHOW_SCHED,	"show-schedule" },
-	{ f_getsched,	ADMIN_SHOW_SCHED,	"sc" },
-	{ f_getsa,	ADMIN_SHOW_SA,		"show-sa" },
-	{ f_getsa,	ADMIN_SHOW_SA,		"ss" },
-	{ f_flushsa,	ADMIN_FLUSH_SA,		"flush-sa" },
-	{ f_flushsa,	ADMIN_FLUSH_SA,		"fs" },
-	{ f_deletesa,	ADMIN_DELETE_SA,	"delete-sa" },
-	{ f_deletesa,	ADMIN_DELETE_SA,	"ds" },
-	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"establish-sa" },
-	{ f_exchangesa,	ADMIN_ESTABLISH_SA,	"es" },
-	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vpn-connect" },
-	{ f_vpnc,	ADMIN_ESTABLISH_SA,	"vc" },
-	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vpn-disconnect" },
-	{ f_vpnd,	ADMIN_DELETE_ALL_SA_DST,"vd" },
-	{ f_getevt,	ADMIN_SHOW_EVT,		"show-event" },
-	{ f_getevt,	ADMIN_SHOW_EVT,		"se" },
-#ifdef ENABLE_HYBRID
-	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"logout-user" },
-	{ f_logoutusr,	ADMIN_LOGOUT_USER,	"lu" },
-#endif
-	{ NULL, 0, NULL },
-};
-
-struct evtmsg {
-	int type;
-	char *msg;
-	enum { UNSPEC, ERROR, INFO } level;
-} evtmsg[] = {
-	{ EVTT_PHASE1_UP, "Phase 1 established", INFO },
-	{ EVTT_PHASE1_DOWN, "Phase 1 deleted", INFO },
-	{ EVTT_XAUTH_SUCCESS, "Xauth exchange passed", INFO },
-	{ EVTT_ISAKMP_CFG_DONE, "ISAKMP mode config done", INFO },
-	{ EVTT_PHASE2_UP, "Phase 2 established", INFO },
-	{ EVTT_PHASE2_DOWN, "Phase 2 deleted", INFO },
-	{ EVTT_DPD_TIMEOUT, "Peer not reachable anymore", ERROR },
-	{ EVTT_PEER_NO_RESPONSE, "Peer not responding", ERROR },
-	{ EVTT_PEER_DELETE, "Peer terminated security association", ERROR },
-	{ EVTT_RACOON_QUIT, "Raccon terminated", ERROR },
-	{ EVTT_OVERFLOW, "Event queue overflow", ERROR },
-	{ EVTT_XAUTH_FAILED, "Xauth exchange failed", ERROR },
-	{ EVTT_PEERPH1AUTH_FAILED, "Peer failed phase 1 authentication "
-	    "(certificate problem?)", ERROR },
-	{ EVTT_PEERPH1_NOPROP, "Peer failed phase 1 initiation "
-	    "(proposal problem?)", ERROR },
-	{ 0, NULL, UNSPEC },
-	{ EVTT_NO_ISAKMP_CFG, "No need for ISAKMP mode config ", INFO },
-};
-
-static int get_proto __P((char *));
-static vchar_t *get_index __P((int, char **));
-static int get_family __P((char *));
-static vchar_t *get_comindexes __P((int, int, char **));
-static int get_comindex __P((char *, char **, char **, char **));
-static int get_ulproto __P((char *));
-
-struct proto_tag {
-	int proto;
-	char *str;
-} prototab[] = {
-	{ ADMIN_PROTO_ISAKMP,	"isakmp" },
-	{ ADMIN_PROTO_IPSEC,	"ipsec" },
-	{ ADMIN_PROTO_AH,	"ah" },
-	{ ADMIN_PROTO_ESP,	"esp" },
-	{ ADMIN_PROTO_INTERNAL,	"internal" },
-	{ 0, NULL },
-};
-
-struct ulproto_tag {
-	int ul_proto;
-	char *str;
-} ulprototab[] = {
-	{ 0,		"any" },
-	{ IPPROTO_ICMP,	"icmp" },
-	{ IPPROTO_TCP,	"tcp" },
-	{ IPPROTO_UDP,	"udp" },
-	{ 0, NULL },
-};
-
-int so;
-
-static char _addr1_[NI_MAXHOST], _addr2_[NI_MAXHOST];
-
-char *pname;
-int long_format = 0;
-
-#define EVTF_NONE		0x0000	/* Ignore any events */
-#define EVTF_LOOP		0x0001	/* Loop awaiting for new events */
-#define EVTF_CFG_STOP		0x0002	/* Stop after ISAKMP mode config */
-#define EVTF_CFG		0x0004	/* Print ISAKMP mode config info */
-#define EVTF_ALL		0x0008	/* Print any events */
-#define EVTF_PURGE		0x0010	/* Print all available events */
-#define EVTF_PH1DOWN_STOP	0x0020	/* Stop when phase 1 SA gets down */
-#define EVTF_PH1DOWN		0x0040	/* Print that phase 1 SA got down */
-#define EVTF_ERR		0x0080	/* Print any error */
-#define EVTF_ERR_STOP		0x0100	/* Stop on any error */
-
-int evt_filter = EVTF_NONE;
-time_t evt_start;
-
-void dump_isakmp_sa __P((char *, int));
-void dump_internal __P((char *, int));
-char *pindex_isakmp __P((isakmp_index *));
-void print_schedule __P((caddr_t, int));
-void print_evt __P((caddr_t, int));
-void print_cfg __P((caddr_t, int));
-void print_err __P((caddr_t, int));
-void print_ph1down __P((caddr_t, int));
-void print_ph1up __P((caddr_t, int));
-int evt_poll __P((void));
-char * fixed_addr __P((char *, char *, int));
-
-static void
-usage()
-{
-	printf(
-"Usage:\n"
-"  %s reload-config\n"
-"  %s [-l [-l]] show-sa [protocol]\n"
-"  %s flush-sa [protocol]\n"
-"  %s delete-sa <saopts>\n"
-"  %s establish-sa [-u identity] <saopts>\n"
-"  %s vpn-connect [-u identity] vpn_gateway\n"
-"  %s vpn-disconnect vpn_gateway\n"
-"\n"
-"    <protocol>: \"isakmp\", \"esp\" or \"ah\".\n"
-"        In the case of \"show-sa\" or \"flush-sa\", you can use \"ipsec\".\n"
-"\n"
-"    <saopts>: \"isakmp\" <family> <src> <dst>\n"
-"            : {\"esp\",\"ah\"} <family> <src/prefixlen/port> <dst/prefixlen/port>\n"
-"                              <ul_proto>\n"
-"    <family>: \"inet\" or \"inet6\"\n"
-"    <ul_proto>: \"icmp\", \"tcp\", \"udp\" or \"any\"\n",
-	pname, pname, pname, pname, pname, pname, pname);
-}
-
-/*
- * Check for proper racoonctl interface
- */
-#if ((RACOONCTL_INTERFACE_MAJOR != 1) || (RACOONCTL_INTERFACE < 20041230))
-#error	"Incompatible racoonctl interface"
-#endif
-
-int
-main(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *combuf;
-	int c;
-
-	pname = *av;
-
-	/*
-	 * Check for proper racoonctl interface
-	 */
-	if ((racoonctl_interface_major != RACOONCTL_INTERFACE_MAJOR) ||
-	    (racoonctl_interface < RACOONCTL_INTERFACE))
-		errx(1, "Incompatible racoonctl interface");
-
-#ifdef __linux__
-	/*
-	 * Disable GNU extensions that will prevent racoonct vc -u login
-	 * from working (GNU getopt(3) does not like options after vc)
-	 */
-	setenv("POSIXLY_CORRECT", "1", 0);
-#endif
-	while ((c = getopt(ac, av, "lds:")) != -1) {
-		switch(c) {
-		case 'l':
-			long_format++;
-			break;
-
-		case 'd':
-			loglevel++;
-			break;
-
-		case 's':
-			adminsock_path = optarg;
-			break;
-
-		default:
-			usage();
-			exit(0);
-		}
-	}
-
-	ac -= optind;
-	av += optind;
-
-	combuf = get_combuf(ac, av);
-	if (!combuf)
-		err(1, "kmpstat");
-
-	if (loglevel)
-		racoon_hexdump(combuf, ((struct admin_com *)combuf)->ac_len);
-
-	com_init();
-
-	if (com_send(combuf) != 0)
-		goto bad;
-
-	vfree(combuf);
-
-	if (com_recv(&combuf) != 0)
-		goto bad;
-	if (handle_recv(combuf) != 0)
-		goto bad;
-
-	vfree(combuf);
-
-	if (evt_filter != EVTF_NONE)
-		if (evt_poll() != 0)
-			goto bad;	
-	
-	exit(0);
-
-    bad:
-	exit(1);
-}
-
-int
-evt_poll(void) {
-	struct timeval tv;
-	vchar_t *recvbuf;
-	vchar_t *sendbuf;
-
-	if ((sendbuf = f_getevt(0, NULL)) == NULL)
-		errx(1, "Cannot make combuf");
-
-
-	while (evt_filter & (EVTF_LOOP|EVTF_PURGE)) {
-		/* handle_recv closes the socket time, so open it each time */
-		com_init();
-
-		if (com_send(sendbuf) != 0)
-			errx(1, "Cannot send combuf");
-
-		if (com_recv(&recvbuf) == 0) {
-			handle_recv(recvbuf);
-			vfree(recvbuf);
-		}
-
-		tv.tv_sec = 0;
-		tv.tv_usec = 10;
-		(void)select(0, NULL, NULL, NULL, &tv);
-	}
-
-	vfree(sendbuf);
-	return 0;
-}
-
-/* %%% */
-/*
- * return command buffer.
- */
-static vchar_t *
-get_combuf(ac, av)
-	int ac;
-	char **av;
-{
-	struct cmd_tag *cp;
-
-	if (ac == 0) {
-		usage();
-		exit(0);
-	}
-
-	/* checking the string of command. */
-	for (cp = &cmdtab[0]; cp->str; cp++) {
-		if (strcmp(*av, cp->str) == 0) {
-			break;
-		}
-	}
-	if (!cp->str) {
-		printf("Invalid command [%s]\n", *av);
-		errno = EINVAL;
-		return NULL;
-	}
-
-	ac--;
-	av++;
-	return (cp->func)(ac, av);
-}
-
-static vchar_t *
-f_reload(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-
-	buf = vmalloc(sizeof(*head));
-	if (buf == NULL)
-		errx(1, "not enough core");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_RELOAD_CONF;
-	head->ac_errno = 0;
-	head->ac_proto = 0;
-
-	return buf;
-}
-
-static vchar_t *
-f_getevt(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-
-	/*
-	 * There are 3 ways of getting here
-	 * 1) racoonctl vc => evt_filter = (EVTF_LOOP|EVTF_CFG| ... )
-	 * 2) racoonctl es => evt_filter = EVTF_NONE
-	 * 3) racoonctl es -l => evt_filter = EVTF_LOOP
-	 * Catch the second case: show-event is here to purge all
-	 */
-	if (evt_filter == EVTF_NONE)
-		evt_filter = (EVTF_ALL|EVTF_PURGE);
-
-	if ((ac >= 1) && (strcmp(av[0], "-l") == 0))
-		evt_filter |= EVTF_LOOP;
-
-	if (ac >= 2)
-		errx(1, "too many arguments");
-
-	buf = vmalloc(sizeof(*head));
-	if (buf == NULL)
-		errx(1, "not enough core");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_SHOW_EVT;
-	head->ac_errno = 0;
-	head->ac_proto = 0;
-
-	return buf;
-}
-
-static vchar_t *
-f_getsched(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-
-	buf = vmalloc(sizeof(*head));
-	if (buf == NULL)
-		errx(1, "not enough core");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_SHOW_SCHED;
-	head->ac_errno = 0;
-	head->ac_proto = 0;
-
-	return buf;
-}
-
-static vchar_t *
-f_getsa(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-	int proto;
-
-	/* need protocol */
-	if (ac != 1)
-		errx(1, "insufficient arguments");
-	proto = get_proto(*av);
-	if (proto == -1)
-		errx(1, "unknown protocol %s", *av);
-
-	buf = vmalloc(sizeof(*head));
-	if (buf == NULL)
-		errx(1, "not enough core");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_SHOW_SA;
-	head->ac_errno = 0;
-	head->ac_proto = proto;
-
-	return buf;
-}
-
-static vchar_t *
-f_flushsa(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-	int proto;
-
-	/* need protocol */
-	if (ac != 1)
-		errx(1, "insufficient arguments");
-	proto = get_proto(*av);
-	if (proto == -1)
-		errx(1, "unknown protocol %s", *av);
-
-	buf = vmalloc(sizeof(*head));
-	if (buf == NULL)
-		errx(1, "not enough core");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_FLUSH_SA;
-	head->ac_errno = 0;
-	head->ac_proto = proto;
-
-	return buf;
-}
-
-static vchar_t *
-f_deletesa(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf, *index;
-	struct admin_com *head;
-	int proto;
-
-	/* need protocol */
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-	proto = get_proto(*av);
-	if (proto == -1)
-		errx(1, "unknown protocol %s", *av);
-
-	/* get index(es) */
-	av++;
-	ac--;
-	switch (proto) {
-	case ADMIN_PROTO_ISAKMP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	case ADMIN_PROTO_AH:
-	case ADMIN_PROTO_ESP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	default:
-		errno = EPROTONOSUPPORT;
-		return NULL;
-	}
-
-	buf = vmalloc(sizeof(*head) + index->l);
-	if (buf == NULL)
-		goto out;
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l + index->l;
-	head->ac_cmd = ADMIN_DELETE_SA;
-	head->ac_errno = 0;
-	head->ac_proto = proto;
-
-	memcpy(buf->v+sizeof(*head), index->v, index->l);
-
-out:
-	if (index != NULL)
-		vfree(index);
-
-	return buf;
-}
-
-static vchar_t *
-f_deleteallsadst(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf, *index;
-	struct admin_com *head;
-	int proto;
-
-	/* need protocol */
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-	proto = get_proto(*av);
-	if (proto == -1)
-		errx(1, "unknown protocol %s", *av);
-
-	/* get index(es) */
-	av++;
-	ac--;
-	switch (proto) {
-	case ADMIN_PROTO_ISAKMP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	case ADMIN_PROTO_AH:
-	case ADMIN_PROTO_ESP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	default:
-		errno = EPROTONOSUPPORT;
-		return NULL;
-	}
-
-	buf = vmalloc(sizeof(*head) + index->l);
-	if (buf == NULL)
-		goto out;
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l + index->l;
-	head->ac_cmd = ADMIN_DELETE_ALL_SA_DST;
-	head->ac_errno = 0;
-	head->ac_proto = proto;
-
-	memcpy(buf->v+sizeof(*head), index->v, index->l);
-
-out:
-	if (index != NULL)
-		vfree(index);
-
-	return buf;
-}
-
-static vchar_t *
-f_exchangesa(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf, *index;
-	struct admin_com *head;
-	int proto;
-	int cmd = ADMIN_ESTABLISH_SA;
-	size_t com_len = 0;
-	char *id = NULL;
-	char *key = NULL;
-	struct admin_com_psk *acp;
-
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-
-	/* Optional -u identity */
-	if (strcmp(av[0], "-u") == 0) {
-		if (ac < 2)
-			errx(1, "-u require an argument");
-
-		id = av[1];
-		if ((key = getpass("Password: ")) == NULL)
-			errx(1, "getpass() failed: %s", strerror(errno));
-		
-		com_len += sizeof(*acp) + strlen(id) + 1 + strlen(key) + 1;
-		cmd = ADMIN_ESTABLISH_SA_PSK;
-
-		av += 2;
-		ac -= 2;
-	}
-
-	/* need protocol */
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-	if ((proto = get_proto(*av)) == -1)
-		errx(1, "unknown protocol %s", *av);
-
-	/* get index(es) */
-	av++;
-	ac--;
-	switch (proto) {
-	case ADMIN_PROTO_ISAKMP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	case ADMIN_PROTO_AH:
-	case ADMIN_PROTO_ESP:
-		index = get_index(ac, av);
-		if (index == NULL)
-			return NULL;
-		break;
-	default:
-		errno = EPROTONOSUPPORT;
-		return NULL;
-	}
-
-	com_len += sizeof(*head) + index->l;
-	if ((buf = vmalloc(com_len)) == NULL)
-		errx(1, "Cannot allocate buffer");
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = cmd;
-	head->ac_errno = 0;
-	head->ac_proto = proto;
-
-	memcpy(buf->v+sizeof(*head), index->v, index->l);
-
-	if (id && key) {
-		char *data;
-		acp = (struct admin_com_psk *)
-		    (buf->v + sizeof(*head) + index->l);
-
-		acp->id_type = IDTYPE_USERFQDN;
-		acp->id_len = strlen(id) + 1;
-		acp->key_len = strlen(key) + 1;
-
-		data = (char *)(acp + 1);
-		strcpy(data, id);
-
-		data = (char *)(data + acp->id_len);
-		strcpy(data, key);
-	}
-
-	vfree(index);
-
-	return buf;
-}
-
-static vchar_t *
-f_vpnc(ac, av)
-	int ac;
-	char **av;
-{
-	char *nav[] = {NULL, NULL, NULL, NULL, NULL, NULL};
-	int nac = 0;
-	char *isakmp = "isakmp";
-	char *inet = "inet";
-	char *srcaddr;
-	struct addrinfo hints, *res;
-	struct sockaddr *src;
-	char *idx;
-
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-
-	evt_filter = (EVTF_LOOP|EVTF_CFG|EVTF_CFG_STOP|EVTF_ERR|EVTF_ERR_STOP);
-	time(&evt_start);
-	
-	/* Optional -u identity */
-	if (strcmp(av[0], "-u") == 0) {
-		if (ac < 2)
-			errx(1, "-u require an argument");
-
-		nav[nac++] = av[0];
-		nav[nac++] = av[1];
-
-		ac -= 2;
-		av += 2;
-	}
-
-	if (ac < 1)
-		errx(1, "VPN gateway required");	
-	if (ac > 1)
-		warnx("Extra arguments");
-
-	/*
-	 * Find the source address
-	 */
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = PF_UNSPEC;
-	hints.ai_socktype = SOCK_DGRAM;
-	if (getaddrinfo(av[0], "4500", &hints, &res) != 0)
-		errx(1, "Cannot resolve destination address");
-
-	if ((src = getlocaladdr(res->ai_addr)) == NULL)
-		errx(1, "cannot find source address");
-
-	if ((srcaddr = saddr2str(src)) == NULL)
-		errx(1, "cannot read source address");
-
-	/* We get "ip[port]" strip the port */
-	if ((idx = index(srcaddr, '[')) == NULL) 
-		errx(1, "unexpected source address format");
-	*idx = '\0';
-
-	nav[nac++] = isakmp;
-	nav[nac++] = inet;
-	nav[nac++] = srcaddr;
-	nav[nac++] = av[0];
-
-	return f_exchangesa(nac, nav);
-}
-
-static vchar_t *
-f_vpnd(ac, av)
-	int ac;
-	char **av;
-{
-	char *nav[] = {NULL, NULL, NULL, NULL};
-	int nac = 0;
-	char *isakmp = "isakmp";
-	char *inet = "inet";
-	char *anyaddr = "0.0.0.0";
-	char *idx;
-
-	if (ac < 1)
-		errx(1, "VPN gateway required");	
-	if (ac > 1)
-		warnx("Extra arguments");
-
-	evt_filter = 
-	    (EVTF_PH1DOWN|EVTF_PH1DOWN_STOP|EVTF_LOOP|EVTF_ERR|EVTF_ERR_STOP);
-
-	nav[nac++] = isakmp;
-	nav[nac++] = inet;
-	nav[nac++] = anyaddr;
-	nav[nac++] = av[0];
-
-	return f_deleteallsadst(nac, nav);
-}
-
-#ifdef ENABLE_HYBRID
-static vchar_t *
-f_logoutusr(ac, av)
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com *head;
-	char *user;
-	size_t userlen;
-
-	/* need username */
-	if (ac < 1)
-		errx(1, "insufficient arguments");
-	user = av[0];
-	userlen = strlen(user);
-	if ((user == NULL) || (userlen > LOGINLEN))
-		errx(1, "bad login (too long?)");
-
-	buf = vmalloc(sizeof(*head) + userlen);
-	if (buf == NULL)
-		return NULL;
-
-	head = (struct admin_com *)buf->v;
-	head->ac_len = buf->l;
-	head->ac_cmd = ADMIN_LOGOUT_USER;
-	head->ac_errno = 0;
-	head->ac_proto = 0;
-
-	strncpy((char *)(head + 1), user, userlen);
-
-	return buf;
-}
-#endif /* ENABLE_HYBRID */
-
-
-static int
-get_proto(str)
-	char *str;
-{
-	struct proto_tag *cp;
-
-	if (str == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	/* checking the string of command. */
-	for (cp = &prototab[0]; cp->str; cp++) {
-		if (strcmp(str, cp->str) == 0)
-			return cp->proto;
-	}
-
-	errno = EINVAL;
-	return -1;
-}
-
-static vchar_t *
-get_index(ac, av)
-	int ac;
-	char **av;
-{
-	int family;
-
-	if (ac != 3 && ac != 4) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	/* checking the string of family */
-	family = get_family(*av);
-	if (family == -1)
-		return NULL;
-	av++;
-	ac--;
-
-	return get_comindexes(family, ac, av);
-}
-
-static int
-get_family(str)
-	char *str;
-{
-	if (strcmp("inet", str) == 0)
-		return AF_INET;
-#ifdef INET6
-	else if (strcmp("inet6", str) == 0)
-		return AF_INET6;
-#endif
-	errno = EAFNOSUPPORT;
-	return -1;
-}
-
-static vchar_t *
-get_comindexes(family, ac, av)
-	int family;
-	int ac;
-	char **av;
-{
-	vchar_t *buf;
-	struct admin_com_indexes *ci;
-	char *p_name = NULL, *p_port = NULL;
-	char *p_prefs = NULL, *p_prefd = NULL;
-	struct sockaddr *src = NULL, *dst = NULL;
-	int ulproto;
-
-	if (ac != 2 && ac != 3) {
-		errno = EINVAL;
-		return NULL;
-	}
-
-	if (get_comindex(*av, &p_name, &p_port, &p_prefs) == -1)
-		goto bad;
-	src = get_sockaddr(family, p_name, p_port);
-	if (p_name) {
-		racoon_free(p_name);
-		p_name = NULL;
-	}
-	if (p_port) {
-		racoon_free(p_port);
-		p_port = NULL;
-	}
-	if (src == NULL)
-		goto bad;
-	av++;
-	ac--;
-	if (get_comindex(*av, &p_name, &p_port, &p_prefd) == -1)
-		goto bad;
-	dst = get_sockaddr(family, p_name, p_port);
-	if (p_name) {
-		racoon_free(p_name);
-		p_name = NULL;
-	}
-	if (p_port) {
-		racoon_free(p_port);
-		p_port = NULL;
-	}
-	if (dst == NULL)
-		goto bad;
-
-	buf = vmalloc(sizeof(*ci));
-	if (buf == NULL)
-		goto bad;
-
-	av++;
-	ac--;
-	if(ac){
-		ulproto = get_ulproto(*av);
-		if (ulproto == -1)
-			goto bad;
-	}else
-		ulproto=0;
-
-	ci = (struct admin_com_indexes *)buf->v;
-	if(p_prefs)
-		ci->prefs = (u_int8_t)atoi(p_prefs); /* XXX should be handled error. */
-	else
-		ci->prefs = 32;
-	if(p_prefd)
-		ci->prefd = (u_int8_t)atoi(p_prefd); /* XXX should be handled error. */
-	else
-		ci->prefd = 32;
-	ci->ul_proto = ulproto;
-	memcpy(&ci->src, src, sysdep_sa_len(src));
-	memcpy(&ci->dst, dst, sysdep_sa_len(dst));
-
-	if (p_name)
-		racoon_free(p_name);
-
-	return buf;
-
-   bad:
-	if (p_name)
-		racoon_free(p_name);
-	if (p_port)
-		racoon_free(p_port);
-	if (p_prefs)
-		racoon_free(p_prefs);
-	if (p_prefd)
-		racoon_free(p_prefd);
-	return NULL;
-}
-
-static int
-get_comindex(str, name, port, pref)
-	char *str, **name, **port, **pref;
-{
-	char *p;
-
-	*name = *port = *pref = NULL;
-
-	*name = racoon_strdup(str);
-	STRDUP_FATAL(*name);
-	p = strpbrk(*name, "/[");
-	if (p != NULL) {
-		if (*(p + 1) == '\0')
-			goto bad;
-		if (*p == '/') {
-			*p = '\0';
-			*pref = racoon_strdup(p + 1);
-			STRDUP_FATAL(*pref);
-			p = strchr(*pref, '[');
-			if (p != NULL) {
-				if (*(p + 1) == '\0')
-					goto bad;
-				*p = '\0';
-				*port = racoon_strdup(p + 1);
-				STRDUP_FATAL(*port);
-				p = strchr(*pref, ']');
-				if (p == NULL)
-					goto bad;
-				*p = '\0';
-			}
-		} else if (*p == '[') {
-			if (*pref == NULL)
-				goto bad;
-			*p = '\0';
-			*port = racoon_strdup(p + 1);
-			STRDUP_FATAL(*port);
-			p = strchr(*pref, ']');
-			if (p == NULL)
-				goto bad;
-			*p = '\0';
-		} else {
-			/* XXX */
-		}
-	}
-
-	return 0;
-
-    bad:
-
-	if (*name)
-		racoon_free(*name);
-	if (*port)
-		racoon_free(*port);
-	if (*pref)
-		racoon_free(*pref);
-	*name = *port = *pref = NULL;
-	return -1;
-}
-
-static int
-get_ulproto(str)
-	char *str;
-{
-	struct ulproto_tag *cp;
-
-	if(str == NULL){
-		errno = EINVAL;
-		return -1;
-	}
-
-	/* checking the string of upper layer protocol. */
-	for (cp = &ulprototab[0]; cp->str; cp++) {
-		if (strcmp(str, cp->str) == 0)
-			return cp->ul_proto;
-	}
-
-	errno = EINVAL;
-	return -1;
-}
-
-/* %%% */
-void
-dump_isakmp_sa(buf, len)
-	char *buf;
-	int len;
-{
-	struct ph1dump *pd;
-	struct tm *tm;
-	char tbuf[56];
-	caddr_t p = NULL;
-
-/* isakmp status header */
-/* short header;
- 1234567890123456789012 0000000000000000:0000000000000000 000000000000
-*/
-char *header1 = 
-"Destination            Cookies                           Created";
-
-/* semi long header;
- 1234567890123456789012 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000
-*/
-char *header2 = 
-"Destination            Cookies                           ST S  V E Created             Phase2";
-
-/* long header;
- 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000000000000000:0000000000000000 00 X 00 X 0000-00-00 00:00:00 000000
-*/
-char *header3 =
-"Source                                        Destination                                   Cookies                           ST S  V E Created             Phase2";
-
-/* phase status header */
-/* short format;
-   side stats source address         destination address   
-   xxx  xxxxx 1234567890123456789012 1234567890123456789012
-*/
-
-	static char *estr[] = { "", "B", "M", "U", "A", "I", };
-
-	switch (long_format) {
-	case 0:
-		printf("%s\n", header1);
-		break;
-	case 1:
-		printf("%s\n", header2);
-		break;
-	case 2:
-	default:
-		printf("%s\n", header3);
-		break;
-	}
-
-	if (len % sizeof(*pd))
-		printf("invalid length %d\n", len);
-	len /= sizeof(*pd);
-
-	pd = (struct ph1dump *)buf;
-
-	while (len-- > 0) {
-		/* source address */
-		if (long_format >= 2) {
-			GETNAMEINFO((struct sockaddr *)&pd->local, _addr1_, _addr2_);
-			switch (long_format) {
-			case 0:
-				break;
-			case 1:
-				p = fixed_addr(_addr1_, _addr2_, 22);
-				break;
-			case 2:
-			default:
-				p = fixed_addr(_addr1_, _addr2_, 45);
-				break;
-			}
-			printf("%s ", p);
-		}
-
-		/* destination address */
-		GETNAMEINFO((struct sockaddr *)&pd->remote, _addr1_, _addr2_);
-		switch (long_format) {
-		case 0:
-		case 1:
-			p = fixed_addr(_addr1_, _addr2_, 22);
-			break;
-		case 2:
-		default:
-			p = fixed_addr(_addr1_, _addr2_, 45);
-			break;
-		}
-		printf("%s ", p);
-
-		printf("%s ", pindex_isakmp(&pd->index));
-
-		/* statuc, side and version */
-		if (long_format >= 1) {
-			printf("%2d %c %2x ",
-				pd->status,
-				pd->side == INITIATOR ? 'I' : 'R',
-				pd->version);
-			if (ARRAYLEN(estr) > pd->etype)
-				printf("%s ", estr[pd->etype]);
-		}
-
-		/* created date */
-		if (pd->created) {
-			tm = localtime(&pd->created);
-			strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm);
-		} else
-			snprintf(tbuf, sizeof(tbuf), "                   ");
-		printf("%s ", tbuf);
-
-		/* counter of phase 2 */
-		if (long_format >= 1)
-			printf("%6d ", pd->ph2cnt);
-
-		printf("\n");
-
-		pd++;
-	}
-
-	return;
-}
-
-/* %%% */
-void
-dump_internal(buf, tlen)
-	char *buf;
-	int tlen;
-{
-	struct ph2handle *iph2;
-	struct sockaddr *addr;
-
-/*
-short header;
- source address         destination address    
- 1234567890123456789012 1234567890123456789012 
-*/
-char *short_h1 = 
-"Source                 Destination            ";
-
-/*
-long header;
- source address                                destination address                           
- 123456789012345678901234567890123456789012345 123456789012345678901234567890123456789012345 
- 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000 0000:0000:0000:0000:0000:0000:0000:0000.00000
-*/
-char *long_h1 = 
-"Source                                        Destination                                  ";
-
-	printf("%s\n", long_format ? long_h1 : short_h1);
-
-	while (tlen > 0) {
-		iph2 = (struct ph2handle *)buf;
-		addr = (struct sockaddr *)(++iph2);
-
-		GETNAMEINFO(addr, _addr1_, _addr2_);
-		printf("%s ", long_format ?
-			  fixed_addr(_addr1_, _addr2_, 45)
-			: fixed_addr(_addr1_, _addr2_, 22));
-		addr++;
-		tlen -= sysdep_sa_len(addr);
-
-		GETNAMEINFO(addr, _addr1_, _addr2_);
-		printf("%s ", long_format ?
-			  fixed_addr(_addr1_, _addr2_, 45)
-			: fixed_addr(_addr1_, _addr2_, 22));
-		addr++;
-		tlen -= sysdep_sa_len(addr);
-
-		printf("\n");
-	}
-
-	return;
-}
-
-/* %%% */
-char *
-pindex_isakmp(index)
-	isakmp_index *index;
-{
-	static char buf[64];
-	u_char *p;
-	int i, j;
-
-	memset(buf, 0, sizeof(buf));
-
-	/* copy index */
-	p = (u_char *)index;
-	for (j = 0, i = 0; i < sizeof(isakmp_index); i++) {
-		snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]);
-		j += 2;
-		switch (i) {
-		case 7:
-#if 0
-		case 15:
-#endif
-			buf[j++] = ':';
-		}
-	}
-
-	return buf;
-}
-
-/* print schedule */
-char *str_sched_stat[] = {
-"off",
-"on",
-"dead",
-};
-
-char *str_sched_id[] = {
-"PH1resend",
-"PH1lifetime",
-"PH2resend",
-"PSTacquire",
-"PSTlifetime",
-};
-
-void
-print_schedule(buf, len)
-	caddr_t buf;
-	int len;
-{
-	struct scheddump *sc = (struct scheddump *)buf;
-	struct tm *tm;
-	char tbuf[56];
-
-	if (len % sizeof(*sc))
-		printf("invalid length %d\n", len);
-	len /= sizeof(*sc);
-
-	/*      00000000 00000000 00000000 xxx........*/
-	printf("index    tick     xtime    created\n");
-
-	while (len-- > 0) {
-		tm = localtime(&sc->created);
-		strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %T", tm);
-
-		printf("%-8ld %-8ld %-8ld %s\n",
-			sc->id,
-			(long)sc->tick,
-			(long)sc->xtime,
-			tbuf);
-		sc++;
-	}
-
-	return;
-}
-
-
-void
-print_evt(buf, len)
-	caddr_t buf;
-	int len;
-{
-	struct evtdump *evtdump = (struct evtdump *)buf;
-	int i;
-	char *srcstr;
-	char *dststr;
-	
-	for (i = 0; evtmsg[i].msg; i++)
-		if (evtmsg[i].type == evtdump->type)
-			break;				
-	
-	if (evtmsg[i].msg == NULL) 
-		printf("Event %d: ", evtdump->type);
-	else
-		printf("%s : ", evtmsg[i].msg);
-
-	if ((srcstr = saddr2str((struct sockaddr *)&evtdump->src)) == NULL)
-		printf("unknown");
-	else 
-		printf("%s", srcstr);
-	printf(" -> ");
-	if ((dststr = saddr2str((struct sockaddr *)&evtdump->dst)) == NULL)
-		printf("unknown");
-	else 
-		printf("%s", dststr);
-	printf("\n");
-
-	return;
-}
-
-void
-print_err(buf, len)
-	caddr_t buf;
-	int len;
-{
-	struct evtdump *evtdump = (struct evtdump *)buf;
-	int i;
-	
-	
-	for (i = 0; evtmsg[i].msg; i++)
-		if (evtmsg[i].type == evtdump->type)
-			break;				
-
-	if (evtmsg[i].level != ERROR)
-		return;
-	
-	if (evtmsg[i].msg == NULL) 
-		printf("Error: Event %d\n", evtdump->type);
-	else
-		printf("Error: %s\n", evtmsg[i].msg);
-
-	if (evt_filter & EVTF_ERR_STOP)
-		evt_filter &= ~EVTF_LOOP;
-
-	return;
-}
-
-/*
- * Print a message when phase 1 SA goes down
- */
-void
-print_ph1down(buf, len)
-	caddr_t buf;
-	int len;
-{
-	struct evtdump *evtdump = (struct evtdump *)buf;
-	
-	if (evtdump->type != EVTT_PHASE1_DOWN)
-		return;
-
-	printf("VPN connexion terminated\n");
-
-	if (evt_filter & EVTF_PH1DOWN_STOP)
-		evt_filter &= ~EVTF_LOOP;
-	
-	return;
-}
-
-/*
- * Print ISAKMP mode config info (IP and banner)
- */
-void
-print_cfg(buf, len)
-	caddr_t buf;
-	int len;
-{
-	struct evtdump *evtdump = (struct evtdump *)buf;
-	struct isakmp_data *attr;
-	char *banner = NULL;
-	struct in_addr addr4;
-	
-	memset(&addr4, 0, sizeof(addr4));
-
-	if (evtdump->type != EVTT_ISAKMP_CFG_DONE && 
-	    evtdump->type != EVTT_NO_ISAKMP_CFG)
-		return;
-
-	len -= sizeof(*evtdump);
-	attr = (struct isakmp_data *)(evtdump + 1);
-
-	while (len > 0) {
-		if (len < sizeof(*attr)) {
-			printf("short attribute too short\n");
-			break;
-		}
-
-		if ((ntohs(attr->type) & ISAKMP_GEN_MASK) == ISAKMP_GEN_TV) {
-			/* Short attribute, skip */
-			len -= sizeof(*attr);
-			attr++;
-		} else { /* Long attribute */
-			char *n;
-
-			if (len < (sizeof(*attr) + ntohs(attr->lorv))) {
-				printf("long attribute too long\n");
-				break;
-			}
-
-			switch (ntohs(attr->type) & ~ISAKMP_GEN_MASK) {
-			case INTERNAL_IP4_ADDRESS:
-				if (ntohs(attr->lorv) < sizeof(addr4)) {
-					printf("addr4 attribute too short\n");
-					break;
-				}
-				memcpy(&addr4, attr + 1, sizeof(addr4));
-				break;
-
-			case UNITY_BANNER:
-				banner = racoon_malloc(ntohs(attr->lorv) + 1);
-				if (banner == NULL) {
-					printf("malloc failed\n");
-					break;
-				}
-				memcpy(banner, attr + 1, ntohs(attr->lorv));
-				banner[ntohs(attr->lorv)] = '\0';
-				break;
-
-			default:
-				break;
-			}
-
-			len -= (sizeof(*attr) + ntohs(attr->lorv));
-			n = (char *)attr;
-			attr = (struct isakmp_data *)
-			    (n + sizeof(*attr) + ntohs(attr->lorv));
-		}
-	}
-	
-	if (evtdump->type == EVTT_ISAKMP_CFG_DONE)
-		printf("Bound to address %s\n", inet_ntoa(addr4));
-	else
-		printf("VPN connexion established\n");
-	
-	if (banner) {
-		struct winsize win;
-		int col = 0;
-		int i;
-
-		if (ioctl(1, TIOCGWINSZ, &win) != 1) 
-			col = win.ws_col;
-			
-		for (i = 0; i < col; i++)
-			printf("%c", '=');
-		printf("\n%s\n", banner);
-		for (i = 0; i < col; i++)
-			printf("%c", '=');
-		printf("\n");
-		racoon_free(banner);
-	}
-	
-	if (evt_filter & EVTF_CFG_STOP)
-		evt_filter &= ~EVTF_LOOP;
-	
-	return;
-}
-	
-
-char *
-fixed_addr(addr, port, len)
-	char *addr, *port;
-	int len;
-{
-	static char _addr_buf_[BUFSIZ];
-	char *p;
-	int plen, i;
-
-	/* initialize */
-	memset(_addr_buf_, ' ', sizeof(_addr_buf_));
-
-	plen = strlen(port);
-	if (len < plen + 1)
-		return NULL;
-
-	p = _addr_buf_;
-	for (i = 0; i < len - plen - 1 && addr[i] != '\0'; /*noting*/)
-		*p++ = addr[i++];
-	*p++ = '.';
-
-	for (i = 0; i < plen && port[i] != '\0'; /*noting*/)
-		*p++ = port[i++];
-
-	_addr_buf_[len] = '\0';
-
-	return _addr_buf_;
-}
-
-static int
-handle_recv(combuf)
-	vchar_t *combuf;
-{
-        struct admin_com h, *com;
-        caddr_t buf;
-        int len;
-
-	com = (struct admin_com *)combuf->v;
-	len = com->ac_len - sizeof(*com);
-	buf = combuf->v + sizeof(*com);
-
-	switch (com->ac_cmd) {
-	case ADMIN_SHOW_SCHED:
-		print_schedule(buf, len);
-		break;
-
-	case ADMIN_SHOW_EVT: {
-		struct evtdump *evtdump;
-
-		/* We got no event */
-		if (len == 0) {
-			/* If we were purging the queue, it is now done */
-			if (evt_filter & EVTF_PURGE)
-				evt_filter &= ~EVTF_PURGE;
-			break;
-		}
-
-		if (len < sizeof(struct evtdump))
-			errx(1, "Short buffer\n");		
-
-		/* Toss outdated events */
-		evtdump = (struct evtdump *)buf;
-		if (evtdump->timestamp < evt_start)
-			break;
-
-		if (evt_filter & EVTF_ALL)
-			print_evt(buf, len);
-		if (evt_filter & EVTF_ERR)
-			print_err(buf, len);
-		if (evt_filter & EVTF_CFG)
-			print_cfg(buf, len);
-		if (evt_filter & EVTF_PH1DOWN)
-			print_ph1down(buf, len);
-		break;
-	}
-
-	case ADMIN_SHOW_SA:
-	   {
-		switch (com->ac_proto) {
-		case ADMIN_PROTO_ISAKMP:
-			dump_isakmp_sa(buf, len);
-			break;
-		case ADMIN_PROTO_IPSEC:
-		case ADMIN_PROTO_AH:
-		case ADMIN_PROTO_ESP:
-		    {
-			struct sadb_msg *msg = (struct sadb_msg *)buf;
-
-			switch (msg->sadb_msg_errno) {
-			case ENOENT:
-				switch (msg->sadb_msg_type) {
-				case SADB_DELETE:
-				case SADB_GET:
-					printf("No entry.\n");
-					break;
-				case SADB_DUMP:
-					printf("No SAD entries.\n");
-					break;
-				}
-				break;
-			case 0:
-				while (1) {
-					pfkey_sadump(msg);
-					if (msg->sadb_msg_seq == 0)
-						break;
-					msg = (struct sadb_msg *)((caddr_t)msg +
-						     PFKEY_UNUNIT64(msg->sadb_msg_len));
-				}
-				break;
-			default:
-				printf("%s.\n", strerror(msg->sadb_msg_errno));
-			}
-		    }
-			break;
-		case ADMIN_PROTO_INTERNAL:
-			dump_internal(buf, len);
-			break;
-		default:
-			printf("Invalid proto [%d]\n", com->ac_proto);
-		}
-
-	    }
-		break;
-
-	default:
-		/* IGNORE */
-		break;
-	}
-
-	close(so);
-	return 0;
-
-    bad:
-	close(so);
-	return -1;
-}
diff --git a/src/racoon/racoonctl.h b/src/racoon/racoonctl.h
deleted file mode 100644
index d507213..0000000
--- a/src/racoon/racoonctl.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*	$NetBSD: racoonctl.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: racoonctl.h,v 1.3 2005/06/19 22:37:47 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _RACOONCTL_H
-#define _RACOONCTL_H
-
-/* bumped on any change to the interface */
-#define RACOONCTL_INTERFACE	20050619
-extern u_int32_t racoonctl_interface;
-
-/* bumped when introducing changes that break backward compatibility */
-#define RACOONCTL_INTERFACE_MAJOR	1	
-extern u_int32_t racoonctl_interface_major;
-
-extern u_int32_t loglevel;
-
-int com_init(void);
-int com_send(vchar_t *);
-int com_recv(vchar_t **);
-struct sockaddr *get_sockaddr(int, char *, char *);
-
-#endif /* _RACOONCTL_H */
-
diff --git a/src/racoon/remoteconf.c b/src/racoon/remoteconf.c
deleted file mode 100644
index 3b96f30..0000000
--- a/src/racoon/remoteconf.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/*	$NetBSD: remoteconf.c,v 1.9.4.2 2008/06/18 07:30:19 mgrooms Exp $	*/
-
-/* Id: remoteconf.c,v 1.38 2006/05/06 15:52:44 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "genlist.h"
-#include "debug.h"
-
-#include "isakmp_var.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#endif
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "remoteconf.h"
-#include "localconf.h"
-#include "grabmyaddr.h"
-#include "policy.h"
-#include "proposal.h"
-#include "vendorid.h"
-#include "gcmalloc.h"
-#include "strnames.h"
-#include "algorithm.h"
-#include "nattraversal.h"
-#include "isakmp_frag.h"
-#include "genlist.h"
-
-static TAILQ_HEAD(_rmtree, remoteconf) rmtree, rmtree_save, rmtree_tmp;
-
-/* 
- * Script hook names and script hook paths
- */
-char *script_names[SCRIPT_MAX + 1] = { "phase1_up", "phase1_down" };
-
-/*%%%*/
-/*
- * search remote configuration.
- * don't use port number to search if its value is either IPSEC_PORT_ANY.
- * If matching anonymous entry, then new entry is copied from anonymous entry.
- * If no anonymous entry found, then return NULL.
- * OUT:	NULL:	NG
- *	Other:	remote configuration entry.
- */
-struct remoteconf *
-getrmconf_strict(remote, allow_anon)
-	struct sockaddr *remote;
-	int allow_anon;
-{
-	struct remoteconf *p;
-	struct remoteconf *anon = NULL;
-	int withport;
-	char buf[NI_MAXHOST + NI_MAXSERV + 10];
-	char addr[NI_MAXHOST], port[NI_MAXSERV];
-
-	withport = 0;
-
-#ifndef ENABLE_NATT
-	/* 
-	 * We never have ports set in our remote configurations, but when
-	 * NAT-T is enabled, the kernel can have policies with ports and
-	 * send us an acquire message for a destination that has a port set.
-	 * If we do this port check here, we don't find the remote config.
-	 *
-	 * In an ideal world, we would be able to have remote conf with
-	 * port, and the port could be a wildcard. That test could be used.
-	 */
-	if (remote->sa_family != AF_UNSPEC &&
-	    extract_port(remote) != IPSEC_PORT_ANY)
-		withport = 1;
-#endif /* ENABLE_NATT */
-
-	if (remote->sa_family == AF_UNSPEC)
-		snprintf (buf, sizeof(buf), "%s", "anonymous");
-	else {
-		GETNAMEINFO(remote, addr, port);
-		snprintf(buf, sizeof(buf), "%s%s%s%s", addr,
-			withport ? "[" : "",
-			withport ? port : "",
-			withport ? "]" : "");
-	}
-
-	TAILQ_FOREACH(p, &rmtree, chain) {
-		if ((remote->sa_family == AF_UNSPEC
-		     && remote->sa_family == p->remote->sa_family)
-		 || (!withport && cmpsaddrwop(remote, p->remote) == 0)
-		 || (withport && cmpsaddrstrict(remote, p->remote) == 0)) {
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"configuration found for %s.\n", buf);
-			return p;
-		}
-
-		/* save the pointer to the anonymous configuration */
-		if (p->remote->sa_family == AF_UNSPEC)
-			anon = p;
-	}
-
-	if (allow_anon && anon != NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"anonymous configuration selected for %s.\n", buf);
-		return anon;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"no remote configuration found.\n");
-
-	return NULL;
-}
-
-struct remoteconf *
-getrmconf(remote)
-	struct sockaddr *remote;
-{
-	return getrmconf_strict(remote, 1);
-}
-
-struct remoteconf *
-newrmconf()
-{
-	struct remoteconf *new;
-	int i;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	new->proposal = NULL;
-
-	/* set default */
-	new->doitype = IPSEC_DOI;
-	new->sittype = IPSECDOI_SIT_IDENTITY_ONLY;
-	new->idvtype = IDTYPE_UNDEFINED;
-	new->idvl_p = genlist_init();
-	new->nonce_size = DEFAULT_NONCE_SIZE;
-	new->passive = FALSE;
-	new->ike_frag = FALSE;
-	new->esp_frag = IP_MAXPACKET;
-	new->ini_contact = TRUE;
-	new->mode_cfg = FALSE;
-	new->pcheck_level = PROP_CHECK_STRICT;
-	new->verify_identifier = FALSE;
-	new->verify_cert = TRUE;
-	new->getcert_method = ISAKMP_GETCERT_PAYLOAD;
-	new->getcacert_method = ISAKMP_GETCERT_LOCALFILE;
-	new->cacerttype = ISAKMP_CERT_X509SIGN;
-	new->certtype = ISAKMP_CERT_NONE;
-	new->cacertfile = NULL;
-	new->send_cert = TRUE;
-	new->send_cr = TRUE;
-	new->support_proxy = FALSE;
-	for (i = 0; i <= SCRIPT_MAX; i++)
-		new->script[i] = NULL;
-	new->gen_policy = FALSE;
-	new->retry_counter = lcconf->retry_counter;
-	new->retry_interval = lcconf->retry_interval;
-	new->nat_traversal = FALSE;
-	new->rsa_private = genlist_init();
-	new->rsa_public = genlist_init();
-	new->idv = NULL;
-	new->key = NULL;
-
-	new->dpd = TRUE; /* Enable DPD support by default */
-	new->dpd_interval = 0; /* Disable DPD checks by default */
-	new->dpd_retry = 5;
-	new->dpd_maxfails = 5;
-
-	new->weak_phase1_check = 0;
-
-#ifdef ENABLE_HYBRID
-	new->xauth = NULL;
-#endif
-
-	return new;
-}
-
-struct remoteconf *
-copyrmconf(remote)
-	struct sockaddr *remote;
-{
-	struct remoteconf *new, *old;
-
-	old = getrmconf_strict (remote, 0);
-	if (old == NULL) {
-		plog (LLV_ERROR, LOCATION, NULL,
-		      "Remote configuration for '%s' not found!\n",
-		      saddr2str (remote));
-		return NULL;
-	}
-
-	new = duprmconf (old);
-
-	return new;
-}
-
-void *
-dupidvl(entry, arg)
-	void *entry;
-	void *arg;
-{
-	struct idspec *id;
-	struct idspec *old = (struct idspec *) entry;
-	id = newidspec();
-	if (!id) return (void *) -1;
-
-	if (set_identifier(&id->id, old->idtype, old->id) != 0) {
-		racoon_free(id);
-		return (void *) -1;
-	}
-
-	id->idtype = old->idtype;
-
-	genlist_append(arg, id);
-	return NULL;
-}
-
-struct remoteconf *
-duprmconf (rmconf)
-	struct remoteconf *rmconf;
-{
-	struct remoteconf *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-	memcpy (new, rmconf, sizeof (*new));
-	// FIXME: We should duplicate the proposal as well.
-	// This is now handled in the cfparse.y
-	// new->proposal = ...;
-	
-	/* duplicate dynamic structures */
-	if (new->etypes)
-		new->etypes=dupetypes(new->etypes);
-	new->idvl_p = genlist_init();
-	genlist_foreach(rmconf->idvl_p, dupidvl, new->idvl_p);
-
-	return new;
-}
-
-static void
-idspec_free(void *data)
-{
-	vfree (((struct idspec *)data)->id);
-	free (data);
-}
-
-void
-delrmconf(rmconf)
-	struct remoteconf *rmconf;
-{
-#ifdef ENABLE_HYBRID
-	if (rmconf->xauth)
-		xauth_rmconf_delete(&rmconf->xauth);
-#endif
-	if (rmconf->etypes){
-		deletypes(rmconf->etypes);
-		rmconf->etypes=NULL;
-	}
-	if (rmconf->idvl_p)
-		genlist_free(rmconf->idvl_p, idspec_free);
-	if (rmconf->dhgrp)
-		oakley_dhgrp_free(rmconf->dhgrp);
-	if (rmconf->proposal)
-		delisakmpsa(rmconf->proposal);
-	racoon_free(rmconf);
-}
-
-void
-delisakmpsa(sa)
-	struct isakmpsa *sa;
-{
-	if (sa->dhgrp)
-		oakley_dhgrp_free(sa->dhgrp);
-	if (sa->next)
-		delisakmpsa(sa->next);
-#ifdef HAVE_GSSAPI
-	if (sa->gssid)
-		vfree(sa->gssid);
-#endif
-	racoon_free(sa);
-}
-
-struct etypes *
-dupetypes(orig)
-	struct etypes *orig;
-{
-	struct etypes *new;
-
-	if (!orig) 
-		return NULL;
-
-	new = racoon_malloc(sizeof(struct etypes));
-	if (new == NULL) 
-		return NULL;
-
-	new->type = orig->type;
-	new->next = NULL;
-
-	if (orig->next)
-		new->next=dupetypes(orig->next);
-
-	return new;
-}
-
-void
-deletypes(e)
-	struct etypes *e;
-{
-	if (e->next)
-		deletypes(e->next);
-	racoon_free(e);
-}
-
-/*
- * insert into head of list.
- */
-void
-insrmconf(new)
-	struct remoteconf *new;
-{
-	TAILQ_INSERT_HEAD(&rmtree, new, chain);
-}
-
-void
-remrmconf(rmconf)
-	struct remoteconf *rmconf;
-{
-	TAILQ_REMOVE(&rmtree, rmconf, chain);
-}
-
-void
-flushrmconf()
-{
-	struct remoteconf *p, *next;
-
-	for (p = TAILQ_FIRST(&rmtree); p; p = next) {
-		next = TAILQ_NEXT(p, chain);
-		remrmconf(p);
-		delrmconf(p);
-	}
-}
-
-void
-initrmconf()
-{
-	TAILQ_INIT(&rmtree);
-}
-
-void
-save_rmconf()
-{
-	rmtree_save=rmtree;
-	initrmconf();
-}
-
-void
-save_rmconf_flush()
-{
-	rmtree_tmp=rmtree;
-	rmtree=rmtree_save;
-	flushrmconf();
-	initrmconf();
-	rmtree=rmtree_tmp;
-}
-
-
-
-/* check exchange type to be acceptable */
-struct etypes *
-check_etypeok( struct remoteconf *rmconf, u_int8_t etype)
-{
-	struct etypes *e;
-
-	for (e = rmconf->etypes; e != NULL; e = e->next) {
-		if (e->type == etype)
-			break;
-	}
-
-	return e;
-}
-
-/*%%%*/
-struct isakmpsa *
-newisakmpsa()
-{
-	struct isakmpsa *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	/*
-	 * Just for sanity, make sure this is initialized.  This is
-	 * filled in for real when the ISAKMP proposal is configured.
-	 */
-	new->vendorid = VENDORID_UNKNOWN;
-
-	new->next = NULL;
-	new->rmconf = NULL;
-#ifdef HAVE_GSSAPI
-	new->gssid = NULL;
-#endif
-
-	return new;
-}
-
-/*
- * insert into tail of list.
- */
-void
-insisakmpsa(new, rmconf)
-	struct isakmpsa *new;
-	struct remoteconf *rmconf;
-{
-	struct isakmpsa *p;
-
-	new->rmconf = rmconf;
-
-	if (rmconf->proposal == NULL) {
-		rmconf->proposal = new;
-		return;
-	}
-
-	for (p = rmconf->proposal; p->next != NULL; p = p->next)
-		;
-	p->next = new;
-
-	return;
-}
-
-struct remoteconf *
-foreachrmconf(rmconf_func_t rmconf_func, void *data)
-{
-  struct remoteconf *p, *ret = NULL;
-  RACOON_TAILQ_FOREACH_REVERSE(p, &rmtree, _rmtree, chain) {
-    ret = (*rmconf_func)(p, data);
-    if (ret)
-      break;
-  }
-
-  return ret;
-}
-
-static void *
-dump_peers_identifiers (void *entry, void *arg)
-{
-	struct idspec *id = (struct idspec*) entry;
-	char buf[1024], *pbuf;
-	pbuf = buf;
-	pbuf += sprintf (pbuf, "\tpeers_identifier %s",
-			 s_idtype (id->idtype));
-	if (id->id)
-		pbuf += sprintf (pbuf, " \"%s\"", id->id->v);
-	plog(LLV_INFO, LOCATION, NULL, "%s;\n", buf);
-	return NULL;
-}
-
-static struct remoteconf *
-dump_rmconf_single (struct remoteconf *p, void *data)
-{
-	struct etypes *etype = p->etypes;
-	struct isakmpsa *prop = p->proposal;
-	char buf[1024], *pbuf;
-
-	pbuf = buf;
-	pbuf += sprintf(pbuf, "remote %s", saddr2str(p->remote));
-	if (p->inherited_from)
-		pbuf += sprintf(pbuf, " inherit %s",
-				saddr2str(p->inherited_from->remote));
-	plog(LLV_INFO, LOCATION, NULL, "%s {\n", buf);
-	pbuf = buf;
-	pbuf += sprintf(pbuf, "\texchange_type ");
-	while (etype) {
-		pbuf += sprintf (pbuf, "%s%s", s_etype(etype->type),
-				 etype->next != NULL ? ", " : ";\n");
-		etype = etype->next;
-	}
-	plog(LLV_INFO, LOCATION, NULL, "%s", buf);
-	plog(LLV_INFO, LOCATION, NULL, "\tdoi %s;\n", s_doi(p->doitype));
-	pbuf = buf;
-	pbuf += sprintf(pbuf, "\tmy_identifier %s", s_idtype (p->idvtype));
-	if (p->idvtype == IDTYPE_ASN1DN) {
-		plog(LLV_INFO, LOCATION, NULL, "%s;\n", buf);
-		plog(LLV_INFO, LOCATION, NULL, "\tcertificate_type %s \"%s\" \"%s\";\n",
-			p->certtype == ISAKMP_CERT_X509SIGN ? "x509" : "*UNKNOWN*",
-			p->mycertfile, p->myprivfile);
-		switch (p->getcert_method) {
-		  case 0:
-		  	break;
-		  case ISAKMP_GETCERT_PAYLOAD:
-			plog(LLV_INFO, LOCATION, NULL, "\t/* peers certificate from payload */\n");
-			break;
-		  case ISAKMP_GETCERT_LOCALFILE:
-			plog(LLV_INFO, LOCATION, NULL, "\tpeers_certfile \"%s\";\n", p->peerscertfile);
-			break;
-		  case ISAKMP_GETCERT_DNS:
-			plog(LLV_INFO, LOCATION, NULL, "\tpeer_certfile dnssec;\n");
-			break;
-		  default:
-			plog(LLV_INFO, LOCATION, NULL, "\tpeers_certfile *UNKNOWN* (%d)\n", p->getcert_method);
-		}
-	}
-	else {
-		if (p->idv)
-			pbuf += sprintf (pbuf, " \"%s\"", p->idv->v);
-		plog(LLV_INFO, LOCATION, NULL, "%s;\n", buf);
-		genlist_foreach(p->idvl_p, &dump_peers_identifiers, NULL);
-	}
-
-	plog(LLV_INFO, LOCATION, NULL, "\tsend_cert %s;\n",
-		s_switch (p->send_cert));
-	plog(LLV_INFO, LOCATION, NULL, "\tsend_cr %s;\n",
-		s_switch (p->send_cr));
-	plog(LLV_INFO, LOCATION, NULL, "\tverify_cert %s;\n",
-		s_switch (p->verify_cert));
-	plog(LLV_INFO, LOCATION, NULL, "\tverify_identifier %s;\n",
-		s_switch (p->verify_identifier));
-	plog(LLV_INFO, LOCATION, NULL, "\tnat_traversal %s;\n",
-		p->nat_traversal == NATT_FORCE ?
-			"force" : s_switch (p->nat_traversal));
-	plog(LLV_INFO, LOCATION, NULL, "\tnonce_size %d;\n",
-		p->nonce_size);
-	plog(LLV_INFO, LOCATION, NULL, "\tpassive %s;\n",
-		s_switch (p->passive));
-	plog(LLV_INFO, LOCATION, NULL, "\tike_frag %s;\n",
-		p->ike_frag == ISAKMP_FRAG_FORCE ?
-			"force" : s_switch (p->ike_frag));
-	plog(LLV_INFO, LOCATION, NULL, "\tesp_frag %d;\n", p->esp_frag);
-	plog(LLV_INFO, LOCATION, NULL, "\tinitial_contact %s;\n",
-		s_switch (p->ini_contact));
-	plog(LLV_INFO, LOCATION, NULL, "\tgenerate_policy %s;\n",
-		s_switch (p->gen_policy));
-	plog(LLV_INFO, LOCATION, NULL, "\tsupport_proxy %s;\n",
-		s_switch (p->support_proxy));
-
-	while (prop) {
-		plog(LLV_INFO, LOCATION, NULL, "\n");
-		plog(LLV_INFO, LOCATION, NULL,
-			"\t/* prop_no=%d, trns_no=%d, rmconf=%s */\n",
-			prop->prop_no, prop->trns_no,
-			saddr2str(prop->rmconf->remote));
-		plog(LLV_INFO, LOCATION, NULL, "\tproposal {\n");
-		plog(LLV_INFO, LOCATION, NULL, "\t\tlifetime time %lu sec;\n",
-			(long)prop->lifetime);
-		plog(LLV_INFO, LOCATION, NULL, "\t\tlifetime bytes %zd;\n",
-			prop->lifebyte);
-		plog(LLV_INFO, LOCATION, NULL, "\t\tdh_group %s;\n",
-			alg_oakley_dhdef_name(prop->dh_group));
-		plog(LLV_INFO, LOCATION, NULL, "\t\tencryption_algorithm %s;\n", 
-			alg_oakley_encdef_name(prop->enctype));
-		plog(LLV_INFO, LOCATION, NULL, "\t\thash_algorithm %s;\n", 
-			alg_oakley_hashdef_name(prop->hashtype));
-		plog(LLV_INFO, LOCATION, NULL, "\t\tauthentication_method %s;\n", 
-			alg_oakley_authdef_name(prop->authmethod));
-		plog(LLV_INFO, LOCATION, NULL, "\t}\n");
-		prop = prop->next;
-	}
-	plog(LLV_INFO, LOCATION, NULL, "}\n");
-	plog(LLV_INFO, LOCATION, NULL, "\n");
-
-	return NULL;
-}
-
-void
-dumprmconf()
-{
-	foreachrmconf (dump_rmconf_single, NULL);
-}
-
-struct idspec *
-newidspec()
-{
-	struct idspec *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-	new->idtype = IDTYPE_ADDRESS;
-
-	return new;
-}
-
-vchar_t *
-script_path_add(path)
-	vchar_t *path;
-{
-	char *script_dir;
-	vchar_t *new_path;
-	vchar_t *new_storage;
-	vchar_t **sp;
-	size_t len;
-	size_t size;
-
-	script_dir = lcconf->pathinfo[LC_PATHTYPE_SCRIPT];
-
-	/* Try to find the script in the script directory */
-	if ((path->v[0] != '/') && (script_dir != NULL)) {
-		len = strlen(script_dir) + sizeof("/") + path->l + 1;
-
-		if ((new_path = vmalloc(len)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "Cannot allocate memory: %s\n", strerror(errno));
-			return NULL;
-		}
-
-		new_path->v[0] = '\0';
-		(void)strlcat(new_path->v, script_dir, len);
-		(void)strlcat(new_path->v, "/", len);
-		(void)strlcat(new_path->v, path->v, len);
-
-		vfree(path);
-		path = new_path;
-	}
-
-	return path;
-}
-
-
-struct isakmpsa *
-dupisakmpsa(struct isakmpsa *sa)
-{
-	struct isakmpsa *res=NULL;
-
-	if(sa == NULL)
-		return NULL;
-
-	res=newisakmpsa();
-	if(res == NULL)
-		return NULL;
-
-	*res=*sa;
-#ifdef HAVE_GSSAPI
-	/* XXX gssid
-	 */
-#endif
-	res->next=NULL;
-
-	if(sa->dhgrp != NULL)
-		oakley_setdhgroup (sa->dh_group, &(res->dhgrp));
-
-	return res;
-
-}
diff --git a/src/racoon/remoteconf.h b/src/racoon/remoteconf.h
deleted file mode 100644
index ca5945e..0000000
--- a/src/racoon/remoteconf.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*	$NetBSD: remoteconf.h,v 1.7 2006/10/03 08:01:56 vanhu Exp $	*/
-
-/* Id: remoteconf.h,v 1.26 2006/05/06 15:52:44 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _REMOTECONF_H
-#define _REMOTECONF_H
-
-/* remote configuration */
-
-#include <sys/queue.h>
-#include "genlist.h"
-#ifdef ENABLE_HYBRID
-#include "isakmp_var.h"
-#include "isakmp_xauth.h"
-#endif
-
-struct proposalspec;
-
-struct etypes {
-	int type;
-	struct etypes *next;
-};
-
-/* Script hooks */
-#define SCRIPT_PHASE1_UP	0
-#define SCRIPT_PHASE1_DOWN	1
-#define SCRIPT_MAX		1
-extern char *script_names[SCRIPT_MAX + 1];
-
-struct remoteconf {
-	struct sockaddr *remote;	/* remote IP address */
-					/* if family is AF_UNSPEC, that is
-					 * for anonymous configuration. */
-
-	struct etypes *etypes;		/* exchange type list. the head
-					 * is a type to be sent first. */
-	int doitype;			/* doi type */
-	int sittype;			/* situation type */
-
-	int idvtype;			/* my identifier type */
-	vchar_t *idv;			/* my identifier */
-	vchar_t *key;			/* my pre-shared key */
-	struct genlist *idvl_p;         /* peer's identifiers list */
-
-	int certtype;			/* certificate type if need */
-	char *mycertfile;		/* file name of my certificate */
-	char *myprivfile;		/* file name of my private key file */
-	char *peerscertfile;		/* file name of peer's certifcate */
-	int getcert_method;		/* the way to get peer's certificate */
-	int cacerttype;			/* CA type is needed */
-	char *cacertfile;		/* file name of CA */
-	int getcacert_method;		/* the way to get the CA */
-	int send_cert;			/* send to CERT or not */
-	int send_cr;			/* send to CR or not */
-	int verify_cert;		/* verify a CERT strictly */
-	int verify_identifier;		/* vefify the peer's identifier */
-	int nonce_size;			/* the number of bytes of nonce */
-	int passive;			/* never initiate */
-	int ike_frag;			/* IKE fragmentation */
-	int esp_frag;			/* ESP fragmentation */
-	int mode_cfg;			/* Gets config through mode config */
-	int support_proxy;		/* support mip6/proxy */
-#define GENERATE_POLICY_NONE   0
-#define GENERATE_POLICY_REQUIRE        1
-#define GENERATE_POLICY_UNIQUE 2
-	int gen_policy;			/* generate policy if no policy found */
-	int ini_contact;		/* initial contact */
-	int pcheck_level;		/* level of propocl checking */
-	int nat_traversal;		/* NAT-Traversal */
-	vchar_t *script[SCRIPT_MAX + 1];/* script hooks paths */
-	int dh_group;			/* use it when only aggressive mode */
-	struct dhgroup *dhgrp;		/* use it when only aggressive mode */
-					/* above two can't be defined by user*/
-
-	int retry_counter;		/* times to retry. */
-	int retry_interval;		/* interval each retry. */
-				/* above 2 values are copied from localconf. */
-
-	int dpd;				/* Negociate DPD support ? */
-	int dpd_retry;			/* in seconds */
-	int dpd_interval;		/* in seconds */
-	int dpd_maxfails; 
-
-	int ph1id; /* ph1id to be matched with sainfo sections */
-
-	int weak_phase1_check;		/* act on unencrypted deletions ? */
-
-	struct isakmpsa *proposal;	/* proposal list */
-	struct remoteconf *inherited_from;	/* the original rmconf 
-						   from which this one 
-						   was inherited */
-	struct proposalspec *prhead;
-
-	struct genlist	*rsa_private,	/* lists of PlainRSA keys to use */
-			*rsa_public;
-
-#ifdef ENABLE_HYBRID
-	struct xauth_rmconf *xauth;
-#endif
-
-	TAILQ_ENTRY(remoteconf) chain;	/* next remote conf */
-};
-
-struct dhgroup;
-
-/* ISAKMP SA specification */
-struct isakmpsa {
-	int prop_no;
-	int trns_no;
-	time_t lifetime;
-	size_t lifebyte;
-	int enctype;
-	int encklen;
-	int authmethod;
-	int hashtype;
-	int vendorid;
-#ifdef HAVE_GSSAPI
-	vchar_t *gssid;
-#endif
-	int dh_group;			/* don't use it if aggressive mode */
-	struct dhgroup *dhgrp;		/* don't use it if aggressive mode */
-
-	struct isakmpsa *next;		/* next transform */
-	struct remoteconf *rmconf;	/* backpointer to remoteconf */
-};
-
-struct idspec {
-	int idtype;                     /* identifier type */
-	vchar_t *id;                    /* identifier */
-};
-
-typedef struct remoteconf * (rmconf_func_t)(struct remoteconf *rmconf, void *data);
-
-extern struct remoteconf *getrmconf __P((struct sockaddr *));
-extern struct remoteconf *getrmconf_strict
-	__P((struct sockaddr *remote, int allow_anon));
-extern struct remoteconf *copyrmconf __P((struct sockaddr *));
-extern struct remoteconf *newrmconf __P((void));
-extern struct remoteconf *duprmconf __P((struct remoteconf *));
-extern void delrmconf __P((struct remoteconf *));
-extern void delisakmpsa __P((struct isakmpsa *));
-extern void deletypes __P((struct etypes *));
-extern struct etypes * dupetypes __P((struct etypes *));
-extern void insrmconf __P((struct remoteconf *));
-extern void remrmconf __P((struct remoteconf *));
-extern void flushrmconf __P((void));
-extern void initrmconf __P((void));
-extern void save_rmconf __P((void));
-extern void save_rmconf_flush __P((void));
-
-extern struct etypes *check_etypeok
-	__P((struct remoteconf *, u_int8_t));
-extern struct remoteconf *foreachrmconf __P((rmconf_func_t rmconf_func,
-					     void *data));
-
-extern struct isakmpsa *newisakmpsa __P((void));
-extern struct isakmpsa *dupisakmpsa __P((struct isakmpsa *));
-
-extern void insisakmpsa __P((struct isakmpsa *, struct remoteconf *));
-
-extern void dumprmconf __P((void));
-
-extern struct idspec *newidspec __P((void));
-
-extern vchar_t *script_path_add __P((vchar_t *));
-
-#endif /* _REMOTECONF_H */
diff --git a/src/racoon/rsalist.c b/src/racoon/rsalist.c
deleted file mode 100644
index 850aa4c..0000000
--- a/src/racoon/rsalist.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/*	$NetBSD: rsalist.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: rsalist.c,v 1.3 2004/11/08 12:04:23 ludvigm Exp */
-
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include <sys/types.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-#include <netdb.h>
-
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-
-#include "misc.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "rsalist.h"
-#include "genlist.h"
-#include "remoteconf.h"
-#include "crypto_openssl.h"
-
-#ifndef LIST_FIRST
-#define LIST_FIRST(head)        ((head)->lh_first)
-#endif
-
-#ifndef LIST_NEXT
-#define LIST_NEXT(elm, field)   ((elm)->field.le_next)
-#endif
-
-/* from prsa_tok.l */
-int prsa_parse_file(struct genlist *list, const char *fname, enum rsa_key_type type);
-
-int
-rsa_key_insert(struct genlist *list, struct netaddr *src,
-	       struct netaddr *dst, RSA *rsa)
-{
-	struct rsa_key *rsa_key;
-
-	rsa_key = calloc(sizeof(struct rsa_key), 1);
-	rsa_key->rsa = rsa;
-
-	if (src)
-		rsa_key->src = src;
-	else
-		rsa_key->src = calloc(sizeof(*rsa_key->src), 1);
-
-	if (dst)
-		rsa_key->dst = dst;
-	else
-		rsa_key->dst = calloc(sizeof(*rsa_key->dst), 1);
-
-	genlist_append(list, rsa_key);
-
-	return 0;
-}
-
-static void *
-rsa_key_dump_one(void *entry, void *arg)
-{
-	struct rsa_key *key = entry;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "Entry %s\n",
-	     naddrwop2str_fromto("%s -> %s", key->src,
-				 key->dst));
-	if (loglevel > LLV_DEBUG)
-		RSA_print_fp(stdout, key->rsa, 4);
-
-	return NULL;
-}
-
-void
-rsa_key_dump(struct genlist *list)
-{
-	genlist_foreach(list, rsa_key_dump_one, NULL);
-}
-
-static void *
-rsa_list_count_one(void *entry, void *arg)
-{
-	if (arg)
-		(*(unsigned long *)arg)++;
-	return NULL;
-}
-
-unsigned long
-rsa_list_count(struct genlist *list)
-{
-	unsigned long count = 0;
-	genlist_foreach(list, rsa_list_count_one, &count);
-	return count;
-}
-
-struct lookup_result {
-	struct ph1handle *iph1;
-	int max_score;
-	struct genlist *winners;
-};
-	
-static void *
-rsa_lookup_key_one(void *entry, void *data)
-{
-	int local_score, remote_score;
-	struct lookup_result *req = data;
-	struct rsa_key *key = entry;
-
-	local_score = naddr_score(key->src, req->iph1->local);
-	remote_score = naddr_score(key->dst, req->iph1->remote);
-
-	plog(LLV_DEBUG, LOCATION, NULL, "Entry %s scored %d/%d\n",
-		naddrwop2str_fromto("%s -> %s", key->src, key->dst),
-		local_score, remote_score);
-
-	if (local_score >= 0 && remote_score >= 0) {
-		if (local_score + remote_score > req->max_score) {
-			req->max_score = local_score + remote_score;
-//			genlist_free(req->winners, NULL);
-		}
-
-		if (local_score + remote_score >= req->max_score) {
-			genlist_append(req->winners, key);
-		}
-	}
-
-	/* Always traverse the whole list */
-	return NULL;
-}
-
-struct genlist *
-rsa_lookup_keys(struct ph1handle *iph1, int my)
-{
-	struct genlist *list;
-	struct lookup_result r;
-
-	plog(LLV_DEBUG, LOCATION, NULL, "Looking up RSA key for %s\n",
-	     saddr2str_fromto("%s <-> %s", iph1->local, iph1->remote));
-
-	r.iph1 = iph1;
-	r.max_score = -1;
-	r.winners = genlist_init();
-
-	if (my)
-		list = iph1->rmconf->rsa_private;
-	else
-		list = iph1->rmconf->rsa_public;
-
-	genlist_foreach(list, rsa_lookup_key_one, &r);
-
-	if (loglevel >= LLV_DEBUG)
-		rsa_key_dump(r.winners);
-
-	return r.winners;
-}
-
-int
-rsa_parse_file(struct genlist *list, const char *fname, enum rsa_key_type type)
-{
-	int ret;
-	
-	plog(LLV_DEBUG, LOCATION, NULL, "Parsing %s\n", fname);
-	ret = prsa_parse_file(list, fname, type);
-	if (loglevel >= LLV_DEBUG)
-		rsa_key_dump(list);
-	return ret;
-}
-
-RSA *
-rsa_try_check_rsasign(vchar_t *source, vchar_t *sig, struct genlist *list)
-{
-	struct rsa_key *key;
-	struct genlist_entry *gp;
-
-	for(key = genlist_next(list, &gp); key; key = genlist_next(NULL, &gp)) {
-		plog(LLV_DEBUG, LOCATION, NULL, "Checking key %s...\n",
-			naddrwop2str_fromto("%s -> %s", key->src, key->dst));
-		if (eay_check_rsasign(source, sig, key->rsa) == 0) {
-			plog(LLV_DEBUG, LOCATION, NULL, " ... YEAH!\n");
-			return key->rsa;
-		}
-		plog(LLV_DEBUG, LOCATION, NULL, " ... nope.\n");
-	}
-	return NULL;
-}
diff --git a/src/racoon/rsalist.h b/src/racoon/rsalist.h
deleted file mode 100644
index 911670f..0000000
--- a/src/racoon/rsalist.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*	$NetBSD: rsalist.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: rsalist.h,v 1.2 2004/07/12 20:43:51 ludvigm Exp */
-/*
- * Copyright (C) 2004 SuSE Linux AG, Nuernberg, Germany.
- * Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _RSALIST_H
-#define _RSALIST_H
-
-#include <netinet/in.h>
-#include <openssl/rsa.h>
-
-#include "handler.h"
-#include "genlist.h"
-
-enum rsa_key_type {
-	RSA_TYPE_ANY = 0,
-	RSA_TYPE_PUBLIC,
-	RSA_TYPE_PRIVATE
-};
-
-struct rsa_key {
-	struct netaddr *src;
-	struct netaddr *dst;
-	RSA *rsa;
-};
-
-int rsa_key_insert(struct genlist *list, struct netaddr *src, struct netaddr *dst, RSA *rsa);
-void rsa_key_dump(struct genlist *list);
-
-struct genlist *rsa_lookup_keys(struct ph1handle *iph1, int my);
-RSA *rsa_try_check_rsasign(vchar_t *source, vchar_t *sig, struct genlist *list);
-
-unsigned long rsa_list_count(struct genlist *list);
-
-int rsa_parse_file(struct genlist *list, const char *fname, enum rsa_key_type type);
-
-#endif /* _RSALIST_H */
diff --git a/src/racoon/safefile.c b/src/racoon/safefile.c
deleted file mode 100644
index 5241092..0000000
--- a/src/racoon/safefile.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*	$NetBSD: safefile.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/*	$KAME: safefile.c,v 1.5 2001/03/05 19:54:06 thorpej Exp $	*/
-
-/*
- * Copyright (C) 2000 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <unistd.h>
-
-#include "plog.h"
-#include "debug.h"
-#include "misc.h"
-#include "safefile.h"
-
-int
-safefile(path, secret)
-	const char *path;
-	int secret;
-{
-	struct stat s;
-	uid_t me;
-
-	/* no setuid */
-	if (getuid() != geteuid()) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "setuid'ed execution not allowed\n");
-		return -1;
-	}
-
-	if (stat(path, &s) != 0)
-		return -1;
-
-	/* the file must be owned by the running uid */
-	me = getuid();
-	if (s.st_uid != me) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "%s has invalid owner uid\n", path);
-		return -1;
-	}
-
-	switch (s.st_mode & S_IFMT) {
-	case S_IFREG:
-		break;
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "%s is an invalid file type 0x%x\n", path,
-		    (s.st_mode & S_IFMT));
-		return -1;
-	}
-
-	/* secret file should not be read by others */
-	if (secret) {
-		if ((s.st_mode & S_IRWXG) != 0 || (s.st_mode & S_IRWXO) != 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "%s has weak file permission\n", path);
-			return -1;
-		}
-	}
-
-	return 0;
-}
diff --git a/src/racoon/safefile.h b/src/racoon/safefile.h
deleted file mode 100644
index c8d6a6c..0000000
--- a/src/racoon/safefile.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*	$NetBSD: safefile.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: safefile.h,v 1.4 2004/07/12 18:32:12 ludvigm Exp */
-
-/*
- * Copyright (C) 2000 WIDE Project.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SAFEFILE_H
-#define _SAFEFILE_H
-
-extern int safefile __P((const char *, int));
-
-#endif /* _SAFEFILE_H */
diff --git a/src/racoon/sainfo.c b/src/racoon/sainfo.c
deleted file mode 100644
index afa0aac..0000000
--- a/src/racoon/sainfo.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/*	$NetBSD: sainfo.c,v 1.7.6.1 2007/08/01 11:52:22 vanhu Exp $	*/
-
-/*	$KAME: sainfo.c,v 1.16 2003/06/27 07:32:39 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/queue.h>
-
-#include <netinet/in.h>
-#include <netinet/in.h> 
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "handler.h"
-#include "algorithm.h"
-#include "sainfo.h"
-#include "gcmalloc.h"
-
-static LIST_HEAD(_sitree, sainfo) sitree, sitree_save, sitree_tmp;
-
-/* %%%
- * modules for ipsec sa info
- */
-/*
- * return matching entry.
- * no matching entry found and if there is anonymous entry, return it.
- * else return NULL.
- * First pass is for sainfo from a specified peer, second for others.
- */
-struct sainfo *
-getsainfo(loc, rmt, peer, remoteid)
-	const vchar_t *loc, *rmt, *peer;
-	int remoteid;
-{
-	struct sainfo *s = NULL;
-	struct sainfo *anonymous = NULL;
-	int pass = 1;
-
-	if (peer == NULL)
-		pass = 2;
-
-	/* debug level output */
-	if(loglevel >= LLV_DEBUG) {
-		char *dloc, *drmt, *dpeer, *dclient;
- 
-		if (loc == NULL)
-			dloc = strdup("ANONYMOUS");
-		else
-			dloc = ipsecdoi_id2str(loc);
- 
-		if (rmt == NULL)
-			drmt = strdup("ANONYMOUS");
-		else
-			drmt = ipsecdoi_id2str(rmt);
- 
-		if (peer == NULL)
-			dpeer = strdup("NULL");
-		else
-			dpeer = ipsecdoi_id2str(peer);
- 
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"getsainfo params: loc=\'%s\', rmt=\'%s\', peer=\'%s\', id=%i\n",
-			dloc, drmt, dpeer, remoteid );
- 
-                racoon_free(dloc);
-                racoon_free(drmt);
-                racoon_free(dpeer);
-	}
-
-    again:
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"getsainfo pass #%i\n", pass);
- 
-	LIST_FOREACH(s, &sitree, chain) {
-		const char *sainfostr = sainfo2str(s);
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"evaluating sainfo: %s\n", sainfostr);
-
-		if(s->remoteid != remoteid)
-			continue;
-
-		if (s->id_i != NULL) {
-			if (pass == 2)
-				continue;
-			if (ipsecdoi_chkcmpids(peer, s->id_i, 0))
-				continue;
-		} else if (pass == 1)
-			continue;
-		if (s->idsrc == NULL && s->iddst == NULL) {
-			anonymous = s;
-			continue;
-		}
-
-		/* anonymous ? */
-		if (loc == NULL) {
-			if (anonymous != NULL)
-				break;
-			continue;
-		}
-
-		/* compare the ids */
-		if (!ipsecdoi_chkcmpids(loc, s->idsrc, 0) &&
-		    !ipsecdoi_chkcmpids(rmt, s->iddst, 0))
-			return s;
-	}
-
-	if ((anonymous == NULL) && (pass == 1)) {
-		pass++;
-		goto again;
-	}
-
-	return anonymous;
-}
-
-struct sainfo *
-newsainfo()
-{
-	struct sainfo *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	new->lifetime = IPSECDOI_ATTR_SA_LD_SEC_DEFAULT;
-	new->lifebyte = IPSECDOI_ATTR_SA_LD_KB_MAX;
-
-	return new;
-}
-
-void
-delsainfo(si)
-	struct sainfo *si;
-{
-	int i;
-
-	for (i = 0; i < MAXALGCLASS; i++)
-		delsainfoalg(si->algs[i]);
-
-	if (si->idsrc)
-		vfree(si->idsrc);
-	if (si->iddst)
-		vfree(si->iddst);
-
-#ifdef ENABLE_HYBRID
-	if (si->group)
-		vfree(si->group);
-#endif
-
-	racoon_free(si);
-}
-
-void
-inssainfo(new)
-	struct sainfo *new;
-{
-	LIST_INSERT_HEAD(&sitree, new, chain);
-}
-
-void
-remsainfo(si)
-	struct sainfo *si;
-{
-	LIST_REMOVE(si, chain);
-}
-
-void
-flushsainfo()
-{
-	struct sainfo *s, *next;
-
-	for (s = LIST_FIRST(&sitree); s; s = next) {
-		next = LIST_NEXT(s, chain);
-		remsainfo(s);
-		delsainfo(s);
-	}
-}
-
-void
-initsainfo()
-{
-	LIST_INIT(&sitree);
-}
-
-struct sainfoalg *
-newsainfoalg()
-{
-	struct sainfoalg *new;
-
-	new = racoon_calloc(1, sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	return new;
-}
-
-void
-delsainfoalg(alg)
-	struct sainfoalg *alg;
-{
-	struct sainfoalg *a, *next;
-
-	for (a = alg; a; a = next) {
-		next = a->next;
-		racoon_free(a);
-	}
-}
-
-void
-inssainfoalg(head, new)
-	struct sainfoalg **head;
-	struct sainfoalg *new;
-{
-	struct sainfoalg *a;
-
-	for (a = *head; a && a->next; a = a->next)
-		;
-	if (a)
-		a->next = new;
-	else
-		*head = new;
-}
-
-const char *
-sainfo2str(si)
-	const struct sainfo *si;
-{
-        static char buf[256];
-
-        char *idloc = NULL, *idrmt = NULL, *id_i;
- 
-        if (si->idsrc == NULL)
-                idloc = strdup("ANONYMOUS");
-        else
-                idloc = ipsecdoi_id2str(si->idsrc);
- 
-        if (si->iddst == NULL)
-                idrmt = strdup("ANONYMOUS");
-        else
-                idrmt = ipsecdoi_id2str(si->iddst);
- 
-        if (si->id_i == NULL)
-                id_i = strdup("ANY");
-        else
-                id_i = ipsecdoi_id2str(si->id_i);
- 
-        snprintf(buf, 255, "loc=\'%s\', rmt=\'%s\', peer=\'%s\', id=%i",
-		idloc, idrmt, id_i, si->remoteid);
- 
-        racoon_free(idloc);
-        racoon_free(idrmt);
-        racoon_free(id_i);
- 
-        return buf;
-}
-
-void save_sainfotree(void){
-	sitree_save=sitree;
-	initsainfo();
-}
-
-void save_sainfotree_flush(void){
-	sitree_tmp=sitree;
-	sitree=sitree_save;
-	flushsainfo();
-	sitree=sitree_tmp;
-}
-
-void save_sainfotree_restore(void){
-	flushsainfo();
-	sitree=sitree_save;
-}
diff --git a/src/racoon/sainfo.h b/src/racoon/sainfo.h
deleted file mode 100644
index 357da3f..0000000
--- a/src/racoon/sainfo.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*	$NetBSD: sainfo.h,v 1.5 2006/10/03 08:01:56 vanhu Exp $	*/
-
-/* Id: sainfo.h,v 1.5 2006/07/09 17:19:38 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SAINFO_H
-#define _SAINFO_H
-
-#include <sys/queue.h>
-
-/* SA info */
-struct sainfo {
-	vchar_t *idsrc;
-	vchar_t *iddst;
-		/*
-		 * idsrc and iddst are constructed body of ID payload.
-		 * that is (struct ipsecdoi_id_b) + ID value.
-		 * If idsrc == NULL, that is anonymous entry.
-		 */
-
-#ifdef ENABLE_HYBRID
-	vchar_t *group;
-#endif
-
-	time_t lifetime;
-	int lifebyte;
-	int pfs_group;		/* only use when pfs is required. */
-	vchar_t *id_i;		/* identifier of the authorized initiator */
-	struct sainfoalg *algs[MAXALGCLASS];
-
-	int remoteid;
-
-	LIST_ENTRY(sainfo) chain;
-};
-
-/* algorithm type */
-struct sainfoalg {
-	int alg;
-	int encklen;			/* key length if encryption algorithm */
-	struct sainfoalg *next;
-};
-
-extern struct sainfo *getsainfo __P((const vchar_t *,
-	const vchar_t *, const vchar_t *, int));
-extern struct sainfo *newsainfo __P((void));
-extern void delsainfo __P((struct sainfo *));
-extern void inssainfo __P((struct sainfo *));
-extern void remsainfo __P((struct sainfo *));
-extern void flushsainfo __P((void));
-extern void initsainfo __P((void));
-extern struct sainfoalg *newsainfoalg __P((void));
-extern void delsainfoalg __P((struct sainfoalg *));
-extern void inssainfoalg __P((struct sainfoalg **, struct sainfoalg *));
-extern const char * sainfo2str __P((const struct sainfo *));
-
-extern void save_sainfotree __P((void));
-extern void save_sainfotree_flush __P((void));
-extern void save_sainfotree_restore __P((void));
-
-#endif /* _SAINFO_H */
diff --git a/src/racoon/samples/psk.txt.in b/src/racoon/samples/psk.txt.in
deleted file mode 100644
index 52f1a55..0000000
--- a/src/racoon/samples/psk.txt.in
+++ /dev/null
@@ -1,21 +0,0 @@
-# IPv4/v6 addresses
-10.160.94.3	mekmitasdigoat
-172.16.1.133	mekmitasdigoat
-194.100.55.1	whatcertificatereally
-203.178.141.208	mekmitasdigoat
-206.175.160.18	mekmitasdigoat
-206.175.160.20	mekmitasdigoat
-206.175.160.21	mekmitasdigoat
-206.175.160.22	mekmitasdigoat
-206.175.160.23	mekmitasdigoat
-206.175.160.36	mekmitasdigoat
-206.175.161.125	mekmitasdigoat
-206.175.161.154	mekmitasdigoat
-206.175.161.156	mekmitasdigoat
-206.175.161.182	mekmitasdigoat
-3ffe:501:410:ffff:200:86ff:fe05:80fa	mekmitasdigoat
-3ffe:501:410:ffff:210:4bff:fea2:8baa	mekmitasdigoat
-# USER_FQDN
-sakane@kame.net	mekmitasdigoat
-# FQDN
-kame		hoge
diff --git a/src/racoon/samples/psk.txt.sample b/src/racoon/samples/psk.txt.sample
deleted file mode 100644
index 2ad1d0b..0000000
--- a/src/racoon/samples/psk.txt.sample
+++ /dev/null
@@ -1,10 +0,0 @@
-# IPv4/v6 addresses
-10.160.94.3	mekmitasdigoat
-172.16.1.133	0x12345678
-194.100.55.1	whatcertificatereally
-3ffe:501:410:ffff:200:86ff:fe05:80fa	mekmitasdigoat
-3ffe:501:410:ffff:210:4bff:fea2:8baa	mekmitasdigoat
-# USER_FQDN
-foo@kame.net	mekmitasdigoat
-# FQDN
-foo.kame.net	hoge
diff --git a/src/racoon/samples/racoon.conf.in b/src/racoon/samples/racoon.conf.in
deleted file mode 100644
index 29b7951..0000000
--- a/src/racoon/samples/racoon.conf.in
+++ /dev/null
@@ -1,121 +0,0 @@
-# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $
-
-# "path" affects "include" directives.  "path" must be specified before any
-# "include" directive with relative file path.
-# you can overwrite "path" directive afterwards, however, doing so may add
-# more confusion.
-path include "@sysconfdir_x@/racoon";
-#include "remote.conf";
-
-# the file should contain key ID/key pairs, for pre-shared key authentication.
-path pre_shared_key "@sysconfdir_x@/racoon/psk.txt";
-
-# racoon will look for certificate file in the directory,
-# if the certificate/certificate request payload is received.
-path certificate "@sysconfdir_x@/cert";
-
-# "log" specifies logging level.  It is followed by either "notify", "debug"
-# or "debug2".
-#log debug;
-
-# "padding" defines some padding parameters.  You should not touch these.
-padding
-{
-	maximum_length 20;	# maximum padding length.
-	randomize off;		# enable randomize length.
-	strict_check off;	# enable strict check.
-	exclusive_tail off;	# extract last one octet.
-}
-
-# if no listen directive is specified, racoon will listen on all
-# available interface addresses.
-listen
-{
-	#isakmp ::1 [7000];
-	#isakmp 202.249.11.124 [500];
-	#admin [7002];		# administrative port for racoonctl.
-	#strict_address; 	# requires that all addresses must be bound.
-}
-
-# Specify various default timers.
-timer
-{
-	# These value can be changed per remote node.
-	counter 5;		# maximum trying count to send.
-	interval 20 sec;	# maximum interval to resend.
-	persend 1;		# the number of packets per send.
-
-	# maximum time to wait for completing each phase.
-	phase1 30 sec;
-	phase2 15 sec;
-}
-
-remote anonymous
-{
-	exchange_mode main,aggressive;
-	doi ipsec_doi;
-	situation identity_only;
-
-	my_identifier asn1dn;
-	certificate_type x509 "my.cert.pem" "my.key.pem";
-
-	nonce_size 16;
-	initial_contact on;
-	proposal_check strict;	# obey, strict, or claim
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method rsasig;
-		dh_group 2;
-	}
-}
-
-remote ::1 [8000]
-{
-	#exchange_mode main,aggressive;
-	exchange_mode aggressive,main;
-	doi ipsec_doi;
-	situation identity_only;
-
-	my_identifier user_fqdn "sakane@kame.net";
-	peers_identifier user_fqdn "sakane@kame.net";
-	#certificate_type x509 "mycert" "mypriv";
-
-	nonce_size 16;
-	lifetime time 1 min;	# sec,min,hour
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method pre_shared_key;
-		dh_group 2;
-	}
-}
-
-sainfo anonymous
-{
-	pfs_group 2;
-	encryption_algorithm 3des;
-	authentication_algorithm hmac_sha1;
-	compression_algorithm deflate;
-}
-
-sainfo address 203.178.141.209 any address 203.178.141.218 any
-{
-	pfs_group 2;
-	lifetime time 30 sec;
-	encryption_algorithm des;
-	authentication_algorithm hmac_md5;
-	compression_algorithm deflate;
-}
-
-sainfo address ::1 icmp6 address ::1 icmp6
-{
-	pfs_group 3;
-	lifetime time 60 sec;
-	encryption_algorithm 3des, blowfish, aes;
-	authentication_algorithm hmac_sha1, hmac_md5;
-	compression_algorithm deflate;
-}
-
diff --git a/src/racoon/samples/racoon.conf.sample b/src/racoon/samples/racoon.conf.sample
deleted file mode 100644
index 631910f..0000000
--- a/src/racoon/samples/racoon.conf.sample
+++ /dev/null
@@ -1,61 +0,0 @@
-# $KAME: racoon.conf.sample,v 1.28 2002/10/18 14:33:28 itojun Exp $
-
-# "path" affects "include" directives.  "path" must be specified before any
-# "include" directive with relative file path.
-# you can overwrite "path" directive afterwards, however, doing so may add
-# more confusion.
-#path include "/usr/local/v6/etc" ;
-#include "remote.conf" ;
-
-# the file should contain key ID/key pairs, for pre-shared key authentication.
-path pre_shared_key "/usr/local/v6/etc/psk.txt" ;
-
-# racoon will look for certificate file in the directory,
-# if the certificate/certificate request payload is received.
-#path certificate "/usr/local/openssl/certs" ;
-
-# "log" specifies logging level.  It is followed by either "notify", "debug"
-# or "debug2".
-#log debug;
-
-remote anonymous
-{
-	#exchange_mode main,aggressive,base;
-	exchange_mode main,base;
-
-	#my_identifier fqdn "server.kame.net";
-	#certificate_type x509 "foo@kame.net.cert" "foo@kame.net.priv" ;
-
-	lifetime time 24 hour ;	# sec,min,hour
-
-	#initial_contact off ;
-	#passive on ;
-
-	# phase 1 proposal (for ISAKMP SA)
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method pre_shared_key ;
-		dh_group 2 ;
-	}
-
-	# the configuration could makes racoon (as a responder)
-	# to obey the initiator's lifetime and PFS group proposal,
-	# by setting proposal_check to obey.
-	# this would makes testing "so much easier", but is really
-	# *not* secure !!!
-	proposal_check strict;
-}
-
-# phase 2 proposal (for IPsec SA).
-# actual phase 2 proposal will obey the following items:
-# - kernel IPsec policy configuration (like "esp/transport//use)
-# - permutation of the crypto/hash/compression algorithms presented below
-sainfo anonymous
-{
-	pfs_group 2;
-	lifetime time 12 hour ;
-	encryption_algorithm 3des, cast128, blowfish 448, des, rijndael ;
-	authentication_algorithm hmac_sha1, hmac_md5 ;
-	compression_algorithm deflate ;
-}
diff --git a/src/racoon/samples/racoon.conf.sample-gssapi b/src/racoon/samples/racoon.conf.sample-gssapi
deleted file mode 100644
index 09c4df1..0000000
--- a/src/racoon/samples/racoon.conf.sample-gssapi
+++ /dev/null
@@ -1,43 +0,0 @@
-# $KAME: racoon.conf.sample-gssapi,v 1.5 2001/08/16 06:33:40 itojun Exp $
-
-# sample configuration for GSSAPI authentication (basically, Kerberos).
-# doc/README.gssapi gives some idea on how to configure it.
-# TODO: more documentation.
-
-#listen {
-#	strict_address;
-#}
-
-# Uncomment the following for GSS-API to work with older versions of
-# racoon that (incorrectly) used ISO-Latin-1 encoding for the GSS-API
-# identifier attribute.
-#gss_id_enc latin1;
-
-remote anonymous {
-	exchange_mode main;
-
-	lifetime time 24 hour;
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method gssapi_krb;
-		# The default GSS-API ID is "host/hostname", where
-		# hostname is the output of the hostname(1) command.
-		# You probably want this to match your system's host
-		# principal.  ktutil(8)'s "list" command will list the
-		# principals in your system's keytab.  If you need to,
-		# you can change the GSS-API ID here.
-		#gss_id "host/some.host.name";
-
-		dh_group 1;
-	}
-}
-
-sainfo anonymous {
-	lifetime time 2 hour;
-
-	encryption_algorithm rijndael, 3des;
-	authentication_algorithm hmac_sha1, hmac_md5;
-	compression_algorithm deflate;
-}
diff --git a/src/racoon/samples/racoon.conf.sample-inherit b/src/racoon/samples/racoon.conf.sample-inherit
deleted file mode 100644
index 9e1185f..0000000
--- a/src/racoon/samples/racoon.conf.sample-inherit
+++ /dev/null
@@ -1,55 +0,0 @@
-# Id: racoon.conf.sample-inherit,v 1.3 2005/12/13 16:41:07 vanhu Exp
-# Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
-
-# This file shows the basic inheritance usage in 'remote' statements.
-
-path pre_shared_key "/etc/racoon/psk.txt";
-path certificate "/etc/racoon";
-
-remote anonymous
-{
-	exchange_mode main,aggressive;
-	doi ipsec_doi;
-	situation identity_only;
-
-	my_identifier asn1dn;
-	certificate_type x509 "my.cert.pem" "my.key.pem";
-
-	nonce_size 16;
-	initial_contact on;
-	proposal_check strict;	# obey, strict or claim
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method rsasig;
-		dh_group 2;
-	}
-}
-
-remote 3ffe:ffff::1 inherit anonymous
-{
-	exchange_mode aggressive;
-	nat_traversal force;
-}
-
-remote 3ffe:ffff::1 [8000] inherit 3ffe:ffff::1
-{
-	lifetime time 1 min;	# sec,min,hour
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method pre_shared_key;
-		dh_group 2;
-	}
-}
-
-sainfo anonymous
-{
-	pfs_group 2;
-	lifetime time 12 hour;
-	encryption_algorithm aes, 3des;
-	authentication_algorithm hmac_sha1, hmac_md5;
-	compression_algorithm deflate;
-}
diff --git a/src/racoon/samples/racoon.conf.sample-natt b/src/racoon/samples/racoon.conf.sample-natt
deleted file mode 100644
index 645b4de..0000000
--- a/src/racoon/samples/racoon.conf.sample-natt
+++ /dev/null
@@ -1,97 +0,0 @@
-# Id: racoon.conf.sample-natt,v 1.5 2005/12/13 16:41:07 vanhu Exp
-# Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
-
-# This file can be used as a template for NAT-Traversal setups.
-# Only NAT-T related options are explained here, refer to other 
-# sample files and manual pages for details about the rest.
-
-path include "/etc/racoon";
-path certificate "/etc/racoon/cert";
-
-# Define addresses and ports where racoon will listen for an incoming
-# traffic. Don't forget to open these ports on your firewall!
-listen
-{
-	# First define an address where racoon will listen 
-	# for "normal" IKE traffic. IANA allocated port 500.
-	isakmp 172.16.0.1[500];
-
-	# To use NAT-T you must also open port 4500 of 
-	# the same address so that peers can do 'Port floating'.
-	# The same port will also be used for the UDP-Encapsulated 
-	# ESP traffic.
-	isakmp_natt 172.16.0.1[4500];
-}
-
-
-timer
-{
-	# To keep the NAT-mappings on your NAT gateway, there must be
-	# traffic between the peers. Normally the UDP-Encap traffic
-	# (i.e. the real data transported over the tunnel) would be
-	# enough, but to be safe racoon will send a short
-	# "Keep-alive packet" every few seconds to every peer with
-	# whom it does NAT-Traversal.
-	# The default is 20s. Set it to 0s to disable sending completely.
-	natt_keepalive 10 sec;
-}
-
-# To trigger the SA negotiation there must be an appropriate 
-# policy in the kernel SPD. For example for traffic between 
-# networks 192.168.0.0/24 and 192.168.1.0/24 with gateways 
-# 172.16.0.1 and 172.16.1.1, where the first gateway is behind 
-# a NAT which translates its address to 172.16.1.3, you need the 
-# following rules:
-# On 172.16.0.1 (e.g. behind the NAT):
-#     spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec \
-#            esp/tunnel/172.16.0.1-172.16.1.1/require;
-#     spdadd 192.168.1.0/24 192.168.0.0/24 any -P in ipsec \
-#            esp/tunnel/172.16.1.1-172.16.0.1/require;
-# On the other side (172.16.1.1) either use a "generate_policy on"
-# statement in the remote block, or in case that you know 
-# the translated address, use the following policy:
-#     spdadd 192.168.1.0/24 192.168.0.0/24 any -P out ipsec \
-#            esp/tunnel/172.16.1.1-172.16.1.3/require;
-#     spdadd 192.168.0.0/24 192.168.1.0/24 any -P in ipsec \
-#            esp/tunnel/172.16.1.3-172.16.1.1/require;
-
-# Phase 1 configuration (for ISAKMP SA)
-remote anonymous
-{
-	# NAT-T is supported with all exchange_modes.
-	exchange_mode main,base,aggressive;
-
-	# With NAT-T you shouldn't use PSK. Let's go on with certs.
-	my_identifier asn1dn;
-	certificate_type x509 "your-host.cert.pem" "your-host.key.pem";
-
-	# This is the main switch that enables NAT-T.
-	# Possible values are:
-	#   off - NAT-T support is disabled, i.e. neither offered,
-	#         nor accepted. This is the default.
-	#    on - normal NAT-T support, i.e. if NAT is detected 
-	#         along the way, NAT-T is used.
-	# force - if NAT-T is supported by both peers, it is used
-	#         regardless of whether there is a NAT gateway between them
-	#         or not. This is useful for traversing some firewalls.
-	nat_traversal on;
-	
-	proposal {
-		authentication_method rsasig;
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		dh_group 2;
-	}
-
-	proposal_check strict;
-}
-
-# Phase 2 proposal (for IPsec SA)
-sainfo anonymous
-{
-	pfs_group 2;
-	lifetime time 12 hour;
-	encryption_algorithm 3des, rijndael;
-	authentication_algorithm hmac_sha1;
-	compression_algorithm deflate;
-}
diff --git a/src/racoon/samples/racoon.conf.sample-plainrsa b/src/racoon/samples/racoon.conf.sample-plainrsa
deleted file mode 100644
index 8447eb3..0000000
--- a/src/racoon/samples/racoon.conf.sample-plainrsa
+++ /dev/null
@@ -1,46 +0,0 @@
-# Id: racoon.conf.sample-plainrsa,v 1.4 2005/12/13 16:41:07 vanhu Exp
-# Contributed by: Michal Ludvig <mludvig@suse.cz>, SUSE Labs
-#                 http://www.logix.cz/michal
-
-# This file shows the usage of PlainRSA keys, which are widely used
-# by FreeSWAN/OpenSwan/StrongSwan/*Swan users. This functionality is 
-# here mainly for those who are moving from the *Swan world to Racoon.
-
-# Racoon will look for a keyfile in this directory.
-path certificate "samples" ;
-
-remote anonymous
-{
-	# *Swan supports only 'main' mode.
-	exchange_mode main;
-
-	# *Swan doesn't send identifiers by default.
-	my_identifier address;
-	peers_identifier address;
-
-	# This is the trick - use PlainRSA certificates.
-	certificate_type plain_rsa "privatekey.rsa";
-
-	# Multiple certfiles are supported.
-	peers_certfile plain_rsa "pubkey1.rsa";
-	peers_certfile plain_rsa "pubkey2.rsa";
-
-	# Standard setup follows...
-	proposal_check strict;
-
-	proposal {
-		encryption_algorithm 3des;
-		hash_algorithm sha1;
-		authentication_method rsasig;
-		dh_group 2;
-	}
-}
-
-sainfo anonymous
-{
-	pfs_group 2;
-	lifetime time 12 hour;
-	encryption_algorithm 3des, aes;
-	authentication_algorithm hmac_sha1, hmac_md5;
-	compression_algorithm deflate;
-}
diff --git a/src/racoon/samples/roadwarrior/README b/src/racoon/samples/roadwarrior/README
deleted file mode 100644
index aac9d43..0000000
--- a/src/racoon/samples/roadwarrior/README
+++ /dev/null
@@ -1,67 +0,0 @@
-This directory contains sample configurations files used for roadwarrior
-remote access using hybrid authentication. In this setup, the VPN 
-gateway authenticates to the client using a certificate, and the client
-authenticates to the VPN gateway using a login and a password.
-
-Moreover, this setup makes use of ISAKMP mode config to autoconfigure 
-the client. After a successful login, the client will receive an 
-internal address, netmask and DNS from the VPN gateway.
-
-
-Server setups
-=============
-The server setups need racoon built with the following options:
-configure --enable-natt --enable-frag --enable-hybrid --enable-dpd \
-	  --with-libradius --sysconfdir=/etc/racoon
-
-The first server setup, in server/racoon.conf, is for a VPN gateway 
-using authentication against the system password database, and using 
-a locally configured pool of addresses. 
-
-The second setup, server/racoon.conf-radius, uses a RADIUS server for 
-authentication, IP allocation and accounting. The address and secret
-to be used for the RADIUS server are configured in /etc/radius.conf, 
-see radius.conf(5).
-
-Both configurations can be used with the Cisco VPN client if it
-is set up to use hybrid authentication (aka mutual group authentication,
-available in Cisco VPN client version 4.0.5 and above). The group 
-password configured in the Cisco VPN client is not used by racoon.
-
-After you have installed /etc/racoon/racoon.conf, you will also have 
-to install a server certificate and key in /etc/openssl/certs/server.crt
-and /etc/openssl/certs/server.key
-
-
-Client setup
-============
-The client setup needs racoon built with the following options:
-configure --enable-natt --enable-frag --enable-hybrid --enable-dpd \
-	  --enable-adminport --sysconfdir=/etc/racoon --localstatedir=/var
-
-You need to copy client/racoon.conf, client/phase1-up.sh and
-client/phase1-down.sh to /etc/racoon, and you need to copy the 
-certificate authority that signed the VPN gateway certificate in
-/etc/openssl/certs/root-ca.crt
-
-Once this is done, you can run racoon, and then you can start
-the VPN using racoonctl:
-racoonctl vc -u username vpn-gateway.example.net
-
-Where username is your login, and vpn-gateway.example.net is
-the DNS or IP address of the VPN gateway. racoonctl will prompt 
-you for the password.
-
-The password can be stored in the psk.txt file. In that situation, 
-add this directive to the remote section of racoon.conf:
-	 xauth_login "username";
-where username is your login.
-
-Note that for now there is no feedback in racoonctl if the authentication
-fails. Peek at the racoon logs to discover what goes wrong.
-
-In order to disconnect from the VPN, do this:
-racoonctl vd vpn-gateway.example.net
-
-This configuration should be compatible with the Cisco VPN 3000 using 
-hybrid authentication, though this has not been tested.
diff --git a/src/racoon/samples/roadwarrior/client/phase1-down.sh b/src/racoon/samples/roadwarrior/client/phase1-down.sh
deleted file mode 100755
index 8edc187..0000000
--- a/src/racoon/samples/roadwarrior/client/phase1-down.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/sh
-
-#
-# sa-down.sh local configuration for a new SA
-#
-
-PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
-
-case `uname -s` in
-NetBSD)
-	DEFAULT_GW=`netstat -rn | awk '($1 == "default"){print $2}'`
-	;;
-Linux)
-	DEFAULT_GW=`netstat -rn | awk '($1 == "0.0.0.0"){print $2}'`
-	;;
-esac
-
-echo $@
-echo "LOCAL_ADDR = ${LOCAL_ADDR}"
-echo "LOCAL_PORT = ${LOCAL_PORT}"
-echo "REMOTE_ADDR = ${REMOTE_ADDR}"
-echo "REMOTE_PORT = ${REMOTE_PORT}"
-echo "DEFAULT_GW = ${DEFAULT_GW}"
-echo "INTERNAL_ADDR4 = ${INTERNAL_ADDR4}"
-echo "INTERNAL_DNS4 = ${INTERNAL_DNS4}"
-
-echo ${INTERNAL_ADDR4} | grep '[0-9]' > /dev/null || exit 0
-echo ${DEFAULT_GW} | grep '[0-9]' > /dev/null || exit 0
-
-test -f /etc/resolv.conf.bak && cp /etc/resolv.conf.bak /etc/resolv.conf
-
-case `uname -s` in
-NetBSD)
-	if=`netstat -rn|awk '($1 == "default"){print $7}'`
-	ifconfig ${if} delete ${INTERNAL_ADDR4}
-	route delete default
-	route delete ${REMOTE_ADDR}
-	route add default ${DEFAULT_GW} -ifa ${LOCAL_ADDR}
-	;;
-Linux)
-	if=`netstat -rn|awk '($1 == "0.0.0.0"){print $8}'`
-	route delete default
-	route delete ${REMOTE_ADDR}
-	ifconfig ${if}:1 del ${INTERNAL_ADDR4}
-	route add default gw ${DEFAULT_GW}
-
-	#
-	# XXX This is a workaround because Linux seems to ignore
-	# the deleteall commands below. This is bad because it flushes
-	# any SAD instead of flushing what needs to be flushed.
-	# Someone using Linux please fix it
-	#
-	setkey -F
-	;;
-esac
-
-# Use this for a NAT-T setup
-LOCAL="${LOCAL_ADDR}[${LOCAL_PORT}]"
-REMOTE="${REMOTE_ADDR}[${REMOTE_PORT}]"
-
-# Use this for a non NAT-T setup
-#LOCAL="${LOCAL_ADDR}"
-#REMOTE="${REMOTE_ADDR}"
-
-echo "
-deleteall ${REMOTE_ADDR} ${LOCAL_ADDR} esp;
-deleteall ${LOCAL_ADDR} ${REMOTE_ADDR} esp; 
-spddelete ${INTERNAL_ADDR4}/32[any] 0.0.0.0/0[any] any
-	-P out ipsec esp/tunnel/${LOCAL}-${REMOTE}/require;
-spddelete 0.0.0.0/0[any] ${INTERNAL_ADDR4}[any] any
-	-P in ipsec esp/tunnel/${REMOTE}-${LOCAL}/require;
-" | setkey -c
-
diff --git a/src/racoon/samples/roadwarrior/client/phase1-up.sh b/src/racoon/samples/roadwarrior/client/phase1-up.sh
deleted file mode 100755
index e45b648..0000000
--- a/src/racoon/samples/roadwarrior/client/phase1-up.sh
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/sh
-
-#
-# sa-up.sh local configuration for a new SA
-#
-PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
-
-case `uname -s` in
-NetBSD)
-	DEFAULT_GW=`netstat -rn | awk '($1 == "default"){print $2}'`
-	;;
-Linux)
-	DEFAULT_GW=`netstat -rn | awk '($1 == "0.0.0.0"){print $2}'`
-	;;
-esac
-
-echo $@
-echo "LOCAL_ADDR = ${LOCAL_ADDR}"
-echo "LOCAL_PORT = ${LOCAL_PORT}"
-echo "REMOTE_ADDR = ${REMOTE_ADDR}"
-echo "REMOTE_PORT = ${REMOTE_PORT}"
-echo "DEFAULT_GW = ${DEFAULT_GW}"
-echo "INTERNAL_ADDR4 = ${INTERNAL_ADDR4}"
-echo "INTERNAL_DNS4 = ${INTERNAL_DNS4}"
-
-echo ${INTERNAL_ADDR4} | grep '[0-9]' > /dev/null || exit 0
-echo ${DEFAULT_GW} | grep '[0-9]' > /dev/null || exit 0
-
-test -f /etc/resolv.conf.bak || cp /etc/resolv.conf /etc/resolv.conf.bak
-echo "# Generated by racoon on `date`" > /etc/resolv.conf
-echo "nameserver ${INTERNAL_DNS4}" >> /etc/resolv.conf
-
-case `uname -s` in
-NetBSD)
-	if=`netstat -rn|awk '($1 == "default"){print $7}'`
-	ifconfig ${if} alias ${INTERNAL_ADDR4} netmask ${INTERNAL_NETMASK4}
-	route delete default
-	route add default ${DEFAULT_GW} -ifa ${INTERNAL_ADDR4}
-	route add ${REMOTE_ADDR} ${DEFAULT_GW}
-	;;
-Linux)
-	if=`netstat -rn|awk '($1 == "0.0.0.0"){print $8}'`
-	ifconfig ${if}:1 ${INTERNAL_ADDR4}      
-	route delete default
-	route add ${REMOTE_ADDR} gw ${DEFAULT_GW} dev ${if}
-	route add default gw ${DEFAULT_GW} dev ${if}:1
-	;;
-esac
-
-# Use this for a NAT-T setup
-LOCAL="${LOCAL_ADDR}[${LOCAL_PORT}]"
-REMOTE="${REMOTE_ADDR}[${REMOTE_PORT}]"
-
-# Use this for a non NAT-T setup
-#LOCAL="${LOCAL_ADDR}"
-#REMOTE="${REMOTE_ADDR}"
-
-
-echo "
-spdadd ${INTERNAL_ADDR4}/32[any] 0.0.0.0/0[any] any
-       -P out ipsec esp/tunnel/${LOCAL}-${REMOTE}/require;
-spdadd 0.0.0.0/0[any] ${INTERNAL_ADDR4}[any] any
-       -P in ipsec esp/tunnel/${REMOTE}-${LOCAL}/require;
-" | setkey -c
-
-#
-# XXX This is a workaround for Linux forward policies problem. 
-# Someone familiar with forward policies please fix this properly.
-#
-case `uname -s` in
-Linux)
-	echo "
-	spddelete 0.0.0.0/0[any] ${INTERNAL_ADDR4}[any] any
-		-P fwd ipsec esp/tunnel/${REMOTE}-${LOCAL}/require;
-	" | setkey -c
-	;;
-esac
diff --git a/src/racoon/samples/roadwarrior/client/racoon.conf b/src/racoon/samples/roadwarrior/client/racoon.conf
deleted file mode 100644
index 669be36..0000000
--- a/src/racoon/samples/roadwarrior/client/racoon.conf
+++ /dev/null
@@ -1,33 +0,0 @@
-path certificate "/etc/openssl/certs";
-path pre_shared_key "/etc/racoon/psk.txt";
-
-listen {
-	adminsock "/var/racoon/racoon.sock" "root" "operator" 0660;
-}
-
-remote 192.0.2.50 {
-        exchange_mode aggressive;
-	ca_type x509 "root-ca.crt";
-        proposal_check strict;
-	nat_traversal on;
-	ike_frag on;
-	mode_cfg on;
-	script "/etc/racoon/phase1-up.sh" phase1_up;
-	script "/etc/racoon/phase1-down.sh" phase1_down;
-	passive off;
-        proposal {
-                encryption_algorithm aes;
-                hash_algorithm sha1;
-                authentication_method hybrid_rsa_client;
-                dh_group 2;
-        }
-}
-
-
-sainfo anonymous {
-        pfs_group 2;
-        lifetime time 1 hour;
-        encryption_algorithm aes;
-        authentication_algorithm hmac_sha1;
-        compression_algorithm deflate ;
-}
diff --git a/src/racoon/samples/roadwarrior/server/racoon.conf b/src/racoon/samples/roadwarrior/server/racoon.conf
deleted file mode 100644
index ae7d603..0000000
--- a/src/racoon/samples/roadwarrior/server/racoon.conf
+++ /dev/null
@@ -1,42 +0,0 @@
-path certificate "/etc/openssl/certs";
-
-listen {
-	adminsock disabled;
-}
-
-remote anonymous {
-	exchange_mode aggressive;
-	certificate_type x509 "server.crt" "server.key";
-	my_identifier asn1dn;
-	proposal_check strict;
-	generate_policy on;
-	nat_traversal on;
-	dpd_delay 20;
-	ike_frag on;
-	proposal {
-		encryption_algorithm aes;
-		hash_algorithm sha1;
-		authentication_method hybrid_rsa_server;
-		dh_group 2;
-	}
-}
-
-mode_cfg {
-	network4 10.99.99.0;
-	pool_size 255;
-	netmask4 255.255.255.0;  
-	auth_source system;
-	dns4 10.0.12.1;
-	wins4 10.0.12.1;
-	banner "/etc/racoon/motd";
-	pfs_group 2;
-}	       
-		
-sainfo anonymous {
-	pfs_group 2;
-	lifetime time 1 hour;
-	encryption_algorithm aes;
-	authentication_algorithm hmac_sha1;
-	compression_algorithm deflate;
-}   
-
diff --git a/src/racoon/samples/roadwarrior/server/racoon.conf-radius b/src/racoon/samples/roadwarrior/server/racoon.conf-radius
deleted file mode 100644
index 24e8d4e..0000000
--- a/src/racoon/samples/roadwarrior/server/racoon.conf-radius
+++ /dev/null
@@ -1,42 +0,0 @@
-path certificate "/etc/openssl/certs";
-
-listen {
-	adminsock disabled;
-}
-
-remote anonymous {
-	exchange_mode aggressive;
-	certificate_type x509 "server.crt" "server.key";
-	my_identifier asn1dn;
-	proposal_check strict;
-	generate_policy on;
-	nat_traversal on;
-	dpd_delay 20;
-	ike_frag on;
-	proposal {
-		encryption_algorithm aes;
-		hash_algorithm sha1;
-		authentication_method hybrid_rsa_server;
-		dh_group 2;
-	}
-}
-
-mode_cfg {
-	pool_size 255;
-	auth_source radius;
-	conf_source radius;
-	accounting radius;
-	dns4 10.0.12.1;
-	wins4 10.0.12.1;
-	banner "/etc/racoon/motd";
-	pfs_group 2;
-}	       
-		
-sainfo anonymous {
-	pfs_group 2;
-	lifetime time 1 hour;
-	encryption_algorithm aes;
-	authentication_algorithm hmac_sha1;
-	compression_algorithm deflate;
-}   
-
diff --git a/src/racoon/schedule.c b/src/racoon/schedule.c
deleted file mode 100644
index 04723c5..0000000
--- a/src/racoon/schedule.c
+++ /dev/null
@@ -1,364 +0,0 @@
-/*	$NetBSD: schedule.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/*	$KAME: schedule.c,v 1.19 2001/11/05 10:53:19 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <time.h>
-
-#include "misc.h"
-#include "plog.h"
-#include "schedule.h"
-#include "var.h"
-#include "gcmalloc.h"
-
-#define FIXY2038PROBLEM
-
-#ifndef TAILQ_FOREACH
-#define TAILQ_FOREACH(elm, head, field) \
-        for (elm = TAILQ_FIRST(head); elm; elm = TAILQ_NEXT(elm, field))
-#endif
-
-static struct timeval timeout;
-
-#ifdef FIXY2038PROBLEM
-#define Y2038TIME_T	0x7fffffff
-static time_t launched;		/* time when the program launched. */
-static time_t deltaY2038;
-#endif
-
-static TAILQ_HEAD(_schedtree, sched) sctree;
-
-static void sched_add __P((struct sched *));
-static time_t current_time __P((void));
-
-/*
- * schedule handler
- * OUT:
- *	time to block until next event.
- *	if no entry, NULL returned.
- */
-struct timeval *
-schedular()
-{
-	time_t now, delta;
-	struct sched *p, *next = NULL;
-
-	now = current_time();
-
-        for (p = TAILQ_FIRST(&sctree); p; p = next) {
-		/* if the entry has been daed, remove it */
-		if (p->dead)
-			goto next_schedule;
-
-		/* if the time hasn't come, proceed to the next entry */
-		if (now < p->xtime) {
-			next = TAILQ_NEXT(p, chain);
-			continue;
-		}
-
-		/* mark it with dead. and call the function. */
-		p->dead = 1;
-		if (p->func != NULL)
-			(p->func)(p->param);
-
-	   next_schedule:
-		next = TAILQ_NEXT(p, chain);
-		TAILQ_REMOVE(&sctree, p, chain);
-		racoon_free(p);
-	}
-
-	p = TAILQ_FIRST(&sctree);
-	if (p == NULL)
-		return NULL;
-
-	now = current_time();
-
-	delta = p->xtime - now;
-	timeout.tv_sec = delta < 0 ? 0 : delta;
-	timeout.tv_usec = 0;
-
-	return &timeout;
-}
-
-/*
- * add new schedule to schedule table.
- */
-struct sched *
-sched_new(tick, func, param)
-	time_t tick;
-	void (*func) __P((void *));
-	void *param;
-{
-	static long id = 1;
-	struct sched *new;
-
-	new = (struct sched *)racoon_malloc(sizeof(*new));
-	if (new == NULL)
-		return NULL;
-
-	memset(new, 0, sizeof(*new));
-	new->func = func;
-	new->param = param;
-
-	new->id = id++;
-	time(&new->created);
-	new->tick = tick;
-
-	new->xtime = current_time() + tick;
-	new->dead = 0;
-
-	/* add to schedule table */
-	sched_add(new);
-
-	return(new);
-}
-
-/* add new schedule to schedule table */
-static void
-sched_add(sc)
-	struct sched *sc;
-{
-	struct sched *p;
-
-	TAILQ_FOREACH(p, &sctree, chain) {
-		if (sc->xtime < p->xtime) {
-			TAILQ_INSERT_BEFORE(p, sc, chain);
-			return;
-		}
-	}
-	if (p == NULL)
-		TAILQ_INSERT_TAIL(&sctree, sc, chain);
-
-	return;
-}
-
-/* get current time.
- * if defined FIXY2038PROBLEM, base time is the time when called sched_init().
- * Otherwise, conform to time(3).
- */
-static time_t
-current_time()
-{
-	time_t n;
-#ifdef FIXY2038PROBLEM
-	time_t t;
-
-	time(&n);
-	t = n - launched;
-	if (t < 0)
-		t += deltaY2038;
-
-	return t;
-#else
-	return time(&n);
-#endif
-}
-
-void
-sched_kill(sc)
-	struct sched *sc;
-{
-	sc->dead = 1;
-
-	return;
-}
-
-/* XXX this function is probably unnecessary. */
-void
-sched_scrub_param(param)
-	void *param;
-{
-	struct sched *sc;
-
-	TAILQ_FOREACH(sc, &sctree, chain) {
-		if (sc->param == param) {
-			if (!sc->dead) {
-				plog(LLV_DEBUG, LOCATION, NULL,
-				    "an undead schedule has been deleted.\n");
-			}
-			sched_kill(sc);
-		}
-	}
-}
-
-/*
- * for debug
- */
-int
-sched_dump(buf, len)
-	caddr_t *buf;
-	int *len;
-{
-	caddr_t new;
-	struct sched *p;
-	struct scheddump *dst;
-	int cnt = 0;
-
-	/* initialize */
-	*len = 0;
-	*buf = NULL;
-
-	TAILQ_FOREACH(p, &sctree, chain)
-		cnt++;
-
-	/* no entry */
-	if (cnt == 0)
-		return -1;
-
-	*len = cnt * sizeof(*dst);
-
-	new = racoon_malloc(*len);
-	if (new == NULL)
-		return -1;
-	dst = (struct scheddump *)new;
-
-        p = TAILQ_FIRST(&sctree);
-	while (p) {
-		dst->xtime = p->xtime;
-		dst->id = p->id;
-		dst->created = p->created;
-		dst->tick = p->tick;
-
-		p = TAILQ_NEXT(p, chain);
-		if (p == NULL)
-			break;
-		dst++;
-	}
-
-	*buf = new;
-
-	return 0;
-}
-
-/* initialize schedule table */
-void
-sched_init()
-{
-#ifdef FIXY2038PROBLEM
-	time(&launched);
-
-	deltaY2038 = Y2038TIME_T - launched;
-#endif
-
-	TAILQ_INIT(&sctree);
-
-	return;
-}
-
-#ifdef STEST
-#include <sys/types.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <err.h>
-
-void
-test(tick)
-	int *tick;
-{
-	printf("execute %d\n", *tick);
-	racoon_free(tick);
-}
-
-void
-getstdin()
-{
-	int *tick;
-	char buf[16];
-
-	read(0, buf, sizeof(buf));
-	if (buf[0] == 'd') {
-		struct scheddump *scbuf, *p;
-		int len;
-		sched_dump((caddr_t *)&scbuf, &len);
-		if (scbuf == NULL)
-			return;
-		for (p = scbuf; len; p++) {
-			printf("xtime=%ld\n", p->xtime);
-			len -= sizeof(*p);
-		}
-		racoon_free(scbuf);
-		return;
-	}
-
-	tick = (int *)racoon_malloc(sizeof(*tick));
-	*tick = atoi(buf);
-	printf("new queue tick = %d\n", *tick);
-	sched_new(*tick, test, tick);
-}
-
-int
-main()
-{
-	static fd_set mask0;
-	int nfds = 0;
-	fd_set rfds;
-	struct timeval *timeout;
-	int error;
-
-	FD_ZERO(&mask0);
-	FD_SET(0, &mask0);
-	nfds = 1;
-
-	/* initialize */
-	sched_init();
-
-	while (1) {
-		rfds = mask0;
-
-		timeout = schedular();
-
-		error = select(nfds, &rfds, (fd_set *)0, (fd_set *)0, timeout);
-		if (error < 0) {
-			switch (errno) {
-			case EINTR: continue;
-			default:
-				err(1, "select");
-			}
-			/*NOTREACHED*/
-		}
-
-		if (FD_ISSET(0, &rfds))
-			getstdin();
-	}
-}
-#endif
diff --git a/src/racoon/schedule.h b/src/racoon/schedule.h
deleted file mode 100644
index bd66593..0000000
--- a/src/racoon/schedule.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*	$NetBSD: schedule.h,v 1.4.6.1 2007/03/21 14:29:48 vanhu Exp $	*/
-
-/* Id: schedule.h,v 1.5 2006/05/03 21:53:42 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SCHEDULE_H
-#define _SCHEDULE_H
-
-#include <sys/queue.h>
-#include "gnuc.h"
-
-/* scheduling table */
-/* the head is the nearest event. */
-struct sched {
-	time_t xtime;		/* event time which is as time(3). */
-				/*
-				 * if defined FIXY2038PROBLEM, this time
-				 * is from the time when called sched_init().
-				 */
-	void (*func) __P((void *)); /* call this function when timeout. */
-	void *param;		/* pointer to parameter */
-
-	int dead;		/* dead or alive */
-	long id;		/* for debug */
-	time_t created;		/* for debug */
-	time_t tick;		/* for debug */
-
-	TAILQ_ENTRY(sched) chain;
-};
-
-/* cancel schedule */
-#define SCHED_KILL(s)                                                          \
-do {                                                                           \
-	if(s != NULL){	   														\
-		sched_kill(s);                                                         \
-		s = NULL;                                                              \
-	}\
-} while(0)
-
-/* must be called after it's called from scheduler. */
-#define SCHED_INIT(s)	(s) = NULL
-
-struct scheddump {
-	time_t xtime;
-	long id;
-	time_t created;
-	time_t tick;
-};
-
-struct timeval *schedular __P((void));
-struct sched *sched_new __P((time_t, void (*func) __P((void *)), void *));
-void sched_kill __P((struct sched *));
-int sched_dump __P((caddr_t *, int *));
-void sched_init __P((void));
-void sched_scrub_param __P((void *));
-
-#endif /* _SCHEDULE_H */
diff --git a/src/racoon/security.c b/src/racoon/security.c
deleted file mode 100644
index e4b5a0d..0000000
--- a/src/racoon/security.c
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2005 International Business Machines Corporation
- * Copyright (c) 2005 by Trusted Computer Solutions, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-
-#include "config.h"
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <selinux/selinux.h>
-#include <selinux/flask.h>
-#include <selinux/av_permissions.h>
-#include <selinux/avc.h>
-#include <selinux/context.h>
-
-#include "var.h"
-#include "vmbuf.h"
-#include "misc.h"
-#include "plog.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "ipsec_doi.h"
-#include "policy.h"
-#include "proposal.h"
-#include "strnames.h"
-#include "handler.h"
-
-/* 
- * Get the security context information from SA.
- */
-int
-get_security_context(sa, p)
-	vchar_t *sa;
-	struct policyindex *p;
-{
-	int len = 0;
-	int flag, type = 0;
-	u_int16_t lorv;
-	caddr_t bp;
-	vchar_t *pbuf = NULL;
-	vchar_t *tbuf = NULL;
-	struct isakmp_parse_t *pa;
-	struct isakmp_parse_t *ta;
-	struct isakmp_pl_p *prop;
-	struct isakmp_pl_t *trns;
-	struct isakmp_data *d;
-	struct ipsecdoi_sa_b *sab = (struct ipsecdoi_sa_b *)sa->v;
-	
-	/* check SA payload size */
-	if (sa->l < sizeof(*sab)) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid SA length = %zu.\n", sa->l);
-		return -1;
-	}
-
-	bp = (caddr_t)(sab + 1); /* here bp points to first proposal payload */
-	len = sa->l - sizeof(*sab);
-
-	pbuf = isakmp_parsewoh(ISAKMP_NPTYPE_P, (struct isakmp_gen *)bp, len);
-	if (pbuf == NULL)
-		return -1;
-
-	pa = (struct isakmp_parse_t *)pbuf->v; 
-        /* check the value of next payload */
-	if (pa->type != ISAKMP_NPTYPE_P) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"Invalid payload type=%u\n", pa->type);
-		vfree(pbuf);
-		return -1;
-	}
-
-	if (pa->len == 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		"invalid proposal with length %d\n", pa->len);
-		vfree(pbuf);
-		return -1;
-	}
-
-	/* our first proposal */
-	prop = (struct isakmp_pl_p *)pa->ptr;
-
-	/* now get transform */
-	bp = (caddr_t)prop + sizeof(struct isakmp_pl_p) + prop->spi_size;
-	len = ntohs(prop->h.len) - 
-		(sizeof(struct isakmp_pl_p) + prop->spi_size);
-	tbuf = isakmp_parsewoh(ISAKMP_NPTYPE_T, (struct isakmp_gen *)bp, len);
-	if (tbuf == NULL)
-		return -1;
-
-	ta = (struct isakmp_parse_t *)tbuf->v;
-	if (ta->type != ISAKMP_NPTYPE_T) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Invalid payload type=%u\n", ta->type);
-		return -1;
-	}
-	
-	trns = (struct isakmp_pl_t *)ta->ptr;
-
-	len = ntohs(trns->h.len) - sizeof(struct isakmp_pl_t);
-	d = (struct isakmp_data *)((caddr_t)trns + sizeof(struct isakmp_pl_t));
-
-	while (len > 0) {
-		type = ntohs(d->type) & ~ISAKMP_GEN_MASK;
-		flag = ntohs(d->type) & ISAKMP_GEN_MASK;
-		lorv = ntohs(d->lorv);
-
-		if (type != IPSECDOI_ATTR_SECCTX) {
-			if (flag) {
-				len -= sizeof(*d);
-				d = (struct isakmp_data *)((char *)d 
-				     + sizeof(*d));
-			} else {
-				len -= (sizeof(*d) + lorv);
-				d = (struct isakmp_data *)((caddr_t)d
-				     + sizeof(*d) + lorv);
-			}
-		} else {
-			flag = ntohs(d->type & ISAKMP_GEN_MASK);
-			if (flag) {
-				plog(LLV_ERROR, LOCATION, NULL,
-				     "SECCTX must be in TLV.\n");
-				return -1;
-			}
-			memcpy(&p->sec_ctx, d + 1, lorv);
-			p->sec_ctx.ctx_strlen = ntohs(p->sec_ctx.ctx_strlen);
-			return 0;
-		}
-	}
-	return 0;
-}
-
-void
-set_secctx_in_proposal(iph2, spidx)
-	struct ph2handle *iph2;
-	struct policyindex spidx;
-{
-	iph2->proposal->sctx.ctx_doi = spidx.sec_ctx.ctx_doi;
-	iph2->proposal->sctx.ctx_alg = spidx.sec_ctx.ctx_alg;
-	iph2->proposal->sctx.ctx_strlen = spidx.sec_ctx.ctx_strlen;
-		memcpy(iph2->proposal->sctx.ctx_str, spidx.sec_ctx.ctx_str,
-			spidx.sec_ctx.ctx_strlen);
-}
-
-
-/*
- * function: 	init_avc
- * description:	function performs the steps necessary to initialize the
- *		userspace avc.
- * input:	void
- * return:	0	if avc was successfully initialized
- * 		1	if the avc could not be initialized
- */
-
-static int mls_ready = 0;
-
-void
-init_avc(void)
-{
-	if (!is_selinux_mls_enabled()) {
-		plog(LLV_ERROR, LOCATION, NULL, "racoon: MLS support is not"
-				" enabled.\n");
-		return;
-	}
-
-	if (avc_init("racoon", NULL, NULL, NULL, NULL) == 0)
-		mls_ready = 1;
-	else
-		plog(LLV_ERROR, LOCATION, NULL, 
-		     "racoon: could not initialize avc.\n");
-}
-
-/*
- * function: 	within_range
- * description:	function determines if the specified sl is within the
- * 		configured range for a policy rule.
- * input:	security_context *sl		SL
- * 		char *range		Range
- * return:	1	if the sl is within the range
- * 		0	if the sl is not within the range or an error
- * 			occurred which prevented the determination
- */
-
-int
-within_range(security_context_t sl, security_context_t range)
-{
-	int rtn = 1;
-	security_id_t slsid;
-	security_id_t rangesid;
-	struct av_decision avd;
-	security_class_t tclass;
-	access_vector_t av;
-
-	if (!*range)	/* This policy doesn't have security context */
-		return 1;
-
-	if (!mls_ready)  /* mls may not be enabled */
-		return 0;
-
-	/*
-	 * Get the sids for the sl and range contexts
-	 */
-	rtn = avc_context_to_sid(sl, &slsid);
-	if (rtn != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-				"within_range: Unable to retrieve "
-				"sid for sl context (%s).\n", sl);
-		return 0;
-	}
-	rtn = avc_context_to_sid(range, &rangesid);
-	if (rtn != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-				"within_range: Unable to retrieve "
-				"sid for range context (%s).\n", range);
-		sidput(slsid);
-		return 0;
-	}
-
-	/* 
-	 * Straight up test between sl and range
-	 */
-	tclass = SECCLASS_ASSOCIATION;
-	av = ASSOCIATION__POLMATCH;
-	rtn = avc_has_perm(slsid, rangesid, tclass, av, NULL, &avd);
-	if (rtn != 0) {
-		plog(LLV_INFO, LOCATION, NULL, 
-			"within_range: The sl is not within range\n");
-		sidput(slsid);
-		sidput(rangesid);
-		return 0;
-	}
-	plog(LLV_DEBUG, LOCATION, NULL, 
-		"within_range: The sl (%s) is within range (%s)\n", sl, range);
-		return 1;
-}
diff --git a/src/racoon/session.c b/src/racoon/session.c
deleted file mode 100644
index 9db901d..0000000
--- a/src/racoon/session.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/*	$NetBSD: session.c,v 1.7.6.2 2007/08/01 11:52:22 vanhu Exp $	*/
-
-/*	$KAME: session.c,v 1.32 2003/09/24 02:01:17 jinmei Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#if HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(s)	((unsigned)(s) >> 8)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(s)	(((s) & 255) == 0)
-#endif
-
-#include PATH_IPSEC_H
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <signal.h>
-#include <sys/stat.h>
-#include <paths.h>
-
-#include <netinet/in.h>
-#include <resolv.h>
-
-#include "libpfkey.h"
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "schedule.h"
-#include "session.h"
-#include "grabmyaddr.h"
-#include "evt.h"
-#include "cfparse_proto.h"
-#include "isakmp_var.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#include "admin_var.h"
-#include "admin.h"
-#include "privsep.h"
-#include "oakley.h"
-#include "pfkey.h"
-#include "handler.h"
-#include "localconf.h"
-#include "remoteconf.h"
-#include "backupsa.h"
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-
-
-#include "algorithm.h" /* XXX ??? */
-
-#include "sainfo.h"
-
-static void close_session __P((void));
-static void check_rtsock __P((void *));
-static void initfds __P((void));
-static void init_signal __P((void));
-static int set_signal __P((int sig, RETSIGTYPE (*func) __P((int))));
-static void check_sigreq __P((void));
-static void check_flushsa_stub __P((void *));
-static void check_flushsa __P((void));
-static int close_sockets __P((void));
-
-static fd_set mask0;
-static fd_set maskdying;
-static int nfds = 0;
-static volatile sig_atomic_t sigreq[NSIG + 1];
-static int dying = 0;
-
-int
-session(void)
-{
-	fd_set rfds;
-	struct timeval *timeout;
-	int error;
-	struct myaddrs *p;
-	char pid_file[MAXPATHLEN];
-	FILE *fp;
-	pid_t racoon_pid = 0;
-	int i;
-
-	/* initialize schedular */
-	sched_init();
-
-	init_signal();
-
-#ifdef ENABLE_ADMINPORT
-	if (admin_init() < 0)
-		exit(1);
-#endif
-
-	initmyaddr();
-
-	if (isakmp_init() < 0)
-		exit(1);
-
-	initfds();
-
-#ifdef ENABLE_NATT
-	natt_keepalive_init ();
-#endif
-
-	if (privsep_init() != 0)
-		exit(1);
-
-	for (i = 0; i <= NSIG; i++)
-		sigreq[i] = 0;
-
-	/* write .pid file */
-	racoon_pid = getpid();
-	if (lcconf->pathinfo[LC_PATHTYPE_PIDFILE] == NULL) 
-		strlcpy(pid_file, _PATH_VARRUN "racoon.pid", MAXPATHLEN);
-	else if (lcconf->pathinfo[LC_PATHTYPE_PIDFILE][0] == '/') 
-		strlcpy(pid_file, lcconf->pathinfo[LC_PATHTYPE_PIDFILE], MAXPATHLEN);
-	else {
-		strlcat(pid_file, _PATH_VARRUN, MAXPATHLEN);
-		strlcat(pid_file, lcconf->pathinfo[LC_PATHTYPE_PIDFILE], MAXPATHLEN);
-	} 
-	fp = fopen(pid_file, "w");
-	if (fp) {
-		if (fchmod(fileno(fp),
-			S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
-			syslog(LOG_ERR, "%s", strerror(errno));
-			fclose(fp);
-			exit(1);
-		}
-		fprintf(fp, "%ld\n", (long)racoon_pid);
-		fclose(fp);
-	} else {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"cannot open %s", pid_file);
-	}
-
-	while (1) {
-		if (dying)
-			rfds = maskdying;
-		else
-			rfds = mask0;
-
-		/*
-		 * asynchronous requests via signal.
-		 * make sure to reset sigreq to 0.
-		 */
-		check_sigreq();
-
-		/* scheduling */
-		timeout = schedular();
-
-		error = select(nfds, &rfds, (fd_set *)0, (fd_set *)0, timeout);
-		if (error < 0) {
-			switch (errno) {
-			case EINTR:
-				continue;
-			default:
-				plog(LLV_ERROR, LOCATION, NULL,
-					"failed to select (%s)\n",
-					strerror(errno));
-				return -1;
-			}
-			/*NOTREACHED*/
-		}
-
-#ifdef ENABLE_ADMINPORT
-		if ((lcconf->sock_admin != -1) &&
-		    (FD_ISSET(lcconf->sock_admin, &rfds)))
-			admin_handler();
-#endif
-
-		for (p = lcconf->myaddrs; p; p = p->next) {
-			if (!p->addr)
-				continue;
-			if (FD_ISSET(p->sock, &rfds))
-				isakmp_handler(p->sock);
-		}
-
-		if (FD_ISSET(lcconf->sock_pfkey, &rfds))
-			pfkey_handler();
-
-		if (lcconf->rtsock >= 0 && FD_ISSET(lcconf->rtsock, &rfds)) {
-			if (update_myaddrs() && lcconf->autograbaddr)
-				check_rtsock(NULL);
-			else
-				initfds();
-		}
-	}
-}
-
-/* clear all status and exit program. */
-static void
-close_session()
-{
-#ifdef ENABLE_FASTQUIT
-	flushph2();
-#endif
-	flushph1();
-	close_sockets();
-	backupsa_clean();
-
-	plog(LLV_INFO, LOCATION, NULL, "racoon shutdown\n");
-	exit(0);
-}
-
-static void
-check_rtsock(unused)
-	void *unused;
-{
-	isakmp_close();
-	grab_myaddrs();
-	autoconf_myaddrsport();
-	isakmp_open();
-
-	/* initialize socket list again */
-	initfds();
-}
-
-static void
-initfds()
-{
-	struct myaddrs *p;
-
-	nfds = 0;
-
-	FD_ZERO(&mask0);
-	FD_ZERO(&maskdying);
-
-#ifdef ENABLE_ADMINPORT
-	if (lcconf->sock_admin != -1) {
-		if (lcconf->sock_admin >= FD_SETSIZE) {
-			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
-			exit(1);
-		}
-		FD_SET(lcconf->sock_admin, &mask0);
-		/* XXX should we listen on admin socket when dying ?
-		 */
-#if 0
-		FD_SET(lcconf->sock_admin, &maskdying);
-#endif
-		nfds = (nfds > lcconf->sock_admin ? nfds : lcconf->sock_admin);
-	}
-#endif
-	if (lcconf->sock_pfkey >= FD_SETSIZE) {
-		plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
-		exit(1);
-	}
-	FD_SET(lcconf->sock_pfkey, &mask0);
-	FD_SET(lcconf->sock_pfkey, &maskdying);
-	nfds = (nfds > lcconf->sock_pfkey ? nfds : lcconf->sock_pfkey);
-	if (lcconf->rtsock >= 0) {
-		if (lcconf->rtsock >= FD_SETSIZE) {
-			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
-			exit(1);
-		}
-		FD_SET(lcconf->rtsock, &mask0);
-		nfds = (nfds > lcconf->rtsock ? nfds : lcconf->rtsock);
-	}
-
-	for (p = lcconf->myaddrs; p; p = p->next) {
-		if (!p->addr)
-			continue;
-		if (p->sock >= FD_SETSIZE) {
-			plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun\n");
-			exit(1);
-		}
-		FD_SET(p->sock, &mask0);
-		nfds = (nfds > p->sock ? nfds : p->sock);
-	}
-	nfds++;
-}
-
-static int signals[] = {
-	SIGHUP,
-	SIGINT,
-	SIGTERM,
-	SIGUSR1,
-	SIGUSR2,
-	SIGCHLD,
-	0
-};
-
-/*
- * asynchronous requests will actually dispatched in the
- * main loop in session().
- */
-RETSIGTYPE
-signal_handler(sig)
-	int sig;
-{
-	/* Do not just set it to 1, because we may miss some signals by just setting
-	 * values to 0/1
-	 */
-	sigreq[sig]++;
-}
-
-
-/* XXX possible mem leaks and no way to go back for now !!!
- */
-static void reload_conf(){
-	int error;
-
-#ifdef ENABLE_HYBRID
-	if ((isakmp_cfg_init(ISAKMP_CFG_INIT_WARM)) != 0) {
-		plog(LLV_ERROR, LOCATION, NULL, 
-		    "ISAKMP mode config structure reset failed, "
-		    "not reloading\n");
-		return;
-	}
-#endif
-
-	save_sainfotree();
-
-	/* TODO: save / restore / flush old lcconf (?) / rmtree
-	 */
-/*	initlcconf();*/ /* racoon_conf ? ! */
-
-	save_rmconf();
-	initrmconf();
-
-	/* Do a part of pfkey_init() ?
-	 * SPD reload ?
-	 */
-	
-	save_params();
-	error = cfparse();
-	if (error != 0){
-		plog(LLV_ERROR, LOCATION, NULL, "config reload failed\n");
-		/* We are probably in an inconsistant state... */
-		return;
-	}
-	restore_params();
-
-#if 0	
-	if (dump_config)
-		dumprmconf ();
-#endif
-
-	/* 
-	 * init_myaddr() ?
-	 * If running in privilege separation, do not reinitialize
-	 * the IKE listener, as we will not have the right to 
-	 * setsockopt(IP_IPSEC_POLICY). 
-	 */
-	if (geteuid() == 0)
-		check_rtsock(NULL);
-
-	/* Revalidate ph1 / ph2tree !!!
-	 * update ctdtree if removing some ph1 !
-	 */
-	revalidate_ph12();
-	/* Update ctdtree ?
-	 */
-
-	save_sainfotree_flush();
-	save_rmconf_flush();
-}
-
-static void
-check_sigreq()
-{
-	int sig;
-
-	/* 
-	 * XXX We are not able to tell if we got 
-	 * several time the same signal. This is
-	 * not a problem for the current code, 
-	 * but we shall remember this limitation.
-	 */
-	for (sig = 0; sig <= NSIG; sig++) {
-		if (sigreq[sig] == 0)
-			continue;
-
-		sigreq[sig]--;
-		switch(sig) {
-		case 0:
-			return;
-			
-			/* Catch up childs, mainly scripts.
-			 */
-		case SIGCHLD:
-	    {
-			pid_t pid;
-			int s;
-			
-			pid = wait(&s);
-	    }
-		break;
-
-#ifdef DEBUG_RECORD_MALLOCATION
-		/* 
-		 * XXX This operation is signal handler unsafe and may lead to 
-		 * crashes and security breaches: See Henning Brauer talk at
-		 * EuroBSDCon 2005. Do not run in production with this option
-		 * enabled.
-		 */
-		case SIGUSR2:
-			DRM_dump();
-			break;
-#endif
-
-		case SIGHUP:
-			/* Save old configuration, load new one...  */
-			reload_conf();
-			break;
-
-		case SIGINT:
-		case SIGTERM:			
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "caught signal %d\n", sig);
-			EVT_PUSH(NULL, NULL, EVTT_RACOON_QUIT, NULL);
-			pfkey_send_flush(lcconf->sock_pfkey, 
-			    SADB_SATYPE_UNSPEC);
-#ifdef ENABLE_FASTQUIT
-			close_session();
-#else
-			sched_new(1, check_flushsa_stub, NULL);
-#endif
-			dying = 1;
-			break;
-
-		default:
-			plog(LLV_INFO, LOCATION, NULL, 
-			    "caught signal %d\n", sig);
-			break;
-		}
-	}
-}
-
-/*
- * waiting the termination of processing until sending DELETE message
- * for all inbound SA will complete.
- */
-static void
-check_flushsa_stub(p)
-	void *p;
-{
-
-	check_flushsa();
-}
-
-static void
-check_flushsa()
-{
-	vchar_t *buf;
-	struct sadb_msg *msg, *end, *next;
-	struct sadb_sa *sa;
-	caddr_t mhp[SADB_EXT_MAX + 1];
-	int n;
-
-	buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
-	if (buf == NULL) {
-		plog(LLV_DEBUG, LOCATION, NULL,
-		    "pfkey_dump_sadb: returned nothing.\n");
-		return;
-	}
-
-	msg = (struct sadb_msg *)buf->v;
-	end = (struct sadb_msg *)(buf->v + buf->l);
-
-	/* counting SA except of dead one. */
-	n = 0;
-	while (msg < end) {
-		if (PFKEY_UNUNIT64(msg->sadb_msg_len) < sizeof(*msg))
-			break;
-		next = (struct sadb_msg *)((caddr_t)msg + PFKEY_UNUNIT64(msg->sadb_msg_len));
-		if (msg->sadb_msg_type != SADB_DUMP) {
-			msg = next;
-			continue;
-		}
-
-		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"pfkey_check (%s)\n", ipsec_strerror());
-			msg = next;
-			continue;
-		}
-
-		sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
-		if (!sa) {
-			msg = next;
-			continue;
-		}
-
-		if (sa->sadb_sa_state != SADB_SASTATE_DEAD) {
-			n++;
-			msg = next;
-			continue;
-		}
-
-		msg = next;
-	}
-
-	if (buf != NULL)
-		vfree(buf);
-
-	if (n) {
-		sched_new(1, check_flushsa_stub, NULL);
-		return;
-	}
-
-	close_session();
-}
-
-static void
-init_signal()
-{
-	int i;
-
-	for (i = 0; signals[i] != 0; i++)
-		if (set_signal(signals[i], signal_handler) < 0) {
-			plog(LLV_ERROR, LOCATION, NULL,
-				"failed to set_signal (%s)\n",
-				strerror(errno));
-			exit(1);
-		}
-}
-
-static int
-set_signal(sig, func)
-	int sig;
-	RETSIGTYPE (*func) __P((int));
-{
-	struct sigaction sa;
-
-	memset((caddr_t)&sa, 0, sizeof(sa));
-	sa.sa_handler = func;
-	sa.sa_flags = SA_RESTART;
-
-	if (sigemptyset(&sa.sa_mask) < 0)
-		return -1;
-
-	if (sigaction(sig, &sa, (struct sigaction *)0) < 0)
-		return(-1);
-
-	return 0;
-}
-
-static int
-close_sockets()
-{
-	isakmp_close();
-	pfkey_close(lcconf->sock_pfkey);
-#ifdef ENABLE_ADMINPORT
-	(void)admin_close();
-#endif
-	return 0;
-}
-
diff --git a/src/racoon/session.h b/src/racoon/session.h
deleted file mode 100644
index 58799ee..0000000
--- a/src/racoon/session.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*	$NetBSD: session.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: session.h,v 1.3 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SESSION_H
-#define _SESSION_H
-
-extern int session __P((void));
-extern RETSIGTYPE signal_handler __P((int));
-
-#endif /* _SESSION_H */
diff --git a/src/racoon/sockmisc.c b/src/racoon/sockmisc.c
deleted file mode 100644
index 4dd7cf1..0000000
--- a/src/racoon/sockmisc.c
+++ /dev/null
@@ -1,1197 +0,0 @@
-/*	$NetBSD: sockmisc.c,v 1.8.6.1 2007/08/01 11:52:22 vanhu Exp $	*/
-
-/* Id: sockmisc.c,v 1.24 2006/05/07 21:32:59 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-
-#include <netinet/in.h>
-#include PATH_IPSEC_H
-
-#if defined(INET6) && !defined(INET6_ADVAPI) && \
-	defined(IP_RECVDSTADDR) && !defined(IPV6_RECVDSTADDR)
-#define IPV6_RECVDSTADDR IP_RECVDSTADDR
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "plog.h"
-#include "sockmisc.h"
-#include "debug.h"
-#include "gcmalloc.h"
-#include "debugrm.h"
-#include "libpfkey.h"
-
-#ifdef ANDROID_CHANGES
-#include "NetdClient.h"
-#endif
-
-#ifndef IP_IPSEC_POLICY
-#define IP_IPSEC_POLICY 16	/* XXX: from linux/in.h */
-#endif
-
-#ifndef IPV6_IPSEC_POLICY
-#define IPV6_IPSEC_POLICY 34	/* XXX: from linux/???.h per
-				   "Tom Lendacky" <toml@us.ibm.com> */
-#endif
-
-const int niflags = 0;
-
-/*
- * compare two sockaddr without port number.
- * OUT:	0: equal.
- *	1: not equal.
- */
-int
-cmpsaddrwop(addr1, addr2)
-	const struct sockaddr *addr1;
-	const struct sockaddr *addr2;
-{
-	caddr_t sa1, sa2;
-
-	if (addr1 == 0 && addr2 == 0)
-		return 0;
-	if (addr1 == 0 || addr2 == 0)
-		return 1;
-
-#ifdef __linux__
-	if (addr1->sa_family != addr2->sa_family)
-		return 1;
-#else
-	if (addr1->sa_len != addr2->sa_len
-	 || addr1->sa_family != addr2->sa_family)
-		return 1;
-
-#endif /* __linux__ */
-
-	switch (addr1->sa_family) {
-	case AF_INET:
-		sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
-		if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
-			return 1;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
-		if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
-			return 1;
-		if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
-		    ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
-			return 1;
-		break;
-#endif
-	default:
-		return 1;
-	}
-
-	return 0;
-}
-
-/*
- * compare two sockaddr with port, taking care wildcard.
- * addr1 is a subject address, addr2 is in a database entry.
- * OUT:	0: equal.
- *	1: not equal.
- */
-int
-cmpsaddrwild(addr1, addr2)
-	const struct sockaddr *addr1;
-	const struct sockaddr *addr2;
-{
-	caddr_t sa1, sa2;
-	u_short port1, port2;
-
-	if (addr1 == 0 && addr2 == 0)
-		return 0;
-	if (addr1 == 0 || addr2 == 0)
-		return 1;
-
-#ifdef __linux__
-	if (addr1->sa_family != addr2->sa_family)
-		return 1;
-#else
-	if (addr1->sa_len != addr2->sa_len
-	 || addr1->sa_family != addr2->sa_family)
-		return 1;
-
-#endif /* __linux__ */
-
-	switch (addr1->sa_family) {
-	case AF_INET:
-		sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
-		port1 = ((struct sockaddr_in *)addr1)->sin_port;
-		port2 = ((struct sockaddr_in *)addr2)->sin_port;
-		if (!(port1 == IPSEC_PORT_ANY ||
-		      port2 == IPSEC_PORT_ANY ||
-		      port1 == port2))
-			return 1;
-		if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
-			return 1;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
-		port1 = ((struct sockaddr_in6 *)addr1)->sin6_port;
-		port2 = ((struct sockaddr_in6 *)addr2)->sin6_port;
-		if (!(port1 == IPSEC_PORT_ANY ||
-		      port2 == IPSEC_PORT_ANY ||
-		      port1 == port2))
-			return 1;
-		if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
-			return 1;
-		if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
-		    ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
-			return 1;
-		break;
-#endif
-	default:
-		return 1;
-	}
-
-	return 0;
-}
-
-/*
- * compare two sockaddr with strict match on port.
- * OUT:	0: equal.
- *	1: not equal.
- */
-int
-cmpsaddrstrict(addr1, addr2)
-	const struct sockaddr *addr1;
-	const struct sockaddr *addr2;
-{
-	caddr_t sa1, sa2;
-	u_short port1, port2;
-
-	if (addr1 == 0 && addr2 == 0)
-		return 0;
-	if (addr1 == 0 || addr2 == 0)
-		return 1;
-
-#ifdef __linux__
-	if (addr1->sa_family != addr2->sa_family)
-		return 1;
-#else
-	if (addr1->sa_len != addr2->sa_len
-	 || addr1->sa_family != addr2->sa_family)
-		return 1;
-
-#endif /* __linux__ */
-
-	switch (addr1->sa_family) {
-	case AF_INET:
-		sa1 = (caddr_t)&((struct sockaddr_in *)addr1)->sin_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in *)addr2)->sin_addr;
-		port1 = ((struct sockaddr_in *)addr1)->sin_port;
-		port2 = ((struct sockaddr_in *)addr2)->sin_port;
-		if (port1 != port2)
-			return 1;
-		if (memcmp(sa1, sa2, sizeof(struct in_addr)) != 0)
-			return 1;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		sa1 = (caddr_t)&((struct sockaddr_in6 *)addr1)->sin6_addr;
-		sa2 = (caddr_t)&((struct sockaddr_in6 *)addr2)->sin6_addr;
-		port1 = ((struct sockaddr_in6 *)addr1)->sin6_port;
-		port2 = ((struct sockaddr_in6 *)addr2)->sin6_port;
-		if (port1 != port2)
-			return 1;
-		if (memcmp(sa1, sa2, sizeof(struct in6_addr)) != 0)
-			return 1;
-		if (((struct sockaddr_in6 *)addr1)->sin6_scope_id !=
-		    ((struct sockaddr_in6 *)addr2)->sin6_scope_id)
-			return 1;
-		break;
-#endif
-	default:
-		return 1;
-	}
-
-	return 0;
-}
-
-#ifdef ANDROID_PATCHED
-
-struct sockaddr *getlocaladdr(struct sockaddr *remote)
-{
-    struct sockaddr_storage local;
-    socklen_t len = sysdep_sa_len(remote);
-    int s = socket(remote->sa_family, SOCK_DGRAM, 0);
-#ifdef ANDROID_CHANGES
-        protectFromVpn(s);
-#endif
-
-    if (s == -1 || connect(s, remote, len) == -1 ||
-        getsockname(s, (struct sockaddr *)&local, &len) == -1) {
-        close(s);
-        return NULL;
-    }
-    close(s);
-    return dupsaddr((struct sockaddr *)&local);
-}
-
-int recvfromto(int s, void *buf, size_t len, int flags, struct sockaddr *from,
-               socklen_t *fromlen, struct sockaddr *to, unsigned int *tolen)
-{
-    if (getsockname(s, to, (socklen_t *)tolen) == -1) {
-        return -1;
-    }
-    return recvfrom(s, buf, len, flags, from, fromlen);
-}
-
-int sendfromto(int s, const void *buf, size_t len, struct sockaddr *from,
-               struct sockaddr *to, int count)
-{
-    int i;
-    for (i = 0; i < count; ++i) {
-        if (sendto(s, buf, len, 0, to, sysdep_sa_len(to)) == -1) {
-            return -1;
-        }
-    }
-    return len;
-}
-
-int setsockopt_bypass(int s, int family)
-{
-    struct sadb_x_policy p = {
-        .sadb_x_policy_len = PFKEY_UNIT64(sizeof(struct sadb_x_policy)),
-        .sadb_x_policy_exttype = SADB_X_EXT_POLICY,
-        .sadb_x_policy_type = IPSEC_POLICY_BYPASS,
-        .sadb_x_policy_dir = IPSEC_DIR_INBOUND,
-#ifdef HAVE_PFKEY_POLICY_PRIORITY
-        .sadb_x_policy_priority = PRIORITY_DEFAULT,
-#endif
-    };
-    int level = (family == AF_INET) ? IPPROTO_IP : IPPROTO_IPV6;
-    int option = (family == AF_INET) ? IP_IPSEC_POLICY : IPV6_IPSEC_POLICY;
-    int len = PFKEY_EXTLEN(&p);
-    if (setsockopt(s, level, option, &p, len) == -1) {
-        plog(LLV_WARNING, LOCATION, NULL, "setsockopt in bypass: %s\n",
-                strerror(errno));
-    }
-    p.sadb_x_policy_dir = IPSEC_DIR_OUTBOUND;
-    if (setsockopt(s, level, option, &p, len) == -1) {
-        plog(LLV_WARNING, LOCATION, NULL, "setsockopt out bypass: %s\n",
-                strerror(errno));
-    }
-    return 0;
-}
-
-#else
-
-/* get local address against the destination. */
-struct sockaddr *
-getlocaladdr(remote)
-	struct sockaddr *remote;
-{
-	struct sockaddr *local;
-	u_int local_len = sizeof(struct sockaddr_storage);
-	int s;	/* for dummy connection */
-
-	/* allocate buffer */
-	if ((local = racoon_calloc(1, local_len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to get address buffer.\n");
-		goto err;
-	}
-	
-	/* get real interface received packet */
-	if ((s = socket(remote->sa_family, SOCK_DGRAM, 0)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"socket (%s)\n", strerror(errno));
-		goto err;
-	}
-#ifdef ANDROID_CHANGES
-	protectFromVpn(s);
-#endif
-
-	setsockopt_bypass(s, remote->sa_family);
-	
-	if (connect(s, remote, sysdep_sa_len(remote)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"connect (%s)\n", strerror(errno));
-		close(s);
-		goto err;
-	}
-
-	if (getsockname(s, local, &local_len) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getsockname (%s)\n", strerror(errno));
-		close(s);
-		return NULL;
-	}
-
-	close(s);
-	return local;
-
-    err:
-	if (local != NULL)
-		racoon_free(local);
-	return NULL;
-}
-
-/*
- * Receive packet, with src/dst information.  It is assumed that necessary
- * setsockopt() have already performed on socket.
- */
-int
-recvfromto(s, buf, buflen, flags, from, fromlen, to, tolen)
-	int s;
-	void *buf;
-	size_t buflen;
-	int flags;
-	struct sockaddr *from;
-	socklen_t *fromlen;
-	struct sockaddr *to;
-	u_int *tolen;
-{
-	int otolen;
-	u_int len;
-	struct sockaddr_storage ss;
-	struct msghdr m;
-	struct cmsghdr *cm;
-	struct iovec iov[2];
-	u_char cmsgbuf[256];
-#if defined(INET6) && defined(INET6_ADVAPI)
-	struct in6_pktinfo *pi;
-#endif /*INET6_ADVAPI*/
-	struct sockaddr_in *sin;
-#ifdef INET6
-	struct sockaddr_in6 *sin6;
-#endif
-
-	len = sizeof(ss);
-	if (getsockname(s, (struct sockaddr *)&ss, &len) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getsockname (%s)\n", strerror(errno));
-		return -1;
-	}
-
-	m.msg_name = (caddr_t)from;
-	m.msg_namelen = *fromlen;
-	iov[0].iov_base = (caddr_t)buf;
-	iov[0].iov_len = buflen;
-	m.msg_iov = iov;
-	m.msg_iovlen = 1;
-	memset(cmsgbuf, 0, sizeof(cmsgbuf));
-	cm = (struct cmsghdr *)cmsgbuf;
-	m.msg_control = (caddr_t)cm;
-	m.msg_controllen = sizeof(cmsgbuf);
-	if ((len = recvmsg(s, &m, flags)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"recvmsg (%s)\n", strerror(errno));
-		return -1;
-	}
-	*fromlen = m.msg_namelen;
-
-	otolen = *tolen;
-	*tolen = 0;
-	for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(&m);
-	     m.msg_controllen != 0 && cm;
-	     cm = (struct cmsghdr *)CMSG_NXTHDR(&m, cm)) {
-#if 0
-		plog(LLV_ERROR, LOCATION, NULL,
-			"cmsg %d %d\n", cm->cmsg_level, cm->cmsg_type);)
-#endif
-#if defined(INET6) && defined(INET6_ADVAPI)
-		if (ss.ss_family == AF_INET6
-		 && cm->cmsg_level == IPPROTO_IPV6
-		 && cm->cmsg_type == IPV6_PKTINFO
-		 && otolen >= sizeof(*sin6)) {
-			pi = (struct in6_pktinfo *)(CMSG_DATA(cm));
-			*tolen = sizeof(*sin6);
-			sin6 = (struct sockaddr_in6 *)to;
-			memset(sin6, 0, sizeof(*sin6));
-			sin6->sin6_family = AF_INET6;
-#ifndef __linux__
-			sin6->sin6_len = sizeof(*sin6);
-#endif
-			memcpy(&sin6->sin6_addr, &pi->ipi6_addr,
-				sizeof(sin6->sin6_addr));
-			/* XXX other cases, such as site-local? */
-			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
-				sin6->sin6_scope_id = pi->ipi6_ifindex;
-			else
-				sin6->sin6_scope_id = 0;
-			sin6->sin6_port =
-				((struct sockaddr_in6 *)&ss)->sin6_port;
-			otolen = -1;	/* "to" already set */
-			continue;
-		}
-#endif
-#ifdef __linux__
-		if (ss.ss_family == AF_INET
-		 && cm->cmsg_level == IPPROTO_IP
-		 && cm->cmsg_type == IP_PKTINFO
-		 && otolen >= sizeof(sin)) {
-			struct in_pktinfo *pi = (struct in_pktinfo *)(CMSG_DATA(cm));
-			*tolen = sizeof(*sin);
-			sin = (struct sockaddr_in *)to;
-			memset(sin, 0, sizeof(*sin));
-			sin->sin_family = AF_INET;
-			memcpy(&sin->sin_addr, &pi->ipi_addr,
-				sizeof(sin->sin_addr));
-			sin->sin_port =
-				((struct sockaddr_in *)&ss)->sin_port;
-			otolen = -1;	/* "to" already set */
-			continue;
-		}
-#endif
-#if defined(INET6) && defined(IPV6_RECVDSTADDR)
-		if (ss.ss_family == AF_INET6
-		      && cm->cmsg_level == IPPROTO_IPV6
-		      && cm->cmsg_type == IPV6_RECVDSTADDR
-		      && otolen >= sizeof(*sin6)) {
-			*tolen = sizeof(*sin6);
-			sin6 = (struct sockaddr_in6 *)to;
-			memset(sin6, 0, sizeof(*sin6));
-			sin6->sin6_family = AF_INET6;
-			sin6->sin6_len = sizeof(*sin6);
-			memcpy(&sin6->sin6_addr, CMSG_DATA(cm),
-				sizeof(sin6->sin6_addr));
-			sin6->sin6_port =
-				((struct sockaddr_in6 *)&ss)->sin6_port;
-			otolen = -1;	/* "to" already set */
-			continue;
-		}
-#endif
-#ifndef __linux__
-		if (ss.ss_family == AF_INET
-		 && cm->cmsg_level == IPPROTO_IP
-		 && cm->cmsg_type == IP_RECVDSTADDR
-		 && otolen >= sizeof(*sin)) {
-			*tolen = sizeof(*sin);
-			sin = (struct sockaddr_in *)to;
-			memset(sin, 0, sizeof(*sin));
-			sin->sin_family = AF_INET;
-			sin->sin_len = sizeof(*sin);
-			memcpy(&sin->sin_addr, CMSG_DATA(cm),
-				sizeof(sin->sin_addr));
-			sin->sin_port = ((struct sockaddr_in *)&ss)->sin_port;
-			otolen = -1;	/* "to" already set */
-			continue;
-		}
-#endif
-	}
-
-	return len;
-}
-
-/* send packet, with fixing src/dst address pair. */
-int
-sendfromto(s, buf, buflen, src, dst, cnt)
-	int s, cnt;
-	const void *buf;
-	size_t buflen;
-	struct sockaddr *src;
-	struct sockaddr *dst;
-{
-	struct sockaddr_storage ss;
-	u_int len;
-	int i;
-
-	if (src->sa_family != dst->sa_family) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"address family mismatch\n");
-		return -1;
-	}
-
-	len = sizeof(ss);
-	if (getsockname(s, (struct sockaddr *)&ss, &len) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getsockname (%s)\n", strerror(errno));
-		return -1;
-	}
-
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"sockname %s\n", saddr2str((struct sockaddr *)&ss));
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"send packet from %s\n", saddr2str(src));
-	plog(LLV_DEBUG, LOCATION, NULL,
-		"send packet to %s\n", saddr2str(dst));
-
-	if (src->sa_family != ss.ss_family) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"address family mismatch\n");
-		return -1;
-	}
-
-	switch (src->sa_family) {
-#if defined(INET6) && defined(INET6_ADVAPI)
-// XXX: This block wasn't compiled on Linux - does it work?
-	case AF_INET6:
-	    {
-		struct msghdr m;
-		struct cmsghdr *cm;
-		struct iovec iov[2];
-		u_char cmsgbuf[256];
-		struct in6_pktinfo *pi;
-		int ifindex;
-		struct sockaddr_in6 src6, dst6;
-
-		memcpy(&src6, src, sizeof(src6));
-		memcpy(&dst6, dst, sizeof(dst6));
-
-		/* XXX take care of other cases, such as site-local */
-		ifindex = 0;
-		if (IN6_IS_ADDR_LINKLOCAL(&src6.sin6_addr)
-		 || IN6_IS_ADDR_MULTICAST(&src6.sin6_addr)) {
-			ifindex = src6.sin6_scope_id;	/*???*/
-		}
-
-		/* XXX some sanity check on dst6.sin6_scope_id */
-
-		/* flowinfo for IKE?  mmm, maybe useful but for now make it 0 */
-		src6.sin6_flowinfo = dst6.sin6_flowinfo = 0;
-
-		memset(&m, 0, sizeof(m));
-		m.msg_name = (caddr_t)&dst6;
-		m.msg_namelen = sizeof(dst6);
-		iov[0].iov_base = (char *)buf;
-		iov[0].iov_len = buflen;
-		m.msg_iov = iov;
-		m.msg_iovlen = 1;
-
-		memset(cmsgbuf, 0, sizeof(cmsgbuf));
-		cm = (struct cmsghdr *)cmsgbuf;
-		m.msg_control = (caddr_t)cm;
-		m.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
-
-		cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
-		cm->cmsg_level = IPPROTO_IPV6;
-		cm->cmsg_type = IPV6_PKTINFO;
-		pi = (struct in6_pktinfo *)CMSG_DATA(cm);
-		memcpy(&pi->ipi6_addr, &src6.sin6_addr, sizeof(src6.sin6_addr));
-		pi->ipi6_ifindex = ifindex;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"src6 %s %d\n",
-			saddr2str((struct sockaddr *)&src6),
-			src6.sin6_scope_id);
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"dst6 %s %d\n",
-			saddr2str((struct sockaddr *)&dst6),
-			dst6.sin6_scope_id);
-
-		for (i = 0; i < cnt; i++) {
-			len = sendmsg(s, &m, 0 /*MSG_DONTROUTE*/);
-			if (len < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"sendmsg (%s)\n", strerror(errno));
-				return -1;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"%d times of %d bytes message will be sent "
-				"to %s\n",
-				i + 1, len, saddr2str(dst));
-		}
-		plogdump(LLV_DEBUG, (char *)buf, buflen);
-
-		return len;
-	    }
-#endif
-#ifdef __linux__
-	case AF_INET:
-	    {
-		struct msghdr m;
-		struct cmsghdr *cm;
-		struct iovec iov[2];
-		u_char cmsgbuf[256];
-		struct in_pktinfo *pi;
-		int ifindex = 0;
-		struct sockaddr_in src6, dst6;
-
-		memcpy(&src6, src, sizeof(src6));
-		memcpy(&dst6, dst, sizeof(dst6));
-
-		memset(&m, 0, sizeof(m));
-		m.msg_name = (caddr_t)&dst6;
-		m.msg_namelen = sizeof(dst6);
-		iov[0].iov_base = (char *)buf;
-		iov[0].iov_len = buflen;
-		m.msg_iov = iov;
-		m.msg_iovlen = 1;
-
-		memset(cmsgbuf, 0, sizeof(cmsgbuf));
-		cm = (struct cmsghdr *)cmsgbuf;
-		m.msg_control = (caddr_t)cm;
-		m.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
-
-		cm->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
-		cm->cmsg_level = IPPROTO_IP;
-		cm->cmsg_type = IP_PKTINFO;
-		pi = (struct in_pktinfo *)CMSG_DATA(cm);
-		memcpy(&pi->ipi_spec_dst, &src6.sin_addr, sizeof(src6.sin_addr));
-		pi->ipi_ifindex = ifindex;
-
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"src4 %s\n",
-			saddr2str((struct sockaddr *)&src6));
-		plog(LLV_DEBUG, LOCATION, NULL,
-			"dst4 %s\n",
-			saddr2str((struct sockaddr *)&dst6));
-
-		for (i = 0; i < cnt; i++) {
-			len = sendmsg(s, &m, 0 /*MSG_DONTROUTE*/);
-			if (len < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"sendmsg (%s)\n", strerror(errno));
-				return -1;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"%d times of %d bytes message will be sent "
-				"to %s\n",
-				i + 1, len, saddr2str(dst));
-		}
-		plogdump(LLV_DEBUG, (char *)buf, buflen);
-
-		return len;
-	    }
-#endif /* __linux__ */
-	default:
-	    {
-		int needclose = 0;
-		int sendsock;
-
-		if (ss.ss_family == src->sa_family && memcmp(&ss, src, sysdep_sa_len(src)) == 0) {
-			sendsock = s;
-			needclose = 0;
-		} else {
-			int yes = 1;
-			/*
-			 * Use newly opened socket for sending packets.
-			 * NOTE: this is unsafe, because if the peer is quick enough
-			 * the packet from the peer may be queued into sendsock.
-			 * Better approach is to prepare bind'ed udp sockets for
-			 * each of the interface addresses.
-			 */
-			sendsock = socket(src->sa_family, SOCK_DGRAM, 0);
-			if (sendsock < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"socket (%s)\n", strerror(errno));
-				return -1;
-			}
-#ifdef ANDROID_CHANGES
-			protectFromVpn(sendsock);
-#endif
-
-			if (setsockopt(sendsock, SOL_SOCKET,
-#ifdef __linux__
-				       SO_REUSEADDR,
-#else
-				       SO_REUSEPORT,
-#endif
-				       (void *)&yes, sizeof(yes)) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"setsockopt SO_REUSEPORT (%s)\n", 
-					strerror(errno));
-				close(sendsock);
-				return -1;
-			}
-#ifdef IPV6_USE_MIN_MTU
-			if (src->sa_family == AF_INET6 &&
-			    setsockopt(sendsock, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
-			    (void *)&yes, sizeof(yes)) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"setsockopt IPV6_USE_MIN_MTU (%s)\n", 
-					strerror(errno));
-				close(sendsock);
-				return -1;
-			}
-#endif
-			if (setsockopt_bypass(sendsock, src->sa_family) < 0) {
-				close(sendsock);
-				return -1;
-			}
-
-			if (bind(sendsock, (struct sockaddr *)src, sysdep_sa_len(src)) < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"bind 1 (%s)\n", strerror(errno));
-				close(sendsock);
-				return -1;
-			}
-			needclose = 1;
-		}
-
-		for (i = 0; i < cnt; i++) {
-			len = sendto(sendsock, buf, buflen, 0, dst, sysdep_sa_len(dst));
-			if (len < 0) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"sendto (%s)\n", strerror(errno));
-				if (needclose)
-					close(sendsock);
-				return len;
-			}
-			plog(LLV_DEBUG, LOCATION, NULL,
-				"%d times of %d bytes message will be sent "
-				"to %s\n",
-				i + 1, len, saddr2str(dst));
-		}
-		plogdump(LLV_DEBUG, (char *)buf, buflen);
-
-		if (needclose)
-			close(sendsock);
-
-		return len;
-	    }
-	}
-}
-
-int
-setsockopt_bypass(so, family)
-	int so, family;
-{
-	int level;
-	char *buf;
-	char *policy;
-
-	switch (family) {
-	case AF_INET:
-		level = IPPROTO_IP;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		level = IPPROTO_IPV6;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unsupported address family %d\n", family);
-		return -1;
-	}
-
-	policy = "in bypass";
-	buf = ipsec_set_policy(policy, strlen(policy));
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ipsec_set_policy (%s)\n",
-			ipsec_strerror());
-		return -1;
-	}
-	if (setsockopt(so, level,
-	               (level == IPPROTO_IP ?
-	                         IP_IPSEC_POLICY : IPV6_IPSEC_POLICY),
-	               buf, ipsec_get_policylen(buf)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"setsockopt IP_IPSEC_POLICY (%s)\n",
-			strerror(errno));
-		return -1;
-	}
-	racoon_free(buf);
-
-	policy = "out bypass";
-	buf = ipsec_set_policy(policy, strlen(policy));
-	if (buf == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"ipsec_set_policy (%s)\n",
-			ipsec_strerror());
-		return -1;
-	}
-	if (setsockopt(so, level,
-	               (level == IPPROTO_IP ?
-	                         IP_IPSEC_POLICY : IPV6_IPSEC_POLICY),
-	               buf, ipsec_get_policylen(buf)) < 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"setsockopt IP_IPSEC_POLICY (%s)\n",
-			strerror(errno));
-		return -1;
-	}
-	racoon_free(buf);
-
-	return 0;
-}
-
-struct sockaddr *
-newsaddr(len)
-	int len;
-{
-	struct sockaddr *new;
-
-	if ((new = racoon_calloc(1, len)) == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"%s\n", strerror(errno)); 
-		goto out;
-	}
-
-#ifdef __linux__
-	if (len == sizeof (struct sockaddr_in6))
-		new->sa_family = AF_INET6;
-	else
-		new->sa_family = AF_INET;
-#else
-	/* initial */
-	new->sa_len = len;
-#endif
-out:
-	return new;
-}
-
-#endif
-
-struct sockaddr *
-dupsaddr(src)
-	struct sockaddr *src;
-{
-	struct sockaddr *dst;
-
-	dst = racoon_calloc(1, sysdep_sa_len(src));
-	if (dst == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"%s\n", strerror(errno)); 
-		return NULL;
-	}
-
-	memcpy(dst, src, sysdep_sa_len(src));
-
-	return dst;
-}
-
-char *
-saddr2str(saddr)
-	const struct sockaddr *saddr;
-{
-	static char buf[NI_MAXHOST + NI_MAXSERV + 10];
-	char addr[NI_MAXHOST], port[NI_MAXSERV];
-
-	if (saddr == NULL)
-		return NULL;
-
-	if (saddr->sa_family == AF_UNSPEC)
-		snprintf (buf, sizeof(buf), "%s", "anonymous");
-	else {
-		GETNAMEINFO(saddr, addr, port);
-		snprintf(buf, sizeof(buf), "%s[%s]", addr, port);
-	}
-
-	return buf;
-}
-
-char *
-saddrwop2str(saddr)
-	const struct sockaddr *saddr;
-{
-	static char buf[NI_MAXHOST + NI_MAXSERV + 10];
-	char addr[NI_MAXHOST];
-
-	if (saddr == NULL)
-		return NULL;
-
-	GETNAMEINFO_NULL(saddr, addr);
-	snprintf(buf, sizeof(buf), "%s", addr);
-
-	return buf;
-}
-
-char *
-naddrwop2str(const struct netaddr *naddr)
-{
-	static char buf[NI_MAXHOST + 10];
-	static const struct sockaddr sa_any;	/* this is initialized to all zeros */
-	
-	if (naddr == NULL)
-		return NULL;
-
-	if (memcmp(&naddr->sa, &sa_any, sizeof(sa_any)) == 0)
-		snprintf(buf, sizeof(buf), "%s", "any");
-	else {
-		snprintf(buf, sizeof(buf), "%s", saddrwop2str(&naddr->sa.sa));
-		snprintf(&buf[strlen(buf)], sizeof(buf) - strlen(buf), "/%ld", naddr->prefix);
-	}
-	return buf;
-}
-
-char *
-naddrwop2str_fromto(const char *format, const struct netaddr *saddr,
-		    const struct netaddr *daddr)
-{
-	static char buf[2*(NI_MAXHOST + NI_MAXSERV + 10) + 100];
-	char *src, *dst;
-
-	src = racoon_strdup(naddrwop2str(saddr));
-	dst = racoon_strdup(naddrwop2str(daddr));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-	/* WARNING: Be careful about the format string! Don't 
-	   ever pass in something that a user can modify!!! */
-	snprintf (buf, sizeof(buf), format, src, dst);
-	racoon_free (src);
-	racoon_free (dst);
-
-	return buf;
-}
-
-char *
-saddr2str_fromto(format, saddr, daddr)
-	const char *format;
-	const struct sockaddr *saddr;
-	const struct sockaddr *daddr;
-{
-	static char buf[2*(NI_MAXHOST + NI_MAXSERV + 10) + 100];
-	char *src, *dst;
-
-	src = racoon_strdup(saddr2str(saddr));
-	dst = racoon_strdup(saddr2str(daddr));
-	STRDUP_FATAL(src);
-	STRDUP_FATAL(dst);
-	/* WARNING: Be careful about the format string! Don't 
-	   ever pass in something that a user can modify!!! */
-	snprintf (buf, sizeof(buf), format, src, dst);
-	racoon_free (src);
-	racoon_free (dst);
-
-	return buf;
-}
-
-struct sockaddr *
-str2saddr(host, port)
-	char *host;
-	char *port;
-{
-	struct addrinfo hints, *res;
-	struct sockaddr *saddr;
-	int error;
-
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = PF_UNSPEC;
-	hints.ai_socktype = SOCK_DGRAM;
-	hints.ai_flags = AI_NUMERICHOST;
-	error = getaddrinfo(host, port, &hints, &res);
-	if (error != 0) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"getaddrinfo(%s%s%s): %s\n",
-			host, port ? "," : "", port ? port : "",
-			gai_strerror(error));
-		return NULL;
-	}
-	if (res->ai_next != NULL) {
-		plog(LLV_WARNING, LOCATION, NULL,
-			"getaddrinfo(%s%s%s): "
-			"resolved to multiple address, "
-			"taking the first one\n",
-			host, port ? "," : "", port ? port : "");
-	}
-	saddr = racoon_malloc(res->ai_addrlen);
-	if (saddr == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"failed to allocate buffer.\n");
-		freeaddrinfo(res);
-		return NULL;
-	}
-	memcpy(saddr, res->ai_addr, res->ai_addrlen);
-	freeaddrinfo(res);
-
-	return saddr;
-}
-
-void
-mask_sockaddr(a, b, l)
-	struct sockaddr *a;
-	const struct sockaddr *b;
-	size_t l;
-{
-	size_t i;
-	u_int8_t *p, alen;
-
-	switch (b->sa_family) {
-	case AF_INET:
-		alen = sizeof(struct in_addr);
-		p = (u_int8_t *)&((struct sockaddr_in *)a)->sin_addr;
-		break;
-#ifdef INET6
-	case AF_INET6:
-		alen = sizeof(struct in6_addr);
-		p = (u_int8_t *)&((struct sockaddr_in6 *)a)->sin6_addr;
-		break;
-#endif
-	default:
-		plog(LLV_ERROR, LOCATION, NULL,
-			"invalid family: %d\n", b->sa_family);
-		exit(1);
-	}
-
-	if ((alen << 3) < l) {
-		plog(LLV_ERROR, LOCATION, NULL,
-			"unexpected inconsistency: %d %zu\n", b->sa_family, l);
-		exit(1);
-	}
-
-	memcpy(a, b, sysdep_sa_len(b));
-	p[l / 8] &= (0xff00 >> (l % 8)) & 0xff;
-	for (i = l / 8 + 1; i < alen; i++)
-		p[i] = 0x00;
-}
-
-/* Compute a score describing how "accurate" a netaddr is for a given sockaddr.
- * Examples:
- * 	Return values for address 10.20.30.40 [port 500] and given netaddresses...
- * 		10.10.0.0/16	=> -1	... doesn't match
- * 		0.0.0.0/0	=> 0	... matches, but only 0 bits.
- * 		10.20.0.0/16	=> 16	... 16 bits match
- * 		10.20.30.0/24	=> 24	... guess what ;-)
- * 		10.20.30.40/32	=> 32	... whole address match
- * 		10.20.30.40:500	=> 33	... both address and port match
- * 		10.20.30.40:501	=> -1	... port doesn't match and isn't 0 (=any)
- */
-int
-naddr_score(const struct netaddr *naddr, const struct sockaddr *saddr)
-{
-	static const struct netaddr naddr_any;	/* initialized to all-zeros */
-	struct sockaddr sa;
-	u_int16_t naddr_port, saddr_port;
-	int port_score;
-
-	if (!naddr || !saddr) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		     "Call with null args: naddr=%p, saddr=%p\n",
-		     naddr, saddr);
-		return -1;
-	}
-
-	/* Wildcard address matches, but only 0 bits. */
-	if (memcmp(naddr, &naddr_any, sizeof(naddr_any)) == 0)
-		return 0;
-
-	/* If families don't match we really can't do much... */
-	if (naddr->sa.sa.sa_family != saddr->sa_family)
-		return -1;
-	
-	/* If port check fail don't bother to check addresses. */
-	naddr_port = extract_port(&naddr->sa.sa);
-	saddr_port = extract_port(saddr);
-	if (naddr_port == 0 || saddr_port == 0)	/* wildcard match */
-		port_score = 0;
-	else if (naddr_port == saddr_port)	/* exact match */
-		port_score = 1;
-	else					/* mismatch :-) */
-		return -1;
-
-	/* Here it comes - compare network addresses. */
-	mask_sockaddr(&sa, saddr, naddr->prefix);
-	if (loglevel >= LLV_DEBUG) {	/* debug only */
-		char *a1, *a2, *a3;
-		a1 = racoon_strdup(naddrwop2str(naddr));
-		a2 = racoon_strdup(saddrwop2str(saddr));
-		a3 = racoon_strdup(saddrwop2str(&sa));
-		STRDUP_FATAL(a1);
-		STRDUP_FATAL(a2);
-		STRDUP_FATAL(a3);
-		plog(LLV_DEBUG, LOCATION, NULL,
-		     "naddr=%s, saddr=%s (masked=%s)\n",
-		     a1, a2, a3);
-		free(a1);
-		free(a2);
-		free(a3);
-	}
-	if (cmpsaddrwop(&sa, &naddr->sa.sa) == 0)
-		return naddr->prefix + port_score;
-
-	return -1;
-}
-
-/* Some usefull functions for sockaddr port manipulations. */
-u_int16_t
-extract_port (const struct sockaddr *addr)
-{
-  u_int16_t port = 0;
-  
-  if (!addr)
-    return port;
-
-  switch (addr->sa_family) {
-    case AF_INET:
-      port = ((struct sockaddr_in *)addr)->sin_port;
-      break;
-    case AF_INET6:
-      port = ((struct sockaddr_in6 *)addr)->sin6_port;
-      break;
-    default:
-      plog(LLV_ERROR, LOCATION, NULL, "unknown AF: %u\n", addr->sa_family);
-      break;
-  }
-
-  return ntohs(port);
-}
-
-u_int16_t *
-get_port_ptr (struct sockaddr *addr)
-{
-  u_int16_t *port_ptr;
-
-  if (!addr)
-    return NULL;
-
-  switch (addr->sa_family) {
-    case AF_INET:
-      port_ptr = &(((struct sockaddr_in *)addr)->sin_port);
-      break;
-    case AF_INET6:
-      port_ptr = &(((struct sockaddr_in6 *)addr)->sin6_port);
-      break;
-    default:
-      plog(LLV_ERROR, LOCATION, NULL, "unknown AF: %u\n", addr->sa_family);
-      return NULL;
-      break;
-  }
-
-  return port_ptr;
-}
-
-u_int16_t *
-set_port (struct sockaddr *addr, u_int16_t new_port)
-{
-  u_int16_t *port_ptr;
-
-  port_ptr = get_port_ptr (addr);
-
-  if (port_ptr)
-    *port_ptr = htons(new_port);
-
-  return port_ptr;
-}
diff --git a/src/racoon/sockmisc.h b/src/racoon/sockmisc.h
deleted file mode 100644
index a035dec..0000000
--- a/src/racoon/sockmisc.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*	$NetBSD: sockmisc.h,v 1.7 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: sockmisc.h,v 1.9 2005/10/05 16:55:41 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _SOCKMISC_H
-#define _SOCKMISC_H
-
-struct netaddr {
-	union {
-		struct sockaddr sa;
-		struct sockaddr_in sin;
-		struct sockaddr_in6 sin6;
-	} sa;
-	unsigned long prefix;
-};
-
-extern const int niflags;
-
-extern int cmpsaddrwop __P((const struct sockaddr *, const struct sockaddr *));
-extern int cmpsaddrwild __P((const struct sockaddr *, const struct sockaddr *));
-extern int cmpsaddrstrict __P((const struct sockaddr *, const struct sockaddr *));
-
-#ifdef ENABLE_NATT 
-#define CMPSADDR(saddr1, saddr2) cmpsaddrstrict((saddr1), (saddr2))
-#else 
-#define CMPSADDR(saddr1, saddr2) cmpsaddrwop((saddr1), (saddr2))
-#endif
-
-extern struct sockaddr *getlocaladdr __P((struct sockaddr *));
-
-extern int recvfromto __P((int, void *, size_t, int,
-	struct sockaddr *, socklen_t *, struct sockaddr *, unsigned int *));
-extern int sendfromto __P((int, const void *, size_t,
-	struct sockaddr *, struct sockaddr *, int));
-
-extern int setsockopt_bypass __P((int, int));
-
-extern struct sockaddr *newsaddr __P((int));
-extern struct sockaddr *dupsaddr __P((struct sockaddr *));
-extern char *saddr2str __P((const struct sockaddr *));
-extern char *saddrwop2str __P((const struct sockaddr *));
-extern char *saddr2str_fromto __P((const char *format, 
-				   const struct sockaddr *saddr, 
-				   const struct sockaddr *daddr));
-extern struct sockaddr *str2saddr __P((char *, char *));
-extern void mask_sockaddr __P((struct sockaddr *, const struct sockaddr *,
-	size_t));
-
-/* struct netaddr functions */
-extern char *naddrwop2str __P((const struct netaddr *naddr));
-extern char *naddrwop2str_fromto __P((const char *format, const struct netaddr *saddr,
-				      const struct netaddr *daddr));
-extern int naddr_score(const struct netaddr *naddr, const struct sockaddr *saddr);
-
-/* Some usefull functions for sockaddr port manipulations. */
-extern u_int16_t extract_port __P((const struct sockaddr *addr));
-extern u_int16_t *set_port __P((struct sockaddr *addr, u_int16_t new_port));
-extern u_int16_t *get_port_ptr __P((struct sockaddr *addr));
-
-#endif /* _SOCKMISC_H */
diff --git a/src/racoon/stats.pl b/src/racoon/stats.pl
deleted file mode 100644
index f509512..0000000
--- a/src/racoon/stats.pl
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/perl
-# usage:
-# % cat /var/log/racoon-stats.log | perl stats.pl
-
-while(<STDIN>) {
-	chomp;
-	($a, $a, $a, $a, $a, $b) = split(/\s+/, $_, 6);
-	($a, $c) = split(/:/, $b, 2);
-	$r{$a} += $c;
-	$t{$a}++;
-}
-
-foreach (sort keys %t) {
-	printf "%s: total=%d avg=%8.6f\n", $_, $t{$_}, $r{$_}/$t{$_};
-}
diff --git a/src/racoon/str2val.c b/src/racoon/str2val.c
deleted file mode 100644
index 62d38a6..0000000
--- a/src/racoon/str2val.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*	$NetBSD: str2val.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/*	$KAME: str2val.c,v 1.11 2001/08/16 14:37:29 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <ctype.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "str2val.h"
-#include "gcmalloc.h"
-
-/*
- * exchange a value to a hex string.
- * must free buffer allocated later.
- */
-caddr_t
-val2str(buf, mlen)
-	const char *buf;
-	size_t mlen;
-{
-	caddr_t new;
-	size_t len = (mlen * 2) + mlen / 8 + 10;
-	size_t i, j;
-
-	if ((new = racoon_malloc(len)) == 0) return(0);
-
-	for (i = 0, j = 0; i < mlen; i++) {
-		snprintf(&new[j], len - j, "%02x", (u_char)buf[i]);
-		j += 2;
-		if (i % 8 == 7) {
-			new[j++] = ' ';
-			new[j] = '\0';
-		}
-	}
-	new[j] = '\0';
-
-	return(new);
-}
-
-/*
- * exchange a string based "base" to a value.
- */
-char *
-str2val(str, base, len)
-	const char *str;
-	int base;
-	size_t *len;
-{
-	int f;
-	size_t i;
-	char *dst;
-	char *rp;
-	const char *p;
-	char b[3];
-
-	i = 0;
-	for (p = str; *p != '\0'; p++) {
-		if (isxdigit((int)*p))
-			i++;
-		else if (isspace((int)*p))
-			;
-		else
-			return NULL;
-	}
-	if (i == 0 || (i % 2) != 0)
-		return NULL;
-	i /= 2;
-
-	if ((dst = racoon_malloc(i)) == NULL)
-		return NULL;
-
-	i = 0;
-	f = 0;
-	for (rp = dst, p = str; *p != '\0'; p++) {
-		if (isxdigit((int)*p)) {
-			if (!f) {
-				b[0] = *p;
-				f = 1;
-			} else {
-				b[1] = *p;
-				b[2] = '\0';
-				*rp++ = (char)strtol(b, NULL, base);
-				i++;
-				f = 0;
-			}
-		}
-	}
-
-	*len = i;
-
-	return(dst);
-}
diff --git a/src/racoon/str2val.h b/src/racoon/str2val.h
deleted file mode 100644
index 4a7cec1..0000000
--- a/src/racoon/str2val.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*	$NetBSD: str2val.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: str2val.h,v 1.3 2004/06/11 16:00:17 ludvigm Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _STR2VAL_H
-#define _STR2VAL_H
-
-extern caddr_t val2str __P((const char *, size_t));
-extern char *str2val __P((const char *, int, size_t *));
-
-#endif /* _STR2VAL_H */
diff --git a/src/racoon/strnames.c b/src/racoon/strnames.c
deleted file mode 100644
index fa5df0f..0000000
--- a/src/racoon/strnames.c
+++ /dev/null
@@ -1,1034 +0,0 @@
-/*	$NetBSD: strnames.c,v 1.7.6.1 2007/08/01 11:52:22 vanhu Exp $	*/
-
-/*	$KAME: strnames.c,v 1.25 2003/11/13 10:53:26 itojun Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h> 
-#include PATH_IPSEC_H
-#include <netinet/in.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef ENABLE_HYBRID
-#include <resolv.h>
-#endif
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-
-#include "isakmp_var.h"
-#include "isakmp.h"
-#ifdef ENABLE_HYBRID
-#  include "isakmp_xauth.h"
-#  include "isakmp_unity.h"
-#  include "isakmp_cfg.h"
-#endif
-#include "ipsec_doi.h"
-#include "oakley.h"
-#include "handler.h"
-#include "pfkey.h"
-#include "strnames.h"
-#include "algorithm.h"
-
-struct ksmap {
-	int key;
-	char *str;
-	char *(*f) __P((int));
-};
-
-char *
-num2str(n)
-	int n;
-{
-	static char buf[20];
-
-	snprintf(buf, sizeof(buf), "%d", n);
-
-	return buf;
-}
-
-/* isakmp.h */
-char *
-s_isakmp_state(t, d, s)
-	int t, d, s;
-{
-	switch (t) {
-	case ISAKMP_ETYPE_AGG:
-		switch (d) {
-		case INITIATOR:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "agg I msg1";
-			case PHASE1ST_ESTABLISHED:
-				return "agg I msg2";
-			default:
-				break;
-			}
-		case RESPONDER:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "agg R msg1";
-			default:
-				break;
-			}
-		}
-		break;
-	case ISAKMP_ETYPE_BASE:
-		switch (d) {
-		case INITIATOR:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "base I msg1";
-			case PHASE1ST_MSG2SENT:
-				return "base I msg2";
-			default:
-				break;
-			}
-		case RESPONDER:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "base R msg1";
-			case PHASE1ST_ESTABLISHED:
-				return "base R msg2";
-			default:
-				break;
-			}
-		}
-		break;
-	case ISAKMP_ETYPE_IDENT:
-		switch (d) {
-		case INITIATOR:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "ident I msg1";
-			case PHASE1ST_MSG2SENT:
-				return "ident I msg2";
-			case PHASE1ST_MSG3SENT:
-				return "ident I msg3";
-			default:
-				break;
-			}
-		case RESPONDER:
-			switch (s) {
-			case PHASE1ST_MSG1SENT:
-				return "ident R msg1";
-			case PHASE1ST_MSG2SENT:
-				return "ident R msg2";
-			case PHASE1ST_ESTABLISHED:
-				return "ident R msg3";
-			default:
-				break;
-			}
-		}
-		break;
-	case ISAKMP_ETYPE_QUICK:
-		switch (d) {
-		case INITIATOR:
-			switch (s) {
-			case PHASE2ST_MSG1SENT:
-				return "quick I msg1";
-			case PHASE2ST_ADDSA:
-				return "quick I msg2";
-			default:
-				break;
-			}
-		case RESPONDER:
-			switch (s) {
-			case PHASE2ST_MSG1SENT:
-				return "quick R msg1";
-			case PHASE2ST_COMMIT:
-				return "quick R msg2";
-			default:
-				break;
-			}
-		}
-		break;
-	default:
-	case ISAKMP_ETYPE_NONE:
-	case ISAKMP_ETYPE_AUTH:
-	case ISAKMP_ETYPE_INFO:
-	case ISAKMP_ETYPE_NEWGRP:
-	case ISAKMP_ETYPE_ACKINFO:
-		break;
-	}
-	/*NOTREACHED*/
-
-	return "???";
-}
-
-static struct ksmap name_isakmp_certtype[] = {
-{ ISAKMP_CERT_NONE,	"NONE",					NULL },
-{ ISAKMP_CERT_PKCS7,	"PKCS #7 wrapped X.509 certificate",	NULL },
-{ ISAKMP_CERT_PGP,	"PGP Certificate",			NULL },
-{ ISAKMP_CERT_DNS,	"DNS Signed Key",			NULL },
-{ ISAKMP_CERT_X509SIGN,	"X.509 Certificate Signature",		NULL },
-{ ISAKMP_CERT_X509KE,	"X.509 Certificate Key Exchange",	NULL },
-{ ISAKMP_CERT_KERBEROS,	"Kerberos Tokens",			NULL },
-{ ISAKMP_CERT_CRL,	"Certificate Revocation List (CRL)",	NULL },
-{ ISAKMP_CERT_ARL,	"Authority Revocation List (ARL)",	NULL },
-{ ISAKMP_CERT_SPKI,	"SPKI Certificate",			NULL },
-{ ISAKMP_CERT_X509ATTR,	"X.509 Certificate Attribute",		NULL },
-};
-
-char *
-s_isakmp_certtype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_certtype); i++)
-		if (name_isakmp_certtype[i].key == k)
-			return name_isakmp_certtype[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_isakmp_etype[] = {
-{ ISAKMP_ETYPE_NONE,	"None",			NULL },
-{ ISAKMP_ETYPE_BASE,	"Base",			NULL },
-{ ISAKMP_ETYPE_IDENT,	"Identity Protection",	NULL },
-{ ISAKMP_ETYPE_AUTH,	"Authentication Only",	NULL },
-{ ISAKMP_ETYPE_AGG,	"Aggressive",		NULL },
-{ ISAKMP_ETYPE_INFO,	"Informational",	NULL },
-{ ISAKMP_ETYPE_CFG,	"Mode config",		NULL },
-{ ISAKMP_ETYPE_QUICK,	"Quick",		NULL },
-{ ISAKMP_ETYPE_NEWGRP,	"New Group",		NULL },
-{ ISAKMP_ETYPE_ACKINFO,	"Acknowledged Informational",	NULL },
-};
-
-char *
-s_isakmp_etype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_etype); i++)
-		if (name_isakmp_etype[i].key == k)
-			return name_isakmp_etype[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_isakmp_notify_msg[] = {
-{ ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE,	"INVALID-PAYLOAD-TYPE",		NULL },
-{ ISAKMP_NTYPE_DOI_NOT_SUPPORTED,	"DOI-NOT-SUPPORTED",		NULL },
-{ ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED,	"SITUATION-NOT-SUPPORTED",	NULL },
-{ ISAKMP_NTYPE_INVALID_COOKIE,		"INVALID-COOKIE",		NULL },
-{ ISAKMP_NTYPE_INVALID_MAJOR_VERSION,	"INVALID-MAJOR-VERSION",	NULL },
-{ ISAKMP_NTYPE_INVALID_MINOR_VERSION,	"INVALID-MINOR-VERSION",	NULL },
-{ ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE,	"INVALID-EXCHANGE-TYPE",	NULL },
-{ ISAKMP_NTYPE_INVALID_FLAGS,		"INVALID-FLAGS",		NULL },
-{ ISAKMP_NTYPE_INVALID_MESSAGE_ID,	"INVALID-MESSAGE-ID",		NULL },
-{ ISAKMP_NTYPE_INVALID_PROTOCOL_ID,	"INVALID-PROTOCOL-ID",		NULL },
-{ ISAKMP_NTYPE_INVALID_SPI,		"INVALID-SPI",			NULL },
-{ ISAKMP_NTYPE_INVALID_TRANSFORM_ID,	"INVALID-TRANSFORM-ID",		NULL },
-{ ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, "ATTRIBUTES-NOT-SUPPORTED",	NULL },
-{ ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN,	"NO-PROPOSAL-CHOSEN",		NULL },
-{ ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX,	"BAD-PROPOSAL-SYNTAX",		NULL },
-{ ISAKMP_NTYPE_PAYLOAD_MALFORMED,	"PAYLOAD-MALFORMED",		NULL },
-{ ISAKMP_NTYPE_INVALID_KEY_INFORMATION,	"INVALID-KEY-INFORMATION",	NULL },
-{ ISAKMP_NTYPE_INVALID_ID_INFORMATION,	"INVALID-ID-INFORMATION",	NULL },
-{ ISAKMP_NTYPE_INVALID_CERT_ENCODING,	"INVALID-CERT-ENCODING",	NULL },
-{ ISAKMP_NTYPE_INVALID_CERTIFICATE,	"INVALID-CERTIFICATE",		NULL },
-{ ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX,	"BAD-CERT-REQUEST-SYNTAX",	NULL },
-{ ISAKMP_NTYPE_INVALID_CERT_AUTHORITY,	"INVALID-CERT-AUTHORITY",	NULL },
-{ ISAKMP_NTYPE_INVALID_HASH_INFORMATION, "INVALID-HASH-INFORMATION",	NULL },
-{ ISAKMP_NTYPE_AUTHENTICATION_FAILED,	"AUTHENTICATION-FAILED",	NULL },
-{ ISAKMP_NTYPE_INVALID_SIGNATURE,	"INVALID-SIGNATURE",		NULL },
-{ ISAKMP_NTYPE_ADDRESS_NOTIFICATION,	"ADDRESS-NOTIFICATION",		NULL },
-{ ISAKMP_NTYPE_NOTIFY_SA_LIFETIME,	"NOTIFY-SA-LIFETIME",		NULL },
-{ ISAKMP_NTYPE_CERTIFICATE_UNAVAILABLE,	"CERTIFICATE-UNAVAILABLE",	NULL },
-{ ISAKMP_NTYPE_UNSUPPORTED_EXCHANGE_TYPE, "UNSUPPORTED-EXCHANGE-TYPE",	NULL },
-{ ISAKMP_NTYPE_UNEQUAL_PAYLOAD_LENGTHS,	"UNEQUAL-PAYLOAD-LENGTHS",	NULL },
-{ ISAKMP_NTYPE_CONNECTED,		"CONNECTED",			NULL },
-{ ISAKMP_NTYPE_RESPONDER_LIFETIME,	"RESPONDER-LIFETIME",		NULL },
-{ ISAKMP_NTYPE_REPLAY_STATUS,		"REPLAY-STATUS",		NULL },
-{ ISAKMP_NTYPE_INITIAL_CONTACT,		"INITIAL-CONTACT",		NULL },
-#ifdef ENABLE_HYBRID
-{ ISAKMP_NTYPE_UNITY_HEARTBEAT,		"HEARTBEAT (Unity)",		NULL },
-#endif
-{ ISAKMP_LOG_RETRY_LIMIT_REACHED,	"RETRY-LIMIT-REACHED",		NULL },
-};
-
-char *
-s_isakmp_notify_msg(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_notify_msg); i++)
-		if (name_isakmp_notify_msg[i].key == k)
-			return name_isakmp_notify_msg[i].str;
-
-	return num2str(k);
-}
-
-static struct ksmap name_isakmp_nptype[] = {
-{ ISAKMP_NPTYPE_NONE,		"none",		NULL },
-{ ISAKMP_NPTYPE_SA,		"sa",		NULL },
-{ ISAKMP_NPTYPE_P,		"prop",		NULL },
-{ ISAKMP_NPTYPE_T,		"trns",		NULL },
-{ ISAKMP_NPTYPE_KE,		"ke",		NULL },
-{ ISAKMP_NPTYPE_ID,		"id",		NULL },
-{ ISAKMP_NPTYPE_CERT,		"cert",		NULL },
-{ ISAKMP_NPTYPE_CR,		"cr",		NULL },
-{ ISAKMP_NPTYPE_HASH,		"hash",		NULL },
-{ ISAKMP_NPTYPE_SIG,		"sig",		NULL },
-{ ISAKMP_NPTYPE_NONCE,		"nonce",	NULL },
-{ ISAKMP_NPTYPE_N,		"notify",	NULL },
-{ ISAKMP_NPTYPE_D,		"delete",	NULL },
-{ ISAKMP_NPTYPE_VID,		"vid",		NULL },
-{ ISAKMP_NPTYPE_ATTR,		"attr",		NULL },
-{ ISAKMP_NPTYPE_GSS,		"gss id",	NULL },
-{ ISAKMP_NPTYPE_NATD_RFC,	"nat-d",	NULL },
-{ ISAKMP_NPTYPE_NATOA_RFC,	"nat-oa",	NULL },
-{ ISAKMP_NPTYPE_NATD_DRAFT,	"nat-d",	NULL },
-{ ISAKMP_NPTYPE_NATOA_DRAFT,	"nat-oa",	NULL },
-{ ISAKMP_NPTYPE_FRAG,		"ike frag",	NULL },
-};
-
-char *
-s_isakmp_nptype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_nptype); i++)
-		if (name_isakmp_nptype[i].key == k)
-			return name_isakmp_nptype[i].str;
-	return num2str(k);
-}
-
-#ifdef ENABLE_HYBRID
-/* isakmp_cfg.h / isakmp_unity.h / isakmp_xauth.h */
-static struct ksmap name_isakmp_cfg_type[] = {
-{ INTERNAL_IP4_ADDRESS,		"INTERNAL_IP4_ADDRESS",		NULL },
-{ INTERNAL_IP4_NETMASK,		"INTERNAL_IP4_NETMASK",		NULL },
-{ INTERNAL_IP4_DNS,		"INTERNAL_IP4_DNS",		NULL },
-{ INTERNAL_IP4_NBNS,		"INTERNAL_IP4_NBNS",		NULL },
-{ INTERNAL_ADDRESS_EXPIRY,	"INTERNAL_ADDRESS_EXPIRY",	NULL },
-{ INTERNAL_IP4_DHCP,		"INTERNAL_IP4_DHCP",		NULL },
-{ APPLICATION_VERSION,		"APPLICATION_VERSION",		NULL },
-{ INTERNAL_IP6_ADDRESS,		"INTERNAL_IP6_ADDRESS",		NULL },
-{ INTERNAL_IP6_NETMASK,		"INTERNAL_IP6_NETMASK",		NULL },
-{ INTERNAL_IP6_DNS,		"INTERNAL_IP6_DNS",		NULL },
-{ INTERNAL_IP6_NBNS,		"INTERNAL_IP6_NBNS",		NULL },
-{ INTERNAL_IP6_DHCP,		"INTERNAL_IP6_DHCP",		NULL },
-{ INTERNAL_IP4_SUBNET,		"INTERNAL_IP4_SUBNET",		NULL },
-{ SUPPORTED_ATTRIBUTES,		"SUPPORTED_ATTRIBUTES",		NULL },
-{ INTERNAL_IP6_SUBNET,		"INTERNAL_IP6_SUBNET",		NULL },
-{ XAUTH_TYPE,			"XAUTH_TYPE",			NULL },
-{ XAUTH_USER_NAME,		"XAUTH_USER_NAME",		NULL },
-{ XAUTH_USER_PASSWORD,		"XAUTH_USER_PASSWORD",		NULL },
-{ XAUTH_PASSCODE,		"XAUTH_PASSCODE",		NULL },
-{ XAUTH_MESSAGE,		"XAUTH_MESSAGE",		NULL },
-{ XAUTH_CHALLENGE,		"XAUTH_CHALLENGE",		NULL },
-{ XAUTH_DOMAIN,			"XAUTH_DOMAIN",			NULL },
-{ XAUTH_STATUS,			"XAUTH_STATUS",			NULL },
-{ XAUTH_NEXT_PIN,		"XAUTH_NEXT_PIN",		NULL },
-{ XAUTH_ANSWER,			"XAUTH_ANSWER",			NULL },
-{ UNITY_BANNER,			"UNITY_BANNER",			NULL },
-{ UNITY_SAVE_PASSWD,		"UNITY_SAVE_PASSWD",		NULL },
-{ UNITY_DEF_DOMAIN,		"UNITY_DEF_DOMAIN",		NULL },
-{ UNITY_SPLITDNS_NAME,		"UNITY_SPLITDNS_NAME",		NULL },
-{ UNITY_SPLIT_INCLUDE,		"UNITY_SPLIT_INCLUDE",		NULL },
-{ UNITY_NATT_PORT,		"UNITY_NATT_PORT",		NULL },
-{ UNITY_LOCAL_LAN,		"UNITY_LOCAL_LAN",		NULL },
-{ UNITY_PFS,			"UNITY_PFS",			NULL },
-{ UNITY_FW_TYPE,		"UNITY_FW_TYPE",		NULL },
-{ UNITY_BACKUP_SERVERS,		"UNITY_BACKUP_SERVERS",		NULL },
-{ UNITY_DDNS_HOSTNAME,		"UNITY_DDNS_HOSTNAME",		NULL },
-};
-
-char *
-s_isakmp_cfg_type(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_cfg_type); i++)
-		if (name_isakmp_cfg_type[i].key == k)
-			return name_isakmp_cfg_type[i].str;
-	return num2str(k);
-}
-
-/* isakmp_cfg.h / isakmp_unity.h / isakmp_xauth.h */
-static struct ksmap name_isakmp_cfg_ptype[] = {
-{ ISAKMP_CFG_ACK,		"mode config ACK",		NULL },
-{ ISAKMP_CFG_SET,		"mode config SET",		NULL },
-{ ISAKMP_CFG_REQUEST,		"mode config REQUEST",		NULL },
-{ ISAKMP_CFG_REPLY,		"mode config REPLY",		NULL },
-};
-
-char *
-s_isakmp_cfg_ptype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_isakmp_cfg_ptype); i++)
-		if (name_isakmp_cfg_ptype[i].key == k)
-			return name_isakmp_cfg_ptype[i].str;
-	return num2str(k);
-}
-
-#endif
-
-/* ipsec_doi.h */
-static struct ksmap name_ipsecdoi_proto[] = {
-{ IPSECDOI_PROTO_ISAKMP,	"ISAKMP",	s_ipsecdoi_trns_isakmp },
-{ IPSECDOI_PROTO_IPSEC_AH,	"AH",		s_ipsecdoi_trns_ah },
-{ IPSECDOI_PROTO_IPSEC_ESP,	"ESP",		s_ipsecdoi_trns_esp },
-{ IPSECDOI_PROTO_IPCOMP,	"IPCOMP",	s_ipsecdoi_trns_ipcomp },
-};
-
-char *
-s_ipsecdoi_proto(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_proto); i++)
-		if (name_ipsecdoi_proto[i].key == k)
-			return name_ipsecdoi_proto[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_ipsecdoi_trns_isakmp[] = {
-{ IPSECDOI_KEY_IKE,	"IKE", NULL },
-};
-
-char *
-s_ipsecdoi_trns_isakmp(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_isakmp); i++)
-		if (name_ipsecdoi_trns_isakmp[i].key == k)
-			return name_ipsecdoi_trns_isakmp[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_ipsecdoi_trns_ah[] = {
-{ IPSECDOI_AH_MD5,	"MD5", NULL },
-{ IPSECDOI_AH_SHA,	"SHA", NULL },
-{ IPSECDOI_AH_DES,	"DES", NULL },
-{ IPSECDOI_AH_SHA256,	"SHA256", NULL },
-{ IPSECDOI_AH_SHA384,	"SHA384", NULL },
-{ IPSECDOI_AH_SHA512,	"SHA512", NULL },
-};
-
-char *
-s_ipsecdoi_trns_ah(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_ah); i++)
-		if (name_ipsecdoi_trns_ah[i].key == k)
-			return name_ipsecdoi_trns_ah[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_ipsecdoi_trns_esp[] = {
-{ IPSECDOI_ESP_DES_IV64,	"DES_IV64",	NULL },
-{ IPSECDOI_ESP_DES,		"DES",		NULL },
-{ IPSECDOI_ESP_3DES,		"3DES",		NULL },
-{ IPSECDOI_ESP_RC5,		"RC5",		NULL },
-{ IPSECDOI_ESP_IDEA,		"IDEA",		NULL },
-{ IPSECDOI_ESP_CAST,		"CAST",		NULL },
-{ IPSECDOI_ESP_BLOWFISH,	"BLOWFISH",	NULL },
-{ IPSECDOI_ESP_3IDEA,		"3IDEA",	NULL },
-{ IPSECDOI_ESP_DES_IV32,	"DES_IV32",	NULL },
-{ IPSECDOI_ESP_RC4,		"RC4",		NULL },
-{ IPSECDOI_ESP_NULL,		"NULL",		NULL },
-{ IPSECDOI_ESP_AES,		"AES",		NULL },
-{ IPSECDOI_ESP_TWOFISH,		"TWOFISH",	NULL },
-{ IPSECDOI_ESP_CAMELLIA,	"CAMELLIA",	NULL },
-};
-
-char *
-s_ipsecdoi_trns_esp(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_esp); i++)
-		if (name_ipsecdoi_trns_esp[i].key == k)
-			return name_ipsecdoi_trns_esp[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_ipsecdoi_trns_ipcomp[] = {
-{ IPSECDOI_IPCOMP_OUI,		"OUI",		NULL},
-{ IPSECDOI_IPCOMP_DEFLATE,	"DEFLATE",	NULL},
-{ IPSECDOI_IPCOMP_LZS,		"LZS",		NULL},
-};
-
-char *
-s_ipsecdoi_trns_ipcomp(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_ipcomp); i++)
-		if (name_ipsecdoi_trns_ipcomp[i].key == k)
-			return name_ipsecdoi_trns_ipcomp[i].str;
-	return num2str(k);
-}
-
-char *
-s_ipsecdoi_trns(proto, trns)
-	int proto, trns;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_proto); i++)
-		if (name_ipsecdoi_proto[i].key == proto
-		 && name_ipsecdoi_proto[i].f)
-			return (name_ipsecdoi_proto[i].f)(trns);
-	return num2str(trns);
-}
-
-static struct ksmap name_attr_ipsec[] = {
-{ IPSECDOI_ATTR_SA_LD_TYPE,	"SA Life Type",		s_ipsecdoi_ltype },
-{ IPSECDOI_ATTR_SA_LD,		"SA Life Duration",	NULL },
-{ IPSECDOI_ATTR_GRP_DESC,	"Group Description",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE,	"Encryption Mode",	s_ipsecdoi_encmode },
-{ IPSECDOI_ATTR_AUTH,		"Authentication Algorithm", s_ipsecdoi_auth },
-{ IPSECDOI_ATTR_KEY_LENGTH,	"Key Length",		NULL },
-{ IPSECDOI_ATTR_KEY_ROUNDS,	"Key Rounds",		NULL },
-{ IPSECDOI_ATTR_COMP_DICT_SIZE,	"Compression Dictionary Size",	NULL },
-{ IPSECDOI_ATTR_COMP_PRIVALG,	"Compression Private Algorithm", NULL },
-};
-
-char *
-s_ipsecdoi_attr(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_ipsec); i++)
-		if (name_attr_ipsec[i].key == k)
-			return name_attr_ipsec[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_ipsec_ltype[] = {
-{ IPSECDOI_ATTR_SA_LD_TYPE_SEC,	"seconds",	NULL },
-{ IPSECDOI_ATTR_SA_LD_TYPE_KB,	"kilobytes",	NULL },
-};
-
-char *
-s_ipsecdoi_ltype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_ipsec_ltype); i++)
-		if (name_attr_ipsec_ltype[i].key == k)
-			return name_attr_ipsec_ltype[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_ipsec_encmode[] = {
-{ IPSECDOI_ATTR_ENC_MODE_ANY,		"Any",		NULL },
-{ IPSECDOI_ATTR_ENC_MODE_TUNNEL,	"Tunnel",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE_TRNS,		"Transport",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC,	"UDP-Tunnel",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC,	"UDP-Transport",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT,	"UDP-Tunnel",	NULL },
-{ IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT,	"UDP-Transport",	NULL },
-};
-
-char *
-s_ipsecdoi_encmode(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_ipsec_encmode); i++)
-		if (name_attr_ipsec_encmode[i].key == k)
-			return name_attr_ipsec_encmode[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_ipsec_auth[] = {
-{ IPSECDOI_ATTR_AUTH_HMAC_MD5,		"hmac-md5",	NULL },
-{ IPSECDOI_ATTR_AUTH_HMAC_SHA1,		"hmac-sha",	NULL },
-{ IPSECDOI_ATTR_AUTH_HMAC_SHA2_256,	"hmac-sha256",	NULL },
-{ IPSECDOI_ATTR_AUTH_HMAC_SHA2_384,	"hmac-sha384",	NULL },
-{ IPSECDOI_ATTR_AUTH_HMAC_SHA2_512,	"hmac-sha512",	NULL },
-{ IPSECDOI_ATTR_AUTH_DES_MAC,		"des-mac",	NULL },
-{ IPSECDOI_ATTR_AUTH_KPDK,		"kpdk",		NULL },
-};
-
-char *
-s_ipsecdoi_auth(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_ipsec_auth); i++)
-		if (name_attr_ipsec_auth[i].key == k)
-			return name_attr_ipsec_auth[i].str;
-	return num2str(k);
-}
-
-char *
-s_ipsecdoi_attr_v(type, val)
-	int type, val;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_ipsec); i++)
-		if (name_attr_ipsec[i].key == type
-		 && name_attr_ipsec[i].f)
-			return (name_attr_ipsec[i].f)(val);
-	return num2str(val);
-}
-
-static struct ksmap name_ipsecdoi_ident[] = {
-{ IPSECDOI_ID_IPV4_ADDR,	"IPv4_address",	NULL },
-{ IPSECDOI_ID_FQDN,		"FQDN",		NULL },
-{ IPSECDOI_ID_USER_FQDN,	"User_FQDN",	NULL },
-{ IPSECDOI_ID_IPV4_ADDR_SUBNET,	"IPv4_subnet",	NULL },
-{ IPSECDOI_ID_IPV6_ADDR,	"IPv6_address",	NULL },
-{ IPSECDOI_ID_IPV6_ADDR_SUBNET,	"IPv6_subnet",	NULL },
-{ IPSECDOI_ID_IPV4_ADDR_RANGE,	"IPv4_address_range",	NULL },
-{ IPSECDOI_ID_IPV6_ADDR_RANGE,	"IPv6_address_range",	NULL },
-{ IPSECDOI_ID_DER_ASN1_DN,	"DER_ASN1_DN",	NULL },
-{ IPSECDOI_ID_DER_ASN1_GN,	"DER_ASN1_GN",	NULL },
-{ IPSECDOI_ID_KEY_ID,		"KEY_ID",	NULL },
-};
-
-char *
-s_ipsecdoi_ident(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsecdoi_ident); i++)
-		if (name_ipsecdoi_ident[i].key == k)
-			return name_ipsecdoi_ident[i].str;
-	return num2str(k);
-}
-
-/* oakley.h */
-static struct ksmap name_oakley_attr[] = {
-{ OAKLEY_ATTR_ENC_ALG,		"Encryption Algorithm",	s_attr_isakmp_enc },
-{ OAKLEY_ATTR_HASH_ALG,		"Hash Algorithm",	s_attr_isakmp_hash },
-{ OAKLEY_ATTR_AUTH_METHOD,	"Authentication Method", s_oakley_attr_method },
-{ OAKLEY_ATTR_GRP_DESC,		"Group Description",	s_attr_isakmp_desc },
-{ OAKLEY_ATTR_GRP_TYPE,		"Group Type",		s_attr_isakmp_group },
-{ OAKLEY_ATTR_GRP_PI,		"Group Prime/Irreducible Polynomial",	NULL },
-{ OAKLEY_ATTR_GRP_GEN_ONE,	"Group Generator One",	NULL },
-{ OAKLEY_ATTR_GRP_GEN_TWO,	"Group Generator Two",	NULL },
-{ OAKLEY_ATTR_GRP_CURVE_A,	"Group Curve A",	NULL },
-{ OAKLEY_ATTR_GRP_CURVE_B,	"Group Curve B",	NULL },
-{ OAKLEY_ATTR_SA_LD_TYPE,	"Life Type",		s_attr_isakmp_ltype },
-{ OAKLEY_ATTR_SA_LD,		"Life Duration",	NULL },
-{ OAKLEY_ATTR_PRF,		"PRF",			NULL },
-{ OAKLEY_ATTR_KEY_LEN,		"Key Length",		NULL },
-{ OAKLEY_ATTR_FIELD_SIZE,	"Field Size",		NULL },
-{ OAKLEY_ATTR_GRP_ORDER,	"Group Order",		NULL },
-{ OAKLEY_ATTR_BLOCK_SIZE,	"Block Size",		NULL },
-{ OAKLEY_ATTR_GSS_ID,		"GSS-API endpoint name",NULL },
-};
-
-char *
-s_oakley_attr(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_oakley_attr); i++)
-		if (name_oakley_attr[i].key == k)
-			return name_oakley_attr[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_enc[] = {
-{ OAKLEY_ATTR_ENC_ALG_DES,	"DES-CBC",		NULL },
-{ OAKLEY_ATTR_ENC_ALG_IDEA,	"IDEA-CBC",		NULL },
-{ OAKLEY_ATTR_ENC_ALG_BLOWFISH,	"Blowfish-CBC",		NULL },
-{ OAKLEY_ATTR_ENC_ALG_RC5,	"RC5-R16-B64-CBC",	NULL },
-{ OAKLEY_ATTR_ENC_ALG_3DES,	"3DES-CBC",		NULL },
-{ OAKLEY_ATTR_ENC_ALG_CAST,	"CAST-CBC",		NULL },
-{ OAKLEY_ATTR_ENC_ALG_AES,	"AES-CBC",		NULL },
-};
-
-char *
-s_attr_isakmp_enc(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_enc); i++)
-		if (name_attr_isakmp_enc[i].key == k)
-			return name_attr_isakmp_enc[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_hash[] = {
-{ OAKLEY_ATTR_HASH_ALG_MD5,	"MD5",		NULL },
-{ OAKLEY_ATTR_HASH_ALG_SHA,	"SHA",		NULL },
-{ OAKLEY_ATTR_HASH_ALG_TIGER,	"Tiger",	NULL },
-{ OAKLEY_ATTR_HASH_ALG_SHA2_256,"SHA256",	NULL },
-{ OAKLEY_ATTR_HASH_ALG_SHA2_384,"SHA384",	NULL },
-{ OAKLEY_ATTR_HASH_ALG_SHA2_512,"SHA512",	NULL },
-};
-
-char *
-s_attr_isakmp_hash(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_hash); i++)
-		if (name_attr_isakmp_hash[i].key == k)
-			return name_attr_isakmp_hash[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_method[] = {
-{ OAKLEY_ATTR_AUTH_METHOD_PSKEY,		"pre-shared key",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_DSSSIG,		"DSS signatures",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_RSASIG,		"RSA signatures",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_RSAENC,		"Encryption with RSA",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_RSAREV,		"Revised encryption with RSA",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_EGENC,		"Encryption with El-Gamal",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_EGREV,		"Revised encryption with El-Gamal",	NULL },
-#ifdef HAVE_GSSAPI
-{ OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB,		"GSS-API on Kerberos 5", NULL },
-#endif
-#ifdef ENABLE_HYBRID
-{ OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R,		"Hybrid DSS server",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R,		"Hybrid RSA server",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I,		"Hybrid DSS client",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I,		"Hybrid RSA client",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I,	"XAuth pskey client",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R,	"XAuth pskey server",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I,	"XAuth RSASIG client",	NULL },
-{ OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R,	"XAuth RSASIG server",	NULL },
-#endif
-};
-
-char *
-s_oakley_attr_method(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_method); i++)
-		if (name_attr_isakmp_method[i].key == k)
-			return name_attr_isakmp_method[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_desc[] = {
-{ OAKLEY_ATTR_GRP_DESC_MODP768,		"768-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP1024,	"1024-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_EC2N155,		"EC2N group on GP[2^155]",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_EC2N185,		"EC2N group on GP[2^185]",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP1536,	"1536-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP2048,	"2048-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP3072,	"3072-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP4096,	"4096-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP6144,	"6144-bit MODP group",	NULL },
-{ OAKLEY_ATTR_GRP_DESC_MODP8192,	"8192-bit MODP group",	NULL },
-};
-
-char *
-s_attr_isakmp_desc(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_desc); i++)
-		if (name_attr_isakmp_desc[i].key == k)
-			return name_attr_isakmp_desc[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_group[] = {
-{ OAKLEY_ATTR_GRP_TYPE_MODP,	"MODP",	NULL },
-{ OAKLEY_ATTR_GRP_TYPE_ECP,	"ECP",	NULL },
-{ OAKLEY_ATTR_GRP_TYPE_EC2N,	"EC2N",	NULL },
-};
-
-char *
-s_attr_isakmp_group(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_group); i++)
-		if (name_attr_isakmp_group[i].key == k)
-			return name_attr_isakmp_group[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_attr_isakmp_ltype[] = {
-{ OAKLEY_ATTR_SA_LD_TYPE_SEC,	"seconds",	NULL },
-{ OAKLEY_ATTR_SA_LD_TYPE_KB,	"kilobytes",	NULL },
-};
-
-char *
-s_attr_isakmp_ltype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_attr_isakmp_ltype); i++)
-		if (name_attr_isakmp_ltype[i].key == k)
-			return name_attr_isakmp_ltype[i].str;
-	return num2str(k);
-}
-
-char *
-s_oakley_attr_v(type, val)
-	int type, val;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_oakley_attr); i++)
-		if (name_oakley_attr[i].key == type
-		 && name_oakley_attr[i].f)
-			return (name_oakley_attr[i].f)(val);
-	return num2str(val);
-}
-
-/* netinet6/ipsec.h */
-static struct ksmap name_ipsec_level[] = {
-{ IPSEC_LEVEL_USE,	"use",		NULL },
-{ IPSEC_LEVEL_REQUIRE,	"require",	NULL },
-{ IPSEC_LEVEL_UNIQUE,	"unique",	NULL },
-};
-
-char *
-s_ipsec_level(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_ipsec_level); i++)
-		if (name_ipsec_level[i].key == k)
-			return name_ipsec_level[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_algclass[] = {
-{ algclass_ipsec_enc,	"ipsec enc",	s_ipsecdoi_trns_esp },
-{ algclass_ipsec_auth,	"ipsec auth",	s_ipsecdoi_trns_ah },
-{ algclass_ipsec_comp,	"ipsec comp",	s_ipsecdoi_trns_ipcomp },
-{ algclass_isakmp_enc,	"isakmp enc",	s_attr_isakmp_enc },
-{ algclass_isakmp_hash,	"isakmp hash",	s_attr_isakmp_hash },
-{ algclass_isakmp_dh,	"isakmp dh",	s_attr_isakmp_desc },
-{ algclass_isakmp_ameth, "isakmp auth method",	s_oakley_attr_method },
-};
-
-char *
-s_algclass(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_algclass); i++)
-		if (name_algclass[i].key == k)
-			return name_algclass[i].str;
-	return num2str(k);
-}
-
-char *
-s_algtype(class, n)
-	int class, n;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_algclass); i++)
-		if (name_algclass[i].key == class
-		 && name_algclass[i].f)
-			return (name_algclass[i].f)(n);
-	return num2str(n);
-}
-
-/* pfkey.h */
-static struct ksmap name_pfkey_type[] = {
-{ SADB_GETSPI,		"GETSPI",	NULL },
-{ SADB_UPDATE,		"UPDATE",	NULL },
-{ SADB_ADD,		"ADD",		NULL },
-{ SADB_DELETE,		"DELETE",	NULL },
-{ SADB_GET,		"GET",		NULL },
-{ SADB_ACQUIRE,		"ACQUIRE",	NULL },
-{ SADB_REGISTER,	"REGISTER",	NULL },
-{ SADB_EXPIRE,		"EXPIRE",	NULL },
-{ SADB_FLUSH,		"FLUSH",	NULL },
-{ SADB_DUMP,		"DUMP",		NULL },
-{ SADB_X_PROMISC,	"X_PROMISC",	NULL },
-{ SADB_X_PCHANGE,	"X_PCHANGE",	NULL },
-{ SADB_X_SPDUPDATE,	"X_SPDUPDATE",	NULL },
-{ SADB_X_SPDADD,	"X_SPDADD",	NULL },
-{ SADB_X_SPDDELETE,	"X_SPDDELETE",	NULL },
-{ SADB_X_SPDGET,	"X_SPDGET",	NULL },
-{ SADB_X_SPDACQUIRE,	"X_SPDACQUIRE",	NULL },
-{ SADB_X_SPDDUMP,	"X_SPDDUMP",	NULL },
-{ SADB_X_SPDFLUSH,	"X_SPDFLUSH",	NULL },
-{ SADB_X_SPDSETIDX,	"X_SPDSETIDX",	NULL },
-{ SADB_X_SPDEXPIRE,	"X_SPDEXPIRE",	NULL },
-{ SADB_X_SPDDELETE2,	"X_SPDDELETE2",	NULL },
-#ifdef SADB_X_NAT_T_NEW_MAPPING
-{ SADB_X_NAT_T_NEW_MAPPING, "X_NAT_T_NEW_MAPPING", NULL },
-#endif
-#ifdef SADB_X_MIGRATE
-{ SADB_X_MIGRATE,	"X_MIGRATE",	NULL },
-#endif
-};
-
-char *
-s_pfkey_type(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_pfkey_type); i++)
-		if (name_pfkey_type[i].key == k)
-			return name_pfkey_type[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_pfkey_satype[] = {
-{ SADB_SATYPE_UNSPEC,	"UNSPEC",	NULL },
-{ SADB_SATYPE_AH,	"AH",		NULL },
-{ SADB_SATYPE_ESP,	"ESP",		NULL },
-{ SADB_SATYPE_RSVP,	"RSVP",		NULL },
-{ SADB_SATYPE_OSPFV2,	"OSPFV2",	NULL },
-{ SADB_SATYPE_RIPV2,	"RIPV2",	NULL },
-{ SADB_SATYPE_MIP,	"MIP",		NULL },
-{ SADB_X_SATYPE_IPCOMP,	"IPCOMP",	NULL },
-};
-
-char *
-s_pfkey_satype(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_pfkey_satype); i++)
-		if (name_pfkey_satype[i].key == k)
-			return name_pfkey_satype[i].str;
-	return num2str(k);
-}
-
-static struct ksmap name_direction[] = {
-{ IPSEC_DIR_INBOUND,	"in",	NULL },
-{ IPSEC_DIR_OUTBOUND,	"out",	NULL },
-#ifdef HAVE_POLICY_FWD
-{ IPSEC_DIR_FWD,	"fwd",	NULL },
-#endif
-};
-
-char *
-s_direction(k)
-	int k;
-{
-	int i;
-	for (i = 0; i < ARRAYLEN(name_direction); i++)
-		if (name_direction[i].key == k)
-			return name_direction[i].str;
-	return num2str(k);
-}
-
-char *
-s_proto(k)
-	int k;
-{
-	switch (k) {
-	case IPPROTO_ICMP:
-		return "icmp";
-	case IPPROTO_TCP:
-		return "tcp";
-	case IPPROTO_UDP:
-		return "udp";
-	case IPPROTO_ICMPV6:
-		return "icmpv6";
-	case IPSEC_ULPROTO_ANY:
-		return "any";
-	}
-
-	return num2str(k);
-}
-
-char *
-s_doi(int k)
-{
-  switch (k) {
-    case IPSEC_DOI:
-      return "ipsec_doi";
-    default:
-      return num2str(k);
-  }
-}
-
-char *
-s_etype (int k)
-{
-  switch (k) {
-    case ISAKMP_ETYPE_NONE:
-      return "_none";
-    case ISAKMP_ETYPE_BASE:
-      return "base";
-    case ISAKMP_ETYPE_IDENT:
-      return "main";
-    case ISAKMP_ETYPE_AUTH:
-      return "_auth";
-    case ISAKMP_ETYPE_AGG:
-      return "aggressive";
-    case ISAKMP_ETYPE_INFO:
-      return "_info";
-    case ISAKMP_ETYPE_QUICK:
-      return "_quick";
-    case ISAKMP_ETYPE_NEWGRP:
-      return "_newgrp";
-    case ISAKMP_ETYPE_ACKINFO:
-      return "_ackinfo";
-    default:
-      return num2str(k);
-  }
-}
-
-char *
-s_idtype (int k)
-{
-  switch (k) {
-    case IDTYPE_FQDN:
-      return "fqdn";
-    case IDTYPE_USERFQDN:
-      return "user_fqdn";
-    case IDTYPE_KEYID:
-      return "keyid";
-    case IDTYPE_ADDRESS:
-      return "address";
-    case IDTYPE_ASN1DN:
-      return "asn1dn";
-    default:
-      return num2str(k);
-  }
-}
-
-char *
-s_switch (int k)
-{
-  switch (k) {
-    case FALSE:
-      return "off";
-    case TRUE:
-      return "on";
-    default:
-      return num2str(k);
-  }
-}
diff --git a/src/racoon/strnames.h b/src/racoon/strnames.h
deleted file mode 100644
index 02ebbb5..0000000
--- a/src/racoon/strnames.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*	$NetBSD: strnames.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: strnames.h,v 1.7 2005/04/18 10:04:26 manubsd Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _STRNAMES_H
-#define _STRNAMES_H
-
-extern char *num2str __P((int n));
-
-extern char *s_isakmp_state __P((int, int, int));
-extern char *s_isakmp_certtype __P((int));
-extern char *s_isakmp_etype __P((int));
-extern char *s_isakmp_notify_msg __P((int));
-extern char *s_isakmp_nptype __P((int));
-extern char *s_ipsecdoi_proto __P((int));
-extern char *s_ipsecdoi_trns_isakmp __P((int));
-extern char *s_ipsecdoi_trns_ah __P((int));
-extern char *s_ipsecdoi_trns_esp __P((int));
-extern char *s_ipsecdoi_trns_ipcomp __P((int));
-extern char *s_ipsecdoi_trns __P((int, int));
-extern char *s_ipsecdoi_attr __P((int));
-extern char *s_ipsecdoi_ltype __P((int));
-extern char *s_ipsecdoi_encmode __P((int));
-extern char *s_ipsecdoi_auth __P((int));
-extern char *s_ipsecdoi_attr_v __P((int, int));
-extern char *s_ipsecdoi_ident __P((int));
-extern char *s_oakley_attr __P((int));
-extern char *s_attr_isakmp_enc __P((int));
-extern char *s_attr_isakmp_hash __P((int));
-extern char *s_oakley_attr_method __P((int));
-extern char *s_attr_isakmp_desc __P((int));
-extern char *s_attr_isakmp_group __P((int));
-extern char *s_attr_isakmp_ltype __P((int));
-extern char *s_oakley_attr_v __P((int, int));
-extern char *s_ipsec_level __P((int));
-extern char *s_algclass __P((int));
-extern char *s_algtype __P((int, int));
-extern char *s_pfkey_type __P((int));
-extern char *s_pfkey_satype __P((int));
-extern char *s_direction __P((int));
-extern char *s_proto __P((int));
-extern char *s_doi __P((int));
-extern char *s_etype __P((int));
-extern char *s_idtype __P((int));
-extern char *s_switch __P((int));
-#ifdef ENABLE_HYBRID
-extern char *s_isakmp_cfg_type __P((int));
-extern char *s_isakmp_cfg_ptype __P((int));
-#endif
-
-#endif /* _STRNAMES_H */
diff --git a/src/racoon/throttle.c b/src/racoon/throttle.c
deleted file mode 100644
index cd7de1f..0000000
--- a/src/racoon/throttle.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*	$NetBSD: throttle.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: throttle.c,v 1.5 2006/04/05 20:54:50 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h> 
-#else 
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif 
-#endif
-#include <sys/param.h>
-#include <sys/queue.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-#include <resolv.h>
-
-#include "vmbuf.h"
-#include "misc.h"
-#include "plog.h"
-#include "throttle.h"
-#include "sockmisc.h"
-#include "libpfkey.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#include "gcmalloc.h"
-
-struct throttle_list throttle_list = TAILQ_HEAD_INITIALIZER(throttle_list);
-
-
-struct throttle_entry *
-throttle_add(addr)
-	struct sockaddr *addr;
-{
-	struct throttle_entry *te;
-	size_t len;
-
-	len = sizeof(*te) 
-	    - sizeof(struct sockaddr_storage) 
-	    + sysdep_sa_len(addr);
-
-	if ((te = racoon_malloc(len)) == NULL)
-		return NULL;
-
-	te->penalty = time(NULL) + isakmp_cfg_config.auth_throttle;
-	memcpy(&te->host, addr, sysdep_sa_len(addr));
-	TAILQ_INSERT_HEAD(&throttle_list, te, next);
-
-	return te;
-}
-
-int
-throttle_host(addr, authfail) 
-	struct sockaddr *addr;
-	int authfail;
-{
-	struct throttle_entry *te;
-	int found = 0;
-	time_t now;
-
-	if (isakmp_cfg_config.auth_throttle == 0)
-		return 0;
-
-	now = time(NULL);
-
-restart:
-	RACOON_TAILQ_FOREACH_REVERSE(te, &throttle_list, throttle_list, next) {
-	  /*
-	   * Remove outdated entries 
-	   */
-		if (te->penalty < now) {
-			TAILQ_REMOVE(&throttle_list, te, next);
-			racoon_free(te);
-			goto restart;
-		}
-			
-		if (cmpsaddrwop(addr, (struct sockaddr *)&te->host) == 0) {
-			found = 1;
-			break;
-		}
-	}
-
-	/* 
-	 * No match, if auth failed, allocate a new throttle entry
-	 * give no penalty even on error: this is the first time
-	 * and we are indulgent.
-	 */
-	if (!found) {
-		if (authfail) {
-			if ((te = throttle_add(addr)) == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL, 
-				    "Throttle insertion failed\n");
-				return (time(NULL) 
-				    + isakmp_cfg_config.auth_throttle);
-			}
-		}
-		return 0;
-	} else {
-		/*
-		 * We had a match and auth failed, increase penalty.
-		 */
-		if (authfail) {
-			time_t remaining;
-			time_t new;
-
-			remaining = te->penalty - now;
-			new = remaining + isakmp_cfg_config.auth_throttle;
-
-			if (new > THROTTLE_PENALTY_MAX)
-				new = THROTTLE_PENALTY_MAX;
-
-			te->penalty = now + new;
-		}
-	}
-	
-	return te->penalty;
-}
-
diff --git a/src/racoon/throttle.h b/src/racoon/throttle.h
deleted file mode 100644
index baa9af5..0000000
--- a/src/racoon/throttle.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*	$NetBSD: throttle.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: throttle.h,v 1.1 2004/11/30 00:46:09 manubsd Exp */
-
-/*
- * Copyright (C) 2004 Emmanuel Dreyfus
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _THROTTLE_H
-#define _THROTTLE_H
-
-struct throttle_entry {
-	int penalty;
-	TAILQ_ENTRY(throttle_entry) next;
-	struct sockaddr_storage host;
-};
-
-TAILQ_HEAD(throttle_list, throttle_entry);
-
-#define THROTTLE_PENALTY 1
-#define THROTTLE_PENALTY_MAX 10
-
-struct throttle_entry *throttle_add(struct sockaddr *);
-int throttle_host(struct sockaddr *, int);
-
-#endif /* _THROTTLE_H */
diff --git a/src/racoon/var.h b/src/racoon/var.h
deleted file mode 100644
index 8abb1c2..0000000
--- a/src/racoon/var.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*	$NetBSD: var.h,v 1.4.6.1 2007/06/06 15:36:38 vanhu Exp $	*/
-
-/* Id: var.h,v 1.6 2004/11/20 16:16:59 monas Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _VAR_H
-#define _VAR_H
-
-#if !defined(_VAR_H_)
-#define _VAR_H_
-
-#define MAX3(a, b, c) (a > b ? (a > c ? a : c) : (b > c ? b : c))
-
-#define ISSET(exp, bit) (((exp) & (bit)) == (bit))
-
-#define LALIGN(a) \
-    ((a) > 0 ? ((a) &~ (sizeof(long) - 1)) : sizeof(long))
-
-#define RNDUP(a) \
-    ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-
-#define ARRAYLEN(a)	(sizeof(a)/sizeof(a[0]))
-
-#define BUFSIZE    5120
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifdef ENABLE_STATS
-#include <sys/time.h>
-#endif
-#include <sys/socket.h>
-
-/*
- * use of GETNAMEINFO(x, y, NULL) is not politically correct,
- * as sizeof(NULL) would be 4, not 0. Also, gcc-3.4.2+ bombs on it.
- * In such cases, use GETNAMEINFO_NULL(x, y)
- */
-#include <sys/socket.h>
-#include <netdb.h>
-
-/* var.h is used from non-racoon code (like eaytest), so we can't use niflags */
-#define NIFLAGS	(NI_NUMERICHOST | NI_NUMERICSERV)
-
-#define GETNAMEINFO(x, y, z) \
-do { \
-	if (getnameinfo((x), sysdep_sa_len(x), (y), sizeof(y), (z), sizeof(z), \
-			NIFLAGS) != 0) { \
-		if (y != NULL) \
-			strncpy((y), "(invalid)", sizeof(y)); \
-		if (z != NULL) \
-			strncpy((z), "(invalid)", sizeof(z)); \
-	} \
-} while (0);
-
-#define GETNAMEINFO_NULL(x, y) \
-do { \
-	if (getnameinfo((x), sysdep_sa_len(x), (y), sizeof(y), NULL, 0, \
-			NIFLAGS) != 0) { \
-		if (y != NULL) \
-			strncpy((y), "(invalid)", sizeof(y)); \
-	} \
-} while (0);
-
-#include <sys/queue.h>
-#ifndef LIST_FOREACH
-#define LIST_FOREACH(elm, head, field) \
-	for (elm = LIST_FIRST(head); elm; elm = LIST_NEXT(elm, field))
-#endif
-
-#include "gcmalloc.h"
-
-#endif /*!defined(_VAR_H_)*/
-
-#endif /* _VAR_H */
diff --git a/src/racoon/vendorid.c b/src/racoon/vendorid.c
deleted file mode 100644
index 96c87a3..0000000
--- a/src/racoon/vendorid.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/*	$NetBSD: vendorid.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: vendorid.c,v 1.10 2006/02/22 16:10:21 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "plog.h"
-#include "debug.h"
-
-#include "localconf.h"
-#include "isakmp_var.h"
-#include "isakmp.h"
-#include "vendorid.h"
-#include "crypto_openssl.h"
-#include "handler.h"
-#include "remoteconf.h"
-#ifdef ENABLE_NATT
-#include "nattraversal.h"
-#endif
-#ifdef ENABLE_HYBRID
-#include "isakmp_xauth.h"
-#include "isakmp_cfg.h"
-#endif
-
-static struct vendor_id all_vendor_ids[] = {
-{ VENDORID_IPSEC_TOOLS, "IPSec-Tools" },
-{ VENDORID_GSSAPI_LONG, "A GSS-API Authentication Method for IKE" },
-{ VENDORID_GSSAPI     , "GSSAPI" },
-{ VENDORID_MS_NT5     , "MS NT5 ISAKMPOAKLEY" },
-{ VENDORID_NATT_00    , "draft-ietf-ipsec-nat-t-ike-00" },
-{ VENDORID_NATT_01    , "draft-ietf-ipsec-nat-t-ike-01" },
-{ VENDORID_NATT_02    , "draft-ietf-ipsec-nat-t-ike-02" },
-{ VENDORID_NATT_02_N  , "draft-ietf-ipsec-nat-t-ike-02\n" },
-{ VENDORID_NATT_03    , "draft-ietf-ipsec-nat-t-ike-03" },
-{ VENDORID_NATT_04    , "draft-ietf-ipsec-nat-t-ike-04" },
-{ VENDORID_NATT_05    , "draft-ietf-ipsec-nat-t-ike-05" },
-{ VENDORID_NATT_06    , "draft-ietf-ipsec-nat-t-ike-06" },
-{ VENDORID_NATT_07    , "draft-ietf-ipsec-nat-t-ike-07" },
-{ VENDORID_NATT_08    , "draft-ietf-ipsec-nat-t-ike-08" },
-{ VENDORID_NATT_RFC   , "RFC 3947" },
-{ VENDORID_XAUTH      , "draft-ietf-ipsra-isakmp-xauth-06.txt" },
-{ VENDORID_UNITY      , "CISCO-UNITY" },
-{ VENDORID_FRAG       , "FRAGMENTATION" },
-/* Just a readable string for DPD ... */
-{ VENDORID_DPD        , "DPD" },
-/* Other known Vendor IDs */
-{ VENDORID_KAME       , "KAME/racoon" },
-};
-
-#define NUMVENDORIDS	(sizeof(all_vendor_ids)/sizeof(all_vendor_ids[0]))
-
-#define DPD_MAJOR_VERSION	0x01
-#define DPD_MINOR_VERSION	0x00
-
-const char vendorid_dpd_hash[] = {
-	0xAF, 0xCA, 0xD7, 0x13,
-	0x68, 0xA1, 0xF1, 0xC9,
-	0x6B, 0x86, 0x96, 0xFC,
-	0x77, 0x57, DPD_MAJOR_VERSION, DPD_MINOR_VERSION
-};
-
-
-static vchar_t *vendorid_fixup(int, vchar_t *t);
-
-static struct vendor_id *
-lookup_vendor_id_by_id (int id)
-{
-	int i;
-
-	for (i = 0; i < NUMVENDORIDS; i++)
-		if (all_vendor_ids[i].id == id)
-			return &all_vendor_ids[i];
-
-	return NULL;
-}
-
-const char *
-vid_string_by_id (int id)
-{
-	struct vendor_id *current;
-
-	if (id == VENDORID_DPD)
-		return vendorid_dpd_hash;
-
-	current = lookup_vendor_id_by_id(id);
-
-	return current ? current->string : NULL;
-}
-
-static struct vendor_id *
-lookup_vendor_id_by_hash (const char *hash)
-{
-	int i;
-	unsigned char *h = (unsigned char *)hash;
-
-	for (i = 0; i < NUMVENDORIDS; i++)
-		if (strncmp(all_vendor_ids[i].hash->v, hash,
-			    all_vendor_ids[i].hash->l) == 0)
-			return &all_vendor_ids[i];
-
-	return NULL;
-}
-
-void
-compute_vendorids (void)
-{
-	int i;
-	vchar_t vid;
-
-	for (i = 0; i < NUMVENDORIDS; i++) {
-		/* VENDORID_DPD is not a MD5 sum... */
-		if(all_vendor_ids[i].id == VENDORID_DPD){
-			all_vendor_ids[i].hash = vmalloc(sizeof(vendorid_dpd_hash));
-			if (all_vendor_ids[i].hash == NULL) {
-				plog(LLV_ERROR, LOCATION, NULL,
-					"unable to get memory for VID hash\n");
-				exit(1); /* this really shouldn't happen */
-			}
-			memcpy(all_vendor_ids[i].hash->v, vendorid_dpd_hash,
-				   sizeof(vendorid_dpd_hash));
-			continue;
-		}
-
-		vid.v = (char *) all_vendor_ids[i].string;
-		vid.l = strlen(vid.v);
-
-		all_vendor_ids[i].hash = eay_md5_one(&vid);
-		if (all_vendor_ids[i].hash == NULL)
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "unable to hash vendor ID string\n");
-
-		/* Special cases */
-		all_vendor_ids[i].hash =
-			vendorid_fixup(all_vendor_ids[i].id,
-				       all_vendor_ids[i].hash);
-	}
-}
-
-/*
- * set hashed vendor id.
- * hash function is always MD5.
- */
-vchar_t *
-set_vendorid(int vendorid)
-{
-	struct vendor_id *current;
-	vchar_t vid, *new;
-
-	if (vendorid == VENDORID_UNKNOWN) {
-		/*
-		 * The default unknown ID gets translated to
-		 * KAME/racoon.
-		 */
-		vendorid = VENDORID_DEFAULT;
-	}
-
-	current = lookup_vendor_id_by_id(vendorid);
-	if (current == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL,
-		    "invalid vendor ID index: %d\n", vendorid);
-		return (NULL);
-	}
-
-	/* The rest of racoon expects a private copy 
-	 * of the VID that could be free'd after use.
-	 * That's why we don't return the original pointer. */
-	return vdup(current->hash);
-}
-
-/*
- * Check the vendor ID payload -- return the vendor ID index
- * if we find a recognized one, or UNKNOWN if we don't.
- *
- * gen ... points to Vendor ID payload.
- */
-int
-check_vendorid(struct isakmp_gen *gen)
-{
-	vchar_t vid, *vidhash;
-	int i, vidlen;
-	struct vendor_id *current;
-
-	if (gen == NULL)
-		return (VENDORID_UNKNOWN);
-
-	vidlen = ntohs(gen->len) - sizeof(*gen);
-
-	current = lookup_vendor_id_by_hash((char *)(gen + 1));
-	if (!current)
-		goto unknown;
-	
-	if (current->hash->l < vidlen)
-		plog(LLV_INFO, LOCATION, NULL,
-		     "received broken Microsoft ID: %s\n",
-		     current->string);
-	else
-		plog(LLV_INFO, LOCATION, NULL,
-		     "received Vendor ID: %s\n",
-		     current->string);
-
-	return current->id;
-
-unknown:
-	plog(LLV_DEBUG, LOCATION, NULL, "received unknown Vendor ID\n");
-	plogdump(LLV_DEBUG, (char *)(gen + 1), vidlen);
-	return (VENDORID_UNKNOWN);
-}
-
-int
-handle_vendorid(struct ph1handle *iph1, struct isakmp_gen *gen)
-{
-	int vid_numeric;
-
-	vid_numeric = check_vendorid(gen);
-	if (vid_numeric == VENDORID_UNKNOWN)
-		return vid_numeric;
-
-#ifdef ENABLE_NATT
-	if (natt_vendorid(vid_numeric))
-		natt_handle_vendorid(iph1, vid_numeric);
-#endif
-#ifdef ENABLE_HYBRID
-	switch (vid_numeric) {
-	case VENDORID_XAUTH:
-		iph1->mode_cfg->flags |= ISAKMP_CFG_VENDORID_XAUTH;
-		break;
-	case VENDORID_UNITY:
-		iph1->mode_cfg->flags |= ISAKMP_CFG_VENDORID_UNITY;
-		break;
-	default:
-		break;
-	}
-#endif
-#ifdef ENABLE_DPD
-	if (vid_numeric == VENDORID_DPD &&
-	    (iph1->rmconf == NULL || iph1->rmconf->dpd)) {
-		iph1->dpd_support = 1;
-		plog(LLV_DEBUG, LOCATION, NULL, "remote supports DPD\n");
-	}
-#endif
-
-	return vid_numeric;
-}
-
-static vchar_t * 
-vendorid_fixup(vendorid, vidhash)
-	int vendorid;		 
-	vchar_t *vidhash;
-{			   
-	switch(vendorid) {
-	case VENDORID_XAUTH: {	/* The vendor Id is truncated */
-		vchar_t *tmp;					    
-				  
-		if ((tmp = vmalloc(8)) == NULL) {
-			plog(LLV_ERROR, LOCATION, NULL,
-			    "unable to hash vendor ID string\n");
-			return NULL;				    
-		}			
-		  
-		memcpy(tmp->v, vidhash->v, 8);
-		vfree(vidhash);		  
-		vidhash = tmp;
-				   
-		break;
-	} 
-	case VENDORID_UNITY:	/* Two bytes tweak */
-		vidhash->v[14] = 0x01;		  
-		vidhash->v[15] = 0x00;
-		break;		   
-
-	default:     
-		break;
-	}		
-	
-	return vidhash;
-}			 
diff --git a/src/racoon/vendorid.h b/src/racoon/vendorid.h
deleted file mode 100644
index 7060c7e..0000000
--- a/src/racoon/vendorid.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*	$NetBSD: vendorid.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: vendorid.h,v 1.11 2006/02/17 14:09:10 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _VENDORID_H
-#define _VENDORID_H
-
-/* The unknown vendor ID. */
-#define	VENDORID_UNKNOWN	-1
-
-
-/* Our default vendor ID. */
-#define	VENDORID_DEFAULT	VENDORID_IPSEC_TOOLS
-
-#define	VENDORID_IPSEC_TOOLS 0		
-
-/*
- * Refer to draft-ietf-ipsec-isakmp-gss-auth-06.txt.
- */
-#define	VENDORID_GSSAPI_LONG	1
-#define	VENDORID_GSSAPI		2
-#define	VENDORID_MS_NT5		3
-#define	VENDOR_SUPPORTS_GSSAPI(x)					\
-	((x) == VENDORID_GSSAPI_LONG ||					\
-	 (x) == VENDORID_GSSAPI ||					\
-	 (x) == VENDORID_MS_NT5)
-
-/* NAT-T support */
-#define VENDORID_NATT_00	4
-#define VENDORID_NATT_01	5
-#define VENDORID_NATT_02	6
-#define VENDORID_NATT_02_N	7
-#define VENDORID_NATT_03	8
-#define VENDORID_NATT_04	9
-#define VENDORID_NATT_05	10
-#define VENDORID_NATT_06	11
-#define VENDORID_NATT_07	12
-#define VENDORID_NATT_08	13
-#define VENDORID_NATT_RFC	14
-
-#define VENDORID_NATT_FIRST	VENDORID_NATT_00
-#define VENDORID_NATT_LAST	VENDORID_NATT_RFC
-
-
-#define MAX_NATT_VID_COUNT	(VENDORID_NATT_LAST - VENDORID_NATT_FIRST + 1 )
-
-/* Hybrid auth */
-#define VENDORID_XAUTH		15
-#define VENDORID_UNITY		16
-
-/* IKE fragmentation */
-#define VENDORID_FRAG		17
-
-/* Dead Peer Detection */
-#define VENDORID_DPD		18
-
-
-/* Other Vendors...
- * XXX: do some cleanup to have separate lists for "real" vendors (to complete)
- * and "features" VendorIDs
- */
-#define	VENDORID_KAME		19
-
-
-struct vendor_id {
-	int		id;
-	const char	*string;
-	vchar_t		*hash;
-};
-
-vchar_t *set_vendorid __P((int));
-int handle_vendorid __P((struct ph1handle *, struct isakmp_gen *));
-
-void compute_vendorids __P((void));
-const char *vid_string_by_id __P((int id));
-
-#endif /* _VENDORID_H */
diff --git a/src/racoon/vmbuf.c b/src/racoon/vmbuf.c
deleted file mode 100644
index 6c1aed1..0000000
--- a/src/racoon/vmbuf.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*	$NetBSD: vmbuf.c,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/*	$KAME: vmbuf.c,v 1.11 2001/11/26 16:54:29 sakane Exp $	*/
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "config.h"
-
-#define NONEED_DRM
-
-#include <sys/types.h>
-#include <sys/param.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "var.h"
-#include "misc.h"
-#include "vmbuf.h"
-#include "debug.h"
-#include "plog.h"
-#include "gcmalloc.h"
-
-vchar_t *
-vmalloc(size)
-	size_t size;
-{
-	vchar_t *var;
-
-	if ((var = (vchar_t *)racoon_malloc(sizeof(*var))) == NULL)
-		return NULL;
-
-	var->l = size;
-	if (size == 0) {
-		var->v = NULL;
-	} else {
-		var->v = (caddr_t)racoon_calloc(1, size);
-		if (var->v == NULL) {
-			(void)racoon_free(var);
-			return NULL;
-		}
-	}
-
-	return var;
-}
-
-vchar_t *
-vrealloc(ptr, size)
-	vchar_t *ptr;
-	size_t size;
-{
-	caddr_t v;
-	
-	if (ptr != NULL) {
-		if (ptr->l == 0) {
-			(void)vfree(ptr);
-			return vmalloc(size); /* zero-fill it? */
-		}
-
-		if ((v = (caddr_t)racoon_realloc(ptr->v, size)) == NULL) {
-			(void)vfree(ptr);
-			return NULL;
-		}
-
-		if ( size > ptr->l)
-			memset(v + ptr->l, 0, size - ptr->l);
-		ptr->v = v;
-		ptr->l = size;
-	} else {
-		if ((ptr = vmalloc(size)) == NULL)
-			return NULL;
-	}
-
-	return ptr;
-}
-
-void
-vfree(var)
-	vchar_t *var;
-{
-	if (var == NULL)
-		return;
-
-	if (var->v)
-		(void)racoon_free(var->v);
-
-	(void)racoon_free(var);
-
-	return;
-}
-
-vchar_t *
-vdup(src)
-	vchar_t *src;
-{
-	vchar_t *new;
-
-	if (src == NULL) {
-		plog(LLV_ERROR, LOCATION, NULL, "vdup(NULL) called\n");
-		return NULL;
-	}
-
-	if ((new = vmalloc(src->l)) == NULL)
-		return NULL;
-
-	memcpy(new->v, src->v, src->l);
-
-	return new;
-}
diff --git a/src/racoon/vmbuf.h b/src/racoon/vmbuf.h
deleted file mode 100644
index 3f2f4ea..0000000
--- a/src/racoon/vmbuf.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*	$NetBSD: vmbuf.h,v 1.4 2006/09/09 16:22:10 manu Exp $	*/
-
-/* Id: vmbuf.h,v 1.4 2005/10/30 10:28:44 vanhu Exp */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef _VMBUF_H
-#define _VMBUF_H
-
-/*
- *	bp      v
- *	v       v
- *	........................
- *	        <--------------> l
- *	<----------------------> bl
- */
-typedef struct _vchar_t_ {
-#if notyet
-	u_int32_t t;	/* type of the value */
-	vchar_t *n;	/* next vchar_t buffer */
-	size_t bl;	/* length of the buffer */
-	caddr_t bp;	/* pointer to the buffer */
-#endif
-	size_t l;	/* length of the value */
-	caddr_t v;	/* place holder to the pointer to the value */
-} vchar_t;
-
-#define VPTRINIT(p) \
-do { \
-	if (p) { \
-		vfree(p); \
-		(p) = NULL; \
-	} \
-} while(0);
-
-#if defined(__APPLE__) && defined(__MACH__)
-/* vfree is already defined in Apple's system libraries */
-#define vfree   vmbuf_free
-#endif
-
-extern vchar_t *vmalloc __P((size_t));
-extern vchar_t *vrealloc __P((vchar_t *, size_t));
-extern void vfree __P((vchar_t *));
-extern vchar_t *vdup __P((vchar_t *));
-
-#endif /* _VMBUF_H */
