1 /* $OpenBSD: ip_esp.c,v 1.171 2021/07/26 23:17:06 mvs Exp $ */ 2 /* 3 * The authors of this code are John Ioannidis (ji@tla.org), 4 * Angelos D. Keromytis (kermit@csd.uch.gr) and 5 * Niels Provos (provos@physnet.uni-hamburg.de). 6 * 7 * The original version of this code was written by John Ioannidis 8 * for BSD/OS in Athens, Greece, in November 1995. 9 * 10 * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996, 11 * by Angelos D. Keromytis. 12 * 13 * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis 14 * and Niels Provos. 15 * 16 * Additional features in 1999 by Angelos D. Keromytis. 17 * 18 * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis, 19 * Angelos D. Keromytis and Niels Provos. 20 * Copyright (c) 2001 Angelos D. Keromytis. 21 * 22 * Permission to use, copy, and modify this software with or without fee 23 * is hereby granted, provided that this entire notice is included in 24 * all copies of any software which is or includes a copy or 25 * modification of this software. 26 * You may use this code under the GNU public license if you so wish. Please 27 * contribute changes back to the authors under this freer than GPL license 28 * so that we may further the use of strong encryption without limitations to 29 * all. 30 * 31 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR 32 * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY 33 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE 34 * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR 35 * PURPOSE. 36 */ 37 38 #include "pfsync.h" 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/mbuf.h> 43 #include <sys/socket.h> 44 45 #include <net/if.h> 46 #include <net/if_var.h> 47 #include <net/bpf.h> 48 49 #include <netinet/in.h> 50 #include <netinet/ip.h> 51 #include <netinet/ip_var.h> 52 53 #ifdef INET6 54 #include <netinet/ip6.h> 55 #endif /* INET6 */ 56 57 #include <netinet/ip_ipsp.h> 58 #include <netinet/ip_esp.h> 59 #include <net/pfkeyv2.h> 60 #include <net/if_enc.h> 61 62 #if NPFSYNC > 0 63 #include <net/pfvar.h> 64 #include <net/if_pfsync.h> 65 #endif /* NPFSYNC > 0 */ 66 67 #include <crypto/cryptodev.h> 68 #include <crypto/xform.h> 69 70 #include "bpfilter.h" 71 72 #ifdef ENCDEBUG 73 #define DPRINTF(fmt, args...) \ 74 do { \ 75 if (encdebug) \ 76 printf("%s: " fmt "\n", __func__, ## args); \ 77 } while (0) 78 #else 79 #define DPRINTF(fmt, args...) \ 80 do { } while (0) 81 #endif 82 83 /* 84 * esp_attach() is called from the transformation initialization code. 85 */ 86 int 87 esp_attach(void) 88 { 89 return 0; 90 } 91 92 /* 93 * esp_init() is called when an SPI is being set up. 94 */ 95 int 96 esp_init(struct tdb *tdbp, const struct xformsw *xsp, struct ipsecinit *ii) 97 { 98 const struct enc_xform *txform = NULL; 99 const struct auth_hash *thash = NULL; 100 struct cryptoini cria, crie, crin; 101 int error; 102 103 if (!ii->ii_encalg && !ii->ii_authalg) { 104 DPRINTF("neither authentication nor encryption algorithm " 105 "given"); 106 return EINVAL; 107 } 108 109 if (ii->ii_encalg) { 110 switch (ii->ii_encalg) { 111 case SADB_EALG_NULL: 112 txform = &enc_xform_null; 113 break; 114 115 case SADB_EALG_3DESCBC: 116 txform = &enc_xform_3des; 117 break; 118 119 case SADB_X_EALG_AES: 120 txform = &enc_xform_aes; 121 break; 122 123 case SADB_X_EALG_AESCTR: 124 txform = &enc_xform_aes_ctr; 125 break; 126 127 case SADB_X_EALG_AESGCM16: 128 txform = &enc_xform_aes_gcm; 129 break; 130 131 case SADB_X_EALG_AESGMAC: 132 txform = &enc_xform_aes_gmac; 133 break; 134 135 case SADB_X_EALG_CHACHA20POLY1305: 136 txform = &enc_xform_chacha20_poly1305; 137 break; 138 139 case SADB_X_EALG_BLF: 140 txform = &enc_xform_blf; 141 break; 142 143 case SADB_X_EALG_CAST: 144 txform = &enc_xform_cast5; 145 break; 146 147 default: 148 DPRINTF("unsupported encryption algorithm %d " 149 "specified", 150 ii->ii_encalg); 151 return EINVAL; 152 } 153 154 if (ii->ii_enckeylen < txform->minkey) { 155 DPRINTF("keylength %d too small (min length is %d) " 156 "for algorithm %s", 157 ii->ii_enckeylen, txform->minkey, txform->name); 158 return EINVAL; 159 } 160 161 if (ii->ii_enckeylen > txform->maxkey) { 162 DPRINTF("keylength %d too large (max length is %d) " 163 "for algorithm %s", 164 ii->ii_enckeylen, txform->maxkey, txform->name); 165 return EINVAL; 166 } 167 168 if (ii->ii_encalg == SADB_X_EALG_AESGCM16 || 169 ii->ii_encalg == SADB_X_EALG_AESGMAC) { 170 switch (ii->ii_enckeylen) { 171 case 20: 172 ii->ii_authalg = SADB_X_AALG_AES128GMAC; 173 break; 174 case 28: 175 ii->ii_authalg = SADB_X_AALG_AES192GMAC; 176 break; 177 case 36: 178 ii->ii_authalg = SADB_X_AALG_AES256GMAC; 179 break; 180 } 181 ii->ii_authkeylen = ii->ii_enckeylen; 182 ii->ii_authkey = ii->ii_enckey; 183 } else if (ii->ii_encalg == SADB_X_EALG_CHACHA20POLY1305) { 184 ii->ii_authalg = SADB_X_AALG_CHACHA20POLY1305; 185 ii->ii_authkeylen = ii->ii_enckeylen; 186 ii->ii_authkey = ii->ii_enckey; 187 } 188 189 tdbp->tdb_encalgxform = txform; 190 191 DPRINTF("initialized TDB with enc algorithm %s", txform->name); 192 193 tdbp->tdb_ivlen = txform->ivsize; 194 } 195 196 if (ii->ii_authalg) { 197 switch (ii->ii_authalg) { 198 case SADB_AALG_MD5HMAC: 199 thash = &auth_hash_hmac_md5_96; 200 break; 201 202 case SADB_AALG_SHA1HMAC: 203 thash = &auth_hash_hmac_sha1_96; 204 break; 205 206 case SADB_X_AALG_RIPEMD160HMAC: 207 thash = &auth_hash_hmac_ripemd_160_96; 208 break; 209 210 case SADB_X_AALG_SHA2_256: 211 thash = &auth_hash_hmac_sha2_256_128; 212 break; 213 214 case SADB_X_AALG_SHA2_384: 215 thash = &auth_hash_hmac_sha2_384_192; 216 break; 217 218 case SADB_X_AALG_SHA2_512: 219 thash = &auth_hash_hmac_sha2_512_256; 220 break; 221 222 case SADB_X_AALG_AES128GMAC: 223 thash = &auth_hash_gmac_aes_128; 224 break; 225 226 case SADB_X_AALG_AES192GMAC: 227 thash = &auth_hash_gmac_aes_192; 228 break; 229 230 case SADB_X_AALG_AES256GMAC: 231 thash = &auth_hash_gmac_aes_256; 232 break; 233 234 case SADB_X_AALG_CHACHA20POLY1305: 235 thash = &auth_hash_chacha20_poly1305; 236 break; 237 238 default: 239 DPRINTF("unsupported authentication algorithm %d " 240 "specified", 241 ii->ii_authalg); 242 return EINVAL; 243 } 244 245 if (ii->ii_authkeylen != thash->keysize) { 246 DPRINTF("keylength %d doesn't match algorithm %s " 247 "keysize (%d)", 248 ii->ii_authkeylen, thash->name, thash->keysize); 249 return EINVAL; 250 } 251 252 tdbp->tdb_authalgxform = thash; 253 254 DPRINTF("initialized TDB with hash algorithm %s", thash->name); 255 } 256 257 tdbp->tdb_xform = xsp; 258 tdbp->tdb_rpl = AH_HMAC_INITIAL_RPL; 259 260 /* Initialize crypto session */ 261 if (tdbp->tdb_encalgxform) { 262 /* Save the raw keys */ 263 tdbp->tdb_emxkeylen = ii->ii_enckeylen; 264 tdbp->tdb_emxkey = malloc(tdbp->tdb_emxkeylen, M_XDATA, 265 M_WAITOK); 266 memcpy(tdbp->tdb_emxkey, ii->ii_enckey, tdbp->tdb_emxkeylen); 267 268 memset(&crie, 0, sizeof(crie)); 269 270 crie.cri_alg = tdbp->tdb_encalgxform->type; 271 272 if (tdbp->tdb_authalgxform) 273 crie.cri_next = &cria; 274 else 275 crie.cri_next = NULL; 276 277 crie.cri_klen = ii->ii_enckeylen * 8; 278 crie.cri_key = ii->ii_enckey; 279 /* XXX Rounds ? */ 280 } 281 282 if (tdbp->tdb_authalgxform) { 283 /* Save the raw keys */ 284 tdbp->tdb_amxkeylen = ii->ii_authkeylen; 285 tdbp->tdb_amxkey = malloc(tdbp->tdb_amxkeylen, M_XDATA, 286 M_WAITOK); 287 memcpy(tdbp->tdb_amxkey, ii->ii_authkey, tdbp->tdb_amxkeylen); 288 289 memset(&cria, 0, sizeof(cria)); 290 291 cria.cri_alg = tdbp->tdb_authalgxform->type; 292 293 if ((tdbp->tdb_wnd > 0) && (tdbp->tdb_flags & TDBF_ESN)) { 294 memset(&crin, 0, sizeof(crin)); 295 crin.cri_alg = CRYPTO_ESN; 296 cria.cri_next = &crin; 297 } 298 299 cria.cri_klen = ii->ii_authkeylen * 8; 300 cria.cri_key = ii->ii_authkey; 301 } 302 303 KERNEL_LOCK(); 304 error = crypto_newsession(&tdbp->tdb_cryptoid, 305 (tdbp->tdb_encalgxform ? &crie : &cria), 0); 306 KERNEL_UNLOCK(); 307 return error; 308 } 309 310 /* 311 * Paranoia. 312 */ 313 int 314 esp_zeroize(struct tdb *tdbp) 315 { 316 int error; 317 318 if (tdbp->tdb_amxkey) { 319 explicit_bzero(tdbp->tdb_amxkey, tdbp->tdb_amxkeylen); 320 free(tdbp->tdb_amxkey, M_XDATA, tdbp->tdb_amxkeylen); 321 tdbp->tdb_amxkey = NULL; 322 } 323 324 if (tdbp->tdb_emxkey) { 325 explicit_bzero(tdbp->tdb_emxkey, tdbp->tdb_emxkeylen); 326 free(tdbp->tdb_emxkey, M_XDATA, tdbp->tdb_emxkeylen); 327 tdbp->tdb_emxkey = NULL; 328 } 329 330 KERNEL_LOCK(); 331 error = crypto_freesession(tdbp->tdb_cryptoid); 332 KERNEL_UNLOCK(); 333 tdbp->tdb_cryptoid = 0; 334 return error; 335 } 336 337 #define MAXBUFSIZ (AH_ALEN_MAX > ESP_MAX_IVS ? AH_ALEN_MAX : ESP_MAX_IVS) 338 339 /* 340 * ESP input processing, called (eventually) through the protocol switch. 341 */ 342 int 343 esp_input(struct mbuf *m, struct tdb *tdb, int skip, int protoff) 344 { 345 const struct auth_hash *esph = tdb->tdb_authalgxform; 346 const struct enc_xform *espx = tdb->tdb_encalgxform; 347 struct cryptodesc *crde = NULL, *crda = NULL; 348 struct cryptop *crp = NULL; 349 struct tdb_crypto *tc = NULL; 350 int plen, alen, hlen, error; 351 u_int32_t btsx, esn; 352 u_int64_t ibytes; 353 #ifdef ENCDEBUG 354 char buf[INET6_ADDRSTRLEN]; 355 #endif 356 357 /* Determine the ESP header length */ 358 hlen = 2 * sizeof(u_int32_t) + tdb->tdb_ivlen; /* "new" ESP */ 359 alen = esph ? esph->authsize : 0; 360 plen = m->m_pkthdr.len - (skip + hlen + alen); 361 if (plen <= 0) { 362 DPRINTF("invalid payload length"); 363 espstat_inc(esps_badilen); 364 error = EINVAL; 365 goto drop; 366 } 367 368 if (espx) { 369 /* 370 * Verify payload length is multiple of encryption algorithm 371 * block size. 372 */ 373 if (plen & (espx->blocksize - 1)) { 374 DPRINTF("payload of %d octets not a multiple " 375 "of %d octets, SA %s/%08x", 376 plen, espx->blocksize, 377 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 378 ntohl(tdb->tdb_spi)); 379 espstat_inc(esps_badilen); 380 error = EINVAL; 381 goto drop; 382 } 383 } 384 385 /* Replay window checking, if appropriate -- no value commitment. */ 386 if (tdb->tdb_wnd > 0) { 387 m_copydata(m, skip + sizeof(u_int32_t), sizeof(u_int32_t), 388 &btsx); 389 btsx = ntohl(btsx); 390 391 switch (checkreplaywindow(tdb, tdb->tdb_rpl, btsx, &esn, 0)) { 392 case 0: /* All's well */ 393 break; 394 case 1: 395 DPRINTF("replay counter wrapped for SA %s/%08x", 396 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 397 ntohl(tdb->tdb_spi)); 398 espstat_inc(esps_wrap); 399 error = EACCES; 400 goto drop; 401 case 2: 402 DPRINTF("old packet received in SA %s/%08x", 403 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 404 ntohl(tdb->tdb_spi)); 405 espstat_inc(esps_replay); 406 error = EACCES; 407 goto drop; 408 case 3: 409 DPRINTF("duplicate packet received in SA %s/%08x", 410 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 411 ntohl(tdb->tdb_spi)); 412 espstat_inc(esps_replay); 413 error = EACCES; 414 goto drop; 415 default: 416 DPRINTF("bogus value from checkreplaywindow() " 417 "in SA %s/%08x", 418 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 419 ntohl(tdb->tdb_spi)); 420 espstat_inc(esps_replay); 421 error = EACCES; 422 goto drop; 423 } 424 } 425 426 /* Update the counters */ 427 ibytes = m->m_pkthdr.len - skip - hlen - alen; 428 tdb->tdb_cur_bytes += ibytes; 429 tdbstat_add(tdb, tdb_ibytes, ibytes); 430 espstat_add(esps_ibytes, ibytes); 431 432 /* Hard expiration */ 433 if ((tdb->tdb_flags & TDBF_BYTES) && 434 (tdb->tdb_cur_bytes >= tdb->tdb_exp_bytes)) { 435 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_HARD); 436 tdb_delete(tdb); 437 error = ENXIO; 438 goto drop; 439 } 440 441 /* Notify on soft expiration */ 442 if ((tdb->tdb_flags & TDBF_SOFT_BYTES) && 443 (tdb->tdb_cur_bytes >= tdb->tdb_soft_bytes)) { 444 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_SOFT); 445 tdb->tdb_flags &= ~TDBF_SOFT_BYTES; /* Turn off checking */ 446 } 447 448 /* Get crypto descriptors */ 449 crp = crypto_getreq(esph && espx ? 2 : 1); 450 if (crp == NULL) { 451 DPRINTF("failed to acquire crypto descriptors"); 452 espstat_inc(esps_crypto); 453 error = ENOBUFS; 454 goto drop; 455 } 456 457 /* Get IPsec-specific opaque pointer */ 458 if (esph == NULL) 459 tc = malloc(sizeof(*tc), M_XDATA, M_NOWAIT | M_ZERO); 460 else 461 tc = malloc(sizeof(*tc) + alen, M_XDATA, M_NOWAIT | M_ZERO); 462 if (tc == NULL) { 463 DPRINTF("failed to allocate tdb_crypto"); 464 espstat_inc(esps_crypto); 465 error = ENOBUFS; 466 goto drop; 467 } 468 469 if (esph) { 470 crda = &crp->crp_desc[0]; 471 crde = &crp->crp_desc[1]; 472 473 /* Authentication descriptor */ 474 crda->crd_skip = skip; 475 crda->crd_inject = m->m_pkthdr.len - alen; 476 477 crda->crd_alg = esph->type; 478 crda->crd_key = tdb->tdb_amxkey; 479 crda->crd_klen = tdb->tdb_amxkeylen * 8; 480 481 if ((tdb->tdb_wnd > 0) && (tdb->tdb_flags & TDBF_ESN)) { 482 esn = htonl(esn); 483 memcpy(crda->crd_esn, &esn, 4); 484 crda->crd_flags |= CRD_F_ESN; 485 } 486 487 if (espx && 488 (espx->type == CRYPTO_AES_GCM_16 || 489 espx->type == CRYPTO_CHACHA20_POLY1305)) 490 crda->crd_len = hlen - tdb->tdb_ivlen; 491 else 492 crda->crd_len = m->m_pkthdr.len - (skip + alen); 493 494 /* Copy the authenticator */ 495 m_copydata(m, m->m_pkthdr.len - alen, alen, tc + 1); 496 } else 497 crde = &crp->crp_desc[0]; 498 499 /* Crypto operation descriptor */ 500 crp->crp_ilen = m->m_pkthdr.len; /* Total input length */ 501 crp->crp_flags = CRYPTO_F_IMBUF | CRYPTO_F_MPSAFE | CRYPTO_F_NOQUEUE; 502 crp->crp_buf = (caddr_t)m; 503 crp->crp_callback = ipsec_input_cb; 504 crp->crp_sid = tdb->tdb_cryptoid; 505 crp->crp_opaque = (caddr_t)tc; 506 507 /* These are passed as-is to the callback */ 508 tc->tc_skip = skip; 509 tc->tc_protoff = protoff; 510 tc->tc_spi = tdb->tdb_spi; 511 tc->tc_proto = tdb->tdb_sproto; 512 tc->tc_rdomain = tdb->tdb_rdomain; 513 tc->tc_dst = tdb->tdb_dst; 514 tc->tc_rpl = tdb->tdb_rpl; 515 516 /* Decryption descriptor */ 517 if (espx) { 518 crde->crd_skip = skip + hlen; 519 crde->crd_inject = skip + hlen - tdb->tdb_ivlen; 520 crde->crd_alg = espx->type; 521 crde->crd_key = tdb->tdb_emxkey; 522 crde->crd_klen = tdb->tdb_emxkeylen * 8; 523 /* XXX Rounds ? */ 524 525 if (crde->crd_alg == CRYPTO_AES_GMAC) 526 crde->crd_len = 0; 527 else 528 crde->crd_len = m->m_pkthdr.len - (skip + hlen + alen); 529 } 530 531 error = crypto_dispatch(crp); 532 return error; 533 534 drop: 535 m_freem(m); 536 crypto_freereq(crp); 537 free(tc, M_XDATA, 0); 538 return error; 539 } 540 541 /* 542 * ESP input callback, called directly by the crypto driver. 543 */ 544 int 545 esp_input_cb(struct tdb *tdb, struct tdb_crypto *tc, struct mbuf *m, int clen) 546 { 547 u_int8_t lastthree[3], aalg[AH_HMAC_MAX_HASHLEN]; 548 int hlen, roff, skip, protoff; 549 struct mbuf *m1, *mo; 550 const struct auth_hash *esph; 551 u_int64_t rpl; 552 u_int32_t btsx, esn; 553 caddr_t ptr; 554 #ifdef ENCDEBUG 555 char buf[INET6_ADDRSTRLEN]; 556 #endif 557 558 skip = tc->tc_skip; 559 protoff = tc->tc_protoff; 560 rpl = tc->tc_rpl; 561 562 NET_ASSERT_LOCKED(); 563 564 esph = tdb->tdb_authalgxform; 565 566 /* If authentication was performed, check now. */ 567 if (esph != NULL) { 568 /* Copy the authenticator from the packet */ 569 m_copydata(m, m->m_pkthdr.len - esph->authsize, 570 esph->authsize, aalg); 571 572 ptr = (caddr_t) (tc + 1); 573 574 /* Verify authenticator */ 575 if (timingsafe_bcmp(ptr, aalg, esph->authsize)) { 576 DPRINTF("authentication failed for packet " 577 "in SA %s/%08x", 578 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 579 ntohl(tdb->tdb_spi)); 580 espstat_inc(esps_badauth); 581 goto baddone; 582 } 583 584 /* Remove trailing authenticator */ 585 m_adj(m, -(esph->authsize)); 586 } 587 588 /* Replay window checking, if appropriate */ 589 if (tdb->tdb_wnd > 0) { 590 m_copydata(m, skip + sizeof(u_int32_t), sizeof(u_int32_t), 591 &btsx); 592 btsx = ntohl(btsx); 593 594 switch (checkreplaywindow(tdb, rpl, btsx, &esn, 1)) { 595 case 0: /* All's well */ 596 #if NPFSYNC > 0 597 pfsync_update_tdb(tdb,0); 598 #endif 599 break; 600 601 case 1: 602 DPRINTF("replay counter wrapped for SA %s/%08x", 603 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 604 ntohl(tdb->tdb_spi)); 605 espstat_inc(esps_wrap); 606 goto baddone; 607 case 2: 608 DPRINTF("old packet received in SA %s/%08x", 609 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 610 ntohl(tdb->tdb_spi)); 611 espstat_inc(esps_replay); 612 goto baddone; 613 case 3: 614 DPRINTF("duplicate packet received in SA %s/%08x", 615 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 616 ntohl(tdb->tdb_spi)); 617 espstat_inc(esps_replay); 618 goto baddone; 619 default: 620 DPRINTF("bogus value from checkreplaywindow() " 621 "in SA %s/%08x", 622 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 623 ntohl(tdb->tdb_spi)); 624 espstat_inc(esps_replay); 625 goto baddone; 626 } 627 } 628 629 /* Determine the ESP header length */ 630 hlen = 2 * sizeof(u_int32_t) + tdb->tdb_ivlen; 631 632 /* Find beginning of ESP header */ 633 m1 = m_getptr(m, skip, &roff); 634 if (m1 == NULL) { 635 DPRINTF("bad mbuf chain, SA %s/%08x", 636 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 637 ntohl(tdb->tdb_spi)); 638 espstat_inc(esps_hdrops); 639 goto baddone; 640 } 641 642 /* Remove the ESP header and IV from the mbuf. */ 643 if (roff == 0) { 644 /* The ESP header was conveniently at the beginning of the mbuf */ 645 m_adj(m1, hlen); 646 /* 647 * If m1 is the first mbuf, it has set M_PKTHDR and m_adj() 648 * has already adjusted the packet header length for us. 649 */ 650 if (m1 != m) 651 m->m_pkthdr.len -= hlen; 652 } else if (roff + hlen >= m1->m_len) { 653 int adjlen; 654 655 /* 656 * Part or all of the ESP header is at the end of this mbuf, so 657 * first let's remove the remainder of the ESP header from the 658 * beginning of the remainder of the mbuf chain, if any. 659 */ 660 if (roff + hlen > m1->m_len) { 661 adjlen = roff + hlen - m1->m_len; 662 663 /* Adjust the next mbuf by the remainder */ 664 m_adj(m1->m_next, adjlen); 665 666 /* The second mbuf is guaranteed not to have a pkthdr */ 667 m->m_pkthdr.len -= adjlen; 668 } 669 670 /* Now, let's unlink the mbuf chain for a second...*/ 671 mo = m1->m_next; 672 m1->m_next = NULL; 673 674 /* ...and trim the end of the first part of the chain...sick */ 675 adjlen = m1->m_len - roff; 676 m_adj(m1, -adjlen); 677 /* 678 * If m1 is the first mbuf, it has set M_PKTHDR and m_adj() 679 * has already adjusted the packet header length for us. 680 */ 681 if (m1 != m) 682 m->m_pkthdr.len -= adjlen; 683 684 /* Finally, let's relink */ 685 m1->m_next = mo; 686 } else { 687 /* 688 * The ESP header lies in the "middle" of the mbuf...do an 689 * overlapping copy of the remainder of the mbuf over the ESP 690 * header. 691 */ 692 memmove(mtod(m1, u_char *) + roff, 693 mtod(m1, u_char *) + roff + hlen, 694 m1->m_len - (roff + hlen)); 695 m1->m_len -= hlen; 696 m->m_pkthdr.len -= hlen; 697 } 698 699 /* Save the last three bytes of decrypted data */ 700 m_copydata(m, m->m_pkthdr.len - 3, 3, lastthree); 701 702 /* Verify pad length */ 703 if (lastthree[1] + 2 > m->m_pkthdr.len - skip) { 704 DPRINTF("invalid padding length %d for packet in SA %s/%08x", 705 lastthree[1], 706 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 707 ntohl(tdb->tdb_spi)); 708 espstat_inc(esps_badilen); 709 goto baddone; 710 } 711 712 /* Verify correct decryption by checking the last padding bytes */ 713 if ((lastthree[1] != lastthree[0]) && (lastthree[1] != 0)) { 714 DPRINTF("decryption failed for packet in SA %s/%08x", 715 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 716 ntohl(tdb->tdb_spi)); 717 espstat_inc(esps_badenc); 718 goto baddone; 719 } 720 721 /* Trim the mbuf chain to remove the trailing authenticator and padding */ 722 m_adj(m, -(lastthree[1] + 2)); 723 724 /* Restore the Next Protocol field */ 725 m_copyback(m, protoff, sizeof(u_int8_t), lastthree + 2, M_NOWAIT); 726 727 /* Release the crypto descriptors */ 728 free(tc, M_XDATA, 0); 729 730 /* Back to generic IPsec input processing */ 731 return ipsec_common_input_cb(m, tdb, skip, protoff); 732 733 baddone: 734 m_freem(m); 735 free(tc, M_XDATA, 0); 736 return -1; 737 } 738 739 /* 740 * ESP output routine, called by ipsp_process_packet(). 741 */ 742 int 743 esp_output(struct mbuf *m, struct tdb *tdb, struct mbuf **mp, int skip, 744 int protoff) 745 { 746 const struct enc_xform *espx = tdb->tdb_encalgxform; 747 const struct auth_hash *esph = tdb->tdb_authalgxform; 748 int ilen, hlen, rlen, padding, blks, alen, roff, error; 749 u_int64_t replay64; 750 u_int32_t replay; 751 struct mbuf *mi, *mo = (struct mbuf *) NULL; 752 struct tdb_crypto *tc = NULL; 753 unsigned char *pad; 754 u_int8_t prot; 755 #ifdef ENCDEBUG 756 char buf[INET6_ADDRSTRLEN]; 757 #endif 758 struct cryptodesc *crde = NULL, *crda = NULL; 759 struct cryptop *crp = NULL; 760 #if NBPFILTER > 0 761 struct ifnet *encif; 762 763 if ((encif = enc_getif(tdb->tdb_rdomain, tdb->tdb_tap)) != NULL) { 764 encif->if_opackets++; 765 encif->if_obytes += m->m_pkthdr.len; 766 767 if (encif->if_bpf) { 768 struct enchdr hdr; 769 770 memset(&hdr, 0, sizeof(hdr)); 771 772 hdr.af = tdb->tdb_dst.sa.sa_family; 773 hdr.spi = tdb->tdb_spi; 774 if (espx) 775 hdr.flags |= M_CONF; 776 if (esph) 777 hdr.flags |= M_AUTH; 778 779 bpf_mtap_hdr(encif->if_bpf, (char *)&hdr, 780 ENC_HDRLEN, m, BPF_DIRECTION_OUT); 781 } 782 } 783 #endif 784 785 hlen = 2 * sizeof(u_int32_t) + tdb->tdb_ivlen; 786 787 rlen = m->m_pkthdr.len - skip; /* Raw payload length. */ 788 if (espx) 789 blks = MAX(espx->blocksize, 4); 790 else 791 blks = 4; /* If no encryption, we have to be 4-byte aligned. */ 792 793 padding = ((blks - ((rlen + 2) % blks)) % blks) + 2; 794 795 alen = esph ? esph->authsize : 0; 796 espstat_inc(esps_output); 797 798 switch (tdb->tdb_dst.sa.sa_family) { 799 case AF_INET: 800 /* Check for IP maximum packet size violations. */ 801 if (skip + hlen + rlen + padding + alen > IP_MAXPACKET) { 802 DPRINTF("packet in SA %s/%08x got too big", 803 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 804 ntohl(tdb->tdb_spi)); 805 espstat_inc(esps_toobig); 806 error = EMSGSIZE; 807 goto drop; 808 } 809 break; 810 811 #ifdef INET6 812 case AF_INET6: 813 /* Check for IPv6 maximum packet size violations. */ 814 if (skip + hlen + rlen + padding + alen > IPV6_MAXPACKET) { 815 DPRINTF("acket in SA %s/%08x got too big", 816 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 817 ntohl(tdb->tdb_spi)); 818 espstat_inc(esps_toobig); 819 error = EMSGSIZE; 820 goto drop; 821 } 822 break; 823 #endif /* INET6 */ 824 825 default: 826 DPRINTF("unknown/unsupported protocol family %d, SA %s/%08x", 827 tdb->tdb_dst.sa.sa_family, 828 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 829 ntohl(tdb->tdb_spi)); 830 espstat_inc(esps_nopf); 831 error = EPFNOSUPPORT; 832 goto drop; 833 } 834 835 /* Update the counters. */ 836 tdb->tdb_cur_bytes += m->m_pkthdr.len - skip; 837 espstat_add(esps_obytes, m->m_pkthdr.len - skip); 838 839 /* Hard byte expiration. */ 840 if (tdb->tdb_flags & TDBF_BYTES && 841 tdb->tdb_cur_bytes >= tdb->tdb_exp_bytes) { 842 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_HARD); 843 tdb_delete(tdb); 844 error = EINVAL; 845 goto drop; 846 } 847 848 /* Soft byte expiration. */ 849 if (tdb->tdb_flags & TDBF_SOFT_BYTES && 850 tdb->tdb_cur_bytes >= tdb->tdb_soft_bytes) { 851 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_SOFT); 852 tdb->tdb_flags &= ~TDBF_SOFT_BYTES; /* Turn off checking. */ 853 } 854 855 /* 856 * Loop through mbuf chain; if we find a readonly mbuf, 857 * copy the packet. 858 */ 859 mi = m; 860 while (mi != NULL && !M_READONLY(mi)) 861 mi = mi->m_next; 862 863 if (mi != NULL) { 864 struct mbuf *n = m_dup_pkt(m, 0, M_DONTWAIT); 865 866 if (n == NULL) { 867 DPRINTF("bad mbuf chain, SA %s/%08x", 868 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 869 ntohl(tdb->tdb_spi)); 870 espstat_inc(esps_hdrops); 871 error = ENOBUFS; 872 goto drop; 873 } 874 875 m_freem(m); 876 m = n; 877 } 878 879 /* Inject ESP header. */ 880 mo = m_makespace(m, skip, hlen, &roff); 881 if (mo == NULL) { 882 DPRINTF("failed to inject ESP header for SA %s/%08x", 883 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 884 ntohl(tdb->tdb_spi)); 885 espstat_inc(esps_hdrops); 886 error = ENOBUFS; 887 goto drop; 888 } 889 890 /* Initialize ESP header. */ 891 memcpy(mtod(mo, caddr_t) + roff, (caddr_t) &tdb->tdb_spi, 892 sizeof(u_int32_t)); 893 replay64 = tdb->tdb_rpl++; /* used for both header and ESN */ 894 replay = htonl((u_int32_t)replay64); 895 memcpy(mtod(mo, caddr_t) + roff + sizeof(u_int32_t), (caddr_t) &replay, 896 sizeof(u_int32_t)); 897 898 #if NPFSYNC > 0 899 pfsync_update_tdb(tdb,1); 900 #endif 901 902 /* 903 * Add padding -- better to do it ourselves than use the crypto engine, 904 * although if/when we support compression, we'd have to do that. 905 */ 906 mo = m_makespace(m, m->m_pkthdr.len, padding + alen, &roff); 907 if (mo == NULL) { 908 DPRINTF("m_makespace() failed for SA %s/%08x", 909 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 910 ntohl(tdb->tdb_spi)); 911 espstat_inc(esps_hdrops); 912 error = ENOBUFS; 913 goto drop; 914 } 915 pad = mtod(mo, caddr_t) + roff; 916 917 /* Apply self-describing padding */ 918 for (ilen = 0; ilen < padding - 2; ilen++) 919 pad[ilen] = ilen + 1; 920 921 /* Fix padding length and Next Protocol in padding itself. */ 922 pad[padding - 2] = padding - 2; 923 m_copydata(m, protoff, sizeof(u_int8_t), pad + padding - 1); 924 925 /* Fix Next Protocol in IPv4/IPv6 header. */ 926 prot = IPPROTO_ESP; 927 m_copyback(m, protoff, sizeof(u_int8_t), &prot, M_NOWAIT); 928 929 /* Get crypto descriptors. */ 930 crp = crypto_getreq(esph && espx ? 2 : 1); 931 if (crp == NULL) { 932 DPRINTF("failed to acquire crypto descriptors"); 933 espstat_inc(esps_crypto); 934 error = ENOBUFS; 935 goto drop; 936 } 937 938 if (espx) { 939 crde = &crp->crp_desc[0]; 940 crda = &crp->crp_desc[1]; 941 942 /* Encryption descriptor. */ 943 crde->crd_skip = skip + hlen; 944 crde->crd_flags = CRD_F_ENCRYPT | CRD_F_IV_EXPLICIT; 945 crde->crd_inject = skip + hlen - tdb->tdb_ivlen; 946 947 /* Encryption operation. */ 948 crde->crd_alg = espx->type; 949 crde->crd_key = tdb->tdb_emxkey; 950 crde->crd_klen = tdb->tdb_emxkeylen * 8; 951 /* XXX Rounds ? */ 952 953 if (crde->crd_alg == CRYPTO_AES_GMAC) 954 crde->crd_len = 0; 955 else 956 crde->crd_len = m->m_pkthdr.len - (skip + hlen + alen); 957 958 /* GCM & friends just require a NONCE (non-repeating!) */ 959 if (espx->type == CRYPTO_AES_CTR || 960 espx->type == CRYPTO_AES_GCM_16 || 961 espx->type == CRYPTO_CHACHA20_POLY1305) 962 bcopy(&replay64, crde->crd_iv, sizeof(replay64)); 963 else 964 arc4random_buf(crde->crd_iv, espx->ivsize); 965 } else 966 crda = &crp->crp_desc[0]; 967 968 /* IPsec-specific opaque crypto info. */ 969 tc = malloc(sizeof(*tc), M_XDATA, M_NOWAIT | M_ZERO); 970 if (tc == NULL) { 971 DPRINTF("failed to allocate tdb_crypto"); 972 espstat_inc(esps_crypto); 973 error = ENOBUFS; 974 goto drop; 975 } 976 977 tc->tc_spi = tdb->tdb_spi; 978 tc->tc_proto = tdb->tdb_sproto; 979 tc->tc_rdomain = tdb->tdb_rdomain; 980 tc->tc_dst = tdb->tdb_dst; 981 982 /* Crypto operation descriptor. */ 983 crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */ 984 crp->crp_flags = CRYPTO_F_IMBUF | CRYPTO_F_MPSAFE | CRYPTO_F_NOQUEUE; 985 crp->crp_buf = (caddr_t)m; 986 crp->crp_callback = ipsec_output_cb; 987 crp->crp_opaque = (caddr_t)tc; 988 crp->crp_sid = tdb->tdb_cryptoid; 989 990 if (esph) { 991 /* Authentication descriptor. */ 992 crda->crd_skip = skip; 993 crda->crd_inject = m->m_pkthdr.len - alen; 994 995 /* Authentication operation. */ 996 crda->crd_alg = esph->type; 997 crda->crd_key = tdb->tdb_amxkey; 998 crda->crd_klen = tdb->tdb_amxkeylen * 8; 999 1000 if ((tdb->tdb_wnd > 0) && (tdb->tdb_flags & TDBF_ESN)) { 1001 u_int32_t esn; 1002 1003 esn = htonl((u_int32_t)(replay64 >> 32)); 1004 memcpy(crda->crd_esn, &esn, 4); 1005 crda->crd_flags |= CRD_F_ESN; 1006 } 1007 1008 if (espx && 1009 (espx->type == CRYPTO_AES_GCM_16 || 1010 espx->type == CRYPTO_CHACHA20_POLY1305)) 1011 crda->crd_len = hlen - tdb->tdb_ivlen; 1012 else 1013 crda->crd_len = m->m_pkthdr.len - (skip + alen); 1014 } 1015 1016 error = crypto_dispatch(crp); 1017 return error; 1018 1019 drop: 1020 m_freem(m); 1021 crypto_freereq(crp); 1022 free(tc, M_XDATA, 0); 1023 return error; 1024 } 1025 1026 int 1027 esp_output_cb(struct tdb *tdb, struct tdb_crypto *tc, struct mbuf *m, int ilen, 1028 int olen) 1029 { 1030 /* Release crypto descriptors. */ 1031 free(tc, M_XDATA, 0); 1032 1033 /* Call the IPsec input callback. */ 1034 if (ipsp_process_done(m, tdb)) { 1035 espstat_inc(esps_outfail); 1036 return -1; 1037 } 1038 1039 return 0; 1040 } 1041 1042 #define SEEN_SIZE howmany(TDB_REPLAYMAX, 32) 1043 1044 /* 1045 * return 0 on success 1046 * return 1 for counter == 0 1047 * return 2 for very old packet 1048 * return 3 for packet within current window but already received 1049 */ 1050 int 1051 checkreplaywindow(struct tdb *tdb, u_int64_t t, u_int32_t seq, u_int32_t *seqh, 1052 int commit) 1053 { 1054 u_int32_t tl, th, wl; 1055 u_int32_t packet, window = TDB_REPLAYMAX - TDB_REPLAYWASTE; 1056 int idx, esn = tdb->tdb_flags & TDBF_ESN; 1057 1058 tl = (u_int32_t)t; 1059 th = (u_int32_t)(t >> 32); 1060 1061 /* Zero SN is not allowed */ 1062 if ((esn && seq == 0 && tl <= AH_HMAC_INITIAL_RPL && th == 0) || 1063 (!esn && seq == 0)) 1064 return (1); 1065 1066 if (th == 0 && tl < window) 1067 window = tl; 1068 /* Current replay window starts here */ 1069 wl = tl - window + 1; 1070 1071 idx = (seq % TDB_REPLAYMAX) / 32; 1072 packet = 1 << (31 - (seq & 31)); 1073 1074 /* 1075 * We keep the high part intact when: 1076 * 1) the SN is within [wl, 0xffffffff] and the whole window is 1077 * within one subspace; 1078 * 2) the SN is within [0, wl) and window spans two subspaces. 1079 */ 1080 if ((tl >= window - 1 && seq >= wl) || 1081 (tl < window - 1 && seq < wl)) { 1082 *seqh = th; 1083 if (seq > tl) { 1084 if (commit) { 1085 if (seq - tl > window) 1086 memset(tdb->tdb_seen, 0, 1087 sizeof(tdb->tdb_seen)); 1088 else { 1089 int i = (tl % TDB_REPLAYMAX) / 32; 1090 1091 while (i != idx) { 1092 i = (i + 1) % SEEN_SIZE; 1093 tdb->tdb_seen[i] = 0; 1094 } 1095 } 1096 tdb->tdb_seen[idx] |= packet; 1097 tdb->tdb_rpl = ((u_int64_t)*seqh << 32) | seq; 1098 } 1099 } else { 1100 if (tl - seq >= window) 1101 return (2); 1102 if (tdb->tdb_seen[idx] & packet) 1103 return (3); 1104 if (commit) 1105 tdb->tdb_seen[idx] |= packet; 1106 } 1107 return (0); 1108 } 1109 1110 /* Can't wrap if not doing ESN */ 1111 if (!esn) 1112 return (2); 1113 1114 /* 1115 * (3) SN is within [wl, 0xffffffff] and wl is within 1116 * (0xffffffff-window+1, 0xffffffff]. 1117 * This means we got a SN which is within our replay window, 1118 * but in the previous subspace. 1119 */ 1120 if (tl < window - 1 && seq >= wl) { 1121 if (tdb->tdb_seen[idx] & packet) 1122 return (3); 1123 *seqh = th - 1; 1124 if (commit) 1125 tdb->tdb_seen[idx] |= packet; 1126 return (0); 1127 } 1128 1129 /* 1130 * (4) SN has wrapped and the last authenticated SN is in the old 1131 * subspace. 1132 */ 1133 *seqh = th + 1; 1134 if (*seqh == 0) /* Don't let high bit to wrap */ 1135 return (1); 1136 if (commit) { 1137 if (seq - tl > window) 1138 memset(tdb->tdb_seen, 0, sizeof(tdb->tdb_seen)); 1139 else { 1140 int i = (tl % TDB_REPLAYMAX) / 32; 1141 1142 while (i != idx) { 1143 i = (i + 1) % SEEN_SIZE; 1144 tdb->tdb_seen[i] = 0; 1145 } 1146 } 1147 tdb->tdb_seen[idx] |= packet; 1148 tdb->tdb_rpl = ((u_int64_t)*seqh << 32) | seq; 1149 } 1150 1151 return (0); 1152 } 1153