1 /* $NetBSD: pfkey.c,v 1.57 2011/03/15 13:20:14 vanhu Exp $ */ 2 3 /* $Id: pfkey.c,v 1.57 2011/03/15 13:20:14 vanhu 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 "session.h" 81 #include "debug.h" 82 83 #include "schedule.h" 84 #include "localconf.h" 85 #include "remoteconf.h" 86 #include "handler.h" 87 #include "policy.h" 88 #include "proposal.h" 89 #include "isakmp_var.h" 90 #include "isakmp.h" 91 #include "isakmp_inf.h" 92 #include "ipsec_doi.h" 93 #include "oakley.h" 94 #include "pfkey.h" 95 #include "algorithm.h" 96 #include "sainfo.h" 97 #include "admin.h" 98 #include "evt.h" 99 #include "privsep.h" 100 #include "strnames.h" 101 #include "backupsa.h" 102 #include "gcmalloc.h" 103 #include "nattraversal.h" 104 #include "crypto_openssl.h" 105 #include "grabmyaddr.h" 106 107 #if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC) 108 #define SADB_X_EALG_AESCBC SADB_X_EALG_RIJNDAELCBC 109 #endif 110 111 /* prototype */ 112 static u_int ipsecdoi2pfkey_aalg __P((u_int)); 113 static u_int ipsecdoi2pfkey_ealg __P((u_int)); 114 static u_int ipsecdoi2pfkey_calg __P((u_int)); 115 static u_int ipsecdoi2pfkey_alg __P((u_int, u_int)); 116 static u_int keylen_aalg __P((u_int)); 117 static u_int keylen_ealg __P((u_int, int)); 118 119 static int pk_recvgetspi __P((caddr_t *)); 120 static int pk_recvupdate __P((caddr_t *)); 121 static int pk_recvadd __P((caddr_t *)); 122 static int pk_recvdelete __P((caddr_t *)); 123 static int pk_recvacquire __P((caddr_t *)); 124 static int pk_recvexpire __P((caddr_t *)); 125 static int pk_recvflush __P((caddr_t *)); 126 static int getsadbpolicy __P((caddr_t *, int *, int, struct ph2handle *)); 127 static int pk_recvspdupdate __P((caddr_t *)); 128 static int pk_recvspdadd __P((caddr_t *)); 129 static int pk_recvspddelete __P((caddr_t *)); 130 static int pk_recvspdexpire __P((caddr_t *)); 131 static int pk_recvspdget __P((caddr_t *)); 132 static int pk_recvspddump __P((caddr_t *)); 133 static int pk_recvspdflush __P((caddr_t *)); 134 #if defined(SADB_X_MIGRATE) && defined(SADB_X_EXT_KMADDRESS) 135 static int pk_recvmigrate __P((caddr_t *)); 136 #endif 137 static struct sadb_msg *pk_recv __P((int, int *)); 138 139 static int (*pkrecvf[]) __P((caddr_t *)) = { 140 NULL, 141 pk_recvgetspi, 142 pk_recvupdate, 143 pk_recvadd, 144 pk_recvdelete, 145 NULL, /* SADB_GET */ 146 pk_recvacquire, 147 NULL, /* SABD_REGISTER */ 148 pk_recvexpire, 149 pk_recvflush, 150 NULL, /* SADB_DUMP */ 151 NULL, /* SADB_X_PROMISC */ 152 NULL, /* SADB_X_PCHANGE */ 153 pk_recvspdupdate, 154 pk_recvspdadd, 155 pk_recvspddelete, 156 pk_recvspdget, 157 NULL, /* SADB_X_SPDACQUIRE */ 158 pk_recvspddump, 159 pk_recvspdflush, 160 NULL, /* SADB_X_SPDSETIDX */ 161 pk_recvspdexpire, 162 NULL, /* SADB_X_SPDDELETE2 */ 163 NULL, /* SADB_X_NAT_T_NEW_MAPPING */ 164 #if defined(SADB_X_MIGRATE) && defined(SADB_X_EXT_KMADDRESS) 165 pk_recvmigrate, 166 #else 167 NULL, /* SADB_X_MIGRATE */ 168 #endif 169 #if (SADB_MAX > 24) 170 #error "SADB extra message?" 171 #endif 172 }; 173 174 static int addnewsp __P((caddr_t *, struct sockaddr *, struct sockaddr *)); 175 176 /* cope with old kame headers - ugly */ 177 #ifndef SADB_X_AALG_MD5 178 #define SADB_X_AALG_MD5 SADB_AALG_MD5 179 #endif 180 #ifndef SADB_X_AALG_SHA 181 #define SADB_X_AALG_SHA SADB_AALG_SHA 182 #endif 183 #ifndef SADB_X_AALG_NULL 184 #define SADB_X_AALG_NULL SADB_AALG_NULL 185 #endif 186 187 #ifndef SADB_X_EALG_BLOWFISHCBC 188 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC 189 #endif 190 #ifndef SADB_X_EALG_CAST128CBC 191 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC 192 #endif 193 #ifndef SADB_X_EALG_RC5CBC 194 #ifdef SADB_EALG_RC5CBC 195 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC 196 #endif 197 #endif 198 199 /* 200 * PF_KEY packet handler 201 * 0: success 202 * -1: fail 203 */ 204 static int 205 pfkey_handler(ctx, fd) 206 void *ctx; 207 int fd; 208 { 209 struct sadb_msg *msg; 210 int len; 211 caddr_t mhp[SADB_EXT_MAX + 1]; 212 int error = -1; 213 214 /* receive pfkey message. */ 215 len = 0; 216 msg = (struct sadb_msg *) pk_recv(fd, &len); 217 if (msg == NULL) { 218 if (len < 0) { 219 /* do not report EAGAIN as error; well get 220 * called from main loop later. and it's normal 221 * when spd dump is received during reload and 222 * this function is called in loop. */ 223 if (errno == EAGAIN) 224 goto end; 225 226 plog(LLV_ERROR, LOCATION, NULL, 227 "failed to recv from pfkey (%s)\n", 228 strerror(errno)); 229 goto end; 230 } else { 231 /* short message - msg not ready */ 232 return 0; 233 } 234 } 235 236 plog(LLV_DEBUG, LOCATION, NULL, "got pfkey %s message\n", 237 s_pfkey_type(msg->sadb_msg_type)); 238 plogdump(LLV_DEBUG2, msg, msg->sadb_msg_len << 3); 239 240 /* validity check */ 241 if (msg->sadb_msg_errno) { 242 int pri; 243 244 /* when SPD is empty, treat the state as no error. */ 245 if (msg->sadb_msg_type == SADB_X_SPDDUMP && 246 msg->sadb_msg_errno == ENOENT) 247 pri = LLV_DEBUG; 248 else 249 pri = LLV_ERROR; 250 251 plog(pri, LOCATION, NULL, 252 "pfkey %s failed: %s\n", 253 s_pfkey_type(msg->sadb_msg_type), 254 strerror(msg->sadb_msg_errno)); 255 256 goto end; 257 } 258 259 /* check pfkey message. */ 260 if (pfkey_align(msg, mhp)) { 261 plog(LLV_ERROR, LOCATION, NULL, 262 "libipsec failed pfkey align (%s)\n", 263 ipsec_strerror()); 264 goto end; 265 } 266 if (pfkey_check(mhp)) { 267 plog(LLV_ERROR, LOCATION, NULL, 268 "libipsec failed pfkey check (%s)\n", 269 ipsec_strerror()); 270 goto end; 271 } 272 msg = (struct sadb_msg *)mhp[0]; 273 274 /* safety check */ 275 if (msg->sadb_msg_type >= ARRAYLEN(pkrecvf)) { 276 plog(LLV_ERROR, LOCATION, NULL, 277 "unknown PF_KEY message type=%u\n", 278 msg->sadb_msg_type); 279 goto end; 280 } 281 282 if (pkrecvf[msg->sadb_msg_type] == NULL) { 283 plog(LLV_INFO, LOCATION, NULL, 284 "unsupported PF_KEY message %s\n", 285 s_pfkey_type(msg->sadb_msg_type)); 286 goto end; 287 } 288 289 if ((pkrecvf[msg->sadb_msg_type])(mhp) < 0) 290 goto end; 291 292 error = 1; 293 end: 294 if (msg) 295 racoon_free(msg); 296 return(error); 297 } 298 299 /* 300 * dump SADB 301 */ 302 vchar_t * 303 pfkey_dump_sadb(satype) 304 int satype; 305 { 306 int s; 307 vchar_t *buf = NULL; 308 pid_t pid = getpid(); 309 struct sadb_msg *msg = NULL; 310 size_t bl, ml; 311 int len; 312 int bufsiz; 313 314 if ((s = privsep_socket(PF_KEY, SOCK_RAW, PF_KEY_V2)) < 0) { 315 plog(LLV_ERROR, LOCATION, NULL, 316 "libipsec failed pfkey open: %s\n", 317 ipsec_strerror()); 318 return NULL; 319 } 320 321 if ((bufsiz = pfkey_set_buffer_size(s, lcconf->pfkey_buffer_size)) < 0) { 322 plog(LLV_ERROR, LOCATION, NULL, 323 "libipsec failed pfkey set buffer size to %d: %s\n", 324 lcconf->pfkey_buffer_size, ipsec_strerror()); 325 return NULL; 326 } else if (bufsiz < lcconf->pfkey_buffer_size) { 327 plog(LLV_WARNING, LOCATION, NULL, 328 "pfkey socket receive buffer set to %dKB, instead of %d\n", 329 bufsiz, lcconf->pfkey_buffer_size); 330 } 331 332 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_dump\n"); 333 if (pfkey_send_dump(s, satype) < 0) { 334 plog(LLV_ERROR, LOCATION, NULL, 335 "libipsec failed dump: %s\n", ipsec_strerror()); 336 goto fail; 337 } 338 339 while (1) { 340 if (msg) 341 racoon_free(msg); 342 msg = pk_recv(s, &len); 343 if (msg == NULL) { 344 if (len < 0) 345 goto done; 346 else 347 continue; 348 } 349 350 if (msg->sadb_msg_type != SADB_DUMP || msg->sadb_msg_pid != pid) 351 { 352 plog(LLV_DEBUG, LOCATION, NULL, 353 "discarding non-sadb dump msg %p, our pid=%i\n", msg, pid); 354 plog(LLV_DEBUG, LOCATION, NULL, 355 "type %i, pid %i\n", msg->sadb_msg_type, msg->sadb_msg_pid); 356 continue; 357 } 358 359 360 ml = msg->sadb_msg_len << 3; 361 bl = buf ? buf->l : 0; 362 buf = vrealloc(buf, bl + ml); 363 if (buf == NULL) { 364 plog(LLV_ERROR, LOCATION, NULL, 365 "failed to reallocate buffer to dump.\n"); 366 goto fail; 367 } 368 memcpy(buf->v + bl, msg, ml); 369 370 if (msg->sadb_msg_seq == 0) 371 break; 372 } 373 goto done; 374 375 fail: 376 if (buf) 377 vfree(buf); 378 buf = NULL; 379 done: 380 if (msg) 381 racoon_free(msg); 382 close(s); 383 return buf; 384 } 385 386 #ifdef ENABLE_ADMINPORT 387 /* 388 * flush SADB 389 */ 390 void 391 pfkey_flush_sadb(proto) 392 u_int proto; 393 { 394 int satype; 395 396 /* convert to SADB_SATYPE */ 397 if ((satype = admin2pfkey_proto(proto)) < 0) 398 return; 399 400 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_flush\n"); 401 if (pfkey_send_flush(lcconf->sock_pfkey, satype) < 0) { 402 plog(LLV_ERROR, LOCATION, NULL, 403 "libipsec failed send flush (%s)\n", ipsec_strerror()); 404 return; 405 } 406 407 return; 408 } 409 #endif 410 411 /* 412 * These are the SATYPEs that we manage. We register to get 413 * PF_KEY messages related to these SATYPEs, and we also use 414 * this list to determine which SATYPEs to delete SAs for when 415 * we receive an INITIAL-CONTACT. 416 */ 417 const struct pfkey_satype pfkey_satypes[] = { 418 { SADB_SATYPE_AH, "AH" }, 419 { SADB_SATYPE_ESP, "ESP" }, 420 { SADB_X_SATYPE_IPCOMP, "IPCOMP" }, 421 }; 422 const int pfkey_nsatypes = 423 sizeof(pfkey_satypes) / sizeof(pfkey_satypes[0]); 424 425 /* 426 * PF_KEY initialization 427 */ 428 int 429 pfkey_init() 430 { 431 int i, reg_fail; 432 int bufsiz; 433 434 if ((lcconf->sock_pfkey = pfkey_open()) < 0) { 435 plog(LLV_ERROR, LOCATION, NULL, 436 "libipsec failed pfkey open (%s)\n", ipsec_strerror()); 437 return -1; 438 } 439 if ((bufsiz = pfkey_set_buffer_size(lcconf->sock_pfkey, 440 lcconf->pfkey_buffer_size)) < 0) { 441 plog(LLV_ERROR, LOCATION, NULL, 442 "libipsec failed to set pfkey buffer size to %d (%s)\n", 443 lcconf->pfkey_buffer_size, ipsec_strerror()); 444 return -1; 445 } else if (bufsiz < lcconf->pfkey_buffer_size) { 446 plog(LLV_WARNING, LOCATION, NULL, 447 "pfkey socket receive buffer set to %dKB, instead of %d\n", 448 bufsiz, lcconf->pfkey_buffer_size); 449 } 450 451 if (fcntl(lcconf->sock_pfkey, F_SETFL, O_NONBLOCK) == -1) 452 plog(LLV_WARNING, LOCATION, NULL, 453 "failed to set the pfkey socket to NONBLOCK\n"); 454 455 for (i = 0, reg_fail = 0; i < pfkey_nsatypes; i++) { 456 plog(LLV_DEBUG, LOCATION, NULL, 457 "call pfkey_send_register for %s\n", 458 pfkey_satypes[i].ps_name); 459 if (pfkey_send_register(lcconf->sock_pfkey, 460 pfkey_satypes[i].ps_satype) < 0 || 461 pfkey_recv_register(lcconf->sock_pfkey) < 0) { 462 plog(LLV_WARNING, LOCATION, NULL, 463 "failed to register %s (%s)\n", 464 pfkey_satypes[i].ps_name, 465 ipsec_strerror()); 466 reg_fail++; 467 } 468 } 469 470 if (reg_fail == pfkey_nsatypes) { 471 plog(LLV_ERROR, LOCATION, NULL, 472 "failed to regist any protocol.\n"); 473 pfkey_close(lcconf->sock_pfkey); 474 return -1; 475 } 476 477 initsp(); 478 479 if (pfkey_send_spddump(lcconf->sock_pfkey) < 0) { 480 plog(LLV_ERROR, LOCATION, NULL, 481 "libipsec sending spddump failed: %s\n", 482 ipsec_strerror()); 483 pfkey_close(lcconf->sock_pfkey); 484 return -1; 485 } 486 #if 0 487 if (pfkey_promisc_toggle(1) < 0) { 488 pfkey_close(lcconf->sock_pfkey); 489 return -1; 490 } 491 #endif 492 monitor_fd(lcconf->sock_pfkey, pfkey_handler, NULL, 0); 493 return 0; 494 } 495 496 int 497 pfkey_reload() 498 { 499 flushsp(); 500 501 if (pfkey_send_spddump(lcconf->sock_pfkey) < 0) { 502 plog(LLV_ERROR, LOCATION, NULL, 503 "libipsec sending spddump failed: %s\n", 504 ipsec_strerror()); 505 return -1; 506 } 507 508 while (pfkey_handler(NULL, lcconf->sock_pfkey) > 0) 509 continue; 510 511 return 0; 512 } 513 514 /* %%% for conversion */ 515 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */ 516 static u_int 517 ipsecdoi2pfkey_aalg(hashtype) 518 u_int hashtype; 519 { 520 switch (hashtype) { 521 case IPSECDOI_ATTR_AUTH_HMAC_MD5: 522 return SADB_AALG_MD5HMAC; 523 case IPSECDOI_ATTR_AUTH_HMAC_SHA1: 524 return SADB_AALG_SHA1HMAC; 525 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256: 526 #if (defined SADB_X_AALG_SHA2_256) && !defined(SADB_X_AALG_SHA2_256HMAC) 527 return SADB_X_AALG_SHA2_256; 528 #else 529 return SADB_X_AALG_SHA2_256HMAC; 530 #endif 531 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384: 532 #if (defined SADB_X_AALG_SHA2_384) && !defined(SADB_X_AALG_SHA2_384HMAC) 533 return SADB_X_AALG_SHA2_384; 534 #else 535 return SADB_X_AALG_SHA2_384HMAC; 536 #endif 537 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512: 538 #if (defined SADB_X_AALG_SHA2_512) && !defined(SADB_X_AALG_SHA2_512HMAC) 539 return SADB_X_AALG_SHA2_512; 540 #else 541 return SADB_X_AALG_SHA2_512HMAC; 542 #endif 543 case IPSECDOI_ATTR_AUTH_KPDK: /* need special care */ 544 return SADB_AALG_NONE; 545 546 /* not supported */ 547 case IPSECDOI_ATTR_AUTH_DES_MAC: 548 plog(LLV_ERROR, LOCATION, NULL, 549 "Not supported hash type: %u\n", hashtype); 550 return ~0; 551 552 case 0: /* reserved */ 553 default: 554 return SADB_AALG_NONE; 555 556 plog(LLV_ERROR, LOCATION, NULL, 557 "Invalid hash type: %u\n", hashtype); 558 return ~0; 559 } 560 /*NOTREACHED*/ 561 } 562 563 /* IPSECDOI_ESP -> SADB_EALG */ 564 static u_int 565 ipsecdoi2pfkey_ealg(t_id) 566 u_int t_id; 567 { 568 switch (t_id) { 569 case IPSECDOI_ESP_DES_IV64: /* sa_flags |= SADB_X_EXT_OLD */ 570 return SADB_EALG_DESCBC; 571 case IPSECDOI_ESP_DES: 572 return SADB_EALG_DESCBC; 573 case IPSECDOI_ESP_3DES: 574 return SADB_EALG_3DESCBC; 575 #ifdef SADB_X_EALG_RC5CBC 576 case IPSECDOI_ESP_RC5: 577 return SADB_X_EALG_RC5CBC; 578 #endif 579 case IPSECDOI_ESP_CAST: 580 return SADB_X_EALG_CAST128CBC; 581 case IPSECDOI_ESP_BLOWFISH: 582 return SADB_X_EALG_BLOWFISHCBC; 583 case IPSECDOI_ESP_DES_IV32: /* flags |= (SADB_X_EXT_OLD| 584 SADB_X_EXT_IV4B)*/ 585 return SADB_EALG_DESCBC; 586 case IPSECDOI_ESP_NULL: 587 return SADB_EALG_NULL; 588 #ifdef SADB_X_EALG_AESCBC 589 case IPSECDOI_ESP_AES: 590 return SADB_X_EALG_AESCBC; 591 #endif 592 #ifdef SADB_X_EALG_TWOFISHCBC 593 case IPSECDOI_ESP_TWOFISH: 594 return SADB_X_EALG_TWOFISHCBC; 595 #endif 596 #ifdef SADB_X_EALG_CAMELLIACBC 597 case IPSECDOI_ESP_CAMELLIA: 598 return SADB_X_EALG_CAMELLIACBC; 599 #endif 600 601 /* not supported */ 602 case IPSECDOI_ESP_3IDEA: 603 case IPSECDOI_ESP_IDEA: 604 case IPSECDOI_ESP_RC4: 605 plog(LLV_ERROR, LOCATION, NULL, 606 "Not supported transform: %u\n", t_id); 607 return ~0; 608 609 case 0: /* reserved */ 610 default: 611 plog(LLV_ERROR, LOCATION, NULL, 612 "Invalid transform id: %u\n", t_id); 613 return ~0; 614 } 615 /*NOTREACHED*/ 616 } 617 618 /* IPCOMP -> SADB_CALG */ 619 static u_int 620 ipsecdoi2pfkey_calg(t_id) 621 u_int t_id; 622 { 623 switch (t_id) { 624 case IPSECDOI_IPCOMP_OUI: 625 return SADB_X_CALG_OUI; 626 case IPSECDOI_IPCOMP_DEFLATE: 627 return SADB_X_CALG_DEFLATE; 628 case IPSECDOI_IPCOMP_LZS: 629 return SADB_X_CALG_LZS; 630 631 case 0: /* reserved */ 632 default: 633 plog(LLV_ERROR, LOCATION, NULL, 634 "Invalid transform id: %u\n", t_id); 635 return ~0; 636 } 637 /*NOTREACHED*/ 638 } 639 640 /* IPSECDOI_PROTO -> SADB_SATYPE */ 641 u_int 642 ipsecdoi2pfkey_proto(proto) 643 u_int proto; 644 { 645 switch (proto) { 646 case IPSECDOI_PROTO_IPSEC_AH: 647 return SADB_SATYPE_AH; 648 case IPSECDOI_PROTO_IPSEC_ESP: 649 return SADB_SATYPE_ESP; 650 case IPSECDOI_PROTO_IPCOMP: 651 return SADB_X_SATYPE_IPCOMP; 652 653 default: 654 plog(LLV_ERROR, LOCATION, NULL, 655 "Invalid ipsec_doi proto: %u\n", proto); 656 return ~0; 657 } 658 /*NOTREACHED*/ 659 } 660 661 static u_int 662 ipsecdoi2pfkey_alg(algclass, type) 663 u_int algclass, type; 664 { 665 switch (algclass) { 666 case IPSECDOI_ATTR_AUTH: 667 return ipsecdoi2pfkey_aalg(type); 668 case IPSECDOI_PROTO_IPSEC_ESP: 669 return ipsecdoi2pfkey_ealg(type); 670 case IPSECDOI_PROTO_IPCOMP: 671 return ipsecdoi2pfkey_calg(type); 672 default: 673 plog(LLV_ERROR, LOCATION, NULL, 674 "Invalid ipsec_doi algclass: %u\n", algclass); 675 return ~0; 676 } 677 /*NOTREACHED*/ 678 } 679 680 /* SADB_SATYPE -> IPSECDOI_PROTO */ 681 u_int 682 pfkey2ipsecdoi_proto(satype) 683 u_int satype; 684 { 685 switch (satype) { 686 case SADB_SATYPE_AH: 687 return IPSECDOI_PROTO_IPSEC_AH; 688 case SADB_SATYPE_ESP: 689 return IPSECDOI_PROTO_IPSEC_ESP; 690 case SADB_X_SATYPE_IPCOMP: 691 return IPSECDOI_PROTO_IPCOMP; 692 693 default: 694 plog(LLV_ERROR, LOCATION, NULL, 695 "Invalid pfkey proto: %u\n", satype); 696 return ~0; 697 } 698 /*NOTREACHED*/ 699 } 700 701 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */ 702 u_int 703 ipsecdoi2pfkey_mode(mode) 704 u_int mode; 705 { 706 switch (mode) { 707 case IPSECDOI_ATTR_ENC_MODE_TUNNEL: 708 #ifdef ENABLE_NATT 709 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC: 710 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT: 711 #endif 712 return IPSEC_MODE_TUNNEL; 713 case IPSECDOI_ATTR_ENC_MODE_TRNS: 714 #ifdef ENABLE_NATT 715 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC: 716 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT: 717 #endif 718 return IPSEC_MODE_TRANSPORT; 719 default: 720 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode); 721 return ~0; 722 } 723 /*NOTREACHED*/ 724 } 725 726 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */ 727 u_int 728 pfkey2ipsecdoi_mode(mode) 729 u_int mode; 730 { 731 switch (mode) { 732 case IPSEC_MODE_TUNNEL: 733 return IPSECDOI_ATTR_ENC_MODE_TUNNEL; 734 case IPSEC_MODE_TRANSPORT: 735 return IPSECDOI_ATTR_ENC_MODE_TRNS; 736 case IPSEC_MODE_ANY: 737 return IPSECDOI_ATTR_ENC_MODE_ANY; 738 default: 739 plog(LLV_ERROR, LOCATION, NULL, "Invalid mode type: %u\n", mode); 740 return ~0; 741 } 742 /*NOTREACHED*/ 743 } 744 745 /* default key length for encryption algorithm */ 746 static u_int 747 keylen_aalg(hashtype) 748 u_int hashtype; 749 { 750 int res; 751 752 if (hashtype == 0) 753 return SADB_AALG_NONE; 754 755 res = alg_ipsec_hmacdef_hashlen(hashtype); 756 if (res == -1) { 757 plog(LLV_ERROR, LOCATION, NULL, 758 "invalid hmac algorithm %u.\n", hashtype); 759 return ~0; 760 } 761 return res; 762 } 763 764 /* default key length for encryption algorithm */ 765 static u_int 766 keylen_ealg(enctype, encklen) 767 u_int enctype; 768 int encklen; 769 { 770 int res; 771 772 res = alg_ipsec_encdef_keylen(enctype, encklen); 773 if (res == -1) { 774 plog(LLV_ERROR, LOCATION, NULL, 775 "invalid encryption algorithm %u.\n", enctype); 776 return ~0; 777 } 778 return res; 779 } 780 781 void 782 pk_fixup_sa_addresses(mhp) 783 caddr_t *mhp; 784 { 785 struct sockaddr *src, *dst; 786 787 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 788 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 789 set_port(src, PORT_ISAKMP); 790 set_port(dst, PORT_ISAKMP); 791 792 #ifdef ENABLE_NATT 793 if (PFKEY_ADDR_X_NATTYPE(mhp[SADB_X_EXT_NAT_T_TYPE])) { 794 /* NAT-T is enabled for this SADB entry; copy 795 * the ports from NAT-T extensions */ 796 if(mhp[SADB_X_EXT_NAT_T_SPORT] != NULL) 797 set_port(src, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_SPORT])); 798 if(mhp[SADB_X_EXT_NAT_T_DPORT] != NULL) 799 set_port(dst, PFKEY_ADDR_X_PORT(mhp[SADB_X_EXT_NAT_T_DPORT])); 800 } 801 #endif 802 } 803 804 int 805 pfkey_convertfromipsecdoi(proto_id, t_id, hashtype, 806 e_type, e_keylen, a_type, a_keylen, flags) 807 u_int proto_id; 808 u_int t_id; 809 u_int hashtype; 810 u_int *e_type; 811 u_int *e_keylen; 812 u_int *a_type; 813 u_int *a_keylen; 814 u_int *flags; 815 { 816 *flags = 0; 817 switch (proto_id) { 818 case IPSECDOI_PROTO_IPSEC_ESP: 819 if ((*e_type = ipsecdoi2pfkey_ealg(t_id)) == ~0) 820 goto bad; 821 if ((*e_keylen = keylen_ealg(t_id, *e_keylen)) == ~0) 822 goto bad; 823 *e_keylen >>= 3; 824 825 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0) 826 goto bad; 827 if ((*a_keylen = keylen_aalg(hashtype)) == ~0) 828 goto bad; 829 *a_keylen >>= 3; 830 831 if (*e_type == SADB_EALG_NONE) { 832 plog(LLV_ERROR, LOCATION, NULL, "no ESP algorithm.\n"); 833 goto bad; 834 } 835 break; 836 837 case IPSECDOI_PROTO_IPSEC_AH: 838 if ((*a_type = ipsecdoi2pfkey_aalg(hashtype)) == ~0) 839 goto bad; 840 if ((*a_keylen = keylen_aalg(hashtype)) == ~0) 841 goto bad; 842 *a_keylen >>= 3; 843 844 if (t_id == IPSECDOI_ATTR_AUTH_HMAC_MD5 845 && hashtype == IPSECDOI_ATTR_AUTH_KPDK) { 846 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */ 847 *a_type = SADB_X_AALG_MD5; 848 *flags |= SADB_X_EXT_OLD; 849 } 850 *e_type = SADB_EALG_NONE; 851 *e_keylen = 0; 852 if (*a_type == SADB_AALG_NONE) { 853 plog(LLV_ERROR, LOCATION, NULL, "no AH algorithm.\n"); 854 goto bad; 855 } 856 break; 857 858 case IPSECDOI_PROTO_IPCOMP: 859 if ((*e_type = ipsecdoi2pfkey_calg(t_id)) == ~0) 860 goto bad; 861 *e_keylen = 0; 862 863 *flags = SADB_X_EXT_RAWCPI; 864 865 *a_type = SADB_AALG_NONE; 866 *a_keylen = 0; 867 if (*e_type == SADB_X_CALG_NONE) { 868 plog(LLV_ERROR, LOCATION, NULL, "no IPCOMP algorithm.\n"); 869 goto bad; 870 } 871 break; 872 873 default: 874 plog(LLV_ERROR, LOCATION, NULL, "unknown IPsec protocol.\n"); 875 goto bad; 876 } 877 878 return 0; 879 880 bad: 881 errno = EINVAL; 882 return -1; 883 } 884 885 /*%%%*/ 886 /* send getspi message per ipsec protocol per remote address */ 887 /* 888 * the local address and remote address in ph1handle are dealed 889 * with destination address and source address respectively. 890 * Because SPI is decided by responder. 891 */ 892 int 893 pk_sendgetspi(iph2) 894 struct ph2handle *iph2; 895 { 896 struct sockaddr *src = NULL, *dst = NULL; 897 u_int satype, mode; 898 struct saprop *pp; 899 struct saproto *pr; 900 u_int32_t minspi, maxspi; 901 u_int8_t natt_type = 0; 902 u_int16_t sport = 0, dport = 0; 903 904 if (iph2->side == INITIATOR) 905 pp = iph2->proposal; 906 else 907 pp = iph2->approval; 908 909 if (iph2->sa_src && iph2->sa_dst) { 910 /* MIPv6: Use SA addresses, not IKE ones */ 911 src = dupsaddr(iph2->sa_src); 912 dst = dupsaddr(iph2->sa_dst); 913 } else { 914 /* Common case: SA addresses and IKE ones are the same */ 915 src = dupsaddr(iph2->src); 916 dst = dupsaddr(iph2->dst); 917 } 918 919 if (src == NULL || dst == NULL) { 920 racoon_free(src); 921 racoon_free(dst); 922 return -1; 923 } 924 925 for (pr = pp->head; pr != NULL; pr = pr->next) { 926 927 /* validity check */ 928 satype = ipsecdoi2pfkey_proto(pr->proto_id); 929 if (satype == ~0) { 930 plog(LLV_ERROR, LOCATION, NULL, 931 "invalid proto_id %d\n", pr->proto_id); 932 racoon_free(src); 933 racoon_free(dst); 934 return -1; 935 } 936 /* this works around a bug in Linux kernel where it allocates 4 byte 937 spi's for IPCOMP */ 938 else if (satype == SADB_X_SATYPE_IPCOMP) { 939 minspi = 0x100; 940 maxspi = 0xffff; 941 } 942 else { 943 minspi = 0; 944 maxspi = 0; 945 } 946 mode = ipsecdoi2pfkey_mode(pr->encmode); 947 if (mode == ~0) { 948 plog(LLV_ERROR, LOCATION, NULL, 949 "invalid encmode %d\n", pr->encmode); 950 racoon_free(src); 951 racoon_free(dst); 952 return -1; 953 } 954 955 #ifdef ENABLE_NATT 956 if (pr->udp_encap) { 957 natt_type = iph2->ph1->natt_options->encaps_type; 958 sport=extract_port(src); 959 dport=extract_port(dst); 960 } 961 #endif 962 963 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_getspi\n"); 964 if (pfkey_send_getspi_nat( 965 lcconf->sock_pfkey, 966 satype, 967 mode, 968 dst, /* src of SA */ 969 src, /* dst of SA */ 970 natt_type, 971 dport, 972 sport, 973 minspi, maxspi, 974 pr->reqid_in, iph2->seq) < 0) { 975 plog(LLV_ERROR, LOCATION, NULL, 976 "ipseclib failed send getspi (%s)\n", 977 ipsec_strerror()); 978 racoon_free(src); 979 racoon_free(dst); 980 return -1; 981 } 982 plog(LLV_DEBUG, LOCATION, NULL, 983 "pfkey GETSPI sent: %s\n", 984 sadbsecas2str(dst, src, satype, 0, mode)); 985 } 986 987 racoon_free(src); 988 racoon_free(dst); 989 return 0; 990 } 991 992 /* 993 * receive GETSPI from kernel. 994 */ 995 static int 996 pk_recvgetspi(mhp) 997 caddr_t *mhp; 998 { 999 struct sadb_msg *msg; 1000 struct sadb_sa *sa; 1001 struct ph2handle *iph2; 1002 struct sockaddr *src, *dst; 1003 int proto_id; 1004 int allspiok, notfound; 1005 struct saprop *pp; 1006 struct saproto *pr; 1007 1008 /* validity check */ 1009 if (mhp[SADB_EXT_SA] == NULL 1010 || mhp[SADB_EXT_ADDRESS_DST] == NULL 1011 || mhp[SADB_EXT_ADDRESS_SRC] == NULL) { 1012 plog(LLV_ERROR, LOCATION, NULL, 1013 "inappropriate sadb getspi message passed.\n"); 1014 return -1; 1015 } 1016 msg = (struct sadb_msg *)mhp[0]; 1017 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1018 pk_fixup_sa_addresses(mhp); 1019 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); /* note SA dir */ 1020 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1021 1022 /* the message has to be processed or not ? */ 1023 if (msg->sadb_msg_pid != getpid()) { 1024 plog(LLV_DEBUG, LOCATION, NULL, 1025 "%s message is not interesting " 1026 "because pid %d is not mine.\n", 1027 s_pfkey_type(msg->sadb_msg_type), 1028 msg->sadb_msg_pid); 1029 return -1; 1030 } 1031 1032 iph2 = getph2byseq(msg->sadb_msg_seq); 1033 if (iph2 == NULL) { 1034 plog(LLV_DEBUG, LOCATION, NULL, 1035 "seq %d of %s message not interesting.\n", 1036 msg->sadb_msg_seq, 1037 s_pfkey_type(msg->sadb_msg_type)); 1038 return -1; 1039 } 1040 1041 if (iph2->status != PHASE2ST_GETSPISENT) { 1042 plog(LLV_ERROR, LOCATION, NULL, 1043 "status mismatch (db:%d msg:%d)\n", 1044 iph2->status, PHASE2ST_GETSPISENT); 1045 return -1; 1046 } 1047 1048 /* set SPI, and check to get all spi whether or not */ 1049 allspiok = 1; 1050 notfound = 1; 1051 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1052 pp = iph2->side == INITIATOR ? iph2->proposal : iph2->approval; 1053 1054 for (pr = pp->head; pr != NULL; pr = pr->next) { 1055 if (pr->proto_id == proto_id && pr->spi == 0) { 1056 pr->spi = sa->sadb_sa_spi; 1057 notfound = 0; 1058 plog(LLV_DEBUG, LOCATION, NULL, 1059 "pfkey GETSPI succeeded: %s\n", 1060 sadbsecas2str(dst, src, 1061 msg->sadb_msg_satype, 1062 sa->sadb_sa_spi, 1063 ipsecdoi2pfkey_mode(pr->encmode))); 1064 } 1065 if (pr->spi == 0) 1066 allspiok = 0; /* not get all spi */ 1067 } 1068 1069 if (notfound) { 1070 plog(LLV_ERROR, LOCATION, NULL, 1071 "get spi for unknown address %s\n", 1072 saddrwop2str(dst)); 1073 return -1; 1074 } 1075 1076 if (allspiok) { 1077 /* update status */ 1078 iph2->status = PHASE2ST_GETSPIDONE; 1079 if (isakmp_post_getspi(iph2) < 0) { 1080 plog(LLV_ERROR, LOCATION, NULL, 1081 "failed to start post getspi.\n"); 1082 remph2(iph2); 1083 delph2(iph2); 1084 iph2 = NULL; 1085 return -1; 1086 } 1087 } 1088 1089 return 0; 1090 } 1091 1092 /* 1093 * set inbound SA 1094 */ 1095 int 1096 pk_sendupdate(iph2) 1097 struct ph2handle *iph2; 1098 { 1099 struct saproto *pr; 1100 struct pfkey_send_sa_args sa_args; 1101 1102 /* sanity check */ 1103 if (iph2->approval == NULL) { 1104 plog(LLV_ERROR, LOCATION, NULL, 1105 "no approvaled SAs found.\n"); 1106 return -1; 1107 } 1108 1109 /* fill in some needed for pfkey_send_update2 */ 1110 memset (&sa_args, 0, sizeof (sa_args)); 1111 sa_args.so = lcconf->sock_pfkey; 1112 if (iph2->lifetime_secs) 1113 sa_args.l_addtime = iph2->lifetime_secs; 1114 else 1115 sa_args.l_addtime = iph2->approval->lifetime; 1116 sa_args.seq = iph2->seq; 1117 sa_args.wsize = 4; 1118 1119 if (iph2->sa_src && iph2->sa_dst) { 1120 /* MIPv6: Use SA addresses, not IKE ones */ 1121 sa_args.dst = dupsaddr(iph2->sa_src); 1122 sa_args.src = dupsaddr(iph2->sa_dst); 1123 } else { 1124 /* Common case: SA addresses and IKE ones are the same */ 1125 sa_args.dst = dupsaddr(iph2->src); 1126 sa_args.src = dupsaddr(iph2->dst); 1127 } 1128 1129 if (sa_args.src == NULL || sa_args.dst == NULL) { 1130 racoon_free(sa_args.src); 1131 racoon_free(sa_args.dst); 1132 return -1; 1133 } 1134 1135 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1136 /* validity check */ 1137 sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id); 1138 if (sa_args.satype == ~0) { 1139 plog(LLV_ERROR, LOCATION, NULL, 1140 "invalid proto_id %d\n", pr->proto_id); 1141 racoon_free(sa_args.src); 1142 racoon_free(sa_args.dst); 1143 return -1; 1144 } 1145 else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) { 1146 /* IPCOMP has no replay window */ 1147 sa_args.wsize = 0; 1148 } 1149 #ifdef ENABLE_SAMODE_UNSPECIFIED 1150 sa_args.mode = IPSEC_MODE_ANY; 1151 #else 1152 sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode); 1153 if (sa_args.mode == ~0) { 1154 plog(LLV_ERROR, LOCATION, NULL, 1155 "invalid encmode %d\n", pr->encmode); 1156 racoon_free(sa_args.src); 1157 racoon_free(sa_args.dst); 1158 return -1; 1159 } 1160 #endif 1161 /* set algorithm type and key length */ 1162 sa_args.e_keylen = pr->head->encklen; 1163 if (pfkey_convertfromipsecdoi( 1164 pr->proto_id, 1165 pr->head->trns_id, 1166 pr->head->authtype, 1167 &sa_args.e_type, &sa_args.e_keylen, 1168 &sa_args.a_type, &sa_args.a_keylen, 1169 &sa_args.flags) < 0){ 1170 racoon_free(sa_args.src); 1171 racoon_free(sa_args.dst); 1172 return -1; 1173 } 1174 1175 #if 0 1176 sa_args.l_bytes = iph2->approval->lifebyte * 1024, 1177 #else 1178 sa_args.l_bytes = 0; 1179 #endif 1180 1181 #ifdef HAVE_SECCTX 1182 if (*iph2->approval->sctx.ctx_str) { 1183 sa_args.ctxdoi = iph2->approval->sctx.ctx_doi; 1184 sa_args.ctxalg = iph2->approval->sctx.ctx_alg; 1185 sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen; 1186 sa_args.ctxstr = iph2->approval->sctx.ctx_str; 1187 } 1188 #endif /* HAVE_SECCTX */ 1189 1190 #ifdef ENABLE_NATT 1191 if (pr->udp_encap) { 1192 sa_args.l_natt_type = iph2->ph1->natt_options->encaps_type; 1193 sa_args.l_natt_sport = extract_port(iph2->ph1->remote); 1194 sa_args.l_natt_dport = extract_port(iph2->ph1->local); 1195 sa_args.l_natt_oa = iph2->natoa_src; 1196 #ifdef SADB_X_EXT_NAT_T_FRAG 1197 sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag; 1198 #endif 1199 } 1200 #endif 1201 1202 /* more info to fill in */ 1203 sa_args.spi = pr->spi; 1204 sa_args.reqid = pr->reqid_in; 1205 sa_args.keymat = pr->keymat->v; 1206 1207 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_update2\n"); 1208 if (pfkey_send_update2(&sa_args) < 0) { 1209 plog(LLV_ERROR, LOCATION, NULL, 1210 "libipsec failed send update (%s)\n", 1211 ipsec_strerror()); 1212 racoon_free(sa_args.src); 1213 racoon_free(sa_args.dst); 1214 return -1; 1215 } 1216 1217 #ifndef ANDROID_PATCHED 1218 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]) 1219 continue; 1220 1221 /* 1222 * It maybe good idea to call backupsa_to_file() after 1223 * racoon will receive the sadb_update messages. 1224 * But it is impossible because there is not key in the 1225 * information from the kernel. 1226 */ 1227 1228 /* change some things before backing up */ 1229 sa_args.wsize = 4; 1230 sa_args.l_bytes = iph2->approval->lifebyte * 1024; 1231 1232 if (backupsa_to_file(&sa_args) < 0) { 1233 plog(LLV_ERROR, LOCATION, NULL, 1234 "backuped SA failed: %s\n", 1235 sadbsecas2str(sa_args.src, sa_args.dst, 1236 sa_args.satype, sa_args.spi, sa_args.mode)); 1237 } 1238 plog(LLV_DEBUG, LOCATION, NULL, 1239 "backuped SA: %s\n", 1240 sadbsecas2str(sa_args.src, sa_args.dst, 1241 sa_args.satype, sa_args.spi, sa_args.mode)); 1242 #endif 1243 } 1244 1245 racoon_free(sa_args.src); 1246 racoon_free(sa_args.dst); 1247 return 0; 1248 } 1249 1250 static int 1251 pk_recvupdate(mhp) 1252 caddr_t *mhp; 1253 { 1254 struct sadb_msg *msg; 1255 struct sadb_sa *sa; 1256 struct sockaddr *src, *dst; 1257 struct ph2handle *iph2; 1258 u_int proto_id, encmode, sa_mode; 1259 int incomplete = 0; 1260 struct saproto *pr; 1261 1262 /* ignore this message because of local test mode. */ 1263 if (f_local) 1264 return 0; 1265 1266 /* sanity check */ 1267 if (mhp[0] == NULL 1268 || mhp[SADB_EXT_SA] == NULL 1269 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1270 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 1271 plog(LLV_ERROR, LOCATION, NULL, 1272 "inappropriate sadb update message passed.\n"); 1273 return -1; 1274 } 1275 msg = (struct sadb_msg *)mhp[0]; 1276 pk_fixup_sa_addresses(mhp); 1277 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1278 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1279 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1280 1281 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1282 ? IPSEC_MODE_ANY 1283 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1284 1285 /* the message has to be processed or not ? */ 1286 if (msg->sadb_msg_pid != getpid()) { 1287 plog(LLV_DEBUG, LOCATION, NULL, 1288 "%s message is not interesting " 1289 "because pid %d is not mine.\n", 1290 s_pfkey_type(msg->sadb_msg_type), 1291 msg->sadb_msg_pid); 1292 return -1; 1293 } 1294 1295 iph2 = getph2byseq(msg->sadb_msg_seq); 1296 if (iph2 == NULL) { 1297 plog(LLV_DEBUG, LOCATION, NULL, 1298 "seq %d of %s message not interesting.\n", 1299 msg->sadb_msg_seq, 1300 s_pfkey_type(msg->sadb_msg_type)); 1301 return -1; 1302 } 1303 1304 if (iph2->status != PHASE2ST_ADDSA) { 1305 plog(LLV_ERROR, LOCATION, NULL, 1306 "status mismatch (db:%d msg:%d)\n", 1307 iph2->status, PHASE2ST_ADDSA); 1308 return -1; 1309 } 1310 1311 /* check to complete all keys ? */ 1312 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1313 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1314 if (proto_id == ~0) { 1315 plog(LLV_ERROR, LOCATION, NULL, 1316 "invalid proto_id %d\n", msg->sadb_msg_satype); 1317 return -1; 1318 } 1319 encmode = pfkey2ipsecdoi_mode(sa_mode); 1320 if (encmode == ~0) { 1321 plog(LLV_ERROR, LOCATION, NULL, 1322 "invalid encmode %d\n", sa_mode); 1323 return -1; 1324 } 1325 1326 if (pr->proto_id == proto_id 1327 && pr->spi == sa->sadb_sa_spi) { 1328 pr->ok = 1; 1329 plog(LLV_DEBUG, LOCATION, NULL, 1330 "pfkey UPDATE succeeded: %s\n", 1331 sadbsecas2str(dst, src, 1332 msg->sadb_msg_satype, 1333 sa->sadb_sa_spi, 1334 sa_mode)); 1335 1336 plog(LLV_INFO, LOCATION, NULL, 1337 "IPsec-SA established: %s\n", 1338 sadbsecas2str(dst, src, 1339 msg->sadb_msg_satype, sa->sadb_sa_spi, 1340 sa_mode)); 1341 } 1342 1343 if (pr->ok == 0) 1344 incomplete = 1; 1345 } 1346 1347 if (incomplete) 1348 return 0; 1349 1350 /* turn off the timer for calling pfkey_timeover() */ 1351 sched_cancel(&iph2->sce); 1352 1353 /* update status */ 1354 iph2->status = PHASE2ST_ESTABLISHED; 1355 evt_phase2(iph2, EVT_PHASE2_UP, NULL); 1356 1357 #ifdef ENABLE_STATS 1358 gettimeofday(&iph2->end, NULL); 1359 syslog(LOG_NOTICE, "%s(%s): %8.6f", 1360 "phase2", "quick", timedelta(&iph2->start, &iph2->end)); 1361 #endif 1362 1363 /* turn off schedule */ 1364 sched_cancel(&iph2->scr); 1365 1366 /* 1367 * since we are going to reuse the phase2 handler, we need to 1368 * remain it and refresh all the references between ph1 and ph2 to use. 1369 */ 1370 sched_schedule(&iph2->sce, iph2->approval->lifetime, 1371 isakmp_ph2expire_stub); 1372 1373 plog(LLV_DEBUG, LOCATION, NULL, "===\n"); 1374 return 0; 1375 } 1376 1377 /* 1378 * set outbound SA 1379 */ 1380 int 1381 pk_sendadd(iph2) 1382 struct ph2handle *iph2; 1383 { 1384 struct saproto *pr; 1385 struct pfkey_send_sa_args sa_args; 1386 1387 /* sanity check */ 1388 if (iph2->approval == NULL) { 1389 plog(LLV_ERROR, LOCATION, NULL, 1390 "no approvaled SAs found.\n"); 1391 return -1; 1392 } 1393 1394 /* fill in some needed for pfkey_send_update2 */ 1395 memset (&sa_args, 0, sizeof (sa_args)); 1396 sa_args.so = lcconf->sock_pfkey; 1397 if (iph2->lifetime_secs) 1398 sa_args.l_addtime = iph2->lifetime_secs; 1399 else 1400 sa_args.l_addtime = iph2->approval->lifetime; 1401 sa_args.seq = iph2->seq; 1402 sa_args.wsize = 4; 1403 1404 if (iph2->sa_src && iph2->sa_dst) { 1405 /* MIPv6: Use SA addresses, not IKE ones */ 1406 sa_args.src = dupsaddr(iph2->sa_src); 1407 sa_args.dst = dupsaddr(iph2->sa_dst); 1408 } else { 1409 /* Common case: SA addresses and IKE ones are the same */ 1410 sa_args.src = dupsaddr(iph2->src); 1411 sa_args.dst = dupsaddr(iph2->dst); 1412 } 1413 1414 if (sa_args.src == NULL || sa_args.dst == NULL) { 1415 racoon_free(sa_args.src); 1416 racoon_free(sa_args.dst); 1417 return -1; 1418 } 1419 1420 for (pr = iph2->approval->head; pr != NULL; pr = pr->next) { 1421 /* validity check */ 1422 sa_args.satype = ipsecdoi2pfkey_proto(pr->proto_id); 1423 if (sa_args.satype == ~0) { 1424 plog(LLV_ERROR, LOCATION, NULL, 1425 "invalid proto_id %d\n", pr->proto_id); 1426 racoon_free(sa_args.src); 1427 racoon_free(sa_args.dst); 1428 return -1; 1429 } 1430 else if (sa_args.satype == SADB_X_SATYPE_IPCOMP) { 1431 /* no replay window for IPCOMP */ 1432 sa_args.wsize = 0; 1433 } 1434 #ifdef ENABLE_SAMODE_UNSPECIFIED 1435 sa_args.mode = IPSEC_MODE_ANY; 1436 #else 1437 sa_args.mode = ipsecdoi2pfkey_mode(pr->encmode); 1438 if (sa_args.mode == ~0) { 1439 plog(LLV_ERROR, LOCATION, NULL, 1440 "invalid encmode %d\n", pr->encmode); 1441 racoon_free(sa_args.src); 1442 racoon_free(sa_args.dst); 1443 return -1; 1444 } 1445 #endif 1446 1447 /* set algorithm type and key length */ 1448 sa_args.e_keylen = pr->head->encklen; 1449 if (pfkey_convertfromipsecdoi( 1450 pr->proto_id, 1451 pr->head->trns_id, 1452 pr->head->authtype, 1453 &sa_args.e_type, &sa_args.e_keylen, 1454 &sa_args.a_type, &sa_args.a_keylen, 1455 &sa_args.flags) < 0){ 1456 racoon_free(sa_args.src); 1457 racoon_free(sa_args.dst); 1458 return -1; 1459 } 1460 1461 #if 0 1462 sa_args.l_bytes = iph2->approval->lifebyte * 1024, 1463 #else 1464 sa_args.l_bytes = 0; 1465 #endif 1466 1467 #ifdef HAVE_SECCTX 1468 if (*iph2->approval->sctx.ctx_str) { 1469 sa_args.ctxdoi = iph2->approval->sctx.ctx_doi; 1470 sa_args.ctxalg = iph2->approval->sctx.ctx_alg; 1471 sa_args.ctxstrlen = iph2->approval->sctx.ctx_strlen; 1472 sa_args.ctxstr = iph2->approval->sctx.ctx_str; 1473 } 1474 #endif /* HAVE_SECCTX */ 1475 1476 #ifdef ENABLE_NATT 1477 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2 " 1478 "(NAT flavor)\n"); 1479 1480 if (pr->udp_encap) { 1481 sa_args.l_natt_type = UDP_ENCAP_ESPINUDP; 1482 sa_args.l_natt_sport = extract_port(iph2->ph1->local); 1483 sa_args.l_natt_dport = extract_port(iph2->ph1->remote); 1484 sa_args.l_natt_oa = iph2->natoa_dst; 1485 #ifdef SADB_X_EXT_NAT_T_FRAG 1486 sa_args.l_natt_frag = iph2->ph1->rmconf->esp_frag; 1487 #endif 1488 } 1489 #endif 1490 /* more info to fill in */ 1491 sa_args.spi = pr->spi_p; 1492 sa_args.reqid = pr->reqid_out; 1493 sa_args.keymat = pr->keymat_p->v; 1494 1495 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_add2\n"); 1496 if (pfkey_send_add2(&sa_args) < 0) { 1497 plog(LLV_ERROR, LOCATION, NULL, 1498 "libipsec failed send add (%s)\n", 1499 ipsec_strerror()); 1500 racoon_free(sa_args.src); 1501 racoon_free(sa_args.dst); 1502 return -1; 1503 } 1504 1505 #ifndef ANDROID_PATCHED 1506 if (!lcconf->pathinfo[LC_PATHTYPE_BACKUPSA]) 1507 continue; 1508 1509 /* 1510 * It maybe good idea to call backupsa_to_file() after 1511 * racoon will receive the sadb_update messages. 1512 * But it is impossible because there is not key in the 1513 * information from the kernel. 1514 */ 1515 if (backupsa_to_file(&sa_args) < 0) { 1516 plog(LLV_ERROR, LOCATION, NULL, 1517 "backuped SA failed: %s\n", 1518 sadbsecas2str(sa_args.src, sa_args.dst, 1519 sa_args.satype, sa_args.spi, sa_args.mode)); 1520 } 1521 plog(LLV_DEBUG, LOCATION, NULL, 1522 "backuped SA: %s\n", 1523 sadbsecas2str(sa_args.src, sa_args.dst, 1524 sa_args.satype, sa_args.spi, sa_args.mode)); 1525 #endif 1526 } 1527 racoon_free(sa_args.src); 1528 racoon_free(sa_args.dst); 1529 return 0; 1530 } 1531 1532 static int 1533 pk_recvadd(mhp) 1534 caddr_t *mhp; 1535 { 1536 struct sadb_msg *msg; 1537 struct sadb_sa *sa; 1538 struct sockaddr *src, *dst; 1539 struct ph2handle *iph2; 1540 u_int sa_mode; 1541 1542 /* ignore this message because of local test mode. */ 1543 if (f_local) 1544 return 0; 1545 1546 /* sanity check */ 1547 if (mhp[0] == NULL 1548 || mhp[SADB_EXT_SA] == NULL 1549 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1550 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 1551 plog(LLV_ERROR, LOCATION, NULL, 1552 "inappropriate sadb add message passed.\n"); 1553 return -1; 1554 } 1555 msg = (struct sadb_msg *)mhp[0]; 1556 pk_fixup_sa_addresses(mhp); 1557 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1558 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1559 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1560 1561 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1562 ? IPSEC_MODE_ANY 1563 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1564 1565 /* the message has to be processed or not ? */ 1566 if (msg->sadb_msg_pid != getpid()) { 1567 plog(LLV_DEBUG, LOCATION, NULL, 1568 "%s message is not interesting " 1569 "because pid %d is not mine.\n", 1570 s_pfkey_type(msg->sadb_msg_type), 1571 msg->sadb_msg_pid); 1572 return -1; 1573 } 1574 1575 iph2 = getph2byseq(msg->sadb_msg_seq); 1576 if (iph2 == NULL) { 1577 plog(LLV_DEBUG, LOCATION, NULL, 1578 "seq %d of %s message not interesting.\n", 1579 msg->sadb_msg_seq, 1580 s_pfkey_type(msg->sadb_msg_type)); 1581 return -1; 1582 } 1583 1584 /* 1585 * NOTE don't update any status of phase2 handle 1586 * because they must be updated by SADB_UPDATE message 1587 */ 1588 1589 plog(LLV_INFO, LOCATION, NULL, 1590 "IPsec-SA established: %s\n", 1591 sadbsecas2str(src, dst, 1592 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode)); 1593 1594 plog(LLV_DEBUG, LOCATION, NULL, "===\n"); 1595 return 0; 1596 } 1597 1598 static int 1599 pk_recvexpire(mhp) 1600 caddr_t *mhp; 1601 { 1602 struct sadb_msg *msg; 1603 struct sadb_sa *sa; 1604 struct sockaddr *src, *dst; 1605 struct ph2handle *iph2; 1606 u_int proto_id, sa_mode; 1607 1608 /* sanity check */ 1609 if (mhp[0] == NULL 1610 || mhp[SADB_EXT_SA] == NULL 1611 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1612 || mhp[SADB_EXT_ADDRESS_DST] == NULL 1613 || (mhp[SADB_EXT_LIFETIME_HARD] != NULL 1614 && mhp[SADB_EXT_LIFETIME_SOFT] != NULL)) { 1615 plog(LLV_ERROR, LOCATION, NULL, 1616 "inappropriate sadb expire message passed.\n"); 1617 return -1; 1618 } 1619 msg = (struct sadb_msg *)mhp[0]; 1620 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 1621 pk_fixup_sa_addresses(mhp); 1622 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1623 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1624 1625 sa_mode = mhp[SADB_X_EXT_SA2] == NULL 1626 ? IPSEC_MODE_ANY 1627 : ((struct sadb_x_sa2 *)mhp[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 1628 1629 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 1630 if (proto_id == ~0) { 1631 plog(LLV_ERROR, LOCATION, NULL, 1632 "invalid proto_id %d\n", msg->sadb_msg_satype); 1633 return -1; 1634 } 1635 1636 plog(LLV_INFO, LOCATION, NULL, 1637 "IPsec-SA expired: %s\n", 1638 sadbsecas2str(src, dst, 1639 msg->sadb_msg_satype, sa->sadb_sa_spi, sa_mode)); 1640 1641 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi); 1642 if (iph2 == NULL) { 1643 /* 1644 * Ignore it because two expire messages are come up. 1645 * phase2 handler has been deleted already when 2nd message 1646 * is received. 1647 */ 1648 plog(LLV_DEBUG, LOCATION, NULL, 1649 "no such a SA found: %s\n", 1650 sadbsecas2str(src, dst, 1651 msg->sadb_msg_satype, sa->sadb_sa_spi, 1652 sa_mode)); 1653 return 0; 1654 } 1655 1656 /* resent expiry message? */ 1657 if (iph2->status > PHASE2ST_ESTABLISHED) 1658 return 0; 1659 1660 /* still negotiating? */ 1661 if (iph2->status < PHASE2ST_ESTABLISHED) { 1662 /* not a hard timeout? */ 1663 if (mhp[SADB_EXT_LIFETIME_HARD] == NULL) 1664 return 0; 1665 1666 /* 1667 * We were negotiating for that SA (w/o much success 1668 * from current status) and kernel has decided our time 1669 * is over trying (xfrm_larval_drop controls that and 1670 * is enabled by default on Linux >= 2.6.28 kernels). 1671 */ 1672 plog(LLV_WARNING, LOCATION, NULL, 1673 "PF_KEY EXPIRE message received from kernel for SA" 1674 " being negotiated. Stopping negotiation.\n"); 1675 } 1676 1677 /* turn off the timer for calling isakmp_ph2expire() */ 1678 sched_cancel(&iph2->sce); 1679 1680 if (iph2->status == PHASE2ST_ESTABLISHED && 1681 iph2->side == INITIATOR) { 1682 struct ph1handle *iph1hint; 1683 /* 1684 * Active phase 2 expired and we were initiator. 1685 * Begin new phase 2 exchange, so we can keep on sending 1686 * traffic. 1687 */ 1688 1689 /* update status for re-use */ 1690 iph1hint = iph2->ph1; 1691 initph2(iph2); 1692 iph2->status = PHASE2ST_STATUS2; 1693 1694 /* start quick exchange */ 1695 if (isakmp_post_acquire(iph2, iph1hint, FALSE) < 0) { 1696 plog(LLV_ERROR, LOCATION, iph2->dst, 1697 "failed to begin ipsec sa " 1698 "re-negotication.\n"); 1699 remph2(iph2); 1700 delph2(iph2); 1701 return -1; 1702 } 1703 1704 return 0; 1705 } 1706 1707 /* 1708 * We are responder or the phase 2 was not established. 1709 * Just remove the ph2handle to reflect SADB. 1710 */ 1711 iph2->status = PHASE2ST_EXPIRED; 1712 remph2(iph2); 1713 delph2(iph2); 1714 1715 return 0; 1716 } 1717 1718 static int 1719 pk_recvacquire(mhp) 1720 caddr_t *mhp; 1721 { 1722 struct sadb_msg *msg; 1723 struct sadb_x_policy *xpl; 1724 struct secpolicy *sp_out = NULL, *sp_in = NULL; 1725 struct ph2handle *iph2; 1726 struct sockaddr *src, *dst; /* IKE addresses (for exchanges) */ 1727 struct sockaddr *sp_src, *sp_dst; /* SP addresses (selectors). */ 1728 struct sockaddr *sa_src = NULL, *sa_dst = NULL ; /* SA addresses */ 1729 #ifdef HAVE_SECCTX 1730 struct sadb_x_sec_ctx *m_sec_ctx; 1731 #endif /* HAVE_SECCTX */ 1732 struct policyindex spidx; 1733 1734 /* ignore this message because of local test mode. */ 1735 if (f_local) 1736 return 0; 1737 1738 /* sanity check */ 1739 if (mhp[0] == NULL 1740 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 1741 || mhp[SADB_EXT_ADDRESS_DST] == NULL 1742 || mhp[SADB_X_EXT_POLICY] == NULL) { 1743 plog(LLV_ERROR, LOCATION, NULL, 1744 "inappropriate sadb acquire message passed.\n"); 1745 return -1; 1746 } 1747 msg = (struct sadb_msg *)mhp[0]; 1748 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 1749 /* acquire does not have nat-t ports; so do not bother setting 1750 * the default port 500; just use the port zero for wildcard 1751 * matching the get a valid natted destination */ 1752 sp_src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 1753 sp_dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 1754 1755 #ifdef HAVE_SECCTX 1756 m_sec_ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 1757 1758 if (m_sec_ctx != NULL) { 1759 plog(LLV_INFO, LOCATION, NULL, "security context doi: %u\n", 1760 m_sec_ctx->sadb_x_ctx_doi); 1761 plog(LLV_INFO, LOCATION, NULL, 1762 "security context algorithm: %u\n", 1763 m_sec_ctx->sadb_x_ctx_alg); 1764 plog(LLV_INFO, LOCATION, NULL, "security context length: %u\n", 1765 m_sec_ctx->sadb_x_ctx_len); 1766 plog(LLV_INFO, LOCATION, NULL, "security context: %s\n", 1767 ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx))); 1768 } 1769 #endif /* HAVE_SECCTX */ 1770 1771 /* ignore if type is not IPSEC_POLICY_IPSEC */ 1772 if (xpl->sadb_x_policy_type != IPSEC_POLICY_IPSEC) { 1773 plog(LLV_DEBUG, LOCATION, NULL, 1774 "ignore ACQUIRE message. type is not IPsec.\n"); 1775 return 0; 1776 } 1777 1778 /* ignore it if src or dst are multicast addresses. */ 1779 if ((sp_dst->sa_family == AF_INET 1780 && IN_MULTICAST(ntohl(((struct sockaddr_in *)sp_dst)->sin_addr.s_addr))) 1781 #ifdef INET6 1782 || (sp_dst->sa_family == AF_INET6 1783 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)sp_dst)->sin6_addr)) 1784 #endif 1785 ) { 1786 plog(LLV_DEBUG, LOCATION, NULL, 1787 "ignore due to multicast destination address: %s.\n", 1788 saddrwop2str(sp_dst)); 1789 return 0; 1790 } 1791 1792 if ((sp_src->sa_family == AF_INET 1793 && IN_MULTICAST(ntohl(((struct sockaddr_in *)sp_src)->sin_addr.s_addr))) 1794 #ifdef INET6 1795 || (sp_src->sa_family == AF_INET6 1796 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)sp_src)->sin6_addr)) 1797 #endif 1798 ) { 1799 plog(LLV_DEBUG, LOCATION, NULL, 1800 "ignore due to multicast source address: %s.\n", 1801 saddrwop2str(sp_src)); 1802 return 0; 1803 } 1804 1805 /* search for proper policyindex */ 1806 sp_out = getspbyspid(xpl->sadb_x_policy_id); 1807 if (sp_out == NULL) { 1808 plog(LLV_ERROR, LOCATION, NULL, "no policy found: id:%d.\n", 1809 xpl->sadb_x_policy_id); 1810 return -1; 1811 } 1812 plog(LLV_DEBUG, LOCATION, NULL, 1813 "suitable outbound SP found: %s.\n", spidx2str(&sp_out->spidx)); 1814 1815 /* Before going further, let first get the source and destination 1816 * address that would be used for IKE negotiation. The logic is: 1817 * - if SP from SPD image contains local and remote hints, we 1818 * use them (provided by MIGRATE). 1819 * - otherwise, we use the ones from the ipsecrequest, which means: 1820 * - the addresses from the request for transport mode 1821 * - the endpoints addresses for tunnel mode 1822 * 1823 * Note that: 1824 * 1) racoon does not support negotiation of bundles which 1825 * simplifies the lookup for the addresses in the ipsecrequest 1826 * list, as we expect only one. 1827 * 2) We do source and destination parts all together and do not 1828 * accept semi-defined information. This is just a decision, 1829 * there might be needs. 1830 * 1831 * --arno 1832 */ 1833 if (sp_out->req && sp_out->req->saidx.mode == IPSEC_MODE_TUNNEL) { 1834 /* For Tunnel mode, SA addresses are the endpoints */ 1835 src = (struct sockaddr *) &sp_out->req->saidx.src; 1836 dst = (struct sockaddr *) &sp_out->req->saidx.dst; 1837 } else { 1838 /* Otherwise use requested addresses. 1839 * 1840 * We need to explicitly setup sa_src and sa_dst too, 1841 * since the SA ports are different from IKE port. And 1842 * src/dst ports will be overwritten when the matching 1843 * phase1 is found. */ 1844 src = sa_src = sp_src; 1845 dst = sa_dst = sp_dst; 1846 } 1847 if (sp_out->local && sp_out->remote) { 1848 /* hints available, let's use them */ 1849 sa_src = src; 1850 sa_dst = dst; 1851 src = (struct sockaddr *) sp_out->local; 1852 dst = (struct sockaddr *) sp_out->remote; 1853 } 1854 1855 /* 1856 * If there is a phase 2 handler against the policy identifier in 1857 * the acquire message, and if 1858 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon 1859 * should ignore such a acquire message because the phase 2 1860 * is just negotiating. 1861 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon 1862 * has to prcesss such a acquire message because racoon may 1863 * lost the expire message. 1864 */ 1865 iph2 = getph2byid(src, dst, xpl->sadb_x_policy_id); 1866 if (iph2 != NULL) { 1867 if (iph2->status < PHASE2ST_ESTABLISHED) { 1868 plog(LLV_DEBUG, LOCATION, NULL, 1869 "ignore the acquire because ph2 found\n"); 1870 return -1; 1871 } 1872 if (iph2->status == PHASE2ST_EXPIRED) 1873 iph2 = NULL; 1874 /*FALLTHROUGH*/ 1875 } 1876 1877 /* Check we are listening on source address. If not, ignore. */ 1878 if (myaddr_getsport(src) == -1) { 1879 plog(LLV_DEBUG, LOCATION, NULL, 1880 "Not listening on source address %s. Ignoring ACQUIRE.\n", 1881 saddrwop2str(src)); 1882 return 0; 1883 } 1884 1885 /* get inbound policy */ 1886 { 1887 1888 memset(&spidx, 0, sizeof(spidx)); 1889 spidx.dir = IPSEC_DIR_INBOUND; 1890 memcpy(&spidx.src, &sp_out->spidx.dst, sizeof(spidx.src)); 1891 memcpy(&spidx.dst, &sp_out->spidx.src, sizeof(spidx.dst)); 1892 spidx.prefs = sp_out->spidx.prefd; 1893 spidx.prefd = sp_out->spidx.prefs; 1894 spidx.ul_proto = sp_out->spidx.ul_proto; 1895 1896 #ifdef HAVE_SECCTX 1897 if (m_sec_ctx) { 1898 spidx.sec_ctx.ctx_doi = m_sec_ctx->sadb_x_ctx_doi; 1899 spidx.sec_ctx.ctx_alg = m_sec_ctx->sadb_x_ctx_alg; 1900 spidx.sec_ctx.ctx_strlen = m_sec_ctx->sadb_x_ctx_len; 1901 memcpy(spidx.sec_ctx.ctx_str, 1902 ((char *)m_sec_ctx + sizeof(struct sadb_x_sec_ctx)), 1903 spidx.sec_ctx.ctx_strlen); 1904 } 1905 #endif /* HAVE_SECCTX */ 1906 1907 sp_in = getsp(&spidx); 1908 if (sp_in) { 1909 plog(LLV_DEBUG, LOCATION, NULL, 1910 "suitable inbound SP found: %s.\n", 1911 spidx2str(&sp_in->spidx)); 1912 } else { 1913 plog(LLV_NOTIFY, LOCATION, NULL, 1914 "no in-bound policy found: %s\n", 1915 spidx2str(&spidx)); 1916 } 1917 } 1918 1919 /* allocate a phase 2 */ 1920 iph2 = newph2(); 1921 if (iph2 == NULL) { 1922 plog(LLV_ERROR, LOCATION, NULL, 1923 "failed to allocate phase2 entry.\n"); 1924 return -1; 1925 } 1926 iph2->side = INITIATOR; 1927 iph2->spid = xpl->sadb_x_policy_id; 1928 iph2->satype = msg->sadb_msg_satype; 1929 iph2->seq = msg->sadb_msg_seq; 1930 iph2->status = PHASE2ST_STATUS2; 1931 1932 /* set address used by IKE for the negotiation (might differ from 1933 * SA address, i.e. might not be tunnel endpoints or addresses 1934 * of transport mode SA) */ 1935 iph2->dst = dupsaddr(dst); 1936 if (iph2->dst == NULL) { 1937 delph2(iph2); 1938 return -1; 1939 } 1940 iph2->src = dupsaddr(src); 1941 if (iph2->src == NULL) { 1942 delph2(iph2); 1943 return -1; 1944 } 1945 1946 /* If sa_src and sa_dst have been set, this mean we have to 1947 * set iph2->sa_src and iph2->sa_dst to provide the addresses 1948 * of the SA because iph2->src and iph2->dst are only the ones 1949 * used for the IKE exchanges. Those that need these addresses 1950 * are for instance pk_sendupdate() or pk_sendgetspi() */ 1951 if (sa_src) { 1952 iph2->sa_src = dupsaddr(sa_src); 1953 iph2->sa_dst = dupsaddr(sa_dst); 1954 } 1955 1956 if (isakmp_get_sainfo(iph2, sp_out, sp_in) < 0) { 1957 delph2(iph2); 1958 return -1; 1959 } 1960 1961 #ifdef HAVE_SECCTX 1962 if (m_sec_ctx) { 1963 set_secctx_in_proposal(iph2, spidx); 1964 } 1965 #endif /* HAVE_SECCTX */ 1966 1967 insph2(iph2); 1968 1969 /* start isakmp initiation by using ident exchange */ 1970 /* XXX should be looped if there are multiple phase 2 handler. */ 1971 if (isakmp_post_acquire(iph2, NULL, TRUE) < 0) { 1972 plog(LLV_ERROR, LOCATION, NULL, 1973 "failed to begin ipsec sa negotication.\n"); 1974 remph2(iph2); 1975 delph2(iph2); 1976 return -1; 1977 } 1978 1979 return 0; 1980 } 1981 1982 static int 1983 pk_recvdelete(mhp) 1984 caddr_t *mhp; 1985 { 1986 struct sadb_msg *msg; 1987 struct sadb_sa *sa; 1988 struct sockaddr *src, *dst; 1989 struct ph2handle *iph2 = NULL; 1990 u_int proto_id; 1991 1992 /* ignore this message because of local test mode. */ 1993 if (f_local) 1994 return 0; 1995 1996 /* sanity check */ 1997 if (mhp[0] == NULL 1998 || mhp[SADB_EXT_SA] == NULL 1999 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2000 || mhp[SADB_EXT_ADDRESS_DST] == NULL) { 2001 plog(LLV_ERROR, LOCATION, NULL, 2002 "inappropriate sadb delete message passed.\n"); 2003 return -1; 2004 } 2005 msg = (struct sadb_msg *)mhp[0]; 2006 sa = (struct sadb_sa *)mhp[SADB_EXT_SA]; 2007 pk_fixup_sa_addresses(mhp); 2008 src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]); 2009 dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]); 2010 2011 /* the message has to be processed or not ? */ 2012 if (msg->sadb_msg_pid == getpid()) { 2013 plog(LLV_DEBUG, LOCATION, NULL, 2014 "%s message is not interesting " 2015 "because the message was originated by me.\n", 2016 s_pfkey_type(msg->sadb_msg_type)); 2017 return -1; 2018 } 2019 2020 proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype); 2021 if (proto_id == ~0) { 2022 plog(LLV_ERROR, LOCATION, NULL, 2023 "invalid proto_id %d\n", msg->sadb_msg_satype); 2024 return -1; 2025 } 2026 2027 iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi); 2028 if (iph2 == NULL) { 2029 /* ignore */ 2030 plog(LLV_ERROR, LOCATION, NULL, 2031 "no iph2 found: %s\n", 2032 sadbsecas2str(src, dst, msg->sadb_msg_satype, 2033 sa->sadb_sa_spi, IPSEC_MODE_ANY)); 2034 return 0; 2035 } 2036 2037 plog(LLV_ERROR, LOCATION, NULL, 2038 "pfkey DELETE received: %s\n", 2039 sadbsecas2str(src, dst, 2040 msg->sadb_msg_satype, sa->sadb_sa_spi, IPSEC_MODE_ANY)); 2041 2042 /* send delete information */ 2043 if (iph2->status == PHASE2ST_ESTABLISHED) 2044 isakmp_info_send_d2(iph2); 2045 2046 remph2(iph2); 2047 delph2(iph2); 2048 2049 return 0; 2050 } 2051 2052 static int 2053 pk_recvflush(mhp) 2054 caddr_t *mhp; 2055 { 2056 /* ignore this message because of local test mode. */ 2057 if (f_local) 2058 return 0; 2059 2060 /* sanity check */ 2061 if (mhp[0] == NULL) { 2062 plog(LLV_ERROR, LOCATION, NULL, 2063 "inappropriate sadb flush message passed.\n"); 2064 return -1; 2065 } 2066 2067 flushph2(); 2068 2069 return 0; 2070 } 2071 2072 static int 2073 getsadbpolicy(policy0, policylen0, type, iph2) 2074 caddr_t *policy0; 2075 int *policylen0, type; 2076 struct ph2handle *iph2; 2077 { 2078 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2079 struct sockaddr *src = NULL, *dst = NULL; 2080 struct sadb_x_policy *xpl; 2081 struct sadb_x_ipsecrequest *xisr; 2082 struct saproto *pr; 2083 struct saproto **pr_rlist; 2084 int rlist_len = 0; 2085 caddr_t policy, p; 2086 int policylen; 2087 int xisrlen; 2088 u_int satype, mode; 2089 int len = 0; 2090 #ifdef HAVE_SECCTX 2091 int ctxlen = 0; 2092 #endif /* HAVE_SECCTX */ 2093 2094 2095 /* get policy buffer size */ 2096 policylen = sizeof(struct sadb_x_policy); 2097 if (type != SADB_X_SPDDELETE) { 2098 if (iph2->sa_src && iph2->sa_dst) { 2099 src = iph2->sa_src; /* MIPv6: Use SA addresses, */ 2100 dst = iph2->sa_dst; /* not IKE ones */ 2101 } else { 2102 src = iph2->src; /* Common case: SA addresses */ 2103 dst = iph2->dst; /* and IKE ones are the same */ 2104 } 2105 2106 for (pr = iph2->approval->head; pr; pr = pr->next) { 2107 xisrlen = sizeof(*xisr); 2108 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) { 2109 xisrlen += (sysdep_sa_len(src) + 2110 sysdep_sa_len(dst)); 2111 } 2112 2113 policylen += PFKEY_ALIGN8(xisrlen); 2114 } 2115 } 2116 2117 #ifdef HAVE_SECCTX 2118 if (*spidx->sec_ctx.ctx_str) { 2119 ctxlen = sizeof(struct sadb_x_sec_ctx) 2120 + PFKEY_ALIGN8(spidx->sec_ctx.ctx_strlen); 2121 policylen += ctxlen; 2122 } 2123 #endif /* HAVE_SECCTX */ 2124 2125 /* make policy structure */ 2126 policy = racoon_malloc(policylen); 2127 memset((void*)policy, 0xcd, policylen); 2128 if (!policy) { 2129 plog(LLV_ERROR, LOCATION, NULL, 2130 "buffer allocation failed.\n"); 2131 return -1; 2132 } 2133 2134 xpl = (struct sadb_x_policy *)policy; 2135 xpl->sadb_x_policy_len = PFKEY_UNIT64(policylen); 2136 xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 2137 xpl->sadb_x_policy_type = IPSEC_POLICY_IPSEC; 2138 xpl->sadb_x_policy_dir = spidx->dir; 2139 xpl->sadb_x_policy_id = 0; 2140 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2141 xpl->sadb_x_policy_priority = PRIORITY_DEFAULT; 2142 #endif 2143 len++; 2144 2145 #ifdef HAVE_SECCTX 2146 if (*spidx->sec_ctx.ctx_str) { 2147 struct sadb_x_sec_ctx *p; 2148 2149 p = (struct sadb_x_sec_ctx *)(xpl + len); 2150 memset(p, 0, ctxlen); 2151 p->sadb_x_sec_len = PFKEY_UNIT64(ctxlen); 2152 p->sadb_x_sec_exttype = SADB_X_EXT_SEC_CTX; 2153 p->sadb_x_ctx_len = spidx->sec_ctx.ctx_strlen; 2154 p->sadb_x_ctx_doi = spidx->sec_ctx.ctx_doi; 2155 p->sadb_x_ctx_alg = spidx->sec_ctx.ctx_alg; 2156 2157 memcpy(p + 1,spidx->sec_ctx.ctx_str,spidx->sec_ctx.ctx_strlen); 2158 len += ctxlen; 2159 } 2160 #endif /* HAVE_SECCTX */ 2161 2162 /* no need to append policy information any more if type is SPDDELETE */ 2163 if (type == SADB_X_SPDDELETE) 2164 goto end; 2165 2166 xisr = (struct sadb_x_ipsecrequest *)(xpl + len); 2167 2168 /* The order of things is reversed for use in add policy messages */ 2169 for (pr = iph2->approval->head; pr; pr = pr->next) rlist_len++; 2170 pr_rlist = racoon_malloc((rlist_len+1)*sizeof(struct saproto*)); 2171 if (!pr_rlist) { 2172 plog(LLV_ERROR, LOCATION, NULL, 2173 "buffer allocation failed.\n"); 2174 return -1; 2175 } 2176 pr_rlist[rlist_len--] = NULL; 2177 for (pr = iph2->approval->head; pr; pr = pr->next) pr_rlist[rlist_len--] = pr; 2178 rlist_len = 0; 2179 2180 for (pr = pr_rlist[rlist_len++]; pr; pr = pr_rlist[rlist_len++]) { 2181 2182 satype = doi2ipproto(pr->proto_id); 2183 if (satype == ~0) { 2184 plog(LLV_ERROR, LOCATION, NULL, 2185 "invalid proto_id %d\n", pr->proto_id); 2186 goto err; 2187 } 2188 mode = ipsecdoi2pfkey_mode(pr->encmode); 2189 if (mode == ~0) { 2190 plog(LLV_ERROR, LOCATION, NULL, 2191 "invalid encmode %d\n", pr->encmode); 2192 goto err; 2193 } 2194 2195 /* 2196 * the policy level cannot be unique because the policy 2197 * is defined later than SA, so req_id cannot be bound to SA. 2198 */ 2199 xisr->sadb_x_ipsecrequest_proto = satype; 2200 xisr->sadb_x_ipsecrequest_mode = mode; 2201 if(iph2->proposal->head->reqid_in > 0){ 2202 xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_UNIQUE; 2203 xisr->sadb_x_ipsecrequest_reqid = iph2->proposal->head->reqid_in; 2204 }else{ 2205 xisr->sadb_x_ipsecrequest_level = IPSEC_LEVEL_REQUIRE; 2206 xisr->sadb_x_ipsecrequest_reqid = 0; 2207 } 2208 p = (caddr_t)(xisr + 1); 2209 2210 xisrlen = sizeof(*xisr); 2211 2212 if (pr->encmode == IPSECDOI_ATTR_ENC_MODE_TUNNEL) { 2213 int src_len, dst_len; 2214 2215 src_len = sysdep_sa_len(src); 2216 dst_len = sysdep_sa_len(dst); 2217 xisrlen += src_len + dst_len; 2218 2219 memcpy(p, src, src_len); 2220 p += src_len; 2221 2222 memcpy(p, dst, dst_len); 2223 p += dst_len; 2224 } 2225 2226 xisr->sadb_x_ipsecrequest_len = PFKEY_ALIGN8(xisrlen); 2227 xisr = (struct sadb_x_ipsecrequest *)p; 2228 2229 } 2230 racoon_free(pr_rlist); 2231 2232 end: 2233 *policy0 = policy; 2234 *policylen0 = policylen; 2235 2236 return 0; 2237 2238 err: 2239 if (policy) 2240 racoon_free(policy); 2241 if (pr_rlist) racoon_free(pr_rlist); 2242 2243 return -1; 2244 } 2245 2246 int 2247 pk_sendspdupdate2(iph2) 2248 struct ph2handle *iph2; 2249 { 2250 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2251 caddr_t policy = NULL; 2252 int policylen = 0; 2253 u_int64_t ltime, vtime; 2254 2255 ltime = iph2->approval->lifetime; 2256 vtime = 0; 2257 2258 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDUPDATE, iph2)) { 2259 plog(LLV_ERROR, LOCATION, NULL, 2260 "getting sadb policy failed.\n"); 2261 return -1; 2262 } 2263 2264 if (pfkey_send_spdupdate2( 2265 lcconf->sock_pfkey, 2266 (struct sockaddr *)&spidx->src, 2267 spidx->prefs, 2268 (struct sockaddr *)&spidx->dst, 2269 spidx->prefd, 2270 spidx->ul_proto, 2271 ltime, vtime, 2272 policy, policylen, 0) < 0) { 2273 plog(LLV_ERROR, LOCATION, NULL, 2274 "libipsec failed send spdupdate2 (%s)\n", 2275 ipsec_strerror()); 2276 goto end; 2277 } 2278 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdupdate2\n"); 2279 2280 end: 2281 if (policy) 2282 racoon_free(policy); 2283 2284 return 0; 2285 } 2286 2287 static int 2288 pk_recvspdupdate(mhp) 2289 caddr_t *mhp; 2290 { 2291 struct sadb_address *saddr, *daddr; 2292 struct sadb_x_policy *xpl; 2293 struct sadb_lifetime *lt; 2294 struct policyindex spidx; 2295 struct secpolicy *sp; 2296 struct sockaddr *local=NULL, *remote=NULL; 2297 u_int64_t created; 2298 int ret; 2299 2300 /* sanity check */ 2301 if (mhp[0] == NULL 2302 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2303 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2304 || mhp[SADB_X_EXT_POLICY] == NULL) { 2305 plog(LLV_ERROR, LOCATION, NULL, 2306 "inappropriate sadb spdupdate message passed.\n"); 2307 return -1; 2308 } 2309 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2310 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2311 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2312 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2313 if(lt != NULL) 2314 created = lt->sadb_lifetime_addtime; 2315 else 2316 created = 0; 2317 2318 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2319 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2320 saddr + 1, 2321 daddr + 1, 2322 saddr->sadb_address_prefixlen, 2323 daddr->sadb_address_prefixlen, 2324 saddr->sadb_address_proto, 2325 xpl->sadb_x_policy_priority, 2326 created, 2327 &spidx); 2328 #else 2329 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2330 saddr + 1, 2331 daddr + 1, 2332 saddr->sadb_address_prefixlen, 2333 daddr->sadb_address_prefixlen, 2334 saddr->sadb_address_proto, 2335 created, 2336 &spidx); 2337 #endif 2338 2339 #ifdef HAVE_SECCTX 2340 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2341 struct sadb_x_sec_ctx *ctx; 2342 2343 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2344 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2345 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2346 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2347 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2348 } 2349 #endif /* HAVE_SECCTX */ 2350 2351 sp = getsp(&spidx); 2352 if (sp == NULL) { 2353 plog(LLV_DEBUG, LOCATION, NULL, 2354 "this policy did not exist for removal: \"%s\"\n", 2355 spidx2str(&spidx)); 2356 } else { 2357 /* preserve hints before deleting the SP */ 2358 local = sp->local; 2359 remote = sp->remote; 2360 sp->local = NULL; 2361 sp->remote = NULL; 2362 2363 remsp(sp); 2364 delsp(sp); 2365 } 2366 2367 /* Add new SP (with old hints) */ 2368 ret = addnewsp(mhp, local, remote); 2369 2370 if (local != NULL) 2371 racoon_free(local); 2372 if (remote != NULL) 2373 racoon_free(remote); 2374 2375 if (ret < 0) 2376 return -1; 2377 2378 return 0; 2379 } 2380 2381 /* 2382 * this function has to be used by responder side. 2383 */ 2384 int 2385 pk_sendspdadd2(iph2) 2386 struct ph2handle *iph2; 2387 { 2388 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2389 caddr_t policy = NULL; 2390 int policylen = 0; 2391 u_int64_t ltime, vtime; 2392 2393 ltime = iph2->approval->lifetime; 2394 vtime = 0; 2395 2396 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDADD, iph2)) { 2397 plog(LLV_ERROR, LOCATION, NULL, 2398 "getting sadb policy failed.\n"); 2399 return -1; 2400 } 2401 2402 if (pfkey_send_spdadd2( 2403 lcconf->sock_pfkey, 2404 (struct sockaddr *)&spidx->src, 2405 spidx->prefs, 2406 (struct sockaddr *)&spidx->dst, 2407 spidx->prefd, 2408 spidx->ul_proto, 2409 ltime, vtime, 2410 policy, policylen, 0) < 0) { 2411 plog(LLV_ERROR, LOCATION, NULL, 2412 "libipsec failed send spdadd2 (%s)\n", 2413 ipsec_strerror()); 2414 goto end; 2415 } 2416 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spdadd2\n"); 2417 2418 end: 2419 if (policy) 2420 racoon_free(policy); 2421 2422 return 0; 2423 } 2424 2425 static int 2426 pk_recvspdadd(mhp) 2427 caddr_t *mhp; 2428 { 2429 struct sadb_address *saddr, *daddr; 2430 struct sadb_x_policy *xpl; 2431 struct sadb_lifetime *lt; 2432 struct policyindex spidx; 2433 struct secpolicy *sp; 2434 struct sockaddr *local = NULL, *remote = NULL; 2435 u_int64_t created; 2436 int ret; 2437 2438 /* sanity check */ 2439 if (mhp[0] == NULL 2440 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2441 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2442 || mhp[SADB_X_EXT_POLICY] == NULL) { 2443 plog(LLV_ERROR, LOCATION, NULL, 2444 "inappropriate sadb spdadd message passed.\n"); 2445 return -1; 2446 } 2447 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2448 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2449 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2450 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2451 if(lt != NULL) 2452 created = lt->sadb_lifetime_addtime; 2453 else 2454 created = 0; 2455 2456 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2457 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2458 saddr + 1, 2459 daddr + 1, 2460 saddr->sadb_address_prefixlen, 2461 daddr->sadb_address_prefixlen, 2462 saddr->sadb_address_proto, 2463 xpl->sadb_x_policy_priority, 2464 created, 2465 &spidx); 2466 #else 2467 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2468 saddr + 1, 2469 daddr + 1, 2470 saddr->sadb_address_prefixlen, 2471 daddr->sadb_address_prefixlen, 2472 saddr->sadb_address_proto, 2473 created, 2474 &spidx); 2475 #endif 2476 2477 #ifdef HAVE_SECCTX 2478 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2479 struct sadb_x_sec_ctx *ctx; 2480 2481 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2482 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2483 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2484 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2485 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2486 } 2487 #endif /* HAVE_SECCTX */ 2488 2489 sp = getsp(&spidx); 2490 if (sp != NULL) { 2491 plog(LLV_ERROR, LOCATION, NULL, 2492 "such policy already exists. " 2493 "anyway replace it: %s\n", 2494 spidx2str(&spidx)); 2495 2496 /* preserve hints before deleting the SP */ 2497 local = sp->local; 2498 remote = sp->remote; 2499 sp->local = NULL; 2500 sp->remote = NULL; 2501 2502 remsp(sp); 2503 delsp(sp); 2504 } 2505 2506 /* Add new SP (with old hints) */ 2507 ret = addnewsp(mhp, local, remote); 2508 2509 if (local != NULL) 2510 racoon_free(local); 2511 if (remote != NULL) 2512 racoon_free(remote); 2513 2514 if (ret < 0) 2515 return -1; 2516 2517 return 0; 2518 } 2519 2520 /* 2521 * this function has to be used by responder side. 2522 */ 2523 int 2524 pk_sendspddelete(iph2) 2525 struct ph2handle *iph2; 2526 { 2527 struct policyindex *spidx = (struct policyindex *)iph2->spidx_gen; 2528 caddr_t policy = NULL; 2529 int policylen; 2530 2531 if (getsadbpolicy(&policy, &policylen, SADB_X_SPDDELETE, iph2)) { 2532 plog(LLV_ERROR, LOCATION, NULL, 2533 "getting sadb policy failed.\n"); 2534 return -1; 2535 } 2536 2537 if (pfkey_send_spddelete( 2538 lcconf->sock_pfkey, 2539 (struct sockaddr *)&spidx->src, 2540 spidx->prefs, 2541 (struct sockaddr *)&spidx->dst, 2542 spidx->prefd, 2543 spidx->ul_proto, 2544 policy, policylen, 0) < 0) { 2545 plog(LLV_ERROR, LOCATION, NULL, 2546 "libipsec failed send spddelete (%s)\n", 2547 ipsec_strerror()); 2548 goto end; 2549 } 2550 plog(LLV_DEBUG, LOCATION, NULL, "call pfkey_send_spddelete\n"); 2551 2552 end: 2553 if (policy) 2554 racoon_free(policy); 2555 2556 return 0; 2557 } 2558 2559 static int 2560 pk_recvspddelete(mhp) 2561 caddr_t *mhp; 2562 { 2563 struct sadb_address *saddr, *daddr; 2564 struct sadb_x_policy *xpl; 2565 struct sadb_lifetime *lt; 2566 struct policyindex spidx; 2567 struct secpolicy *sp; 2568 u_int64_t created; 2569 2570 /* sanity check */ 2571 if (mhp[0] == NULL 2572 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2573 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2574 || mhp[SADB_X_EXT_POLICY] == NULL) { 2575 plog(LLV_ERROR, LOCATION, NULL, 2576 "inappropriate sadb spddelete message passed.\n"); 2577 return -1; 2578 } 2579 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2580 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2581 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2582 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2583 if(lt != NULL) 2584 created = lt->sadb_lifetime_addtime; 2585 else 2586 created = 0; 2587 2588 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2589 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2590 saddr + 1, 2591 daddr + 1, 2592 saddr->sadb_address_prefixlen, 2593 daddr->sadb_address_prefixlen, 2594 saddr->sadb_address_proto, 2595 xpl->sadb_x_policy_priority, 2596 created, 2597 &spidx); 2598 #else 2599 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2600 saddr + 1, 2601 daddr + 1, 2602 saddr->sadb_address_prefixlen, 2603 daddr->sadb_address_prefixlen, 2604 saddr->sadb_address_proto, 2605 created, 2606 &spidx); 2607 #endif 2608 2609 #ifdef HAVE_SECCTX 2610 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2611 struct sadb_x_sec_ctx *ctx; 2612 2613 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2614 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2615 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2616 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2617 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2618 } 2619 #endif /* HAVE_SECCTX */ 2620 2621 sp = getsp(&spidx); 2622 if (sp == NULL) { 2623 plog(LLV_ERROR, LOCATION, NULL, 2624 "no policy found: %s\n", 2625 spidx2str(&spidx)); 2626 return -1; 2627 } 2628 2629 remsp(sp); 2630 delsp(sp); 2631 2632 return 0; 2633 } 2634 2635 static int 2636 pk_recvspdexpire(mhp) 2637 caddr_t *mhp; 2638 { 2639 struct sadb_address *saddr, *daddr; 2640 struct sadb_x_policy *xpl; 2641 struct sadb_lifetime *lt; 2642 struct policyindex spidx; 2643 struct secpolicy *sp; 2644 u_int64_t created; 2645 2646 /* sanity check */ 2647 if (mhp[0] == NULL 2648 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 2649 || mhp[SADB_EXT_ADDRESS_DST] == NULL 2650 || mhp[SADB_X_EXT_POLICY] == NULL) { 2651 plog(LLV_ERROR, LOCATION, NULL, 2652 "inappropriate sadb spdexpire message passed.\n"); 2653 return -1; 2654 } 2655 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2656 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2657 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2658 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2659 if(lt != NULL) 2660 created = lt->sadb_lifetime_addtime; 2661 else 2662 created = 0; 2663 2664 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2665 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2666 saddr + 1, 2667 daddr + 1, 2668 saddr->sadb_address_prefixlen, 2669 daddr->sadb_address_prefixlen, 2670 saddr->sadb_address_proto, 2671 xpl->sadb_x_policy_priority, 2672 created, 2673 &spidx); 2674 #else 2675 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2676 saddr + 1, 2677 daddr + 1, 2678 saddr->sadb_address_prefixlen, 2679 daddr->sadb_address_prefixlen, 2680 saddr->sadb_address_proto, 2681 created, 2682 &spidx); 2683 #endif 2684 2685 #ifdef HAVE_SECCTX 2686 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2687 struct sadb_x_sec_ctx *ctx; 2688 2689 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2690 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2691 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2692 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2693 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2694 } 2695 #endif /* HAVE_SECCTX */ 2696 2697 sp = getsp(&spidx); 2698 if (sp == NULL) { 2699 plog(LLV_ERROR, LOCATION, NULL, 2700 "no policy found: %s\n", 2701 spidx2str(&spidx)); 2702 return -1; 2703 } 2704 2705 remsp(sp); 2706 delsp(sp); 2707 2708 return 0; 2709 } 2710 2711 static int 2712 pk_recvspdget(mhp) 2713 caddr_t *mhp; 2714 { 2715 /* sanity check */ 2716 if (mhp[0] == NULL) { 2717 plog(LLV_ERROR, LOCATION, NULL, 2718 "inappropriate sadb spdget message passed.\n"); 2719 return -1; 2720 } 2721 2722 return 0; 2723 } 2724 2725 static int 2726 pk_recvspddump(mhp) 2727 caddr_t *mhp; 2728 { 2729 struct sadb_msg *msg; 2730 struct sadb_address *saddr, *daddr; 2731 struct sadb_x_policy *xpl; 2732 struct sadb_lifetime *lt; 2733 struct policyindex spidx; 2734 struct secpolicy *sp; 2735 struct sockaddr *local=NULL, *remote=NULL; 2736 u_int64_t created; 2737 int ret; 2738 2739 /* sanity check */ 2740 if (mhp[0] == NULL) { 2741 plog(LLV_ERROR, LOCATION, NULL, 2742 "inappropriate sadb spddump message passed.\n"); 2743 return -1; 2744 } 2745 msg = (struct sadb_msg *)mhp[0]; 2746 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 2747 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 2748 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 2749 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 2750 if(lt != NULL) 2751 created = lt->sadb_lifetime_addtime; 2752 else 2753 created = 0; 2754 2755 if (saddr == NULL || daddr == NULL || xpl == NULL) { 2756 plog(LLV_ERROR, LOCATION, NULL, 2757 "inappropriate sadb spddump message passed.\n"); 2758 return -1; 2759 } 2760 2761 #ifdef HAVE_PFKEY_POLICY_PRIORITY 2762 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2763 saddr + 1, 2764 daddr + 1, 2765 saddr->sadb_address_prefixlen, 2766 daddr->sadb_address_prefixlen, 2767 saddr->sadb_address_proto, 2768 xpl->sadb_x_policy_priority, 2769 created, 2770 &spidx); 2771 #else 2772 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 2773 saddr + 1, 2774 daddr + 1, 2775 saddr->sadb_address_prefixlen, 2776 daddr->sadb_address_prefixlen, 2777 saddr->sadb_address_proto, 2778 created, 2779 &spidx); 2780 #endif 2781 2782 #ifdef HAVE_SECCTX 2783 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 2784 struct sadb_x_sec_ctx *ctx; 2785 2786 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 2787 spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 2788 spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 2789 spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 2790 memcpy(spidx.sec_ctx.ctx_str, ctx + 1, ctx->sadb_x_ctx_len); 2791 } 2792 #endif /* HAVE_SECCTX */ 2793 2794 sp = getsp(&spidx); 2795 if (sp != NULL) { 2796 plog(LLV_ERROR, LOCATION, NULL, 2797 "such policy already exists. " 2798 "anyway replace it: %s\n", 2799 spidx2str(&spidx)); 2800 2801 /* preserve hints before deleting the SP */ 2802 local = sp->local; 2803 remote = sp->remote; 2804 sp->local = NULL; 2805 sp->remote = NULL; 2806 2807 remsp(sp); 2808 delsp(sp); 2809 } 2810 2811 /* Add new SP (with old hints) */ 2812 ret = addnewsp(mhp, local, remote); 2813 2814 if (local != NULL) 2815 racoon_free(local); 2816 if (remote != NULL) 2817 racoon_free(remote); 2818 2819 if (ret < 0) 2820 return -1; 2821 2822 return 0; 2823 } 2824 2825 static int 2826 pk_recvspdflush(mhp) 2827 caddr_t *mhp; 2828 { 2829 /* sanity check */ 2830 if (mhp[0] == NULL) { 2831 plog(LLV_ERROR, LOCATION, NULL, 2832 "inappropriate sadb spdflush message passed.\n"); 2833 return -1; 2834 } 2835 2836 flushsp(); 2837 2838 return 0; 2839 } 2840 2841 #if defined(SADB_X_MIGRATE) && defined(SADB_X_EXT_KMADDRESS) 2842 2843 /* MIGRATE support (pk_recvmigrate() is the handler of MIGRATE message). 2844 * 2845 * pk_recvmigrate() 2846 * 1) some preprocessing and checks 2847 * 2) parsing of sadb_x_kmaddress extension 2848 * 3) SP lookup using selectors and content of policy extension from MIGRATE 2849 * 4) resolution of current local and remote IKE addresses 2850 * 5) Use of addresses to get Phase 1 handler if any 2851 * 6) Update of IKE addresses in Phase 1 (iph1->local and iph1->remote) 2852 * 7) Update of IKE addresses in Phase 2 (iph2->src and iph2->dst) 2853 * 8) Update of IKE addresses in SP (sp->local and sp->remote) 2854 * 9) Loop on sadb_x_ipsecrequests pairs from MIGRATE 2855 * - update of associated ipsecrequests entries in sp->req (should be 2856 * only one as racoon does not support bundles), i.e. update of 2857 * tunnel endpoints when required. 2858 * - If tunnel mode endpoints have been updated, lookup of associated 2859 * Phase 2 handle to also update sa_src and sa_dst entries 2860 * 2861 * XXX Note that we do not support yet the update of SA addresses for transport 2862 * mode, but only the update of SA addresses for tunnel mode (endpoints). 2863 * Reasons are: 2864 * - there is no initial need for MIPv6 2865 * - racoon does not support bundles 2866 * - this would imply more work to deal with sainfo update (if feasible). 2867 */ 2868 2869 /* Generic argument structure for migration callbacks */ 2870 struct migrate_args { 2871 struct sockaddr *local; 2872 struct sockaddr *remote; 2873 }; 2874 2875 /* 2876 * Update local and remote addresses of given Phase 1. Schedule removal 2877 * if negotiation was going on and restart a one from updated address. 2878 * 2879 * -1 is returned on error. 0 if everything went right. 2880 */ 2881 static int 2882 migrate_ph1_ike_addresses(iph1, arg) 2883 struct ph1handle *iph1; 2884 void *arg; 2885 { 2886 struct migrate_args *ma = (struct migrate_args *) arg; 2887 struct remoteconf *rmconf; 2888 u_int16_t port; 2889 2890 /* Already up-to-date? */ 2891 if (cmpsaddr(iph1->local, ma->local) == CMPSADDR_MATCH && 2892 cmpsaddr(iph1->remote, ma->remote) == CMPSADDR_MATCH) 2893 return 0; 2894 2895 if (iph1->status < PHASE1ST_ESTABLISHED) { 2896 /* Bad luck! We received a MIGRATE *while* negotiating 2897 * Phase 1 (i.e. it was not established yet). If we act as 2898 * initiator we need to restart the negotiation. As 2899 * responder, our best bet is to update our addresses 2900 * and wait for the initiator to do something */ 2901 plog(LLV_WARNING, LOCATION, NULL, "MIGRATE received *during* " 2902 "Phase 1 negotiation (%s).\n", 2903 saddr2str_fromto("%s => %s", ma->local, ma->remote)); 2904 2905 /* If we are not acting as initiator, let's just leave and 2906 * let the remote peer handle the restart */ 2907 rmconf = getrmconf(ma->remote, 0); 2908 if (rmconf == NULL || !rmconf->passive) { 2909 iph1->status = PHASE1ST_EXPIRED; 2910 isakmp_ph1delete(iph1); 2911 2912 /* This is unlikely, but let's just check if a Phase 1 2913 * for the new addresses already exist */ 2914 if (getph1byaddr(ma->local, ma->remote, 0)) { 2915 plog(LLV_WARNING, LOCATION, NULL, "No need " 2916 "to start a new Phase 1 negotiation. One " 2917 "already exists.\n"); 2918 return 0; 2919 } 2920 2921 plog(LLV_WARNING, LOCATION, NULL, "As initiator, " 2922 "restarting it.\n"); 2923 /* Note that the insertion of the new Phase 1 will not 2924 * interfere with the fact we are called from enumph1, 2925 * because it is inserted as first element. --arno */ 2926 isakmp_ph1begin_i(rmconf, ma->local, ma->remote); 2927 2928 return 0; 2929 } 2930 } 2931 2932 if (iph1->local != NULL) { 2933 plog(LLV_DEBUG, LOCATION, NULL, "Migrating Phase 1 local " 2934 "address from %s\n", 2935 saddr2str_fromto("%s to %s", iph1->local, ma->local)); 2936 port = extract_port(iph1->local); 2937 racoon_free(iph1->local); 2938 } else 2939 port = 0; 2940 2941 iph1->local = dupsaddr(ma->local); 2942 if (iph1->local == NULL) { 2943 plog(LLV_ERROR, LOCATION, NULL, "unable to allocate " 2944 "Phase 1 local address.\n"); 2945 return -1; 2946 } 2947 set_port(iph1->local, port); 2948 2949 if (iph1->remote != NULL) { 2950 plog(LLV_DEBUG, LOCATION, NULL, "Migrating Phase 1 remote " 2951 "address from %s\n", 2952 saddr2str_fromto("%s to %s", iph1->remote, ma->remote)); 2953 port = extract_port(iph1->remote); 2954 racoon_free(iph1->remote); 2955 } else 2956 port = 0; 2957 2958 iph1->remote = dupsaddr(ma->remote); 2959 if (iph1->remote == NULL) { 2960 plog(LLV_ERROR, LOCATION, NULL, "unable to allocate " 2961 "Phase 1 remote address.\n"); 2962 return -1; 2963 } 2964 set_port(iph1->remote, port); 2965 2966 return 0; 2967 } 2968 2969 /* Update src and dst of all current Phase 2 handles. 2970 * with provided local and remote addresses. 2971 * Our intent is NOT to modify IPsec SA endpoints but IKE 2972 * addresses so we need to take care to separate those if 2973 * they are different. -1 is returned on error. 0 if everything 2974 * went right. 2975 * 2976 * Note: we do not maintain port information as it is not 2977 * expected to be meaningful --arno 2978 */ 2979 static int 2980 migrate_ph2_ike_addresses(iph2, arg) 2981 struct ph2handle *iph2; 2982 void *arg; 2983 { 2984 struct migrate_args *ma = (struct migrate_args *) arg; 2985 struct ph1handle *iph1; 2986 2987 /* If Phase 2 has an associated Phase 1, migrate addresses */ 2988 if (iph2->ph1) 2989 migrate_ph1_ike_addresses(iph2->ph1, arg); 2990 2991 /* Already up-to-date? */ 2992 if (cmpsaddr(iph2->src, ma->local) == CMPSADDR_MATCH && 2993 cmpsaddr(iph2->dst, ma->remote) == CMPSADDR_MATCH) 2994 return 0; 2995 2996 /* save src/dst as sa_src/sa_dst before rewriting */ 2997 if (iph2->sa_src == NULL && iph2->sa_dst == NULL) { 2998 iph2->sa_src = iph2->src; 2999 iph2->sa_dst = iph2->dst; 3000 iph2->src = NULL; 3001 iph2->dst = NULL; 3002 } 3003 3004 if (iph2->src != NULL) 3005 racoon_free(iph2->src); 3006 iph2->src = dupsaddr(ma->local); 3007 if (iph2->src == NULL) { 3008 plog(LLV_ERROR, LOCATION, NULL, 3009 "unable to allocate Phase 2 src address.\n"); 3010 return -1; 3011 } 3012 3013 if (iph2->dst != NULL) 3014 racoon_free(iph2->dst); 3015 iph2->dst = dupsaddr(ma->remote); 3016 if (iph2->dst == NULL) { 3017 plog(LLV_ERROR, LOCATION, NULL, 3018 "unable to allocate Phase 2 dst address.\n"); 3019 return -1; 3020 } 3021 3022 return 0; 3023 } 3024 3025 /* Consider existing Phase 2 handles with given spid and update their source 3026 * and destination addresses for SA. As racoon does not support bundles, if 3027 * we modify multiple occurrences, this probably imply rekeying has happened. 3028 * 3029 * Both addresses passed to the function are expected not to be NULL and of 3030 * same family. -1 is returned on error. 0 if everything went right. 3031 * 3032 * Specific care is needed to support Phase 2 for which negotiation has 3033 * already started but are which not yet established. 3034 */ 3035 static int 3036 migrate_ph2_sa_addresses(iph2, args) 3037 struct ph2handle *iph2; 3038 void *args; 3039 { 3040 struct migrate_args *ma = (struct migrate_args *) args; 3041 3042 if (iph2->sa_src != NULL) { 3043 racoon_free(iph2->sa_src); 3044 iph2->sa_src = NULL; 3045 } 3046 3047 if (iph2->sa_dst != NULL) { 3048 racoon_free(iph2->sa_dst); 3049 iph2->sa_dst = NULL; 3050 } 3051 3052 iph2->sa_src = dupsaddr(ma->local); 3053 if (iph2->sa_src == NULL) { 3054 plog(LLV_ERROR, LOCATION, NULL, 3055 "unable to allocate Phase 2 sa_src address.\n"); 3056 return -1; 3057 } 3058 3059 iph2->sa_dst = dupsaddr(ma->remote); 3060 if (iph2->sa_dst == NULL) { 3061 plog(LLV_ERROR, LOCATION, NULL, 3062 "unable to allocate Phase 2 sa_dst address.\n"); 3063 return -1; 3064 } 3065 3066 if (iph2->status < PHASE2ST_ESTABLISHED) { 3067 struct remoteconf *rmconf; 3068 /* We were negotiating for that SA when we received the MIGRATE. 3069 * We cannot simply update the addresses and let the exchange 3070 * go on. We have to restart the whole negotiation if we are 3071 * the initiator. Otherwise (acting as responder), we just need 3072 * to delete our ph2handle and wait for the initiator to start 3073 * a new negotiation. */ 3074 3075 if (iph2->ph1 && iph2->ph1->rmconf) 3076 rmconf = iph2->ph1->rmconf; 3077 else 3078 rmconf = getrmconf(iph2->dst, 0); 3079 3080 if (rmconf && !rmconf->passive) { 3081 struct ph1handle *iph1hint; 3082 3083 plog(LLV_WARNING, LOCATION, iph2->dst, "MIGRATE received " 3084 "*during* IPsec SA negotiation. As initiator, " 3085 "restarting it.\n"); 3086 3087 /* Turn off expiration timer ...*/ 3088 sched_cancel(&iph2->sce); 3089 iph2->status = PHASE2ST_EXPIRED; 3090 3091 /* ... clean Phase 2 handle ... */ 3092 iph1hint = iph2->ph1; 3093 initph2(iph2); 3094 iph2->status = PHASE2ST_STATUS2; 3095 3096 /* and start a new negotiation */ 3097 if (isakmp_post_acquire(iph2, iph1hint, FALSE) < 0) { 3098 plog(LLV_ERROR, LOCATION, iph2->dst, "failed " 3099 "to begin IPsec SA renegotiation after " 3100 "MIGRATE reception.\n"); 3101 remph2(iph2); 3102 delph2(iph2); 3103 return -1; 3104 } 3105 } else { 3106 plog(LLV_WARNING, LOCATION, iph2->dst, "MIGRATE received " 3107 "*during* IPsec SA negotiation. As responder, let's" 3108 "wait for the initiator to act.\n"); 3109 3110 /* Simply schedule deletion */ 3111 isakmp_ph2expire(iph2); 3112 } 3113 } 3114 3115 return 0; 3116 } 3117 3118 /* Update SP hints (local and remote addresses) for future IKE 3119 * negotiations of SA associated with that SP. -1 is returned 3120 * on error. 0 if everything went right. 3121 * 3122 * Note: we do not maintain port information as it is not 3123 * expected to be meaningful --arno 3124 */ 3125 static int 3126 migrate_sp_ike_addresses(sp, local, remote) 3127 struct secpolicy *sp; 3128 struct sockaddr *local, *remote; 3129 { 3130 if (sp == NULL || local == NULL || remote == NULL) 3131 return -1; 3132 3133 if (sp->local != NULL) 3134 racoon_free(sp->local); 3135 3136 sp->local = dupsaddr(local); 3137 if (sp->local == NULL) { 3138 plog(LLV_ERROR, LOCATION, NULL, "unable to allocate " 3139 "local hint for SP.\n"); 3140 return -1; 3141 } 3142 3143 if (sp->remote != NULL) 3144 racoon_free(sp->remote); 3145 3146 sp->remote = dupsaddr(remote); 3147 if (sp->remote == NULL) { 3148 plog(LLV_ERROR, LOCATION, NULL, "unable to allocate " 3149 "remote hint for SP.\n"); 3150 return -1; 3151 } 3152 3153 return 0; 3154 } 3155 3156 /* Given current ipsecrequest (isr_cur) to be migrated in considered 3157 tree, the function first checks that it matches the expected one 3158 (xisr_old) provided in MIGRATE message and then updates the addresses 3159 if it is tunnel mode (with content of xisr_new). Various other checks 3160 are performed. For transport mode, structures are not modified, only 3161 the checks are done. -1 is returned on error. */ 3162 static int 3163 migrate_ph2_one_isr(spid, isr_cur, xisr_old, xisr_new) 3164 u_int32_t spid; 3165 struct ipsecrequest *isr_cur; 3166 struct sadb_x_ipsecrequest *xisr_old, *xisr_new; 3167 { 3168 struct secasindex *saidx = &isr_cur->saidx; 3169 struct sockaddr *osaddr, *odaddr, *nsaddr, *ndaddr; 3170 struct ph2selector ph2sel; 3171 struct migrate_args ma; 3172 3173 /* First, check that mode and proto do match */ 3174 if (xisr_old->sadb_x_ipsecrequest_proto != saidx->proto || 3175 xisr_old->sadb_x_ipsecrequest_mode != saidx->mode || 3176 xisr_new->sadb_x_ipsecrequest_proto != saidx->proto || 3177 xisr_new->sadb_x_ipsecrequest_mode != saidx->mode) 3178 return -1; 3179 3180 /* Then, verify reqid if necessary */ 3181 if (isr_cur->saidx.reqid && 3182 (xisr_old->sadb_x_ipsecrequest_reqid != IPSEC_LEVEL_UNIQUE || 3183 xisr_new->sadb_x_ipsecrequest_reqid != IPSEC_LEVEL_UNIQUE || 3184 isr_cur->saidx.reqid != xisr_old->sadb_x_ipsecrequest_reqid || 3185 isr_cur->saidx.reqid != xisr_new->sadb_x_ipsecrequest_reqid)) 3186 return -1; 3187 3188 /* If not tunnel mode, our work is over */ 3189 if (saidx->mode != IPSEC_MODE_TUNNEL) { 3190 plog(LLV_DEBUG, LOCATION, NULL, "SADB_X_MIGRATE: " 3191 "non tunnel mode isr, skipping SA address migration.\n"); 3192 return 0; 3193 } 3194 3195 /* Tunnel mode: let's check addresses do match and then update them. */ 3196 osaddr = (struct sockaddr *)(xisr_old + 1); 3197 odaddr = (struct sockaddr *)(((u_int8_t *)osaddr) + sysdep_sa_len(osaddr)); 3198 nsaddr = (struct sockaddr *)(xisr_new + 1); 3199 ndaddr = (struct sockaddr *)(((u_int8_t *)nsaddr) + sysdep_sa_len(nsaddr)); 3200 3201 /* Check family does match */ 3202 if (osaddr->sa_family != odaddr->sa_family || 3203 nsaddr->sa_family != ndaddr->sa_family) 3204 return -1; 3205 3206 /* Check family does match */ 3207 if (saidx->src.ss_family != osaddr->sa_family) 3208 return -1; 3209 3210 /* We log IPv4 to IPv6 and IPv6 to IPv4 switches */ 3211 if (nsaddr->sa_family != osaddr->sa_family) 3212 plog(LLV_INFO, LOCATION, NULL, "SADB_X_MIGRATE: " 3213 "changing address families (%d to %d) for endpoints.\n", 3214 osaddr->sa_family, nsaddr->sa_family); 3215 3216 if (cmpsaddr(osaddr, (struct sockaddr *) &saidx->src) != CMPSADDR_MATCH || 3217 cmpsaddr(odaddr, (struct sockaddr *) &saidx->dst) != CMPSADDR_MATCH) { 3218 plog(LLV_DEBUG, LOCATION, NULL, "SADB_X_MIGRATE: " 3219 "mismatch of addresses in saidx and xisr.\n"); 3220 return -1; 3221 } 3222 3223 /* Excellent. Let's grab associated Phase 2 handle (if any) 3224 * and update its sa_src and sa_dst entries. Note that we 3225 * make the assumption that racoon does not support bundles 3226 * and make the lookup using spid: we blindly update 3227 * sa_src and sa_dst for _all_ found Phase 2 handles */ 3228 memset(&ph2sel, 0, sizeof(ph2sel)); 3229 ph2sel.spid = spid; 3230 3231 memset(&ma, 0, sizeof(ma)); 3232 ma.local = nsaddr; 3233 ma.remote = ndaddr; 3234 3235 if (enumph2(&ph2sel, migrate_ph2_sa_addresses, &ma) < 0) 3236 return -1; 3237 3238 /* Now we can do the update of endpoints in secasindex */ 3239 memcpy(&saidx->src, nsaddr, sysdep_sa_len(nsaddr)); 3240 memcpy(&saidx->dst, ndaddr, sysdep_sa_len(ndaddr)); 3241 3242 return 0; 3243 } 3244 3245 /* Process the raw (unparsed yet) list of sadb_x_ipsecrequests of MIGRATE 3246 * message. For each sadb_x_ipsecrequest pair (old followed by new), 3247 * the corresponding ipsecrequest entry in the SP is updated. Associated 3248 * existing Phase 2 handle is also updated (if any) */ 3249 static int 3250 migrate_sp_isr_list(sp, xisr_list, xisr_list_len) 3251 struct secpolicy *sp; 3252 struct sadb_x_ipsecrequest *xisr_list; 3253 int xisr_list_len; 3254 { 3255 struct sadb_x_ipsecrequest *xisr_new, *xisr_old = xisr_list; 3256 int xisr_old_len, xisr_new_len; 3257 struct ipsecrequest *isr_cur; 3258 3259 isr_cur = sp->req; /* ipsecrequest list from from sp */ 3260 3261 while (xisr_list_len > 0 && isr_cur != NULL) { 3262 /* Get old xisr (length field is in bytes) */ 3263 xisr_old_len = xisr_old->sadb_x_ipsecrequest_len; 3264 if (xisr_old_len < sizeof(*xisr_old) || 3265 xisr_old_len + sizeof(*xisr_new) > xisr_list_len) { 3266 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3267 "invalid ipsecrequest length. Exiting.\n"); 3268 return -1; 3269 } 3270 3271 /* Get new xisr with updated info */ 3272 xisr_new = (struct sadb_x_ipsecrequest *)(((u_int8_t *)xisr_old) + xisr_old_len); 3273 xisr_new_len = xisr_new->sadb_x_ipsecrequest_len; 3274 if (xisr_new_len < sizeof(*xisr_new) || 3275 xisr_new_len + xisr_old_len > xisr_list_len) { 3276 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3277 "invalid ipsecrequest length. Exiting.\n"); 3278 return -1; 3279 } 3280 3281 /* Start by migrating current ipsecrequest from SP */ 3282 if (migrate_ph2_one_isr(sp->id, isr_cur, xisr_old, xisr_new) == -1) { 3283 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3284 "Unable to match and migrate isr. Exiting.\n"); 3285 return -1; 3286 } 3287 3288 /* Update pointers for next round */ 3289 xisr_list_len -= xisr_old_len + xisr_new_len; 3290 xisr_old = (struct sadb_x_ipsecrequest *)(((u_int8_t *)xisr_new) + 3291 xisr_new_len); 3292 3293 isr_cur = isr_cur->next; /* Get next ipsecrequest from SP */ 3294 } 3295 3296 /* Check we had the same amount of pairs in the MIGRATE 3297 as the number of ipsecrequests in the SP */ 3298 if ((xisr_list_len != 0) || isr_cur != NULL) { 3299 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3300 "number of ipsecrequest does not match the one in SP.\n"); 3301 return -1; 3302 } 3303 3304 return 0; 3305 } 3306 3307 /* Parse sadb_x_kmaddress extension and make local and remote 3308 * parameters point to the new addresses (zero copy). -1 is 3309 * returned on error, meaning that addresses are not usable */ 3310 static int 3311 parse_kmaddress(kmaddr, local, remote) 3312 struct sadb_x_kmaddress *kmaddr; 3313 struct sockaddr **local, **remote; 3314 { 3315 int addrslen, local_len=0; 3316 struct ph1handle *iph1; 3317 3318 if (kmaddr == NULL) 3319 return -1; 3320 3321 /* Grab addresses in sadb_x_kmaddress extension */ 3322 addrslen = PFKEY_EXTLEN(kmaddr) - sizeof(*kmaddr); 3323 if (addrslen < sizeof(struct sockaddr)) 3324 return -1; 3325 3326 *local = (struct sockaddr *)(kmaddr + 1); 3327 3328 switch ((*local)->sa_family) { 3329 case AF_INET: 3330 local_len = sizeof(struct sockaddr_in); 3331 break; 3332 #ifdef INET6 3333 case AF_INET6: 3334 local_len = sizeof(struct sockaddr_in6); 3335 break; 3336 #endif 3337 default: 3338 return -1; 3339 } 3340 3341 if (addrslen != PFKEY_ALIGN8(2*local_len)) 3342 return -1; 3343 3344 *remote = (struct sockaddr *)(((u_int8_t *)(*local)) + local_len); 3345 3346 if ((*local)->sa_family != (*remote)->sa_family) 3347 return -1; 3348 3349 return 0; 3350 } 3351 3352 /* Handler of PF_KEY MIGRATE message. Helpers are above */ 3353 static int 3354 pk_recvmigrate(mhp) 3355 caddr_t *mhp; 3356 { 3357 struct sadb_address *saddr, *daddr; 3358 struct sockaddr *old_saddr, *new_saddr; 3359 struct sockaddr *old_daddr, *new_daddr; 3360 struct sockaddr *old_local, *old_remote; 3361 struct sockaddr *local, *remote; 3362 struct sadb_x_kmaddress *kmaddr; 3363 struct sadb_x_policy *xpl; 3364 struct sadb_x_ipsecrequest *xisr_list; 3365 struct sadb_lifetime *lt; 3366 struct policyindex spidx; 3367 struct secpolicy *sp; 3368 struct ipsecrequest *isr_cur; 3369 struct secasindex *oldsaidx; 3370 struct ph2handle *iph2; 3371 struct ph1handle *iph1; 3372 struct ph2selector ph2sel; 3373 struct ph1selector ph1sel; 3374 u_int32_t spid; 3375 u_int64_t created; 3376 int xisr_list_len; 3377 int ulproto; 3378 struct migrate_args ma; 3379 3380 /* Some sanity checks */ 3381 3382 if (mhp[0] == NULL 3383 || mhp[SADB_EXT_ADDRESS_SRC] == NULL 3384 || mhp[SADB_EXT_ADDRESS_DST] == NULL 3385 || mhp[SADB_X_EXT_KMADDRESS] == NULL 3386 || mhp[SADB_X_EXT_POLICY] == NULL) { 3387 plog(LLV_ERROR, LOCATION, NULL, 3388 "SADB_X_MIGRATE: invalid MIGRATE message received.\n"); 3389 return -1; 3390 } 3391 kmaddr = (struct sadb_x_kmaddress *)mhp[SADB_X_EXT_KMADDRESS]; 3392 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 3393 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 3394 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 3395 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 3396 if (lt != NULL) 3397 created = lt->sadb_lifetime_addtime; 3398 else 3399 created = 0; 3400 3401 if (xpl->sadb_x_policy_type != IPSEC_POLICY_IPSEC) { 3402 plog(LLV_WARNING, LOCATION, NULL,"SADB_X_MIGRATE: " 3403 "found non IPsec policy in MIGRATE message. Exiting.\n"); 3404 return -1; 3405 } 3406 3407 if (PFKEY_EXTLEN(xpl) < sizeof(*xpl)) { 3408 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3409 "invalid size for sadb_x_policy. Exiting.\n"); 3410 return -1; 3411 } 3412 3413 /* Some logging to help debbugging */ 3414 if (xpl->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND) 3415 plog(LLV_DEBUG, LOCATION, NULL, 3416 "SADB_X_MIGRATE: Outbound SA being migrated.\n"); 3417 else 3418 plog(LLV_DEBUG, LOCATION, NULL, 3419 "SADB_X_MIGRATE: Inbound SA being migrated.\n"); 3420 3421 /* validity check */ 3422 xisr_list = (struct sadb_x_ipsecrequest *)(xpl + 1); 3423 xisr_list_len = PFKEY_EXTLEN(xpl) - sizeof(*xpl); 3424 if (xisr_list_len < sizeof(*xisr_list)) { 3425 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3426 "invalid sadb_x_policy message length. Exiting.\n"); 3427 return -1; 3428 } 3429 3430 if (parse_kmaddress(kmaddr, &local, &remote) == -1) { 3431 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: " 3432 "invalid sadb_x_kmaddress extension. Exiting.\n"); 3433 return -1; 3434 } 3435 3436 /* 0 means ANY */ 3437 if (saddr->sadb_address_proto == 0) 3438 ulproto = IPSEC_ULPROTO_ANY; 3439 else 3440 ulproto = saddr->sadb_address_proto; 3441 3442 #ifdef HAVE_PFKEY_POLICY_PRIORITY 3443 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3444 saddr + 1, 3445 daddr + 1, 3446 saddr->sadb_address_prefixlen, 3447 daddr->sadb_address_prefixlen, 3448 ulproto, 3449 xpl->sadb_x_policy_priority, 3450 created, 3451 &spidx); 3452 #else 3453 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3454 saddr + 1, 3455 daddr + 1, 3456 saddr->sadb_address_prefixlen, 3457 daddr->sadb_address_prefixlen, 3458 ulproto, 3459 created, 3460 &spidx); 3461 #endif 3462 3463 /* Everything seems ok, let's get the SP. 3464 * 3465 * XXX We could also do the lookup using the spid from xpl. 3466 * I don't know which one is better. --arno */ 3467 sp = getsp(&spidx); 3468 if (sp == NULL) { 3469 plog(LLV_ERROR, LOCATION, NULL, 3470 "SADB_X_MIGRATE: Passed policy does not exist: %s\n", 3471 spidx2str(&spidx)); 3472 return -1; 3473 } 3474 3475 /* Get the best source and destination addresses used for IKE 3476 * negotiation, to find and migrate existing Phase 1 */ 3477 if (sp->local && sp->remote) { 3478 /* hints available, let's use them */ 3479 old_local = (struct sockaddr *)sp->local; 3480 old_remote = (struct sockaddr *)sp->remote; 3481 } else if (sp->req && sp->req->saidx.mode == IPSEC_MODE_TUNNEL) { 3482 /* Tunnel mode and no hint, use endpoints */ 3483 old_local = (struct sockaddr *)&sp->req->saidx.src; 3484 old_remote = (struct sockaddr *)&sp->req->saidx.dst; 3485 } else { 3486 /* default, use selectors as fallback */ 3487 old_local = (struct sockaddr *)&sp->spidx.src; 3488 old_remote = (struct sockaddr *)&sp->spidx.dst; 3489 } 3490 3491 /* We migrate all Phase 1 that match our old local and remote 3492 * addresses (no matter their state). 3493 * 3494 * XXX In fact, we should probably havea special treatment for 3495 * Phase 1 that are being established when we receive a MIGRATE. 3496 * This can happen if a movement occurs during the initial IKE 3497 * negotiation. In that case, I wonder if should restart the 3498 * negotiation from the new address or just update things like 3499 * we do it now. 3500 * 3501 * XXX while looking at getph1byaddr(), the comment at the 3502 * beginning of the function expects comparison to happen 3503 * without ports considerations but it uses CMPSADDR() which 3504 * relies either on cmpsaddrstrict() or cmpsaddrwop() based 3505 * on NAT-T support being activated. That make me wonder if I 3506 * should force ports to 0 (ANY) in local and remote values 3507 * used below. 3508 * 3509 * -- arno */ 3510 3511 /* Apply callback data ...*/ 3512 memset(&ma, 0, sizeof(ma)); 3513 ma.local = local; 3514 ma.remote = remote; 3515 3516 /* Fill phase1 match criteria ... */ 3517 memset(&ph1sel, 0, sizeof(ph1sel)); 3518 ph1sel.local = old_local; 3519 ph1sel.remote = old_remote; 3520 3521 3522 /* Have matching Phase 1 found and addresses updated. As this is a 3523 * time consuming task on a busy responder, and MIGRATE messages 3524 * are always sent for *both* inbound and outbound (and possibly 3525 * forward), we only do that for outbound SP. */ 3526 if (xpl->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND && 3527 enumph1(&ph1sel, migrate_ph1_ike_addresses, &ma) < 0) { 3528 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: Unable " 3529 "to migrate Phase 1 addresses.\n"); 3530 return -1; 3531 } 3532 3533 /* We can now update IKE addresses in Phase 2 handle. */ 3534 memset(&ph2sel, 0, sizeof(ph2sel)); 3535 ph2sel.spid = sp->id; 3536 if (enumph2(&ph2sel, migrate_ph2_ike_addresses, &ma) < 0) { 3537 plog(LLV_ERROR, LOCATION, NULL, "SADB_X_MIGRATE: Unable " 3538 "to migrate Phase 2 IKE addresses.\n"); 3539 return -1; 3540 } 3541 3542 /* and _then_ in SP. */ 3543 if (migrate_sp_ike_addresses(sp, local, remote) < 0) { 3544 plog(LLV_ERROR, LOCATION, NULL, 3545 "SADB_X_MIGRATE: Unable to migrate SP IKE addresses.\n"); 3546 return -1; 3547 } 3548 3549 /* Loop on sadb_x_ipsecrequest list to possibly update sp->req 3550 * entries and associated live Phase 2 handles (their sa_src 3551 * and sa_dst) */ 3552 if (migrate_sp_isr_list(sp, xisr_list, xisr_list_len) < 0) { 3553 plog(LLV_ERROR, LOCATION, NULL, 3554 "SADB_X_MIGRATE: Unable to migrate isr list.\n"); 3555 return -1; 3556 } 3557 3558 return 0; 3559 } 3560 #endif 3561 3562 #ifndef ANDROID_PATCHED 3563 3564 /* 3565 * send error against acquire message to kernel. 3566 */ 3567 int 3568 pk_sendeacquire(iph2) 3569 struct ph2handle *iph2; 3570 { 3571 struct sadb_msg *newmsg; 3572 int len; 3573 3574 len = sizeof(struct sadb_msg); 3575 newmsg = racoon_calloc(1, len); 3576 if (newmsg == NULL) { 3577 plog(LLV_ERROR, LOCATION, NULL, 3578 "failed to get buffer to send acquire.\n"); 3579 return -1; 3580 } 3581 3582 memset(newmsg, 0, len); 3583 newmsg->sadb_msg_version = PF_KEY_V2; 3584 newmsg->sadb_msg_type = SADB_ACQUIRE; 3585 newmsg->sadb_msg_errno = ENOENT; /* XXX */ 3586 newmsg->sadb_msg_satype = iph2->satype; 3587 newmsg->sadb_msg_len = PFKEY_UNIT64(len); 3588 newmsg->sadb_msg_reserved = 0; 3589 newmsg->sadb_msg_seq = iph2->seq; 3590 newmsg->sadb_msg_pid = (u_int32_t)getpid(); 3591 3592 /* send message */ 3593 len = pfkey_send(lcconf->sock_pfkey, newmsg, len); 3594 3595 racoon_free(newmsg); 3596 3597 return 0; 3598 } 3599 3600 #else 3601 3602 int pk_sendeacquire(struct ph2handle *iph2) 3603 { 3604 exit(1); 3605 } 3606 3607 #endif 3608 3609 /* 3610 * check if the algorithm is supported or not. 3611 * OUT 0: ok 3612 * -1: ng 3613 */ 3614 int 3615 pk_checkalg(class, calg, keylen) 3616 int class, calg, keylen; 3617 { 3618 int sup, error; 3619 u_int alg; 3620 struct sadb_alg alg0; 3621 3622 switch (algclass2doi(class)) { 3623 case IPSECDOI_PROTO_IPSEC_ESP: 3624 sup = SADB_EXT_SUPPORTED_ENCRYPT; 3625 break; 3626 case IPSECDOI_ATTR_AUTH: 3627 sup = SADB_EXT_SUPPORTED_AUTH; 3628 break; 3629 case IPSECDOI_PROTO_IPCOMP: 3630 plog(LLV_DEBUG, LOCATION, NULL, 3631 "no check of compression algorithm; " 3632 "not supported in sadb message.\n"); 3633 return 0; 3634 default: 3635 plog(LLV_ERROR, LOCATION, NULL, 3636 "invalid algorithm class.\n"); 3637 return -1; 3638 } 3639 alg = ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg)); 3640 if (alg == ~0) 3641 return -1; 3642 3643 if (keylen == 0) { 3644 if (ipsec_get_keylen(sup, alg, &alg0)) { 3645 plog(LLV_ERROR, LOCATION, NULL, 3646 "%s.\n", ipsec_strerror()); 3647 return -1; 3648 } 3649 keylen = alg0.sadb_alg_minbits; 3650 } 3651 3652 error = ipsec_check_keylen(sup, alg, keylen); 3653 if (error) 3654 plog(LLV_ERROR, LOCATION, NULL, 3655 "%s.\n", ipsec_strerror()); 3656 3657 return error; 3658 } 3659 3660 /* 3661 * differences with pfkey_recv() in libipsec/pfkey.c: 3662 * - never performs busy wait loop. 3663 * - returns NULL and set *lenp to negative on fatal failures 3664 * - returns NULL and set *lenp to non-negative on non-fatal failures 3665 * - returns non-NULL on success 3666 */ 3667 static struct sadb_msg * 3668 pk_recv(so, lenp) 3669 int so; 3670 int *lenp; 3671 { 3672 struct sadb_msg buf, *newmsg; 3673 int reallen; 3674 int retry = 0; 3675 3676 *lenp = -1; 3677 do 3678 { 3679 plog(LLV_DEBUG, LOCATION, NULL, "pk_recv: retry[%d] recv() \n", retry ); 3680 *lenp = recv(so, (caddr_t)&buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT); 3681 retry++; 3682 } 3683 while (*lenp < 0 && errno == EAGAIN && retry < 3); 3684 3685 if (*lenp < 0) 3686 return NULL; /*fatal*/ 3687 3688 else if (*lenp < sizeof(buf)) 3689 return NULL; 3690 3691 reallen = PFKEY_UNUNIT64(buf.sadb_msg_len); 3692 if (reallen < sizeof(buf)) { 3693 *lenp = -1; 3694 errno = EIO; 3695 return NULL; /*fatal*/ 3696 } 3697 if ((newmsg = racoon_calloc(1, reallen)) == NULL) 3698 return NULL; 3699 3700 *lenp = recv(so, (caddr_t)newmsg, reallen, MSG_PEEK); 3701 if (*lenp < 0) { 3702 racoon_free(newmsg); 3703 return NULL; /*fatal*/ 3704 } else if (*lenp != reallen) { 3705 racoon_free(newmsg); 3706 return NULL; 3707 } 3708 3709 *lenp = recv(so, (caddr_t)newmsg, reallen, 0); 3710 if (*lenp < 0) { 3711 racoon_free(newmsg); 3712 return NULL; /*fatal*/ 3713 } else if (*lenp != reallen) { 3714 racoon_free(newmsg); 3715 return NULL; 3716 } 3717 3718 return newmsg; 3719 } 3720 3721 /* see handler.h */ 3722 u_int32_t 3723 pk_getseq() 3724 { 3725 return eay_random(); 3726 } 3727 3728 static int 3729 addnewsp(mhp, local, remote) 3730 caddr_t *mhp; 3731 struct sockaddr *local, *remote; 3732 { 3733 struct secpolicy *new = NULL; 3734 struct sadb_address *saddr, *daddr; 3735 struct sadb_x_policy *xpl; 3736 struct sadb_lifetime *lt; 3737 u_int64_t created; 3738 3739 /* sanity check */ 3740 if (mhp[SADB_EXT_ADDRESS_SRC] == NULL 3741 || mhp[SADB_EXT_ADDRESS_DST] == NULL 3742 || mhp[SADB_X_EXT_POLICY] == NULL) { 3743 plog(LLV_ERROR, LOCATION, NULL, 3744 "inappropriate sadb spd management message passed.\n"); 3745 goto bad; 3746 } 3747 3748 saddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_SRC]; 3749 daddr = (struct sadb_address *)mhp[SADB_EXT_ADDRESS_DST]; 3750 xpl = (struct sadb_x_policy *)mhp[SADB_X_EXT_POLICY]; 3751 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 3752 if(lt != NULL) 3753 created = lt->sadb_lifetime_addtime; 3754 else 3755 created = 0; 3756 lt = (struct sadb_lifetime*)mhp[SADB_EXT_LIFETIME_HARD]; 3757 if(lt != NULL) 3758 created = lt->sadb_lifetime_addtime; 3759 else 3760 created = 0; 3761 3762 #ifdef __linux__ 3763 /* bsd skips over per-socket policies because there will be no 3764 * src and dst extensions in spddump messages. On Linux the only 3765 * way to achieve the same is check for policy id. 3766 */ 3767 if (xpl->sadb_x_policy_id % 8 >= 3) return 0; 3768 #endif 3769 3770 new = newsp(); 3771 if (new == NULL) { 3772 plog(LLV_ERROR, LOCATION, NULL, 3773 "failed to allocate buffer\n"); 3774 goto bad; 3775 } 3776 3777 new->spidx.dir = xpl->sadb_x_policy_dir; 3778 new->id = xpl->sadb_x_policy_id; 3779 new->policy = xpl->sadb_x_policy_type; 3780 new->req = NULL; 3781 3782 /* check policy */ 3783 switch (xpl->sadb_x_policy_type) { 3784 case IPSEC_POLICY_DISCARD: 3785 case IPSEC_POLICY_NONE: 3786 case IPSEC_POLICY_ENTRUST: 3787 case IPSEC_POLICY_BYPASS: 3788 break; 3789 3790 case IPSEC_POLICY_IPSEC: 3791 { 3792 int tlen; 3793 struct sadb_x_ipsecrequest *xisr; 3794 struct ipsecrequest **p_isr = &new->req; 3795 3796 /* validity check */ 3797 if (PFKEY_EXTLEN(xpl) < sizeof(*xpl)) { 3798 plog(LLV_ERROR, LOCATION, NULL, 3799 "invalid msg length.\n"); 3800 goto bad; 3801 } 3802 3803 tlen = PFKEY_EXTLEN(xpl) - sizeof(*xpl); 3804 xisr = (struct sadb_x_ipsecrequest *)(xpl + 1); 3805 3806 while (tlen > 0) { 3807 3808 /* length check */ 3809 if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) { 3810 plog(LLV_ERROR, LOCATION, NULL, 3811 "invalid msg length.\n"); 3812 goto bad; 3813 } 3814 3815 /* allocate request buffer */ 3816 *p_isr = newipsecreq(); 3817 if (*p_isr == NULL) { 3818 plog(LLV_ERROR, LOCATION, NULL, 3819 "failed to get new ipsecreq.\n"); 3820 goto bad; 3821 } 3822 3823 /* set values */ 3824 (*p_isr)->next = NULL; 3825 3826 switch (xisr->sadb_x_ipsecrequest_proto) { 3827 case IPPROTO_ESP: 3828 case IPPROTO_AH: 3829 case IPPROTO_IPCOMP: 3830 break; 3831 default: 3832 plog(LLV_ERROR, LOCATION, NULL, 3833 "invalid proto type: %u\n", 3834 xisr->sadb_x_ipsecrequest_proto); 3835 goto bad; 3836 } 3837 (*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto; 3838 3839 switch (xisr->sadb_x_ipsecrequest_mode) { 3840 case IPSEC_MODE_TRANSPORT: 3841 case IPSEC_MODE_TUNNEL: 3842 break; 3843 case IPSEC_MODE_ANY: 3844 default: 3845 plog(LLV_ERROR, LOCATION, NULL, 3846 "invalid mode: %u\n", 3847 xisr->sadb_x_ipsecrequest_mode); 3848 goto bad; 3849 } 3850 (*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode; 3851 3852 switch (xisr->sadb_x_ipsecrequest_level) { 3853 case IPSEC_LEVEL_DEFAULT: 3854 case IPSEC_LEVEL_USE: 3855 case IPSEC_LEVEL_REQUIRE: 3856 break; 3857 case IPSEC_LEVEL_UNIQUE: 3858 (*p_isr)->saidx.reqid = 3859 xisr->sadb_x_ipsecrequest_reqid; 3860 break; 3861 3862 default: 3863 plog(LLV_ERROR, LOCATION, NULL, 3864 "invalid level: %u\n", 3865 xisr->sadb_x_ipsecrequest_level); 3866 goto bad; 3867 } 3868 (*p_isr)->level = xisr->sadb_x_ipsecrequest_level; 3869 3870 /* set IP addresses if there */ 3871 if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) { 3872 struct sockaddr *paddr; 3873 3874 paddr = (struct sockaddr *)(xisr + 1); 3875 bcopy(paddr, &(*p_isr)->saidx.src, 3876 sysdep_sa_len(paddr)); 3877 3878 paddr = (struct sockaddr *)((caddr_t)paddr 3879 + sysdep_sa_len(paddr)); 3880 bcopy(paddr, &(*p_isr)->saidx.dst, 3881 sysdep_sa_len(paddr)); 3882 } 3883 3884 (*p_isr)->sp = new; 3885 3886 /* initialization for the next. */ 3887 p_isr = &(*p_isr)->next; 3888 tlen -= xisr->sadb_x_ipsecrequest_len; 3889 3890 /* validity check */ 3891 if (tlen < 0) { 3892 plog(LLV_ERROR, LOCATION, NULL, 3893 "becoming tlen < 0\n"); 3894 } 3895 3896 xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr 3897 + xisr->sadb_x_ipsecrequest_len); 3898 } 3899 } 3900 break; 3901 default: 3902 plog(LLV_ERROR, LOCATION, NULL, 3903 "invalid policy type.\n"); 3904 goto bad; 3905 } 3906 3907 #ifdef HAVE_PFKEY_POLICY_PRIORITY 3908 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3909 saddr + 1, 3910 daddr + 1, 3911 saddr->sadb_address_prefixlen, 3912 daddr->sadb_address_prefixlen, 3913 saddr->sadb_address_proto, 3914 xpl->sadb_x_policy_priority, 3915 created, 3916 &new->spidx); 3917 #else 3918 KEY_SETSECSPIDX(xpl->sadb_x_policy_dir, 3919 saddr + 1, 3920 daddr + 1, 3921 saddr->sadb_address_prefixlen, 3922 daddr->sadb_address_prefixlen, 3923 saddr->sadb_address_proto, 3924 created, 3925 &new->spidx); 3926 #endif 3927 3928 #ifdef HAVE_SECCTX 3929 if (mhp[SADB_X_EXT_SEC_CTX] != NULL) { 3930 struct sadb_x_sec_ctx *ctx; 3931 3932 ctx = (struct sadb_x_sec_ctx *)mhp[SADB_X_EXT_SEC_CTX]; 3933 new->spidx.sec_ctx.ctx_alg = ctx->sadb_x_ctx_alg; 3934 new->spidx.sec_ctx.ctx_doi = ctx->sadb_x_ctx_doi; 3935 new->spidx.sec_ctx.ctx_strlen = ctx->sadb_x_ctx_len; 3936 memcpy(new->spidx.sec_ctx.ctx_str,ctx + 1,ctx->sadb_x_ctx_len); 3937 } 3938 #endif /* HAVE_SECCTX */ 3939 3940 /* Set local and remote hints for that SP, if available */ 3941 if (local && remote) { 3942 new->local = dupsaddr(local); 3943 new->remote = dupsaddr(remote); 3944 } 3945 3946 inssp(new); 3947 3948 return 0; 3949 bad: 3950 if (new != NULL) { 3951 if (new->req != NULL) 3952 racoon_free(new->req); 3953 racoon_free(new); 3954 } 3955 return -1; 3956 } 3957 3958 /* proto/mode/src->dst spi */ 3959 const char * 3960 sadbsecas2str(src, dst, proto, spi, mode) 3961 struct sockaddr *src, *dst; 3962 int proto; 3963 u_int32_t spi; 3964 int mode; 3965 { 3966 static char buf[256]; 3967 u_int doi_proto, doi_mode = 0; 3968 char *p; 3969 int blen, i; 3970 3971 doi_proto = pfkey2ipsecdoi_proto(proto); 3972 if (doi_proto == ~0) 3973 return NULL; 3974 if (mode) { 3975 doi_mode = pfkey2ipsecdoi_mode(mode); 3976 if (doi_mode == ~0) 3977 return NULL; 3978 } 3979 3980 blen = sizeof(buf) - 1; 3981 p = buf; 3982 3983 i = snprintf(p, blen, "%s%s%s ", 3984 s_ipsecdoi_proto(doi_proto), 3985 mode ? "/" : "", 3986 mode ? s_ipsecdoi_encmode(doi_mode) : ""); 3987 if (i < 0 || i >= blen) 3988 return NULL; 3989 p += i; 3990 blen -= i; 3991 3992 i = snprintf(p, blen, "%s->", saddr2str(src)); 3993 if (i < 0 || i >= blen) 3994 return NULL; 3995 p += i; 3996 blen -= i; 3997 3998 i = snprintf(p, blen, "%s ", saddr2str(dst)); 3999 if (i < 0 || i >= blen) 4000 return NULL; 4001 p += i; 4002 blen -= i; 4003 4004 if (spi) { 4005 snprintf(p, blen, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi), 4006 (unsigned long)ntohl(spi)); 4007 } 4008 4009 return buf; 4010 } 4011