1 /* $NetBSD: pfkey.c,v 1.18.4.5 2008/03/05 22:14:24 mgrooms Exp $ */ 2 3 /* $Id: pfkey.c,v 1.18.4.5 2008/03/05 22:14:24 mgrooms 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 <stdlib.h> 37 #include <string.h> 38 #include <stdio.h> 39 #include <netdb.h> 40 #include <errno.h> 41 #ifdef HAVE_UNISTD_H 42 #include <unistd.h> 43 #endif 44 #include <netdb.h> 45 #include <netinet/in.h> 46 #include <arpa/inet.h> 47 48 #ifdef ENABLE_NATT 49 # ifdef __linux__ 50 # include <linux/udp.h> 51 # endif 52 # if defined(__NetBSD__) || defined(__FreeBSD__) || \ 53 (defined(__APPLE__) && defined(__MACH__)) 54 # include <netinet/udp.h> 55 # endif 56 #endif 57 58 #include <sys/types.h> 59 #include <sys/param.h> 60 #include <sys/socket.h> 61 #include <sys/queue.h> 62 #ifndef ANDROID_CHANGES 63 #include <sys/sysctl.h> 64 #endif 65 66 #include <net/route.h> 67 #include <net/pfkeyv2.h> 68 69 #include <netinet/in.h> 70 #include PATH_IPSEC_H 71 #include <fcntl.h> 72 73 #include "libpfkey.h" 74 75 #include "var.h" 76 #include "misc.h" 77 #include "vmbuf.h" 78 #include "plog.h" 79 #include "sockmisc.h" 80 #include "debug.h" 81 82 #include "schedule.h" 83 #include "localconf.h" 84 #include "remoteconf.h" 85 #include "handler.h" 86 #include "policy.h" 87 #include "proposal.h" 88 #include "isakmp_var.h" 89 #include "isakmp.h" 90 #include "isakmp_inf.h" 91 #include "ipsec_doi.h" 92 #include "oakley.h" 93 #include "pfkey.h" 94 #include "algorithm.h" 95 #include "sainfo.h" 96 #include "admin.h" 97 #include "privsep.h" 98 #include "strnames.h" 99 #include "backupsa.h" 100 #include "gcmalloc.h" 101 #include "nattraversal.h" 102 #include "crypto_openssl.h" 103 #include "grabmyaddr.h" 104 105 #if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC) 106 #define SADB_X_EALG_AESCBC SADB_X_EALG_RIJNDAELCBC 107 #endif 108 109 /* prototype */ 110 static u_int ipsecdoi2pfkey_aalg __P((u_int)); 111 static u_int ipsecdoi2pfkey_ealg __P((u_int)); 112 static u_int ipsecdoi2pfkey_calg __P((u_int)); 113 static u_int ipsecdoi2pfkey_alg __P((u_int, u_int)); 114 static u_int keylen_aalg __P((u_int)); 115 static u_int keylen_ealg __P((u_int, int)); 116 117 static int pk_recvgetspi __P((caddr_t *)); 118 static int pk_recvupdate __P((caddr_t *)); 119 static int pk_recvadd __P((caddr_t *)); 120 static int pk_recvdelete __P((caddr_t *)); 121 static int pk_recvacquire __P((caddr_t *)); 122 static int pk_recvexpire __P((caddr_t *)); 123 static int pk_recvflush __P((caddr_t *)); 124 static int getsadbpolicy __P((caddr_t *, int *, int, struct ph2handle *)); 125 static int pk_recvspdupdate __P((caddr_t *)); 126 static int pk_recvspdadd __P((caddr_t *)); 127 static int pk_recvspddelete __P((caddr_t *)); 128 static int pk_recvspdexpire __P((caddr_t *)); 129 static int pk_recvspdget __P((caddr_t *)); 130 static int pk_recvspddump __P((caddr_t *)); 131 static int pk_recvspdflush __P((caddr_t *)); 132 static struct sadb_msg *pk_recv __P((int, int *)); 133 134 static int (*pkrecvf[]) __P((caddr_t *)) = { 135 NULL, 136 pk_recvgetspi, 137 pk_recvupdate, 138 pk_recvadd, 139 pk_recvdelete, 140 NULL, /* SADB_GET */ 141 pk_recvacquire, 142 NULL, /* SABD_REGISTER */ 143 pk_recvexpire, 144 pk_recvflush, 145 NULL, /* SADB_DUMP */ 146 NULL, /* SADB_X_PROMISC */ 147 NULL, /* SADB_X_PCHANGE */ 148 pk_recvspdupdate, 149 pk_recvspdadd, 150 pk_recvspddelete, 151 pk_recvspdget, 152 NULL, /* SADB_X_SPDACQUIRE */ 153 pk_recvspddump, 154 pk_recvspdflush, 155 NULL, /* SADB_X_SPDSETIDX */ 156 pk_recvspdexpire, 157 NULL, /* SADB_X_SPDDELETE2 */ 158 NULL, /* SADB_X_NAT_T_NEW_MAPPING */ 159 NULL, /* SADB_X_MIGRATE */ 160 #if (SADB_MAX > 24) 161 #error "SADB extra message?" 162 #endif 163 }; 164 165 static int addnewsp __P((caddr_t *)); 166 167 /* cope with old kame headers - ugly */ 168 #ifndef SADB_X_AALG_MD5 169 #define SADB_X_AALG_MD5 SADB_AALG_MD5 170 #endif 171 #ifndef SADB_X_AALG_SHA 172 #define SADB_X_AALG_SHA SADB_AALG_SHA 173 #endif 174 #ifndef SADB_X_AALG_NULL 175 #define SADB_X_AALG_NULL SADB_AALG_NULL 176 #endif 177 178 #ifndef SADB_X_EALG_BLOWFISHCBC 179 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC 180 #endif 181 #ifndef SADB_X_EALG_CAST128CBC 182 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC 183 #endif 184 #ifndef SADB_X_EALG_RC5CBC 185 #ifdef SADB_EALG_RC5CBC 186 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC 187 #endif 188 #endif 189 190 /* 191 * PF_KEY packet handler 192 * 0: success 193 * -1: fail 194 */ 195 int 196 pfkey_handler() 197 { 198 struct sadb_msg *msg; 199 int len; 200 caddr_t mhp[SADB_EXT_MAX + 1]; 201 int error = -1; 202 203 /* receive pfkey message. */ 204 len = 0; 205 msg = (struct sadb_msg *)pk_recv(lcconf->sock_pfkey, &len); 206 if (msg == NULL) { 207 if (len < 0) { 208 plog(LLV_ERROR, LOCATION, NULL, 209 "failed to recv from pfkey (%s)\n", 210 strerror(errno)); 211 goto end; 212 } else { 213 /* short message - msg not ready */ 214 return 0; 215 } 216 } 217 218 plog(LLV_DEBUG, LOCATION, NULL, "get pfkey %s message\n", 219 s_pfkey_type(msg->sadb_msg_type)); 220 plogdump(LLV_DEBUG2, msg, msg->sadb_msg_len << 3); 221 222 /* validity check */ 223 if (msg->sadb_msg_errno) { 224 int pri; 225 226 /* when SPD is empty, treat the state as no error. */ 227 if (msg->sadb_msg_type == SADB_X_SPDDUMP && 228 msg->sadb_msg_errno == ENOENT) 229 pri = LLV_DEBUG; 230 else 231 pri = LLV_ERROR; 232 233 plog(pri, LOCATION, NULL, 234 "pfkey %s failed: %s\n", 235 s_pfkey_type(msg->sadb_msg_type), 236 strerror(msg->sadb_msg_errno)); 237 238 goto end; 239 } 240 241 /* check pfkey message. */ 242 if (pfkey_align(msg, mhp)) { 243 plog(LLV_ERROR, LOCATION, NULL, 244 "libipsec failed pfkey align (%s)\n", 245 ipsec_strerror()); 246 goto end; 247 } 248 if (pfkey_check(mhp)) { 249 plog(LLV_ERROR, LOCATION, NULL, 250 "libipsec failed pfkey check (%s)\n", 251 ipsec_strerror()); 252 goto end; 253 } 254 msg = (struct sadb_msg *)mhp[0]; 255 256 /* safety check */ 257 if (msg->sadb_msg_type >= ARRAYLEN(pkrecvf)) { 258 plog(LLV_ERROR, LOCATION, NULL, 259 "unknown PF_KEY message type=%u\n", 260 msg->sadb_msg_type); 261 goto end; 262 } 263 264 if (pkrecvf[msg->sadb_msg_type] == NULL) { 265 plog(LLV_INFO, LOCATION, NULL, 266 "unsupported PF_KEY message %s\n", 267 s_pfkey_type(msg->sadb_msg_type)); 268 goto end; 269 } 270 271 if ((pkrecvf[msg->sadb_msg_type])(mhp) < 0) 272 goto end; 273 274 error = 0; 275 end: 276 if (msg) 277 racoon_free(msg); 278 return(error); 279 } 280 281 /* 282 * dump SADB 283 */ 284 vchar_t * 285 pfkey_dump_sadb(satype) 286 int satype; 287 { 288 int s = -1; 289 vchar_t *buf = NULL; 290 pid_t pid = getpid(); 291 struct sadb_msg *msg = NULL; 292 size_t bl, ml; 293 int len; 294 295 if ((s = privsep_pfkey_open()) < 0) { 296 plog(LLV_ERROR, LOCATION, NULL, 297 "libipsec failed pfkey open: %s\n", 298 ipsec_strerror()); 299 return NULL; 300 } 301 302 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_dump\n"); 303 if (pfkey_send_dump(s, satype) < 0) { 304 plog(LLV_ERROR, LOCATION, NULL, 305 "libipsec failed dump: %s\n", ipsec_strerror()); 306 goto fail; 307 } 308 309 while (1) { 310 if (msg) 311 racoon_free(msg); 312 msg = pk_recv(s, &len); 313 if (msg == NULL) { 314 if (len < 0) 315 goto done; 316 else 317 continue; 318 } 319 320 if (msg->sadb_msg_type != SADB_DUMP || msg->sadb_msg_pid != pid) 321 { 322 plog(LLV_DEBUG, LOCATION, NULL, 323 "discarding non-sadb dump msg %p, our pid=%i\n", msg, pid); 324 plog(LLV_DEBUG, LOCATION, NULL, 325 "type %i, pid %i\n", msg->sadb_msg_type, msg->sadb_msg_pid); 326 continue; 327 } 328 329 330 ml = msg->sadb_msg_len << 3; 331 bl = buf ? buf->l : 0; 332 buf = vrealloc(buf, bl + ml); 333 if (buf == NULL) { 334 plog(LLV_ERROR, LOCATION, NULL, 335 "failed to reallocate buffer to dump.\n"); 336 goto fail; 337 } 338 memcpy(buf->v + bl, msg, ml); 339 340 if (msg->sadb_msg_seq == 0) 341 break; 342 } 343 goto done; 344 345 fail: 346 if (buf) 347 vfree(buf); 348 buf = NULL; 349 done: 350 if (msg) 351 racoon_free(msg); 352 if (s >= 0) 353 privsep_pfkey_close(s); 354 return buf; 355 } 356 357 #ifdef ENABLE_ADMINPORT 358 /* 359 * flush SADB 360 */ 361 void 362 pfkey_flush_sadb(proto) 363 u_int proto; 364 { 365 int satype; 366 367 /* convert to SADB_SATYPE */ 368 if ((satype = admin2pfkey_proto(proto)) < 0) 369 return; 370 371 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_flush\n"); 372 if (pfkey_send_flush(lcconf->sock_pfkey, satype) < 0) { 373 plog(LLV_ERROR, LOCATION, NULL, 374 "libipsec failed send flush (%s)\n", ipsec_strerror()); 375 return; 376 } 377 378 return; 379 } 380 #endif 381 382 /* 383 * These are the SATYPEs that we manage. We register to get 384 * PF_KEY messages related to these SATYPEs, and we also use 385 * this list to determine which SATYPEs to delete SAs for when 386 * we receive an INITIAL-CONTACT. 387 */ 388 const struct pfkey_satype pfkey_satypes[] = { 389 { SADB_SATYPE_AH, "AH" }, 390 { SADB_SATYPE_ESP, "ESP" }, 391 { SADB_X_SATYPE_IPCOMP, "IPCOMP" }, 392 }; 393 const int pfkey_nsatypes = 394 sizeof(pfkey_satypes) / sizeof(pfkey_satypes[0]); 395 396 /* 397 * PF_KEY initialization 398 */ 399 int 400 pfkey_init() 401 { 402 int i, reg_fail; 403 404 if ((lcconf->sock_pfkey = privsep_pfkey_open()) < 0) { 405 plog(LLV_ERROR, LOCATION, NULL, 406 "libipsec failed pfkey open (%s)\n", ipsec_strerror()); 407 return -1; 408 } 409 if (fcntl(lcconf->sock_pfkey, F_SETFL, O_NONBLOCK) == -1) 410 plog(LLV_WARNING, LOCATION, NULL, 411 "failed to set the pfkey socket to NONBLOCK\n"); 412 413 for (i = 0, reg_fail = 0; i < pfkey_nsatypes; i++) { 414 plog(LLV_DEBUG, LOCATION, NULL, 415 "call pfkey_send_register for %s\n", 416 pfkey_satypes[i].ps_name); 417 if (pfkey_send_register(lcconf->sock_pfkey, 418 pfkey_satypes[i].ps_satype) < 0 || 419 pfkey_recv_register(lcconf->sock_pfkey) < 0) { 420 plog(LLV_WARNING, LOCATION, NULL, 421 "failed to register %s (%s)\n", 422 pfkey_satypes[i].ps_name, 423 ipsec_strerror()); 424 reg_fail++; 425 } 426 } 427 428 if (reg_fail == pfkey_nsatypes) { 429 plog(LLV_ERROR, LOCATION, NULL, 430 "failed to regist any protocol.\n"); 431 pfkey_close(lcconf->sock_pfkey); 432 return -1; 433 } 434 435 initsp(); 436 437 if (pfkey_send_spddump(lcconf->sock_pfkey) < 0) { 438 plog(LLV_ERROR, LOCATION, NULL, 439 "libipsec sending spddump failed: %s\n", 440 ipsec_strerror()); 441 pfkey_close(lcconf->sock_pfkey); 442 return -1; 443 } 444 #if 0 445 if (pfkey_promisc_toggle(1) < 0) { 446 pfkey_close(lcconf->sock_pfkey); 447 return -1; 448 } 449 #endif 450 return 0; 451 } 452 453 /* %%% for conversion */ 454 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */ 455 static u_int 456 ipsecdoi2pfkey_aalg(hashtype) 457 u_int hashtype; 458 { 459 switch (hashtype) { 460 case IPSECDOI_ATTR_AUTH_HMAC_MD5: 461 return SADB_AALG_MD5HMAC; 462 case IPSECDOI_ATTR_AUTH_HMAC_SHA1: 463 return SADB_AALG_SHA1HMAC; 464 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256: 465 #if (defined SADB_X_AALG_SHA2_256) && !defined(SADB_X_AALG_SHA2_256HMAC) 466 return SADB_X_AALG_SHA2_256; 467 #else 468 return SADB_X_AALG_SHA2_256HMAC; 469 #endif 470 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384: 471 #if (defined SADB_X_AALG_SHA2_384) && !defined(SADB_X_AALG_SHA2_384HMAC) 472 return SADB_X_AALG_SHA2_384; 473 #else 474 return SADB_X_AALG_SHA2_384HMAC; 475 #endif 476 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512: 477 #if (defined SADB_X_AALG_SHA2_512) && !defined(SADB_X_AALG_SHA2_512HMAC) 478 return SADB_X_AALG_SHA2_512; 479 #else 480 return SADB_X_AALG_SHA2_512HMAC; 481 #endif 482 case IPSECDOI_ATTR_AUTH_KPDK: /* need special care */ 483 return SADB_AALG_NONE; 484 485 /* not supported */ 486 case IPSECDOI_ATTR_AUTH_DES_MAC: 487 plog(LLV_ERROR, LOCATION, NULL, 488 "Not supported hash type: %u\n", hashtype); 489 return ~0; 490 491 case 0: /* reserved */ 492 default: 493 return SADB_AALG_NONE; 494 495 plog(LLV_ERROR, LOCATION, NULL, 496 "Invalid hash type: %u\n", hashtype); 497 return ~0; 498 } 499 /*NOTREACHED*/ 500 } 501 502 /* IPSECDOI_ESP -> SADB_EALG */ 503 static u_int 504 ipsecdoi2pfkey_ealg(t_id) 505 u_int t_id; 506 { 507 switch (t_id) { 508 case IPSECDOI_ESP_DES_IV64: /* sa_flags |= SADB_X_EXT_OLD */ 509 return SADB_EALG_DESCBC; 510 case IPSECDOI_ESP_DES: 511 return SADB_EALG_DESCBC; 512 case IPSECDOI_ESP_3DES: 513 return SADB_EALG_3DESCBC; 514 #ifdef SADB_X_EALG_RC5CBC 515 case IPSECDOI_ESP_RC5: 516 return SADB_X_EALG_RC5CBC; 517 #endif 518 case IPSECDOI_ESP_CAST: 519 return SADB_X_EALG_CAST128CBC; 520 case IPSECDOI_ESP_BLOWFISH: 521 return SADB_X_EALG_BLOWFISHCBC; 522 case IPSECDOI_ESP_DES_IV32: /* flags |= (SADB_X_EXT_OLD| 523 SADB_X_EXT_IV4B)*/ 524 return SADB_EALG_DESCBC; 525 case IPSECDOI_ESP_NULL: 526 return SADB_EALG_NULL; 527 #ifdef SADB_X_EALG_AESCBC 528 case IPSECDOI_ESP_AES: 529 return SADB_X_EALG_AESCBC; 530 #endif 531 #ifdef SADB_X_EALG_TWOFISHCBC 532 case IPSECDOI_ESP_TWOFISH: 533 return SADB_X_EALG_TWOFISHCBC; 534 #endif 535 #ifdef SADB_X_EALG_CAMELLIACBC 536 case IPSECDOI_ESP_CAMELLIA: 537 return SADB_X_EALG_CAMELLIACBC; 538 #endif 539 540 /* not supported */ 541 case IPSECDOI_ESP_3IDEA: 542 case IPSECDOI_ESP_IDEA: 543 case IPSECDOI_ESP_RC4: 544 plog(LLV_ERROR, LOCATION, NULL, 545 "Not supported transform: %u\n", t_id); 546 return ~0; 547 548 case 0: /* reserved */ 549 default: 550 plog(LLV_ERROR, LOCATION, NULL, 551 "Invalid transform id: %u\n", t_id); 552 return ~0; 553 } 554 /*NOTREACHED*/ 555 } 556 557 /* IPCOMP -> SADB_CALG */ 558 static u_int 559 ipsecdoi2pfkey_calg(t_id) 560 u_int t_id; 561 { 562 switch (t_id) { 563 case IPSECDOI_IPCOMP_OUI: 564 return SADB_X_CALG_OUI; 565 case IPSECDOI_IPCOMP_DEFLATE: 566 return SADB_X_CALG_DEFLATE; 567 case IPSECDOI_IPCOMP_LZS: 568 return SADB_X_CALG_LZS; 569 570 case 0: /* reserved */ 571 default: 572 plog(LLV_ERROR, LOCATION, NULL, 573 "Invalid transform id: %u\n", t_id); 574 return ~0; 575 } 576 /*NOTREACHED*/ 577 } 578 579 /* IPSECDOI_PROTO -> SADB_SATYPE */ 580 u_int 581 ipsecdoi2pfkey_proto(proto) 582 u_int proto; 583 { 584 switch (proto) { 585 case IPSECDOI_PROTO_IPSEC_AH: 586 return SADB_SATYPE_AH; 587 case IPSECDOI_PROTO_IPSEC_ESP: 588 return SADB_SATYPE_ESP; 589 case IPSECDOI_PROTO_IPCOMP: 590 return SADB_X_SATYPE_IPCOMP; 591 592 default: 593 plog(LLV_ERROR, LOCATION, NULL, 594 "Invalid ipsec_doi proto: %u\n", proto); 595 return ~0; 596 } 597 /*NOTREACHED*/ 598 } 599 600 static u_int 601 ipsecdoi2pfkey_alg(algclass, type) 602 u_int algclass, type; 603 { 604 switch (algclass) { 605 case IPSECDOI_ATTR_AUTH: 606 return ipsecdoi2pfkey_aalg(type); 607 case IPSECDOI_PROTO_IPSEC_ESP: 608 return ipsecdoi2pfkey_ealg(type); 609 case IPSECDOI_PROTO_IPCOMP: 610 return ipsecdoi2pfkey_calg(type); 611 default: 612 plog(LLV_ERROR, LOCATION, NULL, 613 "Invalid ipsec_doi algclass: %u\n", algclass); 614 return ~0; 615 } 616 /*NOTREACHED*/ 617 } 618 619 /* SADB_SATYPE -> IPSECDOI_PROTO */ 620 u_int 621 pfkey2ipsecdoi_proto(satype) 622 u_int satype; 623 { 624 switch (satype) { 625 case SADB_SATYPE_AH: 626 return IPSECDOI_PROTO_IPSEC_AH; 627 case SADB_SATYPE_ESP: 628 return IPSECDOI_PROTO_IPSEC_ESP; 629 case SADB_X_SATYPE_IPCOMP: 630 return IPSECDOI_PROTO_IPCOMP; 631 632 default: 633 plog(LLV_ERROR, LOCATION, NULL, 634 "Invalid pfkey proto: %u\n", satype); 635 return ~0; 636 } 637 /*NOTREACHED*/ 638 } 639 640 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */ 641 u_int 642 ipsecdoi2pfkey_mode(mode) 643 u_int mode; 644 { 645 switch (mode) { 646 case IPSECDOI_ATTR_ENC_MODE_TUNNEL: 647 #ifdef ENABLE_NATT 648 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC: 649 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT: 650 #endif 651 return IPSEC_MODE_TUNNEL; 652 case IPSECDOI_ATTR_ENC_MODE_TRNS: 653 #ifdef ENABLE_NATT 654 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC: 655 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT: 656 #endif 657 return IPSEC_MODE_TRANSPORT; 658 default: 659 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode); 660 return ~0; 661 } 662 /*NOTREACHED*/ 663 } 664 665 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */ 666 u_int 667 pfkey2ipsecdoi_mode(mode) 668 u_int mode; 669 { 670 switch (mode) { 671 case IPSEC_MODE_TUNNEL: 672 return IPSECDOI_ATTR_ENC_MODE_TUNNEL; 673 case IPSEC_MODE_TRANSPORT: 674 return IPSECDOI_ATTR_ENC_MODE_TRNS; 675 case IPSEC_MODE_ANY: 676 return IPSECDOI_ATTR_ENC_MODE_ANY; 677 default: 678 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode); 679 return ~0; 680 } 681 /*NOTREACHED*/ 682 } 683 684 /* default key length for encryption algorithm */ 685 static u_int 686 keylen_aalg(hashtype) 687 u_int hashtype; 688 { 689 int res; 690 691 if (hashtype == 0) 692 return SADB_AALG_NONE; 693 694 res = alg_ipsec_hmacdef_hashlen(hashtype); 695 if (res == -1) { 696 plog(LLV_ERROR, LOCATION, NULL, 697 "invalid hmac algorithm %u.\n", hashtype); 698 return ~0; 699 } 700 return res; 701 } 702 703 /* default key length for encryption algorithm */ 704 static u_int 705 keylen_ealg(enctype, encklen) 706 u_int enctype; 707 int encklen; 708 { 709 int res; 710 711 res = alg_ipsec_encdef_keylen(enctype, encklen); 712 if (res == -1) { 713 plog(LLV_ERROR, LOCATION, NULL, 714 "invalid encryption algorithm %u.\n", enctype); 715 return ~0; 716 } 717 return res; 718 } 719 720 int 721 pfkey_convertfromipsecdoi(proto_id, t_id, hashtype, 722 e_type, e_keylen, a_type, a_keylen, flags) 723 u_int proto_id; 724 u_int t_id; 725 u_int hashtype; 726 u_int *e_type; 727 u_int *e_keylen; 728 u_int *a_type; 729 u_int *a_keylen; 730 u_int *flags; 731 { 732 *flags = 0; 733 switch (proto_id) { 734 case IPSECDOI_PROTO_IPSEC_ESP: 735 if ((*e_type = ipsecdoi2pfkey_ealg(t_id)) == ~0) 736 goto bad; 737 if ((*e_keylen = keylen_ealg(t_id, *e_keylen)) == ~0) 738 goto bad; 739 *e_keylen >>= 3; 740 741 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0) 742 goto bad; 743 if ((*a_keylen = keylen_aalg(hashtype)) == ~0) 744 goto bad; 745 *a_keylen >>= 3; 746 747 if (*e_type == SADB_EALG_NONE) { 748 plog(LLV_ERROR, LOCATION, NULL, "no ESP algorithm.\n"); 749 goto bad; 750 } 751 break; 752 753 case IPSECDOI_PROTO_IPSEC_AH: 754 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0) 755 goto bad; 756 if ((*a_keylen = keylen_aalg(hashtype)) == ~0) 757 goto bad; 758 *a_keylen >>= 3; 759 760 if (t_id == IPSECDOI_ATTR_AUTH_HMAC_MD5 761 && hashtype == IPSECDOI_ATTR_AUTH_KPDK) { 762 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */ 763 *a_type = SADB_X_AALG_MD5; 764 *flags |= SADB_X_EXT_OLD; 765 } 766 *e_type = SADB_EALG_NONE; 767 *e_keylen = 0; 768 if (*a_type == SADB_AALG_NONE) { 769 plog(LLV_ERROR, LOCATION, NULL, "no AH algorithm.\n"); 770 goto bad; 771 } 772 break; 773 774 case IPSECDOI_PROTO_IPCOMP: 775 if ((*e_type = ipsecdoi2pfkey_calg(t_id)) == ~0) 776 goto bad; 777 *e_keylen = 0; 778 779 *flags = SADB_X_EXT_RAWCPI; 780 781 *a_type = SADB_AALG_NONE; 782 *a_keylen = 0; 783 if (*e_type == SADB_X_CALG_NONE) { 784 plog(LLV_ERROR, LOCATION, NULL, "no IPCOMP algorithm.\n"); 785 goto bad; 786 } 787 break; 788 789 default: 790 plog(LLV_ERROR, LOCATION, NULL, "unknown IPsec protocol.\n"); 791 goto bad; 792 } 793 794 return 0; 795 796 bad: 797 errno = EINVAL; 798 return -1; 799 } 800 801 /* called from scheduler */ 802 void 803 pfkey_timeover_stub(p) 804 void *p; 805 { 806 807 pfkey_timeover((struct ph2handle *)p); 808 } 809 810 void 811 pfkey_timeover(iph2) 812 struct ph2handle *iph2; 813 { 814 plog(LLV_ERROR, LOCATION, NULL, 815 "%s give up to get IPsec-SA due to time up to wait.\n", 816 saddrwop2str(iph2->dst)); 817 SCHED_KILL(iph2->sce); 818 819 /* If initiator side, send error to kernel by SADB_ACQUIRE. */ 820 if (iph2->side == INITIATOR) 821 pk_sendeacquire(iph2); 822 823 unbindph12(iph2); 824 remph2(iph2); 825 delph2(iph2); 826 827 return; 828 } 829 830 /*%%%*/ 831 /* send getspi message per ipsec protocol per remote address */ 832 /* 833 * the local address and remote address in ph1handle are dealed 834 * with destination address and source address respectively. 835 * Because SPI is decided by responder. 836 */ 837 int 838 pk_sendgetspi(iph2) 839 struct ph2handle *iph2; 840 { 841 struct sockaddr *src = NULL, *dst = NULL; 842 u_int satype, mode; 843 struct saprop *pp; 844 struct saproto *pr; 845 u_int32_t minspi, maxspi; 846 int proxy = 0; 847 848 if (iph2->side == INITIATOR) { 849 pp = iph2->proposal; 850 proxy = iph2->ph1->rmconf->support_proxy; 851 } else { 852 pp = iph2->approval; 853 if (iph2->sainfo && iph2->sainfo->id_i) 854 proxy = 1; 855 } 856 857 /* for mobile IPv6 */ 858 if (proxy && iph2->src_id && iph2->dst_id && 859 ipsecdoi_transportmode(pp)) { 860 src = iph2->src_id; 861 dst = iph2->dst_id; 862 } else { 863 src = iph2->src; 864 dst = iph2->dst; 865 } 866 867 for (pr = pp->head; pr != NULL; pr = pr->next) { 868 869 /* validity check */ 870 satype = ipsecdoi2pfkey_proto(pr->proto_id); 871 if (satype == ~0) { 872 plog(LLV_ERROR, LOCATION, NULL, 873 "invalid proto_id %d\n", pr->proto_id); 874 return -1; 875 } 876 /* this works around a bug in Linux kernel where it allocates 4 byte 877 spi's for IPCOMP */ 878 else if (satype == SADB_X_SATYPE_IPCOMP) { 879 minspi = 0x100; 880 maxspi = 0xffff; 881 } 882 else { 883 minspi = 0; 884 maxspi = 0; 885 } 886 mode = ipsecdoi2pfkey_mode(pr->encmode); 887 if (mode == ~0) { 888 plog(LLV_ERROR, LOCATION, NULL, 889 "invalid encmode %d\n", pr->encmode); 890 return -1; 891 } 892 893 #ifdef ENABLE_NATT 894 /* XXX should we do a copy of src/dst for each pr ? 895 */ 896 if (! pr->udp_encap) { 897 /* Remove port information, that SA doesn't use it */ 898 set_port(src, 0); 899 set_port(dst, 0); 900 } 901 #endif 902 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_getspi\n"); 903 if (pfkey_send_getspi( 904 lcconf->sock_pfkey, 905 satype, 906 mode, 907 dst, /* src of SA */ 908 src, /* dst of SA */ 909 minspi, maxspi, 910 pr->reqid_in, iph2->seq) < 0) { 911 plog(LLV_ERROR, LOCATION, NULL, 912 "ipseclib failed send getspi (%s)\n", 913 ipsec_strerror()); 914 return -1; 915 } 916 plog(LLV_DEBUG, LOCATION, NULL, 917 "pfkey GETSPI sent: %s\n", 918 sadbsecas2str(dst, src, satype, 0, mode)); 919 } 920 921 return 0; 922 } 923 924 /* 925 * receive GETSPI from kernel. 926 */ 927 static int 928 pk_recvgetspi(mhp) 929 caddr_t *mhp; 930 { 931 struct sadb_msg *msg; 932 struct sadb_sa *sa; 933 struct ph2handle *iph2; 934 struct sockaddr *dst; 935 int proto_id; 936 int allspiok, notfound; 937 struct saprop *pp; 938 struct saproto *pr; 939 940 /* validity check */ 941 if (mhp[SADB_EXT_SA] == NULL 942 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 943 plog(LLV_ERROR, LOCATION, NULL, 944 "inappropriate sadb getspi message passed.\n"); 945 return -1; 946 } 947 msg = (struct sadb_msg *)mhp[0]; 948 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 949 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); /* note SA dir */ 950 951 /* the message has to be processed or not ? */ 952 if (msg->sadb_msg_pid != getpid()) { 953 plog(LLV_DEBUG, LOCATION, NULL, 954 "%s message is not interesting " 955 "because pid %d is not mine.\n", 956 s_pfkey_type(msg->sadb_msg_type), 957 msg->sadb_msg_pid); 958 return -1; 959 } 960 961 iph2 = getph2byseq(msg->sadb_msg_seq); 962 if (iph2 == NULL) { 963 plog(LLV_DEBUG, LOCATION, NULL, 964 "seq %d of %s message not interesting.\n", 965 msg->sadb_msg_seq, 966 s_pfkey_type(msg->sadb_msg_type)); 967 return -1; 968 } 969 970 if (iph2->status != PHASE2ST_GETSPISENT) { 971 plog(LLV_ERROR, LOCATION, NULL, 972 "status mismatch (db:%d msg:%d)\n", 973 iph2->status, PHASE2ST_GETSPISENT); 974 return -1; 975 } 976 977 /* set SPI, and check to get all spi whether or not */ 978 allspiok = 1; 979 notfound = 1; 980 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 981 pp = iph2->side == INITIATOR ? iph2->proposal : iph2->approval; 982 983 for (pr = pp->head; pr != NULL; pr = pr->next) { 984 if (pr->proto_id == proto_id && pr->spi == 0) { 985 pr->spi = sa->sadb_sa_spi; 986 notfound = 0; 987 plog(LLV_DEBUG, LOCATION, NULL, 988 "pfkey GETSPI succeeded: %s\n", 989 sadbsecas2str(iph2->dst, iph2->src, 990 msg->sadb_msg_satype, 991 sa->sadb_sa_spi, 992 ipsecdoi2pfkey_mode(pr->encmode))); 993 } 994 if (pr->spi == 0) 995 allspiok = 0; /* not get all spi */ 996 } 997 998 if (notfound) { 999 plog(LLV_ERROR, LOCATION, NULL, 1000 "get spi for unknown address %s\n", 1001 saddrwop2str(iph2->dst)); 1002 return -1; 1003 } 1004 1005 if (allspiok) { 1006 /* update status */ 1007 iph2->status = PHASE2ST_GETSPIDONE; 1008 if (isakmp_post_getspi(iph2) < 0) { 1009 plog(LLV_ERROR, LOCATION, NULL, 1010 "failed to start post getspi.\n"); 1011 unbindph12(iph2); 1012 remph2(iph2); 1013 delph2(iph2); 1014 iph2 = NULL; 1015 return -1; 1016 } 1017 } 1018 1019 return 0; 1020 } 1021 1022 /* 1023 * set inbound SA 1024 */ 1025 int 1026 pk_sendupdate(iph2) 1027 struct ph2handle *iph2; 1028 { 1029 struct saproto *pr; 1030 struct pfkey_send_sa_args sa_args; 1031 int proxy = 0; 1032 1033 /* sanity check */ 1034 if (iph2->approval == NULL) { 1035 plog(LLV_ERROR, LOCATION, NULL, 1036 "no approvaled SAs found.\n"); 1037 } 1038 1039 if (iph2->side == INITIATOR) 1040 proxy = iph2->ph1->rmconf->support_proxy; 1041 else if (iph2->sainfo && iph2->sainfo->id_i) 1042 proxy = 1; 1043 1044 /* fill in some needed for pfkey_send_update2 */ 1045 memset (&sa_args, 0, sizeof (sa_args)); 1046 sa_args.so = lcconf->sock_pfkey; 1047 sa_args.l_addtime = iph2->approval->lifetime; 1048 sa_args.seq = iph2->seq; 1049 sa_args.wsize = 4; 1050 1051 /* for mobile IPv6 */ 1052 if (proxy && iph2->src_id && iph2->dst_id && 1053 ipsecdoi_transportmode(iph2->approval)) { 1054 sa_args.dst = iph2->src_id; 1055 sa_args.src = iph2->dst_id; 1056 } else { 1057 sa_args.dst = iph2->src; 1058 sa_args.src = iph2->dst; 1059 } 1060 1061 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1062 /* validity check */ 1063 sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id); 1064 if (sa_args.satype == ~0) { 1065 plog(LLV_ERROR, LOCATION, NULL, 1066 "invalid proto_id %d\n", pr->proto_id); 1067 return -1; 1068 } 1069 else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) { 1070 /* IPCOMP has no replay window */ 1071 sa_args.wsize = 0; 1072 } 1073 #ifdef ENABLE_SAMODE_UNSPECIFIED 1074 sa_args.mode = IPSEC_MODE_ANY; 1075 #else 1076 sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode); 1077 if (sa_args.mode == ~0) { 1078 plog(LLV_ERROR, LOCATION, NULL, 1079 "invalid encmode %d\n", pr->encmode); 1080 return -1; 1081 } 1082 #endif 1083 /* set algorithm type and key length */ 1084 sa_args.e_keylen = pr->head->encklen; 1085 if (pfkey_convertfromipsecdoi( 1086 pr->proto_id, 1087 pr->head->trns_id, 1088 pr->head->authtype, 1089 &sa_args.e_type, &sa_args.e_keylen, 1090 &sa_args.a_type, &sa_args.a_keylen, 1091 &sa_args.flags) < 0) 1092 return -1; 1093 1094 #if 0 1095 sa_args.l_bytes = iph2->approval->lifebyte * 1024, 1096 #else 1097 sa_args.l_bytes = 0; 1098 #endif 1099 1100 #ifdef HAVE_SECCTX 1101 if (*iph2->approval->sctx.ctx_str) { 1102 sa_args.ctxdoi = iph2->approval->sctx.ctx_doi; 1103 sa_args.ctxalg = iph2->approval->sctx.ctx_alg; 1104 sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen; 1105 sa_args.ctxstr = iph2->approval->sctx.ctx_str; 1106 } 1107 #endif /* HAVE_SECCTX */ 1108 1109 #ifdef ENABLE_NATT 1110 if (pr->udp_encap) { 1111 sa_args.l_natt_type = iph2->ph1->natt_options->encaps_type; 1112 sa_args.l_natt_sport = extract_port (iph2->ph1->remote); 1113 sa_args.l_natt_dport = extract_port (iph2->ph1->local); 1114 sa_args.l_natt_oa = NULL; // FIXME: Here comes OA!!! 1115 #ifdef SADB_X_EXT_NAT_T_FRAG 1116 sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag; 1117 #endif 1118 } else { 1119 /* Remove port information, that SA doesn't use it */ 1120 set_port(sa_args.src, 0); 1121 set_port(sa_args.dst, 0); 1122 } 1123 1124 #endif 1125 /* more info to fill in */ 1126 sa_args.spi = pr->spi; 1127 sa_args.reqid = pr->reqid_in; 1128 sa_args.keymat = pr->keymat->v; 1129 1130 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_update2\n"); 1131 if (pfkey_send_update2(&sa_args) < 0) { 1132 plog(LLV_ERROR, LOCATION, NULL, 1133 "libipsec failed send update (%s)\n", 1134 ipsec_strerror()); 1135 return -1; 1136 } 1137 1138 #ifndef ANDROID_PATCHED 1139 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]) 1140 continue; 1141 1142 /* 1143 * It maybe good idea to call backupsa_to_file() after 1144 * racoon will receive the sadb_update messages. 1145 * But it is impossible because there is not key in the 1146 * information from the kernel. 1147 */ 1148 1149 /* change some things before backing up */ 1150 sa_args.wsize = 4; 1151 sa_args.l_bytes = iph2->approval->lifebyte * 1024; 1152 1153 if (backupsa_to_file(&sa_args) < 0) { 1154 plog(LLV_ERROR, LOCATION, NULL, 1155 "backuped SA failed: %s\n", 1156 sadbsecas2str(sa_args.src, sa_args.dst, 1157 sa_args.satype, sa_args.spi, sa_args.mode)); 1158 } 1159 plog(LLV_DEBUG, LOCATION, NULL, 1160 "backuped SA: %s\n", 1161 sadbsecas2str(sa_args.src, sa_args.dst, 1162 sa_args.satype, sa_args.spi, sa_args.mode)); 1163 #endif 1164 } 1165 1166 return 0; 1167 } 1168 1169 static int 1170 pk_recvupdate(mhp) 1171 caddr_t *mhp; 1172 { 1173 struct sadb_msg *msg; 1174 struct sadb_sa *sa; 1175 struct sockaddr *src, *dst; 1176 struct ph2handle *iph2; 1177 u_int proto_id, encmode, sa_mode; 1178 int incomplete = 0; 1179 struct saproto *pr; 1180 1181 /* ignore this message because of local test mode. */ 1182 if (f_local) 1183 return 0; 1184 1185 /* sanity check */ 1186 if (mhp[0] == NULL 1187 || mhp[SADB_EXT_SA] == NULL 1188 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1189 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 1190 plog(LLV_ERROR, LOCATION, NULL, 1191 "inappropriate sadb update message passed.\n"); 1192 return -1; 1193 } 1194 msg = (struct sadb_msg *)mhp[0]; 1195 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1196 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1197 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1198 1199 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1200 ? IPSEC_MODE_ANY 1201 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1202 1203 /* the message has to be processed or not ? */ 1204 if (msg->sadb_msg_pid != getpid()) { 1205 plog(LLV_DEBUG, LOCATION, NULL, 1206 "%s message is not interesting " 1207 "because pid %d is not mine.\n", 1208 s_pfkey_type(msg->sadb_msg_type), 1209 msg->sadb_msg_pid); 1210 return -1; 1211 } 1212 1213 iph2 = getph2byseq(msg->sadb_msg_seq); 1214 if (iph2 == NULL) { 1215 plog(LLV_DEBUG, LOCATION, NULL, 1216 "seq %d of %s message not interesting.\n", 1217 msg->sadb_msg_seq, 1218 s_pfkey_type(msg->sadb_msg_type)); 1219 return -1; 1220 } 1221 1222 if (iph2->status != PHASE2ST_ADDSA) { 1223 plog(LLV_ERROR, LOCATION, NULL, 1224 "status mismatch (db:%d msg:%d)\n", 1225 iph2->status, PHASE2ST_ADDSA); 1226 return -1; 1227 } 1228 1229 /* check to complete all keys ? */ 1230 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1231 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1232 if (proto_id == ~0) { 1233 plog(LLV_ERROR, LOCATION, NULL, 1234 "invalid proto_id %d\n", msg->sadb_msg_satype); 1235 return -1; 1236 } 1237 encmode = pfkey2ipsecdoi_mode(sa_mode); 1238 if (encmode == ~0) { 1239 plog(LLV_ERROR, LOCATION, NULL, 1240 "invalid encmode %d\n", sa_mode); 1241 return -1; 1242 } 1243 1244 if (pr->proto_id == proto_id 1245 && pr->spi == sa->sadb_sa_spi) { 1246 pr->ok = 1; 1247 plog(LLV_DEBUG, LOCATION, NULL, 1248 "pfkey UPDATE succeeded: %s\n", 1249 sadbsecas2str(iph2->dst, iph2->src, 1250 msg->sadb_msg_satype, 1251 sa->sadb_sa_spi, 1252 sa_mode)); 1253 1254 plog(LLV_INFO, LOCATION, NULL, 1255 "IPsec-SA established: %s\n", 1256 sadbsecas2str(iph2->dst, iph2->src, 1257 msg->sadb_msg_satype, sa->sadb_sa_spi, 1258 sa_mode)); 1259 } 1260 1261 if (pr->ok == 0) 1262 incomplete = 1; 1263 } 1264 1265 if (incomplete) 1266 return 0; 1267 1268 /* turn off the timer for calling pfkey_timeover() */ 1269 SCHED_KILL(iph2->sce); 1270 1271 /* update status */ 1272 iph2->status = PHASE2ST_ESTABLISHED; 1273 1274 #ifdef ENABLE_STATS 1275 gettimeofday(&iph2->end, NULL); 1276 syslog(LOG_NOTICE, "%s(%s): %8.6f", 1277 "phase2", "quick", timedelta(&iph2->start, &iph2->end)); 1278 #endif 1279 1280 /* count up */ 1281 iph2->ph1->ph2cnt++; 1282 1283 /* turn off schedule */ 1284 SCHED_KILL(iph2->scr); 1285 1286 /* Force the update of ph2's ports, as there is at least one 1287 * situation where they'll mismatch with ph1's values 1288 */ 1289 1290 #ifdef ENABLE_NATT 1291 set_port(iph2->src, extract_port(iph2->ph1->local)); 1292 set_port(iph2->dst, extract_port(iph2->ph1->remote)); 1293 #endif 1294 1295 /* 1296 * since we are going to reuse the phase2 handler, we need to 1297 * remain it and refresh all the references between ph1 and ph2 to use. 1298 */ 1299 unbindph12(iph2); 1300 1301 iph2->sce = sched_new(iph2->approval->lifetime, 1302 isakmp_ph2expire_stub, iph2); 1303 1304 plog(LLV_DEBUG, LOCATION, NULL, "===\n"); 1305 return 0; 1306 } 1307 1308 /* 1309 * set outbound SA 1310 */ 1311 int 1312 pk_sendadd(iph2) 1313 struct ph2handle *iph2; 1314 { 1315 struct saproto *pr; 1316 int proxy = 0; 1317 struct pfkey_send_sa_args sa_args; 1318 1319 /* sanity check */ 1320 if (iph2->approval == NULL) { 1321 plog(LLV_ERROR, LOCATION, NULL, 1322 "no approvaled SAs found.\n"); 1323 return -1; 1324 } 1325 1326 if (iph2->side == INITIATOR) 1327 proxy = iph2->ph1->rmconf->support_proxy; 1328 else if (iph2->sainfo && iph2->sainfo->id_i) 1329 proxy = 1; 1330 1331 /* fill in some needed for pfkey_send_update2 */ 1332 memset (&sa_args, 0, sizeof (sa_args)); 1333 sa_args.so = lcconf->sock_pfkey; 1334 sa_args.l_addtime = iph2->approval->lifetime; 1335 sa_args.seq = iph2->seq; 1336 sa_args.wsize = 4; 1337 1338 /* for mobile IPv6 */ 1339 if (proxy && iph2->src_id && iph2->dst_id && 1340 ipsecdoi_transportmode(iph2->approval)) { 1341 sa_args.src = iph2->src_id; 1342 sa_args.dst = iph2->dst_id; 1343 } else { 1344 sa_args.src = iph2->src; 1345 sa_args.dst = iph2->dst; 1346 } 1347 1348 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1349 /* validity check */ 1350 sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id); 1351 if (sa_args.satype == ~0) { 1352 plog(LLV_ERROR, LOCATION, NULL, 1353 "invalid proto_id %d\n", pr->proto_id); 1354 return -1; 1355 } 1356 else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) { 1357 /* no replay window for IPCOMP */ 1358 sa_args.wsize = 0; 1359 } 1360 #ifdef ENABLE_SAMODE_UNSPECIFIED 1361 sa_args.mode = IPSEC_MODE_ANY; 1362 #else 1363 sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode); 1364 if (sa_args.mode == ~0) { 1365 plog(LLV_ERROR, LOCATION, NULL, 1366 "invalid encmode %d\n", pr->encmode); 1367 return -1; 1368 } 1369 #endif 1370 1371 /* set algorithm type and key length */ 1372 sa_args.e_keylen = pr->head->encklen; 1373 if (pfkey_convertfromipsecdoi( 1374 pr->proto_id, 1375 pr->head->trns_id, 1376 pr->head->authtype, 1377 &sa_args.e_type, &sa_args.e_keylen, 1378 &sa_args.a_type, &sa_args.a_keylen, 1379 &sa_args.flags) < 0) 1380 return -1; 1381 1382 #if 0 1383 sa_args.l_bytes = iph2->approval->lifebyte * 1024, 1384 #else 1385 sa_args.l_bytes = 0; 1386 #endif 1387 1388 #ifdef HAVE_SECCTX 1389 if (*iph2->approval->sctx.ctx_str) { 1390 sa_args.ctxdoi = iph2->approval->sctx.ctx_doi; 1391 sa_args.ctxalg = iph2->approval->sctx.ctx_alg; 1392 sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen; 1393 sa_args.ctxstr = iph2->approval->sctx.ctx_str; 1394 } 1395 #endif /* HAVE_SECCTX */ 1396 1397 #ifdef ENABLE_NATT 1398 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2 " 1399 "(NAT flavor)\n"); 1400 1401 if (pr->udp_encap) { 1402 sa_args.l_natt_type = UDP_ENCAP_ESPINUDP; 1403 sa_args.l_natt_sport = extract_port(iph2->ph1->local); 1404 sa_args.l_natt_dport = extract_port(iph2->ph1->remote); 1405 sa_args.l_natt_oa = NULL; // FIXME: Here comes OA!!! 1406 #ifdef SADB_X_EXT_NAT_T_FRAG 1407 sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag; 1408 #endif 1409 } else { 1410 /* Remove port information, that SA doesn't use it */ 1411 set_port(sa_args.src, 0); 1412 set_port(sa_args.dst, 0); 1413 } 1414 1415 #else 1416 /* Remove port information, it is not used without NAT-T */ 1417 set_port(sa_args.src, 0); 1418 set_port(sa_args.dst, 0); 1419 #endif 1420 1421 /* more info to fill in */ 1422 sa_args.spi = pr->spi_p; 1423 sa_args.reqid = pr->reqid_out; 1424 sa_args.keymat = pr->keymat_p->v; 1425 1426 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2\n"); 1427 if (pfkey_send_add2(&sa_args) < 0) { 1428 plog(LLV_ERROR, LOCATION, NULL, 1429 "libipsec failed send add (%s)\n", 1430 ipsec_strerror()); 1431 return -1; 1432 } 1433 1434 #ifndef ANDROID_PATCHED 1435 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]) 1436 continue; 1437 1438 /* 1439 * It maybe good idea to call backupsa_to_file() after 1440 * racoon will receive the sadb_update messages. 1441 * But it is impossible because there is not key in the 1442 * information from the kernel. 1443 */ 1444 if (backupsa_to_file(&sa_args) < 0) { 1445 plog(LLV_ERROR, LOCATION, NULL, 1446 "backuped SA failed: %s\n", 1447 sadbsecas2str(sa_args.src, sa_args.dst, 1448 sa_args.satype, sa_args.spi, sa_args.mode)); 1449 } 1450 plog(LLV_DEBUG, LOCATION, NULL, 1451 "backuped SA: %s\n", 1452 sadbsecas2str(sa_args.src, sa_args.dst, 1453 sa_args.satype, sa_args.spi, sa_args.mode)); 1454 #endif 1455 } 1456 return 0; 1457 } 1458 1459 static int 1460 pk_recvadd(mhp) 1461 caddr_t *mhp; 1462 { 1463 struct sadb_msg *msg; 1464 struct sadb_sa *sa; 1465 struct sockaddr *src, *dst; 1466 struct ph2handle *iph2; 1467 u_int sa_mode; 1468 1469 /* ignore this message because of local test mode. */ 1470 if (f_local) 1471 return 0; 1472 1473 /* sanity check */ 1474 if (mhp[0] == NULL 1475 || mhp[SADB_EXT_SA] == NULL 1476 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1477 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 1478 plog(LLV_ERROR, LOCATION, NULL, 1479 "inappropriate sadb add message passed.\n"); 1480 return -1; 1481 } 1482 msg = (struct sadb_msg *)mhp[0]; 1483 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1484 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1485 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1486 1487 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1488 ? IPSEC_MODE_ANY 1489 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1490 1491 /* the message has to be processed or not ? */ 1492 if (msg->sadb_msg_pid != getpid()) { 1493 plog(LLV_DEBUG, LOCATION, NULL, 1494 "%s message is not interesting " 1495 "because pid %d is not mine.\n", 1496 s_pfkey_type(msg->sadb_msg_type), 1497 msg->sadb_msg_pid); 1498 return -1; 1499 } 1500 1501 iph2 = getph2byseq(msg->sadb_msg_seq); 1502 if (iph2 == NULL) { 1503 plog(LLV_DEBUG, LOCATION, NULL, 1504 "seq %d of %s message not interesting.\n", 1505 msg->sadb_msg_seq, 1506 s_pfkey_type(msg->sadb_msg_type)); 1507 return -1; 1508 } 1509 1510 /* 1511 * NOTE don't update any status of phase2 handle 1512 * because they must be updated by SADB_UPDATE message 1513 */ 1514 1515 plog(LLV_INFO, LOCATION, NULL, 1516 "IPsec-SA established: %s\n", 1517 sadbsecas2str(iph2->src, iph2->dst, 1518 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode)); 1519 1520 plog(LLV_DEBUG, LOCATION, NULL, "===\n"); 1521 return 0; 1522 } 1523 1524 static int 1525 pk_recvexpire(mhp) 1526 caddr_t *mhp; 1527 { 1528 struct sadb_msg *msg; 1529 struct sadb_sa *sa; 1530 struct sockaddr *src, *dst; 1531 struct ph2handle *iph2; 1532 u_int proto_id, sa_mode; 1533 1534 /* sanity check */ 1535 if (mhp[0] == NULL 1536 || mhp[SADB_EXT_SA] == NULL 1537 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1538 || mhp[SADB_EXT_ADDRESS_DST] == NULL 1539 || (mhp[SADB_EXT_LIFETIME_HARD] != NULL 1540 && mhp[SADB_EXT_LIFETIME_SOFT] != NULL)) { 1541 plog(LLV_ERROR, LOCATION, NULL, 1542 "inappropriate sadb expire message passed.\n"); 1543 return -1; 1544 } 1545 msg = (struct sadb_msg *)mhp[0]; 1546 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1547 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1548 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1549 1550 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1551 ? IPSEC_MODE_ANY 1552 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1553 1554 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1555 if (proto_id == ~0) { 1556 plog(LLV_ERROR, LOCATION, NULL, 1557 "invalid proto_id %d\n", msg->sadb_msg_satype); 1558 return -1; 1559 } 1560 1561 plog(LLV_INFO, LOCATION, NULL, 1562 "IPsec-SA expired: %s\n", 1563 sadbsecas2str(src, dst, 1564 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode)); 1565 1566 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi); 1567 if (iph2 == NULL) { 1568 /* 1569 * Ignore it because two expire messages are come up. 1570 * phase2 handler has been deleted already when 2nd message 1571 * is received. 1572 */ 1573 plog(LLV_DEBUG, LOCATION, NULL, 1574 "no such a SA found: %s\n", 1575 sadbsecas2str(src, dst, 1576 msg->sadb_msg_satype, sa->sadb_sa_spi, 1577 sa_mode)); 1578 return 0; 1579 } 1580 if (iph2->status != PHASE2ST_ESTABLISHED) { 1581 /* 1582 * If the status is not equal to PHASE2ST_ESTABLISHED, 1583 * racoon ignores this expire message. There are two reason. 1584 * One is that the phase 2 probably starts because there is 1585 * a potential that racoon receives the acquire message 1586 * without receiving a expire message. Another is that racoon 1587 * may receive the multiple expire messages from the kernel. 1588 */ 1589 plog(LLV_WARNING, LOCATION, NULL, 1590 "the expire message is received " 1591 "but the handler has not been established.\n"); 1592 return 0; 1593 } 1594 1595 /* turn off the timer for calling isakmp_ph2expire() */ 1596 SCHED_KILL(iph2->sce); 1597 1598 iph2->status = PHASE2ST_EXPIRED; 1599 1600 /* INITIATOR, begin phase 2 exchange. */ 1601 /* allocate buffer for status management of pfkey message */ 1602 if (iph2->side == INITIATOR) { 1603 1604 initph2(iph2); 1605 1606 /* update status for re-use */ 1607 iph2->status = PHASE2ST_STATUS2; 1608 1609 /* start isakmp initiation by using ident exchange */ 1610 if (isakmp_post_acquire(iph2) < 0) { 1611 plog(LLV_ERROR, LOCATION, iph2->dst, 1612 "failed to begin ipsec sa " 1613 "re-negotication.\n"); 1614 unbindph12(iph2); 1615 remph2(iph2); 1616 delph2(iph2); 1617 return -1; 1618 } 1619 1620 return 0; 1621 /*NOTREACHED*/ 1622 } 1623 1624 /* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */ 1625 /* RESPONDER always delete ph2handle, keep silent. RESPONDER doesn't 1626 * manage IPsec SA, so delete the list */ 1627 unbindph12(iph2); 1628 remph2(iph2); 1629 delph2(iph2); 1630 1631 return 0; 1632 } 1633 1634 static int 1635 pk_recvacquire(mhp) 1636 caddr_t *mhp; 1637 { 1638 struct sadb_msg *msg; 1639 struct sadb_x_policy *xpl; 1640 struct secpolicy *sp_out = NULL, *sp_in = NULL; 1641 #define MAXNESTEDSA 5 /* XXX */ 1642 struct ph2handle *iph2[MAXNESTEDSA]; 1643 struct sockaddr *src, *dst; 1644 int n; /* # of phase 2 handler */ 1645 int remoteid=0; 1646 #ifdef HAVE_SECCTX 1647 struct sadb_x_sec_ctx *m_sec_ctx; 1648 #endif /* HAVE_SECCTX */ 1649 struct policyindex spidx; 1650 1651 1652 /* ignore this message because of local test mode. */ 1653 if (f_local) 1654 return 0; 1655 1656 /* sanity check */ 1657 if (mhp[0] == NULL 1658 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1659 || mhp[SADB_EXT_ADDRESS_DST] == NULL 1660 || mhp[SADB_X_EXT_POLICY] == NULL) { 1661 plog(LLV_ERROR, LOCATION, NULL, 1662 "inappropriate sadb acquire message passed.\n"); 1663 return -1; 1664 } 1665 msg = (struct sadb_msg *)mhp[0]; 1666 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 1667 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1668 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1669 1670 #ifdef HAVE_SECCTX 1671 m_sec_ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 1672 1673 if (m_sec_ctx != NULL) { 1674 plog(LLV_INFO, LOCATION, NULL, "security context doi: %u\n", 1675 m_sec_ctx->sadb_x_ctx_doi); 1676 plog(LLV_INFO, LOCATION, NULL, 1677 "security context algorithm: %u\n", 1678 m_sec_ctx->sadb_x_ctx_alg); 1679 plog(LLV_INFO, LOCATION, NULL, "security context length: %u\n", 1680 m_sec_ctx->sadb_x_ctx_len); 1681 plog(LLV_INFO, LOCATION, NULL, "security context: %s\n", 1682 ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx))); 1683 } 1684 #endif /* HAVE_SECCTX */ 1685 1686 /* ignore if type is not IPSEC_POLICY_IPSEC */ 1687 if (xpl->sadb_x_policy_type != IPSEC_POLICY_IPSEC) { 1688 plog(LLV_DEBUG, LOCATION, NULL, 1689 "ignore ACQUIRE message. type is not IPsec.\n"); 1690 return 0; 1691 } 1692 1693 /* ignore it if src is multicast address */ 1694 { 1695 struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1696 1697 if ((sa->sa_family == AF_INET 1698 && IN_MULTICAST(ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr))) 1699 #ifdef INET6 1700 || (sa->sa_family == AF_INET6 1701 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)sa)->sin6_addr)) 1702 #endif 1703 ) { 1704 plog(LLV_DEBUG, LOCATION, NULL, 1705 "ignore due to multicast address: %s.\n", 1706 saddrwop2str(sa)); 1707 return 0; 1708 } 1709 } 1710 1711 /* ignore, if we do not listen on source address */ 1712 { 1713 /* reasons behind: 1714 * - if we'll contact peer from address we do not listen - 1715 * we will be unable to complete negotiation; 1716 * - if we'll negotiate using address we're listening - 1717 * remote peer will send packets to address different 1718 * than one in the policy, so kernel will drop them; 1719 * => therefore this acquire is not for us! --Aidas 1720 */ 1721 struct sockaddr *sa = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1722 struct myaddrs *p; 1723 int do_listen = 0; 1724 for (p = lcconf->myaddrs; p; p = p->next) { 1725 if (!cmpsaddrwop(p->addr, sa)) { 1726 do_listen = 1; 1727 break; 1728 } 1729 } 1730 1731 if (!do_listen) { 1732 plog(LLV_DEBUG, LOCATION, NULL, 1733 "ignore because do not listen on source address : %s.\n", 1734 saddrwop2str(sa)); 1735 return 0; 1736 } 1737 } 1738 1739 /* 1740 * If there is a phase 2 handler against the policy identifier in 1741 * the acquire message, and if 1742 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon 1743 * should ignore such a acquire message because the phase 2 1744 * is just negotiating. 1745 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon 1746 * has to prcesss such a acquire message because racoon may 1747 * lost the expire message. 1748 */ 1749 iph2[0] = getph2byid(src, dst, xpl->sadb_x_policy_id); 1750 if (iph2[0] != NULL) { 1751 if (iph2[0]->status < PHASE2ST_ESTABLISHED) { 1752 plog(LLV_DEBUG, LOCATION, NULL, 1753 "ignore the acquire because ph2 found\n"); 1754 return -1; 1755 } 1756 if (iph2[0]->status == PHASE2ST_EXPIRED) 1757 iph2[0] = NULL; 1758 /*FALLTHROUGH*/ 1759 } 1760 1761 /* search for proper policyindex */ 1762 sp_out = getspbyspid(xpl->sadb_x_policy_id); 1763 if (sp_out == NULL) { 1764 plog(LLV_ERROR, LOCATION, NULL, "no policy found: id:%d.\n", 1765 xpl->sadb_x_policy_id); 1766 return -1; 1767 } 1768 plog(LLV_DEBUG, LOCATION, NULL, 1769 "suitable outbound SP found: %s.\n", spidx2str(&sp_out->spidx)); 1770 1771 /* get inbound policy */ 1772 { 1773 1774 memset(&spidx, 0, sizeof(spidx)); 1775 spidx.dir = IPSEC_DIR_INBOUND; 1776 memcpy(&spidx.src, &sp_out->spidx.dst, sizeof(spidx.src)); 1777 memcpy(&spidx.dst, &sp_out->spidx.src, sizeof(spidx.dst)); 1778 spidx.prefs = sp_out->spidx.prefd; 1779 spidx.prefd = sp_out->spidx.prefs; 1780 spidx.ul_proto = sp_out->spidx.ul_proto; 1781 1782 #ifdef HAVE_SECCTX 1783 if (m_sec_ctx) { 1784 spidx.sec_ctx.ctx_doi = m_sec_ctx->sadb_x_ctx_doi; 1785 spidx.sec_ctx.ctx_alg = m_sec_ctx->sadb_x_ctx_alg; 1786 spidx.sec_ctx.ctx_strlen = m_sec_ctx->sadb_x_ctx_len; 1787 memcpy(spidx.sec_ctx.ctx_str, 1788 ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx)), 1789 spidx.sec_ctx.ctx_strlen); 1790 } 1791 #endif /* HAVE_SECCTX */ 1792 1793 sp_in = getsp(&spidx); 1794 if (sp_in) { 1795 plog(LLV_DEBUG, LOCATION, NULL, 1796 "suitable inbound SP found: %s.\n", 1797 spidx2str(&sp_in->spidx)); 1798 } else { 1799 plog(LLV_NOTIFY, LOCATION, NULL, 1800 "no in-bound policy found: %s\n", 1801 spidx2str(&spidx)); 1802 } 1803 } 1804 1805 memset(iph2, 0, MAXNESTEDSA); 1806 1807 n = 0; 1808 1809 /* allocate a phase 2 */ 1810 iph2[n] = newph2(); 1811 if (iph2[n] == NULL) { 1812 plog(LLV_ERROR, LOCATION, NULL, 1813 "failed to allocate phase2 entry.\n"); 1814 return -1; 1815 } 1816 iph2[n]->side = INITIATOR; 1817 iph2[n]->spid = xpl->sadb_x_policy_id; 1818 iph2[n]->satype = msg->sadb_msg_satype; 1819 iph2[n]->seq = msg->sadb_msg_seq; 1820 iph2[n]->status = PHASE2ST_STATUS2; 1821 1822 /* set end addresses of SA */ 1823 iph2[n]->dst = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST])); 1824 if (iph2[n]->dst == NULL) { 1825 delph2(iph2[n]); 1826 return -1; 1827 } 1828 iph2[n]->src = dupsaddr(PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC])); 1829 if (iph2[n]->src == NULL) { 1830 delph2(iph2[n]); 1831 return -1; 1832 } 1833 1834 plog(LLV_DEBUG, LOCATION, NULL, 1835 "new acquire %s\n", spidx2str(&sp_out->spidx)); 1836 1837 /* get sainfo */ 1838 { 1839 vchar_t *idsrc, *iddst; 1840 1841 idsrc = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.src, 1842 sp_out->spidx.prefs, sp_out->spidx.ul_proto); 1843 if (idsrc == NULL) { 1844 plog(LLV_ERROR, LOCATION, NULL, 1845 "failed to get ID for %s\n", 1846 spidx2str(&sp_out->spidx)); 1847 delph2(iph2[n]); 1848 return -1; 1849 } 1850 iddst = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.dst, 1851 sp_out->spidx.prefd, sp_out->spidx.ul_proto); 1852 if (iddst == NULL) { 1853 plog(LLV_ERROR, LOCATION, NULL, 1854 "failed to get ID for %s\n", 1855 spidx2str(&sp_out->spidx)); 1856 vfree(idsrc); 1857 delph2(iph2[n]); 1858 return -1; 1859 } 1860 { 1861 struct remoteconf *conf; 1862 conf = getrmconf(iph2[n]->dst); 1863 if (conf != NULL) 1864 remoteid=conf->ph1id; 1865 else{ 1866 plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n"); 1867 remoteid=0; 1868 } 1869 } 1870 iph2[n]->sainfo = getsainfo(idsrc, iddst, NULL, remoteid); 1871 vfree(idsrc); 1872 vfree(iddst); 1873 if (iph2[n]->sainfo == NULL) { 1874 plog(LLV_ERROR, LOCATION, NULL, 1875 "failed to get sainfo.\n"); 1876 delph2(iph2[n]); 1877 return -1; 1878 /* XXX should use the algorithm list from register message */ 1879 } 1880 1881 plog(LLV_DEBUG, LOCATION, NULL, 1882 "selected sainfo: %s\n", sainfo2str(iph2[n]->sainfo)); 1883 } 1884 1885 if (set_proposal_from_policy(iph2[n], sp_out, sp_in) < 0) { 1886 plog(LLV_ERROR, LOCATION, NULL, 1887 "failed to create saprop.\n"); 1888 delph2(iph2[n]); 1889 return -1; 1890 } 1891 #ifdef HAVE_SECCTX 1892 if (m_sec_ctx) { 1893 set_secctx_in_proposal(iph2[n], spidx); 1894 } 1895 #endif /* HAVE_SECCTX */ 1896 1897 insph2(iph2[n]); 1898 1899 /* start isakmp initiation by using ident exchange */ 1900 /* XXX should be looped if there are multiple phase 2 handler. */ 1901 if (isakmp_post_acquire(iph2[n]) < 0) { 1902 plog(LLV_ERROR, LOCATION, NULL, 1903 "failed to begin ipsec sa negotication.\n"); 1904 goto err; 1905 } 1906 1907 return 0; 1908 1909 err: 1910 while (n >= 0) { 1911 unbindph12(iph2[n]); 1912 remph2(iph2[n]); 1913 delph2(iph2[n]); 1914 iph2[n] = NULL; 1915 n--; 1916 } 1917 return -1; 1918 } 1919 1920 static int 1921 pk_recvdelete(mhp) 1922 caddr_t *mhp; 1923 { 1924 struct sadb_msg *msg; 1925 struct sadb_sa *sa; 1926 struct sockaddr *src, *dst; 1927 struct ph2handle *iph2 = NULL; 1928 u_int proto_id; 1929 1930 /* ignore this message because of local test mode. */ 1931 if (f_local) 1932 return 0; 1933 1934 /* sanity check */ 1935 if (mhp[0] == NULL 1936 || mhp[SADB_EXT_SA] == NULL 1937 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1938 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 1939 plog(LLV_ERROR, LOCATION, NULL, 1940 "inappropriate sadb delete message passed.\n"); 1941 return -1; 1942 } 1943 msg = (struct sadb_msg *)mhp[0]; 1944 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1945 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1946 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1947 1948 /* the message has to be processed or not ? */ 1949 if (msg->sadb_msg_pid == getpid()) { 1950 plog(LLV_DEBUG, LOCATION, NULL, 1951 "%s message is not interesting " 1952 "because the message was originated by me.\n", 1953 s_pfkey_type(msg->sadb_msg_type)); 1954 return -1; 1955 } 1956 1957 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1958 if (proto_id == ~0) { 1959 plog(LLV_ERROR, LOCATION, NULL, 1960 "invalid proto_id %d\n", msg->sadb_msg_satype); 1961 return -1; 1962 } 1963 1964 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi); 1965 if (iph2 == NULL) { 1966 /* ignore */ 1967 plog(LLV_ERROR, LOCATION, NULL, 1968 "no iph2 found: %s\n", 1969 sadbsecas2str(src, dst, msg->sadb_msg_satype, 1970 sa->sadb_sa_spi, IPSEC_MODE_ANY)); 1971 return 0; 1972 } 1973 1974 plog(LLV_ERROR, LOCATION, NULL, 1975 "pfkey DELETE received: %s\n", 1976 sadbsecas2str(iph2->src, iph2->dst, 1977 msg->sadb_msg_satype, sa->sadb_sa_spi, IPSEC_MODE_ANY)); 1978 1979 /* send delete information */ 1980 if (iph2->status == PHASE2ST_ESTABLISHED) 1981 isakmp_info_send_d2(iph2); 1982 1983 unbindph12(iph2); 1984 remph2(iph2); 1985 delph2(iph2); 1986 1987 return 0; 1988 } 1989 1990 static int 1991 pk_recvflush(mhp) 1992 caddr_t *mhp; 1993 { 1994 /* ignore this message because of local test mode. */ 1995 if (f_local) 1996 return 0; 1997 1998 /* sanity check */ 1999 if (mhp[0] == NULL) { 2000 plog(LLV_ERROR, LOCATION, NULL, 2001 "inappropriate sadb flush message passed.\n"); 2002 return -1; 2003 } 2004 2005 flushph2(); 2006 2007 return 0; 2008 } 2009 2010 static int 2011 getsadbpolicy(policy0, policylen0, type, iph2) 2012 caddr_t *policy0; 2013 int *policylen0, type; 2014 struct ph2handle *iph2; 2015 { 2016 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2017 struct sadb_x_policy *xpl; 2018 struct sadb_x_ipsecrequest *xisr; 2019 struct saproto *pr; 2020 struct saproto **pr_rlist; 2021 int rlist_len = 0; 2022 caddr_t policy, p; 2023 int policylen; 2024 int xisrlen; 2025 u_int satype, mode; 2026 int len = 0; 2027 #ifdef HAVE_SECCTX 2028 int ctxlen = 0; 2029 #endif /* HAVE_SECCTX */ 2030 2031 2032 /* get policy buffer size */ 2033 policylen = sizeof(struct sadb_x_policy); 2034 if (type != SADB_X_SPDDELETE) { 2035 for (pr = iph2->approval->head; pr; pr = pr->next) { 2036 xisrlen = sizeof(*xisr); 2037 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) { 2038 xisrlen += (sysdep_sa_len(iph2->src) 2039 + sysdep_sa_len(iph2->dst)); 2040 } 2041 2042 policylen += PFKEY_ALIGN8(xisrlen); 2043 } 2044 } 2045 2046 #ifdef HAVE_SECCTX 2047 if (*spidx->sec_ctx.ctx_str) { 2048 ctxlen = sizeof(struct sadb_x_sec_ctx) 2049 + PFKEY_ALIGN8(spidx->sec_ctx.ctx_strlen); 2050 policylen += ctxlen; 2051 } 2052 #endif /* HAVE_SECCTX */ 2053 2054 /* make policy structure */ 2055 policy = racoon_malloc(policylen); 2056 memset((void*)policy, 0xcd, policylen); 2057 if (!policy) { 2058 plog(LLV_ERROR, LOCATION, NULL, 2059 "buffer allocation failed.\n"); 2060 return -1; 2061 } 2062 2063 xpl = (struct sadb_x_policy *)policy; 2064 xpl->sadb_x_policy_len = PFKEY_UNIT64(policylen); 2065 xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 2066 xpl->sadb_x_policy_type = IPSEC_POLICY_IPSEC; 2067 xpl->sadb_x_policy_dir = spidx->dir; 2068 xpl->sadb_x_policy_id = 0; 2069 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2070 xpl->sadb_x_policy_priority = PRIORITY_DEFAULT; 2071 #endif 2072 len++; 2073 2074 #ifdef HAVE_SECCTX 2075 if (*spidx->sec_ctx.ctx_str) { 2076 struct sadb_x_sec_ctx *p; 2077 2078 p = (struct sadb_x_sec_ctx *)(xpl + len); 2079 memset(p, 0, ctxlen); 2080 p->sadb_x_sec_len = PFKEY_UNIT64(ctxlen); 2081 p->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX; 2082 p->sadb_x_ctx_len = spidx->sec_ctx.ctx_strlen; 2083 p->sadb_x_ctx_doi = spidx->sec_ctx.ctx_doi; 2084 p->sadb_x_ctx_alg = spidx->sec_ctx.ctx_alg; 2085 2086 memcpy(p + 1,spidx->sec_ctx.ctx_str,spidx->sec_ctx.ctx_strlen); 2087 len += ctxlen; 2088 } 2089 #endif /* HAVE_SECCTX */ 2090 2091 /* no need to append policy information any more if type is SPDDELETE */ 2092 if (type == SADB_X_SPDDELETE) 2093 goto end; 2094 2095 xisr = (struct sadb_x_ipsecrequest *)(xpl + len); 2096 2097 /* The order of things is reversed for use in add policy messages */ 2098 for (pr = iph2->approval->head; pr; pr = pr->next) rlist_len++; 2099 pr_rlist = racoon_malloc((rlist_len+1)*sizeof(struct saproto*)); 2100 if (!pr_rlist) { 2101 plog(LLV_ERROR, LOCATION, NULL, 2102 "buffer allocation failed.\n"); 2103 return -1; 2104 } 2105 pr_rlist[rlist_len--] = NULL; 2106 for (pr = iph2->approval->head; pr; pr = pr->next) pr_rlist[rlist_len--] = pr; 2107 rlist_len = 0; 2108 2109 for (pr = pr_rlist[rlist_len++]; pr; pr = pr_rlist[rlist_len++]) { 2110 2111 satype = doi2ipproto(pr->proto_id); 2112 if (satype == ~0) { 2113 plog(LLV_ERROR, LOCATION, NULL, 2114 "invalid proto_id %d\n", pr->proto_id); 2115 goto err; 2116 } 2117 mode = ipsecdoi2pfkey_mode(pr->encmode); 2118 if (mode == ~0) { 2119 plog(LLV_ERROR, LOCATION, NULL, 2120 "invalid encmode %d\n", pr->encmode); 2121 goto err; 2122 } 2123 2124 /* 2125 * the policy level cannot be unique because the policy 2126 * is defined later than SA, so req_id cannot be bound to SA. 2127 */ 2128 xisr->sadb_x_ipsecrequest_proto = satype; 2129 xisr->sadb_x_ipsecrequest_mode = mode; 2130 if(iph2->proposal->head->reqid_in > 0){ 2131 xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE; 2132 xisr->sadb_x_ipsecrequest_reqid = iph2->proposal->head->reqid_in; 2133 }else{ 2134 xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE; 2135 xisr->sadb_x_ipsecrequest_reqid = 0; 2136 } 2137 p = (caddr_t)(xisr + 1); 2138 2139 xisrlen = sizeof(*xisr); 2140 2141 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) { 2142 int src_len, dst_len; 2143 2144 src_len = sysdep_sa_len(iph2->src); 2145 dst_len = sysdep_sa_len(iph2->dst); 2146 xisrlen += src_len + dst_len; 2147 2148 memcpy(p, iph2->src, src_len); 2149 p += src_len; 2150 2151 memcpy(p, iph2->dst, dst_len); 2152 p += dst_len; 2153 } 2154 2155 xisr->sadb_x_ipsecrequest_len = PFKEY_ALIGN8(xisrlen); 2156 xisr = (struct sadb_x_ipsecrequest *)p; 2157 2158 } 2159 racoon_free(pr_rlist); 2160 2161 end: 2162 *policy0 = policy; 2163 *policylen0 = policylen; 2164 2165 return 0; 2166 2167 err: 2168 if (policy) 2169 racoon_free(policy); 2170 if (pr_rlist) racoon_free(pr_rlist); 2171 2172 return -1; 2173 } 2174 2175 int 2176 pk_sendspdupdate2(iph2) 2177 struct ph2handle *iph2; 2178 { 2179 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2180 caddr_t policy = NULL; 2181 int policylen = 0; 2182 u_int64_t ltime, vtime; 2183 2184 ltime = iph2->approval->lifetime; 2185 vtime = 0; 2186 2187 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDUPDATE, iph2)) { 2188 plog(LLV_ERROR, LOCATION, NULL, 2189 "getting sadb policy failed.\n"); 2190 return -1; 2191 } 2192 2193 if (pfkey_send_spdupdate2( 2194 lcconf->sock_pfkey, 2195 (struct sockaddr *)&spidx->src, 2196 spidx->prefs, 2197 (struct sockaddr *)&spidx->dst, 2198 spidx->prefd, 2199 spidx->ul_proto, 2200 ltime, vtime, 2201 policy, policylen, 0) < 0) { 2202 plog(LLV_ERROR, LOCATION, NULL, 2203 "libipsec failed send spdupdate2 (%s)\n", 2204 ipsec_strerror()); 2205 goto end; 2206 } 2207 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdupdate2\n"); 2208 2209 end: 2210 if (policy) 2211 racoon_free(policy); 2212 2213 return 0; 2214 } 2215 2216 static int 2217 pk_recvspdupdate(mhp) 2218 caddr_t *mhp; 2219 { 2220 struct sadb_address *saddr, *daddr; 2221 struct sadb_x_policy *xpl; 2222 struct sadb_lifetime *lt; 2223 struct policyindex spidx; 2224 struct secpolicy *sp; 2225 u_int64_t created; 2226 2227 /* sanity check */ 2228 if (mhp[0] == NULL 2229 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2230 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2231 || mhp[SADB_X_EXT_POLICY] == NULL) { 2232 plog(LLV_ERROR, LOCATION, NULL, 2233 "inappropriate sadb spdupdate message passed.\n"); 2234 return -1; 2235 } 2236 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2237 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2238 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2239 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2240 if(lt != NULL) 2241 created = lt->sadb_lifetime_addtime; 2242 else 2243 created = 0; 2244 2245 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2246 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2247 saddr + 1, 2248 daddr + 1, 2249 saddr->sadb_address_prefixlen, 2250 daddr->sadb_address_prefixlen, 2251 saddr->sadb_address_proto, 2252 xpl->sadb_x_policy_priority, 2253 created, 2254 &spidx); 2255 #else 2256 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2257 saddr + 1, 2258 daddr + 1, 2259 saddr->sadb_address_prefixlen, 2260 daddr->sadb_address_prefixlen, 2261 saddr->sadb_address_proto, 2262 created, 2263 &spidx); 2264 #endif 2265 2266 #ifdef HAVE_SECCTX 2267 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2268 struct sadb_x_sec_ctx *ctx; 2269 2270 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2271 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2272 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2273 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2274 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2275 } 2276 #endif /* HAVE_SECCTX */ 2277 2278 sp = getsp(&spidx); 2279 if (sp == NULL) { 2280 plog(LLV_ERROR, LOCATION, NULL, 2281 "such policy does not already exist: \"%s\"\n", 2282 spidx2str(&spidx)); 2283 } else { 2284 remsp(sp); 2285 delsp(sp); 2286 } 2287 2288 if (addnewsp(mhp) < 0) 2289 return -1; 2290 2291 return 0; 2292 } 2293 2294 /* 2295 * this function has to be used by responder side. 2296 */ 2297 int 2298 pk_sendspdadd2(iph2) 2299 struct ph2handle *iph2; 2300 { 2301 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2302 caddr_t policy = NULL; 2303 int policylen = 0; 2304 u_int64_t ltime, vtime; 2305 2306 ltime = iph2->approval->lifetime; 2307 vtime = 0; 2308 2309 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDADD, iph2)) { 2310 plog(LLV_ERROR, LOCATION, NULL, 2311 "getting sadb policy failed.\n"); 2312 return -1; 2313 } 2314 2315 if (pfkey_send_spdadd2( 2316 lcconf->sock_pfkey, 2317 (struct sockaddr *)&spidx->src, 2318 spidx->prefs, 2319 (struct sockaddr *)&spidx->dst, 2320 spidx->prefd, 2321 spidx->ul_proto, 2322 ltime, vtime, 2323 policy, policylen, 0) < 0) { 2324 plog(LLV_ERROR, LOCATION, NULL, 2325 "libipsec failed send spdadd2 (%s)\n", 2326 ipsec_strerror()); 2327 goto end; 2328 } 2329 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdadd2\n"); 2330 2331 end: 2332 if (policy) 2333 racoon_free(policy); 2334 2335 return 0; 2336 } 2337 2338 static int 2339 pk_recvspdadd(mhp) 2340 caddr_t *mhp; 2341 { 2342 struct sadb_address *saddr, *daddr; 2343 struct sadb_x_policy *xpl; 2344 struct sadb_lifetime *lt; 2345 struct policyindex spidx; 2346 struct secpolicy *sp; 2347 u_int64_t created; 2348 2349 /* sanity check */ 2350 if (mhp[0] == NULL 2351 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2352 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2353 || mhp[SADB_X_EXT_POLICY] == NULL) { 2354 plog(LLV_ERROR, LOCATION, NULL, 2355 "inappropriate sadb spdadd message passed.\n"); 2356 return -1; 2357 } 2358 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2359 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2360 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2361 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2362 if(lt != NULL) 2363 created = lt->sadb_lifetime_addtime; 2364 else 2365 created = 0; 2366 2367 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2368 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2369 saddr + 1, 2370 daddr + 1, 2371 saddr->sadb_address_prefixlen, 2372 daddr->sadb_address_prefixlen, 2373 saddr->sadb_address_proto, 2374 xpl->sadb_x_policy_priority, 2375 created, 2376 &spidx); 2377 #else 2378 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2379 saddr + 1, 2380 daddr + 1, 2381 saddr->sadb_address_prefixlen, 2382 daddr->sadb_address_prefixlen, 2383 saddr->sadb_address_proto, 2384 created, 2385 &spidx); 2386 #endif 2387 2388 #ifdef HAVE_SECCTX 2389 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2390 struct sadb_x_sec_ctx *ctx; 2391 2392 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2393 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2394 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2395 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2396 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2397 } 2398 #endif /* HAVE_SECCTX */ 2399 2400 sp = getsp(&spidx); 2401 if (sp != NULL) { 2402 plog(LLV_ERROR, LOCATION, NULL, 2403 "such policy already exists. " 2404 "anyway replace it: %s\n", 2405 spidx2str(&spidx)); 2406 remsp(sp); 2407 delsp(sp); 2408 } 2409 2410 if (addnewsp(mhp) < 0) 2411 return -1; 2412 2413 return 0; 2414 } 2415 2416 /* 2417 * this function has to be used by responder side. 2418 */ 2419 int 2420 pk_sendspddelete(iph2) 2421 struct ph2handle *iph2; 2422 { 2423 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2424 caddr_t policy = NULL; 2425 int policylen; 2426 2427 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDDELETE, iph2)) { 2428 plog(LLV_ERROR, LOCATION, NULL, 2429 "getting sadb policy failed.\n"); 2430 return -1; 2431 } 2432 2433 if (pfkey_send_spddelete( 2434 lcconf->sock_pfkey, 2435 (struct sockaddr *)&spidx->src, 2436 spidx->prefs, 2437 (struct sockaddr *)&spidx->dst, 2438 spidx->prefd, 2439 spidx->ul_proto, 2440 policy, policylen, 0) < 0) { 2441 plog(LLV_ERROR, LOCATION, NULL, 2442 "libipsec failed send spddelete (%s)\n", 2443 ipsec_strerror()); 2444 goto end; 2445 } 2446 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spddelete\n"); 2447 2448 end: 2449 if (policy) 2450 racoon_free(policy); 2451 2452 return 0; 2453 } 2454 2455 static int 2456 pk_recvspddelete(mhp) 2457 caddr_t *mhp; 2458 { 2459 struct sadb_address *saddr, *daddr; 2460 struct sadb_x_policy *xpl; 2461 struct sadb_lifetime *lt; 2462 struct policyindex spidx; 2463 struct secpolicy *sp; 2464 u_int64_t created; 2465 2466 /* sanity check */ 2467 if (mhp[0] == NULL 2468 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2469 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2470 || mhp[SADB_X_EXT_POLICY] == NULL) { 2471 plog(LLV_ERROR, LOCATION, NULL, 2472 "inappropriate sadb spddelete message passed.\n"); 2473 return -1; 2474 } 2475 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2476 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2477 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2478 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2479 if(lt != NULL) 2480 created = lt->sadb_lifetime_addtime; 2481 else 2482 created = 0; 2483 2484 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2485 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2486 saddr + 1, 2487 daddr + 1, 2488 saddr->sadb_address_prefixlen, 2489 daddr->sadb_address_prefixlen, 2490 saddr->sadb_address_proto, 2491 xpl->sadb_x_policy_priority, 2492 created, 2493 &spidx); 2494 #else 2495 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2496 saddr + 1, 2497 daddr + 1, 2498 saddr->sadb_address_prefixlen, 2499 daddr->sadb_address_prefixlen, 2500 saddr->sadb_address_proto, 2501 created, 2502 &spidx); 2503 #endif 2504 2505 #ifdef HAVE_SECCTX 2506 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2507 struct sadb_x_sec_ctx *ctx; 2508 2509 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2510 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2511 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2512 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2513 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2514 } 2515 #endif /* HAVE_SECCTX */ 2516 2517 sp = getsp(&spidx); 2518 if (sp == NULL) { 2519 plog(LLV_ERROR, LOCATION, NULL, 2520 "no policy found: %s\n", 2521 spidx2str(&spidx)); 2522 return -1; 2523 } 2524 2525 remsp(sp); 2526 delsp(sp); 2527 2528 return 0; 2529 } 2530 2531 static int 2532 pk_recvspdexpire(mhp) 2533 caddr_t *mhp; 2534 { 2535 struct sadb_address *saddr, *daddr; 2536 struct sadb_x_policy *xpl; 2537 struct sadb_lifetime *lt; 2538 struct policyindex spidx; 2539 struct secpolicy *sp; 2540 u_int64_t created; 2541 2542 /* sanity check */ 2543 if (mhp[0] == NULL 2544 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2545 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2546 || mhp[SADB_X_EXT_POLICY] == NULL) { 2547 plog(LLV_ERROR, LOCATION, NULL, 2548 "inappropriate sadb spdexpire message passed.\n"); 2549 return -1; 2550 } 2551 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2552 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2553 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2554 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2555 if(lt != NULL) 2556 created = lt->sadb_lifetime_addtime; 2557 else 2558 created = 0; 2559 2560 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2561 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2562 saddr + 1, 2563 daddr + 1, 2564 saddr->sadb_address_prefixlen, 2565 daddr->sadb_address_prefixlen, 2566 saddr->sadb_address_proto, 2567 xpl->sadb_x_policy_priority, 2568 created, 2569 &spidx); 2570 #else 2571 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2572 saddr + 1, 2573 daddr + 1, 2574 saddr->sadb_address_prefixlen, 2575 daddr->sadb_address_prefixlen, 2576 saddr->sadb_address_proto, 2577 created, 2578 &spidx); 2579 #endif 2580 2581 #ifdef HAVE_SECCTX 2582 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2583 struct sadb_x_sec_ctx *ctx; 2584 2585 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2586 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2587 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2588 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2589 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2590 } 2591 #endif /* HAVE_SECCTX */ 2592 2593 sp = getsp(&spidx); 2594 if (sp == NULL) { 2595 plog(LLV_ERROR, LOCATION, NULL, 2596 "no policy found: %s\n", 2597 spidx2str(&spidx)); 2598 return -1; 2599 } 2600 2601 remsp(sp); 2602 delsp(sp); 2603 2604 return 0; 2605 } 2606 2607 static int 2608 pk_recvspdget(mhp) 2609 caddr_t *mhp; 2610 { 2611 /* sanity check */ 2612 if (mhp[0] == NULL) { 2613 plog(LLV_ERROR, LOCATION, NULL, 2614 "inappropriate sadb spdget message passed.\n"); 2615 return -1; 2616 } 2617 2618 return 0; 2619 } 2620 2621 static int 2622 pk_recvspddump(mhp) 2623 caddr_t *mhp; 2624 { 2625 struct sadb_msg *msg; 2626 struct sadb_address *saddr, *daddr; 2627 struct sadb_x_policy *xpl; 2628 struct sadb_lifetime *lt; 2629 struct policyindex spidx; 2630 struct secpolicy *sp; 2631 u_int64_t created; 2632 2633 /* sanity check */ 2634 if (mhp[0] == NULL) { 2635 plog(LLV_ERROR, LOCATION, NULL, 2636 "inappropriate sadb spddump message passed.\n"); 2637 return -1; 2638 } 2639 msg = (struct sadb_msg *)mhp[0]; 2640 2641 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2642 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2643 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2644 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2645 if(lt != NULL) 2646 created = lt->sadb_lifetime_addtime; 2647 else 2648 created = 0; 2649 2650 if (saddr == NULL || daddr == NULL || xpl == NULL) { 2651 plog(LLV_ERROR, LOCATION, NULL, 2652 "inappropriate sadb spddump message passed.\n"); 2653 return -1; 2654 } 2655 2656 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2657 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2658 saddr + 1, 2659 daddr + 1, 2660 saddr->sadb_address_prefixlen, 2661 daddr->sadb_address_prefixlen, 2662 saddr->sadb_address_proto, 2663 xpl->sadb_x_policy_priority, 2664 created, 2665 &spidx); 2666 #else 2667 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2668 saddr + 1, 2669 daddr + 1, 2670 saddr->sadb_address_prefixlen, 2671 daddr->sadb_address_prefixlen, 2672 saddr->sadb_address_proto, 2673 created, 2674 &spidx); 2675 #endif 2676 2677 #ifdef HAVE_SECCTX 2678 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2679 struct sadb_x_sec_ctx *ctx; 2680 2681 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2682 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2683 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2684 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2685 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2686 } 2687 #endif /* HAVE_SECCTX */ 2688 2689 sp = getsp(&spidx); 2690 if (sp != NULL) { 2691 plog(LLV_ERROR, LOCATION, NULL, 2692 "such policy already exists. " 2693 "anyway replace it: %s\n", 2694 spidx2str(&spidx)); 2695 remsp(sp); 2696 delsp(sp); 2697 } 2698 2699 if (addnewsp(mhp) < 0) 2700 return -1; 2701 2702 return 0; 2703 } 2704 2705 static int 2706 pk_recvspdflush(mhp) 2707 caddr_t *mhp; 2708 { 2709 /* sanity check */ 2710 if (mhp[0] == NULL) { 2711 plog(LLV_ERROR, LOCATION, NULL, 2712 "inappropriate sadb spdflush message passed.\n"); 2713 return -1; 2714 } 2715 2716 flushsp(); 2717 2718 return 0; 2719 } 2720 2721 #ifndef ANDROID_PATCHED 2722 2723 /* 2724 * send error against acquire message to kenrel. 2725 */ 2726 int 2727 pk_sendeacquire(iph2) 2728 struct ph2handle *iph2; 2729 { 2730 struct sadb_msg *newmsg; 2731 int len; 2732 2733 len = sizeof(struct sadb_msg); 2734 newmsg = racoon_calloc(1, len); 2735 if (newmsg == NULL) { 2736 plog(LLV_ERROR, LOCATION, NULL, 2737 "failed to get buffer to send acquire.\n"); 2738 return -1; 2739 } 2740 2741 memset(newmsg, 0, len); 2742 newmsg->sadb_msg_version = PF_KEY_V2; 2743 newmsg->sadb_msg_type = SADB_ACQUIRE; 2744 newmsg->sadb_msg_errno = ENOENT; /* XXX */ 2745 newmsg->sadb_msg_satype = iph2->satype; 2746 newmsg->sadb_msg_len = PFKEY_UNIT64(len); 2747 newmsg->sadb_msg_reserved = 0; 2748 newmsg->sadb_msg_seq = iph2->seq; 2749 newmsg->sadb_msg_pid = (u_int32_t)getpid(); 2750 2751 /* send message */ 2752 len = pfkey_send(lcconf->sock_pfkey, newmsg, len); 2753 2754 racoon_free(newmsg); 2755 2756 return 0; 2757 } 2758 2759 #else 2760 2761 int pk_sendeacquire(struct ph2handle *iph2) 2762 { 2763 exit(1); 2764 } 2765 2766 #endif 2767 2768 /* 2769 * check if the algorithm is supported or not. 2770 * OUT 0: ok 2771 * -1: ng 2772 */ 2773 int 2774 pk_checkalg(class, calg, keylen) 2775 int class, calg, keylen; 2776 { 2777 int sup, error; 2778 u_int alg; 2779 struct sadb_alg alg0; 2780 2781 switch (algclass2doi(class)) { 2782 case IPSECDOI_PROTO_IPSEC_ESP: 2783 sup = SADB_EXT_SUPPORTED_ENCRYPT; 2784 break; 2785 case IPSECDOI_ATTR_AUTH: 2786 sup = SADB_EXT_SUPPORTED_AUTH; 2787 break; 2788 case IPSECDOI_PROTO_IPCOMP: 2789 plog(LLV_DEBUG, LOCATION, NULL, 2790 "compression algorithm can not be checked " 2791 "because sadb message doesn't support it.\n"); 2792 return 0; 2793 default: 2794 plog(LLV_ERROR, LOCATION, NULL, 2795 "invalid algorithm class.\n"); 2796 return -1; 2797 } 2798 alg = ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg)); 2799 if (alg == ~0) 2800 return -1; 2801 2802 if (keylen == 0) { 2803 if (ipsec_get_keylen(sup, alg, &alg0)) { 2804 plog(LLV_ERROR, LOCATION, NULL, 2805 "%s.\n", ipsec_strerror()); 2806 return -1; 2807 } 2808 keylen = alg0.sadb_alg_minbits; 2809 } 2810 2811 error = ipsec_check_keylen(sup, alg, keylen); 2812 if (error) 2813 plog(LLV_ERROR, LOCATION, NULL, 2814 "%s.\n", ipsec_strerror()); 2815 2816 return error; 2817 } 2818 2819 /* 2820 * differences with pfkey_recv() in libipsec/pfkey.c: 2821 * - never performs busy wait loop. 2822 * - returns NULL and set *lenp to negative on fatal failures 2823 * - returns NULL and set *lenp to non-negative on non-fatal failures 2824 * - returns non-NULL on success 2825 */ 2826 static struct sadb_msg * 2827 pk_recv(so, lenp) 2828 int so; 2829 int *lenp; 2830 { 2831 struct sadb_msg buf, *newmsg; 2832 int reallen; 2833 int retry = 0; 2834 2835 *lenp = -1; 2836 do 2837 { 2838 plog(LLV_DEBUG, LOCATION, NULL, "pk_recv: retry[%d] recv() \n", retry ); 2839 *lenp = recv(so, (caddr_t)&buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT); 2840 retry++; 2841 } 2842 while (*lenp < 0 && errno == EAGAIN && retry < 3); 2843 2844 if (*lenp < 0) 2845 return NULL; /*fatal*/ 2846 2847 else if (*lenp < sizeof(buf)) 2848 return NULL; 2849 2850 reallen = PFKEY_UNUNIT64(buf.sadb_msg_len); 2851 if ((newmsg = racoon_calloc(1, reallen)) == NULL) 2852 return NULL; 2853 2854 *lenp = recv(so, (caddr_t)newmsg, reallen, MSG_PEEK); 2855 if (*lenp < 0) { 2856 racoon_free(newmsg); 2857 return NULL; /*fatal*/ 2858 } else if (*lenp != reallen) { 2859 racoon_free(newmsg); 2860 return NULL; 2861 } 2862 2863 *lenp = recv(so, (caddr_t)newmsg, reallen, 0); 2864 if (*lenp < 0) { 2865 racoon_free(newmsg); 2866 return NULL; /*fatal*/ 2867 } else if (*lenp != reallen) { 2868 racoon_free(newmsg); 2869 return NULL; 2870 } 2871 2872 return newmsg; 2873 } 2874 2875 /* see handler.h */ 2876 u_int32_t 2877 pk_getseq() 2878 { 2879 return eay_random(); 2880 } 2881 2882 static int 2883 addnewsp(mhp) 2884 caddr_t *mhp; 2885 { 2886 struct secpolicy *new = NULL; 2887 struct sadb_address *saddr, *daddr; 2888 struct sadb_x_policy *xpl; 2889 struct sadb_lifetime *lt; 2890 u_int64_t created; 2891 2892 /* sanity check */ 2893 if (mhp[SADB_EXT_ADDRESS_SRC] == NULL 2894 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2895 || mhp[SADB_X_EXT_POLICY] == NULL) { 2896 plog(LLV_ERROR, LOCATION, NULL, 2897 "inappropriate sadb spd management message passed.\n"); 2898 goto bad; 2899 } 2900 2901 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2902 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2903 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2904 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2905 if(lt != NULL) 2906 created = lt->sadb_lifetime_addtime; 2907 else 2908 created = 0; 2909 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2910 if(lt != NULL) 2911 created = lt->sadb_lifetime_addtime; 2912 else 2913 created = 0; 2914 2915 #ifdef __linux__ 2916 /* bsd skips over per-socket policies because there will be no 2917 * src and dst extensions in spddump messages. On Linux the only 2918 * way to achieve the same is check for policy id. 2919 */ 2920 if (xpl->sadb_x_policy_id % 8 >= 3) return 0; 2921 #endif 2922 2923 new = newsp(); 2924 if (new == NULL) { 2925 plog(LLV_ERROR, LOCATION, NULL, 2926 "failed to allocate buffer\n"); 2927 goto bad; 2928 } 2929 2930 new->spidx.dir = xpl->sadb_x_policy_dir; 2931 new->id = xpl->sadb_x_policy_id; 2932 new->policy = xpl->sadb_x_policy_type; 2933 new->req = NULL; 2934 2935 /* check policy */ 2936 switch (xpl->sadb_x_policy_type) { 2937 case IPSEC_POLICY_DISCARD: 2938 case IPSEC_POLICY_NONE: 2939 case IPSEC_POLICY_ENTRUST: 2940 case IPSEC_POLICY_BYPASS: 2941 break; 2942 2943 case IPSEC_POLICY_IPSEC: 2944 { 2945 int tlen; 2946 struct sadb_x_ipsecrequest *xisr; 2947 struct ipsecrequest **p_isr = &new->req; 2948 2949 /* validity check */ 2950 if (PFKEY_EXTLEN(xpl) < sizeof(*xpl)) { 2951 plog(LLV_ERROR, LOCATION, NULL, 2952 "invalid msg length.\n"); 2953 goto bad; 2954 } 2955 2956 tlen = PFKEY_EXTLEN(xpl) - sizeof(*xpl); 2957 xisr = (struct sadb_x_ipsecrequest *)(xpl + 1); 2958 2959 while (tlen > 0) { 2960 2961 /* length check */ 2962 if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) { 2963 plog(LLV_ERROR, LOCATION, NULL, 2964 "invalid msg length.\n"); 2965 goto bad; 2966 } 2967 2968 /* allocate request buffer */ 2969 *p_isr = newipsecreq(); 2970 if (*p_isr == NULL) { 2971 plog(LLV_ERROR, LOCATION, NULL, 2972 "failed to get new ipsecreq.\n"); 2973 goto bad; 2974 } 2975 2976 /* set values */ 2977 (*p_isr)->next = NULL; 2978 2979 switch (xisr->sadb_x_ipsecrequest_proto) { 2980 case IPPROTO_ESP: 2981 case IPPROTO_AH: 2982 case IPPROTO_IPCOMP: 2983 break; 2984 default: 2985 plog(LLV_ERROR, LOCATION, NULL, 2986 "invalid proto type: %u\n", 2987 xisr->sadb_x_ipsecrequest_proto); 2988 goto bad; 2989 } 2990 (*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto; 2991 2992 switch (xisr->sadb_x_ipsecrequest_mode) { 2993 case IPSEC_MODE_TRANSPORT: 2994 case IPSEC_MODE_TUNNEL: 2995 break; 2996 case IPSEC_MODE_ANY: 2997 default: 2998 plog(LLV_ERROR, LOCATION, NULL, 2999 "invalid mode: %u\n", 3000 xisr->sadb_x_ipsecrequest_mode); 3001 goto bad; 3002 } 3003 (*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode; 3004 3005 switch (xisr->sadb_x_ipsecrequest_level) { 3006 case IPSEC_LEVEL_DEFAULT: 3007 case IPSEC_LEVEL_USE: 3008 case IPSEC_LEVEL_REQUIRE: 3009 break; 3010 case IPSEC_LEVEL_UNIQUE: 3011 (*p_isr)->saidx.reqid = 3012 xisr->sadb_x_ipsecrequest_reqid; 3013 break; 3014 3015 default: 3016 plog(LLV_ERROR, LOCATION, NULL, 3017 "invalid level: %u\n", 3018 xisr->sadb_x_ipsecrequest_level); 3019 goto bad; 3020 } 3021 (*p_isr)->level = xisr->sadb_x_ipsecrequest_level; 3022 3023 /* set IP addresses if there */ 3024 if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) { 3025 struct sockaddr *paddr; 3026 3027 paddr = (struct sockaddr *)(xisr + 1); 3028 bcopy(paddr, &(*p_isr)->saidx.src, 3029 sysdep_sa_len(paddr)); 3030 3031 paddr = (struct sockaddr *)((caddr_t)paddr 3032 + sysdep_sa_len(paddr)); 3033 bcopy(paddr, &(*p_isr)->saidx.dst, 3034 sysdep_sa_len(paddr)); 3035 } 3036 3037 (*p_isr)->sp = new; 3038 3039 /* initialization for the next. */ 3040 p_isr = &(*p_isr)->next; 3041 tlen -= xisr->sadb_x_ipsecrequest_len; 3042 3043 /* validity check */ 3044 if (tlen < 0) { 3045 plog(LLV_ERROR, LOCATION, NULL, 3046 "becoming tlen < 0\n"); 3047 } 3048 3049 xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr 3050 + xisr->sadb_x_ipsecrequest_len); 3051 } 3052 } 3053 break; 3054 default: 3055 plog(LLV_ERROR, LOCATION, NULL, 3056 "invalid policy type.\n"); 3057 goto bad; 3058 } 3059 3060 #ifdef HAVE_PFKEY_POLICY_PRIORITY 3061 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3062 saddr + 1, 3063 daddr + 1, 3064 saddr->sadb_address_prefixlen, 3065 daddr->sadb_address_prefixlen, 3066 saddr->sadb_address_proto, 3067 xpl->sadb_x_policy_priority, 3068 created, 3069 &new->spidx); 3070 #else 3071 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3072 saddr + 1, 3073 daddr + 1, 3074 saddr->sadb_address_prefixlen, 3075 daddr->sadb_address_prefixlen, 3076 saddr->sadb_address_proto, 3077 created, 3078 &new->spidx); 3079 #endif 3080 3081 #ifdef HAVE_SECCTX 3082 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 3083 struct sadb_x_sec_ctx *ctx; 3084 3085 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 3086 new->spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 3087 new->spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 3088 new->spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 3089 memcpy(new->spidx.sec_ctx.ctx_str,ctx + 1,ctx->sadb_x_ctx_len); 3090 } 3091 #endif /* HAVE_SECCTX */ 3092 3093 inssp(new); 3094 3095 return 0; 3096 bad: 3097 if (new != NULL) { 3098 if (new->req != NULL) 3099 racoon_free(new->req); 3100 racoon_free(new); 3101 } 3102 return -1; 3103 } 3104 3105 /* proto/mode/src->dst spi */ 3106 const char * 3107 sadbsecas2str(src, dst, proto, spi, mode) 3108 struct sockaddr *src, *dst; 3109 int proto; 3110 u_int32_t spi; 3111 int mode; 3112 { 3113 static char buf[256]; 3114 u_int doi_proto, doi_mode = 0; 3115 char *p; 3116 int blen, i; 3117 3118 doi_proto = pfkey2ipsecdoi_proto(proto); 3119 if (doi_proto == ~0) 3120 return NULL; 3121 if (mode) { 3122 doi_mode = pfkey2ipsecdoi_mode(mode); 3123 if (doi_mode == ~0) 3124 return NULL; 3125 } 3126 3127 blen = sizeof(buf) - 1; 3128 p = buf; 3129 3130 i = snprintf(p, blen, "%s%s%s ", 3131 s_ipsecdoi_proto(doi_proto), 3132 mode ? "/" : "", 3133 mode ? s_ipsecdoi_encmode(doi_mode) : ""); 3134 if (i < 0 || i >= blen) 3135 return NULL; 3136 p += i; 3137 blen -= i; 3138 3139 i = snprintf(p, blen, "%s->", saddr2str(src)); 3140 if (i < 0 || i >= blen) 3141 return NULL; 3142 p += i; 3143 blen -= i; 3144 3145 i = snprintf(p, blen, "%s ", saddr2str(dst)); 3146 if (i < 0 || i >= blen) 3147 return NULL; 3148 p += i; 3149 blen -= i; 3150 3151 if (spi) { 3152 snprintf(p, blen, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi), 3153 (unsigned long)ntohl(spi)); 3154 } 3155 3156 return buf; 3157 } 3158