1 /* $NetBSD: isakmp_ident.c,v 1.13 2009/09/18 10:31:11 tteras Exp $ */ 2 3 /* Id: isakmp_ident.c,v 1.21 2006/04/06 16:46:08 manubsd 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 /* Identity Protecion Exchange (Main Mode) */ 35 36 #include "config.h" 37 38 #include <sys/types.h> 39 #include <sys/param.h> 40 41 #include <stdlib.h> 42 #include <stdio.h> 43 #include <string.h> 44 #include <errno.h> 45 #if TIME_WITH_SYS_TIME 46 # include <sys/time.h> 47 # include <time.h> 48 #else 49 # if HAVE_SYS_TIME_H 50 # include <sys/time.h> 51 # else 52 # include <time.h> 53 # endif 54 #endif 55 56 #include "var.h" 57 #include "misc.h" 58 #include "vmbuf.h" 59 #include "plog.h" 60 #include "sockmisc.h" 61 #include "schedule.h" 62 #include "debug.h" 63 64 #include "localconf.h" 65 #include "remoteconf.h" 66 #include "isakmp_var.h" 67 #include "isakmp.h" 68 #include "evt.h" 69 #include "oakley.h" 70 #include "handler.h" 71 #include "ipsec_doi.h" 72 #include "crypto_openssl.h" 73 #include "pfkey.h" 74 #include "isakmp_ident.h" 75 #include "isakmp_inf.h" 76 #include "vendorid.h" 77 78 #ifdef ENABLE_NATT 79 #include "nattraversal.h" 80 #endif 81 #ifdef HAVE_GSSAPI 82 #include "gssapi.h" 83 #endif 84 #ifdef ENABLE_HYBRID 85 #include <resolv.h> 86 #include "isakmp_xauth.h" 87 #include "isakmp_cfg.h" 88 #endif 89 #ifdef ENABLE_FRAG 90 #include "isakmp_frag.h" 91 #endif 92 93 static vchar_t *ident_ir2mx __P((struct ph1handle *)); 94 static vchar_t *ident_ir3mx __P((struct ph1handle *)); 95 static int ident_recv_n __P((struct ph1handle *, struct isakmp_gen *)); 96 97 /* %%% 98 * begin Identity Protection Mode as initiator. 99 */ 100 /* 101 * send to responder 102 * psk: HDR, SA 103 * sig: HDR, SA 104 * rsa: HDR, SA 105 * rev: HDR, SA 106 */ 107 int 108 ident_i1send(iph1, msg) 109 struct ph1handle *iph1; 110 vchar_t *msg; /* must be null */ 111 { 112 struct payload_list *plist = NULL; 113 int error = -1; 114 #ifdef ENABLE_NATT 115 vchar_t *vid_natt[MAX_NATT_VID_COUNT] = { NULL }; 116 int i; 117 #endif 118 #ifdef ENABLE_HYBRID 119 vchar_t *vid_xauth = NULL; 120 vchar_t *vid_unity = NULL; 121 #endif 122 #ifdef ENABLE_FRAG 123 vchar_t *vid_frag = NULL; 124 #endif 125 #ifdef ENABLE_DPD 126 vchar_t *vid_dpd = NULL; 127 #endif 128 /* validity check */ 129 if (msg != NULL) { 130 plog(LLV_ERROR, LOCATION, NULL, 131 "msg has to be NULL in this function.\n"); 132 goto end; 133 } 134 if (iph1->status != PHASE1ST_START) { 135 plog(LLV_ERROR, LOCATION, NULL, 136 "status mismatched %d.\n", iph1->status); 137 goto end; 138 } 139 140 /* create isakmp index */ 141 memset(&iph1->index, 0, sizeof(iph1->index)); 142 isakmp_newcookie((caddr_t)&iph1->index, iph1->remote, iph1->local); 143 144 /* create SA payload for my proposal */ 145 iph1->sa = ipsecdoi_setph1proposal(iph1->rmconf, 146 iph1->rmconf->proposal); 147 if (iph1->sa == NULL) 148 goto end; 149 150 /* set SA payload to propose */ 151 plist = isakmp_plist_append(plist, iph1->sa, ISAKMP_NPTYPE_SA); 152 153 #ifdef ENABLE_NATT 154 /* set VID payload for NAT-T if NAT-T support allowed in the config file */ 155 if (iph1->rmconf->nat_traversal) 156 plist = isakmp_plist_append_natt_vids(plist, vid_natt); 157 #endif 158 #ifdef ENABLE_HYBRID 159 /* Do we need Xauth VID? */ 160 switch (iph1->rmconf->proposal->authmethod) { 161 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I: 162 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I: 163 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I: 164 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I: 165 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I: 166 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I: 167 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I: 168 if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL) 169 plog(LLV_ERROR, LOCATION, NULL, 170 "Xauth vendor ID generation failed\n"); 171 else 172 plist = isakmp_plist_append(plist, 173 vid_xauth, ISAKMP_NPTYPE_VID); 174 175 if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL) 176 plog(LLV_ERROR, LOCATION, NULL, 177 "Unity vendor ID generation failed\n"); 178 else 179 plist = isakmp_plist_append(plist, 180 vid_unity, ISAKMP_NPTYPE_VID); 181 break; 182 default: 183 break; 184 } 185 #endif 186 #ifdef ENABLE_FRAG 187 if (iph1->rmconf->ike_frag) { 188 if ((vid_frag = set_vendorid(VENDORID_FRAG)) == NULL) { 189 plog(LLV_ERROR, LOCATION, NULL, 190 "Frag vendorID construction failed\n"); 191 } else { 192 vid_frag = isakmp_frag_addcap(vid_frag, 193 VENDORID_FRAG_IDENT); 194 plist = isakmp_plist_append(plist, 195 vid_frag, ISAKMP_NPTYPE_VID); 196 } 197 } 198 #endif 199 #ifdef ENABLE_DPD 200 if(iph1->rmconf->dpd){ 201 vid_dpd = set_vendorid(VENDORID_DPD); 202 if (vid_dpd != NULL) 203 plist = isakmp_plist_append(plist, vid_dpd, 204 ISAKMP_NPTYPE_VID); 205 } 206 #endif 207 208 iph1->sendbuf = isakmp_plist_set_all (&plist, iph1); 209 210 #ifdef HAVE_PRINT_ISAKMP_C 211 isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0); 212 #endif 213 214 /* send the packet, add to the schedule to resend */ 215 if (isakmp_ph1send(iph1) == -1) 216 goto end; 217 218 iph1->status = PHASE1ST_MSG1SENT; 219 220 error = 0; 221 222 end: 223 #ifdef ENABLE_FRAG 224 if (vid_frag) 225 vfree(vid_frag); 226 #endif 227 #ifdef ENABLE_NATT 228 for (i = 0; i < MAX_NATT_VID_COUNT && vid_natt[i] != NULL; i++) 229 vfree(vid_natt[i]); 230 #endif 231 #ifdef ENABLE_HYBRID 232 if (vid_xauth != NULL) 233 vfree(vid_xauth); 234 if (vid_unity != NULL) 235 vfree(vid_unity); 236 #endif 237 #ifdef ENABLE_DPD 238 if (vid_dpd != NULL) 239 vfree(vid_dpd); 240 #endif 241 242 return error; 243 } 244 245 /* 246 * receive from responder 247 * psk: HDR, SA 248 * sig: HDR, SA 249 * rsa: HDR, SA 250 * rev: HDR, SA 251 */ 252 int 253 ident_i2recv(iph1, msg) 254 struct ph1handle *iph1; 255 vchar_t *msg; 256 { 257 vchar_t *pbuf = NULL; 258 struct isakmp_parse_t *pa; 259 vchar_t *satmp = NULL; 260 int error = -1; 261 262 /* validity check */ 263 if (iph1->status != PHASE1ST_MSG1SENT) { 264 plog(LLV_ERROR, LOCATION, NULL, 265 "status mismatched %d.\n", iph1->status); 266 goto end; 267 } 268 269 /* validate the type of next payload */ 270 /* 271 * NOTE: RedCreek(as responder) attaches N[responder-lifetime] here, 272 * if proposal-lifetime > lifetime-redcreek-wants. 273 * (see doi-08 4.5.4) 274 * => According to the seciton 4.6.3 in RFC 2407, This is illegal. 275 * NOTE: we do not really care about ordering of VID and N. 276 * does it matters? 277 * NOTE: even if there's multiple VID/N, we'll ignore them. 278 */ 279 pbuf = isakmp_parse(msg); 280 if (pbuf == NULL) 281 goto end; 282 pa = (struct isakmp_parse_t *)pbuf->v; 283 284 /* SA payload is fixed postion */ 285 if (pa->type != ISAKMP_NPTYPE_SA) { 286 plog(LLV_ERROR, LOCATION, iph1->remote, 287 "received invalid next payload type %d, " 288 "expecting %d.\n", 289 pa->type, ISAKMP_NPTYPE_SA); 290 goto end; 291 } 292 if (isakmp_p2ph(&satmp, pa->ptr) < 0) 293 goto end; 294 pa++; 295 296 for (/*nothing*/; 297 pa->type != ISAKMP_NPTYPE_NONE; 298 pa++) { 299 300 switch (pa->type) { 301 case ISAKMP_NPTYPE_VID: 302 handle_vendorid(iph1, pa->ptr); 303 break; 304 default: 305 /* don't send information, see ident_r1recv() */ 306 plog(LLV_ERROR, LOCATION, iph1->remote, 307 "ignore the packet, " 308 "received unexpecting payload type %d.\n", 309 pa->type); 310 goto end; 311 } 312 } 313 314 #ifdef ENABLE_NATT 315 if (NATT_AVAILABLE(iph1)) 316 plog(LLV_INFO, LOCATION, iph1->remote, 317 "Selected NAT-T version: %s\n", 318 vid_string_by_id(iph1->natt_options->version)); 319 #endif 320 321 /* check SA payload and set approval SA for use */ 322 if (ipsecdoi_checkph1proposal(satmp, iph1) < 0) { 323 plog(LLV_ERROR, LOCATION, iph1->remote, 324 "failed to get valid proposal.\n"); 325 /* XXX send information */ 326 goto end; 327 } 328 VPTRINIT(iph1->sa_ret); 329 330 iph1->status = PHASE1ST_MSG2RECEIVED; 331 332 error = 0; 333 334 end: 335 if (pbuf) 336 vfree(pbuf); 337 if (satmp) 338 vfree(satmp); 339 return error; 340 } 341 342 /* 343 * send to responder 344 * psk: HDR, KE, Ni 345 * sig: HDR, KE, Ni 346 * gssapi: HDR, KE, Ni, GSSi 347 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r 348 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i, 349 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i] 350 */ 351 int 352 ident_i2send(iph1, msg) 353 struct ph1handle *iph1; 354 vchar_t *msg; 355 { 356 int error = -1; 357 358 /* validity check */ 359 if (iph1->status != PHASE1ST_MSG2RECEIVED) { 360 plog(LLV_ERROR, LOCATION, NULL, 361 "status mismatched %d.\n", iph1->status); 362 goto end; 363 } 364 365 /* fix isakmp index */ 366 memcpy(&iph1->index.r_ck, &((struct isakmp *)msg->v)->r_ck, 367 sizeof(cookie_t)); 368 369 /* generate DH public value */ 370 if (oakley_dh_generate(iph1->approval->dhgrp, 371 &iph1->dhpub, &iph1->dhpriv) < 0) 372 goto end; 373 374 /* generate NONCE value */ 375 iph1->nonce = eay_set_random(iph1->rmconf->nonce_size); 376 if (iph1->nonce == NULL) 377 goto end; 378 379 #ifdef HAVE_GSSAPI 380 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB && 381 gssapi_get_itoken(iph1, NULL) < 0) 382 goto end; 383 #endif 384 385 /* create buffer to send isakmp payload */ 386 iph1->sendbuf = ident_ir2mx(iph1); 387 if (iph1->sendbuf == NULL) 388 goto end; 389 390 #ifdef HAVE_PRINT_ISAKMP_C 391 isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0); 392 #endif 393 394 /* send the packet, add to the schedule to resend */ 395 if (isakmp_ph1send(iph1) == -1) 396 goto end; 397 398 /* the sending message is added to the received-list. */ 399 if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) { 400 plog(LLV_ERROR , LOCATION, NULL, 401 "failed to add a response packet to the tree.\n"); 402 goto end; 403 } 404 405 iph1->status = PHASE1ST_MSG2SENT; 406 407 error = 0; 408 409 end: 410 return error; 411 } 412 413 /* 414 * receive from responder 415 * psk: HDR, KE, Nr 416 * sig: HDR, KE, Nr [, CR ] 417 * gssapi: HDR, KE, Nr, GSSr 418 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i 419 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r, 420 */ 421 int 422 ident_i3recv(iph1, msg) 423 struct ph1handle *iph1; 424 vchar_t *msg; 425 { 426 vchar_t *pbuf = NULL; 427 struct isakmp_parse_t *pa; 428 int error = -1; 429 #ifdef HAVE_GSSAPI 430 vchar_t *gsstoken = NULL; 431 #endif 432 #ifdef ENABLE_NATT 433 vchar_t *natd_received; 434 int natd_seq = 0, natd_verified; 435 #endif 436 437 /* validity check */ 438 if (iph1->status != PHASE1ST_MSG2SENT) { 439 plog(LLV_ERROR, LOCATION, NULL, 440 "status mismatched %d.\n", iph1->status); 441 goto end; 442 } 443 444 /* validate the type of next payload */ 445 pbuf = isakmp_parse(msg); 446 if (pbuf == NULL) 447 goto end; 448 449 for (pa = (struct isakmp_parse_t *)pbuf->v; 450 pa->type != ISAKMP_NPTYPE_NONE; 451 pa++) { 452 453 switch (pa->type) { 454 case ISAKMP_NPTYPE_KE: 455 if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0) 456 goto end; 457 break; 458 case ISAKMP_NPTYPE_NONCE: 459 if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0) 460 goto end; 461 break; 462 case ISAKMP_NPTYPE_VID: 463 handle_vendorid(iph1, pa->ptr); 464 break; 465 case ISAKMP_NPTYPE_CR: 466 if (oakley_savecr(iph1, pa->ptr) < 0) 467 goto end; 468 break; 469 #ifdef HAVE_GSSAPI 470 case ISAKMP_NPTYPE_GSS: 471 if (isakmp_p2ph(&gsstoken, pa->ptr) < 0) 472 goto end; 473 gssapi_save_received_token(iph1, gsstoken); 474 break; 475 #endif 476 477 #ifdef ENABLE_NATT 478 case ISAKMP_NPTYPE_NATD_DRAFT: 479 case ISAKMP_NPTYPE_NATD_RFC: 480 if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL && 481 pa->type == iph1->natt_options->payload_nat_d) { 482 natd_received = NULL; 483 if (isakmp_p2ph (&natd_received, pa->ptr) < 0) 484 goto end; 485 486 /* set both bits first so that we can clear them 487 upon verifying hashes */ 488 if (natd_seq == 0) 489 iph1->natt_flags |= NAT_DETECTED; 490 491 /* this function will clear appropriate bits bits 492 from iph1->natt_flags */ 493 natd_verified = natt_compare_addr_hash (iph1, 494 natd_received, natd_seq++); 495 496 plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n", 497 natd_seq - 1, 498 natd_verified ? "verified" : "doesn't match"); 499 500 vfree (natd_received); 501 break; 502 } 503 /* passthrough to default... */ 504 #endif 505 506 default: 507 /* don't send information, see ident_r1recv() */ 508 plog(LLV_ERROR, LOCATION, iph1->remote, 509 "ignore the packet, " 510 "received unexpecting payload type %d.\n", 511 pa->type); 512 goto end; 513 } 514 } 515 516 #ifdef ENABLE_NATT 517 if (NATT_AVAILABLE(iph1)) { 518 plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n", 519 iph1->natt_flags & NAT_DETECTED ? 520 "detected:" : "not detected", 521 iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "", 522 iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : ""); 523 if (iph1->natt_flags & NAT_DETECTED) 524 natt_float_ports (iph1); 525 } 526 #endif 527 528 /* payload existency check */ 529 if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) { 530 plog(LLV_ERROR, LOCATION, iph1->remote, 531 "few isakmp message received.\n"); 532 goto end; 533 } 534 535 if (oakley_checkcr(iph1) < 0) { 536 /* Ignore this error in order to be interoperability. */ 537 ; 538 } 539 540 iph1->status = PHASE1ST_MSG3RECEIVED; 541 542 error = 0; 543 544 end: 545 #ifdef HAVE_GSSAPI 546 if (gsstoken) 547 vfree(gsstoken); 548 #endif 549 if (pbuf) 550 vfree(pbuf); 551 if (error) { 552 VPTRINIT(iph1->dhpub_p); 553 VPTRINIT(iph1->nonce_p); 554 VPTRINIT(iph1->id_p); 555 VPTRINIT(iph1->cr_p); 556 } 557 558 return error; 559 } 560 561 /* 562 * send to responder 563 * psk: HDR*, IDi1, HASH_I 564 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I 565 * gssapi: HDR*, IDi1, < Gssi(n) | HASH_I > 566 * rsa: HDR*, HASH_I 567 * rev: HDR*, HASH_I 568 */ 569 int 570 ident_i3send(iph1, msg0) 571 struct ph1handle *iph1; 572 vchar_t *msg0; 573 { 574 int error = -1; 575 int dohash = 1; 576 #ifdef HAVE_GSSAPI 577 int len; 578 #endif 579 580 /* validity check */ 581 if (iph1->status != PHASE1ST_MSG3RECEIVED) { 582 plog(LLV_ERROR, LOCATION, NULL, 583 "status mismatched %d.\n", iph1->status); 584 goto end; 585 } 586 587 /* compute sharing secret of DH */ 588 if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub, 589 iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0) 590 goto end; 591 592 /* generate SKEYIDs & IV & final cipher key */ 593 if (oakley_skeyid(iph1) < 0) 594 goto end; 595 if (oakley_skeyid_dae(iph1) < 0) 596 goto end; 597 if (oakley_compute_enckey(iph1) < 0) 598 goto end; 599 if (oakley_newiv(iph1) < 0) 600 goto end; 601 602 /* make ID payload into isakmp status */ 603 if (ipsecdoi_setid1(iph1) < 0) 604 goto end; 605 606 #ifdef HAVE_GSSAPI 607 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB && 608 gssapi_more_tokens(iph1)) { 609 plog(LLV_DEBUG, LOCATION, NULL, "calling get_itoken\n"); 610 if (gssapi_get_itoken(iph1, &len) < 0) 611 goto end; 612 if (len != 0) 613 dohash = 0; 614 } 615 #endif 616 617 /* generate HASH to send */ 618 if (dohash) { 619 iph1->hash = oakley_ph1hash_common(iph1, GENERATE); 620 if (iph1->hash == NULL) 621 goto end; 622 } else 623 iph1->hash = NULL; 624 625 /* set encryption flag */ 626 iph1->flags |= ISAKMP_FLAG_E; 627 628 /* create HDR;ID;HASH payload */ 629 iph1->sendbuf = ident_ir3mx(iph1); 630 if (iph1->sendbuf == NULL) 631 goto end; 632 633 /* send the packet, add to the schedule to resend */ 634 if (isakmp_ph1send(iph1) == -1) 635 goto end; 636 637 /* the sending message is added to the received-list. */ 638 if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg0) == -1) { 639 plog(LLV_ERROR , LOCATION, NULL, 640 "failed to add a response packet to the tree.\n"); 641 goto end; 642 } 643 644 /* see handler.h about IV synchronization. */ 645 memcpy(iph1->ivm->ive->v, iph1->ivm->iv->v, iph1->ivm->iv->l); 646 647 iph1->status = PHASE1ST_MSG3SENT; 648 649 error = 0; 650 651 end: 652 return error; 653 } 654 655 /* 656 * receive from responder 657 * psk: HDR*, IDr1, HASH_R 658 * sig: HDR*, IDr1, [ CERT, ] SIG_R 659 * gssapi: HDR*, IDr1, < GSSr(n) | HASH_R > 660 * rsa: HDR*, HASH_R 661 * rev: HDR*, HASH_R 662 */ 663 int 664 ident_i4recv(iph1, msg0) 665 struct ph1handle *iph1; 666 vchar_t *msg0; 667 { 668 vchar_t *pbuf = NULL; 669 struct isakmp_parse_t *pa; 670 vchar_t *msg = NULL; 671 int error = -1; 672 int type; 673 #ifdef HAVE_GSSAPI 674 vchar_t *gsstoken = NULL; 675 #endif 676 677 /* validity check */ 678 if (iph1->status != PHASE1ST_MSG3SENT) { 679 plog(LLV_ERROR, LOCATION, NULL, 680 "status mismatched %d.\n", iph1->status); 681 goto end; 682 } 683 684 /* decrypting */ 685 if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) { 686 plog(LLV_ERROR, LOCATION, iph1->remote, 687 "ignore the packet, " 688 "expecting the packet encrypted.\n"); 689 goto end; 690 } 691 msg = oakley_do_decrypt(iph1, msg0, iph1->ivm->iv, iph1->ivm->ive); 692 if (msg == NULL) 693 goto end; 694 695 /* validate the type of next payload */ 696 pbuf = isakmp_parse(msg); 697 if (pbuf == NULL) 698 goto end; 699 700 iph1->pl_hash = NULL; 701 702 for (pa = (struct isakmp_parse_t *)pbuf->v; 703 pa->type != ISAKMP_NPTYPE_NONE; 704 pa++) { 705 706 switch (pa->type) { 707 case ISAKMP_NPTYPE_ID: 708 if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0) 709 goto end; 710 break; 711 case ISAKMP_NPTYPE_HASH: 712 iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr; 713 break; 714 case ISAKMP_NPTYPE_CERT: 715 if (oakley_savecert(iph1, pa->ptr) < 0) 716 goto end; 717 break; 718 case ISAKMP_NPTYPE_SIG: 719 if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0) 720 goto end; 721 break; 722 #ifdef HAVE_GSSAPI 723 case ISAKMP_NPTYPE_GSS: 724 if (isakmp_p2ph(&gsstoken, pa->ptr) < 0) 725 goto end; 726 gssapi_save_received_token(iph1, gsstoken); 727 break; 728 #endif 729 case ISAKMP_NPTYPE_VID: 730 handle_vendorid(iph1, pa->ptr); 731 break; 732 case ISAKMP_NPTYPE_N: 733 ident_recv_n(iph1, pa->ptr); 734 break; 735 default: 736 /* don't send information, see ident_r1recv() */ 737 plog(LLV_ERROR, LOCATION, iph1->remote, 738 "ignore the packet, " 739 "received unexpecting payload type %d.\n", 740 pa->type); 741 goto end; 742 } 743 } 744 745 /* payload existency check */ 746 747 /* verify identifier */ 748 if (ipsecdoi_checkid1(iph1) != 0) { 749 plog(LLV_ERROR, LOCATION, iph1->remote, 750 "invalid ID payload.\n"); 751 goto end; 752 } 753 754 /* validate authentication value */ 755 #ifdef HAVE_GSSAPI 756 if (gsstoken == NULL) { 757 #endif 758 type = oakley_validate_auth(iph1); 759 if (type != 0) { 760 if (type == -1) { 761 /* msg printed inner oakley_validate_auth() */ 762 goto end; 763 } 764 evt_phase1(iph1, EVT_PHASE1_AUTH_FAILED, NULL); 765 isakmp_info_send_n1(iph1, type, NULL); 766 goto end; 767 } 768 #ifdef HAVE_GSSAPI 769 } 770 #endif 771 772 /* 773 * XXX: Should we do compare two addresses, ph1handle's and ID 774 * payload's. 775 */ 776 777 plog(LLV_DEBUG, LOCATION, iph1->remote, "peer's ID:"); 778 plogdump(LLV_DEBUG, iph1->id_p->v, iph1->id_p->l); 779 780 /* see handler.h about IV synchronization. */ 781 memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->ive->l); 782 783 /* 784 * If we got a GSS token, we need to this roundtrip again. 785 */ 786 #ifdef HAVE_GSSAPI 787 iph1->status = gsstoken != 0 ? PHASE1ST_MSG3RECEIVED : 788 PHASE1ST_MSG4RECEIVED; 789 #else 790 iph1->status = PHASE1ST_MSG4RECEIVED; 791 #endif 792 793 error = 0; 794 795 end: 796 if (pbuf) 797 vfree(pbuf); 798 if (msg) 799 vfree(msg); 800 #ifdef HAVE_GSSAPI 801 if (gsstoken) 802 vfree(gsstoken); 803 #endif 804 805 if (error) { 806 VPTRINIT(iph1->id_p); 807 VPTRINIT(iph1->cert_p); 808 VPTRINIT(iph1->crl_p); 809 VPTRINIT(iph1->sig_p); 810 } 811 812 return error; 813 } 814 815 /* 816 * status update and establish isakmp sa. 817 */ 818 int 819 ident_i4send(iph1, msg) 820 struct ph1handle *iph1; 821 vchar_t *msg; 822 { 823 int error = -1; 824 825 /* validity check */ 826 if (iph1->status != PHASE1ST_MSG4RECEIVED) { 827 plog(LLV_ERROR, LOCATION, NULL, 828 "status mismatched %d.\n", iph1->status); 829 goto end; 830 } 831 832 /* see handler.h about IV synchronization. */ 833 memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->iv->l); 834 835 iph1->status = PHASE1ST_ESTABLISHED; 836 837 error = 0; 838 839 end: 840 return error; 841 } 842 843 /* 844 * receive from initiator 845 * psk: HDR, SA 846 * sig: HDR, SA 847 * rsa: HDR, SA 848 * rev: HDR, SA 849 */ 850 int 851 ident_r1recv(iph1, msg) 852 struct ph1handle *iph1; 853 vchar_t *msg; 854 { 855 vchar_t *pbuf = NULL; 856 struct isakmp_parse_t *pa; 857 int error = -1; 858 int vid_numeric; 859 860 /* validity check */ 861 if (iph1->status != PHASE1ST_START) { 862 plog(LLV_ERROR, LOCATION, NULL, 863 "status mismatched %d.\n", iph1->status); 864 goto end; 865 } 866 867 /* validate the type of next payload */ 868 /* 869 * NOTE: XXX even if multiple VID, we'll silently ignore those. 870 */ 871 pbuf = isakmp_parse(msg); 872 if (pbuf == NULL) 873 goto end; 874 pa = (struct isakmp_parse_t *)pbuf->v; 875 876 /* check the position of SA payload */ 877 if (pa->type != ISAKMP_NPTYPE_SA) { 878 plog(LLV_ERROR, LOCATION, iph1->remote, 879 "received invalid next payload type %d, " 880 "expecting %d.\n", 881 pa->type, ISAKMP_NPTYPE_SA); 882 goto end; 883 } 884 if (isakmp_p2ph(&iph1->sa, pa->ptr) < 0) 885 goto end; 886 pa++; 887 888 for (/*nothing*/; 889 pa->type != ISAKMP_NPTYPE_NONE; 890 pa++) { 891 892 switch (pa->type) { 893 case ISAKMP_NPTYPE_VID: 894 vid_numeric = handle_vendorid(iph1, pa->ptr); 895 #ifdef ENABLE_FRAG 896 if ((vid_numeric == VENDORID_FRAG) && 897 (vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_IDENT)) 898 iph1->frag = 1; 899 #endif 900 break; 901 default: 902 /* 903 * We don't send information to the peer even 904 * if we received malformed packet. Because we 905 * can't distinguish the malformed packet and 906 * the re-sent packet. And we do same behavior 907 * when we expect encrypted packet. 908 */ 909 plog(LLV_ERROR, LOCATION, iph1->remote, 910 "ignore the packet, " 911 "received unexpecting payload type %d.\n", 912 pa->type); 913 goto end; 914 } 915 } 916 917 #ifdef ENABLE_NATT 918 if (NATT_AVAILABLE(iph1)) 919 plog(LLV_INFO, LOCATION, iph1->remote, 920 "Selected NAT-T version: %s\n", 921 vid_string_by_id(iph1->natt_options->version)); 922 #endif 923 924 /* check SA payload and set approval SA for use */ 925 if (ipsecdoi_checkph1proposal(iph1->sa, iph1) < 0) { 926 plog(LLV_ERROR, LOCATION, iph1->remote, 927 "failed to get valid proposal.\n"); 928 /* XXX send information */ 929 goto end; 930 } 931 932 iph1->status = PHASE1ST_MSG1RECEIVED; 933 934 error = 0; 935 936 end: 937 if (pbuf) 938 vfree(pbuf); 939 if (error) { 940 VPTRINIT(iph1->sa); 941 } 942 943 return error; 944 } 945 946 /* 947 * send to initiator 948 * psk: HDR, SA 949 * sig: HDR, SA 950 * rsa: HDR, SA 951 * rev: HDR, SA 952 */ 953 int 954 ident_r1send(iph1, msg) 955 struct ph1handle *iph1; 956 vchar_t *msg; 957 { 958 struct payload_list *plist = NULL; 959 int error = -1; 960 vchar_t *gss_sa = NULL; 961 #ifdef HAVE_GSSAPI 962 int free_gss_sa = 0; 963 #endif 964 #ifdef ENABLE_NATT 965 vchar_t *vid_natt = NULL; 966 #endif 967 #ifdef ENABLE_HYBRID 968 vchar_t *vid_xauth = NULL; 969 vchar_t *vid_unity = NULL; 970 #endif 971 #ifdef ENABLE_DPD 972 vchar_t *vid_dpd = NULL; 973 #endif 974 #ifdef ENABLE_FRAG 975 vchar_t *vid_frag = NULL; 976 #endif 977 978 /* validity check */ 979 if (iph1->status != PHASE1ST_MSG1RECEIVED) { 980 plog(LLV_ERROR, LOCATION, NULL, 981 "status mismatched %d.\n", iph1->status); 982 goto end; 983 } 984 985 /* set responder's cookie */ 986 isakmp_newcookie((caddr_t)&iph1->index.r_ck, iph1->remote, iph1->local); 987 988 #ifdef HAVE_GSSAPI 989 if (iph1->approval->gssid != NULL) { 990 gss_sa = ipsecdoi_setph1proposal(iph1->rmconf, iph1->approval); 991 if (gss_sa != iph1->sa_ret) 992 free_gss_sa = 1; 993 } else 994 #endif 995 gss_sa = iph1->sa_ret; 996 997 /* set SA payload to reply */ 998 plist = isakmp_plist_append(plist, gss_sa, ISAKMP_NPTYPE_SA); 999 1000 #ifdef ENABLE_HYBRID 1001 if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) { 1002 plog (LLV_INFO, LOCATION, NULL, "Adding xauth VID payload.\n"); 1003 if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL) { 1004 plog(LLV_ERROR, LOCATION, NULL, 1005 "Cannot create Xauth vendor ID\n"); 1006 goto end; 1007 } 1008 plist = isakmp_plist_append(plist, 1009 vid_xauth, ISAKMP_NPTYPE_VID); 1010 } 1011 1012 if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) { 1013 if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL) { 1014 plog(LLV_ERROR, LOCATION, NULL, 1015 "Cannot create Unity vendor ID\n"); 1016 goto end; 1017 } 1018 plist = isakmp_plist_append(plist, 1019 vid_unity, ISAKMP_NPTYPE_VID); 1020 } 1021 #endif 1022 #ifdef ENABLE_NATT 1023 /* Has the peer announced NAT-T? */ 1024 if (NATT_AVAILABLE(iph1)) 1025 vid_natt = set_vendorid(iph1->natt_options->version); 1026 1027 if (vid_natt) 1028 plist = isakmp_plist_append(plist, vid_natt, ISAKMP_NPTYPE_VID); 1029 #endif 1030 #ifdef ENABLE_DPD 1031 if (iph1->dpd_support) { 1032 vid_dpd = set_vendorid(VENDORID_DPD); 1033 if (vid_dpd != NULL) 1034 plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID); 1035 } 1036 #endif 1037 #ifdef ENABLE_FRAG 1038 if (iph1->frag) { 1039 vid_frag = set_vendorid(VENDORID_FRAG); 1040 if (vid_frag != NULL) 1041 vid_frag = isakmp_frag_addcap(vid_frag, 1042 VENDORID_FRAG_IDENT); 1043 if (vid_frag == NULL) 1044 plog(LLV_ERROR, LOCATION, NULL, 1045 "Frag vendorID construction failed\n"); 1046 else 1047 plist = isakmp_plist_append(plist, 1048 vid_frag, ISAKMP_NPTYPE_VID); 1049 } 1050 #endif 1051 1052 iph1->sendbuf = isakmp_plist_set_all (&plist, iph1); 1053 1054 #ifdef HAVE_PRINT_ISAKMP_C 1055 isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0); 1056 #endif 1057 1058 /* send the packet, add to the schedule to resend */ 1059 if (isakmp_ph1send(iph1) == -1) 1060 goto end; 1061 1062 /* the sending message is added to the received-list. */ 1063 if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) { 1064 plog(LLV_ERROR , LOCATION, NULL, 1065 "failed to add a response packet to the tree.\n"); 1066 goto end; 1067 } 1068 1069 iph1->status = PHASE1ST_MSG1SENT; 1070 1071 error = 0; 1072 1073 end: 1074 #ifdef HAVE_GSSAPI 1075 if (free_gss_sa) 1076 vfree(gss_sa); 1077 #endif 1078 #ifdef ENABLE_NATT 1079 if (vid_natt) 1080 vfree(vid_natt); 1081 #endif 1082 #ifdef ENABLE_HYBRID 1083 if (vid_xauth != NULL) 1084 vfree(vid_xauth); 1085 if (vid_unity != NULL) 1086 vfree(vid_unity); 1087 #endif 1088 #ifdef ENABLE_DPD 1089 if (vid_dpd != NULL) 1090 vfree(vid_dpd); 1091 #endif 1092 #ifdef ENABLE_FRAG 1093 if (vid_frag != NULL) 1094 vfree(vid_frag); 1095 #endif 1096 1097 return error; 1098 } 1099 1100 /* 1101 * receive from initiator 1102 * psk: HDR, KE, Ni 1103 * sig: HDR, KE, Ni 1104 * gssapi: HDR, KE, Ni, GSSi 1105 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r 1106 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i, 1107 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i] 1108 */ 1109 int 1110 ident_r2recv(iph1, msg) 1111 struct ph1handle *iph1; 1112 vchar_t *msg; 1113 { 1114 vchar_t *pbuf = NULL; 1115 struct isakmp_parse_t *pa; 1116 int error = -1; 1117 #ifdef HAVE_GSSAPI 1118 vchar_t *gsstoken = NULL; 1119 #endif 1120 #ifdef ENABLE_NATT 1121 int natd_seq = 0; 1122 #endif 1123 1124 /* validity check */ 1125 if (iph1->status != PHASE1ST_MSG1SENT) { 1126 plog(LLV_ERROR, LOCATION, NULL, 1127 "status mismatched %d.\n", iph1->status); 1128 goto end; 1129 } 1130 1131 /* validate the type of next payload */ 1132 pbuf = isakmp_parse(msg); 1133 if (pbuf == NULL) 1134 goto end; 1135 1136 for (pa = (struct isakmp_parse_t *)pbuf->v; 1137 pa->type != ISAKMP_NPTYPE_NONE; 1138 pa++) { 1139 switch (pa->type) { 1140 case ISAKMP_NPTYPE_KE: 1141 if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0) 1142 goto end; 1143 break; 1144 case ISAKMP_NPTYPE_NONCE: 1145 if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0) 1146 goto end; 1147 break; 1148 case ISAKMP_NPTYPE_VID: 1149 handle_vendorid(iph1, pa->ptr); 1150 break; 1151 case ISAKMP_NPTYPE_CR: 1152 plog(LLV_WARNING, LOCATION, iph1->remote, 1153 "CR received, ignore it. " 1154 "It should be in other exchange.\n"); 1155 break; 1156 #ifdef HAVE_GSSAPI 1157 case ISAKMP_NPTYPE_GSS: 1158 if (isakmp_p2ph(&gsstoken, pa->ptr) < 0) 1159 goto end; 1160 gssapi_save_received_token(iph1, gsstoken); 1161 break; 1162 #endif 1163 1164 #ifdef ENABLE_NATT 1165 case ISAKMP_NPTYPE_NATD_DRAFT: 1166 case ISAKMP_NPTYPE_NATD_RFC: 1167 if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL && 1168 pa->type == iph1->natt_options->payload_nat_d) 1169 { 1170 vchar_t *natd_received = NULL; 1171 int natd_verified; 1172 1173 if (isakmp_p2ph (&natd_received, pa->ptr) < 0) 1174 goto end; 1175 1176 if (natd_seq == 0) 1177 iph1->natt_flags |= NAT_DETECTED; 1178 1179 natd_verified = natt_compare_addr_hash (iph1, 1180 natd_received, natd_seq++); 1181 1182 plog (LLV_INFO, LOCATION, NULL, "NAT-D payload #%d %s\n", 1183 natd_seq - 1, 1184 natd_verified ? "verified" : "doesn't match"); 1185 1186 vfree (natd_received); 1187 break; 1188 } 1189 /* passthrough to default... */ 1190 #endif 1191 1192 default: 1193 /* don't send information, see ident_r1recv() */ 1194 plog(LLV_ERROR, LOCATION, iph1->remote, 1195 "ignore the packet, " 1196 "received unexpecting payload type %d.\n", 1197 pa->type); 1198 goto end; 1199 } 1200 } 1201 1202 #ifdef ENABLE_NATT 1203 if (NATT_AVAILABLE(iph1)) 1204 plog (LLV_INFO, LOCATION, NULL, "NAT %s %s%s\n", 1205 iph1->natt_flags & NAT_DETECTED ? 1206 "detected:" : "not detected", 1207 iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "", 1208 iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : ""); 1209 #endif 1210 1211 /* payload existency check */ 1212 if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) { 1213 plog(LLV_ERROR, LOCATION, iph1->remote, 1214 "few isakmp message received.\n"); 1215 goto end; 1216 } 1217 1218 iph1->status = PHASE1ST_MSG2RECEIVED; 1219 1220 error = 0; 1221 1222 end: 1223 if (pbuf) 1224 vfree(pbuf); 1225 #ifdef HAVE_GSSAPI 1226 if (gsstoken) 1227 vfree(gsstoken); 1228 #endif 1229 1230 if (error) { 1231 VPTRINIT(iph1->dhpub_p); 1232 VPTRINIT(iph1->nonce_p); 1233 VPTRINIT(iph1->id_p); 1234 } 1235 1236 return error; 1237 } 1238 1239 /* 1240 * send to initiator 1241 * psk: HDR, KE, Nr 1242 * sig: HDR, KE, Nr [, CR ] 1243 * gssapi: HDR, KE, Nr, GSSr 1244 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i 1245 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r, 1246 */ 1247 int 1248 ident_r2send(iph1, msg) 1249 struct ph1handle *iph1; 1250 vchar_t *msg; 1251 { 1252 int error = -1; 1253 1254 /* validity check */ 1255 if (iph1->status != PHASE1ST_MSG2RECEIVED) { 1256 plog(LLV_ERROR, LOCATION, NULL, 1257 "status mismatched %d.\n", iph1->status); 1258 goto end; 1259 } 1260 1261 /* generate DH public value */ 1262 if (oakley_dh_generate(iph1->approval->dhgrp, 1263 &iph1->dhpub, &iph1->dhpriv) < 0) 1264 goto end; 1265 1266 /* generate NONCE value */ 1267 iph1->nonce = eay_set_random(RMCONF_NONCE_SIZE(iph1->rmconf)); 1268 if (iph1->nonce == NULL) 1269 goto end; 1270 1271 #ifdef HAVE_GSSAPI 1272 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) 1273 gssapi_get_rtoken(iph1, NULL); 1274 #endif 1275 1276 /* create HDR;KE;NONCE payload */ 1277 iph1->sendbuf = ident_ir2mx(iph1); 1278 if (iph1->sendbuf == NULL) 1279 goto end; 1280 1281 #ifdef HAVE_PRINT_ISAKMP_C 1282 isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0); 1283 #endif 1284 1285 /* send the packet, add to the schedule to resend */ 1286 if (isakmp_ph1send(iph1) == -1) 1287 goto end; 1288 1289 /* the sending message is added to the received-list. */ 1290 if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) { 1291 plog(LLV_ERROR , LOCATION, NULL, 1292 "failed to add a response packet to the tree.\n"); 1293 goto end; 1294 } 1295 1296 /* compute sharing secret of DH */ 1297 if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub, 1298 iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0) 1299 goto end; 1300 1301 /* generate SKEYIDs & IV & final cipher key */ 1302 if (oakley_skeyid(iph1) < 0) 1303 goto end; 1304 if (oakley_skeyid_dae(iph1) < 0) 1305 goto end; 1306 if (oakley_compute_enckey(iph1) < 0) 1307 goto end; 1308 if (oakley_newiv(iph1) < 0) 1309 goto end; 1310 1311 iph1->status = PHASE1ST_MSG2SENT; 1312 1313 error = 0; 1314 1315 end: 1316 return error; 1317 } 1318 1319 /* 1320 * receive from initiator 1321 * psk: HDR*, IDi1, HASH_I 1322 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I 1323 * gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I > 1324 * rsa: HDR*, HASH_I 1325 * rev: HDR*, HASH_I 1326 */ 1327 int 1328 ident_r3recv(iph1, msg0) 1329 struct ph1handle *iph1; 1330 vchar_t *msg0; 1331 { 1332 vchar_t *msg = NULL; 1333 vchar_t *pbuf = NULL; 1334 struct isakmp_parse_t *pa; 1335 int error = -1; 1336 int type; 1337 #ifdef HAVE_GSSAPI 1338 vchar_t *gsstoken = NULL; 1339 #endif 1340 1341 /* validity check */ 1342 if (iph1->status != PHASE1ST_MSG2SENT) { 1343 plog(LLV_ERROR, LOCATION, NULL, 1344 "status mismatched %d.\n", iph1->status); 1345 goto end; 1346 } 1347 1348 /* decrypting */ 1349 if (!ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) { 1350 plog(LLV_ERROR, LOCATION, iph1->remote, 1351 "reject the packet, " 1352 "expecting the packet encrypted.\n"); 1353 goto end; 1354 } 1355 msg = oakley_do_decrypt(iph1, msg0, iph1->ivm->iv, iph1->ivm->ive); 1356 if (msg == NULL) 1357 goto end; 1358 1359 /* validate the type of next payload */ 1360 pbuf = isakmp_parse(msg); 1361 if (pbuf == NULL) 1362 goto end; 1363 1364 iph1->pl_hash = NULL; 1365 1366 for (pa = (struct isakmp_parse_t *)pbuf->v; 1367 pa->type != ISAKMP_NPTYPE_NONE; 1368 pa++) { 1369 1370 switch (pa->type) { 1371 case ISAKMP_NPTYPE_ID: 1372 if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0) 1373 goto end; 1374 if (resolveph1rmconf(iph1) < 0) 1375 goto end; 1376 break; 1377 case ISAKMP_NPTYPE_HASH: 1378 iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr; 1379 break; 1380 case ISAKMP_NPTYPE_CR: 1381 if (oakley_savecr(iph1, pa->ptr) < 0) 1382 goto end; 1383 break; 1384 case ISAKMP_NPTYPE_CERT: 1385 if (oakley_savecert(iph1, pa->ptr) < 0) 1386 goto end; 1387 break; 1388 case ISAKMP_NPTYPE_SIG: 1389 if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0) 1390 goto end; 1391 break; 1392 #ifdef HAVE_GSSAPI 1393 case ISAKMP_NPTYPE_GSS: 1394 if (isakmp_p2ph(&gsstoken, pa->ptr) < 0) 1395 goto end; 1396 gssapi_save_received_token(iph1, gsstoken); 1397 break; 1398 #endif 1399 case ISAKMP_NPTYPE_VID: 1400 handle_vendorid(iph1, pa->ptr); 1401 break; 1402 case ISAKMP_NPTYPE_N: 1403 ident_recv_n(iph1, pa->ptr); 1404 break; 1405 default: 1406 /* don't send information, see ident_r1recv() */ 1407 plog(LLV_ERROR, LOCATION, iph1->remote, 1408 "ignore the packet, " 1409 "received unexpecting payload type %d.\n", 1410 pa->type); 1411 goto end; 1412 } 1413 } 1414 1415 /* payload existency check */ 1416 /* XXX same as ident_i4recv(), should be merged. */ 1417 { 1418 int ng = 0; 1419 1420 switch (iph1->approval->authmethod) { 1421 case OAKLEY_ATTR_AUTH_METHOD_PSKEY: 1422 #ifdef ENABLE_HYBRID 1423 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R: 1424 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R: 1425 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R: 1426 #endif 1427 if (iph1->id_p == NULL || iph1->pl_hash == NULL) 1428 ng++; 1429 break; 1430 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG: 1431 case OAKLEY_ATTR_AUTH_METHOD_RSASIG: 1432 #ifdef ENABLE_HYBRID 1433 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R: 1434 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R: 1435 #endif 1436 if (iph1->id_p == NULL || iph1->sig_p == NULL) 1437 ng++; 1438 break; 1439 case OAKLEY_ATTR_AUTH_METHOD_RSAENC: 1440 case OAKLEY_ATTR_AUTH_METHOD_RSAREV: 1441 #ifdef ENABLE_HYBRID 1442 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R: 1443 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R: 1444 #endif 1445 if (iph1->pl_hash == NULL) 1446 ng++; 1447 break; 1448 #ifdef HAVE_GSSAPI 1449 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB: 1450 if (gsstoken == NULL && iph1->pl_hash == NULL) 1451 ng++; 1452 break; 1453 #endif 1454 default: 1455 plog(LLV_ERROR, LOCATION, iph1->remote, 1456 "invalid authmethod %d why ?\n", 1457 iph1->approval->authmethod); 1458 goto end; 1459 } 1460 if (ng) { 1461 plog(LLV_ERROR, LOCATION, iph1->remote, 1462 "few isakmp message received.\n"); 1463 goto end; 1464 } 1465 } 1466 1467 /* verify identifier */ 1468 if (ipsecdoi_checkid1(iph1) != 0) { 1469 plog(LLV_ERROR, LOCATION, iph1->remote, 1470 "invalid ID payload.\n"); 1471 goto end; 1472 } 1473 1474 /* validate authentication value */ 1475 #ifdef HAVE_GSSAPI 1476 if (gsstoken == NULL) { 1477 #endif 1478 type = oakley_validate_auth(iph1); 1479 if (type != 0) { 1480 if (type == -1) { 1481 /* msg printed inner oakley_validate_auth() */ 1482 goto end; 1483 } 1484 evt_phase1(iph1, EVT_PHASE1_AUTH_FAILED, NULL); 1485 isakmp_info_send_n1(iph1, type, NULL); 1486 goto end; 1487 } 1488 #ifdef HAVE_GSSAPI 1489 } 1490 #endif 1491 1492 if (oakley_checkcr(iph1) < 0) { 1493 /* Ignore this error in order to be interoperability. */ 1494 ; 1495 } 1496 1497 /* 1498 * XXX: Should we do compare two addresses, ph1handle's and ID 1499 * payload's. 1500 */ 1501 1502 plog(LLV_DEBUG, LOCATION, iph1->remote, "peer's ID\n"); 1503 plogdump(LLV_DEBUG, iph1->id_p->v, iph1->id_p->l); 1504 1505 /* see handler.h about IV synchronization. */ 1506 memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->ive->l); 1507 1508 #ifdef HAVE_GSSAPI 1509 iph1->status = gsstoken != NULL ? PHASE1ST_MSG2RECEIVED : 1510 PHASE1ST_MSG3RECEIVED; 1511 #else 1512 iph1->status = PHASE1ST_MSG3RECEIVED; 1513 #endif 1514 1515 error = 0; 1516 1517 end: 1518 if (pbuf) 1519 vfree(pbuf); 1520 if (msg) 1521 vfree(msg); 1522 #ifdef HAVE_GSSAPI 1523 if (gsstoken) 1524 vfree(gsstoken); 1525 #endif 1526 1527 if (error) { 1528 VPTRINIT(iph1->id_p); 1529 VPTRINIT(iph1->cert_p); 1530 VPTRINIT(iph1->crl_p); 1531 VPTRINIT(iph1->sig_p); 1532 VPTRINIT(iph1->cr_p); 1533 } 1534 1535 return error; 1536 } 1537 1538 /* 1539 * send to initiator 1540 * psk: HDR*, IDr1, HASH_R 1541 * sig: HDR*, IDr1, [ CERT, ] SIG_R 1542 * gssapi: HDR*, IDr1, < GSSr(n) | HASH_R > 1543 * rsa: HDR*, HASH_R 1544 * rev: HDR*, HASH_R 1545 */ 1546 int 1547 ident_r3send(iph1, msg) 1548 struct ph1handle *iph1; 1549 vchar_t *msg; 1550 { 1551 int error = -1; 1552 int dohash = 1; 1553 #ifdef HAVE_GSSAPI 1554 int len; 1555 #endif 1556 1557 /* validity check */ 1558 if (iph1->status != PHASE1ST_MSG3RECEIVED) { 1559 plog(LLV_ERROR, LOCATION, NULL, 1560 "status mismatched %d.\n", iph1->status); 1561 goto end; 1562 } 1563 1564 /* make ID payload into isakmp status */ 1565 if (ipsecdoi_setid1(iph1) < 0) 1566 goto end; 1567 1568 #ifdef HAVE_GSSAPI 1569 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB && 1570 gssapi_more_tokens(iph1)) { 1571 gssapi_get_rtoken(iph1, &len); 1572 if (len != 0) 1573 dohash = 0; 1574 } 1575 #endif 1576 1577 if (dohash) { 1578 /* generate HASH to send */ 1579 plog(LLV_DEBUG, LOCATION, NULL, "generate HASH_R\n"); 1580 iph1->hash = oakley_ph1hash_common(iph1, GENERATE); 1581 if (iph1->hash == NULL) 1582 goto end; 1583 } else 1584 iph1->hash = NULL; 1585 1586 /* set encryption flag */ 1587 iph1->flags |= ISAKMP_FLAG_E; 1588 1589 /* create HDR;ID;HASH payload */ 1590 iph1->sendbuf = ident_ir3mx(iph1); 1591 if (iph1->sendbuf == NULL) 1592 goto end; 1593 1594 /* send HDR;ID;HASH to responder */ 1595 if (isakmp_send(iph1, iph1->sendbuf) < 0) 1596 goto end; 1597 1598 /* the sending message is added to the received-list. */ 1599 if (add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg) == -1) { 1600 plog(LLV_ERROR , LOCATION, NULL, 1601 "failed to add a response packet to the tree.\n"); 1602 goto end; 1603 } 1604 1605 /* see handler.h about IV synchronization. */ 1606 memcpy(iph1->ivm->ive->v, iph1->ivm->iv->v, iph1->ivm->iv->l); 1607 1608 iph1->status = PHASE1ST_ESTABLISHED; 1609 1610 error = 0; 1611 1612 end: 1613 1614 return error; 1615 } 1616 1617 /* 1618 * This is used in main mode for: 1619 * initiator's 3rd exchange send to responder 1620 * psk: HDR, KE, Ni 1621 * sig: HDR, KE, Ni 1622 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r 1623 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i, 1624 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i] 1625 * responders 2nd exchnage send to initiator 1626 * psk: HDR, KE, Nr 1627 * sig: HDR, KE, Nr [, CR ] 1628 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i 1629 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r, 1630 */ 1631 static vchar_t * 1632 ident_ir2mx(iph1) 1633 struct ph1handle *iph1; 1634 { 1635 vchar_t *buf = 0; 1636 struct payload_list *plist = NULL; 1637 vchar_t *vid = NULL; 1638 int error = -1; 1639 #ifdef HAVE_GSSAPI 1640 vchar_t *gsstoken = NULL; 1641 #endif 1642 #ifdef ENABLE_NATT 1643 vchar_t *natd[2] = { NULL, NULL }; 1644 #endif 1645 1646 #ifdef HAVE_GSSAPI 1647 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) { 1648 if (gssapi_get_token_to_send(iph1, &gsstoken) < 0) { 1649 plog(LLV_ERROR, LOCATION, NULL, 1650 "Failed to get gssapi token.\n"); 1651 goto end; 1652 } 1653 } 1654 #endif 1655 1656 /* create isakmp KE payload */ 1657 plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE); 1658 1659 /* create isakmp NONCE payload */ 1660 plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE); 1661 1662 #ifdef HAVE_GSSAPI 1663 if (iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) 1664 plist = isakmp_plist_append(plist, gsstoken, ISAKMP_NPTYPE_GSS); 1665 #endif 1666 1667 /* append vendor id, if needed */ 1668 if (vid) 1669 plist = isakmp_plist_append(plist, vid, ISAKMP_NPTYPE_VID); 1670 1671 /* create CR if need */ 1672 if (iph1->side == RESPONDER && 1673 oakley_needcr(iph1->approval->authmethod)) 1674 plist = oakley_append_cr(plist, iph1); 1675 1676 #ifdef ENABLE_NATT 1677 /* generate and append NAT-D payloads */ 1678 if (NATT_AVAILABLE(iph1) && iph1->status == PHASE1ST_MSG2RECEIVED) 1679 { 1680 if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) { 1681 plog(LLV_ERROR, LOCATION, NULL, 1682 "NAT-D hashing failed for %s\n", saddr2str(iph1->remote)); 1683 goto end; 1684 } 1685 1686 if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) { 1687 plog(LLV_ERROR, LOCATION, NULL, 1688 "NAT-D hashing failed for %s\n", saddr2str(iph1->local)); 1689 goto end; 1690 } 1691 1692 plog (LLV_INFO, LOCATION, NULL, "Adding remote and local NAT-D payloads.\n"); 1693 plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d); 1694 plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d); 1695 } 1696 #endif 1697 1698 buf = isakmp_plist_set_all (&plist, iph1); 1699 1700 error = 0; 1701 1702 end: 1703 if (error && buf != NULL) { 1704 vfree(buf); 1705 buf = NULL; 1706 } 1707 #ifdef HAVE_GSSAPI 1708 if (gsstoken) 1709 vfree(gsstoken); 1710 #endif 1711 if (vid) 1712 vfree(vid); 1713 1714 #ifdef ENABLE_NATT 1715 if (natd[0]) 1716 vfree(natd[0]); 1717 if (natd[1]) 1718 vfree(natd[1]); 1719 #endif 1720 1721 return buf; 1722 } 1723 1724 /* 1725 * This is used in main mode for: 1726 * initiator's 4th exchange send to responder 1727 * psk: HDR*, IDi1, HASH_I 1728 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I 1729 * gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I > 1730 * rsa: HDR*, HASH_I 1731 * rev: HDR*, HASH_I 1732 * responders 3rd exchnage send to initiator 1733 * psk: HDR*, IDr1, HASH_R 1734 * sig: HDR*, IDr1, [ CERT, ] SIG_R 1735 * gssapi: HDR*, [ IDr1, ] < GSSr(n) | HASH_R > 1736 * rsa: HDR*, HASH_R 1737 * rev: HDR*, HASH_R 1738 */ 1739 static vchar_t * 1740 ident_ir3mx(iph1) 1741 struct ph1handle *iph1; 1742 { 1743 struct payload_list *plist = NULL; 1744 vchar_t *buf = NULL, *new = NULL; 1745 int need_cert = 0; 1746 int error = -1; 1747 #ifdef HAVE_GSSAPI 1748 int nptype; 1749 vchar_t *gsstoken = NULL; 1750 vchar_t *gsshash = NULL; 1751 #endif 1752 1753 switch (iph1->approval->authmethod) { 1754 case OAKLEY_ATTR_AUTH_METHOD_PSKEY: 1755 #ifdef ENABLE_HYBRID 1756 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I: 1757 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R: 1758 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I: 1759 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I: 1760 #endif 1761 /* create isakmp ID payload */ 1762 plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID); 1763 1764 /* create isakmp HASH payload */ 1765 plist = isakmp_plist_append(plist, iph1->hash, ISAKMP_NPTYPE_HASH); 1766 break; 1767 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG: 1768 case OAKLEY_ATTR_AUTH_METHOD_RSASIG: 1769 #ifdef ENABLE_HYBRID 1770 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R: 1771 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R: 1772 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I: 1773 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R: 1774 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I: 1775 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R: 1776 #endif 1777 if (oakley_getmycert(iph1) < 0) 1778 goto end; 1779 1780 if (oakley_getsign(iph1) < 0) 1781 goto end; 1782 1783 if (iph1->cert != NULL && iph1->rmconf->send_cert) 1784 need_cert = 1; 1785 1786 /* add ID payload */ 1787 plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID); 1788 1789 /* add CERT payload if there */ 1790 if (need_cert) 1791 plist = isakmp_plist_append(plist, iph1->cert, 1792 ISAKMP_NPTYPE_CERT); 1793 /* add SIG payload */ 1794 plist = isakmp_plist_append(plist, iph1->sig, ISAKMP_NPTYPE_SIG); 1795 1796 /* create isakmp CR payload */ 1797 if (iph1->side == INITIATOR && 1798 oakley_needcr(iph1->approval->authmethod)) 1799 plist = oakley_append_cr(plist, iph1); 1800 break; 1801 #ifdef HAVE_GSSAPI 1802 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB: 1803 if (iph1->hash != NULL) { 1804 gsshash = gssapi_wraphash(iph1); 1805 if (gsshash == NULL) 1806 goto end; 1807 } else { 1808 if (gssapi_get_token_to_send(iph1, &gsstoken) < 0) { 1809 plog(LLV_ERROR, LOCATION, NULL, 1810 "Failed to get gssapi token.\n"); 1811 goto end; 1812 } 1813 } 1814 1815 if (!gssapi_id_sent(iph1)) { 1816 /* create isakmp ID payload */ 1817 plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID); 1818 gssapi_set_id_sent(iph1); 1819 } 1820 1821 if (iph1->hash != NULL) 1822 /* create isakmp HASH payload */ 1823 plist = isakmp_plist_append(plist, gsshash, ISAKMP_NPTYPE_HASH); 1824 else 1825 plist = isakmp_plist_append(plist, gsstoken, ISAKMP_NPTYPE_GSS); 1826 break; 1827 #endif 1828 case OAKLEY_ATTR_AUTH_METHOD_RSAENC: 1829 case OAKLEY_ATTR_AUTH_METHOD_RSAREV: 1830 #ifdef ENABLE_HYBRID 1831 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I: 1832 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R: 1833 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I: 1834 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R: 1835 #endif 1836 plog(LLV_ERROR, LOCATION, NULL, 1837 "not supported authentication type %d\n", 1838 iph1->approval->authmethod); 1839 goto end; 1840 default: 1841 plog(LLV_ERROR, LOCATION, NULL, 1842 "invalid authentication type %d\n", 1843 iph1->approval->authmethod); 1844 goto end; 1845 } 1846 1847 buf = isakmp_plist_set_all (&plist, iph1); 1848 1849 #ifdef HAVE_PRINT_ISAKMP_C 1850 isakmp_printpacket(buf, iph1->local, iph1->remote, 1); 1851 #endif 1852 1853 /* encoding */ 1854 new = oakley_do_encrypt(iph1, buf, iph1->ivm->ive, iph1->ivm->iv); 1855 if (new == NULL) 1856 goto end; 1857 1858 vfree(buf); 1859 1860 buf = new; 1861 1862 error = 0; 1863 1864 end: 1865 #ifdef HAVE_GSSAPI 1866 if (gsstoken) 1867 vfree(gsstoken); 1868 #endif 1869 if (error && buf != NULL) { 1870 vfree(buf); 1871 buf = NULL; 1872 } 1873 1874 return buf; 1875 } 1876 1877 /* 1878 * handle a notification payload inside identity exchange. 1879 * called only when the packet has been verified to be encrypted. 1880 */ 1881 static int 1882 ident_recv_n(iph1, gen) 1883 struct ph1handle *iph1; 1884 struct isakmp_gen *gen; 1885 { 1886 struct isakmp_pl_n *notify = (struct isakmp_pl_n *) gen; 1887 u_int type; 1888 1889 type = ntohs(notify->type); 1890 switch (type) { 1891 case ISAKMP_NTYPE_INITIAL_CONTACT: 1892 iph1->initial_contact_received = TRUE; 1893 break; 1894 default: 1895 isakmp_log_notify(iph1, notify, "identity exchange"); 1896 break; 1897 } 1898 return 0; 1899 } 1900 1901