1 /* $OpenBSD: ip_esp.c,v 1.187 2021/11/11 18:08:18 bluhm 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 **mp, 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 mbuf *m = *mp, *m1, *mo; 348 struct cryptodesc *crde = NULL, *crda = NULL; 349 struct cryptop *crp = NULL; 350 int plen, alen, hlen, error, clen, roff; 351 uint32_t btsx, esn; 352 #ifdef ENCDEBUG 353 char buf[INET6_ADDRSTRLEN]; 354 #endif 355 uint8_t abuf[AH_HMAC_MAX_HASHLEN]; 356 uint8_t lastthree[3], aalg[AH_HMAC_MAX_HASHLEN]; 357 358 /* Determine the ESP header length */ 359 hlen = 2 * sizeof(u_int32_t) + tdb->tdb_ivlen; /* "new" ESP */ 360 alen = esph ? esph->authsize : 0; 361 plen = m->m_pkthdr.len - (skip + hlen + alen); 362 if (plen <= 0) { 363 DPRINTF("invalid payload length"); 364 espstat_inc(esps_badilen); 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 goto drop; 381 } 382 } 383 384 /* Replay window checking, if appropriate -- no value commitment. */ 385 if (tdb->tdb_wnd > 0) { 386 m_copydata(m, skip + sizeof(u_int32_t), sizeof(u_int32_t), 387 &btsx); 388 btsx = ntohl(btsx); 389 390 switch (checkreplaywindow(tdb, tdb->tdb_rpl, btsx, &esn, 0)) { 391 case 0: /* All's well */ 392 break; 393 case 1: 394 DPRINTF("replay counter wrapped for SA %s/%08x", 395 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 396 ntohl(tdb->tdb_spi)); 397 espstat_inc(esps_wrap); 398 goto drop; 399 case 2: 400 DPRINTF("old packet received in SA %s/%08x", 401 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 402 ntohl(tdb->tdb_spi)); 403 espstat_inc(esps_replay); 404 goto drop; 405 case 3: 406 DPRINTF("duplicate packet received in SA %s/%08x", 407 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 408 ntohl(tdb->tdb_spi)); 409 espstat_inc(esps_replay); 410 goto drop; 411 default: 412 DPRINTF("bogus value from checkreplaywindow() " 413 "in SA %s/%08x", 414 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 415 ntohl(tdb->tdb_spi)); 416 espstat_inc(esps_replay); 417 goto drop; 418 } 419 } 420 421 /* Update the counters */ 422 tdb->tdb_cur_bytes += plen; 423 tdb->tdb_ibytes += plen; 424 espstat_add(esps_ibytes, plen); 425 426 /* Hard expiration */ 427 if ((tdb->tdb_flags & TDBF_BYTES) && 428 (tdb->tdb_cur_bytes >= tdb->tdb_exp_bytes)) { 429 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_HARD); 430 tdb_delete(tdb); 431 goto drop; 432 } 433 434 /* Notify on soft expiration */ 435 if ((tdb->tdb_flags & TDBF_SOFT_BYTES) && 436 (tdb->tdb_cur_bytes >= tdb->tdb_soft_bytes)) { 437 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_SOFT); 438 tdb->tdb_flags &= ~TDBF_SOFT_BYTES; /* Turn off checking */ 439 } 440 441 /* Get crypto descriptors */ 442 crp = crypto_getreq(esph && espx ? 2 : 1); 443 if (crp == NULL) { 444 DPRINTF("failed to acquire crypto descriptors"); 445 espstat_inc(esps_crypto); 446 goto drop; 447 } 448 449 if (esph) { 450 crda = &crp->crp_desc[0]; 451 crde = &crp->crp_desc[1]; 452 453 /* Authentication descriptor */ 454 crda->crd_skip = skip; 455 crda->crd_inject = m->m_pkthdr.len - alen; 456 457 crda->crd_alg = esph->type; 458 crda->crd_key = tdb->tdb_amxkey; 459 crda->crd_klen = tdb->tdb_amxkeylen * 8; 460 461 if ((tdb->tdb_wnd > 0) && (tdb->tdb_flags & TDBF_ESN)) { 462 esn = htonl(esn); 463 memcpy(crda->crd_esn, &esn, 4); 464 crda->crd_flags |= CRD_F_ESN; 465 } 466 467 if (espx && 468 (espx->type == CRYPTO_AES_GCM_16 || 469 espx->type == CRYPTO_CHACHA20_POLY1305)) 470 crda->crd_len = hlen - tdb->tdb_ivlen; 471 else 472 crda->crd_len = m->m_pkthdr.len - (skip + alen); 473 474 /* Copy the authenticator */ 475 m_copydata(m, m->m_pkthdr.len - alen, alen, abuf); 476 } else 477 crde = &crp->crp_desc[0]; 478 479 /* Crypto operation descriptor */ 480 crp->crp_ilen = m->m_pkthdr.len; /* Total input length */ 481 crp->crp_flags = CRYPTO_F_IMBUF | CRYPTO_F_MPSAFE; 482 crp->crp_buf = (caddr_t)m; 483 crp->crp_sid = tdb->tdb_cryptoid; 484 485 /* Decryption descriptor */ 486 if (espx) { 487 crde->crd_skip = skip + hlen; 488 crde->crd_inject = skip + hlen - tdb->tdb_ivlen; 489 crde->crd_alg = espx->type; 490 crde->crd_key = tdb->tdb_emxkey; 491 crde->crd_klen = tdb->tdb_emxkeylen * 8; 492 /* XXX Rounds ? */ 493 494 if (crde->crd_alg == CRYPTO_AES_GMAC) 495 crde->crd_len = 0; 496 else 497 crde->crd_len = plen; 498 } 499 500 KERNEL_LOCK(); 501 while ((error = crypto_invoke(crp)) == EAGAIN) { 502 /* Reset the session ID */ 503 if (tdb->tdb_cryptoid != 0) 504 tdb->tdb_cryptoid = crp->crp_sid; 505 } 506 KERNEL_UNLOCK(); 507 if (error) { 508 DPRINTF("crypto error %d", error); 509 ipsecstat_inc(ipsec_noxform); 510 goto drop; 511 } 512 513 clen = crp->crp_olen; 514 515 /* Release the crypto descriptors */ 516 crypto_freereq(crp); 517 crp = NULL; 518 519 /* If authentication was performed, check now. */ 520 if (esph != NULL) { 521 /* Copy the authenticator from the packet */ 522 m_copydata(m, m->m_pkthdr.len - esph->authsize, 523 esph->authsize, aalg); 524 525 /* Verify authenticator */ 526 if (timingsafe_bcmp(abuf, aalg, esph->authsize)) { 527 DPRINTF("authentication failed for packet " 528 "in SA %s/%08x", 529 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 530 ntohl(tdb->tdb_spi)); 531 espstat_inc(esps_badauth); 532 goto drop; 533 } 534 535 /* Remove trailing authenticator */ 536 m_adj(m, -(esph->authsize)); 537 } 538 539 /* Replay window checking, if appropriate */ 540 if (tdb->tdb_wnd > 0) { 541 m_copydata(m, skip + sizeof(u_int32_t), sizeof(u_int32_t), 542 &btsx); 543 btsx = ntohl(btsx); 544 545 switch (checkreplaywindow(tdb, tdb->tdb_rpl, btsx, &esn, 1)) { 546 case 0: /* All's well */ 547 #if NPFSYNC > 0 548 pfsync_update_tdb(tdb,0); 549 #endif 550 break; 551 552 case 1: 553 DPRINTF("replay counter wrapped for SA %s/%08x", 554 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 555 ntohl(tdb->tdb_spi)); 556 espstat_inc(esps_wrap); 557 goto drop; 558 case 2: 559 DPRINTF("old packet received in SA %s/%08x", 560 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 561 ntohl(tdb->tdb_spi)); 562 espstat_inc(esps_replay); 563 goto drop; 564 case 3: 565 DPRINTF("duplicate packet received in SA %s/%08x", 566 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 567 ntohl(tdb->tdb_spi)); 568 espstat_inc(esps_replay); 569 goto drop; 570 default: 571 DPRINTF("bogus value from checkreplaywindow() " 572 "in SA %s/%08x", 573 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 574 ntohl(tdb->tdb_spi)); 575 espstat_inc(esps_replay); 576 goto drop; 577 } 578 } 579 580 /* Find beginning of ESP header */ 581 m1 = m_getptr(m, skip, &roff); 582 if (m1 == NULL) { 583 DPRINTF("bad mbuf chain, SA %s/%08x", 584 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 585 ntohl(tdb->tdb_spi)); 586 espstat_inc(esps_hdrops); 587 goto drop; 588 } 589 590 /* Remove the ESP header and IV from the mbuf. */ 591 if (roff == 0) { 592 /* The ESP header was conveniently at the beginning of the mbuf */ 593 m_adj(m1, hlen); 594 /* 595 * If m1 is the first mbuf, it has set M_PKTHDR and m_adj() 596 * has already adjusted the packet header length for us. 597 */ 598 if (m1 != m) 599 m->m_pkthdr.len -= hlen; 600 } else if (roff + hlen >= m1->m_len) { 601 int adjlen; 602 603 /* 604 * Part or all of the ESP header is at the end of this mbuf, so 605 * first let's remove the remainder of the ESP header from the 606 * beginning of the remainder of the mbuf chain, if any. 607 */ 608 if (roff + hlen > m1->m_len) { 609 adjlen = roff + hlen - m1->m_len; 610 611 /* Adjust the next mbuf by the remainder */ 612 m_adj(m1->m_next, adjlen); 613 614 /* The second mbuf is guaranteed not to have a pkthdr */ 615 m->m_pkthdr.len -= adjlen; 616 } 617 618 /* Now, let's unlink the mbuf chain for a second...*/ 619 mo = m1->m_next; 620 m1->m_next = NULL; 621 622 /* ...and trim the end of the first part of the chain...sick */ 623 adjlen = m1->m_len - roff; 624 m_adj(m1, -adjlen); 625 /* 626 * If m1 is the first mbuf, it has set M_PKTHDR and m_adj() 627 * has already adjusted the packet header length for us. 628 */ 629 if (m1 != m) 630 m->m_pkthdr.len -= adjlen; 631 632 /* Finally, let's relink */ 633 m1->m_next = mo; 634 } else { 635 /* 636 * The ESP header lies in the "middle" of the mbuf...do an 637 * overlapping copy of the remainder of the mbuf over the ESP 638 * header. 639 */ 640 memmove(mtod(m1, u_char *) + roff, 641 mtod(m1, u_char *) + roff + hlen, 642 m1->m_len - (roff + hlen)); 643 m1->m_len -= hlen; 644 m->m_pkthdr.len -= hlen; 645 } 646 647 /* Save the last three bytes of decrypted data */ 648 m_copydata(m, m->m_pkthdr.len - 3, 3, lastthree); 649 650 /* Verify pad length */ 651 if (lastthree[1] + 2 > m->m_pkthdr.len - skip) { 652 DPRINTF("invalid padding length %d for packet in SA %s/%08x", 653 lastthree[1], 654 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 655 ntohl(tdb->tdb_spi)); 656 espstat_inc(esps_badilen); 657 goto drop; 658 } 659 660 /* Verify correct decryption by checking the last padding bytes */ 661 if ((lastthree[1] != lastthree[0]) && (lastthree[1] != 0)) { 662 DPRINTF("decryption failed for packet in SA %s/%08x", 663 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 664 ntohl(tdb->tdb_spi)); 665 espstat_inc(esps_badenc); 666 goto drop; 667 } 668 669 /* Trim the mbuf chain to remove the padding */ 670 m_adj(m, -(lastthree[1] + 2)); 671 672 /* Restore the Next Protocol field */ 673 m_copyback(m, protoff, sizeof(u_int8_t), lastthree + 2, M_NOWAIT); 674 675 /* Back to generic IPsec input processing */ 676 return ipsec_common_input_cb(mp, tdb, skip, protoff); 677 678 drop: 679 m_freemp(mp); 680 crypto_freereq(crp); 681 return IPPROTO_DONE; 682 } 683 684 /* 685 * ESP output routine, called by ipsp_process_packet(). 686 */ 687 int 688 esp_output(struct mbuf *m, struct tdb *tdb, int skip, int protoff) 689 { 690 const struct enc_xform *espx = tdb->tdb_encalgxform; 691 const struct auth_hash *esph = tdb->tdb_authalgxform; 692 int ilen, olen, hlen, rlen, padding, blks, alen, roff, error; 693 uint64_t replay64; 694 uint32_t replay; 695 struct mbuf *mi, *mo = (struct mbuf *) NULL; 696 unsigned char *pad; 697 uint8_t prot; 698 #ifdef ENCDEBUG 699 char buf[INET6_ADDRSTRLEN]; 700 #endif 701 struct cryptodesc *crde = NULL, *crda = NULL; 702 struct cryptop *crp = NULL; 703 #if NBPFILTER > 0 704 struct ifnet *encif; 705 706 if ((encif = enc_getif(tdb->tdb_rdomain, tdb->tdb_tap)) != NULL) { 707 encif->if_opackets++; 708 encif->if_obytes += m->m_pkthdr.len; 709 710 if (encif->if_bpf) { 711 struct enchdr hdr; 712 713 memset(&hdr, 0, sizeof(hdr)); 714 715 hdr.af = tdb->tdb_dst.sa.sa_family; 716 hdr.spi = tdb->tdb_spi; 717 if (espx) 718 hdr.flags |= M_CONF; 719 if (esph) 720 hdr.flags |= M_AUTH; 721 722 bpf_mtap_hdr(encif->if_bpf, (char *)&hdr, 723 ENC_HDRLEN, m, BPF_DIRECTION_OUT); 724 } 725 } 726 #endif 727 728 hlen = 2 * sizeof(u_int32_t) + tdb->tdb_ivlen; 729 730 rlen = m->m_pkthdr.len - skip; /* Raw payload length. */ 731 if (espx) 732 blks = MAX(espx->blocksize, 4); 733 else 734 blks = 4; /* If no encryption, we have to be 4-byte aligned. */ 735 736 padding = ((blks - ((rlen + 2) % blks)) % blks) + 2; 737 738 alen = esph ? esph->authsize : 0; 739 espstat_inc(esps_output); 740 741 switch (tdb->tdb_dst.sa.sa_family) { 742 case AF_INET: 743 /* Check for IP maximum packet size violations. */ 744 if (skip + hlen + rlen + padding + alen > IP_MAXPACKET) { 745 DPRINTF("packet in SA %s/%08x got too big", 746 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 747 ntohl(tdb->tdb_spi)); 748 espstat_inc(esps_toobig); 749 error = EMSGSIZE; 750 goto drop; 751 } 752 break; 753 754 #ifdef INET6 755 case AF_INET6: 756 /* Check for IPv6 maximum packet size violations. */ 757 if (skip + hlen + rlen + padding + alen > IPV6_MAXPACKET) { 758 DPRINTF("acket in SA %s/%08x got too big", 759 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 760 ntohl(tdb->tdb_spi)); 761 espstat_inc(esps_toobig); 762 error = EMSGSIZE; 763 goto drop; 764 } 765 break; 766 #endif /* INET6 */ 767 768 default: 769 DPRINTF("unknown/unsupported protocol family %d, SA %s/%08x", 770 tdb->tdb_dst.sa.sa_family, 771 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 772 ntohl(tdb->tdb_spi)); 773 espstat_inc(esps_nopf); 774 error = EPFNOSUPPORT; 775 goto drop; 776 } 777 778 /* Update the counters. */ 779 tdb->tdb_cur_bytes += m->m_pkthdr.len - skip; 780 espstat_add(esps_obytes, m->m_pkthdr.len - skip); 781 782 /* Hard byte expiration. */ 783 if (tdb->tdb_flags & TDBF_BYTES && 784 tdb->tdb_cur_bytes >= tdb->tdb_exp_bytes) { 785 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_HARD); 786 tdb_delete(tdb); 787 error = EINVAL; 788 goto drop; 789 } 790 791 /* Soft byte expiration. */ 792 if (tdb->tdb_flags & TDBF_SOFT_BYTES && 793 tdb->tdb_cur_bytes >= tdb->tdb_soft_bytes) { 794 pfkeyv2_expire(tdb, SADB_EXT_LIFETIME_SOFT); 795 tdb->tdb_flags &= ~TDBF_SOFT_BYTES; /* Turn off checking. */ 796 } 797 798 /* 799 * Loop through mbuf chain; if we find a readonly mbuf, 800 * copy the packet. 801 */ 802 mi = m; 803 while (mi != NULL && !M_READONLY(mi)) 804 mi = mi->m_next; 805 806 if (mi != NULL) { 807 struct mbuf *n = m_dup_pkt(m, 0, M_DONTWAIT); 808 809 if (n == NULL) { 810 DPRINTF("bad mbuf chain, SA %s/%08x", 811 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 812 ntohl(tdb->tdb_spi)); 813 espstat_inc(esps_hdrops); 814 error = ENOBUFS; 815 goto drop; 816 } 817 818 m_freem(m); 819 m = n; 820 } 821 822 /* Inject ESP header. */ 823 mo = m_makespace(m, skip, hlen, &roff); 824 if (mo == NULL) { 825 DPRINTF("failed to inject ESP header for SA %s/%08x", 826 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 827 ntohl(tdb->tdb_spi)); 828 espstat_inc(esps_hdrops); 829 error = ENOBUFS; 830 goto drop; 831 } 832 833 /* Initialize ESP header. */ 834 memcpy(mtod(mo, caddr_t) + roff, (caddr_t) &tdb->tdb_spi, 835 sizeof(u_int32_t)); 836 replay64 = tdb->tdb_rpl++; /* used for both header and ESN */ 837 replay = htonl((u_int32_t)replay64); 838 memcpy(mtod(mo, caddr_t) + roff + sizeof(u_int32_t), (caddr_t) &replay, 839 sizeof(u_int32_t)); 840 841 #if NPFSYNC > 0 842 pfsync_update_tdb(tdb,1); 843 #endif 844 845 /* 846 * Add padding -- better to do it ourselves than use the crypto engine, 847 * although if/when we support compression, we'd have to do that. 848 */ 849 mo = m_makespace(m, m->m_pkthdr.len, padding + alen, &roff); 850 if (mo == NULL) { 851 DPRINTF("m_makespace() failed for SA %s/%08x", 852 ipsp_address(&tdb->tdb_dst, buf, sizeof(buf)), 853 ntohl(tdb->tdb_spi)); 854 espstat_inc(esps_hdrops); 855 error = ENOBUFS; 856 goto drop; 857 } 858 pad = mtod(mo, caddr_t) + roff; 859 860 /* Apply self-describing padding */ 861 for (ilen = 0; ilen < padding - 2; ilen++) 862 pad[ilen] = ilen + 1; 863 864 /* Fix padding length and Next Protocol in padding itself. */ 865 pad[padding - 2] = padding - 2; 866 m_copydata(m, protoff, sizeof(u_int8_t), pad + padding - 1); 867 868 /* Fix Next Protocol in IPv4/IPv6 header. */ 869 prot = IPPROTO_ESP; 870 m_copyback(m, protoff, sizeof(u_int8_t), &prot, M_NOWAIT); 871 872 /* Get crypto descriptors. */ 873 crp = crypto_getreq(esph && espx ? 2 : 1); 874 if (crp == NULL) { 875 DPRINTF("failed to acquire crypto descriptors"); 876 espstat_inc(esps_crypto); 877 error = ENOBUFS; 878 goto drop; 879 } 880 881 if (espx) { 882 crde = &crp->crp_desc[0]; 883 crda = &crp->crp_desc[1]; 884 885 /* Encryption descriptor. */ 886 crde->crd_skip = skip + hlen; 887 crde->crd_flags = CRD_F_ENCRYPT | CRD_F_IV_EXPLICIT; 888 crde->crd_inject = skip + hlen - tdb->tdb_ivlen; 889 890 /* Encryption operation. */ 891 crde->crd_alg = espx->type; 892 crde->crd_key = tdb->tdb_emxkey; 893 crde->crd_klen = tdb->tdb_emxkeylen * 8; 894 /* XXX Rounds ? */ 895 896 if (crde->crd_alg == CRYPTO_AES_GMAC) 897 crde->crd_len = 0; 898 else 899 crde->crd_len = m->m_pkthdr.len - (skip + hlen + alen); 900 901 /* GCM & friends just require a NONCE (non-repeating!) */ 902 if (espx->type == CRYPTO_AES_CTR || 903 espx->type == CRYPTO_AES_GCM_16 || 904 espx->type == CRYPTO_CHACHA20_POLY1305) 905 bcopy(&replay64, crde->crd_iv, sizeof(replay64)); 906 else 907 arc4random_buf(crde->crd_iv, espx->ivsize); 908 } else 909 crda = &crp->crp_desc[0]; 910 911 /* Crypto operation descriptor. */ 912 crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */ 913 crp->crp_flags = CRYPTO_F_IMBUF | CRYPTO_F_MPSAFE; 914 crp->crp_buf = (caddr_t)m; 915 crp->crp_sid = tdb->tdb_cryptoid; 916 917 if (esph) { 918 /* Authentication descriptor. */ 919 crda->crd_skip = skip; 920 crda->crd_inject = m->m_pkthdr.len - alen; 921 922 /* Authentication operation. */ 923 crda->crd_alg = esph->type; 924 crda->crd_key = tdb->tdb_amxkey; 925 crda->crd_klen = tdb->tdb_amxkeylen * 8; 926 927 if ((tdb->tdb_wnd > 0) && (tdb->tdb_flags & TDBF_ESN)) { 928 u_int32_t esn; 929 930 esn = htonl((u_int32_t)(replay64 >> 32)); 931 memcpy(crda->crd_esn, &esn, 4); 932 crda->crd_flags |= CRD_F_ESN; 933 } 934 935 if (espx && 936 (espx->type == CRYPTO_AES_GCM_16 || 937 espx->type == CRYPTO_CHACHA20_POLY1305)) 938 crda->crd_len = hlen - tdb->tdb_ivlen; 939 else 940 crda->crd_len = m->m_pkthdr.len - (skip + alen); 941 } 942 943 KERNEL_LOCK(); 944 while ((error = crypto_invoke(crp)) == EAGAIN) { 945 /* Reset the session ID */ 946 if (tdb->tdb_cryptoid != 0) 947 tdb->tdb_cryptoid = crp->crp_sid; 948 } 949 KERNEL_UNLOCK(); 950 if (error) { 951 DPRINTF("crypto error %d", error); 952 ipsecstat_inc(ipsec_noxform); 953 goto drop; 954 } 955 956 ilen = crp->crp_ilen; 957 olen = crp->crp_olen; 958 959 /* Release the crypto descriptors */ 960 crypto_freereq(crp); 961 962 /* Call the IPsec input callback. */ 963 error = ipsp_process_done(m, tdb); 964 if (error) 965 espstat_inc(esps_outfail); 966 return (error); 967 968 drop: 969 m_freem(m); 970 crypto_freereq(crp); 971 return error; 972 } 973 974 #define SEEN_SIZE howmany(TDB_REPLAYMAX, 32) 975 976 /* 977 * return 0 on success 978 * return 1 for counter == 0 979 * return 2 for very old packet 980 * return 3 for packet within current window but already received 981 */ 982 int 983 checkreplaywindow(struct tdb *tdb, u_int64_t t, u_int32_t seq, u_int32_t *seqh, 984 int commit) 985 { 986 u_int32_t tl, th, wl; 987 u_int32_t packet, window = TDB_REPLAYMAX - TDB_REPLAYWASTE; 988 int idx, esn = tdb->tdb_flags & TDBF_ESN; 989 990 tl = (u_int32_t)t; 991 th = (u_int32_t)(t >> 32); 992 993 /* Zero SN is not allowed */ 994 if ((esn && seq == 0 && tl <= AH_HMAC_INITIAL_RPL && th == 0) || 995 (!esn && seq == 0)) 996 return (1); 997 998 if (th == 0 && tl < window) 999 window = tl; 1000 /* Current replay window starts here */ 1001 wl = tl - window + 1; 1002 1003 idx = (seq % TDB_REPLAYMAX) / 32; 1004 packet = 1 << (31 - (seq & 31)); 1005 1006 /* 1007 * We keep the high part intact when: 1008 * 1) the SN is within [wl, 0xffffffff] and the whole window is 1009 * within one subspace; 1010 * 2) the SN is within [0, wl) and window spans two subspaces. 1011 */ 1012 if ((tl >= window - 1 && seq >= wl) || 1013 (tl < window - 1 && seq < wl)) { 1014 *seqh = th; 1015 if (seq > tl) { 1016 if (commit) { 1017 if (seq - tl > window) 1018 memset(tdb->tdb_seen, 0, 1019 sizeof(tdb->tdb_seen)); 1020 else { 1021 int i = (tl % TDB_REPLAYMAX) / 32; 1022 1023 while (i != idx) { 1024 i = (i + 1) % SEEN_SIZE; 1025 tdb->tdb_seen[i] = 0; 1026 } 1027 } 1028 tdb->tdb_seen[idx] |= packet; 1029 tdb->tdb_rpl = ((u_int64_t)*seqh << 32) | seq; 1030 } 1031 } else { 1032 if (tl - seq >= window) 1033 return (2); 1034 if (tdb->tdb_seen[idx] & packet) 1035 return (3); 1036 if (commit) 1037 tdb->tdb_seen[idx] |= packet; 1038 } 1039 return (0); 1040 } 1041 1042 /* Can't wrap if not doing ESN */ 1043 if (!esn) 1044 return (2); 1045 1046 /* 1047 * (3) SN is within [wl, 0xffffffff] and wl is within 1048 * (0xffffffff-window+1, 0xffffffff]. 1049 * This means we got a SN which is within our replay window, 1050 * but in the previous subspace. 1051 */ 1052 if (tl < window - 1 && seq >= wl) { 1053 if (tdb->tdb_seen[idx] & packet) 1054 return (3); 1055 *seqh = th - 1; 1056 if (commit) 1057 tdb->tdb_seen[idx] |= packet; 1058 return (0); 1059 } 1060 1061 /* 1062 * (4) SN has wrapped and the last authenticated SN is in the old 1063 * subspace. 1064 */ 1065 *seqh = th + 1; 1066 if (*seqh == 0) /* Don't let high bit to wrap */ 1067 return (1); 1068 if (commit) { 1069 if (seq - tl > window) 1070 memset(tdb->tdb_seen, 0, sizeof(tdb->tdb_seen)); 1071 else { 1072 int i = (tl % TDB_REPLAYMAX) / 32; 1073 1074 while (i != idx) { 1075 i = (i + 1) % SEEN_SIZE; 1076 tdb->tdb_seen[i] = 0; 1077 } 1078 } 1079 tdb->tdb_seen[idx] |= packet; 1080 tdb->tdb_rpl = ((u_int64_t)*seqh << 32) | seq; 1081 } 1082 1083 return (0); 1084 } 1085