162583Sitojun/* $FreeBSD: releng/10.2/sbin/setkey/test-pfkey.c 173412 2007-11-07 10:53:41Z kevlo $ */ 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