1 /* $KAME: test-pfkey.c,v 1.4 2000/06/07 00:29:14 itojun Exp $ */
4 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/socket.h>
35 #include <net/route.h>
36 #include <netinet/in.h>
38 #include <System/net/pfkeyv2.h>
39 #include <System/netkey/keydb.h>
40 #include <System/netkey/key_var.h>
41 #include <System/netkey/key_debug.h>
43 #include <net/pfkeyv2.h>
44 #include <netkey/keydb.h>
45 #include <netkey/key_var.h>
46 #include <netkey/key_debug.h>
62 void Usage
__P((void));
63 int sendkeymsg
__P((void));
64 void key_setsadbmsg
__P((u_int
));
65 void key_setsadbsens
__P((void));
66 void key_setsadbprop
__P((void));
67 void key_setsadbid
__P((u_int
, caddr_t
));
68 void key_setsadblft
__P((u_int
, u_int
));
69 void key_setspirange
__P((void));
70 void key_setsadbkey
__P((u_int
, caddr_t
));
71 void key_setsadbsa
__P((void));
72 void key_setsadbaddr
__P((u_int
, u_int
, caddr_t
));
73 void key_setsadbextbuf
__P((caddr_t
, int, caddr_t
, int, caddr_t
, int));
78 printf("Usage:\t%s number\n", pname
);
91 key_setsadbmsg(atoi(*(av
+1)));
101 u_char rbuf
[1024 * 32]; /* XXX: Enough ? Should I do MSG_PEEK ? */
104 if ((so
= socket(PF_KEY
, SOCK_RAW
, PF_KEY_V2
)) < 0) {
105 perror("socket(PF_KEY)");
110 #include <sys/time.h>
114 if (setsockopt(so
, SOL_SOCKET
, SO_RCVTIMEO
, &tv
, sizeof(tv
)) < 0) {
115 perror("setsockopt");
121 pfkey_sadump((struct sadb_msg
*)m_buf
);
123 if ((len
= send(so
, m_buf
, m_len
, 0)) < 0) {
128 if ((len
= recv(so
, rbuf
, sizeof(rbuf
), 0)) < 0) {
133 pfkey_sadump((struct sadb_msg
*)rbuf
);
144 struct sadb_msg m_msg
;
146 memset(&m_msg
, 0, sizeof(m_msg
));
147 m_msg
.sadb_msg_version
= PF_KEY_V2
;
148 m_msg
.sadb_msg_type
= type
;
149 m_msg
.sadb_msg_errno
= 0;
150 m_msg
.sadb_msg_satype
= SADB_SATYPE_ESP
;
152 m_msg
.sadb_msg_reserved
= 0;
154 m_msg
.sadb_msg_seq
= 0;
155 m_msg
.sadb_msg_pid
= getpid();
157 m_len
= sizeof(struct sadb_msg
);
158 memcpy(m_buf
, &m_msg
, m_len
);
162 /*<base, address(SD), SPI range>*/
163 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "10.0.3.4");
164 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "127.0.0.1");
166 /*<base, SA(*), address(SD)>*/
170 /* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
171 key(AE), (identity(SD),) (sensitivity)> */
172 key_setsadbaddr(SADB_EXT_ADDRESS_PROXY
, AF_INET6
, "3ffe::1");
175 key_setsadblft(SADB_EXT_LIFETIME_HARD
, 10);
176 key_setsadblft(SADB_EXT_LIFETIME_SOFT
, 5);
177 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "192.168.1.1");
178 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "10.0.3.4");
179 /* XXX key_setsadbkey(SADB_EXT_KEY_AUTH, "abcde"); */
180 key_setsadbkey(SADB_EXT_KEY_AUTH
, "1234567812345678");
181 key_setsadbkey(SADB_EXT_KEY_ENCRYPT
, "12345678");
182 key_setsadbid(SADB_EXT_IDENTITY_SRC
, "hoge1234@hoge.com");
183 key_setsadbid(SADB_EXT_IDENTITY_DST
, "hage5678@hage.net");
185 /* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
186 (identity(SD),) (sensitivity)> */
190 /* <base, SA(*), address(SDP)> */
192 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "192.168.1.1");
193 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "10.0.3.4");
194 key_setsadbaddr(SADB_EXT_ADDRESS_PROXY
, AF_INET6
, "3ffe::1");
195 /* <base, SA(*), address(SDP)> */
199 /* <base, SA(*), address(SDP)> */
201 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "192.168.1.1");
202 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "10.0.3.4");
203 key_setsadbaddr(SADB_EXT_ADDRESS_PROXY
, AF_INET6
, "3ffe::1");
204 /* <base, SA, (lifetime(HSC),) address(SD), (address(P),)
205 key(AE), (identity(SD),) (sensitivity)> */
209 /* <base, address(SD), (address(P),) (identity(SD),)
210 (sensitivity,) proposal> */
211 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "192.168.1.1");
212 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "10.0.3.4");
213 key_setsadbaddr(SADB_EXT_ADDRESS_PROXY
, AF_INET6
, "3ffe::1");
214 key_setsadbid(SADB_EXT_IDENTITY_SRC
, "hoge1234@hoge.com");
215 key_setsadbid(SADB_EXT_IDENTITY_DST
, "hage5678@hage.net");
218 /* <base, address(SD), (address(P),) (identity(SD),)
219 (sensitivity,) proposal> */
224 /* <base, supported> */
236 /* <base, base(, others)> */
242 /* for SPD management */
243 case SADB_X_SPDFLUSH
:
250 struct sadb_x_policy m_policy
;
252 m_policy
.sadb_x_policy_len
= PFKEY_UNIT64(sizeof(m_policy
));
253 m_policy
.sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
254 m_policy
.sadb_x_policy_type
= SADB_X_PL_IPSEC
;
255 m_policy
.sadb_x_policy_esp_trans
= 1;
256 m_policy
.sadb_x_policy_ah_trans
= 2;
257 m_policy
.sadb_x_policy_esp_network
= 3;
258 m_policy
.sadb_x_policy_ah_network
= 4;
259 m_policy
.sadb_x_policy_reserved
= 0;
261 memcpy(m_buf
+ m_len
, &m_policy
, sizeof(struct sadb_x_policy
));
262 m_len
+= sizeof(struct sadb_x_policy
);
266 case SADB_X_SPDDELETE
:
267 key_setsadbaddr(SADB_EXT_ADDRESS_SRC
, AF_INET
, "192.168.1.1");
268 key_setsadbaddr(SADB_EXT_ADDRESS_DST
, AF_INET
, "10.0.3.4");
272 ((struct sadb_msg
*)m_buf
)->sadb_msg_len
= PFKEY_UNIT64(m_len
);
280 struct sadb_sens m_sens
;
282 u_int s
, i
, slen
, ilen
, len
;
284 /* make sens & integ */
285 s
= htonl(0x01234567);
286 i
= htonl(0x89abcdef);
289 memcpy(buf
, &s
, slen
);
290 memcpy(buf
+ slen
, &i
, ilen
);
292 len
= sizeof(m_sens
) + PFKEY_ALIGN8(slen
) + PFKEY_ALIGN8(ilen
);
293 m_sens
.sadb_sens_len
= PFKEY_UNIT64(len
);
294 m_sens
.sadb_sens_exttype
= SADB_EXT_SENSITIVITY
;
295 m_sens
.sadb_sens_dpd
= 1;
296 m_sens
.sadb_sens_sens_level
= 2;
297 m_sens
.sadb_sens_sens_len
= PFKEY_ALIGN8(slen
);
298 m_sens
.sadb_sens_integ_level
= 3;
299 m_sens
.sadb_sens_integ_len
= PFKEY_ALIGN8(ilen
);
300 m_sens
.sadb_sens_reserved
= 0;
302 key_setsadbextbuf(m_buf
, m_len
,
303 (caddr_t
)&m_sens
, sizeof(struct sadb_sens
),
313 struct sadb_prop m_prop
;
314 struct sadb_comb
*m_comb
;
316 #if defined(SADB_X_EALG_AESCBC) && defined(SADB_X_AALG_SHA2_256)
317 u_int len
= sizeof(m_prop
) + sizeof(m_comb
) * 3;
319 u_int len
= sizeof(m_prop
) + sizeof(m_comb
) * 2;
322 /* make prop & comb */
323 m_prop
.sadb_prop_len
= PFKEY_UNIT64(len
);
324 m_prop
.sadb_prop_exttype
= SADB_EXT_PROPOSAL
;
325 m_prop
.sadb_prop_replay
= 0;
326 m_prop
.sadb_prop_reserved
[0] = 0;
327 m_prop
.sadb_prop_reserved
[1] = 0;
328 m_prop
.sadb_prop_reserved
[2] = 0;
330 /* the 1st is ESP DES-CBC HMAC-MD5 */
331 m_comb
= (struct sadb_comb
*)buf
;
332 m_comb
->sadb_comb_auth
= SADB_AALG_MD5HMAC
;
333 m_comb
->sadb_comb_encrypt
= SADB_EALG_DESCBC
;
334 m_comb
->sadb_comb_flags
= 0;
335 m_comb
->sadb_comb_auth_minbits
= 8;
336 m_comb
->sadb_comb_auth_maxbits
= 96;
337 m_comb
->sadb_comb_encrypt_minbits
= 64;
338 m_comb
->sadb_comb_encrypt_maxbits
= 64;
339 m_comb
->sadb_comb_reserved
= 0;
340 m_comb
->sadb_comb_soft_allocations
= 0;
341 m_comb
->sadb_comb_hard_allocations
= 0;
342 m_comb
->sadb_comb_soft_bytes
= 0;
343 m_comb
->sadb_comb_hard_bytes
= 0;
344 m_comb
->sadb_comb_soft_addtime
= 0;
345 m_comb
->sadb_comb_hard_addtime
= 0;
346 m_comb
->sadb_comb_soft_usetime
= 0;
347 m_comb
->sadb_comb_hard_usetime
= 0;
349 /* the 2st is ESP 3DES-CBC and AH HMAC-SHA1 */
350 m_comb
= (struct sadb_comb
*)(buf
+ sizeof(*m_comb
));
351 m_comb
->sadb_comb_auth
= SADB_AALG_SHA1HMAC
;
352 m_comb
->sadb_comb_encrypt
= SADB_EALG_3DESCBC
;
353 m_comb
->sadb_comb_flags
= 0;
354 m_comb
->sadb_comb_auth_minbits
= 8;
355 m_comb
->sadb_comb_auth_maxbits
= 96;
356 m_comb
->sadb_comb_encrypt_minbits
= 64;
357 m_comb
->sadb_comb_encrypt_maxbits
= 64;
358 m_comb
->sadb_comb_reserved
= 0;
359 m_comb
->sadb_comb_soft_allocations
= 0;
360 m_comb
->sadb_comb_hard_allocations
= 0;
361 m_comb
->sadb_comb_soft_bytes
= 0;
362 m_comb
->sadb_comb_hard_bytes
= 0;
363 m_comb
->sadb_comb_soft_addtime
= 0;
364 m_comb
->sadb_comb_hard_addtime
= 0;
365 m_comb
->sadb_comb_soft_usetime
= 0;
366 m_comb
->sadb_comb_hard_usetime
= 0;
368 key_setsadbextbuf(m_buf
, m_len
,
369 (caddr_t
)&m_prop
, sizeof(struct sadb_prop
),
370 buf
, sizeof(*m_comb
) * 2);
373 #if defined(SADB_X_EALG_AESCBC) && defined(SADB_X_AALG_SHA2_256)
374 /* the 3rd is ESP AES-CBC and AH HMAC-SHA256 */
375 m_comb
= (struct sadb_comb
*)(buf
+ sizeof(*m_comb
));
376 m_comb
->sadb_comb_auth
= SADB_X_AALG_SHA2_256
;
377 m_comb
->sadb_comb_encrypt
= SADB_X_EALG_AESCBC
;
378 m_comb
->sadb_comb_flags
= 0;
379 m_comb
->sadb_comb_auth_minbits
= 8;
380 m_comb
->sadb_comb_auth_maxbits
= 96;
381 m_comb
->sadb_comb_encrypt_minbits
= 128;
382 m_comb
->sadb_comb_encrypt_maxbits
= 128;
383 m_comb
->sadb_comb_reserved
= 0;
384 m_comb
->sadb_comb_soft_allocations
= 0;
385 m_comb
->sadb_comb_hard_allocations
= 0;
386 m_comb
->sadb_comb_soft_bytes
= 0;
387 m_comb
->sadb_comb_hard_bytes
= 0;
388 m_comb
->sadb_comb_soft_addtime
= 0;
389 m_comb
->sadb_comb_hard_addtime
= 0;
390 m_comb
->sadb_comb_soft_usetime
= 0;
391 m_comb
->sadb_comb_hard_usetime
= 0;
393 key_setsadbextbuf(m_buf
, m_len
,
394 (caddr_t
)&m_prop
, sizeof(struct sadb_prop
),
395 buf
, sizeof(*m_comb
) * 3);
398 key_setsadbextbuf(m_buf
, m_len
,
399 (caddr_t
)&m_prop
, sizeof(struct sadb_prop
),
400 buf
, sizeof(*m_comb
) * 2);
407 key_setsadbid(ext
, str
)
411 struct sadb_ident m_id
;
412 u_int idlen
= strlen(str
), len
;
414 len
= sizeof(m_id
) + PFKEY_ALIGN8(idlen
);
415 m_id
.sadb_ident_len
= PFKEY_UNIT64(len
);
416 m_id
.sadb_ident_exttype
= ext
;
417 m_id
.sadb_ident_type
= SADB_IDENTTYPE_USERFQDN
;
418 m_id
.sadb_ident_reserved
= 0;
419 m_id
.sadb_ident_id
= getpid();
421 key_setsadbextbuf(m_buf
, m_len
,
422 (caddr_t
)&m_id
, sizeof(struct sadb_ident
),
430 key_setsadblft(ext
, time
)
433 struct sadb_lifetime m_lft
;
435 m_lft
.sadb_lifetime_len
= PFKEY_UNIT64(sizeof(m_lft
));
436 m_lft
.sadb_lifetime_exttype
= ext
;
437 m_lft
.sadb_lifetime_allocations
= 0x2;
438 m_lft
.sadb_lifetime_bytes
= 0x1000;
439 m_lft
.sadb_lifetime_addtime
= time
;
440 m_lft
.sadb_lifetime_usetime
= 0x0020;
442 memcpy(m_buf
+ m_len
, &m_lft
, sizeof(struct sadb_lifetime
));
443 m_len
+= sizeof(struct sadb_lifetime
);
451 struct sadb_spirange m_spi
;
453 m_spi
.sadb_spirange_len
= PFKEY_UNIT64(sizeof(m_spi
));
454 m_spi
.sadb_spirange_exttype
= SADB_EXT_SPIRANGE
;
455 m_spi
.sadb_spirange_min
= 0x00001000;
456 m_spi
.sadb_spirange_max
= 0x00002000;
457 m_spi
.sadb_spirange_reserved
= 0;
459 memcpy(m_buf
+ m_len
, &m_spi
, sizeof(struct sadb_spirange
));
460 m_len
+= sizeof(struct sadb_spirange
);
466 key_setsadbkey(ext
, str
)
470 struct sadb_key m_key
;
471 u_int keylen
= strlen(str
);
474 len
= sizeof(struct sadb_key
) + PFKEY_ALIGN8(keylen
);
475 m_key
.sadb_key_len
= PFKEY_UNIT64(len
);
476 m_key
.sadb_key_exttype
= ext
;
477 m_key
.sadb_key_bits
= keylen
* 8;
478 m_key
.sadb_key_reserved
= 0;
480 key_setsadbextbuf(m_buf
, m_len
,
481 (caddr_t
)&m_key
, sizeof(struct sadb_key
),
493 m_sa
.sadb_sa_len
= PFKEY_UNIT64(sizeof(struct sadb_sa
));
494 m_sa
.sadb_sa_exttype
= SADB_EXT_SA
;
495 m_sa
.sadb_sa_spi
= htonl(0x12345678);
496 m_sa
.sadb_sa_replay
= 4;
497 m_sa
.sadb_sa_state
= 0;
498 m_sa
.sadb_sa_auth
= SADB_AALG_MD5HMAC
;
499 m_sa
.sadb_sa_encrypt
= SADB_EALG_DESCBC
;
500 m_sa
.sadb_sa_flags
= 0;
502 memcpy(m_buf
+ m_len
, &m_sa
, sizeof(struct sadb_sa
));
503 m_len
+= sizeof(struct sadb_sa
);
509 key_setsadbaddr(ext
, af
, str
)
513 struct sadb_address m_addr
;
515 struct addrinfo hints
, *res
;
521 plen
= sizeof(struct in_addr
) << 3;
524 plen
= sizeof(struct in6_addr
) << 3;
531 /* make sockaddr buffer */
532 memset(&hints
, 0, sizeof(hints
));
533 hints
.ai_family
= af
;
534 hints
.ai_socktype
= SOCK_DGRAM
; /*dummy*/
535 hints
.ai_flags
= AI_NUMERICHOST
;
536 serv
= (ext
== SADB_EXT_ADDRESS_PROXY
? "0" : "4660"); /*0x1234*/
537 if (getaddrinfo(str
, serv
, &hints
, &res
) != 0 || res
->ai_next
) {
542 len
= sizeof(struct sadb_address
) + PFKEY_ALIGN8(res
->ai_addrlen
);
543 m_addr
.sadb_address_len
= PFKEY_UNIT64(len
);
544 m_addr
.sadb_address_exttype
= ext
;
545 m_addr
.sadb_address_proto
=
546 (ext
== SADB_EXT_ADDRESS_PROXY
? 0 : IPPROTO_TCP
);
547 m_addr
.sadb_address_prefixlen
= plen
;
548 m_addr
.sadb_address_reserved
= 0;
550 key_setsadbextbuf(m_buf
, m_len
,
551 (caddr_t
)&m_addr
, sizeof(struct sadb_address
),
552 (caddr_t
)res
->ai_addr
, res
->ai_addrlen
);
561 key_setsadbextbuf(dst
, off
, ebuf
, elen
, vbuf
, vlen
)
562 caddr_t dst
, ebuf
, vbuf
;
565 memset(dst
+ off
, 0, elen
+ vlen
);
566 memcpy(dst
+ off
, (caddr_t
)ebuf
, elen
);
567 memcpy(dst
+ off
+ elen
, vbuf
, vlen
);