Home | History | Annotate | Download | only in racoon
      1 /*	$NetBSD: strnames.c,v 1.9 2008/07/14 05:40:13 tteras Exp $	*/
      2 
      3 /*	$KAME: strnames.c,v 1.25 2003/11/13 10:53:26 itojun Exp $	*/
      4 
      5 /*
      6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. Neither the name of the project nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #include "config.h"
     35 
     36 #include <sys/types.h>
     37 #include <sys/param.h>
     38 #include <sys/socket.h>
     39 
     40 #include <netinet/in.h>
     41 #include PATH_IPSEC_H
     42 #include <netinet/in.h>
     43 
     44 #include <stdio.h>
     45 #include <stdlib.h>
     46 #ifdef ENABLE_HYBRID
     47 #include <resolv.h>
     48 #endif
     49 
     50 #include "var.h"
     51 #include "misc.h"
     52 #include "vmbuf.h"
     53 #include "plog.h"
     54 
     55 #include "isakmp_var.h"
     56 #include "isakmp.h"
     57 #ifdef ENABLE_HYBRID
     58 #  include "isakmp_xauth.h"
     59 #  include "isakmp_unity.h"
     60 #  include "isakmp_cfg.h"
     61 #endif
     62 #include "ipsec_doi.h"
     63 #include "oakley.h"
     64 #include "handler.h"
     65 #include "pfkey.h"
     66 #include "strnames.h"
     67 #include "algorithm.h"
     68 
     69 struct ksmap {
     70 	int key;
     71 	char *str;
     72 	char *(*f) __P((int));
     73 };
     74 
     75 char *
     76 num2str(n)
     77 	int n;
     78 {
     79 	static char buf[20];
     80 
     81 	snprintf(buf, sizeof(buf), "%d", n);
     82 
     83 	return buf;
     84 }
     85 
     86 /* isakmp.h */
     87 char *
     88 s_isakmp_state(t, d, s)
     89 	int t, d, s;
     90 {
     91 	switch (t) {
     92 	case ISAKMP_ETYPE_AGG:
     93 		switch (d) {
     94 		case INITIATOR:
     95 			switch (s) {
     96 			case PHASE1ST_MSG1SENT:
     97 				return "agg I msg1";
     98 			case PHASE1ST_ESTABLISHED:
     99 				return "agg I msg2";
    100 			default:
    101 				break;
    102 			}
    103 		case RESPONDER:
    104 			switch (s) {
    105 			case PHASE1ST_MSG1SENT:
    106 				return "agg R msg1";
    107 			default:
    108 				break;
    109 			}
    110 		}
    111 		break;
    112 	case ISAKMP_ETYPE_BASE:
    113 		switch (d) {
    114 		case INITIATOR:
    115 			switch (s) {
    116 			case PHASE1ST_MSG1SENT:
    117 				return "base I msg1";
    118 			case PHASE1ST_MSG2SENT:
    119 				return "base I msg2";
    120 			default:
    121 				break;
    122 			}
    123 		case RESPONDER:
    124 			switch (s) {
    125 			case PHASE1ST_MSG1SENT:
    126 				return "base R msg1";
    127 			case PHASE1ST_ESTABLISHED:
    128 				return "base R msg2";
    129 			default:
    130 				break;
    131 			}
    132 		}
    133 		break;
    134 	case ISAKMP_ETYPE_IDENT:
    135 		switch (d) {
    136 		case INITIATOR:
    137 			switch (s) {
    138 			case PHASE1ST_MSG1SENT:
    139 				return "ident I msg1";
    140 			case PHASE1ST_MSG2SENT:
    141 				return "ident I msg2";
    142 			case PHASE1ST_MSG3SENT:
    143 				return "ident I msg3";
    144 			default:
    145 				break;
    146 			}
    147 		case RESPONDER:
    148 			switch (s) {
    149 			case PHASE1ST_MSG1SENT:
    150 				return "ident R msg1";
    151 			case PHASE1ST_MSG2SENT:
    152 				return "ident R msg2";
    153 			case PHASE1ST_ESTABLISHED:
    154 				return "ident R msg3";
    155 			default:
    156 				break;
    157 			}
    158 		}
    159 		break;
    160 	case ISAKMP_ETYPE_QUICK:
    161 		switch (d) {
    162 		case INITIATOR:
    163 			switch (s) {
    164 			case PHASE2ST_MSG1SENT:
    165 				return "quick I msg1";
    166 			case PHASE2ST_ADDSA:
    167 				return "quick I msg2";
    168 			default:
    169 				break;
    170 			}
    171 		case RESPONDER:
    172 			switch (s) {
    173 			case PHASE2ST_MSG1SENT:
    174 				return "quick R msg1";
    175 			case PHASE2ST_COMMIT:
    176 				return "quick R msg2";
    177 			default:
    178 				break;
    179 			}
    180 		}
    181 		break;
    182 	default:
    183 	case ISAKMP_ETYPE_NONE:
    184 	case ISAKMP_ETYPE_AUTH:
    185 	case ISAKMP_ETYPE_INFO:
    186 	case ISAKMP_ETYPE_NEWGRP:
    187 	case ISAKMP_ETYPE_ACKINFO:
    188 		break;
    189 	}
    190 	/*NOTREACHED*/
    191 
    192 	return "???";
    193 }
    194 
    195 static struct ksmap name_isakmp_certtype[] = {
    196 { ISAKMP_CERT_NONE,	"NONE",					NULL },
    197 { ISAKMP_CERT_PKCS7,	"PKCS #7 wrapped X.509 certificate",	NULL },
    198 { ISAKMP_CERT_PGP,	"PGP Certificate",			NULL },
    199 { ISAKMP_CERT_DNS,	"DNS Signed Key",			NULL },
    200 { ISAKMP_CERT_X509SIGN,	"X.509 Certificate Signature",		NULL },
    201 { ISAKMP_CERT_X509KE,	"X.509 Certificate Key Exchange",	NULL },
    202 { ISAKMP_CERT_KERBEROS,	"Kerberos Tokens",			NULL },
    203 { ISAKMP_CERT_CRL,	"Certificate Revocation List (CRL)",	NULL },
    204 { ISAKMP_CERT_ARL,	"Authority Revocation List (ARL)",	NULL },
    205 { ISAKMP_CERT_SPKI,	"SPKI Certificate",			NULL },
    206 { ISAKMP_CERT_X509ATTR,	"X.509 Certificate Attribute",		NULL },
    207 };
    208 
    209 char *
    210 s_isakmp_certtype(k)
    211 	int k;
    212 {
    213 	int i;
    214 	for (i = 0; i < ARRAYLEN(name_isakmp_certtype); i++)
    215 		if (name_isakmp_certtype[i].key == k)
    216 			return name_isakmp_certtype[i].str;
    217 	return num2str(k);
    218 }
    219 
    220 static struct ksmap name_isakmp_etype[] = {
    221 { ISAKMP_ETYPE_NONE,	"None",			NULL },
    222 { ISAKMP_ETYPE_BASE,	"Base",			NULL },
    223 { ISAKMP_ETYPE_IDENT,	"Identity Protection",	NULL },
    224 { ISAKMP_ETYPE_AUTH,	"Authentication Only",	NULL },
    225 { ISAKMP_ETYPE_AGG,	"Aggressive",		NULL },
    226 { ISAKMP_ETYPE_INFO,	"Informational",	NULL },
    227 { ISAKMP_ETYPE_CFG,	"Mode config",		NULL },
    228 { ISAKMP_ETYPE_QUICK,	"Quick",		NULL },
    229 { ISAKMP_ETYPE_NEWGRP,	"New Group",		NULL },
    230 { ISAKMP_ETYPE_ACKINFO,	"Acknowledged Informational",	NULL },
    231 };
    232 
    233 char *
    234 s_isakmp_etype(k)
    235 	int k;
    236 {
    237 	int i;
    238 	for (i = 0; i < ARRAYLEN(name_isakmp_etype); i++)
    239 		if (name_isakmp_etype[i].key == k)
    240 			return name_isakmp_etype[i].str;
    241 	return num2str(k);
    242 }
    243 
    244 static struct ksmap name_isakmp_notify_msg[] = {
    245 { ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE,	"INVALID-PAYLOAD-TYPE",		NULL },
    246 { ISAKMP_NTYPE_DOI_NOT_SUPPORTED,	"DOI-NOT-SUPPORTED",		NULL },
    247 { ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED,	"SITUATION-NOT-SUPPORTED",	NULL },
    248 { ISAKMP_NTYPE_INVALID_COOKIE,		"INVALID-COOKIE",		NULL },
    249 { ISAKMP_NTYPE_INVALID_MAJOR_VERSION,	"INVALID-MAJOR-VERSION",	NULL },
    250 { ISAKMP_NTYPE_INVALID_MINOR_VERSION,	"INVALID-MINOR-VERSION",	NULL },
    251 { ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE,	"INVALID-EXCHANGE-TYPE",	NULL },
    252 { ISAKMP_NTYPE_INVALID_FLAGS,		"INVALID-FLAGS",		NULL },
    253 { ISAKMP_NTYPE_INVALID_MESSAGE_ID,	"INVALID-MESSAGE-ID",		NULL },
    254 { ISAKMP_NTYPE_INVALID_PROTOCOL_ID,	"INVALID-PROTOCOL-ID",		NULL },
    255 { ISAKMP_NTYPE_INVALID_SPI,		"INVALID-SPI",			NULL },
    256 { ISAKMP_NTYPE_INVALID_TRANSFORM_ID,	"INVALID-TRANSFORM-ID",		NULL },
    257 { ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, "ATTRIBUTES-NOT-SUPPORTED",	NULL },
    258 { ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN,	"NO-PROPOSAL-CHOSEN",		NULL },
    259 { ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX,	"BAD-PROPOSAL-SYNTAX",		NULL },
    260 { ISAKMP_NTYPE_PAYLOAD_MALFORMED,	"PAYLOAD-MALFORMED",		NULL },
    261 { ISAKMP_NTYPE_INVALID_KEY_INFORMATION,	"INVALID-KEY-INFORMATION",	NULL },
    262 { ISAKMP_NTYPE_INVALID_ID_INFORMATION,	"INVALID-ID-INFORMATION",	NULL },
    263 { ISAKMP_NTYPE_INVALID_CERT_ENCODING,	"INVALID-CERT-ENCODING",	NULL },
    264 { ISAKMP_NTYPE_INVALID_CERTIFICATE,	"INVALID-CERTIFICATE",		NULL },
    265 { ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX,	"BAD-CERT-REQUEST-SYNTAX",	NULL },
    266 { ISAKMP_NTYPE_INVALID_CERT_AUTHORITY,	"INVALID-CERT-AUTHORITY",	NULL },
    267 { ISAKMP_NTYPE_INVALID_HASH_INFORMATION, "INVALID-HASH-INFORMATION",	NULL },
    268 { ISAKMP_NTYPE_AUTHENTICATION_FAILED,	"AUTHENTICATION-FAILED",	NULL },
    269 { ISAKMP_NTYPE_INVALID_SIGNATURE,	"INVALID-SIGNATURE",		NULL },
    270 { ISAKMP_NTYPE_ADDRESS_NOTIFICATION,	"ADDRESS-NOTIFICATION",		NULL },
    271 { ISAKMP_NTYPE_NOTIFY_SA_LIFETIME,	"NOTIFY-SA-LIFETIME",		NULL },
    272 { ISAKMP_NTYPE_CERTIFICATE_UNAVAILABLE,	"CERTIFICATE-UNAVAILABLE",	NULL },
    273 { ISAKMP_NTYPE_UNSUPPORTED_EXCHANGE_TYPE, "UNSUPPORTED-EXCHANGE-TYPE",	NULL },
    274 { ISAKMP_NTYPE_UNEQUAL_PAYLOAD_LENGTHS,	"UNEQUAL-PAYLOAD-LENGTHS",	NULL },
    275 { ISAKMP_NTYPE_CONNECTED,		"CONNECTED",			NULL },
    276 { ISAKMP_NTYPE_RESPONDER_LIFETIME,	"RESPONDER-LIFETIME",		NULL },
    277 { ISAKMP_NTYPE_REPLAY_STATUS,		"REPLAY-STATUS",		NULL },
    278 { ISAKMP_NTYPE_INITIAL_CONTACT,		"INITIAL-CONTACT",		NULL },
    279 { ISAKMP_NTYPE_R_U_THERE,		"R-U-THERE",			NULL },
    280 { ISAKMP_NTYPE_R_U_THERE_ACK,		"R-U-THERE-ACK",		NULL },
    281 #ifdef ENABLE_HYBRID
    282 { ISAKMP_NTYPE_UNITY_HEARTBEAT,		"HEARTBEAT (Unity)",		NULL },
    283 #endif
    284 { ISAKMP_LOG_RETRY_LIMIT_REACHED,	"RETRY-LIMIT-REACHED",		NULL },
    285 };
    286 
    287 char *
    288 s_isakmp_notify_msg(k)
    289 	int k;
    290 {
    291 	int i;
    292 	for (i = 0; i < ARRAYLEN(name_isakmp_notify_msg); i++)
    293 		if (name_isakmp_notify_msg[i].key == k)
    294 			return name_isakmp_notify_msg[i].str;
    295 
    296 	return num2str(k);
    297 }
    298 
    299 static struct ksmap name_isakmp_nptype[] = {
    300 { ISAKMP_NPTYPE_NONE,		"none",		NULL },
    301 { ISAKMP_NPTYPE_SA,		"sa",		NULL },
    302 { ISAKMP_NPTYPE_P,		"prop",		NULL },
    303 { ISAKMP_NPTYPE_T,		"trns",		NULL },
    304 { ISAKMP_NPTYPE_KE,		"ke",		NULL },
    305 { ISAKMP_NPTYPE_ID,		"id",		NULL },
    306 { ISAKMP_NPTYPE_CERT,		"cert",		NULL },
    307 { ISAKMP_NPTYPE_CR,		"cr",		NULL },
    308 { ISAKMP_NPTYPE_HASH,		"hash",		NULL },
    309 { ISAKMP_NPTYPE_SIG,		"sig",		NULL },
    310 { ISAKMP_NPTYPE_NONCE,		"nonce",	NULL },
    311 { ISAKMP_NPTYPE_N,		"notify",	NULL },
    312 { ISAKMP_NPTYPE_D,		"delete",	NULL },
    313 { ISAKMP_NPTYPE_VID,		"vid",		NULL },
    314 { ISAKMP_NPTYPE_ATTR,		"attr",		NULL },
    315 { ISAKMP_NPTYPE_GSS,		"gss id",	NULL },
    316 { ISAKMP_NPTYPE_NATD_RFC,	"nat-d",	NULL },
    317 { ISAKMP_NPTYPE_NATOA_RFC,	"nat-oa",	NULL },
    318 { ISAKMP_NPTYPE_NATD_DRAFT,	"nat-d",	NULL },
    319 { ISAKMP_NPTYPE_NATOA_DRAFT,	"nat-oa",	NULL },
    320 { ISAKMP_NPTYPE_FRAG,		"ike frag",	NULL },
    321 };
    322 
    323 char *
    324 s_isakmp_nptype(k)
    325 	int k;
    326 {
    327 	int i;
    328 	for (i = 0; i < ARRAYLEN(name_isakmp_nptype); i++)
    329 		if (name_isakmp_nptype[i].key == k)
    330 			return name_isakmp_nptype[i].str;
    331 	return num2str(k);
    332 }
    333 
    334 #ifdef ENABLE_HYBRID
    335 /* isakmp_cfg.h / isakmp_unity.h / isakmp_xauth.h */
    336 static struct ksmap name_isakmp_cfg_type[] = {
    337 { INTERNAL_IP4_ADDRESS,		"INTERNAL_IP4_ADDRESS",		NULL },
    338 { INTERNAL_IP4_NETMASK,		"INTERNAL_IP4_NETMASK",		NULL },
    339 { INTERNAL_IP4_DNS,		"INTERNAL_IP4_DNS",		NULL },
    340 { INTERNAL_IP4_NBNS,		"INTERNAL_IP4_NBNS",		NULL },
    341 { INTERNAL_ADDRESS_EXPIRY,	"INTERNAL_ADDRESS_EXPIRY",	NULL },
    342 { INTERNAL_IP4_DHCP,		"INTERNAL_IP4_DHCP",		NULL },
    343 { APPLICATION_VERSION,		"APPLICATION_VERSION",		NULL },
    344 { INTERNAL_IP6_ADDRESS,		"INTERNAL_IP6_ADDRESS",		NULL },
    345 { INTERNAL_IP6_NETMASK,		"INTERNAL_IP6_NETMASK",		NULL },
    346 { INTERNAL_IP6_DNS,		"INTERNAL_IP6_DNS",		NULL },
    347 { INTERNAL_IP6_NBNS,		"INTERNAL_IP6_NBNS",		NULL },
    348 { INTERNAL_IP6_DHCP,		"INTERNAL_IP6_DHCP",		NULL },
    349 { INTERNAL_IP4_SUBNET,		"INTERNAL_IP4_SUBNET",		NULL },
    350 { SUPPORTED_ATTRIBUTES,		"SUPPORTED_ATTRIBUTES",		NULL },
    351 { INTERNAL_IP6_SUBNET,		"INTERNAL_IP6_SUBNET",		NULL },
    352 { XAUTH_TYPE,			"XAUTH_TYPE",			NULL },
    353 { XAUTH_USER_NAME,		"XAUTH_USER_NAME",		NULL },
    354 { XAUTH_USER_PASSWORD,		"XAUTH_USER_PASSWORD",		NULL },
    355 { XAUTH_PASSCODE,		"XAUTH_PASSCODE",		NULL },
    356 { XAUTH_MESSAGE,		"XAUTH_MESSAGE",		NULL },
    357 { XAUTH_CHALLENGE,		"XAUTH_CHALLENGE",		NULL },
    358 { XAUTH_DOMAIN,			"XAUTH_DOMAIN",			NULL },
    359 { XAUTH_STATUS,			"XAUTH_STATUS",			NULL },
    360 { XAUTH_NEXT_PIN,		"XAUTH_NEXT_PIN",		NULL },
    361 { XAUTH_ANSWER,			"XAUTH_ANSWER",			NULL },
    362 { UNITY_BANNER,			"UNITY_BANNER",			NULL },
    363 { UNITY_SAVE_PASSWD,		"UNITY_SAVE_PASSWD",		NULL },
    364 { UNITY_DEF_DOMAIN,		"UNITY_DEF_DOMAIN",		NULL },
    365 { UNITY_SPLITDNS_NAME,		"UNITY_SPLITDNS_NAME",		NULL },
    366 { UNITY_SPLIT_INCLUDE,		"UNITY_SPLIT_INCLUDE",		NULL },
    367 { UNITY_NATT_PORT,		"UNITY_NATT_PORT",		NULL },
    368 { UNITY_LOCAL_LAN,		"UNITY_LOCAL_LAN",		NULL },
    369 { UNITY_PFS,			"UNITY_PFS",			NULL },
    370 { UNITY_FW_TYPE,		"UNITY_FW_TYPE",		NULL },
    371 { UNITY_BACKUP_SERVERS,		"UNITY_BACKUP_SERVERS",		NULL },
    372 { UNITY_DDNS_HOSTNAME,		"UNITY_DDNS_HOSTNAME",		NULL },
    373 };
    374 
    375 char *
    376 s_isakmp_cfg_type(k)
    377 	int k;
    378 {
    379 	int i;
    380 	for (i = 0; i < ARRAYLEN(name_isakmp_cfg_type); i++)
    381 		if (name_isakmp_cfg_type[i].key == k)
    382 			return name_isakmp_cfg_type[i].str;
    383 	return num2str(k);
    384 }
    385 
    386 /* isakmp_cfg.h / isakmp_unity.h / isakmp_xauth.h */
    387 static struct ksmap name_isakmp_cfg_ptype[] = {
    388 { ISAKMP_CFG_ACK,		"mode config ACK",		NULL },
    389 { ISAKMP_CFG_SET,		"mode config SET",		NULL },
    390 { ISAKMP_CFG_REQUEST,		"mode config REQUEST",		NULL },
    391 { ISAKMP_CFG_REPLY,		"mode config REPLY",		NULL },
    392 };
    393 
    394 char *
    395 s_isakmp_cfg_ptype(k)
    396 	int k;
    397 {
    398 	int i;
    399 	for (i = 0; i < ARRAYLEN(name_isakmp_cfg_ptype); i++)
    400 		if (name_isakmp_cfg_ptype[i].key == k)
    401 			return name_isakmp_cfg_ptype[i].str;
    402 	return num2str(k);
    403 }
    404 
    405 #endif
    406 
    407 /* ipsec_doi.h */
    408 static struct ksmap name_ipsecdoi_proto[] = {
    409 { IPSECDOI_PROTO_ISAKMP,	"ISAKMP",	s_ipsecdoi_trns_isakmp },
    410 { IPSECDOI_PROTO_IPSEC_AH,	"AH",		s_ipsecdoi_trns_ah },
    411 { IPSECDOI_PROTO_IPSEC_ESP,	"ESP",		s_ipsecdoi_trns_esp },
    412 { IPSECDOI_PROTO_IPCOMP,	"IPCOMP",	s_ipsecdoi_trns_ipcomp },
    413 };
    414 
    415 char *
    416 s_ipsecdoi_proto(k)
    417 	int k;
    418 {
    419 	int i;
    420 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_proto); i++)
    421 		if (name_ipsecdoi_proto[i].key == k)
    422 			return name_ipsecdoi_proto[i].str;
    423 	return num2str(k);
    424 }
    425 
    426 static struct ksmap name_ipsecdoi_trns_isakmp[] = {
    427 { IPSECDOI_KEY_IKE,	"IKE", NULL },
    428 };
    429 
    430 char *
    431 s_ipsecdoi_trns_isakmp(k)
    432 	int k;
    433 {
    434 	int i;
    435 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_isakmp); i++)
    436 		if (name_ipsecdoi_trns_isakmp[i].key == k)
    437 			return name_ipsecdoi_trns_isakmp[i].str;
    438 	return num2str(k);
    439 }
    440 
    441 static struct ksmap name_ipsecdoi_trns_ah[] = {
    442 { IPSECDOI_AH_MD5,	"MD5", NULL },
    443 { IPSECDOI_AH_SHA,	"SHA", NULL },
    444 { IPSECDOI_AH_DES,	"DES", NULL },
    445 { IPSECDOI_AH_SHA256,	"SHA256", NULL },
    446 { IPSECDOI_AH_SHA384,	"SHA384", NULL },
    447 { IPSECDOI_AH_SHA512,	"SHA512", NULL },
    448 };
    449 
    450 char *
    451 s_ipsecdoi_trns_ah(k)
    452 	int k;
    453 {
    454 	int i;
    455 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_ah); i++)
    456 		if (name_ipsecdoi_trns_ah[i].key == k)
    457 			return name_ipsecdoi_trns_ah[i].str;
    458 	return num2str(k);
    459 }
    460 
    461 static struct ksmap name_ipsecdoi_trns_esp[] = {
    462 { IPSECDOI_ESP_DES_IV64,	"DES_IV64",	NULL },
    463 { IPSECDOI_ESP_DES,		"DES",		NULL },
    464 { IPSECDOI_ESP_3DES,		"3DES",		NULL },
    465 { IPSECDOI_ESP_RC5,		"RC5",		NULL },
    466 { IPSECDOI_ESP_IDEA,		"IDEA",		NULL },
    467 { IPSECDOI_ESP_CAST,		"CAST",		NULL },
    468 { IPSECDOI_ESP_BLOWFISH,	"BLOWFISH",	NULL },
    469 { IPSECDOI_ESP_3IDEA,		"3IDEA",	NULL },
    470 { IPSECDOI_ESP_DES_IV32,	"DES_IV32",	NULL },
    471 { IPSECDOI_ESP_RC4,		"RC4",		NULL },
    472 { IPSECDOI_ESP_NULL,		"NULL",		NULL },
    473 { IPSECDOI_ESP_AES,		"AES",		NULL },
    474 { IPSECDOI_ESP_TWOFISH,		"TWOFISH",	NULL },
    475 { IPSECDOI_ESP_CAMELLIA,	"CAMELLIA",	NULL },
    476 };
    477 
    478 char *
    479 s_ipsecdoi_trns_esp(k)
    480 	int k;
    481 {
    482 	int i;
    483 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_esp); i++)
    484 		if (name_ipsecdoi_trns_esp[i].key == k)
    485 			return name_ipsecdoi_trns_esp[i].str;
    486 	return num2str(k);
    487 }
    488 
    489 static struct ksmap name_ipsecdoi_trns_ipcomp[] = {
    490 { IPSECDOI_IPCOMP_OUI,		"OUI",		NULL},
    491 { IPSECDOI_IPCOMP_DEFLATE,	"DEFLATE",	NULL},
    492 { IPSECDOI_IPCOMP_LZS,		"LZS",		NULL},
    493 };
    494 
    495 char *
    496 s_ipsecdoi_trns_ipcomp(k)
    497 	int k;
    498 {
    499 	int i;
    500 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_trns_ipcomp); i++)
    501 		if (name_ipsecdoi_trns_ipcomp[i].key == k)
    502 			return name_ipsecdoi_trns_ipcomp[i].str;
    503 	return num2str(k);
    504 }
    505 
    506 char *
    507 s_ipsecdoi_trns(proto, trns)
    508 	int proto, trns;
    509 {
    510 	int i;
    511 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_proto); i++)
    512 		if (name_ipsecdoi_proto[i].key == proto
    513 		 && name_ipsecdoi_proto[i].f)
    514 			return (name_ipsecdoi_proto[i].f)(trns);
    515 	return num2str(trns);
    516 }
    517 
    518 static struct ksmap name_attr_ipsec[] = {
    519 { IPSECDOI_ATTR_SA_LD_TYPE,	"SA Life Type",		s_ipsecdoi_ltype },
    520 { IPSECDOI_ATTR_SA_LD,		"SA Life Duration",	NULL },
    521 { IPSECDOI_ATTR_GRP_DESC,	"Group Description",	NULL },
    522 { IPSECDOI_ATTR_ENC_MODE,	"Encryption Mode",	s_ipsecdoi_encmode },
    523 { IPSECDOI_ATTR_AUTH,		"Authentication Algorithm", s_ipsecdoi_auth },
    524 { IPSECDOI_ATTR_KEY_LENGTH,	"Key Length",		NULL },
    525 { IPSECDOI_ATTR_KEY_ROUNDS,	"Key Rounds",		NULL },
    526 { IPSECDOI_ATTR_COMP_DICT_SIZE,	"Compression Dictionary Size",	NULL },
    527 { IPSECDOI_ATTR_COMP_PRIVALG,	"Compression Private Algorithm", NULL },
    528 };
    529 
    530 char *
    531 s_ipsecdoi_attr(k)
    532 	int k;
    533 {
    534 	int i;
    535 	for (i = 0; i < ARRAYLEN(name_attr_ipsec); i++)
    536 		if (name_attr_ipsec[i].key == k)
    537 			return name_attr_ipsec[i].str;
    538 	return num2str(k);
    539 }
    540 
    541 static struct ksmap name_attr_ipsec_ltype[] = {
    542 { IPSECDOI_ATTR_SA_LD_TYPE_SEC,	"seconds",	NULL },
    543 { IPSECDOI_ATTR_SA_LD_TYPE_KB,	"kilobytes",	NULL },
    544 };
    545 
    546 char *
    547 s_ipsecdoi_ltype(k)
    548 	int k;
    549 {
    550 	int i;
    551 	for (i = 0; i < ARRAYLEN(name_attr_ipsec_ltype); i++)
    552 		if (name_attr_ipsec_ltype[i].key == k)
    553 			return name_attr_ipsec_ltype[i].str;
    554 	return num2str(k);
    555 }
    556 
    557 static struct ksmap name_attr_ipsec_encmode[] = {
    558 { IPSECDOI_ATTR_ENC_MODE_ANY,		"Any",		NULL },
    559 { IPSECDOI_ATTR_ENC_MODE_TUNNEL,	"Tunnel",	NULL },
    560 { IPSECDOI_ATTR_ENC_MODE_TRNS,		"Transport",	NULL },
    561 { IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC,	"UDP-Tunnel",	NULL },
    562 { IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC,	"UDP-Transport",	NULL },
    563 { IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT,	"UDP-Tunnel",	NULL },
    564 { IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT,	"UDP-Transport",	NULL },
    565 };
    566 
    567 char *
    568 s_ipsecdoi_encmode(k)
    569 	int k;
    570 {
    571 	int i;
    572 	for (i = 0; i < ARRAYLEN(name_attr_ipsec_encmode); i++)
    573 		if (name_attr_ipsec_encmode[i].key == k)
    574 			return name_attr_ipsec_encmode[i].str;
    575 	return num2str(k);
    576 }
    577 
    578 static struct ksmap name_attr_ipsec_auth[] = {
    579 { IPSECDOI_ATTR_AUTH_HMAC_MD5,		"hmac-md5",	NULL },
    580 { IPSECDOI_ATTR_AUTH_HMAC_SHA1,		"hmac-sha",	NULL },
    581 { IPSECDOI_ATTR_AUTH_HMAC_SHA2_256,	"hmac-sha256",	NULL },
    582 { IPSECDOI_ATTR_AUTH_HMAC_SHA2_384,	"hmac-sha384",	NULL },
    583 { IPSECDOI_ATTR_AUTH_HMAC_SHA2_512,	"hmac-sha512",	NULL },
    584 { IPSECDOI_ATTR_AUTH_DES_MAC,		"des-mac",	NULL },
    585 { IPSECDOI_ATTR_AUTH_KPDK,		"kpdk",		NULL },
    586 };
    587 
    588 char *
    589 s_ipsecdoi_auth(k)
    590 	int k;
    591 {
    592 	int i;
    593 	for (i = 0; i < ARRAYLEN(name_attr_ipsec_auth); i++)
    594 		if (name_attr_ipsec_auth[i].key == k)
    595 			return name_attr_ipsec_auth[i].str;
    596 	return num2str(k);
    597 }
    598 
    599 char *
    600 s_ipsecdoi_attr_v(type, val)
    601 	int type, val;
    602 {
    603 	int i;
    604 	for (i = 0; i < ARRAYLEN(name_attr_ipsec); i++)
    605 		if (name_attr_ipsec[i].key == type
    606 		 && name_attr_ipsec[i].f)
    607 			return (name_attr_ipsec[i].f)(val);
    608 	return num2str(val);
    609 }
    610 
    611 static struct ksmap name_ipsecdoi_ident[] = {
    612 { IPSECDOI_ID_IPV4_ADDR,	"IPv4_address",	NULL },
    613 { IPSECDOI_ID_FQDN,		"FQDN",		NULL },
    614 { IPSECDOI_ID_USER_FQDN,	"User_FQDN",	NULL },
    615 { IPSECDOI_ID_IPV4_ADDR_SUBNET,	"IPv4_subnet",	NULL },
    616 { IPSECDOI_ID_IPV6_ADDR,	"IPv6_address",	NULL },
    617 { IPSECDOI_ID_IPV6_ADDR_SUBNET,	"IPv6_subnet",	NULL },
    618 { IPSECDOI_ID_IPV4_ADDR_RANGE,	"IPv4_address_range",	NULL },
    619 { IPSECDOI_ID_IPV6_ADDR_RANGE,	"IPv6_address_range",	NULL },
    620 { IPSECDOI_ID_DER_ASN1_DN,	"DER_ASN1_DN",	NULL },
    621 { IPSECDOI_ID_DER_ASN1_GN,	"DER_ASN1_GN",	NULL },
    622 { IPSECDOI_ID_KEY_ID,		"KEY_ID",	NULL },
    623 };
    624 
    625 char *
    626 s_ipsecdoi_ident(k)
    627 	int k;
    628 {
    629 	int i;
    630 	for (i = 0; i < ARRAYLEN(name_ipsecdoi_ident); i++)
    631 		if (name_ipsecdoi_ident[i].key == k)
    632 			return name_ipsecdoi_ident[i].str;
    633 	return num2str(k);
    634 }
    635 
    636 /* oakley.h */
    637 static struct ksmap name_oakley_attr[] = {
    638 { OAKLEY_ATTR_ENC_ALG,		"Encryption Algorithm",	s_attr_isakmp_enc },
    639 { OAKLEY_ATTR_HASH_ALG,		"Hash Algorithm",	s_attr_isakmp_hash },
    640 { OAKLEY_ATTR_AUTH_METHOD,	"Authentication Method", s_oakley_attr_method },
    641 { OAKLEY_ATTR_GRP_DESC,		"Group Description",	s_attr_isakmp_desc },
    642 { OAKLEY_ATTR_GRP_TYPE,		"Group Type",		s_attr_isakmp_group },
    643 { OAKLEY_ATTR_GRP_PI,		"Group Prime/Irreducible Polynomial",	NULL },
    644 { OAKLEY_ATTR_GRP_GEN_ONE,	"Group Generator One",	NULL },
    645 { OAKLEY_ATTR_GRP_GEN_TWO,	"Group Generator Two",	NULL },
    646 { OAKLEY_ATTR_GRP_CURVE_A,	"Group Curve A",	NULL },
    647 { OAKLEY_ATTR_GRP_CURVE_B,	"Group Curve B",	NULL },
    648 { OAKLEY_ATTR_SA_LD_TYPE,	"Life Type",		s_attr_isakmp_ltype },
    649 { OAKLEY_ATTR_SA_LD,		"Life Duration",	NULL },
    650 { OAKLEY_ATTR_PRF,		"PRF",			NULL },
    651 { OAKLEY_ATTR_KEY_LEN,		"Key Length",		NULL },
    652 { OAKLEY_ATTR_FIELD_SIZE,	"Field Size",		NULL },
    653 { OAKLEY_ATTR_GRP_ORDER,	"Group Order",		NULL },
    654 { OAKLEY_ATTR_BLOCK_SIZE,	"Block Size",		NULL },
    655 { OAKLEY_ATTR_GSS_ID,		"GSS-API endpoint name",NULL },
    656 };
    657 
    658 char *
    659 s_oakley_attr(k)
    660 	int k;
    661 {
    662 	int i;
    663 	for (i = 0; i < ARRAYLEN(name_oakley_attr); i++)
    664 		if (name_oakley_attr[i].key == k)
    665 			return name_oakley_attr[i].str;
    666 	return num2str(k);
    667 }
    668 
    669 static struct ksmap name_attr_isakmp_enc[] = {
    670 { OAKLEY_ATTR_ENC_ALG_DES,	"DES-CBC",		NULL },
    671 { OAKLEY_ATTR_ENC_ALG_IDEA,	"IDEA-CBC",		NULL },
    672 { OAKLEY_ATTR_ENC_ALG_BLOWFISH,	"Blowfish-CBC",		NULL },
    673 { OAKLEY_ATTR_ENC_ALG_RC5,	"RC5-R16-B64-CBC",	NULL },
    674 { OAKLEY_ATTR_ENC_ALG_3DES,	"3DES-CBC",		NULL },
    675 { OAKLEY_ATTR_ENC_ALG_CAST,	"CAST-CBC",		NULL },
    676 { OAKLEY_ATTR_ENC_ALG_AES,	"AES-CBC",		NULL },
    677 };
    678 
    679 char *
    680 s_attr_isakmp_enc(k)
    681 	int k;
    682 {
    683 	int i;
    684 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_enc); i++)
    685 		if (name_attr_isakmp_enc[i].key == k)
    686 			return name_attr_isakmp_enc[i].str;
    687 	return num2str(k);
    688 }
    689 
    690 static struct ksmap name_attr_isakmp_hash[] = {
    691 { OAKLEY_ATTR_HASH_ALG_MD5,	"MD5",		NULL },
    692 { OAKLEY_ATTR_HASH_ALG_SHA,	"SHA",		NULL },
    693 { OAKLEY_ATTR_HASH_ALG_TIGER,	"Tiger",	NULL },
    694 { OAKLEY_ATTR_HASH_ALG_SHA2_256,"SHA256",	NULL },
    695 { OAKLEY_ATTR_HASH_ALG_SHA2_384,"SHA384",	NULL },
    696 { OAKLEY_ATTR_HASH_ALG_SHA2_512,"SHA512",	NULL },
    697 };
    698 
    699 char *
    700 s_attr_isakmp_hash(k)
    701 	int k;
    702 {
    703 	int i;
    704 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_hash); i++)
    705 		if (name_attr_isakmp_hash[i].key == k)
    706 			return name_attr_isakmp_hash[i].str;
    707 	return num2str(k);
    708 }
    709 
    710 static struct ksmap name_attr_isakmp_method[] = {
    711 { OAKLEY_ATTR_AUTH_METHOD_PSKEY,		"pre-shared key",	NULL },
    712 { OAKLEY_ATTR_AUTH_METHOD_DSSSIG,		"DSS signatures",	NULL },
    713 { OAKLEY_ATTR_AUTH_METHOD_RSASIG,		"RSA signatures",	NULL },
    714 { OAKLEY_ATTR_AUTH_METHOD_RSAENC,		"Encryption with RSA",	NULL },
    715 { OAKLEY_ATTR_AUTH_METHOD_RSAREV,		"Revised encryption with RSA",	NULL },
    716 { OAKLEY_ATTR_AUTH_METHOD_EGENC,		"Encryption with El-Gamal",	NULL },
    717 { OAKLEY_ATTR_AUTH_METHOD_EGREV,		"Revised encryption with El-Gamal",	NULL },
    718 #ifdef HAVE_GSSAPI
    719 { OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB,		"GSS-API on Kerberos 5", NULL },
    720 #endif
    721 #ifdef ENABLE_HYBRID
    722 { OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R,		"Hybrid DSS server",	NULL },
    723 { OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R,		"Hybrid RSA server",	NULL },
    724 { OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I,		"Hybrid DSS client",	NULL },
    725 { OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I,		"Hybrid RSA client",	NULL },
    726 { OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I,	"XAuth pskey client",	NULL },
    727 { OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R,	"XAuth pskey server",	NULL },
    728 { OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I,	"XAuth RSASIG client",	NULL },
    729 { OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R,	"XAuth RSASIG server",	NULL },
    730 #endif
    731 };
    732 
    733 char *
    734 s_oakley_attr_method(k)
    735 	int k;
    736 {
    737 	int i;
    738 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_method); i++)
    739 		if (name_attr_isakmp_method[i].key == k)
    740 			return name_attr_isakmp_method[i].str;
    741 	return num2str(k);
    742 }
    743 
    744 static struct ksmap name_attr_isakmp_desc[] = {
    745 { OAKLEY_ATTR_GRP_DESC_MODP768,		"768-bit MODP group",	NULL },
    746 { OAKLEY_ATTR_GRP_DESC_MODP1024,	"1024-bit MODP group",	NULL },
    747 { OAKLEY_ATTR_GRP_DESC_EC2N155,		"EC2N group on GP[2^155]",	NULL },
    748 { OAKLEY_ATTR_GRP_DESC_EC2N185,		"EC2N group on GP[2^185]",	NULL },
    749 { OAKLEY_ATTR_GRP_DESC_MODP1536,	"1536-bit MODP group",	NULL },
    750 { OAKLEY_ATTR_GRP_DESC_MODP2048,	"2048-bit MODP group",	NULL },
    751 { OAKLEY_ATTR_GRP_DESC_MODP3072,	"3072-bit MODP group",	NULL },
    752 { OAKLEY_ATTR_GRP_DESC_MODP4096,	"4096-bit MODP group",	NULL },
    753 { OAKLEY_ATTR_GRP_DESC_MODP6144,	"6144-bit MODP group",	NULL },
    754 { OAKLEY_ATTR_GRP_DESC_MODP8192,	"8192-bit MODP group",	NULL },
    755 };
    756 
    757 char *
    758 s_attr_isakmp_desc(k)
    759 	int k;
    760 {
    761 	int i;
    762 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_desc); i++)
    763 		if (name_attr_isakmp_desc[i].key == k)
    764 			return name_attr_isakmp_desc[i].str;
    765 	return num2str(k);
    766 }
    767 
    768 static struct ksmap name_attr_isakmp_group[] = {
    769 { OAKLEY_ATTR_GRP_TYPE_MODP,	"MODP",	NULL },
    770 { OAKLEY_ATTR_GRP_TYPE_ECP,	"ECP",	NULL },
    771 { OAKLEY_ATTR_GRP_TYPE_EC2N,	"EC2N",	NULL },
    772 };
    773 
    774 char *
    775 s_attr_isakmp_group(k)
    776 	int k;
    777 {
    778 	int i;
    779 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_group); i++)
    780 		if (name_attr_isakmp_group[i].key == k)
    781 			return name_attr_isakmp_group[i].str;
    782 	return num2str(k);
    783 }
    784 
    785 static struct ksmap name_attr_isakmp_ltype[] = {
    786 { OAKLEY_ATTR_SA_LD_TYPE_SEC,	"seconds",	NULL },
    787 { OAKLEY_ATTR_SA_LD_TYPE_KB,	"kilobytes",	NULL },
    788 };
    789 
    790 char *
    791 s_attr_isakmp_ltype(k)
    792 	int k;
    793 {
    794 	int i;
    795 	for (i = 0; i < ARRAYLEN(name_attr_isakmp_ltype); i++)
    796 		if (name_attr_isakmp_ltype[i].key == k)
    797 			return name_attr_isakmp_ltype[i].str;
    798 	return num2str(k);
    799 }
    800 
    801 char *
    802 s_oakley_attr_v(type, val)
    803 	int type, val;
    804 {
    805 	int i;
    806 	for (i = 0; i < ARRAYLEN(name_oakley_attr); i++)
    807 		if (name_oakley_attr[i].key == type
    808 		 && name_oakley_attr[i].f)
    809 			return (name_oakley_attr[i].f)(val);
    810 	return num2str(val);
    811 }
    812 
    813 /* netinet6/ipsec.h */
    814 static struct ksmap name_ipsec_level[] = {
    815 { IPSEC_LEVEL_USE,	"use",		NULL },
    816 { IPSEC_LEVEL_REQUIRE,	"require",	NULL },
    817 { IPSEC_LEVEL_UNIQUE,	"unique",	NULL },
    818 };
    819 
    820 char *
    821 s_ipsec_level(k)
    822 	int k;
    823 {
    824 	int i;
    825 	for (i = 0; i < ARRAYLEN(name_ipsec_level); i++)
    826 		if (name_ipsec_level[i].key == k)
    827 			return name_ipsec_level[i].str;
    828 	return num2str(k);
    829 }
    830 
    831 static struct ksmap name_algclass[] = {
    832 { algclass_ipsec_enc,	"ipsec enc",	s_ipsecdoi_trns_esp },
    833 { algclass_ipsec_auth,	"ipsec auth",	s_ipsecdoi_trns_ah },
    834 { algclass_ipsec_comp,	"ipsec comp",	s_ipsecdoi_trns_ipcomp },
    835 { algclass_isakmp_enc,	"isakmp enc",	s_attr_isakmp_enc },
    836 { algclass_isakmp_hash,	"isakmp hash",	s_attr_isakmp_hash },
    837 { algclass_isakmp_dh,	"isakmp dh",	s_attr_isakmp_desc },
    838 { algclass_isakmp_ameth, "isakmp auth method",	s_oakley_attr_method },
    839 };
    840 
    841 char *
    842 s_algclass(k)
    843 	int k;
    844 {
    845 	int i;
    846 	for (i = 0; i < ARRAYLEN(name_algclass); i++)
    847 		if (name_algclass[i].key == k)
    848 			return name_algclass[i].str;
    849 	return num2str(k);
    850 }
    851 
    852 char *
    853 s_algtype(class, n)
    854 	int class, n;
    855 {
    856 	int i;
    857 	for (i = 0; i < ARRAYLEN(name_algclass); i++)
    858 		if (name_algclass[i].key == class
    859 		 && name_algclass[i].f)
    860 			return (name_algclass[i].f)(n);
    861 	return num2str(n);
    862 }
    863 
    864 /* pfkey.h */
    865 static struct ksmap name_pfkey_type[] = {
    866 { SADB_GETSPI,		"GETSPI",	NULL },
    867 { SADB_UPDATE,		"UPDATE",	NULL },
    868 { SADB_ADD,		"ADD",		NULL },
    869 { SADB_DELETE,		"DELETE",	NULL },
    870 { SADB_GET,		"GET",		NULL },
    871 { SADB_ACQUIRE,		"ACQUIRE",	NULL },
    872 { SADB_REGISTER,	"REGISTER",	NULL },
    873 { SADB_EXPIRE,		"EXPIRE",	NULL },
    874 { SADB_FLUSH,		"FLUSH",	NULL },
    875 { SADB_DUMP,		"DUMP",		NULL },
    876 { SADB_X_PROMISC,	"X_PROMISC",	NULL },
    877 { SADB_X_PCHANGE,	"X_PCHANGE",	NULL },
    878 { SADB_X_SPDUPDATE,	"X_SPDUPDATE",	NULL },
    879 { SADB_X_SPDADD,	"X_SPDADD",	NULL },
    880 { SADB_X_SPDDELETE,	"X_SPDDELETE",	NULL },
    881 { SADB_X_SPDGET,	"X_SPDGET",	NULL },
    882 { SADB_X_SPDACQUIRE,	"X_SPDACQUIRE",	NULL },
    883 { SADB_X_SPDDUMP,	"X_SPDDUMP",	NULL },
    884 { SADB_X_SPDFLUSH,	"X_SPDFLUSH",	NULL },
    885 { SADB_X_SPDSETIDX,	"X_SPDSETIDX",	NULL },
    886 { SADB_X_SPDEXPIRE,	"X_SPDEXPIRE",	NULL },
    887 { SADB_X_SPDDELETE2,	"X_SPDDELETE2",	NULL },
    888 #ifdef SADB_X_NAT_T_NEW_MAPPING
    889 { SADB_X_NAT_T_NEW_MAPPING, "X_NAT_T_NEW_MAPPING", NULL },
    890 #endif
    891 #ifdef SADB_X_MIGRATE
    892 { SADB_X_MIGRATE,	"X_MIGRATE",	NULL },
    893 #endif
    894 };
    895 
    896 char *
    897 s_pfkey_type(k)
    898 	int k;
    899 {
    900 	int i;
    901 	for (i = 0; i < ARRAYLEN(name_pfkey_type); i++)
    902 		if (name_pfkey_type[i].key == k)
    903 			return name_pfkey_type[i].str;
    904 	return num2str(k);
    905 }
    906 
    907 static struct ksmap name_pfkey_satype[] = {
    908 { SADB_SATYPE_UNSPEC,	"UNSPEC",	NULL },
    909 { SADB_SATYPE_AH,	"AH",		NULL },
    910 { SADB_SATYPE_ESP,	"ESP",		NULL },
    911 { SADB_SATYPE_RSVP,	"RSVP",		NULL },
    912 { SADB_SATYPE_OSPFV2,	"OSPFV2",	NULL },
    913 { SADB_SATYPE_RIPV2,	"RIPV2",	NULL },
    914 { SADB_SATYPE_MIP,	"MIP",		NULL },
    915 { SADB_X_SATYPE_IPCOMP,	"IPCOMP",	NULL },
    916 };
    917 
    918 char *
    919 s_pfkey_satype(k)
    920 	int k;
    921 {
    922 	int i;
    923 	for (i = 0; i < ARRAYLEN(name_pfkey_satype); i++)
    924 		if (name_pfkey_satype[i].key == k)
    925 			return name_pfkey_satype[i].str;
    926 	return num2str(k);
    927 }
    928 
    929 static struct ksmap name_direction[] = {
    930 { IPSEC_DIR_INBOUND,	"in",	NULL },
    931 { IPSEC_DIR_OUTBOUND,	"out",	NULL },
    932 #ifdef HAVE_POLICY_FWD
    933 { IPSEC_DIR_FWD,	"fwd",	NULL },
    934 #endif
    935 };
    936 
    937 char *
    938 s_direction(k)
    939 	int k;
    940 {
    941 	int i;
    942 	for (i = 0; i < ARRAYLEN(name_direction); i++)
    943 		if (name_direction[i].key == k)
    944 			return name_direction[i].str;
    945 	return num2str(k);
    946 }
    947 
    948 char *
    949 s_proto(k)
    950 	int k;
    951 {
    952 	switch (k) {
    953 	case IPPROTO_ICMP:
    954 		return "icmp";
    955 	case IPPROTO_TCP:
    956 		return "tcp";
    957 	case IPPROTO_UDP:
    958 		return "udp";
    959 	case IPPROTO_ICMPV6:
    960 		return "icmpv6";
    961 	case IPSEC_ULPROTO_ANY:
    962 		return "any";
    963 	}
    964 
    965 	return num2str(k);
    966 }
    967 
    968 char *
    969 s_doi(int k)
    970 {
    971   switch (k) {
    972     case IPSEC_DOI:
    973       return "ipsec_doi";
    974     default:
    975       return num2str(k);
    976   }
    977 }
    978 
    979 char *
    980 s_etype (int k)
    981 {
    982   switch (k) {
    983     case ISAKMP_ETYPE_NONE:
    984       return "_none";
    985     case ISAKMP_ETYPE_BASE:
    986       return "base";
    987     case ISAKMP_ETYPE_IDENT:
    988       return "main";
    989     case ISAKMP_ETYPE_AUTH:
    990       return "_auth";
    991     case ISAKMP_ETYPE_AGG:
    992       return "aggressive";
    993     case ISAKMP_ETYPE_INFO:
    994       return "_info";
    995     case ISAKMP_ETYPE_QUICK:
    996       return "_quick";
    997     case ISAKMP_ETYPE_NEWGRP:
    998       return "_newgrp";
    999     case ISAKMP_ETYPE_ACKINFO:
   1000       return "_ackinfo";
   1001     default:
   1002       return num2str(k);
   1003   }
   1004 }
   1005 
   1006 char *
   1007 s_idtype (int k)
   1008 {
   1009   switch (k) {
   1010     case IDTYPE_FQDN:
   1011       return "fqdn";
   1012     case IDTYPE_USERFQDN:
   1013       return "user_fqdn";
   1014     case IDTYPE_KEYID:
   1015       return "keyid";
   1016     case IDTYPE_ADDRESS:
   1017       return "address";
   1018     case IDTYPE_ASN1DN:
   1019       return "asn1dn";
   1020     default:
   1021       return num2str(k);
   1022   }
   1023 }
   1024 
   1025 char *
   1026 s_switch (int k)
   1027 {
   1028   switch (k) {
   1029     case FALSE:
   1030       return "off";
   1031     case TRUE:
   1032       return "on";
   1033     default:
   1034       return num2str(k);
   1035   }
   1036 }
   1037