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