Home | History | Annotate | Line # | Download | only in netipsec
xform_esp.c revision 1.39.6.1
      1  1.39.6.1       mrg /*	$NetBSD: xform_esp.c,v 1.39.6.1 2012/02/18 07:35:44 mrg Exp $	*/
      2       1.1  jonathan /*	$FreeBSD: src/sys/netipsec/xform_esp.c,v 1.2.2.1 2003/01/24 05:11:36 sam Exp $	*/
      3       1.1  jonathan /*	$OpenBSD: ip_esp.c,v 1.69 2001/06/26 06:18:59 angelos Exp $ */
      4       1.1  jonathan 
      5       1.1  jonathan /*
      6       1.1  jonathan  * The authors of this code are John Ioannidis (ji (at) tla.org),
      7       1.1  jonathan  * Angelos D. Keromytis (kermit (at) csd.uch.gr) and
      8       1.1  jonathan  * Niels Provos (provos (at) physnet.uni-hamburg.de).
      9       1.1  jonathan  *
     10       1.1  jonathan  * The original version of this code was written by John Ioannidis
     11       1.1  jonathan  * for BSD/OS in Athens, Greece, in November 1995.
     12       1.1  jonathan  *
     13       1.1  jonathan  * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
     14       1.1  jonathan  * by Angelos D. Keromytis.
     15       1.1  jonathan  *
     16       1.1  jonathan  * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
     17       1.1  jonathan  * and Niels Provos.
     18       1.1  jonathan  *
     19       1.1  jonathan  * Additional features in 1999 by Angelos D. Keromytis.
     20       1.1  jonathan  *
     21       1.1  jonathan  * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
     22       1.1  jonathan  * Angelos D. Keromytis and Niels Provos.
     23       1.1  jonathan  * Copyright (c) 2001 Angelos D. Keromytis.
     24       1.1  jonathan  *
     25       1.1  jonathan  * Permission to use, copy, and modify this software with or without fee
     26       1.1  jonathan  * is hereby granted, provided that this entire notice is included in
     27       1.1  jonathan  * all copies of any software which is or includes a copy or
     28       1.1  jonathan  * modification of this software.
     29       1.1  jonathan  * You may use this code under the GNU public license if you so wish. Please
     30       1.1  jonathan  * contribute changes back to the authors under this freer than GPL license
     31       1.1  jonathan  * so that we may further the use of strong encryption without limitations to
     32       1.1  jonathan  * all.
     33       1.1  jonathan  *
     34       1.1  jonathan  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
     35       1.1  jonathan  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
     36       1.1  jonathan  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
     37       1.1  jonathan  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
     38       1.1  jonathan  * PURPOSE.
     39       1.1  jonathan  */
     40       1.1  jonathan 
     41       1.1  jonathan #include <sys/cdefs.h>
     42  1.39.6.1       mrg __KERNEL_RCSID(0, "$NetBSD: xform_esp.c,v 1.39.6.1 2012/02/18 07:35:44 mrg Exp $");
     43       1.1  jonathan 
     44       1.1  jonathan #include "opt_inet.h"
     45       1.2  jonathan #ifdef __FreeBSD__
     46       1.1  jonathan #include "opt_inet6.h"
     47       1.2  jonathan #endif
     48       1.1  jonathan 
     49       1.1  jonathan #include <sys/param.h>
     50       1.1  jonathan #include <sys/systm.h>
     51       1.1  jonathan #include <sys/mbuf.h>
     52       1.1  jonathan #include <sys/socket.h>
     53       1.1  jonathan #include <sys/syslog.h>
     54       1.1  jonathan #include <sys/kernel.h>
     55       1.1  jonathan /*#include <sys/random.h>*/
     56       1.1  jonathan #include <sys/sysctl.h>
     57      1.23  drochner #include <sys/socketvar.h> /* for softnet_lock */
     58       1.1  jonathan 
     59       1.1  jonathan #include <net/if.h>
     60       1.1  jonathan 
     61       1.1  jonathan #include <netinet/in.h>
     62       1.1  jonathan #include <netinet/in_systm.h>
     63       1.1  jonathan #include <netinet/ip.h>
     64       1.1  jonathan #include <netinet/ip_ecn.h>
     65       1.1  jonathan #include <netinet/ip6.h>
     66       1.1  jonathan 
     67       1.1  jonathan #include <net/route.h>
     68       1.1  jonathan #include <netipsec/ipsec.h>
     69      1.18   thorpej #include <netipsec/ipsec_private.h>
     70       1.1  jonathan #include <netipsec/ah.h>
     71       1.1  jonathan #include <netipsec/ah_var.h>
     72       1.1  jonathan #include <netipsec/esp.h>
     73       1.1  jonathan #include <netipsec/esp_var.h>
     74       1.1  jonathan #include <netipsec/xform.h>
     75       1.1  jonathan 
     76       1.1  jonathan #ifdef INET6
     77       1.1  jonathan #include <netinet6/ip6_var.h>
     78       1.1  jonathan #include <netipsec/ipsec6.h>
     79       1.5  jonathan #  ifdef __FreeBSD__
     80       1.5  jonathan #  include <netinet6/ip6_ecn.h>
     81       1.5  jonathan #  endif
     82       1.1  jonathan #endif
     83       1.1  jonathan 
     84       1.4       tls #include <netipsec/key.h>
     85       1.4       tls #include <netipsec/key_debug.h>
     86       1.1  jonathan 
     87       1.1  jonathan #include <netipsec/ipsec_osdep.h>
     88       1.1  jonathan 
     89       1.1  jonathan #include <opencrypto/cryptodev.h>
     90       1.1  jonathan #include <opencrypto/xform.h>
     91       1.1  jonathan 
     92      1.18   thorpej percpu_t *espstat_percpu;
     93      1.18   thorpej 
     94       1.1  jonathan int	esp_enable = 1;
     95       1.1  jonathan 
     96       1.1  jonathan #ifdef __FreeBSD__
     97       1.1  jonathan SYSCTL_DECL(_net_inet_esp);
     98       1.1  jonathan SYSCTL_INT(_net_inet_esp, OID_AUTO,
     99       1.1  jonathan 	esp_enable,	CTLFLAG_RW,	&esp_enable,	0, "");
    100       1.1  jonathan SYSCTL_STRUCT(_net_inet_esp, IPSECCTL_STATS,
    101       1.1  jonathan 	stats,		CTLFLAG_RD,	&espstat,	espstat, "");
    102       1.4       tls #endif /* __FreeBSD__ */
    103       1.1  jonathan 
    104       1.1  jonathan static	int esp_max_ivlen;		/* max iv length over all algorithms */
    105       1.1  jonathan 
    106       1.1  jonathan static int esp_input_cb(struct cryptop *op);
    107       1.1  jonathan static int esp_output_cb(struct cryptop *crp);
    108       1.1  jonathan 
    109       1.1  jonathan /*
    110       1.1  jonathan  * NB: this is public for use by the PF_KEY support.
    111       1.1  jonathan  * NB: if you add support here; be sure to add code to esp_attach below!
    112       1.1  jonathan  */
    113      1.28  drochner const struct enc_xform *
    114       1.1  jonathan esp_algorithm_lookup(int alg)
    115       1.1  jonathan {
    116       1.1  jonathan 	if (alg >= ESP_ALG_MAX)
    117       1.1  jonathan 		return NULL;
    118       1.1  jonathan 	switch (alg) {
    119       1.1  jonathan 	case SADB_EALG_DESCBC:
    120       1.1  jonathan 		return &enc_xform_des;
    121       1.1  jonathan 	case SADB_EALG_3DESCBC:
    122       1.1  jonathan 		return &enc_xform_3des;
    123       1.1  jonathan 	case SADB_X_EALG_AES:
    124       1.1  jonathan 		return &enc_xform_rijndael128;
    125       1.1  jonathan 	case SADB_X_EALG_BLOWFISHCBC:
    126       1.1  jonathan 		return &enc_xform_blf;
    127       1.1  jonathan 	case SADB_X_EALG_CAST128CBC:
    128       1.1  jonathan 		return &enc_xform_cast5;
    129       1.1  jonathan 	case SADB_X_EALG_SKIPJACK:
    130       1.1  jonathan 		return &enc_xform_skipjack;
    131      1.32  drochner 	case SADB_X_EALG_CAMELLIACBC:
    132      1.32  drochner 		return &enc_xform_camellia;
    133      1.36  drochner 	case SADB_X_EALG_AESCTR:
    134      1.36  drochner 		return &enc_xform_aes_ctr;
    135      1.38  drochner 	case SADB_X_EALG_AESGCM16:
    136      1.38  drochner 		return &enc_xform_aes_gcm;
    137      1.38  drochner 	case SADB_X_EALG_AESGMAC:
    138      1.38  drochner 		return &enc_xform_aes_gmac;
    139       1.1  jonathan 	case SADB_EALG_NULL:
    140       1.1  jonathan 		return &enc_xform_null;
    141       1.1  jonathan 	}
    142       1.1  jonathan 	return NULL;
    143       1.1  jonathan }
    144       1.1  jonathan 
    145       1.1  jonathan size_t
    146      1.28  drochner esp_hdrsiz(const struct secasvar *sav)
    147       1.1  jonathan {
    148       1.1  jonathan 	size_t size;
    149       1.1  jonathan 
    150       1.1  jonathan 	if (sav != NULL) {
    151       1.1  jonathan 		/*XXX not right for null algorithm--does it matter??*/
    152       1.1  jonathan 		IPSEC_ASSERT(sav->tdb_encalgxform != NULL,
    153       1.1  jonathan 			("esp_hdrsiz: SA with null xform"));
    154       1.1  jonathan 		if (sav->flags & SADB_X_EXT_OLD)
    155       1.1  jonathan 			size = sizeof (struct esp);
    156       1.1  jonathan 		else
    157       1.1  jonathan 			size = sizeof (struct newesp);
    158      1.35  drochner 		size += sav->tdb_encalgxform->ivsize + 9;
    159       1.1  jonathan 		/*XXX need alg check???*/
    160       1.1  jonathan 		if (sav->tdb_authalgxform != NULL && sav->replay)
    161       1.1  jonathan 			size += ah_hdrsiz(sav);
    162       1.1  jonathan 	} else {
    163       1.1  jonathan 		/*
    164       1.1  jonathan 		 *   base header size
    165       1.1  jonathan 		 * + max iv length for CBC mode
    166       1.1  jonathan 		 * + max pad length
    167       1.1  jonathan 		 * + sizeof (pad length field)
    168       1.1  jonathan 		 * + sizeof (next header field)
    169       1.1  jonathan 		 * + max icv supported.
    170       1.1  jonathan 		 */
    171       1.1  jonathan 		size = sizeof (struct newesp) + esp_max_ivlen + 9 + 16;
    172       1.1  jonathan 	}
    173       1.1  jonathan 	return size;
    174       1.1  jonathan }
    175       1.1  jonathan 
    176       1.1  jonathan /*
    177       1.1  jonathan  * esp_init() is called when an SPI is being set up.
    178       1.1  jonathan  */
    179       1.1  jonathan static int
    180      1.28  drochner esp_init(struct secasvar *sav, const struct xformsw *xsp)
    181       1.1  jonathan {
    182      1.28  drochner 	const struct enc_xform *txform;
    183       1.1  jonathan 	struct cryptoini cria, crie;
    184       1.1  jonathan 	int keylen;
    185       1.1  jonathan 	int error;
    186       1.1  jonathan 
    187       1.1  jonathan 	txform = esp_algorithm_lookup(sav->alg_enc);
    188       1.1  jonathan 	if (txform == NULL) {
    189       1.1  jonathan 		DPRINTF(("esp_init: unsupported encryption algorithm %d\n",
    190       1.1  jonathan 			sav->alg_enc));
    191       1.1  jonathan 		return EINVAL;
    192       1.1  jonathan 	}
    193       1.1  jonathan 	if (sav->key_enc == NULL) {
    194       1.1  jonathan 		DPRINTF(("esp_init: no encoding key for %s algorithm\n",
    195       1.1  jonathan 			 txform->name));
    196       1.1  jonathan 		return EINVAL;
    197       1.1  jonathan 	}
    198       1.1  jonathan 	if ((sav->flags&(SADB_X_EXT_OLD|SADB_X_EXT_IV4B)) == SADB_X_EXT_IV4B) {
    199       1.1  jonathan 		DPRINTF(("esp_init: 4-byte IV not supported with protocol\n"));
    200       1.1  jonathan 		return EINVAL;
    201       1.1  jonathan 	}
    202       1.1  jonathan 	keylen = _KEYLEN(sav->key_enc);
    203       1.1  jonathan 	if (txform->minkey > keylen || keylen > txform->maxkey) {
    204       1.1  jonathan 		DPRINTF(("esp_init: invalid key length %u, must be in "
    205       1.1  jonathan 			"the range [%u..%u] for algorithm %s\n",
    206       1.1  jonathan 			keylen, txform->minkey, txform->maxkey,
    207       1.1  jonathan 			txform->name));
    208       1.1  jonathan 		return EINVAL;
    209       1.1  jonathan 	}
    210       1.1  jonathan 
    211      1.35  drochner 	sav->ivlen = txform->ivsize;
    212       1.1  jonathan 
    213       1.1  jonathan 	/*
    214       1.1  jonathan 	 * Setup AH-related state.
    215       1.1  jonathan 	 */
    216       1.1  jonathan 	if (sav->alg_auth != 0) {
    217       1.1  jonathan 		error = ah_init0(sav, xsp, &cria);
    218       1.1  jonathan 		if (error)
    219       1.1  jonathan 			return error;
    220       1.1  jonathan 	}
    221       1.1  jonathan 
    222       1.1  jonathan 	/* NB: override anything set in ah_init0 */
    223       1.1  jonathan 	sav->tdb_xform = xsp;
    224       1.1  jonathan 	sav->tdb_encalgxform = txform;
    225       1.1  jonathan 
    226      1.38  drochner 	if (sav->alg_enc == SADB_X_EALG_AESGCM16 ||
    227      1.38  drochner 	    sav->alg_enc == SADB_X_EALG_AESGMAC) {
    228      1.38  drochner 		switch (keylen) {
    229      1.38  drochner 		case 20:
    230      1.38  drochner 			sav->alg_auth = SADB_X_AALG_AES128GMAC;
    231      1.38  drochner 			sav->tdb_authalgxform = &auth_hash_gmac_aes_128;
    232      1.38  drochner 			break;
    233      1.38  drochner 		case 28:
    234      1.38  drochner 			sav->alg_auth = SADB_X_AALG_AES192GMAC;
    235      1.38  drochner 			sav->tdb_authalgxform = &auth_hash_gmac_aes_192;
    236      1.38  drochner 			break;
    237      1.38  drochner 		case 36:
    238      1.38  drochner 			sav->alg_auth = SADB_X_AALG_AES256GMAC;
    239      1.38  drochner 			sav->tdb_authalgxform = &auth_hash_gmac_aes_256;
    240      1.38  drochner 			break;
    241      1.38  drochner 		}
    242      1.38  drochner 		memset(&cria, 0, sizeof(cria));
    243      1.38  drochner 		cria.cri_alg = sav->tdb_authalgxform->type;
    244      1.38  drochner 		cria.cri_klen = _KEYBITS(sav->key_enc);
    245      1.38  drochner 		cria.cri_key = _KEYBUF(sav->key_enc);
    246      1.38  drochner 	}
    247      1.38  drochner 
    248       1.1  jonathan 	/* Initialize crypto session. */
    249      1.20    cegger 	memset(&crie, 0, sizeof (crie));
    250       1.1  jonathan 	crie.cri_alg = sav->tdb_encalgxform->type;
    251       1.1  jonathan 	crie.cri_klen = _KEYBITS(sav->key_enc);
    252       1.1  jonathan 	crie.cri_key = _KEYBUF(sav->key_enc);
    253       1.1  jonathan 	/* XXX Rounds ? */
    254       1.1  jonathan 
    255       1.1  jonathan 	if (sav->tdb_authalgxform && sav->tdb_encalgxform) {
    256       1.1  jonathan 		/* init both auth & enc */
    257       1.1  jonathan 		crie.cri_next = &cria;
    258       1.1  jonathan 		error = crypto_newsession(&sav->tdb_cryptoid,
    259       1.1  jonathan 					  &crie, crypto_support);
    260       1.1  jonathan 	} else if (sav->tdb_encalgxform) {
    261       1.1  jonathan 		error = crypto_newsession(&sav->tdb_cryptoid,
    262       1.1  jonathan 					  &crie, crypto_support);
    263       1.1  jonathan 	} else if (sav->tdb_authalgxform) {
    264       1.1  jonathan 		error = crypto_newsession(&sav->tdb_cryptoid,
    265       1.1  jonathan 					  &cria, crypto_support);
    266       1.1  jonathan 	} else {
    267       1.1  jonathan 		/* XXX cannot happen? */
    268       1.1  jonathan 		DPRINTF(("esp_init: no encoding OR authentication xform!\n"));
    269       1.1  jonathan 		error = EINVAL;
    270       1.1  jonathan 	}
    271       1.1  jonathan 	return error;
    272       1.1  jonathan }
    273       1.1  jonathan 
    274       1.1  jonathan /*
    275       1.1  jonathan  * Paranoia.
    276       1.1  jonathan  */
    277       1.1  jonathan static int
    278       1.1  jonathan esp_zeroize(struct secasvar *sav)
    279       1.1  jonathan {
    280       1.1  jonathan 	/* NB: ah_zerorize free's the crypto session state */
    281       1.1  jonathan 	int error = ah_zeroize(sav);
    282       1.1  jonathan 
    283       1.1  jonathan 	if (sav->key_enc)
    284      1.20    cegger 		memset(_KEYBUF(sav->key_enc), 0, _KEYLEN(sav->key_enc));
    285       1.1  jonathan 	sav->tdb_encalgxform = NULL;
    286       1.1  jonathan 	sav->tdb_xform = NULL;
    287       1.1  jonathan 	return error;
    288       1.1  jonathan }
    289       1.1  jonathan 
    290       1.1  jonathan /*
    291       1.1  jonathan  * ESP input processing, called (eventually) through the protocol switch.
    292       1.1  jonathan  */
    293       1.1  jonathan static int
    294      1.27  drochner esp_input(struct mbuf *m, const struct secasvar *sav, int skip, int protoff)
    295       1.1  jonathan {
    296      1.28  drochner 	const struct auth_hash *esph;
    297      1.28  drochner 	const struct enc_xform *espx;
    298       1.1  jonathan 	struct tdb_ident *tdbi;
    299       1.1  jonathan 	struct tdb_crypto *tc;
    300  1.39.6.1       mrg 	int plen, alen, hlen, error;
    301       1.1  jonathan 	struct m_tag *mtag;
    302       1.1  jonathan 	struct newesp *esp;
    303       1.1  jonathan 
    304       1.1  jonathan 	struct cryptodesc *crde;
    305       1.1  jonathan 	struct cryptop *crp;
    306       1.1  jonathan 
    307       1.1  jonathan 	IPSEC_SPLASSERT_SOFTNET("esp_input");
    308       1.1  jonathan 
    309       1.1  jonathan 	IPSEC_ASSERT(sav != NULL, ("esp_input: null SA"));
    310       1.1  jonathan 	IPSEC_ASSERT(sav->tdb_encalgxform != NULL,
    311       1.1  jonathan 		("esp_input: null encoding xform"));
    312       1.1  jonathan 	IPSEC_ASSERT((skip&3) == 0 && (m->m_pkthdr.len&3) == 0,
    313       1.1  jonathan 		("esp_input: misaligned packet, skip %u pkt len %u",
    314       1.1  jonathan 			skip, m->m_pkthdr.len));
    315       1.1  jonathan 
    316       1.1  jonathan 	/* XXX don't pullup, just copy header */
    317       1.1  jonathan 	IP6_EXTHDR_GET(esp, struct newesp *, m, skip, sizeof (struct newesp));
    318       1.1  jonathan 
    319       1.1  jonathan 	esph = sav->tdb_authalgxform;
    320       1.1  jonathan 	espx = sav->tdb_encalgxform;
    321       1.1  jonathan 
    322       1.1  jonathan 	/* Determine the ESP header length */
    323       1.1  jonathan 	if (sav->flags & SADB_X_EXT_OLD)
    324       1.1  jonathan 		hlen = sizeof (struct esp) + sav->ivlen;
    325       1.1  jonathan 	else
    326       1.1  jonathan 		hlen = sizeof (struct newesp) + sav->ivlen;
    327       1.1  jonathan 	/* Authenticator hash size */
    328      1.30  drochner 	alen = esph ? esph->authsize : 0;
    329       1.1  jonathan 
    330       1.1  jonathan 	/*
    331       1.1  jonathan 	 * Verify payload length is multiple of encryption algorithm
    332       1.1  jonathan 	 * block size.
    333       1.1  jonathan 	 *
    334       1.1  jonathan 	 * NB: This works for the null algorithm because the blocksize
    335       1.1  jonathan 	 *     is 4 and all packets must be 4-byte aligned regardless
    336       1.1  jonathan 	 *     of the algorithm.
    337       1.1  jonathan 	 */
    338       1.1  jonathan 	plen = m->m_pkthdr.len - (skip + hlen + alen);
    339       1.1  jonathan 	if ((plen & (espx->blocksize - 1)) || (plen <= 0)) {
    340       1.1  jonathan 		DPRINTF(("esp_input: "
    341       1.1  jonathan 		    "payload of %d octets not a multiple of %d octets,"
    342       1.1  jonathan 		    "  SA %s/%08lx\n",
    343       1.1  jonathan 		    plen, espx->blocksize,
    344       1.1  jonathan 		    ipsec_address(&sav->sah->saidx.dst),
    345       1.1  jonathan 		    (u_long) ntohl(sav->spi)));
    346      1.18   thorpej 		ESP_STATINC(ESP_STAT_BADILEN);
    347       1.1  jonathan 		m_freem(m);
    348       1.1  jonathan 		return EINVAL;
    349       1.1  jonathan 	}
    350       1.1  jonathan 
    351       1.1  jonathan 	/*
    352       1.1  jonathan 	 * Check sequence number.
    353       1.1  jonathan 	 */
    354       1.1  jonathan 	if (esph && sav->replay && !ipsec_chkreplay(ntohl(esp->esp_seq), sav)) {
    355       1.1  jonathan 		DPRINTF(("esp_input: packet replay check for %s\n",
    356       1.1  jonathan 		    ipsec_logsastr(sav)));	/*XXX*/
    357      1.18   thorpej 		ESP_STATINC(ESP_STAT_REPLAY);
    358       1.1  jonathan 		m_freem(m);
    359       1.1  jonathan 		return ENOBUFS;		/*XXX*/
    360       1.1  jonathan 	}
    361       1.1  jonathan 
    362       1.1  jonathan 	/* Update the counters */
    363      1.18   thorpej 	ESP_STATADD(ESP_STAT_IBYTES, m->m_pkthdr.len - skip - hlen - alen);
    364       1.1  jonathan 
    365       1.1  jonathan 	/* Find out if we've already done crypto */
    366       1.1  jonathan 	for (mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_CRYPTO_DONE, NULL);
    367       1.1  jonathan 	     mtag != NULL;
    368       1.1  jonathan 	     mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_CRYPTO_DONE, mtag)) {
    369       1.1  jonathan 		tdbi = (struct tdb_ident *) (mtag + 1);
    370       1.1  jonathan 		if (tdbi->proto == sav->sah->saidx.proto &&
    371       1.1  jonathan 		    tdbi->spi == sav->spi &&
    372      1.19    cegger 		    !memcmp(&tdbi->dst, &sav->sah->saidx.dst,
    373       1.1  jonathan 			  sizeof(union sockaddr_union)))
    374       1.1  jonathan 			break;
    375       1.1  jonathan 	}
    376       1.1  jonathan 
    377       1.1  jonathan 	/* Get crypto descriptors */
    378       1.1  jonathan 	crp = crypto_getreq(esph && espx ? 2 : 1);
    379       1.1  jonathan 	if (crp == NULL) {
    380       1.1  jonathan 		DPRINTF(("esp_input: failed to acquire crypto descriptors\n"));
    381      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
    382       1.1  jonathan 		m_freem(m);
    383       1.1  jonathan 		return ENOBUFS;
    384       1.1  jonathan 	}
    385       1.1  jonathan 
    386       1.1  jonathan 	/* Get IPsec-specific opaque pointer */
    387       1.1  jonathan 	if (esph == NULL || mtag != NULL)
    388       1.1  jonathan 		tc = (struct tdb_crypto *) malloc(sizeof(struct tdb_crypto),
    389       1.1  jonathan 		    M_XDATA, M_NOWAIT|M_ZERO);
    390       1.1  jonathan 	else
    391       1.1  jonathan 		tc = (struct tdb_crypto *) malloc(sizeof(struct tdb_crypto) + alen,
    392       1.1  jonathan 		    M_XDATA, M_NOWAIT|M_ZERO);
    393       1.1  jonathan 	if (tc == NULL) {
    394       1.1  jonathan 		crypto_freereq(crp);
    395       1.1  jonathan 		DPRINTF(("esp_input: failed to allocate tdb_crypto\n"));
    396      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
    397       1.1  jonathan 		m_freem(m);
    398       1.1  jonathan 		return ENOBUFS;
    399       1.1  jonathan 	}
    400       1.1  jonathan 
    401  1.39.6.1       mrg 	error = m_makewritable(&m, 0, m->m_pkthdr.len, M_NOWAIT);
    402  1.39.6.1       mrg 	if (error) {
    403  1.39.6.1       mrg 		m_freem(m);
    404  1.39.6.1       mrg 		free(tc, M_XDATA);
    405  1.39.6.1       mrg 		crypto_freereq(crp);
    406  1.39.6.1       mrg 		DPRINTF(("esp_input: m_makewritable failed\n"));
    407  1.39.6.1       mrg 		ESP_STATINC(ESP_STAT_CRYPTO);
    408  1.39.6.1       mrg 		return error;
    409  1.39.6.1       mrg 	}
    410  1.39.6.1       mrg 
    411      1.15  degroote 	tc->tc_ptr = mtag;
    412       1.1  jonathan 
    413       1.1  jonathan 	if (esph) {
    414       1.1  jonathan 		struct cryptodesc *crda = crp->crp_desc;
    415       1.1  jonathan 
    416       1.1  jonathan 		IPSEC_ASSERT(crda != NULL, ("esp_input: null ah crypto descriptor"));
    417       1.1  jonathan 
    418       1.1  jonathan 		/* Authentication descriptor */
    419       1.1  jonathan 		crda->crd_skip = skip;
    420      1.38  drochner 		if (espx && espx->type == CRYPTO_AES_GCM_16)
    421      1.38  drochner 			crda->crd_len = hlen - sav->ivlen;
    422      1.38  drochner 		else
    423      1.38  drochner 			crda->crd_len = m->m_pkthdr.len - (skip + alen);
    424       1.1  jonathan 		crda->crd_inject = m->m_pkthdr.len - alen;
    425       1.1  jonathan 
    426       1.1  jonathan 		crda->crd_alg = esph->type;
    427      1.38  drochner 		if (espx && (espx->type == CRYPTO_AES_GCM_16 ||
    428      1.38  drochner 			     espx->type == CRYPTO_AES_GMAC)) {
    429      1.38  drochner 			crda->crd_key = _KEYBUF(sav->key_enc);
    430      1.38  drochner 			crda->crd_klen = _KEYBITS(sav->key_enc);
    431      1.38  drochner 		} else {
    432      1.38  drochner 			crda->crd_key = _KEYBUF(sav->key_auth);
    433      1.38  drochner 			crda->crd_klen = _KEYBITS(sav->key_auth);
    434      1.38  drochner 		}
    435       1.1  jonathan 
    436       1.1  jonathan 		/* Copy the authenticator */
    437       1.1  jonathan 		if (mtag == NULL)
    438       1.1  jonathan 			m_copydata(m, m->m_pkthdr.len - alen, alen,
    439      1.15  degroote 				      (tc + 1));
    440       1.1  jonathan 
    441       1.1  jonathan 		/* Chain authentication request */
    442       1.1  jonathan 		crde = crda->crd_next;
    443       1.1  jonathan 	} else {
    444       1.1  jonathan 		crde = crp->crp_desc;
    445       1.1  jonathan 	}
    446       1.1  jonathan 
    447       1.1  jonathan 	/* Crypto operation descriptor */
    448       1.1  jonathan 	crp->crp_ilen = m->m_pkthdr.len; /* Total input length */
    449       1.1  jonathan 	crp->crp_flags = CRYPTO_F_IMBUF;
    450      1.15  degroote 	crp->crp_buf = m;
    451       1.1  jonathan 	crp->crp_callback = esp_input_cb;
    452       1.1  jonathan 	crp->crp_sid = sav->tdb_cryptoid;
    453      1.15  degroote 	crp->crp_opaque = tc;
    454       1.1  jonathan 
    455       1.1  jonathan 	/* These are passed as-is to the callback */
    456       1.1  jonathan 	tc->tc_spi = sav->spi;
    457       1.1  jonathan 	tc->tc_dst = sav->sah->saidx.dst;
    458       1.1  jonathan 	tc->tc_proto = sav->sah->saidx.proto;
    459       1.1  jonathan 	tc->tc_protoff = protoff;
    460       1.1  jonathan 	tc->tc_skip = skip;
    461       1.1  jonathan 
    462       1.1  jonathan 	/* Decryption descriptor */
    463       1.1  jonathan 	if (espx) {
    464       1.1  jonathan 		IPSEC_ASSERT(crde != NULL, ("esp_input: null esp crypto descriptor"));
    465       1.1  jonathan 		crde->crd_skip = skip + hlen;
    466      1.38  drochner 		if (espx->type == CRYPTO_AES_GMAC)
    467      1.38  drochner 			crde->crd_len = 0;
    468      1.38  drochner 		else
    469      1.38  drochner 			crde->crd_len = m->m_pkthdr.len - (skip + hlen + alen);
    470       1.1  jonathan 		crde->crd_inject = skip + hlen - sav->ivlen;
    471       1.1  jonathan 
    472       1.1  jonathan 		crde->crd_alg = espx->type;
    473       1.1  jonathan 		crde->crd_key = _KEYBUF(sav->key_enc);
    474       1.1  jonathan 		crde->crd_klen = _KEYBITS(sav->key_enc);
    475       1.1  jonathan 		/* XXX Rounds ? */
    476       1.1  jonathan 	}
    477       1.1  jonathan 
    478       1.1  jonathan 	if (mtag == NULL)
    479       1.1  jonathan 		return crypto_dispatch(crp);
    480       1.1  jonathan 	else
    481       1.1  jonathan 		return esp_input_cb(crp);
    482       1.1  jonathan }
    483       1.1  jonathan 
    484       1.1  jonathan #ifdef INET6
    485       1.1  jonathan #define	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, mtag) do {		     \
    486       1.1  jonathan 	if (saidx->dst.sa.sa_family == AF_INET6) {			     \
    487       1.1  jonathan 		error = ipsec6_common_input_cb(m, sav, skip, protoff, mtag); \
    488       1.1  jonathan 	} else {							     \
    489       1.1  jonathan 		error = ipsec4_common_input_cb(m, sav, skip, protoff, mtag); \
    490       1.1  jonathan 	}								     \
    491       1.1  jonathan } while (0)
    492       1.1  jonathan #else
    493       1.1  jonathan #define	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, mtag)		     \
    494       1.1  jonathan 	(error = ipsec4_common_input_cb(m, sav, skip, protoff, mtag))
    495       1.1  jonathan #endif
    496       1.1  jonathan 
    497       1.1  jonathan /*
    498       1.1  jonathan  * ESP input callback from the crypto driver.
    499       1.1  jonathan  */
    500       1.1  jonathan static int
    501       1.1  jonathan esp_input_cb(struct cryptop *crp)
    502       1.1  jonathan {
    503      1.30  drochner 	u_int8_t lastthree[3], aalg[AH_ALEN_MAX];
    504       1.1  jonathan 	int s, hlen, skip, protoff, error;
    505       1.1  jonathan 	struct mbuf *m;
    506       1.1  jonathan 	struct cryptodesc *crd;
    507      1.28  drochner 	const struct auth_hash *esph;
    508      1.28  drochner 	const struct enc_xform *espx;
    509       1.1  jonathan 	struct tdb_crypto *tc;
    510       1.1  jonathan 	struct m_tag *mtag;
    511       1.1  jonathan 	struct secasvar *sav;
    512       1.1  jonathan 	struct secasindex *saidx;
    513      1.13  christos 	void *ptr;
    514      1.16  degroote 	u_int16_t dport = 0;
    515      1.16  degroote 	u_int16_t sport = 0;
    516      1.16  degroote #ifdef IPSEC_NAT_T
    517      1.16  degroote 	struct m_tag * tag = NULL;
    518      1.16  degroote #endif
    519       1.1  jonathan 
    520       1.1  jonathan 	crd = crp->crp_desc;
    521       1.1  jonathan 	IPSEC_ASSERT(crd != NULL, ("esp_input_cb: null crypto descriptor!"));
    522       1.1  jonathan 
    523       1.1  jonathan 	tc = (struct tdb_crypto *) crp->crp_opaque;
    524       1.1  jonathan 	IPSEC_ASSERT(tc != NULL, ("esp_input_cb: null opaque crypto data area!"));
    525       1.1  jonathan 	skip = tc->tc_skip;
    526       1.1  jonathan 	protoff = tc->tc_protoff;
    527       1.1  jonathan 	mtag = (struct m_tag *) tc->tc_ptr;
    528       1.1  jonathan 	m = (struct mbuf *) crp->crp_buf;
    529       1.1  jonathan 
    530      1.16  degroote #ifdef IPSEC_NAT_T
    531      1.16  degroote 	/* find the source port for NAT-T */
    532      1.16  degroote 	if ((tag = m_tag_find(m, PACKET_TAG_IPSEC_NAT_T_PORTS, NULL))) {
    533      1.16  degroote 		sport = ((u_int16_t *)(tag + 1))[0];
    534      1.16  degroote 		dport = ((u_int16_t *)(tag + 1))[1];
    535      1.16  degroote 	}
    536      1.16  degroote #endif
    537      1.16  degroote 
    538      1.24  drochner 	s = splsoftnet();
    539      1.23  drochner 	mutex_enter(softnet_lock);
    540       1.1  jonathan 
    541      1.16  degroote 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, sport, dport);
    542       1.1  jonathan 	if (sav == NULL) {
    543      1.18   thorpej 		ESP_STATINC(ESP_STAT_NOTDB);
    544       1.1  jonathan 		DPRINTF(("esp_input_cb: SA expired while in crypto "
    545       1.1  jonathan 		    "(SA %s/%08lx proto %u)\n", ipsec_address(&tc->tc_dst),
    546       1.1  jonathan 		    (u_long) ntohl(tc->tc_spi), tc->tc_proto));
    547       1.1  jonathan 		error = ENOBUFS;		/*XXX*/
    548       1.1  jonathan 		goto bad;
    549       1.1  jonathan 	}
    550       1.1  jonathan 
    551       1.1  jonathan 	saidx = &sav->sah->saidx;
    552       1.1  jonathan 	IPSEC_ASSERT(saidx->dst.sa.sa_family == AF_INET ||
    553       1.1  jonathan 		saidx->dst.sa.sa_family == AF_INET6,
    554      1.33  drochner 		("esp_input_cb: unexpected protocol family %u",
    555       1.1  jonathan 		 saidx->dst.sa.sa_family));
    556       1.1  jonathan 
    557       1.1  jonathan 	esph = sav->tdb_authalgxform;
    558       1.1  jonathan 	espx = sav->tdb_encalgxform;
    559       1.1  jonathan 
    560       1.1  jonathan 	/* Check for crypto errors */
    561       1.1  jonathan 	if (crp->crp_etype) {
    562       1.1  jonathan 		/* Reset the session ID */
    563       1.1  jonathan 		if (sav->tdb_cryptoid != 0)
    564       1.1  jonathan 			sav->tdb_cryptoid = crp->crp_sid;
    565       1.1  jonathan 
    566       1.1  jonathan 		if (crp->crp_etype == EAGAIN) {
    567       1.1  jonathan 			KEY_FREESAV(&sav);
    568      1.24  drochner 			mutex_exit(softnet_lock);
    569       1.1  jonathan 			splx(s);
    570       1.1  jonathan 			return crypto_dispatch(crp);
    571       1.1  jonathan 		}
    572       1.1  jonathan 
    573      1.18   thorpej 		ESP_STATINC(ESP_STAT_NOXFORM);
    574       1.1  jonathan 		DPRINTF(("esp_input_cb: crypto error %d\n", crp->crp_etype));
    575       1.1  jonathan 		error = crp->crp_etype;
    576       1.1  jonathan 		goto bad;
    577       1.1  jonathan 	}
    578       1.1  jonathan 
    579       1.1  jonathan 	/* Shouldn't happen... */
    580       1.1  jonathan 	if (m == NULL) {
    581      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
    582       1.1  jonathan 		DPRINTF(("esp_input_cb: bogus returned buffer from crypto\n"));
    583       1.1  jonathan 		error = EINVAL;
    584       1.1  jonathan 		goto bad;
    585       1.1  jonathan 	}
    586      1.18   thorpej 	ESP_STATINC(ESP_STAT_HIST + sav->alg_enc);
    587       1.1  jonathan 
    588       1.1  jonathan 	/* If authentication was performed, check now. */
    589       1.1  jonathan 	if (esph != NULL) {
    590       1.1  jonathan 		/*
    591       1.1  jonathan 		 * If we have a tag, it means an IPsec-aware NIC did
    592       1.1  jonathan 		 * the verification for us.  Otherwise we need to
    593       1.1  jonathan 		 * check the authentication calculation.
    594       1.1  jonathan 		 */
    595      1.18   thorpej 		AH_STATINC(AH_STAT_HIST + sav->alg_auth);
    596       1.1  jonathan 		if (mtag == NULL) {
    597       1.1  jonathan 			/* Copy the authenticator from the packet */
    598       1.1  jonathan 			m_copydata(m, m->m_pkthdr.len - esph->authsize,
    599       1.1  jonathan 				esph->authsize, aalg);
    600       1.1  jonathan 
    601      1.15  degroote 			ptr = (tc + 1);
    602       1.1  jonathan 
    603       1.1  jonathan 			/* Verify authenticator */
    604      1.19    cegger 			if (memcmp(ptr, aalg, esph->authsize) != 0) {
    605       1.1  jonathan 				DPRINTF(("esp_input_cb: "
    606       1.1  jonathan 		    "authentication hash mismatch for packet in SA %s/%08lx\n",
    607       1.1  jonathan 				    ipsec_address(&saidx->dst),
    608       1.1  jonathan 				    (u_long) ntohl(sav->spi)));
    609      1.18   thorpej 				ESP_STATINC(ESP_STAT_BADAUTH);
    610       1.1  jonathan 				error = EACCES;
    611       1.1  jonathan 				goto bad;
    612       1.1  jonathan 			}
    613       1.1  jonathan 		}
    614       1.1  jonathan 
    615       1.1  jonathan 		/* Remove trailing authenticator */
    616       1.1  jonathan 		m_adj(m, -(esph->authsize));
    617       1.1  jonathan 	}
    618       1.1  jonathan 
    619       1.1  jonathan 	/* Release the crypto descriptors */
    620       1.1  jonathan 	free(tc, M_XDATA), tc = NULL;
    621       1.1  jonathan 	crypto_freereq(crp), crp = NULL;
    622       1.1  jonathan 
    623       1.1  jonathan 	/*
    624       1.1  jonathan 	 * Packet is now decrypted.
    625       1.1  jonathan 	 */
    626       1.1  jonathan 	m->m_flags |= M_DECRYPTED;
    627       1.1  jonathan 
    628       1.8    rpaulo 	/*
    629       1.8    rpaulo 	 * Update replay sequence number, if appropriate.
    630       1.8    rpaulo 	 */
    631       1.8    rpaulo 	if (sav->replay) {
    632       1.8    rpaulo 		u_int32_t seq;
    633       1.8    rpaulo 
    634       1.8    rpaulo 		m_copydata(m, skip + offsetof(struct newesp, esp_seq),
    635      1.15  degroote 		    sizeof (seq), &seq);
    636       1.8    rpaulo 		if (ipsec_updatereplay(ntohl(seq), sav)) {
    637       1.8    rpaulo 			DPRINTF(("%s: packet replay check for %s\n", __func__,
    638       1.8    rpaulo 			    ipsec_logsastr(sav)));
    639      1.18   thorpej 			ESP_STATINC(ESP_STAT_REPLAY);
    640       1.8    rpaulo 			error = ENOBUFS;
    641       1.8    rpaulo 			goto bad;
    642       1.8    rpaulo 		}
    643       1.8    rpaulo 	}
    644       1.8    rpaulo 
    645       1.1  jonathan 	/* Determine the ESP header length */
    646       1.1  jonathan 	if (sav->flags & SADB_X_EXT_OLD)
    647       1.1  jonathan 		hlen = sizeof (struct esp) + sav->ivlen;
    648       1.1  jonathan 	else
    649       1.1  jonathan 		hlen = sizeof (struct newesp) + sav->ivlen;
    650       1.1  jonathan 
    651       1.1  jonathan 	/* Remove the ESP header and IV from the mbuf. */
    652       1.1  jonathan 	error = m_striphdr(m, skip, hlen);
    653       1.1  jonathan 	if (error) {
    654      1.18   thorpej 		ESP_STATINC(ESP_STAT_HDROPS);
    655       1.1  jonathan 		DPRINTF(("esp_input_cb: bad mbuf chain, SA %s/%08lx\n",
    656       1.1  jonathan 		    ipsec_address(&sav->sah->saidx.dst),
    657       1.1  jonathan 		    (u_long) ntohl(sav->spi)));
    658       1.1  jonathan 		goto bad;
    659       1.1  jonathan 	}
    660       1.1  jonathan 
    661       1.1  jonathan 	/* Save the last three bytes of decrypted data */
    662       1.1  jonathan 	m_copydata(m, m->m_pkthdr.len - 3, 3, lastthree);
    663       1.1  jonathan 
    664       1.1  jonathan 	/* Verify pad length */
    665       1.1  jonathan 	if (lastthree[1] + 2 > m->m_pkthdr.len - skip) {
    666      1.18   thorpej 		ESP_STATINC(ESP_STAT_BADILEN);
    667       1.1  jonathan 		DPRINTF(("esp_input_cb: invalid padding length %d "
    668       1.1  jonathan 			 "for %u byte packet in SA %s/%08lx\n",
    669       1.1  jonathan 			 lastthree[1], m->m_pkthdr.len - skip,
    670       1.1  jonathan 			 ipsec_address(&sav->sah->saidx.dst),
    671       1.1  jonathan 			 (u_long) ntohl(sav->spi)));
    672       1.1  jonathan 		error = EINVAL;
    673       1.1  jonathan 		goto bad;
    674       1.1  jonathan 	}
    675       1.1  jonathan 
    676       1.1  jonathan 	/* Verify correct decryption by checking the last padding bytes */
    677       1.1  jonathan 	if ((sav->flags & SADB_X_EXT_PMASK) != SADB_X_EXT_PRAND) {
    678       1.1  jonathan 		if (lastthree[1] != lastthree[0] && lastthree[1] != 0) {
    679      1.18   thorpej 			ESP_STATINC(ESP_STAT_BADENC);
    680       1.1  jonathan 			DPRINTF(("esp_input_cb: decryption failed "
    681       1.1  jonathan 				"for packet in SA %s/%08lx\n",
    682       1.1  jonathan 				ipsec_address(&sav->sah->saidx.dst),
    683       1.1  jonathan 				(u_long) ntohl(sav->spi)));
    684       1.1  jonathan DPRINTF(("esp_input_cb: %x %x\n", lastthree[0], lastthree[1]));
    685       1.1  jonathan 			error = EINVAL;
    686       1.1  jonathan 			goto bad;
    687       1.1  jonathan 		}
    688       1.1  jonathan 	}
    689       1.1  jonathan 
    690       1.1  jonathan 	/* Trim the mbuf chain to remove trailing authenticator and padding */
    691       1.1  jonathan 	m_adj(m, -(lastthree[1] + 2));
    692       1.1  jonathan 
    693       1.1  jonathan 	/* Restore the Next Protocol field */
    694  1.39.6.1       mrg 	m_copyback(m, protoff, sizeof (u_int8_t), lastthree + 2);
    695       1.1  jonathan 
    696       1.1  jonathan 	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, mtag);
    697       1.1  jonathan 
    698       1.1  jonathan 	KEY_FREESAV(&sav);
    699      1.24  drochner 	mutex_exit(softnet_lock);
    700       1.1  jonathan 	splx(s);
    701       1.1  jonathan 	return error;
    702       1.1  jonathan bad:
    703       1.1  jonathan 	if (sav)
    704       1.1  jonathan 		KEY_FREESAV(&sav);
    705      1.24  drochner 	mutex_exit(softnet_lock);
    706       1.1  jonathan 	splx(s);
    707       1.1  jonathan 	if (m != NULL)
    708       1.1  jonathan 		m_freem(m);
    709       1.1  jonathan 	if (tc != NULL)
    710       1.1  jonathan 		free(tc, M_XDATA);
    711       1.1  jonathan 	if (crp != NULL)
    712       1.1  jonathan 		crypto_freereq(crp);
    713       1.1  jonathan 	return error;
    714       1.1  jonathan }
    715       1.1  jonathan 
    716       1.1  jonathan /*
    717       1.1  jonathan  * ESP output routine, called by ipsec[46]_process_packet().
    718       1.1  jonathan  */
    719       1.1  jonathan static int
    720       1.1  jonathan esp_output(
    721      1.11  christos     struct mbuf *m,
    722      1.11  christos     struct ipsecrequest *isr,
    723      1.12  christos     struct mbuf **mp,
    724      1.11  christos     int skip,
    725      1.11  christos     int protoff
    726       1.1  jonathan )
    727       1.1  jonathan {
    728      1.28  drochner 	const struct enc_xform *espx;
    729      1.28  drochner 	const struct auth_hash *esph;
    730       1.1  jonathan 	int hlen, rlen, plen, padding, blks, alen, i, roff;
    731      1.39    plunky 	struct mbuf *mo = NULL;
    732       1.1  jonathan 	struct tdb_crypto *tc;
    733      1.27  drochner 	const struct secasvar *sav;
    734       1.1  jonathan 	struct secasindex *saidx;
    735       1.1  jonathan 	unsigned char *pad;
    736       1.1  jonathan 	u_int8_t prot;
    737       1.1  jonathan 	int error, maxpacketsize;
    738       1.1  jonathan 
    739       1.1  jonathan 	struct cryptodesc *crde = NULL, *crda = NULL;
    740       1.1  jonathan 	struct cryptop *crp;
    741       1.1  jonathan 
    742       1.1  jonathan 	IPSEC_SPLASSERT_SOFTNET("esp_output");
    743       1.1  jonathan 
    744       1.1  jonathan 	sav = isr->sav;
    745       1.1  jonathan 	IPSEC_ASSERT(sav != NULL, ("esp_output: null SA"));
    746       1.1  jonathan 	esph = sav->tdb_authalgxform;
    747       1.1  jonathan 	espx = sav->tdb_encalgxform;
    748       1.1  jonathan 	IPSEC_ASSERT(espx != NULL, ("esp_output: null encoding xform"));
    749       1.1  jonathan 
    750       1.1  jonathan 	if (sav->flags & SADB_X_EXT_OLD)
    751       1.1  jonathan 		hlen = sizeof (struct esp) + sav->ivlen;
    752       1.1  jonathan 	else
    753       1.1  jonathan 		hlen = sizeof (struct newesp) + sav->ivlen;
    754       1.1  jonathan 
    755       1.1  jonathan 	rlen = m->m_pkthdr.len - skip;	/* Raw payload length. */
    756       1.1  jonathan 	/*
    757       1.1  jonathan 	 * NB: The null encoding transform has a blocksize of 4
    758       1.1  jonathan 	 *     so that headers are properly aligned.
    759       1.1  jonathan 	 */
    760       1.1  jonathan 	blks = espx->blocksize;		/* IV blocksize */
    761       1.1  jonathan 
    762       1.1  jonathan 	/* XXX clamp padding length a la KAME??? */
    763       1.1  jonathan 	padding = ((blks - ((rlen + 2) % blks)) % blks) + 2;
    764       1.1  jonathan 	plen = rlen + padding;		/* Padded payload length. */
    765       1.1  jonathan 
    766       1.1  jonathan 	if (esph)
    767      1.30  drochner 		alen = esph->authsize;
    768       1.1  jonathan 	else
    769       1.1  jonathan 		alen = 0;
    770       1.1  jonathan 
    771      1.18   thorpej 	ESP_STATINC(ESP_STAT_OUTPUT);
    772       1.1  jonathan 
    773       1.1  jonathan 	saidx = &sav->sah->saidx;
    774       1.1  jonathan 	/* Check for maximum packet size violations. */
    775       1.1  jonathan 	switch (saidx->dst.sa.sa_family) {
    776       1.1  jonathan #ifdef INET
    777       1.1  jonathan 	case AF_INET:
    778       1.1  jonathan 		maxpacketsize = IP_MAXPACKET;
    779       1.1  jonathan 		break;
    780       1.1  jonathan #endif /* INET */
    781       1.1  jonathan #ifdef INET6
    782       1.1  jonathan 	case AF_INET6:
    783       1.1  jonathan 		maxpacketsize = IPV6_MAXPACKET;
    784       1.1  jonathan 		break;
    785       1.1  jonathan #endif /* INET6 */
    786       1.1  jonathan 	default:
    787       1.1  jonathan 		DPRINTF(("esp_output: unknown/unsupported protocol "
    788       1.1  jonathan 		    "family %d, SA %s/%08lx\n",
    789       1.1  jonathan 		    saidx->dst.sa.sa_family, ipsec_address(&saidx->dst),
    790       1.1  jonathan 		    (u_long) ntohl(sav->spi)));
    791      1.18   thorpej 		ESP_STATINC(ESP_STAT_NOPF);
    792       1.1  jonathan 		error = EPFNOSUPPORT;
    793       1.1  jonathan 		goto bad;
    794       1.1  jonathan 	}
    795       1.1  jonathan 	if (skip + hlen + rlen + padding + alen > maxpacketsize) {
    796       1.1  jonathan 		DPRINTF(("esp_output: packet in SA %s/%08lx got too big "
    797       1.1  jonathan 		    "(len %u, max len %u)\n",
    798       1.1  jonathan 		    ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi),
    799       1.1  jonathan 		    skip + hlen + rlen + padding + alen, maxpacketsize));
    800      1.18   thorpej 		ESP_STATINC(ESP_STAT_TOOBIG);
    801       1.1  jonathan 		error = EMSGSIZE;
    802       1.1  jonathan 		goto bad;
    803       1.1  jonathan 	}
    804       1.1  jonathan 
    805       1.1  jonathan 	/* Update the counters. */
    806      1.25  drochner 	ESP_STATADD(ESP_STAT_OBYTES, m->m_pkthdr.len - skip);
    807       1.1  jonathan 
    808       1.1  jonathan 	m = m_clone(m);
    809       1.1  jonathan 	if (m == NULL) {
    810       1.1  jonathan 		DPRINTF(("esp_output: cannot clone mbuf chain, SA %s/%08lx\n",
    811       1.1  jonathan 		    ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi)));
    812      1.18   thorpej 		ESP_STATINC(ESP_STAT_HDROPS);
    813       1.1  jonathan 		error = ENOBUFS;
    814       1.1  jonathan 		goto bad;
    815       1.1  jonathan 	}
    816       1.1  jonathan 
    817       1.1  jonathan 	/* Inject ESP header. */
    818       1.1  jonathan 	mo = m_makespace(m, skip, hlen, &roff);
    819       1.1  jonathan 	if (mo == NULL) {
    820       1.1  jonathan 		DPRINTF(("esp_output: failed to inject %u byte ESP hdr for SA "
    821       1.1  jonathan 		    "%s/%08lx\n",
    822       1.1  jonathan 		    hlen, ipsec_address(&saidx->dst),
    823       1.1  jonathan 		    (u_long) ntohl(sav->spi)));
    824      1.18   thorpej 		ESP_STATINC(ESP_STAT_HDROPS);	/* XXX diffs from openbsd */
    825       1.1  jonathan 		error = ENOBUFS;
    826       1.1  jonathan 		goto bad;
    827       1.1  jonathan 	}
    828       1.1  jonathan 
    829       1.1  jonathan 	/* Initialize ESP header. */
    830      1.22    cegger 	memcpy(mtod(mo, char *) + roff, &sav->spi, sizeof(u_int32_t));
    831       1.1  jonathan 	if (sav->replay) {
    832       1.9    rpaulo 		u_int32_t replay;
    833       1.9    rpaulo 
    834       1.9    rpaulo #ifdef IPSEC_DEBUG
    835       1.9    rpaulo 		/* Emulate replay attack when ipsec_replay is TRUE. */
    836       1.9    rpaulo 		if (!ipsec_replay)
    837       1.9    rpaulo #endif
    838       1.9    rpaulo 			sav->replay->count++;
    839       1.9    rpaulo 
    840       1.9    rpaulo 		replay = htonl(sav->replay->count);
    841      1.15  degroote 		bcopy(&replay,
    842      1.14  degroote 		    mtod(mo,char *) + roff + sizeof(u_int32_t),
    843       1.1  jonathan 		    sizeof(u_int32_t));
    844       1.1  jonathan 	}
    845       1.1  jonathan 
    846       1.1  jonathan 	/*
    847       1.1  jonathan 	 * Add padding -- better to do it ourselves than use the crypto engine,
    848       1.1  jonathan 	 * although if/when we support compression, we'd have to do that.
    849       1.1  jonathan 	 */
    850       1.1  jonathan 	pad = (u_char *) m_pad(m, padding + alen);
    851       1.1  jonathan 	if (pad == NULL) {
    852       1.1  jonathan 		DPRINTF(("esp_output: m_pad failed for SA %s/%08lx\n",
    853       1.1  jonathan 		    ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi)));
    854       1.1  jonathan 		m = NULL;		/* NB: free'd by m_pad */
    855       1.1  jonathan 		error = ENOBUFS;
    856       1.1  jonathan 		goto bad;
    857       1.1  jonathan 	}
    858       1.1  jonathan 
    859       1.1  jonathan 	/*
    860       1.1  jonathan 	 * Add padding: random, zero, or self-describing.
    861       1.1  jonathan 	 * XXX catch unexpected setting
    862       1.1  jonathan 	 */
    863       1.1  jonathan 	switch (sav->flags & SADB_X_EXT_PMASK) {
    864       1.1  jonathan 	case SADB_X_EXT_PRAND:
    865       1.1  jonathan 		(void) read_random(pad, padding - 2);
    866       1.1  jonathan 		break;
    867       1.1  jonathan 	case SADB_X_EXT_PZERO:
    868      1.20    cegger 		memset(pad, 0, padding - 2);
    869       1.1  jonathan 		break;
    870       1.1  jonathan 	case SADB_X_EXT_PSEQ:
    871       1.1  jonathan 		for (i = 0; i < padding - 2; i++)
    872       1.1  jonathan 			pad[i] = i+1;
    873       1.1  jonathan 		break;
    874       1.1  jonathan 	}
    875       1.1  jonathan 
    876       1.1  jonathan 	/* Fix padding length and Next Protocol in padding itself. */
    877       1.1  jonathan 	pad[padding - 2] = padding - 2;
    878       1.1  jonathan 	m_copydata(m, protoff, sizeof(u_int8_t), pad + padding - 1);
    879       1.1  jonathan 
    880       1.1  jonathan 	/* Fix Next Protocol in IPv4/IPv6 header. */
    881       1.1  jonathan 	prot = IPPROTO_ESP;
    882       1.1  jonathan 	m_copyback(m, protoff, sizeof(u_int8_t), (u_char *) &prot);
    883       1.1  jonathan 
    884       1.1  jonathan 	/* Get crypto descriptors. */
    885       1.1  jonathan 	crp = crypto_getreq(esph && espx ? 2 : 1);
    886       1.1  jonathan 	if (crp == NULL) {
    887       1.1  jonathan 		DPRINTF(("esp_output: failed to acquire crypto descriptors\n"));
    888      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
    889       1.1  jonathan 		error = ENOBUFS;
    890       1.1  jonathan 		goto bad;
    891       1.1  jonathan 	}
    892       1.1  jonathan 
    893       1.1  jonathan 	if (espx) {
    894       1.1  jonathan 		crde = crp->crp_desc;
    895       1.1  jonathan 		crda = crde->crd_next;
    896       1.1  jonathan 
    897       1.1  jonathan 		/* Encryption descriptor. */
    898       1.1  jonathan 		crde->crd_skip = skip + hlen;
    899      1.38  drochner 		if (espx->type == CRYPTO_AES_GMAC)
    900      1.38  drochner 			crde->crd_len = 0;
    901      1.38  drochner 		else
    902      1.38  drochner 			crde->crd_len = m->m_pkthdr.len - (skip + hlen + alen);
    903       1.1  jonathan 		crde->crd_flags = CRD_F_ENCRYPT;
    904       1.1  jonathan 		crde->crd_inject = skip + hlen - sav->ivlen;
    905       1.1  jonathan 
    906       1.1  jonathan 		/* Encryption operation. */
    907       1.1  jonathan 		crde->crd_alg = espx->type;
    908       1.1  jonathan 		crde->crd_key = _KEYBUF(sav->key_enc);
    909       1.1  jonathan 		crde->crd_klen = _KEYBITS(sav->key_enc);
    910       1.1  jonathan 		/* XXX Rounds ? */
    911       1.1  jonathan 	} else
    912       1.1  jonathan 		crda = crp->crp_desc;
    913       1.1  jonathan 
    914       1.1  jonathan 	/* IPsec-specific opaque crypto info. */
    915       1.1  jonathan 	tc = (struct tdb_crypto *) malloc(sizeof(struct tdb_crypto),
    916       1.1  jonathan 		M_XDATA, M_NOWAIT|M_ZERO);
    917       1.1  jonathan 	if (tc == NULL) {
    918       1.1  jonathan 		crypto_freereq(crp);
    919       1.1  jonathan 		DPRINTF(("esp_output: failed to allocate tdb_crypto\n"));
    920      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
    921       1.1  jonathan 		error = ENOBUFS;
    922       1.1  jonathan 		goto bad;
    923       1.1  jonathan 	}
    924       1.1  jonathan 
    925       1.1  jonathan 	/* Callback parameters */
    926       1.1  jonathan 	tc->tc_isr = isr;
    927       1.1  jonathan 	tc->tc_spi = sav->spi;
    928       1.1  jonathan 	tc->tc_dst = saidx->dst;
    929       1.1  jonathan 	tc->tc_proto = saidx->proto;
    930       1.1  jonathan 
    931       1.1  jonathan 	/* Crypto operation descriptor. */
    932       1.1  jonathan 	crp->crp_ilen = m->m_pkthdr.len; /* Total input length. */
    933       1.1  jonathan 	crp->crp_flags = CRYPTO_F_IMBUF;
    934      1.15  degroote 	crp->crp_buf = m;
    935       1.1  jonathan 	crp->crp_callback = esp_output_cb;
    936      1.15  degroote 	crp->crp_opaque = tc;
    937       1.1  jonathan 	crp->crp_sid = sav->tdb_cryptoid;
    938       1.1  jonathan 
    939       1.1  jonathan 	if (esph) {
    940       1.1  jonathan 		/* Authentication descriptor. */
    941       1.1  jonathan 		crda->crd_skip = skip;
    942      1.38  drochner 		if (espx && espx->type == CRYPTO_AES_GCM_16)
    943      1.38  drochner 			crda->crd_len = hlen - sav->ivlen;
    944      1.38  drochner 		else
    945      1.38  drochner 			crda->crd_len = m->m_pkthdr.len - (skip + alen);
    946       1.1  jonathan 		crda->crd_inject = m->m_pkthdr.len - alen;
    947       1.1  jonathan 
    948       1.1  jonathan 		/* Authentication operation. */
    949       1.1  jonathan 		crda->crd_alg = esph->type;
    950      1.38  drochner 		if (espx && (espx->type == CRYPTO_AES_GCM_16 ||
    951      1.38  drochner 			     espx->type == CRYPTO_AES_GMAC)) {
    952      1.38  drochner 			crda->crd_key = _KEYBUF(sav->key_enc);
    953      1.38  drochner 			crda->crd_klen = _KEYBITS(sav->key_enc);
    954      1.38  drochner 		} else {
    955      1.38  drochner 			crda->crd_key = _KEYBUF(sav->key_auth);
    956      1.38  drochner 			crda->crd_klen = _KEYBITS(sav->key_auth);
    957      1.38  drochner 		}
    958       1.1  jonathan 	}
    959       1.1  jonathan 
    960       1.1  jonathan 	return crypto_dispatch(crp);
    961       1.1  jonathan bad:
    962       1.1  jonathan 	if (m)
    963       1.1  jonathan 		m_freem(m);
    964       1.1  jonathan 	return (error);
    965       1.1  jonathan }
    966       1.1  jonathan 
    967       1.1  jonathan /*
    968       1.1  jonathan  * ESP output callback from the crypto driver.
    969       1.1  jonathan  */
    970       1.1  jonathan static int
    971       1.1  jonathan esp_output_cb(struct cryptop *crp)
    972       1.1  jonathan {
    973       1.1  jonathan 	struct tdb_crypto *tc;
    974       1.1  jonathan 	struct ipsecrequest *isr;
    975       1.1  jonathan 	struct secasvar *sav;
    976       1.1  jonathan 	struct mbuf *m;
    977       1.1  jonathan 	int s, err, error;
    978       1.1  jonathan 
    979       1.1  jonathan 	tc = (struct tdb_crypto *) crp->crp_opaque;
    980       1.1  jonathan 	IPSEC_ASSERT(tc != NULL, ("esp_output_cb: null opaque data area!"));
    981       1.1  jonathan 	m = (struct mbuf *) crp->crp_buf;
    982       1.1  jonathan 
    983      1.24  drochner 	s = splsoftnet();
    984      1.23  drochner 	mutex_enter(softnet_lock);
    985       1.1  jonathan 
    986       1.1  jonathan 	isr = tc->tc_isr;
    987      1.16  degroote 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, 0, 0);
    988       1.1  jonathan 	if (sav == NULL) {
    989      1.18   thorpej 		ESP_STATINC(ESP_STAT_NOTDB);
    990       1.1  jonathan 		DPRINTF(("esp_output_cb: SA expired while in crypto "
    991       1.1  jonathan 		    "(SA %s/%08lx proto %u)\n", ipsec_address(&tc->tc_dst),
    992       1.1  jonathan 		    (u_long) ntohl(tc->tc_spi), tc->tc_proto));
    993       1.1  jonathan 		error = ENOBUFS;		/*XXX*/
    994       1.1  jonathan 		goto bad;
    995       1.1  jonathan 	}
    996       1.1  jonathan 	IPSEC_ASSERT(isr->sav == sav,
    997       1.1  jonathan 		("esp_output_cb: SA changed was %p now %p\n", isr->sav, sav));
    998       1.1  jonathan 
    999       1.1  jonathan 	/* Check for crypto errors. */
   1000       1.1  jonathan 	if (crp->crp_etype) {
   1001       1.1  jonathan 		/* Reset session ID. */
   1002       1.1  jonathan 		if (sav->tdb_cryptoid != 0)
   1003       1.1  jonathan 			sav->tdb_cryptoid = crp->crp_sid;
   1004       1.1  jonathan 
   1005       1.1  jonathan 		if (crp->crp_etype == EAGAIN) {
   1006       1.1  jonathan 			KEY_FREESAV(&sav);
   1007      1.24  drochner 			mutex_exit(softnet_lock);
   1008       1.1  jonathan 			splx(s);
   1009       1.1  jonathan 			return crypto_dispatch(crp);
   1010       1.1  jonathan 		}
   1011       1.1  jonathan 
   1012      1.18   thorpej 		ESP_STATINC(ESP_STAT_NOXFORM);
   1013       1.1  jonathan 		DPRINTF(("esp_output_cb: crypto error %d\n", crp->crp_etype));
   1014       1.1  jonathan 		error = crp->crp_etype;
   1015       1.1  jonathan 		goto bad;
   1016       1.1  jonathan 	}
   1017       1.1  jonathan 
   1018       1.1  jonathan 	/* Shouldn't happen... */
   1019       1.1  jonathan 	if (m == NULL) {
   1020      1.18   thorpej 		ESP_STATINC(ESP_STAT_CRYPTO);
   1021       1.1  jonathan 		DPRINTF(("esp_output_cb: bogus returned buffer from crypto\n"));
   1022       1.1  jonathan 		error = EINVAL;
   1023       1.1  jonathan 		goto bad;
   1024       1.1  jonathan 	}
   1025      1.18   thorpej 	ESP_STATINC(ESP_STAT_HIST + sav->alg_enc);
   1026       1.1  jonathan 	if (sav->tdb_authalgxform != NULL)
   1027      1.26  drochner 		AH_STATINC(AH_STAT_HIST + sav->alg_auth);
   1028       1.1  jonathan 
   1029       1.1  jonathan 	/* Release crypto descriptors. */
   1030       1.1  jonathan 	free(tc, M_XDATA);
   1031       1.1  jonathan 	crypto_freereq(crp);
   1032       1.1  jonathan 
   1033       1.9    rpaulo #ifdef IPSEC_DEBUG
   1034       1.9    rpaulo 	/* Emulate man-in-the-middle attack when ipsec_integrity is TRUE. */
   1035       1.9    rpaulo 	if (ipsec_integrity) {
   1036      1.30  drochner 		static unsigned char ipseczeroes[AH_ALEN_MAX];
   1037      1.29  degroote 		const struct auth_hash *esph;
   1038       1.9    rpaulo 
   1039       1.9    rpaulo 		/*
   1040       1.9    rpaulo 		 * Corrupt HMAC if we want to test integrity verification of
   1041       1.9    rpaulo 		 * the other side.
   1042       1.9    rpaulo 		 */
   1043       1.9    rpaulo 		esph = sav->tdb_authalgxform;
   1044       1.9    rpaulo 		if (esph !=  NULL) {
   1045      1.31       spz 			m_copyback(m, m->m_pkthdr.len - esph->authsize,
   1046      1.31       spz 			    esph->authsize, ipseczeroes);
   1047       1.9    rpaulo 		}
   1048       1.9    rpaulo 	}
   1049       1.9    rpaulo #endif
   1050       1.9    rpaulo 
   1051       1.1  jonathan 	/* NB: m is reclaimed by ipsec_process_done. */
   1052       1.1  jonathan 	err = ipsec_process_done(m, isr);
   1053       1.1  jonathan 	KEY_FREESAV(&sav);
   1054      1.24  drochner 	mutex_exit(softnet_lock);
   1055       1.1  jonathan 	splx(s);
   1056       1.1  jonathan 	return err;
   1057       1.1  jonathan bad:
   1058       1.1  jonathan 	if (sav)
   1059       1.1  jonathan 		KEY_FREESAV(&sav);
   1060      1.24  drochner 	mutex_exit(softnet_lock);
   1061       1.1  jonathan 	splx(s);
   1062       1.1  jonathan 	if (m)
   1063       1.1  jonathan 		m_freem(m);
   1064       1.1  jonathan 	free(tc, M_XDATA);
   1065       1.1  jonathan 	crypto_freereq(crp);
   1066       1.1  jonathan 	return error;
   1067       1.1  jonathan }
   1068       1.1  jonathan 
   1069       1.1  jonathan static struct xformsw esp_xformsw = {
   1070       1.1  jonathan 	XF_ESP,		XFT_CONF|XFT_AUTH,	"IPsec ESP",
   1071       1.1  jonathan 	esp_init,	esp_zeroize,		esp_input,
   1072      1.11  christos 	esp_output,
   1073      1.11  christos 	NULL,
   1074       1.1  jonathan };
   1075       1.1  jonathan 
   1076       1.1  jonathan INITFN void
   1077       1.1  jonathan esp_attach(void)
   1078       1.1  jonathan {
   1079      1.18   thorpej 
   1080      1.18   thorpej 	espstat_percpu = percpu_alloc(sizeof(uint64_t) * ESP_NSTATS);
   1081      1.18   thorpej 
   1082       1.1  jonathan #define	MAXIV(xform)					\
   1083      1.35  drochner 	if (xform.ivsize > esp_max_ivlen)		\
   1084      1.35  drochner 		esp_max_ivlen = xform.ivsize		\
   1085       1.1  jonathan 
   1086       1.1  jonathan 	esp_max_ivlen = 0;
   1087       1.1  jonathan 	MAXIV(enc_xform_des);		/* SADB_EALG_DESCBC */
   1088       1.1  jonathan 	MAXIV(enc_xform_3des);		/* SADB_EALG_3DESCBC */
   1089       1.1  jonathan 	MAXIV(enc_xform_rijndael128);	/* SADB_X_EALG_AES */
   1090       1.1  jonathan 	MAXIV(enc_xform_blf);		/* SADB_X_EALG_BLOWFISHCBC */
   1091       1.1  jonathan 	MAXIV(enc_xform_cast5);		/* SADB_X_EALG_CAST128CBC */
   1092       1.1  jonathan 	MAXIV(enc_xform_skipjack);	/* SADB_X_EALG_SKIPJACK */
   1093      1.32  drochner 	MAXIV(enc_xform_camellia);	/* SADB_X_EALG_CAMELLIACBC */
   1094      1.36  drochner 	MAXIV(enc_xform_aes_ctr);	/* SADB_X_EALG_AESCTR */
   1095       1.1  jonathan 	MAXIV(enc_xform_null);		/* SADB_EALG_NULL */
   1096       1.1  jonathan 
   1097       1.1  jonathan 	xform_register(&esp_xformsw);
   1098       1.1  jonathan #undef MAXIV
   1099       1.1  jonathan }
   1100       1.1  jonathan #ifdef __FreeBSD__
   1101       1.1  jonathan SYSINIT(esp_xform_init, SI_SUB_DRIVERS, SI_ORDER_FIRST, esp_attach, NULL)
   1102       1.1  jonathan #else
   1103       1.1  jonathan #endif
   1104