Home | History | Annotate | Download | only in kssl
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include <sys/types.h>
     27 #include <sys/stream.h>
     28 #include <sys/strsubr.h>
     29 #include <sys/stropts.h>
     30 #include <sys/strsun.h>
     31 #define	_SUN_TPI_VERSION 2
     32 #include <sys/ddi.h>
     33 #include <sys/sunddi.h>
     34 #include <sys/debug.h>
     35 #include <sys/vtrace.h>
     36 #include <sys/kmem.h>
     37 #include <sys/cpuvar.h>
     38 #include <sys/atomic.h>
     39 #include <sys/sysmacros.h>
     40 
     41 #include <sys/errno.h>
     42 #include <sys/isa_defs.h>
     43 #include <sys/md5.h>
     44 #include <sys/sha1.h>
     45 #include <sys/random.h>
     46 #include <inet/common.h>
     47 #include <netinet/in.h>
     48 
     49 #include <sys/systm.h>
     50 #include <sys/param.h>
     51 
     52 #include "ksslimpl.h"
     53 #include "ksslapi.h"
     54 #include "ksslproto.h"
     55 
     56 static ssl3CipherSuiteDef cipher_suite_defs[] = {
     57 	/* 2 X 16 byte keys +  2 x 20 byte MAC secrets, no IVs */
     58 	{SSL_RSA_WITH_RC4_128_SHA,	cipher_rc4,	mac_sha,	72},
     59 
     60 	/* 2 X 16 byte keys +  2 x 16 byte MAC secrets, no IVs */
     61 	{SSL_RSA_WITH_RC4_128_MD5,	cipher_rc4,	mac_md5,	64},
     62 
     63 	/* 2 X 8 byte keys +  2 x 20 byte MAC secrets, 2 x 8 byte IVs */
     64 	{SSL_RSA_WITH_DES_CBC_SHA,	cipher_des,	mac_sha,	72},
     65 
     66 	/* 2 X 24 byte keys +  2 x 20 byte MAC secrets, 2 x 8 byte IVs */
     67 	{SSL_RSA_WITH_3DES_EDE_CBC_SHA,	cipher_3des,	mac_sha,	104},
     68 
     69 	/* 2 X 16 byte keys +  2 x 20 byte MAC secrets, 2 x 16 byte IVs */
     70 	{TLS_RSA_WITH_AES_128_CBC_SHA,	cipher_aes128,	mac_sha,	104},
     71 
     72 	/* 2 X 32 byte keys +  2 x 20 byte MAC secrets, 2 x 16 byte IVs */
     73 	{TLS_RSA_WITH_AES_256_CBC_SHA,	cipher_aes256,	mac_sha,	136},
     74 
     75 	{SSL_RSA_WITH_NULL_SHA,		cipher_null,	mac_sha,	40}
     76 };
     77 
     78 static int cipher_suite_defs_nentries =
     79     sizeof (cipher_suite_defs) / sizeof (cipher_suite_defs[0]);
     80 
     81 static KSSLMACDef mac_defs[] = { /* indexed by SSL3MACAlgorithm */
     82 	/* macsz padsz HashInit HashUpdate HashFinal */
     83 
     84 	{MD5_HASH_LEN, SSL3_MD5_PAD_LEN,
     85 	    (hashinit_func_t)MD5Init, (hashupdate_func_t)MD5Update,
     86 	    (hashfinal_func_t)MD5Final},
     87 
     88 	{SHA1_HASH_LEN, SSL3_SHA1_PAD_LEN,
     89 	    (hashinit_func_t)SHA1Init, (hashupdate_func_t)SHA1Update,
     90 	    (hashfinal_func_t)SHA1Final},
     91 };
     92 
     93 static uchar_t kssl_pad_1[60] = {
     94     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     95     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     96     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     97     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     98     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
     99     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
    100     0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
    101     0x36, 0x36, 0x36, 0x36
    102 };
    103 static uchar_t kssl_pad_2[60] = {
    104     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    105     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    106     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    107     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    108     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    109     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    110     0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
    111     0x5c, 0x5c, 0x5c, 0x5c
    112 };
    113 
    114 int kssl_cache_count;
    115 static boolean_t kssl_synchronous = B_FALSE;
    116 
    117 static void kssl_update_handshake_hashes(ssl_t *, uchar_t *, uint_t);
    118 static int kssl_compute_handshake_hashes(ssl_t *, SSL3Hashes *, uint32_t);
    119 static int kssl_handle_client_hello(ssl_t *, mblk_t *, int);
    120 static int kssl_handle_client_key_exchange(ssl_t *, mblk_t *, int,
    121     kssl_callback_t, void *);
    122 static int kssl_send_server_hello(ssl_t *);
    123 static int kssl_send_certificate_and_server_hello_done(ssl_t *);
    124 static int kssl_send_change_cipher_specs(ssl_t *);
    125 static int kssl_send_finished(ssl_t *, int);
    126 static int kssl_handle_finished(ssl_t *, mblk_t *, int);
    127 static void kssl_get_hello_random(uchar_t *);
    128 static uchar_t *kssl_rsa_unwrap(uchar_t *, size_t *);
    129 static void kssl_cache_sid(sslSessionID *, kssl_entry_t *);
    130 static void kssl_lookup_sid(sslSessionID *, uchar_t *, in6_addr_t *,
    131     kssl_entry_t *);
    132 static int kssl_generate_tls_ms(ssl_t *, uchar_t *, size_t);
    133 static void kssl_generate_ssl_ms(ssl_t *, uchar_t *, size_t);
    134 static int kssl_generate_tls_keyblock(ssl_t *);
    135 static void kssl_generate_keyblock(ssl_t *);
    136 static void kssl_ssl3_key_material_derive_step(ssl_t *, uchar_t *, size_t,
    137     int, uchar_t *, int);
    138 static int kssl_tls_PRF(ssl_t *, uchar_t *, size_t,
    139     uchar_t *, size_t, uchar_t *, size_t, uchar_t *, size_t);
    140 static int kssl_tls_P_hash(crypto_mechanism_t *, crypto_key_t *,
    141     size_t, uchar_t *, size_t, uchar_t *, size_t, uchar_t *, size_t);
    142 static void kssl_cke_done(void *, int);
    143 
    144 #define	HMAC_INIT(m, k, c) \
    145 	rv = crypto_mac_init(m, k, NULL, c, NULL); if (CRYPTO_ERR(rv)) goto end;
    146 
    147 #define	HMAC_UPDATE(c, d, l) \
    148 	dd.cd_raw.iov_base = (char *)d; \
    149 	dd.cd_length = dd.cd_raw.iov_len = l; \
    150 	rv = crypto_mac_update(c, &dd, NULL); if (CRYPTO_ERR(rv)) goto end;
    151 
    152 #define	HMAC_FINAL(c, d, l) \
    153 	mac.cd_raw.iov_base = (char *)d; \
    154 	mac.cd_length = mac.cd_raw.iov_len = l; \
    155 	rv = crypto_mac_final(c, &mac, NULL); if (CRYPTO_ERR(rv)) goto end;
    156 
    157 /*
    158  * This hack can go away once we have SSL3 MAC support by KCF
    159  * software providers (See 4873559).
    160  */
    161 extern int kcf_md5_threshold;
    162 
    163 int
    164 kssl_compute_record_mac(
    165 	ssl_t *ssl,
    166 	int direction,
    167 	uint64_t seq_num,
    168 	SSL3ContentType ct,
    169 	uchar_t *versionp,
    170 	uchar_t *buf,
    171 	int len,
    172 	uchar_t *digest)
    173 {
    174 	KSSL_HASHCTX mac_ctx;
    175 	KSSL_HASHCTX *ctx = &mac_ctx;
    176 	uchar_t temp[16], *p;
    177 	KSSLCipherSpec *spec;
    178 	boolean_t hash_use_ok = B_FALSE;
    179 	int rv = 0;
    180 
    181 	spec = &ssl->spec[direction];
    182 
    183 	if (spec->mac_hashsz == 0) {
    184 		return (1);
    185 	}
    186 
    187 	p = temp;
    188 
    189 	*p++ = (seq_num >> 56) & 0xff;
    190 	*p++ = (seq_num >> 48) & 0xff;
    191 	*p++ = (seq_num >> 40) & 0xff;
    192 	*p++ = (seq_num >> 32) & 0xff;
    193 	*p++ = (seq_num >> 24) & 0xff;
    194 	*p++ = (seq_num >> 16) & 0xff;
    195 	*p++ = (seq_num >> 8) & 0xff;
    196 	*p++ = (seq_num) & 0xff;
    197 	*p++ = (uchar_t)ct;
    198 	if (IS_TLS(ssl)) {
    199 		*p++ = versionp[0];
    200 		*p++ = versionp[1];
    201 	}
    202 	*p++ = (len >> 8) & 0xff;
    203 	*p++ = (len) & 0xff;
    204 
    205 	if (IS_TLS(ssl) || (spec->hmac_mech.cm_type != CRYPTO_MECH_INVALID &&
    206 	    len >= kcf_md5_threshold)) {
    207 		crypto_data_t dd, mac;
    208 		struct uio uio_pt;
    209 		struct iovec iovarray_pt[2];
    210 
    211 		/* init the array of iovecs for use in the uio struct */
    212 		iovarray_pt[0].iov_base = (char *)temp;
    213 		iovarray_pt[0].iov_len = (p - temp);
    214 		iovarray_pt[1].iov_base = (char *)buf;
    215 		iovarray_pt[1].iov_len = len;
    216 
    217 		/* init the uio struct for use in the crypto_data_t struct */
    218 		bzero(&uio_pt, sizeof (uio_pt));
    219 		uio_pt.uio_iov = iovarray_pt;
    220 		uio_pt.uio_iovcnt = 2;
    221 		uio_pt.uio_segflg = UIO_SYSSPACE;
    222 
    223 		dd.cd_format = CRYPTO_DATA_UIO;
    224 		dd.cd_offset = 0;
    225 		dd.cd_length =  (p - temp) + len;
    226 		dd.cd_miscdata = NULL;
    227 		dd.cd_uio = &uio_pt;
    228 
    229 		mac.cd_format = CRYPTO_DATA_RAW;
    230 		mac.cd_offset = 0;
    231 		mac.cd_raw.iov_base = (char *)digest;
    232 		mac.cd_length = mac.cd_raw.iov_len = spec->mac_hashsz;
    233 
    234 		/*
    235 		 * The calling context can tolerate a blocking call here.
    236 		 * For outgoing traffic, we are in user context
    237 		 * when called from strsock_kssl_output(). For incoming
    238 		 * traffic past the SSL handshake, we are in user
    239 		 * context when called from strsock_kssl_input(). During the
    240 		 * SSL handshake, we are called for client_finished message
    241 		 * handling from a squeue worker thread that gets scheduled
    242 		 * by an SQ_FILL call. This thread is not in interrupt
    243 		 * context and so can block.
    244 		 */
    245 		rv = crypto_mac(&spec->hmac_mech, &dd, &spec->hmac_key,
    246 		    NULL, &mac, NULL);
    247 
    248 		if (CRYPTO_ERR(rv)) {
    249 			hash_use_ok = (rv == CRYPTO_MECH_NOT_SUPPORTED &&
    250 			    !IS_TLS(ssl));
    251 			if (!hash_use_ok) {
    252 				DTRACE_PROBE1(kssl_err__crypto_mac_error,
    253 				    int, rv);
    254 				KSSL_COUNTER(compute_mac_failure, 1);
    255 			}
    256 		}
    257 	} else
    258 		hash_use_ok = B_TRUE;
    259 
    260 	if (hash_use_ok) {
    261 		bcopy(&(ssl->mac_ctx[direction][0]), ctx,
    262 		    sizeof (KSSL_HASHCTX));
    263 		spec->MAC_HashUpdate((void *)ctx, temp, p - temp);
    264 		spec->MAC_HashUpdate((void *)ctx, buf, len);
    265 		spec->MAC_HashFinal(digest, (void *)ctx);
    266 
    267 		bcopy(&(ssl->mac_ctx[direction][1]), ctx,
    268 		    sizeof (KSSL_HASHCTX));
    269 		spec->MAC_HashUpdate((void *)ctx, digest, spec->mac_hashsz);
    270 		spec->MAC_HashFinal(digest, (void *)ctx);
    271 	}
    272 
    273 	return (rv);
    274 }
    275 
    276 /*
    277  * Handles handshake messages.
    278  * Messages to be replied are returned in handshake_sendbuf.
    279  */
    280 int
    281 kssl_handle_handshake_message(ssl_t *ssl, mblk_t *mp, int *err,
    282     kssl_callback_t cbfn, void *arg)
    283 {
    284 	uint32_t msglen;
    285 	uchar_t msghdr[4];
    286 
    287 	ASSERT(ssl->msg.state == MSG_BODY);
    288 	ASSERT(ssl->msg.msglen_bytes == 3);
    289 	ASSERT(mp->b_wptr >= mp->b_rptr + ssl->msg.msglen);
    290 
    291 	ssl->sslcnt++;
    292 	msglen = ssl->msg.msglen;
    293 
    294 	if (ssl->msg.type == client_hello) {
    295 		MD5Init(&ssl->hs_md5);
    296 		SHA1Init(&ssl->hs_sha1);
    297 	}
    298 
    299 	if (ssl->msg.type == finished && ssl->resumed == B_FALSE) {
    300 		if (kssl_compute_handshake_hashes(ssl, &ssl->hs_hashes,
    301 		    sender_client) != 0) {
    302 			*err = SSL_MISS;
    303 			return (0);
    304 		}
    305 	}
    306 
    307 	if (ssl->msg.type != finished || ssl->resumed == B_FALSE) {
    308 		msghdr[0] = (uchar_t)ssl->msg.type;
    309 
    310 		msghdr[1] = (uchar_t)(msglen >> 16);
    311 		msghdr[2] = (uchar_t)(msglen >> 8);
    312 		msghdr[3] = (uchar_t)(msglen);
    313 		kssl_update_handshake_hashes(ssl, msghdr, 4);
    314 		kssl_update_handshake_hashes(ssl, mp->b_rptr, msglen);
    315 	}
    316 
    317 	ssl->msg.state = MSG_INIT;
    318 	ssl->msg.msglen = 0;
    319 	ssl->msg.msglen_bytes = 0;
    320 
    321 	switch (ssl->msg.type) {
    322 	case client_hello:
    323 		if (ssl->hs_waitstate != wait_client_hello) {
    324 			kssl_send_alert(ssl, alert_fatal,
    325 			    unexpected_message);
    326 			*err = EBADMSG;
    327 			ssl->activeinput = B_FALSE;
    328 			return (1);
    329 		}
    330 		*err = kssl_handle_client_hello(ssl, mp, msglen);
    331 		if (*err == SSL_MISS) {
    332 			ssl->activeinput = B_FALSE;
    333 			return (0);
    334 		}
    335 		return (1);
    336 	case client_key_exchange:
    337 		if (ssl->hs_waitstate != wait_client_key) {
    338 			kssl_send_alert(ssl, alert_fatal,
    339 			    unexpected_message);
    340 			*err = EBADMSG;
    341 			ssl->activeinput = B_FALSE;
    342 			return (1);
    343 		}
    344 		*err = kssl_handle_client_key_exchange(ssl, mp,
    345 		    msglen, cbfn, arg);
    346 		return (1);
    347 	case finished:
    348 		if (ssl->hs_waitstate != wait_finished) {
    349 			kssl_send_alert(ssl, alert_fatal,
    350 			    unexpected_message);
    351 			*err = EBADMSG;
    352 			ssl->activeinput = B_FALSE;
    353 			return (1);
    354 		}
    355 		*err = kssl_handle_finished(ssl, mp, msglen);
    356 		return (1);
    357 	default:
    358 		kssl_send_alert(ssl, alert_fatal, unexpected_message);
    359 		ssl->activeinput = B_FALSE;
    360 		*err = EBADMSG;
    361 		return (1);
    362 	}
    363 }
    364 
    365 static void
    366 kssl_update_handshake_hashes(ssl_t *ssl, uchar_t *buf, uint_t len)
    367 {
    368 	MD5Update(&ssl->hs_md5, buf, len);
    369 	SHA1Update(&ssl->hs_sha1, buf, len);
    370 }
    371 
    372 static int
    373 kssl_compute_handshake_hashes(
    374 	ssl_t *ssl,
    375 	SSL3Hashes *hashes,
    376 	uint32_t sender)
    377 {
    378 	MD5_CTX md5 = ssl->hs_md5;	/* clone md5 context */
    379 	SHA1_CTX sha1 = ssl->hs_sha1;	/* clone sha1 context */
    380 	MD5_CTX *md5ctx = &md5;
    381 	SHA1_CTX *sha1ctx = &sha1;
    382 
    383 	if (IS_TLS(ssl)) {
    384 		uchar_t seed[MD5_HASH_LEN + SHA1_HASH_LEN];
    385 		char *label;
    386 
    387 		/*
    388 		 * Do not take another hash step here.
    389 		 * Just complete the operation.
    390 		 */
    391 		MD5Final(hashes->md5, md5ctx);
    392 		SHA1Final(hashes->sha1, sha1ctx);
    393 
    394 		bcopy(hashes->md5, seed, MD5_HASH_LEN);
    395 		bcopy(hashes->sha1, seed + MD5_HASH_LEN, SHA1_HASH_LEN);
    396 
    397 		if (sender == sender_client)
    398 			label = TLS_CLIENT_FINISHED_LABEL;
    399 		else
    400 			label = TLS_SERVER_FINISHED_LABEL;
    401 
    402 		return (kssl_tls_PRF(ssl,
    403 		    ssl->sid.master_secret,
    404 		    (size_t)SSL3_MASTER_SECRET_LEN,
    405 		    (uchar_t *)label, strlen(label),
    406 		    seed, (size_t)(MD5_HASH_LEN + SHA1_HASH_LEN),
    407 		    hashes->tlshash, (size_t)TLS_FINISHED_SIZE));
    408 	} else {
    409 		uchar_t s[4];
    410 		s[0] = (sender >> 24) & 0xff;
    411 		s[1] = (sender >> 16) & 0xff;
    412 		s[2] = (sender >> 8) & 0xff;
    413 		s[3] = (sender) & 0xff;
    414 
    415 		MD5Update(md5ctx, s, 4);
    416 		MD5Update(md5ctx, ssl->sid.master_secret,
    417 		    SSL3_MASTER_SECRET_LEN);
    418 		MD5Update(md5ctx, kssl_pad_1, SSL3_MD5_PAD_LEN);
    419 		MD5Final(hashes->md5, md5ctx);
    420 
    421 		MD5Init(md5ctx);
    422 		MD5Update(md5ctx, ssl->sid.master_secret,
    423 		    SSL3_MASTER_SECRET_LEN);
    424 		MD5Update(md5ctx, kssl_pad_2, SSL3_MD5_PAD_LEN);
    425 		MD5Update(md5ctx, hashes->md5, MD5_HASH_LEN);
    426 		MD5Final(hashes->md5, md5ctx);
    427 
    428 		SHA1Update(sha1ctx, s, 4);
    429 		SHA1Update(sha1ctx, ssl->sid.master_secret,
    430 		    SSL3_MASTER_SECRET_LEN);
    431 		SHA1Update(sha1ctx, kssl_pad_1, SSL3_SHA1_PAD_LEN);
    432 		SHA1Final(hashes->sha1, sha1ctx);
    433 
    434 		SHA1Init(sha1ctx);
    435 		SHA1Update(sha1ctx, ssl->sid.master_secret,
    436 		    SSL3_MASTER_SECRET_LEN);
    437 		SHA1Update(sha1ctx, kssl_pad_2, SSL3_SHA1_PAD_LEN);
    438 		SHA1Update(sha1ctx, hashes->sha1, SHA1_HASH_LEN);
    439 		SHA1Final(hashes->sha1, sha1ctx);
    440 		return (0);
    441 	}
    442 }
    443 
    444 
    445 /*
    446  * Minimum message length for a client hello =
    447  * 2-byte client_version +
    448  * 32-byte random +
    449  * 1-byte session_id length +
    450  * 2-byte cipher_suites length +
    451  * 1-byte compression_methods length +
    452  * 1-byte CompressionMethod.null
    453  */
    454 #define	KSSL_SSL3_CH_MIN_MSGLEN	(39)
    455 
    456 static int
    457 kssl_handle_client_hello(ssl_t *ssl, mblk_t *mp, int msglen)
    458 {
    459 	uchar_t *msgend;
    460 	int err;
    461 	SSL3AlertDescription desc = illegal_parameter;
    462 	uint_t sidlen, cslen, cmlen;
    463 	uchar_t *suitesp;
    464 	uint_t i, j;
    465 	uint16_t suite;
    466 	int ch_msglen = KSSL_SSL3_CH_MIN_MSGLEN;
    467 
    468 	ASSERT(mp->b_wptr >= mp->b_rptr + msglen);
    469 	ASSERT(ssl->msg.type == client_hello);
    470 	ASSERT(ssl->hs_waitstate == wait_client_hello);
    471 	ASSERT(ssl->resumed == B_FALSE);
    472 
    473 	if (msglen < ch_msglen) {
    474 		goto falert;
    475 	}
    476 
    477 	msgend = mp->b_rptr + msglen;
    478 
    479 	/* Support SSLv3 (version == 3.0) or TLS (version == 3.1) */
    480 	if (ssl->major_version != 3 || (ssl->major_version == 3 &&
    481 	    ssl->minor_version != 0 && ssl->minor_version != 1)) {
    482 		DTRACE_PROBE2(kssl_err__SSL_version_not_supported,
    483 		    uchar_t, ssl->major_version,
    484 		    uchar_t, ssl->minor_version);
    485 		desc = handshake_failure;
    486 		goto falert;
    487 	}
    488 	mp->b_rptr += 2; /* skip the version bytes */
    489 
    490 	bcopy(mp->b_rptr, ssl->client_random, SSL3_RANDOM_LENGTH);
    491 	mp->b_rptr += SSL3_RANDOM_LENGTH;
    492 
    493 	ASSERT(ssl->sid.cached == B_FALSE);
    494 	sidlen = *mp->b_rptr++;
    495 	ch_msglen += sidlen;
    496 	if (msglen < ch_msglen) {
    497 		goto falert;
    498 	}
    499 	if (sidlen != SSL3_SESSIONID_BYTES) {
    500 		mp->b_rptr += sidlen;
    501 	} else {
    502 		kssl_lookup_sid(&ssl->sid, mp->b_rptr, &ssl->faddr,
    503 		    ssl->kssl_entry);
    504 		mp->b_rptr += SSL3_SESSIONID_BYTES;
    505 	}
    506 
    507 	cslen = ((uint_t)mp->b_rptr[0] << 8) + (uint_t)mp->b_rptr[1];
    508 	mp->b_rptr += 2;
    509 	ch_msglen += cslen;
    510 
    511 	/*
    512 	 * This check can't be a "!=" since there can be
    513 	 * compression methods other than CompressionMethod.null.
    514 	 * Also, there can be extra data (TLS extensions) after the
    515 	 * compression methods field. We do not support any TLS
    516 	 * extensions and hence ignore them.
    517 	 */
    518 	if (msglen < ch_msglen) {
    519 		goto falert;
    520 	}
    521 
    522 	/* The length has to be even since a cipher suite is 2-byte long */
    523 	if (cslen & 0x1) {
    524 		goto falert;
    525 	}
    526 	suitesp = mp->b_rptr;
    527 	if (ssl->sid.cached == B_TRUE) {
    528 		suite = ssl->sid.cipher_suite;
    529 		for (j = 0; j < cslen; j += 2) {
    530 			if (suitesp[j] == ((suite >> 8) & 0xff) &&
    531 			    suitesp[j + 1] == (suite & 0xff)) {
    532 				break;
    533 			}
    534 		}
    535 		if (j < cslen) {
    536 			goto suite_found;
    537 		}
    538 		kssl_uncache_sid(&ssl->sid, ssl->kssl_entry);
    539 	}
    540 
    541 	/* Check if this server is capable of the cipher suite */
    542 	for (i = 0; i < ssl->kssl_entry->kssl_cipherSuites_nentries; i++) {
    543 		suite = ssl->kssl_entry->kssl_cipherSuites[i];
    544 		for (j = 0; j < cslen; j += 2) {
    545 			if (suitesp[j] == ((suite >> 8) & 0xff) &&
    546 			    suitesp[j + 1] == (suite & 0xff)) {
    547 				break;
    548 			}
    549 		}
    550 		if (j < cslen) {
    551 			break;
    552 		}
    553 	}
    554 	if (i == ssl->kssl_entry->kssl_cipherSuites_nentries) {
    555 		if (ssl->sslcnt == 1) {
    556 			KSSL_COUNTER(no_suite_found, 1);
    557 			return (SSL_MISS);
    558 		}
    559 		desc = handshake_failure;
    560 		DTRACE_PROBE(kssl_err__no_cipher_suites_found);
    561 		goto falert;
    562 	}
    563 
    564 suite_found:
    565 	mp->b_rptr += cslen;
    566 
    567 	/*
    568 	 * Check for the mandatory CompressionMethod.null. We do not
    569 	 * support any other compression methods.
    570 	 */
    571 	cmlen = *mp->b_rptr++;
    572 	ch_msglen += cmlen - 1;	/* -1 accounts for the null method */
    573 	if (msglen < ch_msglen) {
    574 		goto falert;
    575 	}
    576 
    577 	while (cmlen >= 1) {
    578 		if (*mp->b_rptr++ == 0)
    579 			break;
    580 		cmlen--;
    581 	}
    582 
    583 	if (cmlen == 0) {
    584 		desc = handshake_failure;
    585 		DTRACE_PROBE(kssl_err__no_null_method_failure);
    586 		goto falert;
    587 	}
    588 
    589 	mp->b_rptr = msgend;
    590 
    591 	for (i = 0; i < cipher_suite_defs_nentries; i++) {
    592 		if (suite == cipher_suite_defs[i].suite) {
    593 			break;
    594 		}
    595 	}
    596 
    597 	ASSERT(i < cipher_suite_defs_nentries);
    598 
    599 	ssl->pending_cipher_suite = suite;
    600 	ssl->pending_malg = cipher_suite_defs[i].malg;
    601 	ssl->pending_calg = cipher_suite_defs[i].calg;
    602 	ssl->pending_keyblksz = cipher_suite_defs[i].keyblksz;
    603 
    604 	if (ssl->sid.cached == B_TRUE) {
    605 		err = kssl_send_server_hello(ssl);
    606 		if (err != 0) {
    607 			return (err);
    608 		}
    609 		if (IS_TLS(ssl))
    610 			err = kssl_generate_tls_keyblock(ssl);
    611 		else
    612 			kssl_generate_keyblock(ssl);
    613 
    614 		err = kssl_send_change_cipher_specs(ssl);
    615 		if (err != 0) {
    616 			return (err);
    617 		}
    618 
    619 		err = kssl_send_finished(ssl, 1);
    620 		if (err != 0)
    621 			return (err);
    622 
    623 		err = kssl_compute_handshake_hashes(ssl, &ssl->hs_hashes,
    624 		    sender_client);
    625 		if (err != 0)
    626 			return (err);
    627 
    628 		ssl->hs_waitstate = wait_change_cipher;
    629 		ssl->resumed = B_TRUE;
    630 		ssl->activeinput = B_FALSE;
    631 		KSSL_COUNTER(resumed_sessions, 1);
    632 		return (0);
    633 	}
    634 
    635 	(void) random_get_pseudo_bytes(ssl->sid.session_id,
    636 	    SSL3_SESSIONID_BYTES);
    637 	ssl->sid.client_addr = ssl->faddr;
    638 	ssl->sid.cipher_suite = suite;
    639 
    640 	err = kssl_send_server_hello(ssl);
    641 	if (err != 0) {
    642 		return (err);
    643 	}
    644 	err = kssl_send_certificate_and_server_hello_done(ssl);
    645 	if (err != 0) {
    646 		return (err);
    647 	}
    648 	KSSL_COUNTER(full_handshakes, 1);
    649 	ssl->hs_waitstate = wait_client_key;
    650 	ssl->activeinput = B_FALSE;
    651 	return (0);
    652 
    653 falert:
    654 	kssl_send_alert(ssl, alert_fatal, desc);
    655 	return (EBADMSG);
    656 }
    657 
    658 #define	SET_HASH_INDEX(index, s, clnt_addr) {				\
    659 	int addr;							\
    660 									\
    661 	IN6_V4MAPPED_TO_IPADDR(clnt_addr, addr);			\
    662 	index = addr ^ (((int)(s)[0] << 24) | ((int)(s)[1] << 16) |	\
    663 	    ((int)(s)[2] << 8) | (int)(s)[SSL3_SESSIONID_BYTES - 1]);	\
    664 }
    665 
    666 /*
    667  * Creates a cache entry. Sets the sid->cached flag
    668  * and sid->time fields. So, the caller should not set them.
    669  */
    670 static void
    671 kssl_cache_sid(sslSessionID *sid, kssl_entry_t *kssl_entry)
    672 {
    673 	uint_t index;
    674 	uchar_t *s = sid->session_id;
    675 	kmutex_t *lock;
    676 
    677 	ASSERT(sid->cached == B_FALSE);
    678 
    679 	/* set the values before creating the cache entry */
    680 	sid->cached = B_TRUE;
    681 	sid->time = ddi_get_lbolt();
    682 
    683 	SET_HASH_INDEX(index, s, &sid->client_addr);
    684 	index %= kssl_entry->sid_cache_nentries;
    685 
    686 	lock = &(kssl_entry->sid_cache[index].se_lock);
    687 	mutex_enter(lock);
    688 	kssl_entry->sid_cache[index].se_used++;
    689 	bcopy(sid, &(kssl_entry->sid_cache[index].se_sid), sizeof (*sid));
    690 	mutex_exit(lock);
    691 
    692 	KSSL_COUNTER(sid_cached, 1);
    693 }
    694 
    695 /*
    696  * Invalidates the cache entry, if any. Clears the sid->cached flag
    697  * as a side effect.
    698  */
    699 void
    700 kssl_uncache_sid(sslSessionID *sid, kssl_entry_t *kssl_entry)
    701 {
    702 	uint_t index;
    703 	uchar_t *s = sid->session_id;
    704 	sslSessionID *csid;
    705 	kmutex_t *lock;
    706 
    707 	ASSERT(sid->cached == B_TRUE);
    708 	sid->cached = B_FALSE;
    709 
    710 	SET_HASH_INDEX(index, s, &sid->client_addr);
    711 	index %= kssl_entry->sid_cache_nentries;
    712 
    713 	lock = &(kssl_entry->sid_cache[index].se_lock);
    714 	mutex_enter(lock);
    715 	csid = &(kssl_entry->sid_cache[index].se_sid);
    716 	if (!(IN6_ARE_ADDR_EQUAL(&csid->client_addr, &sid->client_addr)) ||
    717 	    bcmp(csid->session_id, s, SSL3_SESSIONID_BYTES)) {
    718 		mutex_exit(lock);
    719 		return;
    720 	}
    721 	csid->cached = B_FALSE;
    722 	mutex_exit(lock);
    723 
    724 	KSSL_COUNTER(sid_uncached, 1);
    725 }
    726 
    727 static void
    728 kssl_lookup_sid(sslSessionID *sid, uchar_t *s, in6_addr_t *faddr,
    729     kssl_entry_t *kssl_entry)
    730 {
    731 	uint_t index;
    732 	kmutex_t *lock;
    733 	sslSessionID *csid;
    734 
    735 	KSSL_COUNTER(sid_cache_lookups, 1);
    736 
    737 	SET_HASH_INDEX(index, s, faddr);
    738 	index %= kssl_entry->sid_cache_nentries;
    739 
    740 	lock = &(kssl_entry->sid_cache[index].se_lock);
    741 	mutex_enter(lock);
    742 	csid = &(kssl_entry->sid_cache[index].se_sid);
    743 	if (csid->cached == B_FALSE ||
    744 	    !IN6_ARE_ADDR_EQUAL(&csid->client_addr, faddr) ||
    745 	    bcmp(csid->session_id, s, SSL3_SESSIONID_BYTES)) {
    746 		mutex_exit(lock);
    747 		return;
    748 	}
    749 
    750 	if (TICK_TO_SEC(ddi_get_lbolt() - csid->time) >
    751 	    kssl_entry->sid_cache_timeout) {
    752 		csid->cached = B_FALSE;
    753 		mutex_exit(lock);
    754 		return;
    755 	}
    756 
    757 	bcopy(csid, sid, sizeof (*sid));
    758 	mutex_exit(lock);
    759 	ASSERT(sid->cached == B_TRUE);
    760 
    761 	KSSL_COUNTER(sid_cache_hits, 1);
    762 }
    763 
    764 static uchar_t *
    765 kssl_rsa_unwrap(uchar_t *buf, size_t *lenp)
    766 {
    767 	size_t len = *lenp;
    768 	int i = 2;
    769 
    770 	if (buf[0] != 0 || buf[1] != 2) {
    771 		return (NULL);
    772 	}
    773 
    774 	while (i < len) {
    775 		if (buf[i++] == 0) {
    776 			*lenp = len - i;
    777 			break;
    778 		}
    779 	}
    780 
    781 	if (i == len) {
    782 		return (NULL);
    783 	}
    784 
    785 	return (buf + i);
    786 }
    787 
    788 
    789 #define	KSSL_SSL3_SH_RECLEN	(74)
    790 #define	KSSL_SSL3_FIN_MSGLEN	(36)
    791 
    792 #define	KSSL_SSL3_MAX_CCP_FIN_MSGLEN	(128)	/* comfortable upper bound */
    793 
    794 static int
    795 kssl_send_server_hello(ssl_t *ssl)
    796 {
    797 	mblk_t *mp;
    798 	uchar_t *buf;
    799 	uchar_t *msgstart;
    800 
    801 	mp = allocb(ssl->tcp_mss, BPRI_HI);
    802 	if (mp == NULL) {
    803 		KSSL_COUNTER(alloc_fails, 1);
    804 		return (ENOMEM);
    805 	}
    806 	ssl->handshake_sendbuf = mp;
    807 	buf = mp->b_wptr;
    808 
    809 	/* 5 byte record header */
    810 	buf[0] = content_handshake;
    811 	buf[1] = ssl->major_version;
    812 	buf[2] = ssl->minor_version;
    813 	buf[3] = KSSL_SSL3_SH_RECLEN >> 8;
    814 	buf[4] = KSSL_SSL3_SH_RECLEN & 0xff;
    815 	buf += SSL3_HDR_LEN;
    816 
    817 	msgstart = buf;
    818 
    819 	/* 6 byte message header */
    820 	buf[0] = (uchar_t)server_hello;			/* message type */
    821 	buf[1] = 0;					/* message len byte 0 */
    822 	buf[2] = ((KSSL_SSL3_SH_RECLEN - 4) >> 8) &
    823 	    0xff;					/* message len byte 1 */
    824 	buf[3] = (KSSL_SSL3_SH_RECLEN - 4) & 0xff;	/* message len byte 2 */
    825 
    826 	buf[4] = ssl->major_version;	/* version byte 0 */
    827 	buf[5] = ssl->minor_version;	/* version byte 1 */
    828 
    829 	buf += 6;
    830 
    831 	kssl_get_hello_random(ssl->server_random);
    832 	bcopy(ssl->server_random, buf, SSL3_RANDOM_LENGTH);
    833 	buf += SSL3_RANDOM_LENGTH;
    834 
    835 	buf[0] = SSL3_SESSIONID_BYTES;
    836 	bcopy(ssl->sid.session_id, buf + 1, SSL3_SESSIONID_BYTES);
    837 	buf += SSL3_SESSIONID_BYTES + 1;
    838 
    839 	buf[0] = (ssl->pending_cipher_suite >> 8) & 0xff;
    840 	buf[1] = ssl->pending_cipher_suite & 0xff;
    841 
    842 	buf[2] = 0;	/* No compression */
    843 
    844 	mp->b_wptr = buf + 3;
    845 	ASSERT(mp->b_wptr < mp->b_datap->db_lim);
    846 
    847 	kssl_update_handshake_hashes(ssl, msgstart, KSSL_SSL3_SH_RECLEN);
    848 	return (0);
    849 }
    850 
    851 static void
    852 kssl_get_hello_random(uchar_t *buf)
    853 {
    854 	timestruc_t ts;
    855 	time_t sec;
    856 
    857 	gethrestime(&ts);
    858 	sec = ts.tv_sec;
    859 
    860 	buf[0] = (sec >> 24) & 0xff;
    861 	buf[1] = (sec >> 16) & 0xff;
    862 	buf[2] = (sec >> 8) & 0xff;
    863 	buf[3] = (sec) & 0xff;
    864 
    865 	(void) random_get_pseudo_bytes(&buf[4], SSL3_RANDOM_LENGTH - 4);
    866 
    867 	/* Should this be caching? */
    868 }
    869 
    870 static int
    871 kssl_tls_P_hash(crypto_mechanism_t *mech, crypto_key_t *key,
    872 	size_t hashlen,
    873 	uchar_t *label, size_t label_len,
    874 	uchar_t *seed, size_t seedlen,
    875 	uchar_t *data, size_t datalen)
    876 {
    877 	int rv = 0;
    878 	uchar_t A1[MAX_HASH_LEN], result[MAX_HASH_LEN];
    879 	int bytes_left = datalen;
    880 	crypto_data_t dd, mac;
    881 	crypto_context_t ctx;
    882 
    883 	dd.cd_format = CRYPTO_DATA_RAW;
    884 	dd.cd_offset = 0;
    885 	mac.cd_format = CRYPTO_DATA_RAW;
    886 	mac.cd_offset = 0;
    887 
    888 	/*
    889 	 * A(i) = HMAC_hash(secret, seed + A(i-1));
    890 	 * A(0) = seed;
    891 	 *
    892 	 * Compute A(1):
    893 	 * A(1) = HMAC_hash(secret, label + seed)
    894 	 *
    895 	 */
    896 	HMAC_INIT(mech, key, &ctx);
    897 	HMAC_UPDATE(ctx, label, label_len);
    898 	HMAC_UPDATE(ctx, seed, seedlen);
    899 	HMAC_FINAL(ctx, A1, hashlen);
    900 
    901 	/* Compute A(2) ... A(n) */
    902 	while (bytes_left > 0) {
    903 		HMAC_INIT(mech, key, &ctx);
    904 		HMAC_UPDATE(ctx, A1, hashlen);
    905 		HMAC_UPDATE(ctx, label, label_len);
    906 		HMAC_UPDATE(ctx, seed, seedlen);
    907 		HMAC_FINAL(ctx, result, hashlen);
    908 
    909 		/*
    910 		 * The A(i) value is stored in "result".
    911 		 * Save the results of the MAC so it can be input to next
    912 		 * iteration.
    913 		 */
    914 		if (bytes_left > hashlen) {
    915 			/* Store the chunk result */
    916 			bcopy(result, data, hashlen);
    917 			data += hashlen;
    918 
    919 			bytes_left -= hashlen;
    920 
    921 			/* Update A1 for next iteration */
    922 			HMAC_INIT(mech, key, &ctx);
    923 			HMAC_UPDATE(ctx, A1, hashlen);
    924 			HMAC_FINAL(ctx, A1, hashlen);
    925 
    926 		} else {
    927 			bcopy(result, data, bytes_left);
    928 			data += bytes_left;
    929 			bytes_left = 0;
    930 		}
    931 	}
    932 end:
    933 	if (CRYPTO_ERR(rv)) {
    934 		DTRACE_PROBE1(kssl_err__crypto_mac_error, int, rv);
    935 		KSSL_COUNTER(compute_mac_failure, 1);
    936 	}
    937 	return (rv);
    938 }
    939 
    940 /* ARGSUSED */
    941 static int
    942 kssl_tls_PRF(ssl_t *ssl,
    943 	uchar_t *secret, size_t secret_len,
    944 	uchar_t *label, size_t label_len,
    945 	uchar_t *seed, size_t seed_len,
    946 	uchar_t *prfresult, size_t prfresult_len)
    947 {
    948 	/*
    949 	 * RFC 2246:
    950 	 *  PRF(secret, label, seed) = P_MD5(S1, label + seed) XOR
    951 	 *				P_SHA1(S2, label + seed);
    952 	 * S1 = 1st half of secret.
    953 	 * S1 = 2nd half of secret.
    954 	 *
    955 	 */
    956 
    957 	int rv, i;
    958 	uchar_t psha1[MAX_KEYBLOCK_LENGTH];
    959 	crypto_key_t S1, S2;
    960 
    961 	/* length of secret keys is ceil(length/2) */
    962 	size_t slen = roundup(secret_len, 2) / 2;
    963 
    964 	if (prfresult_len >  MAX_KEYBLOCK_LENGTH) {
    965 		DTRACE_PROBE1(kssl_err__unexpected_keyblock_size,
    966 		    size_t, prfresult_len);
    967 		return (CRYPTO_ARGUMENTS_BAD);
    968 	}
    969 
    970 	ASSERT(prfresult != NULL);
    971 	ASSERT(label != NULL);
    972 	ASSERT(seed != NULL);
    973 
    974 	S1.ck_data   = secret;
    975 	S1.ck_length = slen * 8; /* bits */
    976 	S1.ck_format = CRYPTO_KEY_RAW;
    977 
    978 	S2.ck_data   = secret + slen;
    979 	S2.ck_length = slen * 8; /* bits */
    980 	S2.ck_format = CRYPTO_KEY_RAW;
    981 
    982 	rv = kssl_tls_P_hash(&hmac_md5_mech, &S1, MD5_HASH_LEN,
    983 	    label, label_len,
    984 	    seed, seed_len,
    985 	    prfresult, prfresult_len);
    986 	if (CRYPTO_ERR(rv))
    987 		goto end;
    988 
    989 	rv = kssl_tls_P_hash(&hmac_sha1_mech, &S2, SHA1_HASH_LEN,
    990 	    label, label_len,
    991 	    seed, seed_len,
    992 	    psha1, prfresult_len);
    993 	if (CRYPTO_ERR(rv))
    994 		goto end;
    995 
    996 	for (i = 0; i < prfresult_len; i++)
    997 		prfresult[i] ^= psha1[i];
    998 
    999 end:
   1000 	if (CRYPTO_ERR(rv))
   1001 		bzero(prfresult, prfresult_len);
   1002 
   1003 	return (rv);
   1004 }
   1005 
   1006 #define	IS_BAD_PRE_MASTER_SECRET(pms, pmslen, ssl)			\
   1007 	(pms == NULL || pmslen != SSL3_PRE_MASTER_SECRET_LEN ||		\
   1008 	pms[0] != ssl->major_version || pms[1] != ssl->minor_version)
   1009 
   1010 #define	FAKE_PRE_MASTER_SECRET(pms, pmslen, ssl, buf) {			\
   1011 		KSSL_COUNTER(bad_pre_master_secret, 1);			\
   1012 		pms = buf;						\
   1013 		pmslen = SSL3_PRE_MASTER_SECRET_LEN;			\
   1014 		pms[0] = ssl->major_version;				\
   1015 		pms[1] = ssl->minor_version;				\
   1016 		(void) random_get_pseudo_bytes(&buf[2], pmslen - 2);	\
   1017 }
   1018 
   1019 static int
   1020 kssl_generate_tls_ms(ssl_t *ssl, uchar_t *pms, size_t pmslen)
   1021 {
   1022 	uchar_t buf[SSL3_PRE_MASTER_SECRET_LEN];
   1023 	uchar_t seed[SSL3_RANDOM_LENGTH * 2];
   1024 
   1025 	/*
   1026 	 * Computing the master secret:
   1027 	 * ----------------------------
   1028 	 * master_secret = PRF (pms, "master secret",
   1029 	 *		ClientHello.random + ServerHello.random);
   1030 	 */
   1031 	bcopy(ssl->client_random, seed, SSL3_RANDOM_LENGTH);
   1032 	bcopy(ssl->server_random, seed + SSL3_RANDOM_LENGTH,
   1033 	    SSL3_RANDOM_LENGTH);
   1034 
   1035 	/* if pms is bad fake it to thwart Bleichenbacher attack */
   1036 	if (IS_BAD_PRE_MASTER_SECRET(pms, pmslen, ssl)) {
   1037 		DTRACE_PROBE(kssl_err__under_Bleichenbacher_attack);
   1038 		FAKE_PRE_MASTER_SECRET(pms, pmslen, ssl, buf);
   1039 	}
   1040 
   1041 	return (kssl_tls_PRF(ssl,
   1042 	    pms, pmslen,
   1043 	    (uchar_t *)TLS_MASTER_SECRET_LABEL,
   1044 	    (size_t)strlen(TLS_MASTER_SECRET_LABEL),
   1045 	    seed, sizeof (seed),
   1046 	    ssl->sid.master_secret,
   1047 	    (size_t)sizeof (ssl->sid.master_secret)));
   1048 }
   1049 
   1050 
   1051 static void
   1052 kssl_generate_ssl_ms(ssl_t *ssl, uchar_t *pms, size_t pmslen)
   1053 {
   1054 	uchar_t buf[SSL3_PRE_MASTER_SECRET_LEN];
   1055 	uchar_t *ms;
   1056 	int hlen = MD5_HASH_LEN;
   1057 
   1058 	ms = ssl->sid.master_secret;
   1059 
   1060 	/* if pms is bad fake it to thwart Bleichenbacher attack */
   1061 	if (IS_BAD_PRE_MASTER_SECRET(pms, pmslen, ssl)) {
   1062 		DTRACE_PROBE(kssl_err__under_Bleichenbacher_attack);
   1063 		FAKE_PRE_MASTER_SECRET(pms, pmslen, ssl, buf);
   1064 	}
   1065 
   1066 	kssl_ssl3_key_material_derive_step(ssl, pms, pmslen, 1, ms, 0);
   1067 	kssl_ssl3_key_material_derive_step(ssl, pms, pmslen, 2, ms + hlen, 0);
   1068 	kssl_ssl3_key_material_derive_step(ssl, pms, pmslen, 3, ms + 2 * hlen,
   1069 	    0);
   1070 }
   1071 
   1072 static int
   1073 kssl_generate_tls_keyblock(ssl_t *ssl)
   1074 {
   1075 	uchar_t seed[2 * SSL3_RANDOM_LENGTH];
   1076 
   1077 	bcopy(ssl->server_random, seed, SSL3_RANDOM_LENGTH);
   1078 	bcopy(ssl->client_random, seed + SSL3_RANDOM_LENGTH,
   1079 	    SSL3_RANDOM_LENGTH);
   1080 
   1081 	return (kssl_tls_PRF(ssl, ssl->sid.master_secret,
   1082 	    (size_t)SSL3_MASTER_SECRET_LEN,
   1083 	    (uchar_t *)TLS_KEY_EXPANSION_LABEL,
   1084 	    (size_t)strlen(TLS_KEY_EXPANSION_LABEL),
   1085 	    seed, (size_t)sizeof (seed),
   1086 	    ssl->pending_keyblock,
   1087 	    (size_t)ssl->pending_keyblksz));
   1088 
   1089 }
   1090 
   1091 static void
   1092 kssl_generate_keyblock(ssl_t *ssl)
   1093 {
   1094 	uchar_t *ms;
   1095 	size_t mslen = SSL3_MASTER_SECRET_LEN;
   1096 	int hlen = MD5_HASH_LEN;
   1097 	uchar_t *keys = ssl->pending_keyblock;
   1098 	int steps = howmany(ssl->pending_keyblksz, hlen);
   1099 	int i;
   1100 
   1101 	ms = ssl->sid.master_secret;
   1102 
   1103 	ASSERT(hlen * steps <= MAX_KEYBLOCK_LENGTH);
   1104 
   1105 	for (i = 1; i <= steps; i++) {
   1106 		kssl_ssl3_key_material_derive_step(ssl, ms, mslen, i, keys, 1);
   1107 		keys += hlen;
   1108 	}
   1109 }
   1110 
   1111 static char *ssl3_key_derive_seeds[9] = {"A", "BB", "CCC", "DDDD", "EEEEE",
   1112 	"FFFFFF", "GGGGGGG", "HHHHHHHH", "IIIIIIIII"};
   1113 
   1114 static void
   1115 kssl_ssl3_key_material_derive_step(
   1116 	ssl_t *ssl,
   1117 	uchar_t *secret,
   1118 	size_t secretlen,
   1119 	int step,
   1120 	uchar_t *dst,
   1121 	int sr_first)
   1122 {
   1123 	SHA1_CTX sha1, *sha1ctx;
   1124 	MD5_CTX md5, *md5ctx;
   1125 	uchar_t sha1_hash[SHA1_HASH_LEN];
   1126 
   1127 	sha1ctx = &sha1;
   1128 	md5ctx = &md5;
   1129 
   1130 	ASSERT(step <=
   1131 	    sizeof (ssl3_key_derive_seeds) /
   1132 	    sizeof (ssl3_key_derive_seeds[0]));
   1133 	step--;
   1134 
   1135 	SHA1Init(sha1ctx);
   1136 	SHA1Update(sha1ctx, (uchar_t *)ssl3_key_derive_seeds[step],
   1137 	    step + 1);
   1138 	SHA1Update(sha1ctx, secret, secretlen);
   1139 	if (sr_first) {
   1140 		SHA1Update(sha1ctx, ssl->server_random, SSL3_RANDOM_LENGTH);
   1141 		SHA1Update(sha1ctx, ssl->client_random, SSL3_RANDOM_LENGTH);
   1142 	} else {
   1143 		SHA1Update(sha1ctx, ssl->client_random, SSL3_RANDOM_LENGTH);
   1144 		SHA1Update(sha1ctx, ssl->server_random, SSL3_RANDOM_LENGTH);
   1145 	}
   1146 	SHA1Final(sha1_hash, sha1ctx);
   1147 
   1148 	MD5Init(md5ctx);
   1149 	MD5Update(md5ctx, secret, secretlen);
   1150 	MD5Update(md5ctx, sha1_hash, SHA1_HASH_LEN);
   1151 	MD5Final(dst, md5ctx);
   1152 }
   1153 
   1154 static int
   1155 kssl_send_certificate_and_server_hello_done(ssl_t *ssl)
   1156 {
   1157 	int cur_reclen;
   1158 	int mss;
   1159 	int len, copylen;
   1160 	mblk_t *mp;
   1161 	uchar_t *cert_buf;
   1162 	int cert_len;
   1163 	uchar_t *msgbuf;
   1164 	Certificate_t *cert;
   1165 
   1166 	cert = ssl->kssl_entry->ke_server_certificate;
   1167 	if (cert == NULL) {
   1168 		return (ENOENT);
   1169 	}
   1170 	cert_buf = cert->msg;
   1171 	cert_len = cert->len;
   1172 
   1173 	mp = ssl->handshake_sendbuf;
   1174 	mss = ssl->tcp_mss;
   1175 	ASSERT(mp != NULL);
   1176 	cur_reclen = mp->b_wptr - mp->b_rptr - SSL3_HDR_LEN;
   1177 	ASSERT(cur_reclen == KSSL_SSL3_SH_RECLEN);
   1178 	/* Assume MSS is at least 80 bytes */
   1179 	ASSERT(mss > cur_reclen + SSL3_HDR_LEN);
   1180 	ASSERT(cur_reclen < SSL3_MAX_RECORD_LENGTH); /* XXX */
   1181 
   1182 	copylen = mss - (cur_reclen + SSL3_HDR_LEN);
   1183 	len = cert_len;
   1184 	copylen = MIN(copylen, len);
   1185 	copylen = MIN(copylen, SSL3_MAX_RECORD_LENGTH - cur_reclen);
   1186 
   1187 	/* new record always starts in a new mblk for simplicity */
   1188 	msgbuf = cert_buf;
   1189 	for (;;) {
   1190 		ASSERT(mp->b_wptr + copylen <= mp->b_datap->db_lim);
   1191 		bcopy(msgbuf, mp->b_wptr, copylen);
   1192 		msgbuf += copylen;
   1193 		mp->b_wptr += copylen;
   1194 		cur_reclen += copylen;
   1195 		len -= copylen;
   1196 		if (len == 0) {
   1197 			break;
   1198 		}
   1199 		if (cur_reclen == SSL3_MAX_RECORD_LENGTH) {
   1200 			cur_reclen = 0;
   1201 		}
   1202 		copylen = MIN(len, mss);
   1203 		copylen = MIN(copylen, SSL3_MAX_RECORD_LENGTH - cur_reclen);
   1204 		mp->b_cont = allocb(copylen, BPRI_HI);
   1205 		if (mp->b_cont == NULL) {
   1206 			KSSL_COUNTER(alloc_fails, 1);
   1207 			freemsg(ssl->handshake_sendbuf);
   1208 			ssl->handshake_sendbuf = NULL;
   1209 			return (ENOMEM);
   1210 		}
   1211 		mp = mp->b_cont;
   1212 		if (cur_reclen == 0) {
   1213 			mp->b_wptr[0] = content_handshake;
   1214 			mp->b_wptr[1] = ssl->major_version;
   1215 			mp->b_wptr[2] = ssl->minor_version;
   1216 			cur_reclen = MIN(len, SSL3_MAX_RECORD_LENGTH);
   1217 			mp->b_wptr[3] = (cur_reclen >> 8) & 0xff;
   1218 			mp->b_wptr[4] = (cur_reclen) & 0xff;
   1219 			mp->b_wptr += SSL3_HDR_LEN;
   1220 			cur_reclen = 0;
   1221 			copylen = MIN(copylen, mss - SSL3_HDR_LEN);
   1222 		}
   1223 	}
   1224 
   1225 	/* adjust the record length field for the first record */
   1226 	mp = ssl->handshake_sendbuf;
   1227 	cur_reclen = MIN(KSSL_SSL3_SH_RECLEN + cert_len,
   1228 	    SSL3_MAX_RECORD_LENGTH);
   1229 	mp->b_rptr[3] = (cur_reclen >> 8) & 0xff;
   1230 	mp->b_rptr[4] = (cur_reclen) & 0xff;
   1231 
   1232 	kssl_update_handshake_hashes(ssl, cert_buf, cert_len);
   1233 
   1234 	return (0);
   1235 }
   1236 
   1237 static int
   1238 kssl_send_change_cipher_specs(ssl_t *ssl)
   1239 {
   1240 	mblk_t *mp, *newmp;
   1241 	uchar_t *buf;
   1242 
   1243 	mp = ssl->handshake_sendbuf;
   1244 
   1245 	/* We're most likely to hit the fast path for resumed sessions */
   1246 	if ((mp != NULL) &&
   1247 	    (mp->b_datap->db_lim - mp->b_wptr > KSSL_SSL3_MAX_CCP_FIN_MSGLEN)) {
   1248 		buf = mp->b_wptr;
   1249 	} else {
   1250 		newmp = allocb(KSSL_SSL3_MAX_CCP_FIN_MSGLEN, BPRI_HI);
   1251 
   1252 		if (newmp == NULL)
   1253 			return (ENOMEM);	/* need to do better job! */
   1254 
   1255 		if (mp == NULL) {
   1256 			ssl->handshake_sendbuf = newmp;
   1257 		} else {
   1258 			linkb(ssl->handshake_sendbuf, newmp);
   1259 		}
   1260 		mp = newmp;
   1261 		buf = mp->b_rptr;
   1262 	}
   1263 
   1264 	/* 5 byte record header */
   1265 	buf[0] = content_change_cipher_spec;
   1266 	buf[1] = ssl->major_version;
   1267 	buf[2] = ssl->minor_version;
   1268 	buf[3] = 0;
   1269 	buf[4] = 1;
   1270 	buf += SSL3_HDR_LEN;
   1271 
   1272 	buf[0] = 1;
   1273 
   1274 	mp->b_wptr = buf + 1;
   1275 	ASSERT(mp->b_wptr < mp->b_datap->db_lim);
   1276 
   1277 	ssl->seq_num[KSSL_WRITE] = 0;
   1278 	return (kssl_spec_init(ssl, KSSL_WRITE));
   1279 }
   1280 
   1281 int
   1282 kssl_spec_init(ssl_t *ssl, int dir)
   1283 {
   1284 	KSSL_HASHCTX *ctx;
   1285 	KSSLCipherSpec *spec = &ssl->spec[dir];
   1286 	int ret = 0;
   1287 
   1288 	spec->mac_hashsz = mac_defs[ssl->pending_malg].hashsz;
   1289 	spec->mac_padsz = mac_defs[ssl->pending_malg].padsz;
   1290 
   1291 	spec->MAC_HashInit = mac_defs[ssl->pending_malg].HashInit;
   1292 	spec->MAC_HashUpdate = mac_defs[ssl->pending_malg].HashUpdate;
   1293 	spec->MAC_HashFinal = mac_defs[ssl->pending_malg].HashFinal;
   1294 
   1295 	if (dir == KSSL_READ) {
   1296 		bcopy(ssl->pending_keyblock, ssl->mac_secret[dir],
   1297 		    spec->mac_hashsz);
   1298 	} else {
   1299 		bcopy(&(ssl->pending_keyblock[spec->mac_hashsz]),
   1300 		    ssl->mac_secret[dir], spec->mac_hashsz);
   1301 	}
   1302 
   1303 	/* Pre-compute these here. will save cycles on each record later */
   1304 	if (!IS_TLS(ssl)) {
   1305 		ctx = &ssl->mac_ctx[dir][0];
   1306 		spec->MAC_HashInit((void *)ctx);
   1307 		spec->MAC_HashUpdate((void *)ctx, ssl->mac_secret[dir],
   1308 		    spec->mac_hashsz);
   1309 		spec->MAC_HashUpdate((void *)ctx, kssl_pad_1,
   1310 		    spec->mac_padsz);
   1311 
   1312 		ctx = &ssl->mac_ctx[dir][1];
   1313 		spec->MAC_HashInit((void *)ctx);
   1314 		spec->MAC_HashUpdate((void *)ctx, ssl->mac_secret[dir],
   1315 		    spec->mac_hashsz);
   1316 		spec->MAC_HashUpdate((void *)ctx, kssl_pad_2,
   1317 		    spec->mac_padsz);
   1318 	}
   1319 
   1320 	spec->cipher_type = cipher_defs[ssl->pending_calg].type;
   1321 	spec->cipher_mech.cm_type = cipher_defs[ssl->pending_calg].mech_type;
   1322 	spec->cipher_bsize = cipher_defs[ssl->pending_calg].bsize;
   1323 	spec->cipher_keysz = cipher_defs[ssl->pending_calg].keysz;
   1324 
   1325 	if (spec->cipher_ctx != NULL) {
   1326 		crypto_cancel_ctx(spec->cipher_ctx);
   1327 		spec->cipher_ctx = 0;
   1328 	}
   1329 
   1330 	/*
   1331 	 * Initialize HMAC keys for TLS and SSL3 HMAC keys
   1332 	 * for SSL 3.0.
   1333 	 */
   1334 	if (IS_TLS(ssl)) {
   1335 		if (ssl->pending_malg == mac_md5) {
   1336 			spec->hmac_mech = hmac_md5_mech;
   1337 		} else if (ssl->pending_malg == mac_sha) {
   1338 			spec->hmac_mech = hmac_sha1_mech;
   1339 		}
   1340 
   1341 		spec->hmac_key.ck_format = CRYPTO_KEY_RAW;
   1342 		spec->hmac_key.ck_data = ssl->mac_secret[dir];
   1343 		spec->hmac_key.ck_length = spec->mac_hashsz * 8;
   1344 	} else {
   1345 		static uint32_t param;
   1346 
   1347 		spec->hmac_mech.cm_type = CRYPTO_MECH_INVALID;
   1348 		spec->hmac_mech.cm_param = (caddr_t)&param;
   1349 		spec->hmac_mech.cm_param_len = sizeof (param);
   1350 		if (ssl->pending_malg == mac_md5) {
   1351 			spec->hmac_mech.cm_type =
   1352 			    crypto_mech2id("CKM_SSL3_MD5_MAC");
   1353 			param = MD5_HASH_LEN;
   1354 		} else if (ssl->pending_malg == mac_sha) {
   1355 			spec->hmac_mech.cm_type =
   1356 			    crypto_mech2id("CKM_SSL3_SHA1_MAC");
   1357 			param = SHA1_HASH_LEN;
   1358 		}
   1359 
   1360 		spec->hmac_key.ck_format = CRYPTO_KEY_RAW;
   1361 		spec->hmac_key.ck_data = ssl->mac_secret[dir];
   1362 		spec->hmac_key.ck_length = spec->mac_hashsz * 8;
   1363 	}
   1364 
   1365 	/* We're done if this is the nil cipher */
   1366 	if (spec->cipher_keysz == 0) {
   1367 		return (0);
   1368 	}
   1369 
   1370 	/* Initialize the key and the active context */
   1371 	spec->cipher_key.ck_format = CRYPTO_KEY_RAW;
   1372 	spec->cipher_key.ck_length = 8 * spec->cipher_keysz; /* in bits */
   1373 
   1374 	if (cipher_defs[ssl->pending_calg].bsize > 0) {
   1375 		/* client_write_IV */
   1376 		spec->cipher_mech.cm_param =
   1377 		    (caddr_t)&(ssl->pending_keyblock[2 * spec->mac_hashsz +
   1378 		    2 * spec->cipher_keysz]);
   1379 		spec->cipher_mech.cm_param_len = spec->cipher_bsize;
   1380 	}
   1381 	spec->cipher_data.cd_format = CRYPTO_DATA_RAW;
   1382 	if (dir == KSSL_READ) {
   1383 		spec->cipher_mech.cm_param_len =
   1384 		    cipher_defs[ssl->pending_calg].bsize;
   1385 
   1386 		/* client_write_key */
   1387 		spec->cipher_key.ck_data =
   1388 		    &(ssl->pending_keyblock[2 * spec->mac_hashsz]);
   1389 
   1390 		ret = crypto_decrypt_init(&(spec->cipher_mech),
   1391 		    &(spec->cipher_key), NULL, &spec->cipher_ctx, NULL);
   1392 		if (CRYPTO_ERR(ret)) {
   1393 			DTRACE_PROBE1(kssl_err__crypto_decrypt_init_read,
   1394 			    int, ret);
   1395 		}
   1396 	} else {
   1397 		if (cipher_defs[ssl->pending_calg].bsize > 0) {
   1398 			/* server_write_IV */
   1399 			spec->cipher_mech.cm_param += spec->cipher_bsize;
   1400 		}
   1401 
   1402 		/* server_write_key */
   1403 		spec->cipher_key.ck_data =
   1404 		    &(ssl->pending_keyblock[2 * spec->mac_hashsz +
   1405 		    spec->cipher_keysz]);
   1406 
   1407 		ret = crypto_encrypt_init(&(spec->cipher_mech),
   1408 		    &(spec->cipher_key), NULL, &spec->cipher_ctx, NULL);
   1409 		if (CRYPTO_ERR(ret))
   1410 			DTRACE_PROBE1(kssl_err__crypto_encrypt_init_non_read,
   1411 			    int, ret);
   1412 	}
   1413 	return (ret);
   1414 }
   1415 
   1416 static int
   1417 kssl_send_finished(ssl_t *ssl, int update_hsh)
   1418 {
   1419 	mblk_t *mp;
   1420 	uchar_t *buf;
   1421 	uchar_t *rstart;
   1422 	uchar_t *versionp;
   1423 	SSL3Hashes ssl3hashes;
   1424 	size_t finish_len;
   1425 	int ret;
   1426 
   1427 	mp = ssl->handshake_sendbuf;
   1428 	ASSERT(mp != NULL);
   1429 	buf = mp->b_wptr;
   1430 	ASSERT(buf - mp->b_rptr == SSL3_HDR_LEN + KSSL_SSL3_SH_RECLEN +
   1431 	    SSL3_HDR_LEN + 1 || buf - mp->b_rptr == SSL3_HDR_LEN + 1);
   1432 
   1433 	rstart = buf;
   1434 
   1435 	if (IS_TLS(ssl))
   1436 		finish_len = TLS_FINISHED_SIZE;
   1437 	else
   1438 		finish_len = KSSL_SSL3_FIN_MSGLEN;
   1439 
   1440 	/* 5 byte record header */
   1441 	buf[0] = content_handshake;
   1442 	buf[1] = ssl->major_version;
   1443 	buf[2] = ssl->minor_version;
   1444 	buf[3] = 0;
   1445 	buf[4] = 4 + finish_len;
   1446 
   1447 	versionp = &buf[1];
   1448 
   1449 	buf += SSL3_HDR_LEN;
   1450 
   1451 	/* 4 byte message header */
   1452 	buf[0] = (uchar_t)finished;	/* message type */
   1453 	buf[1] = 0;			/* message len byte 0 */
   1454 	buf[2] = 0;			/* message len byte 1 */
   1455 	buf[3] = finish_len;	/* message len byte 2 */
   1456 	buf += 4;
   1457 
   1458 	if (IS_TLS(ssl)) {
   1459 		bcopy(ssl->hs_hashes.md5, ssl3hashes.md5,
   1460 		    sizeof (ssl3hashes.md5));
   1461 		bcopy(ssl->hs_hashes.sha1, ssl3hashes.sha1,
   1462 		    sizeof (ssl3hashes.sha1));
   1463 	}
   1464 
   1465 	/* Compute hashes for the SENDER side */
   1466 	ret = kssl_compute_handshake_hashes(ssl, &ssl3hashes, sender_server);
   1467 	if (ret != 0)
   1468 		return (ret);
   1469 
   1470 	if (IS_TLS(ssl)) {
   1471 		bcopy(ssl3hashes.tlshash, buf, sizeof (ssl3hashes.tlshash));
   1472 	} else {
   1473 		bcopy(ssl3hashes.md5, buf, MD5_HASH_LEN);
   1474 		bcopy(ssl3hashes.sha1, buf + MD5_HASH_LEN, SHA1_HASH_LEN);
   1475 	}
   1476 
   1477 	if (update_hsh) {
   1478 		kssl_update_handshake_hashes(ssl, buf - 4, finish_len + 4);
   1479 	}
   1480 
   1481 	mp->b_wptr = buf + finish_len;
   1482 
   1483 	ret = kssl_mac_encrypt_record(ssl, content_handshake, versionp,
   1484 	    rstart, mp);
   1485 	ASSERT(mp->b_wptr <= mp->b_datap->db_lim);
   1486 
   1487 	return (ret);
   1488 }
   1489 
   1490 int
   1491 kssl_mac_encrypt_record(ssl_t *ssl,
   1492 	SSL3ContentType ct,
   1493 	uchar_t *versionp,
   1494 	uchar_t *rstart,
   1495 	mblk_t *mp)
   1496 {
   1497 	KSSLCipherSpec *spec;
   1498 	int mac_sz;
   1499 	int ret = 0;
   1500 	uint16_t rec_sz;
   1501 	int pad_sz;
   1502 	int i;
   1503 
   1504 	ASSERT(ssl != NULL);
   1505 	ASSERT(rstart >= mp->b_rptr);
   1506 	ASSERT(rstart < mp->b_wptr);
   1507 
   1508 	spec = &ssl->spec[KSSL_WRITE];
   1509 	mac_sz = spec->mac_hashsz;
   1510 
   1511 	rec_sz = (mp->b_wptr - rstart) - SSL3_HDR_LEN;
   1512 	ASSERT(rec_sz > 0);
   1513 
   1514 	if (mac_sz != 0) {
   1515 		ASSERT(mp->b_wptr + mac_sz <= mp->b_datap->db_lim);
   1516 		ret = kssl_compute_record_mac(ssl, KSSL_WRITE,
   1517 		    ssl->seq_num[KSSL_WRITE], ct, versionp,
   1518 		    rstart + SSL3_HDR_LEN, rec_sz, mp->b_wptr);
   1519 		if (ret == CRYPTO_SUCCESS) {
   1520 			ssl->seq_num[KSSL_WRITE]++;
   1521 			mp->b_wptr += mac_sz;
   1522 			rec_sz += mac_sz;
   1523 		} else {
   1524 			return (ret);
   1525 		}
   1526 	}
   1527 
   1528 	if (spec->cipher_type == type_block) {
   1529 		pad_sz = spec->cipher_bsize -
   1530 		    (rec_sz & (spec->cipher_bsize - 1));
   1531 		ASSERT(mp->b_wptr + pad_sz <= mp->b_datap->db_lim);
   1532 		for (i = 0; i < pad_sz; i++) {
   1533 			mp->b_wptr[i] = pad_sz - 1;
   1534 		}
   1535 		mp->b_wptr += pad_sz;
   1536 		rec_sz += pad_sz;
   1537 	}
   1538 
   1539 	ASSERT(rec_sz <= SSL3_MAX_RECORD_LENGTH);
   1540 
   1541 	U16_TO_BE16(rec_sz, rstart + 3);
   1542 
   1543 	if (spec->cipher_ctx == 0)
   1544 		return (ret);
   1545 
   1546 	spec->cipher_data.cd_length = rec_sz;
   1547 	spec->cipher_data.cd_raw.iov_base = (char *)(rstart + SSL3_HDR_LEN);
   1548 	spec->cipher_data.cd_raw.iov_len = rec_sz;
   1549 	/* One record at a time. Otherwise, gotta allocate the crypt_data_t */
   1550 	ret = crypto_encrypt_update(spec->cipher_ctx, &spec->cipher_data,
   1551 	    NULL, NULL);
   1552 	if (CRYPTO_ERR(ret)) {
   1553 		DTRACE_PROBE1(kssl_err__crypto_encrypt_update,
   1554 		    int, ret);
   1555 	}
   1556 	return (ret);
   1557 }
   1558 
   1559 void
   1560 kssl_send_alert(ssl_t *ssl, SSL3AlertLevel level, SSL3AlertDescription desc)
   1561 {
   1562 	mblk_t *mp;
   1563 	uchar_t *buf;
   1564 	KSSLCipherSpec *spec;
   1565 
   1566 	ASSERT(ssl != NULL);
   1567 
   1568 	ssl->sendalert_level = level;
   1569 	ssl->sendalert_desc = desc;
   1570 
   1571 	if (level == alert_fatal) {
   1572 		DTRACE_PROBE2(kssl_sending_alert,
   1573 		    SSL3AlertLevel, level, SSL3AlertDescription, desc);
   1574 		if (ssl->sid.cached == B_TRUE) {
   1575 			kssl_uncache_sid(&ssl->sid, ssl->kssl_entry);
   1576 		}
   1577 		ssl->fatal_alert = B_TRUE;
   1578 		KSSL_COUNTER(fatal_alerts, 1);
   1579 	} else
   1580 		KSSL_COUNTER(warning_alerts, 1);
   1581 
   1582 	spec = &ssl->spec[KSSL_WRITE];
   1583 
   1584 	ASSERT(ssl->alert_sendbuf == NULL);
   1585 	ssl->alert_sendbuf = mp = allocb(7 + spec->mac_hashsz +
   1586 	    spec->cipher_bsize, BPRI_HI);
   1587 	if (mp == NULL) {
   1588 		KSSL_COUNTER(alloc_fails, 1);
   1589 		return;
   1590 	}
   1591 	buf = mp->b_wptr;
   1592 
   1593 	/* 5 byte record header */
   1594 	buf[0] = content_alert;
   1595 	buf[1] = ssl->major_version;
   1596 	buf[2] = ssl->minor_version;
   1597 	buf[3] = 0;
   1598 	buf[4] = 2;
   1599 	buf += SSL3_HDR_LEN;
   1600 
   1601 	/* alert contents */
   1602 	buf[0] = (uchar_t)level;
   1603 	buf[1] = (uchar_t)desc;
   1604 
   1605 	mp->b_wptr = buf + 2;
   1606 }
   1607 
   1608 /* Assumes RSA encryption */
   1609 static int
   1610 kssl_handle_client_key_exchange(ssl_t *ssl, mblk_t *mp, int msglen,
   1611     kssl_callback_t cbfn, void *arg)
   1612 {
   1613 	char *buf;
   1614 	uchar_t *pms;
   1615 	size_t pmslen;
   1616 	int allocated;
   1617 	int err, rverr = ENOMEM;
   1618 	kssl_entry_t *ep;
   1619 	crypto_key_t *privkey;
   1620 	crypto_data_t *wrapped_pms_data, *pms_data;
   1621 	crypto_call_req_t creq, *creqp;
   1622 
   1623 	ep = ssl->kssl_entry;
   1624 	privkey = ep->ke_private_key;
   1625 	if (privkey == NULL) {
   1626 		return (ENOENT);
   1627 	}
   1628 
   1629 	ASSERT(ssl->msg.type == client_key_exchange);
   1630 	ASSERT(ssl->hs_waitstate == wait_client_key);
   1631 
   1632 	/*
   1633 	 * TLS adds an extra 2 byte length field before the data.
   1634 	 */
   1635 	if (IS_TLS(ssl)) {
   1636 		msglen = (mp->b_rptr[0] << 8) | mp->b_rptr[1];
   1637 		mp->b_rptr += 2;
   1638 	}
   1639 
   1640 	/*
   1641 	 * Allocate all we need in one shot. about 300 bytes total, for
   1642 	 * 1024 bit RSA modulus.
   1643 	 * The buffer layout will be: pms_data, wrapped_pms_data, the
   1644 	 * value of the wrapped pms from the client, then room for the
   1645 	 * resulting decrypted premaster secret.
   1646 	 */
   1647 	allocated = 2 * (sizeof (crypto_data_t) + msglen);
   1648 	buf = kmem_alloc(allocated, KM_NOSLEEP);
   1649 	if (buf == NULL) {
   1650 		return (ENOMEM);
   1651 	}
   1652 
   1653 	pms_data = (crypto_data_t *)buf;
   1654 	wrapped_pms_data = &(((crypto_data_t *)buf)[1]);
   1655 
   1656 	wrapped_pms_data->cd_format = pms_data->cd_format = CRYPTO_DATA_RAW;
   1657 	wrapped_pms_data->cd_offset = pms_data->cd_offset = 0;
   1658 	wrapped_pms_data->cd_length = pms_data->cd_length = msglen;
   1659 	wrapped_pms_data->cd_miscdata = pms_data->cd_miscdata = NULL;
   1660 	wrapped_pms_data->cd_raw.iov_len = pms_data->cd_raw.iov_len = msglen;
   1661 	wrapped_pms_data->cd_raw.iov_base = buf + 2 * sizeof (crypto_data_t);
   1662 	pms_data->cd_raw.iov_base = wrapped_pms_data->cd_raw.iov_base + msglen;
   1663 
   1664 	bcopy(mp->b_rptr, wrapped_pms_data->cd_raw.iov_base, msglen);
   1665 	mp->b_rptr += msglen;
   1666 
   1667 	/* Proceed synchronously if out of interrupt and configured to do so */
   1668 	if ((kssl_synchronous) && (!servicing_interrupt())) {
   1669 		creqp = NULL;
   1670 	} else {
   1671 		ssl->cke_callback_func = cbfn;
   1672 		ssl->cke_callback_arg = arg;
   1673 		creq.cr_flag = kssl_call_flag;
   1674 		creq.cr_callback_func = kssl_cke_done;
   1675 		creq.cr_callback_arg = ssl;
   1676 
   1677 		/* The callback routine will release this one */
   1678 		KSSL_SSL_REFHOLD(ssl);
   1679 
   1680 		creqp = &creq;
   1681 	}
   1682 
   1683 	if (ep->ke_is_nxkey) {
   1684 		kssl_session_info_t *s;
   1685 
   1686 		s = ep->ke_sessinfo;
   1687 		err = CRYPTO_SUCCESS;
   1688 		if (!s->is_valid_handle) {
   1689 			/* Reauthenticate to the provider */
   1690 			if (s->do_reauth) {
   1691 				err = kssl_get_obj_handle(ep);
   1692 				if (err == CRYPTO_SUCCESS) {
   1693 					s->is_valid_handle = B_TRUE;
   1694 					s->do_reauth = B_FALSE;
   1695 				}
   1696 			} else
   1697 				err = CRYPTO_FAILED;
   1698 		}
   1699 
   1700 		if (err == CRYPTO_SUCCESS) {
   1701 			ASSERT(s->is_valid_handle);
   1702 			err = crypto_decrypt_prov(s->prov, s->sid,
   1703 			    &rsa_x509_mech, wrapped_pms_data, &s->key,
   1704 			    NULL, pms_data, creqp);
   1705 		}
   1706 
   1707 		/*
   1708 		 * Deal with session specific errors. We translate to
   1709 		 * the closest errno.
   1710 		 */
   1711 		switch (err) {
   1712 		case CRYPTO_KEY_HANDLE_INVALID:
   1713 		case CRYPTO_SESSION_HANDLE_INVALID:
   1714 			s->is_valid_handle = B_FALSE;
   1715 			s->do_reauth = B_TRUE;
   1716 			rverr = EINVAL;
   1717 			break;
   1718 		case CRYPTO_PIN_EXPIRED:
   1719 		case CRYPTO_PIN_LOCKED:
   1720 			rverr = EACCES;
   1721 			break;
   1722 		case CRYPTO_UNKNOWN_PROVIDER:
   1723 			rverr = ENXIO;
   1724 			break;
   1725 		}
   1726 	} else {
   1727 		err = crypto_decrypt(&rsa_x509_mech, wrapped_pms_data,
   1728 		    privkey, NULL, pms_data, creqp);
   1729 	}
   1730 
   1731 	switch (err) {
   1732 	case CRYPTO_SUCCESS:
   1733 		break;
   1734 
   1735 	case CRYPTO_QUEUED:
   1736 		/*
   1737 		 * Finish the master secret then the rest of key material
   1738 		 * derivation later.
   1739 		 */
   1740 		ssl->job.kjob = creq.cr_reqid;
   1741 		ssl->job.buf = buf;
   1742 		ssl->job.buflen = allocated;
   1743 		ssl->hs_waitstate = wait_client_key_done;
   1744 		return (0);
   1745 	default:
   1746 		DTRACE_PROBE1(kssl_err__crypto_decrypt, int, err);
   1747 		kmem_free(buf, allocated);
   1748 		return (rverr);
   1749 	}
   1750 
   1751 	pmslen = pms_data->cd_length;
   1752 	pms = kssl_rsa_unwrap((uchar_t *)pms_data->cd_raw.iov_base, &pmslen);
   1753 
   1754 	/* generate master key and save it in the ssl sid structure */
   1755 	if (IS_TLS(ssl)) {
   1756 		err = kssl_generate_tls_ms(ssl, pms, pmslen);
   1757 		if (!CRYPTO_ERR(err))
   1758 			err = kssl_generate_tls_keyblock(ssl);
   1759 	} else {
   1760 		kssl_generate_ssl_ms(ssl, pms, pmslen);
   1761 		kssl_generate_keyblock(ssl);
   1762 	}
   1763 
   1764 	if (err == CRYPTO_SUCCESS)
   1765 		ssl->hs_waitstate = wait_change_cipher;
   1766 
   1767 	ssl->activeinput = B_FALSE;
   1768 
   1769 	kmem_free(buf, allocated);
   1770 
   1771 	return (0);
   1772 }
   1773 
   1774 static int
   1775 kssl_handle_finished(ssl_t *ssl, mblk_t *mp, int msglen)
   1776 {
   1777 	int err;
   1778 	size_t finish_len;
   1779 	int hashcompare;
   1780 
   1781 	ASSERT(ssl->msg.type == finished);
   1782 	ASSERT(ssl->hs_waitstate == wait_finished);
   1783 
   1784 	if (IS_TLS(ssl))
   1785 		finish_len = TLS_FINISHED_SIZE;
   1786 	else
   1787 		finish_len = KSSL_SSL3_FIN_MSGLEN;
   1788 
   1789 	if (msglen != finish_len) {
   1790 		kssl_send_alert(ssl, alert_fatal, illegal_parameter);
   1791 		return (EBADMSG);
   1792 	}
   1793 
   1794 	if (IS_TLS(ssl)) {
   1795 		hashcompare = bcmp(mp->b_rptr, ssl->hs_hashes.tlshash,
   1796 		    finish_len);
   1797 	} else {
   1798 		hashcompare = bcmp(mp->b_rptr, &ssl->hs_hashes, finish_len);
   1799 	}
   1800 
   1801 	/* The handshake hashes should be computed by now */
   1802 	if (hashcompare != 0) {
   1803 		kssl_send_alert(ssl, alert_fatal, handshake_failure);
   1804 		return (EBADMSG);
   1805 	}
   1806 
   1807 	mp->b_rptr += msglen;
   1808 
   1809 	ssl->hs_waitstate = idle_handshake;
   1810 
   1811 	if (ssl->resumed == B_TRUE) {
   1812 		ssl->activeinput = B_FALSE;
   1813 		return (0);
   1814 	}
   1815 
   1816 	err = kssl_send_change_cipher_specs(ssl);
   1817 	if (err != 0) {
   1818 		return (err);
   1819 	}
   1820 	err = kssl_send_finished(ssl, 0);
   1821 	if (err != 0) {
   1822 		return (err);
   1823 	}
   1824 
   1825 	kssl_cache_sid(&ssl->sid, ssl->kssl_entry);
   1826 	ssl->activeinput = B_FALSE;
   1827 
   1828 	return (0);
   1829 }
   1830 
   1831 #define	KSSL2_CH_MIN_RECSZ	(9)
   1832 
   1833 /*
   1834  * This method is needed to handle clients which send the
   1835  * SSLv2/SSLv3 handshake for backwards compat with SSLv2 servers.
   1836  * We are not really doing SSLv2 here, just handling the header
   1837  * and then switching to SSLv3.
   1838  */
   1839 int
   1840 kssl_handle_v2client_hello(ssl_t *ssl, mblk_t *mp, int recsz)
   1841 {
   1842 	uchar_t *recend;
   1843 	int err;
   1844 	SSL3AlertDescription desc = illegal_parameter;
   1845 	uint_t randlen;
   1846 	uint_t sidlen;
   1847 	uint_t cslen;
   1848 	uchar_t *suitesp;
   1849 	uchar_t *rand;
   1850 	uint_t i, j;
   1851 	uint16_t suite;
   1852 	int ch_recsz = KSSL2_CH_MIN_RECSZ;
   1853 
   1854 	ASSERT(mp->b_wptr >= mp->b_rptr + recsz);
   1855 	ASSERT(ssl->hs_waitstate == wait_client_hello);
   1856 	ASSERT(ssl->resumed == B_FALSE);
   1857 
   1858 	if (recsz < ch_recsz) {
   1859 		goto falert;
   1860 	}
   1861 
   1862 	MD5Init(&ssl->hs_md5);
   1863 	SHA1Init(&ssl->hs_sha1);
   1864 
   1865 	kssl_update_handshake_hashes(ssl, mp->b_rptr, recsz);
   1866 
   1867 	recend = mp->b_rptr + recsz;
   1868 
   1869 	if (*mp->b_rptr != 1) {
   1870 		goto falert;
   1871 	}
   1872 	mp->b_rptr += 3;
   1873 
   1874 	cslen = ((uint_t)mp->b_rptr[0] << 8) + (uint_t)mp->b_rptr[1];
   1875 	sidlen = ((uint_t)mp->b_rptr[2] << 8) + (uint_t)mp->b_rptr[3];
   1876 	randlen = ((uint_t)mp->b_rptr[4] << 8) + (uint_t)mp->b_rptr[5];
   1877 	if (cslen % 3 != 0) {
   1878 		DTRACE_PROBE1(kssl_err__cipher_suites_len_error, uint_t, cslen);
   1879 		goto falert;
   1880 	}
   1881 	if (randlen < SSL_MIN_CHALLENGE_BYTES ||
   1882 	    randlen > SSL_MAX_CHALLENGE_BYTES) {
   1883 		DTRACE_PROBE1(kssl_err__randlen_out_of_range,
   1884 		    uint_t, randlen);
   1885 		goto falert;
   1886 	}
   1887 	mp->b_rptr += 6;
   1888 	ch_recsz += cslen + sidlen + randlen;
   1889 	if (recsz != ch_recsz) {
   1890 		goto falert;
   1891 	}
   1892 	suitesp = mp->b_rptr;
   1893 	rand = suitesp + cslen + sidlen;
   1894 	if (randlen < SSL3_RANDOM_LENGTH) {
   1895 		bzero(ssl->client_random, SSL3_RANDOM_LENGTH);
   1896 	}
   1897 	bcopy(rand, &ssl->client_random[SSL3_RANDOM_LENGTH - randlen],
   1898 	    randlen);
   1899 
   1900 	for (i = 0; i < ssl->kssl_entry->kssl_cipherSuites_nentries; i++) {
   1901 		suite = ssl->kssl_entry->kssl_cipherSuites[i];
   1902 		for (j = 0; j < cslen; j += 3) {
   1903 			if (suitesp[j] != 0) {
   1904 				continue;
   1905 			}
   1906 
   1907 			if (suitesp[j + 1] == ((suite >> 8) & 0xff) &&
   1908 			    suitesp[j + 2] == (suite & 0xff)) {
   1909 				break;
   1910 			}
   1911 		}
   1912 		if (j < cslen) {
   1913 			break;
   1914 		}
   1915 	}
   1916 	if (i == ssl->kssl_entry->kssl_cipherSuites_nentries) {
   1917 		DTRACE_PROBE(kssl_err__no_SSLv2_cipher_suite);
   1918 		ssl->activeinput = B_FALSE;
   1919 		return (SSL_MISS);
   1920 	}
   1921 
   1922 	mp->b_rptr = recend;
   1923 
   1924 	for (i = 0; i < cipher_suite_defs_nentries; i++) {
   1925 		if (suite == cipher_suite_defs[i].suite) {
   1926 			break;
   1927 		}
   1928 	}
   1929 
   1930 	ASSERT(i < cipher_suite_defs_nentries);
   1931 
   1932 	ssl->pending_cipher_suite = suite;
   1933 	ssl->pending_malg = cipher_suite_defs[i].malg;
   1934 	ssl->pending_calg = cipher_suite_defs[i].calg;
   1935 	ssl->pending_keyblksz = cipher_suite_defs[i].keyblksz;
   1936 
   1937 	ASSERT(ssl->sid.cached == B_FALSE);
   1938 
   1939 	(void) random_get_pseudo_bytes(ssl->sid.session_id,
   1940 	    SSL3_SESSIONID_BYTES);
   1941 	ssl->sid.client_addr = ssl->faddr;
   1942 	ssl->sid.cipher_suite = suite;
   1943 
   1944 	err = kssl_send_server_hello(ssl);
   1945 	if (err != 0) {
   1946 		return (err);
   1947 	}
   1948 	err = kssl_send_certificate_and_server_hello_done(ssl);
   1949 	if (err != 0) {
   1950 		return (err);
   1951 	}
   1952 	KSSL_COUNTER(full_handshakes, 1);
   1953 	ssl->hs_waitstate = wait_client_key;
   1954 	ssl->activeinput = B_FALSE;
   1955 	return (0);
   1956 
   1957 falert:
   1958 	kssl_send_alert(ssl, alert_fatal, desc);
   1959 	ssl->activeinput = B_FALSE;
   1960 	return (EBADMSG);
   1961 }
   1962 
   1963 /*
   1964  * Call back routine for asynchronously submitted RSA decryption jobs.
   1965  * This routine retrieves the pre-master secret, and proceeds to generate
   1966  * the remaining key materials.
   1967  */
   1968 static void
   1969 kssl_cke_done(void *arg, int status)
   1970 {
   1971 	int ret = 0;
   1972 	uchar_t *pms;
   1973 	size_t pmslen;
   1974 	crypto_data_t *pms_data;
   1975 	kssl_cmd_t kssl_cmd = KSSL_CMD_NONE;
   1976 	ssl_t *ssl = (ssl_t *)arg;
   1977 	mblk_t *alertmp;
   1978 	kssl_callback_t cbfn;
   1979 	void *cbarg;
   1980 
   1981 	mutex_enter(&ssl->kssl_lock);
   1982 
   1983 	ASSERT(ssl->msg.type == client_key_exchange);
   1984 	ASSERT(ssl->hs_waitstate == wait_client_key_done);
   1985 
   1986 	if (status != CRYPTO_SUCCESS) {
   1987 		kssl_send_alert(ssl, alert_fatal, decrypt_error);
   1988 		kssl_cmd = KSSL_CMD_SEND;
   1989 		goto out;
   1990 	}
   1991 
   1992 	pms_data = (crypto_data_t *)(ssl->job.buf);
   1993 
   1994 	ASSERT(pms_data != NULL);
   1995 
   1996 	pmslen = pms_data->cd_length;
   1997 	pms = kssl_rsa_unwrap((uchar_t *)pms_data->cd_raw.iov_base, &pmslen);
   1998 
   1999 	/* generate master key and save it in the ssl sid structure */
   2000 	if (IS_TLS(ssl)) {
   2001 		ret = kssl_generate_tls_ms(ssl, pms, pmslen);
   2002 		if (!CRYPTO_ERR(ret))
   2003 			ret = kssl_generate_tls_keyblock(ssl);
   2004 	} else {
   2005 		kssl_generate_ssl_ms(ssl, pms, pmslen);
   2006 		kssl_generate_keyblock(ssl);
   2007 	}
   2008 
   2009 	if (ret == CRYPTO_SUCCESS)
   2010 		ssl->hs_waitstate = wait_change_cipher;
   2011 
   2012 out:
   2013 	kmem_free(ssl->job.buf, ssl->job.buflen);
   2014 
   2015 	ssl->job.kjob = 0;
   2016 	ssl->job.buf = NULL;
   2017 	ssl->job.buflen = 0;
   2018 
   2019 	ssl->activeinput = B_FALSE;
   2020 
   2021 	/* If we're the only ones left, then we won't callback */
   2022 	if (ssl->kssl_refcnt == 1) {
   2023 		mutex_exit(&ssl->kssl_lock);
   2024 		KSSL_SSL_REFRELE(ssl);
   2025 		return;
   2026 	}
   2027 
   2028 	cbfn = ssl->cke_callback_func;
   2029 	cbarg = ssl->cke_callback_arg;
   2030 	alertmp = ssl->alert_sendbuf;
   2031 	ssl->alert_sendbuf = NULL;
   2032 
   2033 	mutex_exit(&ssl->kssl_lock);
   2034 
   2035 	KSSL_SSL_REFRELE(ssl);
   2036 
   2037 	/* Now call the callback routine */
   2038 	(*(cbfn))(cbarg, alertmp, kssl_cmd);
   2039 }
   2040 
   2041 /*
   2042  * Returns the first complete contiguous record out of rec_ass_head
   2043  * The record is returned in a separate contiguous mblk, rec_ass_head is
   2044  * left pointing to the next record in the queue.
   2045  *
   2046  * The output looks as follows:
   2047  *
   2048  * |--------|---------- .... -----|<---------->|<----------->|--- ... ---|
   2049  * ^        ^                     ^  mac_size     pad_size               ^
   2050  * |        |___ b_rptr  b_wptr __|                                      |
   2051  * |                                                                     |
   2052  * |___ db_base                                                db_lim ___|
   2053  */
   2054 mblk_t *
   2055 kssl_get_next_record(ssl_t *ssl)
   2056 {
   2057 	mblk_t *mp, *retmp;
   2058 	int rhsz = SSL3_HDR_LEN;
   2059 	uint16_t rec_sz;
   2060 	int mpsz, total_size;
   2061 	SSL3ContentType content_type;
   2062 
   2063 	ASSERT(MUTEX_HELD(&ssl->kssl_lock));
   2064 
   2065 	mp = ssl->rec_ass_head;
   2066 	if (mp == NULL)
   2067 		return (NULL);
   2068 
   2069 	/* Fast path: when mp has at least a complete record */
   2070 	if (MBLKL(mp) < rhsz) {
   2071 		DTRACE_PROBE1(kssl_mblk__incomplete_header,
   2072 		    mblk_t *, mp);
   2073 		/* Not even a complete header in there yet */
   2074 		if (msgdsize(mp) < rhsz) {
   2075 			return (NULL);
   2076 		}
   2077 
   2078 		if (!pullupmsg(mp, rhsz)) {
   2079 			kssl_send_alert(ssl, alert_fatal, internal_error);
   2080 			freemsg(mp);
   2081 			ssl->rec_ass_head = ssl->rec_ass_tail = NULL;
   2082 			return (NULL);
   2083 		}
   2084 	}
   2085 	content_type = (SSL3ContentType)mp->b_rptr[0];
   2086 	if (content_type == content_handshake_v2) {
   2087 		DTRACE_PROBE1(kssl_mblk__ssl_v2, mblk_t *, mp);
   2088 		rec_sz = (uint16_t)mp->b_rptr[1];
   2089 		rhsz = 2;
   2090 	} else {
   2091 		DTRACE_PROBE1(kssl_mblk__ssl_v3, mblk_t *, mp);
   2092 		uint8_t *rec_sz_p = (uint8_t *)mp->b_rptr + 3;
   2093 		rec_sz = BE16_TO_U16(rec_sz_p);
   2094 	}
   2095 
   2096 	/*
   2097 	 * same tests as above. Only rare very fragmented cases will
   2098 	 * incur the cost of msgdsize() and msgpullup(). Well formed
   2099 	 * packets will fall in the most frequent fast path.
   2100 	 */
   2101 	total_size = rhsz + rec_sz;
   2102 
   2103 	/*
   2104 	 * Missing: defensive against record fabricated with longer than
   2105 	 * MAX record length.
   2106 	 */
   2107 	if (MBLKL(mp) < total_size) {
   2108 		DTRACE_PROBE2(kssl_mblk__smaller_than_total_size,
   2109 		    mblk_t *, mp, int, total_size);
   2110 		/* Not a complete record yet. Keep accumulating */
   2111 		if (msgdsize(mp) < total_size) {
   2112 			return (NULL);
   2113 		}
   2114 
   2115 		if (!pullupmsg(mp, total_size)) {
   2116 			kssl_send_alert(ssl, alert_fatal, internal_error);
   2117 			freemsg(mp);
   2118 			ssl->rec_ass_head = ssl->rec_ass_tail = NULL;
   2119 			return (NULL);
   2120 		}
   2121 	}
   2122 	mpsz = MBLKL(mp);	/* could've changed after the pullup */
   2123 
   2124 	if (mpsz > total_size) {
   2125 		DTRACE_PROBE2(kssl_mblk__bigger_than_total_size,
   2126 		    mblk_t *, mp, int, total_size);
   2127 		/* gotta allocate a new block */
   2128 		if ((retmp = dupb(mp)) == NULL) {
   2129 			kssl_send_alert(ssl, alert_fatal, internal_error);
   2130 			freemsg(mp);
   2131 			ssl->rec_ass_head = ssl->rec_ass_tail = NULL;
   2132 			return (NULL);
   2133 		}
   2134 
   2135 		retmp->b_wptr = retmp->b_rptr + total_size;
   2136 		mp->b_rptr += total_size;
   2137 		ssl->rec_ass_head = mp;
   2138 	} else {
   2139 		DTRACE_PROBE2(kssl_mblk__equal_to_total_size,
   2140 		    mblk_t *, mp, int, total_size);
   2141 		ASSERT(mpsz == total_size);
   2142 		ssl->rec_ass_head = mp->b_cont;
   2143 		mp->b_cont = NULL;
   2144 		retmp = mp;
   2145 	}
   2146 	/* Adjust the tail */
   2147 	if ((mp = ssl->rec_ass_tail = ssl->rec_ass_head) != NULL) {
   2148 		for (; mp->b_cont != NULL; mp = mp->b_cont) {
   2149 			ssl->rec_ass_tail = mp->b_cont;
   2150 		}
   2151 	}
   2152 
   2153 	return (retmp);
   2154 }
   2155 
   2156 
   2157 static void
   2158 kssl_mblksfree(ssl_t *ssl)
   2159 {
   2160 
   2161 	ASSERT(ssl != NULL);
   2162 
   2163 	if (ssl->rec_ass_head != NULL) {
   2164 		freemsg(ssl->rec_ass_head);
   2165 	}
   2166 	ssl->rec_ass_head = NULL;
   2167 	ssl->rec_ass_tail = NULL;
   2168 
   2169 	if (ssl->msg.head != NULL) {
   2170 		freemsg(ssl->msg.head);
   2171 	}
   2172 	ssl->msg.head = NULL;
   2173 	ssl->msg.tail = NULL;
   2174 
   2175 	if (ssl->handshake_sendbuf != NULL) {
   2176 		freemsg(ssl->handshake_sendbuf);
   2177 		ssl->handshake_sendbuf = NULL;
   2178 	}
   2179 	if (ssl->alert_sendbuf != NULL) {
   2180 		freemsg(ssl->alert_sendbuf);
   2181 		ssl->alert_sendbuf = NULL;
   2182 	}
   2183 }
   2184 
   2185 static void
   2186 kssl_specsfree(ssl_t *ssl)
   2187 {
   2188 	KSSLCipherSpec *spec = &ssl->spec[KSSL_READ];
   2189 
   2190 	if (spec->cipher_ctx != NULL) {
   2191 		crypto_cancel_ctx(spec->cipher_ctx);
   2192 		spec->cipher_ctx = 0;
   2193 	}
   2194 
   2195 	spec = &ssl->spec[KSSL_WRITE];
   2196 
   2197 	if (spec->cipher_ctx != NULL) {
   2198 		crypto_cancel_ctx(spec->cipher_ctx);
   2199 		spec->cipher_ctx = 0;
   2200 	}
   2201 }
   2202 
   2203 /*
   2204  * Frees the ssl structure (aka the context of an SSL session).
   2205  * Any pending crypto jobs are cancelled.
   2206  * Any initiated crypto contexts are freed as well.
   2207  */
   2208 void
   2209 kssl_free_context(ssl_t *ssl)
   2210 {
   2211 	ASSERT(ssl != NULL);
   2212 	if (!(MUTEX_HELD(&ssl->kssl_lock))) {
   2213 		/* we're coming from an external API entry point */
   2214 		mutex_enter(&ssl->kssl_lock);
   2215 	}
   2216 
   2217 	if (ssl->job.kjob != NULL) {
   2218 		crypto_cancel_req(ssl->job.kjob);
   2219 		kmem_free(ssl->job.buf, ssl->job.buflen);
   2220 
   2221 		ssl->job.kjob = 0;
   2222 		ssl->job.buf = NULL;
   2223 		ssl->job.buflen = 0;
   2224 	}
   2225 
   2226 	kssl_mblksfree(ssl);
   2227 	kssl_specsfree(ssl);
   2228 
   2229 	KSSL_ENTRY_REFRELE(ssl->kssl_entry);
   2230 	ssl->kssl_entry = NULL;
   2231 
   2232 	mutex_exit(&ssl->kssl_lock);
   2233 
   2234 	kmem_cache_free(kssl_cache, ssl);
   2235 	kssl_cache_count--;
   2236 }
   2237