162583Sitojun/*	$FreeBSD$	*/
262583Sitojun/*	$KAME: test-pfkey.c,v 1.4 2000/06/07 00:29:14 itojun Exp $	*/
362583Sitojun
455505Sshin/*
555505Sshin * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
655505Sshin * All rights reserved.
762583Sitojun *
855505Sshin * Redistribution and use in source and binary forms, with or without
955505Sshin * modification, are permitted provided that the following conditions
1055505Sshin * are met:
1155505Sshin * 1. Redistributions of source code must retain the above copyright
1255505Sshin *    notice, this list of conditions and the following disclaimer.
1355505Sshin * 2. Redistributions in binary form must reproduce the above copyright
1455505Sshin *    notice, this list of conditions and the following disclaimer in the
1555505Sshin *    documentation and/or other materials provided with the distribution.
1655505Sshin * 3. Neither the name of the project nor the names of its contributors
1755505Sshin *    may be used to endorse or promote products derived from this software
1855505Sshin *    without specific prior written permission.
1962583Sitojun *
2055505Sshin * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
2155505Sshin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2255505Sshin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2355505Sshin * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
2455505Sshin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2555505Sshin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2655505Sshin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2755505Sshin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2855505Sshin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2955505Sshin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3055505Sshin * SUCH DAMAGE.
3155505Sshin */
3255505Sshin
3355505Sshin#include <sys/types.h>
3455505Sshin#include <sys/param.h>
3555505Sshin#include <sys/socket.h>
3655505Sshin#include <net/route.h>
3755505Sshin#include <net/pfkeyv2.h>
3855505Sshin#include <netinet/in.h>
39171135Sgnn#include <netipsec/keydb.h>
40171135Sgnn#include <netipsec/key_var.h>
41171135Sgnn#include <netipsec/key_debug.h>
4255505Sshin
4355505Sshin#include <stdio.h>
4455505Sshin#include <stdlib.h>
4555505Sshin#include <limits.h>
4655505Sshin#include <string.h>
4755505Sshin#include <ctype.h>
4855505Sshin#include <unistd.h>
4955505Sshin#include <errno.h>
5062583Sitojun#include <netdb.h>
5155505Sshin
5262583Sitojunu_char m_buf[BUFSIZ];
5362583Sitojunu_int m_len;
5462583Sitojunchar *pname;
5555505Sshin
56173412Skevlovoid Usage(void);
57173412Skevloint sendkeymsg(void);
58173412Skevlovoid key_setsadbmsg(u_int);
59173412Skevlovoid key_setsadbsens(void);
60173412Skevlovoid key_setsadbprop(void);
61173412Skevlovoid key_setsadbid(u_int, caddr_t);
62173412Skevlovoid key_setsadblft(u_int, u_int);
63173412Skevlovoid key_setspirange(void);
64173412Skevlovoid key_setsadbkey(u_int, caddr_t);
65173412Skevlovoid key_setsadbsa(void);
66173412Skevlovoid key_setsadbaddr(u_int, u_int, caddr_t);
67173412Skevlovoid key_setsadbextbuf(caddr_t, int, caddr_t, int, caddr_t, int);
6855505Sshin
6955505Sshinvoid
7055505SshinUsage()
7155505Sshin{
7255505Sshin	printf("Usage:\t%s number\n", pname);
7355505Sshin	exit(0);
7455505Sshin}
7555505Sshin
7655505Sshinint
7755505Sshinmain(ac, av)
7855505Sshin	int ac;
7955505Sshin	char **av;
8055505Sshin{
8155505Sshin	pname = *av;
8255505Sshin
8355505Sshin	if (ac == 1) Usage();
8455505Sshin
8555505Sshin	key_setsadbmsg(atoi(*(av+1)));
8655505Sshin	sendkeymsg();
8755505Sshin
8855505Sshin	exit(0);
8955505Sshin}
9055505Sshin
9155505Sshin/* %%% */
9255505Sshinint
9355505Sshinsendkeymsg()
9455505Sshin{
9555505Sshin	u_char rbuf[1024 * 32];	/* XXX: Enough ? Should I do MSG_PEEK ? */
9655505Sshin	int so, len;
9755505Sshin
9855505Sshin	if ((so = socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) {
9955505Sshin		perror("socket(PF_KEY)");
10055505Sshin		goto end;
10155505Sshin	}
10262583Sitojun#if 0
10362583Sitojun    {
10462583Sitojun#include <sys/time.h>
10562583Sitojun	struct timeval tv;
10662583Sitojun	tv.tv_sec = 1;
10762583Sitojun	tv.tv_usec = 0;
10862583Sitojun	if (setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) {
10962583Sitojun		perror("setsockopt");
11062583Sitojun		goto end;
11162583Sitojun	}
11262583Sitojun    }
11362583Sitojun#endif
11455505Sshin
11555505Sshin	pfkey_sadump((struct sadb_msg *)m_buf);
11655505Sshin
11755505Sshin	if ((len = send(so, m_buf, m_len, 0)) < 0) {
11855505Sshin		perror("send");
11955505Sshin		goto end;
12055505Sshin	}
12155505Sshin
12255505Sshin	if ((len = recv(so, rbuf, sizeof(rbuf), 0)) < 0) {
12355505Sshin		perror("recv");
12455505Sshin		goto end;
12555505Sshin	}
12655505Sshin
12755505Sshin	pfkey_sadump((struct sadb_msg *)rbuf);
12855505Sshin
12955505Sshinend:
13055505Sshin	(void)close(so);
13155505Sshin	return(0);
13255505Sshin}
13355505Sshin
13455505Sshinvoid
13555505Sshinkey_setsadbmsg(type)
13655505Sshin	u_int type;
13755505Sshin{
13855505Sshin	struct sadb_msg m_msg;
13955505Sshin
14062583Sitojun	memset(&m_msg, 0, sizeof(m_msg));
14155505Sshin	m_msg.sadb_msg_version = PF_KEY_V2;
14255505Sshin	m_msg.sadb_msg_type = type;
14355505Sshin	m_msg.sadb_msg_errno = 0;
14455505Sshin	m_msg.sadb_msg_satype = SADB_SATYPE_ESP;
14562583Sitojun#if 0
14655505Sshin	m_msg.sadb_msg_reserved = 0;
14762583Sitojun#endif
14855505Sshin	m_msg.sadb_msg_seq = 0;
14955505Sshin	m_msg.sadb_msg_pid = getpid();
15055505Sshin
15155505Sshin	m_len = sizeof(struct sadb_msg);
15255505Sshin	memcpy(m_buf, &m_msg, m_len);
15355505Sshin
15455505Sshin	switch (type) {
15555505Sshin	case SADB_GETSPI:
15655505Sshin		/*<base, address(SD), SPI range>*/
15755505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "10.0.3.4");
15855505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "127.0.0.1");
15955505Sshin		key_setspirange();
16055505Sshin		/*<base, SA(*), address(SD)>*/
16155505Sshin		break;
16255505Sshin
16355505Sshin	case SADB_ADD:
16455505Sshin		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
16555505Sshin		   key(AE), (identity(SD),) (sensitivity)> */
16655505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
16755505Sshin	case SADB_UPDATE:
16855505Sshin		key_setsadbsa();
16955505Sshin		key_setsadblft(SADB_EXT_LIFETIME_HARD, 10);
17055505Sshin		key_setsadblft(SADB_EXT_LIFETIME_SOFT, 5);
17155505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
17255505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
17355505Sshin		/* XXX key_setsadbkey(SADB_EXT_KEY_AUTH, "abcde"); */
17455505Sshin		key_setsadbkey(SADB_EXT_KEY_AUTH, "1234567812345678");
17555505Sshin		key_setsadbkey(SADB_EXT_KEY_ENCRYPT, "12345678");
17655505Sshin		key_setsadbid(SADB_EXT_IDENTITY_SRC, "hoge1234@hoge.com");
17755505Sshin		key_setsadbid(SADB_EXT_IDENTITY_DST, "hage5678@hage.net");
17855505Sshin		key_setsadbsens();
17955505Sshin		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
18055505Sshin		  (identity(SD),) (sensitivity)> */
18155505Sshin		break;
18255505Sshin
18355505Sshin	case SADB_DELETE:
18455505Sshin		/* <base, SA(*), address(SDP)> */
18555505Sshin		key_setsadbsa();
18655505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
18755505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
18855505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
18955505Sshin		/* <base, SA(*), address(SDP)> */
19055505Sshin		break;
19155505Sshin
19255505Sshin	case SADB_GET:
19355505Sshin		/* <base, SA(*), address(SDP)> */
19455505Sshin		key_setsadbsa();
19555505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
19655505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
19755505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
19855505Sshin		/* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
19955505Sshin		   key(AE), (identity(SD),) (sensitivity)> */
20055505Sshin		break;
20155505Sshin
20255505Sshin	case SADB_ACQUIRE:
20355505Sshin		/* <base, address(SD), (address(P),) (identity(SD),)
20455505Sshin		   (sensitivity,) proposal> */
20555505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
20655505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
20755505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_PROXY, AF_INET6, "3ffe::1");
20855505Sshin		key_setsadbid(SADB_EXT_IDENTITY_SRC, "hoge1234@hoge.com");
20955505Sshin		key_setsadbid(SADB_EXT_IDENTITY_DST, "hage5678@hage.net");
21055505Sshin		key_setsadbsens();
21155505Sshin		key_setsadbprop();
21255505Sshin		/* <base, address(SD), (address(P),) (identity(SD),)
21355505Sshin		   (sensitivity,) proposal> */
21455505Sshin		break;
21555505Sshin
21655505Sshin	case SADB_REGISTER:
21755505Sshin		/* <base> */
21855505Sshin		/* <base, supported> */
21955505Sshin		break;
22055505Sshin
22155505Sshin	case SADB_EXPIRE:
22255505Sshin	case SADB_FLUSH:
22355505Sshin		break;
22455505Sshin
22555505Sshin	case SADB_DUMP:
22655505Sshin		break;
22755505Sshin
22855505Sshin	case SADB_X_PROMISC:
22955505Sshin		/* <base> */
23055505Sshin		/* <base, base(, others)> */
23155505Sshin		break;
23255505Sshin
23355505Sshin	case SADB_X_PCHANGE:
23455505Sshin		break;
23555505Sshin
23655505Sshin	/* for SPD management */
23755505Sshin	case SADB_X_SPDFLUSH:
23855505Sshin	case SADB_X_SPDDUMP:
23955505Sshin		break;
24055505Sshin
24155505Sshin	case SADB_X_SPDADD:
24262583Sitojun#if 0
24362583Sitojun	    {
24462583Sitojun		struct sadb_x_policy m_policy;
24562583Sitojun
24662583Sitojun		m_policy.sadb_x_policy_len = PFKEY_UNIT64(sizeof(m_policy));
24762583Sitojun		m_policy.sadb_x_policy_exttype = SADB_X_EXT_POLICY;
24862583Sitojun		m_policy.sadb_x_policy_type = SADB_X_PL_IPSEC;
24962583Sitojun		m_policy.sadb_x_policy_esp_trans = 1;
25062583Sitojun		m_policy.sadb_x_policy_ah_trans = 2;
25162583Sitojun		m_policy.sadb_x_policy_esp_network = 3;
25262583Sitojun		m_policy.sadb_x_policy_ah_network = 4;
25362583Sitojun		m_policy.sadb_x_policy_reserved = 0;
25462583Sitojun
25562583Sitojun		memcpy(m_buf + m_len, &m_policy, sizeof(struct sadb_x_policy));
25662583Sitojun		m_len += sizeof(struct sadb_x_policy);
25762583Sitojun	    }
25862583Sitojun#endif
25962583Sitojun
26055505Sshin	case SADB_X_SPDDELETE:
26155505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_SRC, AF_INET, "192.168.1.1");
26255505Sshin		key_setsadbaddr(SADB_EXT_ADDRESS_DST, AF_INET, "10.0.3.4");
26355505Sshin		break;
26455505Sshin	}
26555505Sshin
26655505Sshin	((struct sadb_msg *)m_buf)->sadb_msg_len = PFKEY_UNIT64(m_len);
26755505Sshin
26855505Sshin	return;
26955505Sshin}
27055505Sshin
27155505Sshinvoid
27255505Sshinkey_setsadbsens()
27355505Sshin{
27455505Sshin	struct sadb_sens m_sens;
27555505Sshin	u_char buf[64];
27655505Sshin	u_int s, i, slen, ilen, len;
27755505Sshin
27855505Sshin	/* make sens & integ */
27955505Sshin	s = htonl(0x01234567);
28055505Sshin	i = htonl(0x89abcdef);
28155505Sshin	slen = sizeof(s);
28255505Sshin	ilen = sizeof(i);
28355505Sshin	memcpy(buf, &s, slen);
28455505Sshin	memcpy(buf + slen, &i, ilen);
28555505Sshin
28655505Sshin	len = sizeof(m_sens) + PFKEY_ALIGN8(slen) + PFKEY_ALIGN8(ilen);
28755505Sshin	m_sens.sadb_sens_len = PFKEY_UNIT64(len);
28855505Sshin	m_sens.sadb_sens_exttype = SADB_EXT_SENSITIVITY;
28955505Sshin	m_sens.sadb_sens_dpd = 1;
29055505Sshin	m_sens.sadb_sens_sens_level = 2;
29155505Sshin	m_sens.sadb_sens_sens_len = PFKEY_ALIGN8(slen);
29255505Sshin	m_sens.sadb_sens_integ_level = 3;
29355505Sshin	m_sens.sadb_sens_integ_len = PFKEY_ALIGN8(ilen);
29455505Sshin	m_sens.sadb_sens_reserved = 0;
29555505Sshin
29655505Sshin	key_setsadbextbuf(m_buf, m_len,
29755505Sshin			(caddr_t)&m_sens, sizeof(struct sadb_sens),
29855505Sshin			buf, slen + ilen);
29955505Sshin	m_len += len;
30055505Sshin
30155505Sshin	return;
30255505Sshin}
30355505Sshin
30455505Sshinvoid
30555505Sshinkey_setsadbprop()
30655505Sshin{
30755505Sshin	struct sadb_prop m_prop;
30855505Sshin	struct sadb_comb *m_comb;
30955505Sshin	u_char buf[256];
31055505Sshin	u_int len = sizeof(m_prop) + sizeof(m_comb) * 2;
31155505Sshin
31255505Sshin	/* make prop & comb */
31355505Sshin	m_prop.sadb_prop_len = PFKEY_UNIT64(len);
31455505Sshin	m_prop.sadb_prop_exttype = SADB_EXT_PROPOSAL;
31555505Sshin	m_prop.sadb_prop_replay = 0;
31655505Sshin	m_prop.sadb_prop_reserved[0] = 0;
31755505Sshin	m_prop.sadb_prop_reserved[1] = 0;
31855505Sshin	m_prop.sadb_prop_reserved[2] = 0;
31955505Sshin
32055505Sshin	/* the 1st is ESP DES-CBC HMAC-MD5 */
32155505Sshin	m_comb = (struct sadb_comb *)buf;
32255505Sshin	m_comb->sadb_comb_auth = SADB_AALG_MD5HMAC;
32355505Sshin	m_comb->sadb_comb_encrypt = SADB_EALG_DESCBC;
32455505Sshin	m_comb->sadb_comb_flags = 0;
32555505Sshin	m_comb->sadb_comb_auth_minbits = 8;
32655505Sshin	m_comb->sadb_comb_auth_maxbits = 96;
32755505Sshin	m_comb->sadb_comb_encrypt_minbits = 64;
32855505Sshin	m_comb->sadb_comb_encrypt_maxbits = 64;
32955505Sshin	m_comb->sadb_comb_reserved = 0;
33055505Sshin	m_comb->sadb_comb_soft_allocations = 0;
33155505Sshin	m_comb->sadb_comb_hard_allocations = 0;
33255505Sshin	m_comb->sadb_comb_soft_bytes = 0;
33355505Sshin	m_comb->sadb_comb_hard_bytes = 0;
33455505Sshin	m_comb->sadb_comb_soft_addtime = 0;
33555505Sshin	m_comb->sadb_comb_hard_addtime = 0;
33655505Sshin	m_comb->sadb_comb_soft_usetime = 0;
33755505Sshin	m_comb->sadb_comb_hard_usetime = 0;
33855505Sshin
33955505Sshin	/* the 2st is ESP 3DES-CBC and AH HMAC-SHA1 */
34055505Sshin	m_comb = (struct sadb_comb *)(buf + sizeof(*m_comb));
34155505Sshin	m_comb->sadb_comb_auth = SADB_AALG_SHA1HMAC;
34255505Sshin	m_comb->sadb_comb_encrypt = SADB_EALG_3DESCBC;
34355505Sshin	m_comb->sadb_comb_flags = 0;
34455505Sshin	m_comb->sadb_comb_auth_minbits = 8;
34555505Sshin	m_comb->sadb_comb_auth_maxbits = 96;
34655505Sshin	m_comb->sadb_comb_encrypt_minbits = 64;
34755505Sshin	m_comb->sadb_comb_encrypt_maxbits = 64;
34855505Sshin	m_comb->sadb_comb_reserved = 0;
34955505Sshin	m_comb->sadb_comb_soft_allocations = 0;
35055505Sshin	m_comb->sadb_comb_hard_allocations = 0;
35155505Sshin	m_comb->sadb_comb_soft_bytes = 0;
35255505Sshin	m_comb->sadb_comb_hard_bytes = 0;
35355505Sshin	m_comb->sadb_comb_soft_addtime = 0;
35455505Sshin	m_comb->sadb_comb_hard_addtime = 0;
35555505Sshin	m_comb->sadb_comb_soft_usetime = 0;
35655505Sshin	m_comb->sadb_comb_hard_usetime = 0;
35755505Sshin
35855505Sshin	key_setsadbextbuf(m_buf, m_len,
35955505Sshin			(caddr_t)&m_prop, sizeof(struct sadb_prop),
36055505Sshin			buf, sizeof(*m_comb) * 2);
36155505Sshin	m_len += len;
36255505Sshin
36355505Sshin	return;
36455505Sshin}
36555505Sshin
36655505Sshinvoid
36755505Sshinkey_setsadbid(ext, str)
36855505Sshin	u_int ext;
36955505Sshin	caddr_t str;
37055505Sshin{
37155505Sshin	struct sadb_ident m_id;
37255505Sshin	u_int idlen = strlen(str), len;
37355505Sshin
37455505Sshin	len = sizeof(m_id) + PFKEY_ALIGN8(idlen);
37555505Sshin	m_id.sadb_ident_len = PFKEY_UNIT64(len);
37655505Sshin	m_id.sadb_ident_exttype = ext;
37755505Sshin	m_id.sadb_ident_type = SADB_IDENTTYPE_USERFQDN;
37855505Sshin	m_id.sadb_ident_reserved = 0;
37955505Sshin	m_id.sadb_ident_id = getpid();
38055505Sshin
38155505Sshin	key_setsadbextbuf(m_buf, m_len,
38255505Sshin			(caddr_t)&m_id, sizeof(struct sadb_ident),
38355505Sshin			str, idlen);
38455505Sshin	m_len += len;
38555505Sshin
38655505Sshin	return;
38755505Sshin}
38855505Sshin
38955505Sshinvoid
39055505Sshinkey_setsadblft(ext, time)
39155505Sshin	u_int ext, time;
39255505Sshin{
39355505Sshin	struct sadb_lifetime m_lft;
39455505Sshin
39555505Sshin	m_lft.sadb_lifetime_len = PFKEY_UNIT64(sizeof(m_lft));
39655505Sshin	m_lft.sadb_lifetime_exttype = ext;
39755505Sshin	m_lft.sadb_lifetime_allocations = 0x2;
39855505Sshin	m_lft.sadb_lifetime_bytes = 0x1000;
39955505Sshin	m_lft.sadb_lifetime_addtime = time;
40055505Sshin	m_lft.sadb_lifetime_usetime = 0x0020;
40155505Sshin
40255505Sshin	memcpy(m_buf + m_len, &m_lft, sizeof(struct sadb_lifetime));
40355505Sshin	m_len += sizeof(struct sadb_lifetime);
40455505Sshin
40555505Sshin	return;
40655505Sshin}
40755505Sshin
40855505Sshinvoid
40955505Sshinkey_setspirange()
41055505Sshin{
41155505Sshin	struct sadb_spirange m_spi;
41255505Sshin
41355505Sshin	m_spi.sadb_spirange_len = PFKEY_UNIT64(sizeof(m_spi));
41455505Sshin	m_spi.sadb_spirange_exttype = SADB_EXT_SPIRANGE;
41555505Sshin	m_spi.sadb_spirange_min = 0x00001000;
41655505Sshin	m_spi.sadb_spirange_max = 0x00002000;
41755505Sshin	m_spi.sadb_spirange_reserved = 0;
41855505Sshin
41955505Sshin	memcpy(m_buf + m_len, &m_spi, sizeof(struct sadb_spirange));
42055505Sshin	m_len += sizeof(struct sadb_spirange);
42155505Sshin
42255505Sshin	return;
42355505Sshin}
42455505Sshin
42555505Sshinvoid
42655505Sshinkey_setsadbkey(ext, str)
42755505Sshin	u_int ext;
42855505Sshin	caddr_t str;
42955505Sshin{
43055505Sshin	struct sadb_key m_key;
43155505Sshin	u_int keylen = strlen(str);
43255505Sshin	u_int len;
43355505Sshin
43455505Sshin	len = sizeof(struct sadb_key) + PFKEY_ALIGN8(keylen);
43555505Sshin	m_key.sadb_key_len = PFKEY_UNIT64(len);
43655505Sshin	m_key.sadb_key_exttype = ext;
43755505Sshin	m_key.sadb_key_bits = keylen * 8;
43855505Sshin	m_key.sadb_key_reserved = 0;
43955505Sshin
44055505Sshin	key_setsadbextbuf(m_buf, m_len,
44155505Sshin			(caddr_t)&m_key, sizeof(struct sadb_key),
44255505Sshin			str, keylen);
44355505Sshin	m_len += len;
44455505Sshin
44555505Sshin	return;
44655505Sshin}
44755505Sshin
44855505Sshinvoid
44955505Sshinkey_setsadbsa()
45055505Sshin{
45155505Sshin	struct sadb_sa m_sa;
45255505Sshin
45355505Sshin	m_sa.sadb_sa_len = PFKEY_UNIT64(sizeof(struct sadb_sa));
45455505Sshin	m_sa.sadb_sa_exttype = SADB_EXT_SA;
45555505Sshin	m_sa.sadb_sa_spi = htonl(0x12345678);
45655505Sshin	m_sa.sadb_sa_replay = 4;
45755505Sshin	m_sa.sadb_sa_state = 0;
45855505Sshin	m_sa.sadb_sa_auth = SADB_AALG_MD5HMAC;
45955505Sshin	m_sa.sadb_sa_encrypt = SADB_EALG_DESCBC;
46055505Sshin	m_sa.sadb_sa_flags = 0;
46155505Sshin
46255505Sshin	memcpy(m_buf + m_len, &m_sa, sizeof(struct sadb_sa));
46355505Sshin	m_len += sizeof(struct sadb_sa);
46455505Sshin
46555505Sshin	return;
46655505Sshin}
46755505Sshin
46855505Sshinvoid
46955505Sshinkey_setsadbaddr(ext, af, str)
47055505Sshin	u_int ext, af;
47155505Sshin	caddr_t str;
47255505Sshin{
47355505Sshin	struct sadb_address m_addr;
47455505Sshin	u_int len;
47562583Sitojun	struct addrinfo hints, *res;
47662583Sitojun	const char *serv;
47762583Sitojun	int plen;
47855505Sshin
47962583Sitojun	switch (af) {
48062583Sitojun	case AF_INET:
48162583Sitojun		plen = sizeof(struct in_addr) << 3;
48262583Sitojun		break;
48362583Sitojun	case AF_INET6:
48462583Sitojun		plen = sizeof(struct in6_addr) << 3;
48562583Sitojun		break;
48662583Sitojun	default:
48762583Sitojun		/* XXX bark */
48862583Sitojun		exit(1);
48962583Sitojun	}
49062583Sitojun
49155505Sshin	/* make sockaddr buffer */
49262583Sitojun	memset(&hints, 0, sizeof(hints));
49362583Sitojun	hints.ai_family = af;
49462583Sitojun	hints.ai_socktype = SOCK_DGRAM;	/*dummy*/
49562583Sitojun	hints.ai_flags = AI_NUMERICHOST;
49662583Sitojun	serv = (ext == SADB_EXT_ADDRESS_PROXY ? "0" : "4660");	/*0x1234*/
49762583Sitojun	if (getaddrinfo(str, serv, &hints, &res) != 0 || res->ai_next) {
49862583Sitojun		/* XXX bark */
49962583Sitojun		exit(1);
50062583Sitojun	}
50155505Sshin
50262583Sitojun	len = sizeof(struct sadb_address) + PFKEY_ALIGN8(res->ai_addrlen);
50355505Sshin	m_addr.sadb_address_len = PFKEY_UNIT64(len);
50455505Sshin	m_addr.sadb_address_exttype = ext;
50555505Sshin	m_addr.sadb_address_proto =
50655505Sshin		(ext == SADB_EXT_ADDRESS_PROXY ? 0 : IPPROTO_TCP);
50762583Sitojun	m_addr.sadb_address_prefixlen = plen;
50855505Sshin	m_addr.sadb_address_reserved = 0;
50955505Sshin
51055505Sshin	key_setsadbextbuf(m_buf, m_len,
51155505Sshin			(caddr_t)&m_addr, sizeof(struct sadb_address),
51262583Sitojun			(caddr_t)res->ai_addr, res->ai_addrlen);
51355505Sshin	m_len += len;
51455505Sshin
51562583Sitojun	freeaddrinfo(res);
51662583Sitojun
51755505Sshin	return;
51855505Sshin}
51955505Sshin
52055505Sshinvoid
52155505Sshinkey_setsadbextbuf(dst, off, ebuf, elen, vbuf, vlen)
52255505Sshin	caddr_t dst, ebuf, vbuf;
52355505Sshin	int off, elen, vlen;
52455505Sshin{
52555505Sshin	memset(dst + off, 0, elen + vlen);
52655505Sshin	memcpy(dst + off, (caddr_t)ebuf, elen);
52755505Sshin	memcpy(dst + off + elen, vbuf, vlen);
52855505Sshin
52955505Sshin	return;
53055505Sshin}
53155505Sshin
532