xref: /illumos-gate/usr/src/uts/common/crypto/io/aes.c (revision fb2a9bae0030340ad72b9c26ba1ffee2ee3cafec)
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 2010 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * AES provider for the Kernel Cryptographic Framework (KCF)
28  */
29 
30 #include <sys/types.h>
31 #include <sys/systm.h>
32 #include <sys/modctl.h>
33 #include <sys/cmn_err.h>
34 #include <sys/ddi.h>
35 #include <sys/crypto/common.h>
36 #include <sys/crypto/impl.h>
37 #include <sys/crypto/spi.h>
38 #include <sys/sysmacros.h>
39 #include <sys/strsun.h>
40 #include <modes/modes.h>
41 #define	_AES_FIPS_POST
42 #define	_AES_IMPL
43 #include <aes/aes_impl.h>
44 
45 extern struct mod_ops mod_cryptoops;
46 
47 /*
48  * Module linkage information for the kernel.
49  */
50 static struct modlcrypto modlcrypto = {
51 	&mod_cryptoops,
52 	"AES Kernel SW Provider"
53 };
54 
55 static struct modlinkage modlinkage = {
56 	MODREV_1,
57 	(void *)&modlcrypto,
58 	NULL
59 };
60 
61 /*
62  * The following definitions are to keep EXPORT_SRC happy.
63  */
64 #ifndef AES_MIN_KEY_BYTES
65 #define	AES_MIN_KEY_BYTES		0
66 #endif
67 
68 #ifndef AES_MAX_KEY_BYTES
69 #define	AES_MAX_KEY_BYTES		0
70 #endif
71 
72 /*
73  * Mechanism info structure passed to KCF during registration.
74  */
75 static crypto_mech_info_t aes_mech_info_tab[] = {
76 	/* AES_ECB */
77 	{SUN_CKM_AES_ECB, AES_ECB_MECH_INFO_TYPE,
78 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
79 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC,
80 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES},
81 	/* AES_CBC */
82 	{SUN_CKM_AES_CBC, AES_CBC_MECH_INFO_TYPE,
83 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
84 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC,
85 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES},
86 	/* AES_CTR */
87 	{SUN_CKM_AES_CTR, AES_CTR_MECH_INFO_TYPE,
88 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
89 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC,
90 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES},
91 	/* AES_CCM */
92 	{SUN_CKM_AES_CCM, AES_CCM_MECH_INFO_TYPE,
93 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
94 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC,
95 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES},
96 	/* AES_GCM */
97 	{SUN_CKM_AES_GCM, AES_GCM_MECH_INFO_TYPE,
98 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
99 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC,
100 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES},
101 	/* AES_GMAC */
102 	{SUN_CKM_AES_GMAC, AES_GMAC_MECH_INFO_TYPE,
103 	    CRYPTO_FG_ENCRYPT | CRYPTO_FG_ENCRYPT_ATOMIC |
104 	    CRYPTO_FG_DECRYPT | CRYPTO_FG_DECRYPT_ATOMIC |
105 	    CRYPTO_FG_MAC | CRYPTO_FG_MAC_ATOMIC |
106 	    CRYPTO_FG_SIGN | CRYPTO_FG_SIGN_ATOMIC |
107 	    CRYPTO_FG_VERIFY | CRYPTO_FG_VERIFY_ATOMIC,
108 	    AES_MIN_KEY_BYTES, AES_MAX_KEY_BYTES, CRYPTO_KEYSIZE_UNIT_IN_BYTES}
109 };
110 
111 /* operations are in-place if the output buffer is NULL */
112 #define	AES_ARG_INPLACE(input, output)				\
113 	if ((output) == NULL)					\
114 		(output) = (input);
115 
116 static void aes_provider_status(crypto_provider_handle_t, uint_t *);
117 
118 static crypto_control_ops_t aes_control_ops = {
119 	aes_provider_status
120 };
121 
122 static int aes_encrypt_init(crypto_ctx_t *, crypto_mechanism_t *,
123     crypto_key_t *, crypto_spi_ctx_template_t, crypto_req_handle_t);
124 static int aes_decrypt_init(crypto_ctx_t *, crypto_mechanism_t *,
125     crypto_key_t *, crypto_spi_ctx_template_t, crypto_req_handle_t);
126 static int aes_common_init(crypto_ctx_t *, crypto_mechanism_t *,
127     crypto_key_t *, crypto_spi_ctx_template_t, crypto_req_handle_t, boolean_t);
128 static int aes_common_init_ctx(aes_ctx_t *, crypto_spi_ctx_template_t *,
129     crypto_mechanism_t *, crypto_key_t *, int, boolean_t);
130 static int aes_encrypt_final(crypto_ctx_t *, crypto_data_t *,
131     crypto_req_handle_t);
132 static int aes_decrypt_final(crypto_ctx_t *, crypto_data_t *,
133     crypto_req_handle_t);
134 
135 static int aes_encrypt(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
136     crypto_req_handle_t);
137 static int aes_encrypt_update(crypto_ctx_t *, crypto_data_t *,
138     crypto_data_t *, crypto_req_handle_t);
139 static int aes_encrypt_atomic(crypto_provider_handle_t, crypto_session_id_t,
140     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
141     crypto_data_t *, crypto_spi_ctx_template_t, crypto_req_handle_t);
142 
143 static int aes_decrypt(crypto_ctx_t *, crypto_data_t *, crypto_data_t *,
144     crypto_req_handle_t);
145 static int aes_decrypt_update(crypto_ctx_t *, crypto_data_t *,
146     crypto_data_t *, crypto_req_handle_t);
147 static int aes_decrypt_atomic(crypto_provider_handle_t, crypto_session_id_t,
148     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
149     crypto_data_t *, crypto_spi_ctx_template_t, crypto_req_handle_t);
150 
151 static crypto_cipher_ops_t aes_cipher_ops = {
152 	aes_encrypt_init,
153 	aes_encrypt,
154 	aes_encrypt_update,
155 	aes_encrypt_final,
156 	aes_encrypt_atomic,
157 	aes_decrypt_init,
158 	aes_decrypt,
159 	aes_decrypt_update,
160 	aes_decrypt_final,
161 	aes_decrypt_atomic
162 };
163 
164 static int aes_mac_atomic(crypto_provider_handle_t, crypto_session_id_t,
165     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
166     crypto_spi_ctx_template_t, crypto_req_handle_t);
167 static int aes_mac_verify_atomic(crypto_provider_handle_t, crypto_session_id_t,
168     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *, crypto_data_t *,
169     crypto_spi_ctx_template_t, crypto_req_handle_t);
170 
171 static crypto_mac_ops_t aes_mac_ops = {
172 	NULL,
173 	NULL,
174 	NULL,
175 	NULL,
176 	aes_mac_atomic,
177 	aes_mac_verify_atomic
178 };
179 
180 static int aes_create_ctx_template(crypto_provider_handle_t,
181     crypto_mechanism_t *, crypto_key_t *, crypto_spi_ctx_template_t *,
182     size_t *, crypto_req_handle_t);
183 static int aes_free_context(crypto_ctx_t *);
184 
185 static crypto_ctx_ops_t aes_ctx_ops = {
186 	aes_create_ctx_template,
187 	aes_free_context
188 };
189 
190 static void aes_POST(int *);
191 
192 static crypto_fips140_ops_t aes_fips140_ops = {
193 	aes_POST
194 };
195 
196 static crypto_ops_t aes_crypto_ops = {
197 	&aes_control_ops,
198 	NULL,
199 	&aes_cipher_ops,
200 	&aes_mac_ops,
201 	NULL,
202 	NULL,
203 	NULL,
204 	NULL,
205 	NULL,
206 	NULL,
207 	NULL,
208 	NULL,
209 	NULL,
210 	&aes_ctx_ops,
211 	NULL,
212 	NULL,
213 	&aes_fips140_ops
214 };
215 
216 static crypto_provider_info_t aes_prov_info = {
217 	CRYPTO_SPI_VERSION_4,
218 	"AES Software Provider",
219 	CRYPTO_SW_PROVIDER,
220 	{&modlinkage},
221 	NULL,
222 	&aes_crypto_ops,
223 	sizeof (aes_mech_info_tab)/sizeof (crypto_mech_info_t),
224 	aes_mech_info_tab
225 };
226 
227 static crypto_kcf_provider_handle_t aes_prov_handle = NULL;
228 static crypto_data_t null_crypto_data = { CRYPTO_DATA_RAW };
229 
230 int
231 _init(void)
232 {
233 	int ret;
234 
235 	if ((ret = mod_install(&modlinkage)) != 0)
236 		return (ret);
237 
238 	/* Register with KCF.  If the registration fails, remove the module. */
239 	if (crypto_register_provider(&aes_prov_info, &aes_prov_handle)) {
240 		(void) mod_remove(&modlinkage);
241 		return (EACCES);
242 	}
243 
244 	return (0);
245 }
246 
247 int
248 _fini(void)
249 {
250 	/* Unregister from KCF if module is registered */
251 	if (aes_prov_handle != NULL) {
252 		if (crypto_unregister_provider(aes_prov_handle))
253 			return (EBUSY);
254 
255 		aes_prov_handle = NULL;
256 	}
257 
258 	return (mod_remove(&modlinkage));
259 }
260 
261 int
262 _info(struct modinfo *modinfop)
263 {
264 	return (mod_info(&modlinkage, modinfop));
265 }
266 
267 
268 static int
269 aes_check_mech_param(crypto_mechanism_t *mechanism, aes_ctx_t **ctx, int kmflag)
270 {
271 	void *p = NULL;
272 	boolean_t param_required = B_TRUE;
273 	size_t param_len;
274 	void *(*alloc_fun)(int);
275 	int rv = CRYPTO_SUCCESS;
276 
277 	switch (mechanism->cm_type) {
278 	case AES_ECB_MECH_INFO_TYPE:
279 		param_required = B_FALSE;
280 		alloc_fun = ecb_alloc_ctx;
281 		break;
282 	case AES_CBC_MECH_INFO_TYPE:
283 		param_len = AES_BLOCK_LEN;
284 		alloc_fun = cbc_alloc_ctx;
285 		break;
286 	case AES_CTR_MECH_INFO_TYPE:
287 		param_len = sizeof (CK_AES_CTR_PARAMS);
288 		alloc_fun = ctr_alloc_ctx;
289 		break;
290 	case AES_CCM_MECH_INFO_TYPE:
291 		param_len = sizeof (CK_AES_CCM_PARAMS);
292 		alloc_fun = ccm_alloc_ctx;
293 		break;
294 	case AES_GCM_MECH_INFO_TYPE:
295 		param_len = sizeof (CK_AES_GCM_PARAMS);
296 		alloc_fun = gcm_alloc_ctx;
297 		break;
298 	case AES_GMAC_MECH_INFO_TYPE:
299 		param_len = sizeof (CK_AES_GMAC_PARAMS);
300 		alloc_fun = gmac_alloc_ctx;
301 		break;
302 	default:
303 		rv = CRYPTO_MECHANISM_INVALID;
304 	}
305 	if (param_required && mechanism->cm_param != NULL &&
306 	    mechanism->cm_param_len != param_len) {
307 		rv = CRYPTO_MECHANISM_PARAM_INVALID;
308 	}
309 	if (ctx != NULL) {
310 		p = (alloc_fun)(kmflag);
311 		*ctx = p;
312 	}
313 	return (rv);
314 }
315 
316 /* EXPORT DELETE START */
317 
318 /*
319  * Initialize key schedules for AES
320  */
321 static int
322 init_keysched(crypto_key_t *key, void *newbie)
323 {
324 	/*
325 	 * Only keys by value are supported by this module.
326 	 */
327 	switch (key->ck_format) {
328 	case CRYPTO_KEY_RAW:
329 		if (key->ck_length < AES_MINBITS ||
330 		    key->ck_length > AES_MAXBITS) {
331 			return (CRYPTO_KEY_SIZE_RANGE);
332 		}
333 
334 		/* key length must be either 128, 192, or 256 */
335 		if ((key->ck_length & 63) != 0)
336 			return (CRYPTO_KEY_SIZE_RANGE);
337 		break;
338 	default:
339 		return (CRYPTO_KEY_TYPE_INCONSISTENT);
340 	}
341 
342 	aes_init_keysched(key->ck_data, key->ck_length, newbie);
343 	return (CRYPTO_SUCCESS);
344 }
345 
346 /* EXPORT DELETE END */
347 
348 /*
349  * KCF software provider control entry points.
350  */
351 /* ARGSUSED */
352 static void
353 aes_provider_status(crypto_provider_handle_t provider, uint_t *status)
354 {
355 	*status = CRYPTO_PROVIDER_READY;
356 }
357 
358 static int
359 aes_encrypt_init(crypto_ctx_t *ctx, crypto_mechanism_t *mechanism,
360     crypto_key_t *key, crypto_spi_ctx_template_t template,
361     crypto_req_handle_t req) {
362 	return (aes_common_init(ctx, mechanism, key, template, req, B_TRUE));
363 }
364 
365 static int
366 aes_decrypt_init(crypto_ctx_t *ctx, crypto_mechanism_t *mechanism,
367     crypto_key_t *key, crypto_spi_ctx_template_t template,
368     crypto_req_handle_t req) {
369 	return (aes_common_init(ctx, mechanism, key, template, req, B_FALSE));
370 }
371 
372 
373 
374 /*
375  * KCF software provider encrypt entry points.
376  */
377 static int
378 aes_common_init(crypto_ctx_t *ctx, crypto_mechanism_t *mechanism,
379     crypto_key_t *key, crypto_spi_ctx_template_t template,
380     crypto_req_handle_t req, boolean_t is_encrypt_init)
381 {
382 
383 /* EXPORT DELETE START */
384 
385 	aes_ctx_t *aes_ctx;
386 	int rv;
387 	int kmflag;
388 
389 	/*
390 	 * Only keys by value are supported by this module.
391 	 */
392 	if (key->ck_format != CRYPTO_KEY_RAW) {
393 		return (CRYPTO_KEY_TYPE_INCONSISTENT);
394 	}
395 
396 	kmflag = crypto_kmflag(req);
397 	if ((rv = aes_check_mech_param(mechanism, &aes_ctx, kmflag))
398 	    != CRYPTO_SUCCESS)
399 		return (rv);
400 
401 	rv = aes_common_init_ctx(aes_ctx, template, mechanism, key, kmflag,
402 	    is_encrypt_init);
403 	if (rv != CRYPTO_SUCCESS) {
404 		crypto_free_mode_ctx(aes_ctx);
405 		return (rv);
406 	}
407 
408 	ctx->cc_provider_private = aes_ctx;
409 
410 /* EXPORT DELETE END */
411 
412 	return (CRYPTO_SUCCESS);
413 }
414 
415 static void
416 aes_copy_block64(uint8_t *in, uint64_t *out)
417 {
418 	if (IS_P2ALIGNED(in, sizeof (uint64_t))) {
419 		/* LINTED: pointer alignment */
420 		out[0] = *(uint64_t *)&in[0];
421 		/* LINTED: pointer alignment */
422 		out[1] = *(uint64_t *)&in[8];
423 	} else {
424 		uint8_t *iv8 = (uint8_t *)&out[0];
425 
426 		AES_COPY_BLOCK(in, iv8);
427 	}
428 }
429 
430 
431 static int
432 aes_encrypt(crypto_ctx_t *ctx, crypto_data_t *plaintext,
433     crypto_data_t *ciphertext, crypto_req_handle_t req)
434 {
435 	int ret = CRYPTO_FAILED;
436 
437 /* EXPORT DELETE START */
438 
439 	aes_ctx_t *aes_ctx;
440 	size_t saved_length, saved_offset, length_needed;
441 
442 	ASSERT(ctx->cc_provider_private != NULL);
443 	aes_ctx = ctx->cc_provider_private;
444 
445 	/*
446 	 * For block ciphers, plaintext must be a multiple of AES block size.
447 	 * This test is only valid for ciphers whose blocksize is a power of 2.
448 	 */
449 	if (((aes_ctx->ac_flags & (CTR_MODE|CCM_MODE|GCM_MODE|GMAC_MODE))
450 	    == 0) && (plaintext->cd_length & (AES_BLOCK_LEN - 1)) != 0)
451 		return (CRYPTO_DATA_LEN_RANGE);
452 
453 	AES_ARG_INPLACE(plaintext, ciphertext);
454 
455 	/*
456 	 * We need to just return the length needed to store the output.
457 	 * We should not destroy the context for the following case.
458 	 */
459 	switch (aes_ctx->ac_flags & (CCM_MODE|GCM_MODE|GMAC_MODE)) {
460 	case CCM_MODE:
461 		length_needed = plaintext->cd_length + aes_ctx->ac_mac_len;
462 		break;
463 	case GCM_MODE:
464 		length_needed = plaintext->cd_length + aes_ctx->ac_tag_len;
465 		break;
466 	case GMAC_MODE:
467 		if (plaintext->cd_length != 0)
468 			return (CRYPTO_ARGUMENTS_BAD);
469 
470 		length_needed = aes_ctx->ac_tag_len;
471 		break;
472 	default:
473 		length_needed = plaintext->cd_length;
474 	}
475 
476 	if (ciphertext->cd_length < length_needed) {
477 		ciphertext->cd_length = length_needed;
478 		return (CRYPTO_BUFFER_TOO_SMALL);
479 	}
480 
481 	saved_length = ciphertext->cd_length;
482 	saved_offset = ciphertext->cd_offset;
483 
484 	/*
485 	 * Do an update on the specified input data.
486 	 */
487 	ret = aes_encrypt_update(ctx, plaintext, ciphertext, req);
488 	if (ret != CRYPTO_SUCCESS) {
489 		return (ret);
490 	}
491 
492 	/*
493 	 * For CCM mode, aes_ccm_encrypt_final() will take care of any
494 	 * left-over unprocessed data, and compute the MAC
495 	 */
496 	if (aes_ctx->ac_flags & CCM_MODE) {
497 		/*
498 		 * ccm_encrypt_final() will compute the MAC and append
499 		 * it to existing ciphertext. So, need to adjust the left over
500 		 * length value accordingly
501 		 */
502 
503 		/* order of following 2 lines MUST not be reversed */
504 		ciphertext->cd_offset = ciphertext->cd_length;
505 		ciphertext->cd_length = saved_length - ciphertext->cd_length;
506 		ret = ccm_encrypt_final((ccm_ctx_t *)aes_ctx, ciphertext,
507 		    AES_BLOCK_LEN, aes_encrypt_block, aes_xor_block);
508 		if (ret != CRYPTO_SUCCESS) {
509 			return (ret);
510 		}
511 
512 		if (plaintext != ciphertext) {
513 			ciphertext->cd_length =
514 			    ciphertext->cd_offset - saved_offset;
515 		}
516 		ciphertext->cd_offset = saved_offset;
517 	} else if (aes_ctx->ac_flags & (GCM_MODE|GMAC_MODE)) {
518 		/*
519 		 * gcm_encrypt_final() will compute the MAC and append
520 		 * it to existing ciphertext. So, need to adjust the left over
521 		 * length value accordingly
522 		 */
523 
524 		/* order of following 2 lines MUST not be reversed */
525 		ciphertext->cd_offset = ciphertext->cd_length;
526 		ciphertext->cd_length = saved_length - ciphertext->cd_length;
527 		ret = gcm_encrypt_final((gcm_ctx_t *)aes_ctx, ciphertext,
528 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
529 		    aes_xor_block);
530 		if (ret != CRYPTO_SUCCESS) {
531 			return (ret);
532 		}
533 
534 		if (plaintext != ciphertext) {
535 			ciphertext->cd_length =
536 			    ciphertext->cd_offset - saved_offset;
537 		}
538 		ciphertext->cd_offset = saved_offset;
539 	}
540 
541 	ASSERT(aes_ctx->ac_remainder_len == 0);
542 	(void) aes_free_context(ctx);
543 
544 /* EXPORT DELETE END */
545 
546 	return (ret);
547 }
548 
549 
550 static int
551 aes_decrypt(crypto_ctx_t *ctx, crypto_data_t *ciphertext,
552     crypto_data_t *plaintext, crypto_req_handle_t req)
553 {
554 	int ret = CRYPTO_FAILED;
555 
556 /* EXPORT DELETE START */
557 
558 	aes_ctx_t *aes_ctx;
559 	off_t saved_offset;
560 	size_t saved_length, length_needed;
561 
562 	ASSERT(ctx->cc_provider_private != NULL);
563 	aes_ctx = ctx->cc_provider_private;
564 
565 	/*
566 	 * For block ciphers, plaintext must be a multiple of AES block size.
567 	 * This test is only valid for ciphers whose blocksize is a power of 2.
568 	 */
569 	if (((aes_ctx->ac_flags & (CTR_MODE|CCM_MODE|GCM_MODE|GMAC_MODE))
570 	    == 0) && (ciphertext->cd_length & (AES_BLOCK_LEN - 1)) != 0) {
571 		return (CRYPTO_ENCRYPTED_DATA_LEN_RANGE);
572 	}
573 
574 	AES_ARG_INPLACE(ciphertext, plaintext);
575 
576 	/*
577 	 * Return length needed to store the output.
578 	 * Do not destroy context when plaintext buffer is too small.
579 	 *
580 	 * CCM:  plaintext is MAC len smaller than cipher text
581 	 * GCM:  plaintext is TAG len smaller than cipher text
582 	 * GMAC: plaintext length must be zero
583 	 */
584 	switch (aes_ctx->ac_flags & (CCM_MODE|GCM_MODE|GMAC_MODE)) {
585 	case CCM_MODE:
586 		length_needed = aes_ctx->ac_processed_data_len;
587 		break;
588 	case GCM_MODE:
589 		length_needed = ciphertext->cd_length - aes_ctx->ac_tag_len;
590 		break;
591 	case GMAC_MODE:
592 		if (plaintext->cd_length != 0)
593 			return (CRYPTO_ARGUMENTS_BAD);
594 
595 		length_needed = 0;
596 		break;
597 	default:
598 		length_needed = ciphertext->cd_length;
599 	}
600 
601 	if (plaintext->cd_length < length_needed) {
602 		plaintext->cd_length = length_needed;
603 		return (CRYPTO_BUFFER_TOO_SMALL);
604 	}
605 
606 	saved_offset = plaintext->cd_offset;
607 	saved_length = plaintext->cd_length;
608 
609 	/*
610 	 * Do an update on the specified input data.
611 	 */
612 	ret = aes_decrypt_update(ctx, ciphertext, plaintext, req);
613 	if (ret != CRYPTO_SUCCESS) {
614 		goto cleanup;
615 	}
616 
617 	if (aes_ctx->ac_flags & CCM_MODE) {
618 		ASSERT(aes_ctx->ac_processed_data_len == aes_ctx->ac_data_len);
619 		ASSERT(aes_ctx->ac_processed_mac_len == aes_ctx->ac_mac_len);
620 
621 		/* order of following 2 lines MUST not be reversed */
622 		plaintext->cd_offset = plaintext->cd_length;
623 		plaintext->cd_length = saved_length - plaintext->cd_length;
624 
625 		ret = ccm_decrypt_final((ccm_ctx_t *)aes_ctx, plaintext,
626 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
627 		    aes_xor_block);
628 		if (ret == CRYPTO_SUCCESS) {
629 			if (plaintext != ciphertext) {
630 				plaintext->cd_length =
631 				    plaintext->cd_offset - saved_offset;
632 			}
633 		} else {
634 			plaintext->cd_length = saved_length;
635 		}
636 
637 		plaintext->cd_offset = saved_offset;
638 	} else if (aes_ctx->ac_flags & (GCM_MODE|GMAC_MODE)) {
639 		/* order of following 2 lines MUST not be reversed */
640 		plaintext->cd_offset = plaintext->cd_length;
641 		plaintext->cd_length = saved_length - plaintext->cd_length;
642 
643 		ret = gcm_decrypt_final((gcm_ctx_t *)aes_ctx, plaintext,
644 		    AES_BLOCK_LEN, aes_encrypt_block, aes_xor_block);
645 		if (ret == CRYPTO_SUCCESS) {
646 			if (plaintext != ciphertext) {
647 				plaintext->cd_length =
648 				    plaintext->cd_offset - saved_offset;
649 			}
650 		} else {
651 			plaintext->cd_length = saved_length;
652 		}
653 
654 		plaintext->cd_offset = saved_offset;
655 	}
656 
657 	ASSERT(aes_ctx->ac_remainder_len == 0);
658 
659 cleanup:
660 	(void) aes_free_context(ctx);
661 
662 /* EXPORT DELETE END */
663 
664 	return (ret);
665 }
666 
667 
668 /* ARGSUSED */
669 static int
670 aes_encrypt_update(crypto_ctx_t *ctx, crypto_data_t *plaintext,
671     crypto_data_t *ciphertext, crypto_req_handle_t req)
672 {
673 	off_t saved_offset;
674 	size_t saved_length, out_len;
675 	int ret = CRYPTO_SUCCESS;
676 	aes_ctx_t *aes_ctx;
677 
678 	ASSERT(ctx->cc_provider_private != NULL);
679 	aes_ctx = ctx->cc_provider_private;
680 
681 	AES_ARG_INPLACE(plaintext, ciphertext);
682 
683 	/* compute number of bytes that will hold the ciphertext */
684 	out_len = aes_ctx->ac_remainder_len;
685 	out_len += plaintext->cd_length;
686 	out_len &= ~(AES_BLOCK_LEN - 1);
687 
688 	/* return length needed to store the output */
689 	if (ciphertext->cd_length < out_len) {
690 		ciphertext->cd_length = out_len;
691 		return (CRYPTO_BUFFER_TOO_SMALL);
692 	}
693 
694 	saved_offset = ciphertext->cd_offset;
695 	saved_length = ciphertext->cd_length;
696 
697 	/*
698 	 * Do the AES update on the specified input data.
699 	 */
700 	switch (plaintext->cd_format) {
701 	case CRYPTO_DATA_RAW:
702 		ret = crypto_update_iov(ctx->cc_provider_private,
703 		    plaintext, ciphertext, aes_encrypt_contiguous_blocks,
704 		    aes_copy_block64);
705 		break;
706 	case CRYPTO_DATA_UIO:
707 		ret = crypto_update_uio(ctx->cc_provider_private,
708 		    plaintext, ciphertext, aes_encrypt_contiguous_blocks,
709 		    aes_copy_block64);
710 		break;
711 	case CRYPTO_DATA_MBLK:
712 		ret = crypto_update_mp(ctx->cc_provider_private,
713 		    plaintext, ciphertext, aes_encrypt_contiguous_blocks,
714 		    aes_copy_block64);
715 		break;
716 	default:
717 		ret = CRYPTO_ARGUMENTS_BAD;
718 	}
719 
720 	/*
721 	 * Since AES counter mode is a stream cipher, we call
722 	 * ctr_mode_final() to pick up any remaining bytes.
723 	 * It is an internal function that does not destroy
724 	 * the context like *normal* final routines.
725 	 */
726 	if ((aes_ctx->ac_flags & CTR_MODE) && (aes_ctx->ac_remainder_len > 0)) {
727 		ret = ctr_mode_final((ctr_ctx_t *)aes_ctx,
728 		    ciphertext, aes_encrypt_block);
729 	}
730 
731 	if (ret == CRYPTO_SUCCESS) {
732 		if (plaintext != ciphertext)
733 			ciphertext->cd_length =
734 			    ciphertext->cd_offset - saved_offset;
735 	} else {
736 		ciphertext->cd_length = saved_length;
737 	}
738 	ciphertext->cd_offset = saved_offset;
739 
740 	return (ret);
741 }
742 
743 
744 static int
745 aes_decrypt_update(crypto_ctx_t *ctx, crypto_data_t *ciphertext,
746     crypto_data_t *plaintext, crypto_req_handle_t req)
747 {
748 	off_t saved_offset;
749 	size_t saved_length, out_len;
750 	int ret = CRYPTO_SUCCESS;
751 	aes_ctx_t *aes_ctx;
752 
753 	ASSERT(ctx->cc_provider_private != NULL);
754 	aes_ctx = ctx->cc_provider_private;
755 
756 	AES_ARG_INPLACE(ciphertext, plaintext);
757 
758 	/*
759 	 * Compute number of bytes that will hold the plaintext.
760 	 * This is not necessary for CCM, GCM, and GMAC since these
761 	 * mechanisms never return plaintext for update operations.
762 	 */
763 	if ((aes_ctx->ac_flags & (CCM_MODE|GCM_MODE|GMAC_MODE)) == 0) {
764 		out_len = aes_ctx->ac_remainder_len;
765 		out_len += ciphertext->cd_length;
766 		out_len &= ~(AES_BLOCK_LEN - 1);
767 
768 		/* return length needed to store the output */
769 		if (plaintext->cd_length < out_len) {
770 			plaintext->cd_length = out_len;
771 			return (CRYPTO_BUFFER_TOO_SMALL);
772 		}
773 	}
774 
775 	saved_offset = plaintext->cd_offset;
776 	saved_length = plaintext->cd_length;
777 
778 	if (aes_ctx->ac_flags & (GCM_MODE|GMAC_MODE))
779 		gcm_set_kmflag((gcm_ctx_t *)aes_ctx, crypto_kmflag(req));
780 
781 	/*
782 	 * Do the AES update on the specified input data.
783 	 */
784 	switch (ciphertext->cd_format) {
785 	case CRYPTO_DATA_RAW:
786 		ret = crypto_update_iov(ctx->cc_provider_private,
787 		    ciphertext, plaintext, aes_decrypt_contiguous_blocks,
788 		    aes_copy_block64);
789 		break;
790 	case CRYPTO_DATA_UIO:
791 		ret = crypto_update_uio(ctx->cc_provider_private,
792 		    ciphertext, plaintext, aes_decrypt_contiguous_blocks,
793 		    aes_copy_block64);
794 		break;
795 	case CRYPTO_DATA_MBLK:
796 		ret = crypto_update_mp(ctx->cc_provider_private,
797 		    ciphertext, plaintext, aes_decrypt_contiguous_blocks,
798 		    aes_copy_block64);
799 		break;
800 	default:
801 		ret = CRYPTO_ARGUMENTS_BAD;
802 	}
803 
804 	/*
805 	 * Since AES counter mode is a stream cipher, we call
806 	 * ctr_mode_final() to pick up any remaining bytes.
807 	 * It is an internal function that does not destroy
808 	 * the context like *normal* final routines.
809 	 */
810 	if ((aes_ctx->ac_flags & CTR_MODE) && (aes_ctx->ac_remainder_len > 0)) {
811 		ret = ctr_mode_final((ctr_ctx_t *)aes_ctx, plaintext,
812 		    aes_encrypt_block);
813 		if (ret == CRYPTO_DATA_LEN_RANGE)
814 			ret = CRYPTO_ENCRYPTED_DATA_LEN_RANGE;
815 	}
816 
817 	if (ret == CRYPTO_SUCCESS) {
818 		if (ciphertext != plaintext)
819 			plaintext->cd_length =
820 			    plaintext->cd_offset - saved_offset;
821 	} else {
822 		plaintext->cd_length = saved_length;
823 	}
824 	plaintext->cd_offset = saved_offset;
825 
826 
827 	return (ret);
828 }
829 
830 /* ARGSUSED */
831 static int
832 aes_encrypt_final(crypto_ctx_t *ctx, crypto_data_t *data,
833     crypto_req_handle_t req)
834 {
835 
836 /* EXPORT DELETE START */
837 
838 	aes_ctx_t *aes_ctx;
839 	int ret;
840 
841 	ASSERT(ctx->cc_provider_private != NULL);
842 	aes_ctx = ctx->cc_provider_private;
843 
844 	if (data->cd_format != CRYPTO_DATA_RAW &&
845 	    data->cd_format != CRYPTO_DATA_UIO &&
846 	    data->cd_format != CRYPTO_DATA_MBLK) {
847 		return (CRYPTO_ARGUMENTS_BAD);
848 	}
849 
850 	if (aes_ctx->ac_flags & CTR_MODE) {
851 		if (aes_ctx->ac_remainder_len > 0) {
852 			ret = ctr_mode_final((ctr_ctx_t *)aes_ctx, data,
853 			    aes_encrypt_block);
854 			if (ret != CRYPTO_SUCCESS)
855 				return (ret);
856 		}
857 	} else if (aes_ctx->ac_flags & CCM_MODE) {
858 		ret = ccm_encrypt_final((ccm_ctx_t *)aes_ctx, data,
859 		    AES_BLOCK_LEN, aes_encrypt_block, aes_xor_block);
860 		if (ret != CRYPTO_SUCCESS) {
861 			return (ret);
862 		}
863 	} else if (aes_ctx->ac_flags & (GCM_MODE|GMAC_MODE)) {
864 		size_t saved_offset = data->cd_offset;
865 
866 		ret = gcm_encrypt_final((gcm_ctx_t *)aes_ctx, data,
867 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
868 		    aes_xor_block);
869 		if (ret != CRYPTO_SUCCESS) {
870 			return (ret);
871 		}
872 		data->cd_length = data->cd_offset - saved_offset;
873 		data->cd_offset = saved_offset;
874 	} else {
875 		/*
876 		 * There must be no unprocessed plaintext.
877 		 * This happens if the length of the last data is
878 		 * not a multiple of the AES block length.
879 		 */
880 		if (aes_ctx->ac_remainder_len > 0) {
881 			return (CRYPTO_DATA_LEN_RANGE);
882 		}
883 		data->cd_length = 0;
884 	}
885 
886 	(void) aes_free_context(ctx);
887 
888 /* EXPORT DELETE END */
889 
890 	return (CRYPTO_SUCCESS);
891 }
892 
893 /* ARGSUSED */
894 static int
895 aes_decrypt_final(crypto_ctx_t *ctx, crypto_data_t *data,
896     crypto_req_handle_t req)
897 {
898 
899 /* EXPORT DELETE START */
900 
901 	aes_ctx_t *aes_ctx;
902 	int ret;
903 	off_t saved_offset;
904 	size_t saved_length;
905 
906 	ASSERT(ctx->cc_provider_private != NULL);
907 	aes_ctx = ctx->cc_provider_private;
908 
909 	if (data->cd_format != CRYPTO_DATA_RAW &&
910 	    data->cd_format != CRYPTO_DATA_UIO &&
911 	    data->cd_format != CRYPTO_DATA_MBLK) {
912 		return (CRYPTO_ARGUMENTS_BAD);
913 	}
914 
915 	/*
916 	 * There must be no unprocessed ciphertext.
917 	 * This happens if the length of the last ciphertext is
918 	 * not a multiple of the AES block length.
919 	 */
920 	if (aes_ctx->ac_remainder_len > 0) {
921 		if ((aes_ctx->ac_flags & CTR_MODE) == 0)
922 			return (CRYPTO_ENCRYPTED_DATA_LEN_RANGE);
923 		else {
924 			ret = ctr_mode_final((ctr_ctx_t *)aes_ctx, data,
925 			    aes_encrypt_block);
926 			if (ret == CRYPTO_DATA_LEN_RANGE)
927 				ret = CRYPTO_ENCRYPTED_DATA_LEN_RANGE;
928 			if (ret != CRYPTO_SUCCESS)
929 				return (ret);
930 		}
931 	}
932 
933 	if (aes_ctx->ac_flags & CCM_MODE) {
934 		/*
935 		 * This is where all the plaintext is returned, make sure
936 		 * the plaintext buffer is big enough
937 		 */
938 		size_t pt_len = aes_ctx->ac_data_len;
939 		if (data->cd_length < pt_len) {
940 			data->cd_length = pt_len;
941 			return (CRYPTO_BUFFER_TOO_SMALL);
942 		}
943 
944 		ASSERT(aes_ctx->ac_processed_data_len == pt_len);
945 		ASSERT(aes_ctx->ac_processed_mac_len == aes_ctx->ac_mac_len);
946 		saved_offset = data->cd_offset;
947 		saved_length = data->cd_length;
948 		ret = ccm_decrypt_final((ccm_ctx_t *)aes_ctx, data,
949 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
950 		    aes_xor_block);
951 		if (ret == CRYPTO_SUCCESS) {
952 			data->cd_length = data->cd_offset - saved_offset;
953 		} else {
954 			data->cd_length = saved_length;
955 		}
956 
957 		data->cd_offset = saved_offset;
958 		if (ret != CRYPTO_SUCCESS) {
959 			return (ret);
960 		}
961 	} else if (aes_ctx->ac_flags & (GCM_MODE|GMAC_MODE)) {
962 		/*
963 		 * This is where all the plaintext is returned, make sure
964 		 * the plaintext buffer is big enough
965 		 */
966 		gcm_ctx_t *ctx = (gcm_ctx_t *)aes_ctx;
967 		size_t pt_len = ctx->gcm_processed_data_len - ctx->gcm_tag_len;
968 
969 		if (data->cd_length < pt_len) {
970 			data->cd_length = pt_len;
971 			return (CRYPTO_BUFFER_TOO_SMALL);
972 		}
973 
974 		saved_offset = data->cd_offset;
975 		saved_length = data->cd_length;
976 		ret = gcm_decrypt_final((gcm_ctx_t *)aes_ctx, data,
977 		    AES_BLOCK_LEN, aes_encrypt_block, aes_xor_block);
978 		if (ret == CRYPTO_SUCCESS) {
979 			data->cd_length = data->cd_offset - saved_offset;
980 		} else {
981 			data->cd_length = saved_length;
982 		}
983 
984 		data->cd_offset = saved_offset;
985 		if (ret != CRYPTO_SUCCESS) {
986 			return (ret);
987 		}
988 	}
989 
990 
991 	if ((aes_ctx->ac_flags & (CTR_MODE|CCM_MODE|GCM_MODE|GMAC_MODE)) == 0) {
992 		data->cd_length = 0;
993 	}
994 
995 	(void) aes_free_context(ctx);
996 
997 /* EXPORT DELETE END */
998 
999 	return (CRYPTO_SUCCESS);
1000 }
1001 
1002 /* ARGSUSED */
1003 static int
1004 aes_encrypt_atomic(crypto_provider_handle_t provider,
1005     crypto_session_id_t session_id, crypto_mechanism_t *mechanism,
1006     crypto_key_t *key, crypto_data_t *plaintext, crypto_data_t *ciphertext,
1007     crypto_spi_ctx_template_t template, crypto_req_handle_t req)
1008 {
1009 	aes_ctx_t aes_ctx;	/* on the stack */
1010 	off_t saved_offset;
1011 	size_t saved_length;
1012 	size_t length_needed;
1013 	int ret;
1014 
1015 	AES_ARG_INPLACE(plaintext, ciphertext);
1016 
1017 	/*
1018 	 * CTR, CCM, GCM, and GMAC modes do not require that plaintext
1019 	 * be a multiple of AES block size.
1020 	 */
1021 	switch (mechanism->cm_type) {
1022 	case AES_CTR_MECH_INFO_TYPE:
1023 	case AES_CCM_MECH_INFO_TYPE:
1024 	case AES_GCM_MECH_INFO_TYPE:
1025 	case AES_GMAC_MECH_INFO_TYPE:
1026 		break;
1027 	default:
1028 		if ((plaintext->cd_length & (AES_BLOCK_LEN - 1)) != 0)
1029 			return (CRYPTO_DATA_LEN_RANGE);
1030 	}
1031 
1032 	if ((ret = aes_check_mech_param(mechanism, NULL, 0)) != CRYPTO_SUCCESS)
1033 		return (ret);
1034 
1035 	bzero(&aes_ctx, sizeof (aes_ctx_t));
1036 
1037 	ret = aes_common_init_ctx(&aes_ctx, template, mechanism, key,
1038 	    crypto_kmflag(req), B_TRUE);
1039 	if (ret != CRYPTO_SUCCESS)
1040 		return (ret);
1041 
1042 	switch (mechanism->cm_type) {
1043 	case AES_CCM_MECH_INFO_TYPE:
1044 		length_needed = plaintext->cd_length + aes_ctx.ac_mac_len;
1045 		break;
1046 	case AES_GMAC_MECH_INFO_TYPE:
1047 		if (plaintext->cd_length != 0)
1048 			return (CRYPTO_ARGUMENTS_BAD);
1049 		/* FALLTHRU */
1050 	case AES_GCM_MECH_INFO_TYPE:
1051 		length_needed = plaintext->cd_length + aes_ctx.ac_tag_len;
1052 		break;
1053 	default:
1054 		length_needed = plaintext->cd_length;
1055 	}
1056 
1057 	/* return size of buffer needed to store output */
1058 	if (ciphertext->cd_length < length_needed) {
1059 		ciphertext->cd_length = length_needed;
1060 		ret = CRYPTO_BUFFER_TOO_SMALL;
1061 		goto out;
1062 	}
1063 
1064 	saved_offset = ciphertext->cd_offset;
1065 	saved_length = ciphertext->cd_length;
1066 
1067 	/*
1068 	 * Do an update on the specified input data.
1069 	 */
1070 	switch (plaintext->cd_format) {
1071 	case CRYPTO_DATA_RAW:
1072 		ret = crypto_update_iov(&aes_ctx, plaintext, ciphertext,
1073 		    aes_encrypt_contiguous_blocks, aes_copy_block64);
1074 		break;
1075 	case CRYPTO_DATA_UIO:
1076 		ret = crypto_update_uio(&aes_ctx, plaintext, ciphertext,
1077 		    aes_encrypt_contiguous_blocks, aes_copy_block64);
1078 		break;
1079 	case CRYPTO_DATA_MBLK:
1080 		ret = crypto_update_mp(&aes_ctx, plaintext, ciphertext,
1081 		    aes_encrypt_contiguous_blocks, aes_copy_block64);
1082 		break;
1083 	default:
1084 		ret = CRYPTO_ARGUMENTS_BAD;
1085 	}
1086 
1087 	if (ret == CRYPTO_SUCCESS) {
1088 		if (mechanism->cm_type == AES_CCM_MECH_INFO_TYPE) {
1089 			ret = ccm_encrypt_final((ccm_ctx_t *)&aes_ctx,
1090 			    ciphertext, AES_BLOCK_LEN, aes_encrypt_block,
1091 			    aes_xor_block);
1092 			if (ret != CRYPTO_SUCCESS)
1093 				goto out;
1094 			ASSERT(aes_ctx.ac_remainder_len == 0);
1095 		} else if (mechanism->cm_type == AES_GCM_MECH_INFO_TYPE ||
1096 		    mechanism->cm_type == AES_GMAC_MECH_INFO_TYPE) {
1097 			ret = gcm_encrypt_final((gcm_ctx_t *)&aes_ctx,
1098 			    ciphertext, AES_BLOCK_LEN, aes_encrypt_block,
1099 			    aes_copy_block, aes_xor_block);
1100 			if (ret != CRYPTO_SUCCESS)
1101 				goto out;
1102 			ASSERT(aes_ctx.ac_remainder_len == 0);
1103 		} else if (mechanism->cm_type == AES_CTR_MECH_INFO_TYPE) {
1104 			if (aes_ctx.ac_remainder_len > 0) {
1105 				ret = ctr_mode_final((ctr_ctx_t *)&aes_ctx,
1106 				    ciphertext, aes_encrypt_block);
1107 				if (ret != CRYPTO_SUCCESS)
1108 					goto out;
1109 			}
1110 		} else {
1111 			ASSERT(aes_ctx.ac_remainder_len == 0);
1112 		}
1113 
1114 		if (plaintext != ciphertext) {
1115 			ciphertext->cd_length =
1116 			    ciphertext->cd_offset - saved_offset;
1117 		}
1118 	} else {
1119 		ciphertext->cd_length = saved_length;
1120 	}
1121 	ciphertext->cd_offset = saved_offset;
1122 
1123 out:
1124 	if (aes_ctx.ac_flags & PROVIDER_OWNS_KEY_SCHEDULE) {
1125 		bzero(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
1126 		kmem_free(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
1127 	}
1128 
1129 	return (ret);
1130 }
1131 
1132 /* ARGSUSED */
1133 static int
1134 aes_decrypt_atomic(crypto_provider_handle_t provider,
1135     crypto_session_id_t session_id, crypto_mechanism_t *mechanism,
1136     crypto_key_t *key, crypto_data_t *ciphertext, crypto_data_t *plaintext,
1137     crypto_spi_ctx_template_t template, crypto_req_handle_t req)
1138 {
1139 	aes_ctx_t aes_ctx;	/* on the stack */
1140 	off_t saved_offset;
1141 	size_t saved_length;
1142 	size_t length_needed;
1143 	int ret;
1144 
1145 	AES_ARG_INPLACE(ciphertext, plaintext);
1146 
1147 	/*
1148 	 * CCM, GCM, CTR, and GMAC modes do not require that ciphertext
1149 	 * be a multiple of AES block size.
1150 	 */
1151 	switch (mechanism->cm_type) {
1152 	case AES_CTR_MECH_INFO_TYPE:
1153 	case AES_CCM_MECH_INFO_TYPE:
1154 	case AES_GCM_MECH_INFO_TYPE:
1155 	case AES_GMAC_MECH_INFO_TYPE:
1156 		break;
1157 	default:
1158 		if ((ciphertext->cd_length & (AES_BLOCK_LEN - 1)) != 0)
1159 			return (CRYPTO_ENCRYPTED_DATA_LEN_RANGE);
1160 	}
1161 
1162 	if ((ret = aes_check_mech_param(mechanism, NULL, 0)) != CRYPTO_SUCCESS)
1163 		return (ret);
1164 
1165 	bzero(&aes_ctx, sizeof (aes_ctx_t));
1166 
1167 	ret = aes_common_init_ctx(&aes_ctx, template, mechanism, key,
1168 	    crypto_kmflag(req), B_FALSE);
1169 	if (ret != CRYPTO_SUCCESS)
1170 		return (ret);
1171 
1172 	switch (mechanism->cm_type) {
1173 	case AES_CCM_MECH_INFO_TYPE:
1174 		length_needed = aes_ctx.ac_data_len;
1175 		break;
1176 	case AES_GCM_MECH_INFO_TYPE:
1177 		length_needed = ciphertext->cd_length - aes_ctx.ac_tag_len;
1178 		break;
1179 	case AES_GMAC_MECH_INFO_TYPE:
1180 		if (plaintext->cd_length != 0)
1181 			return (CRYPTO_ARGUMENTS_BAD);
1182 		length_needed = 0;
1183 		break;
1184 	default:
1185 		length_needed = ciphertext->cd_length;
1186 	}
1187 
1188 	/* return size of buffer needed to store output */
1189 	if (plaintext->cd_length < length_needed) {
1190 		plaintext->cd_length = length_needed;
1191 		ret = CRYPTO_BUFFER_TOO_SMALL;
1192 		goto out;
1193 	}
1194 
1195 	saved_offset = plaintext->cd_offset;
1196 	saved_length = plaintext->cd_length;
1197 
1198 	if (mechanism->cm_type == AES_GCM_MECH_INFO_TYPE ||
1199 	    mechanism->cm_type == AES_GMAC_MECH_INFO_TYPE)
1200 		gcm_set_kmflag((gcm_ctx_t *)&aes_ctx, crypto_kmflag(req));
1201 
1202 	/*
1203 	 * Do an update on the specified input data.
1204 	 */
1205 	switch (ciphertext->cd_format) {
1206 	case CRYPTO_DATA_RAW:
1207 		ret = crypto_update_iov(&aes_ctx, ciphertext, plaintext,
1208 		    aes_decrypt_contiguous_blocks, aes_copy_block64);
1209 		break;
1210 	case CRYPTO_DATA_UIO:
1211 		ret = crypto_update_uio(&aes_ctx, ciphertext, plaintext,
1212 		    aes_decrypt_contiguous_blocks, aes_copy_block64);
1213 		break;
1214 	case CRYPTO_DATA_MBLK:
1215 		ret = crypto_update_mp(&aes_ctx, ciphertext, plaintext,
1216 		    aes_decrypt_contiguous_blocks, aes_copy_block64);
1217 		break;
1218 	default:
1219 		ret = CRYPTO_ARGUMENTS_BAD;
1220 	}
1221 
1222 	if (ret == CRYPTO_SUCCESS) {
1223 		if (mechanism->cm_type == AES_CCM_MECH_INFO_TYPE) {
1224 			ASSERT(aes_ctx.ac_processed_data_len
1225 			    == aes_ctx.ac_data_len);
1226 			ASSERT(aes_ctx.ac_processed_mac_len
1227 			    == aes_ctx.ac_mac_len);
1228 			ret = ccm_decrypt_final((ccm_ctx_t *)&aes_ctx,
1229 			    plaintext, AES_BLOCK_LEN, aes_encrypt_block,
1230 			    aes_copy_block, aes_xor_block);
1231 			ASSERT(aes_ctx.ac_remainder_len == 0);
1232 			if ((ret == CRYPTO_SUCCESS) &&
1233 			    (ciphertext != plaintext)) {
1234 				plaintext->cd_length =
1235 				    plaintext->cd_offset - saved_offset;
1236 			} else {
1237 				plaintext->cd_length = saved_length;
1238 			}
1239 		} else if (mechanism->cm_type == AES_GCM_MECH_INFO_TYPE ||
1240 		    mechanism->cm_type == AES_GMAC_MECH_INFO_TYPE) {
1241 			ret = gcm_decrypt_final((gcm_ctx_t *)&aes_ctx,
1242 			    plaintext, AES_BLOCK_LEN, aes_encrypt_block,
1243 			    aes_xor_block);
1244 			ASSERT(aes_ctx.ac_remainder_len == 0);
1245 			if ((ret == CRYPTO_SUCCESS) &&
1246 			    (ciphertext != plaintext)) {
1247 				plaintext->cd_length =
1248 				    plaintext->cd_offset - saved_offset;
1249 			} else {
1250 				plaintext->cd_length = saved_length;
1251 			}
1252 		} else if (mechanism->cm_type != AES_CTR_MECH_INFO_TYPE) {
1253 			ASSERT(aes_ctx.ac_remainder_len == 0);
1254 			if (ciphertext != plaintext)
1255 				plaintext->cd_length =
1256 				    plaintext->cd_offset - saved_offset;
1257 		} else {
1258 			if (aes_ctx.ac_remainder_len > 0) {
1259 				ret = ctr_mode_final((ctr_ctx_t *)&aes_ctx,
1260 				    plaintext, aes_encrypt_block);
1261 				if (ret == CRYPTO_DATA_LEN_RANGE)
1262 					ret = CRYPTO_ENCRYPTED_DATA_LEN_RANGE;
1263 				if (ret != CRYPTO_SUCCESS)
1264 					goto out;
1265 			}
1266 			if (ciphertext != plaintext)
1267 				plaintext->cd_length =
1268 				    plaintext->cd_offset - saved_offset;
1269 		}
1270 	} else {
1271 		plaintext->cd_length = saved_length;
1272 	}
1273 	plaintext->cd_offset = saved_offset;
1274 
1275 out:
1276 	if (aes_ctx.ac_flags & PROVIDER_OWNS_KEY_SCHEDULE) {
1277 		bzero(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
1278 		kmem_free(aes_ctx.ac_keysched, aes_ctx.ac_keysched_len);
1279 	}
1280 
1281 	if (aes_ctx.ac_flags & CCM_MODE) {
1282 		if (aes_ctx.ac_pt_buf != NULL) {
1283 			kmem_free(aes_ctx.ac_pt_buf, aes_ctx.ac_data_len);
1284 		}
1285 	} else if (aes_ctx.ac_flags & (GCM_MODE|GMAC_MODE)) {
1286 		if (((gcm_ctx_t *)&aes_ctx)->gcm_pt_buf != NULL) {
1287 			kmem_free(((gcm_ctx_t *)&aes_ctx)->gcm_pt_buf,
1288 			    ((gcm_ctx_t *)&aes_ctx)->gcm_pt_buf_len);
1289 		}
1290 	}
1291 
1292 	return (ret);
1293 }
1294 
1295 /*
1296  * KCF software provider context template entry points.
1297  */
1298 /* ARGSUSED */
1299 static int
1300 aes_create_ctx_template(crypto_provider_handle_t provider,
1301     crypto_mechanism_t *mechanism, crypto_key_t *key,
1302     crypto_spi_ctx_template_t *tmpl, size_t *tmpl_size, crypto_req_handle_t req)
1303 {
1304 
1305 /* EXPORT DELETE START */
1306 
1307 	void *keysched;
1308 	size_t size;
1309 	int rv;
1310 
1311 	if (mechanism->cm_type != AES_ECB_MECH_INFO_TYPE &&
1312 	    mechanism->cm_type != AES_CBC_MECH_INFO_TYPE &&
1313 	    mechanism->cm_type != AES_CTR_MECH_INFO_TYPE &&
1314 	    mechanism->cm_type != AES_CCM_MECH_INFO_TYPE &&
1315 	    mechanism->cm_type != AES_GCM_MECH_INFO_TYPE &&
1316 	    mechanism->cm_type != AES_GMAC_MECH_INFO_TYPE)
1317 		return (CRYPTO_MECHANISM_INVALID);
1318 
1319 	if ((keysched = aes_alloc_keysched(&size,
1320 	    crypto_kmflag(req))) == NULL) {
1321 		return (CRYPTO_HOST_MEMORY);
1322 	}
1323 
1324 	/*
1325 	 * Initialize key schedule.  Key length information is stored
1326 	 * in the key.
1327 	 */
1328 	if ((rv = init_keysched(key, keysched)) != CRYPTO_SUCCESS) {
1329 		bzero(keysched, size);
1330 		kmem_free(keysched, size);
1331 		return (rv);
1332 	}
1333 
1334 	*tmpl = keysched;
1335 	*tmpl_size = size;
1336 
1337 /* EXPORT DELETE END */
1338 
1339 	return (CRYPTO_SUCCESS);
1340 }
1341 
1342 
1343 static int
1344 aes_free_context(crypto_ctx_t *ctx)
1345 {
1346 
1347 /* EXPORT DELETE START */
1348 
1349 	aes_ctx_t *aes_ctx = ctx->cc_provider_private;
1350 
1351 	if (aes_ctx != NULL) {
1352 		if (aes_ctx->ac_flags & PROVIDER_OWNS_KEY_SCHEDULE) {
1353 			ASSERT(aes_ctx->ac_keysched_len != 0);
1354 			bzero(aes_ctx->ac_keysched, aes_ctx->ac_keysched_len);
1355 			kmem_free(aes_ctx->ac_keysched,
1356 			    aes_ctx->ac_keysched_len);
1357 		}
1358 		crypto_free_mode_ctx(aes_ctx);
1359 		ctx->cc_provider_private = NULL;
1360 	}
1361 
1362 /* EXPORT DELETE END */
1363 
1364 	return (CRYPTO_SUCCESS);
1365 }
1366 
1367 
1368 static int
1369 aes_common_init_ctx(aes_ctx_t *aes_ctx, crypto_spi_ctx_template_t *template,
1370     crypto_mechanism_t *mechanism, crypto_key_t *key, int kmflag,
1371     boolean_t is_encrypt_init)
1372 {
1373 	int rv = CRYPTO_SUCCESS;
1374 
1375 /* EXPORT DELETE START */
1376 
1377 	void *keysched;
1378 	size_t size;
1379 
1380 	if (template == NULL) {
1381 		if ((keysched = aes_alloc_keysched(&size, kmflag)) == NULL)
1382 			return (CRYPTO_HOST_MEMORY);
1383 		/*
1384 		 * Initialize key schedule.
1385 		 * Key length is stored in the key.
1386 		 */
1387 		if ((rv = init_keysched(key, keysched)) != CRYPTO_SUCCESS) {
1388 			kmem_free(keysched, size);
1389 			return (rv);
1390 		}
1391 
1392 		aes_ctx->ac_flags |= PROVIDER_OWNS_KEY_SCHEDULE;
1393 		aes_ctx->ac_keysched_len = size;
1394 	} else {
1395 		keysched = template;
1396 	}
1397 	aes_ctx->ac_keysched = keysched;
1398 
1399 	switch (mechanism->cm_type) {
1400 	case AES_CBC_MECH_INFO_TYPE:
1401 		rv = cbc_init_ctx((cbc_ctx_t *)aes_ctx, mechanism->cm_param,
1402 		    mechanism->cm_param_len, AES_BLOCK_LEN, aes_copy_block64);
1403 		break;
1404 	case AES_CTR_MECH_INFO_TYPE: {
1405 		CK_AES_CTR_PARAMS *pp;
1406 
1407 		if (mechanism->cm_param == NULL ||
1408 		    mechanism->cm_param_len != sizeof (CK_AES_CTR_PARAMS)) {
1409 			return (CRYPTO_MECHANISM_PARAM_INVALID);
1410 		}
1411 		pp = (CK_AES_CTR_PARAMS *)(void *)mechanism->cm_param;
1412 		rv = ctr_init_ctx((ctr_ctx_t *)aes_ctx, pp->ulCounterBits,
1413 		    pp->cb, aes_copy_block);
1414 		break;
1415 	}
1416 	case AES_CCM_MECH_INFO_TYPE:
1417 		if (mechanism->cm_param == NULL ||
1418 		    mechanism->cm_param_len != sizeof (CK_AES_CCM_PARAMS)) {
1419 			return (CRYPTO_MECHANISM_PARAM_INVALID);
1420 		}
1421 		rv = ccm_init_ctx((ccm_ctx_t *)aes_ctx, mechanism->cm_param,
1422 		    kmflag, is_encrypt_init, AES_BLOCK_LEN, aes_encrypt_block,
1423 		    aes_xor_block);
1424 		break;
1425 	case AES_GCM_MECH_INFO_TYPE:
1426 		if (mechanism->cm_param == NULL ||
1427 		    mechanism->cm_param_len != sizeof (CK_AES_GCM_PARAMS)) {
1428 			return (CRYPTO_MECHANISM_PARAM_INVALID);
1429 		}
1430 		rv = gcm_init_ctx((gcm_ctx_t *)aes_ctx, mechanism->cm_param,
1431 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
1432 		    aes_xor_block);
1433 		break;
1434 	case AES_GMAC_MECH_INFO_TYPE:
1435 		if (mechanism->cm_param == NULL ||
1436 		    mechanism->cm_param_len != sizeof (CK_AES_GMAC_PARAMS)) {
1437 			return (CRYPTO_MECHANISM_PARAM_INVALID);
1438 		}
1439 		rv = gmac_init_ctx((gcm_ctx_t *)aes_ctx, mechanism->cm_param,
1440 		    AES_BLOCK_LEN, aes_encrypt_block, aes_copy_block,
1441 		    aes_xor_block);
1442 		break;
1443 	case AES_ECB_MECH_INFO_TYPE:
1444 		aes_ctx->ac_flags |= ECB_MODE;
1445 	}
1446 
1447 	if (rv != CRYPTO_SUCCESS) {
1448 		if (aes_ctx->ac_flags & PROVIDER_OWNS_KEY_SCHEDULE) {
1449 			bzero(keysched, size);
1450 			kmem_free(keysched, size);
1451 		}
1452 	}
1453 
1454 /* EXPORT DELETE END */
1455 
1456 	return (rv);
1457 }
1458 
1459 static int
1460 process_gmac_mech(crypto_mechanism_t *mech, crypto_data_t *data,
1461     CK_AES_GCM_PARAMS *gcm_params)
1462 {
1463 	/* LINTED: pointer alignment */
1464 	CK_AES_GMAC_PARAMS *params = (CK_AES_GMAC_PARAMS *)mech->cm_param;
1465 
1466 	if (mech->cm_type != AES_GMAC_MECH_INFO_TYPE)
1467 		return (CRYPTO_MECHANISM_INVALID);
1468 
1469 	if (mech->cm_param_len != sizeof (CK_AES_GMAC_PARAMS))
1470 		return (CRYPTO_MECHANISM_PARAM_INVALID);
1471 
1472 	if (params->pIv == NULL)
1473 		return (CRYPTO_MECHANISM_PARAM_INVALID);
1474 
1475 	gcm_params->pIv = params->pIv;
1476 	gcm_params->ulIvLen = AES_GMAC_IV_LEN;
1477 	gcm_params->ulTagBits = AES_GMAC_TAG_BITS;
1478 
1479 	if (data == NULL)
1480 		return (CRYPTO_SUCCESS);
1481 
1482 	if (data->cd_format != CRYPTO_DATA_RAW)
1483 		return (CRYPTO_ARGUMENTS_BAD);
1484 
1485 	gcm_params->pAAD = (uchar_t *)data->cd_raw.iov_base;
1486 	gcm_params->ulAADLen = data->cd_length;
1487 	return (CRYPTO_SUCCESS);
1488 }
1489 
1490 static int
1491 aes_mac_atomic(crypto_provider_handle_t provider,
1492     crypto_session_id_t session_id, crypto_mechanism_t *mechanism,
1493     crypto_key_t *key, crypto_data_t *data, crypto_data_t *mac,
1494     crypto_spi_ctx_template_t template, crypto_req_handle_t req)
1495 {
1496 	CK_AES_GCM_PARAMS gcm_params;
1497 	crypto_mechanism_t gcm_mech;
1498 	int rv;
1499 
1500 	if ((rv = process_gmac_mech(mechanism, data, &gcm_params))
1501 	    != CRYPTO_SUCCESS)
1502 		return (rv);
1503 
1504 	gcm_mech.cm_type = AES_GCM_MECH_INFO_TYPE;
1505 	gcm_mech.cm_param_len = sizeof (CK_AES_GCM_PARAMS);
1506 	gcm_mech.cm_param = (char *)&gcm_params;
1507 
1508 	return (aes_encrypt_atomic(provider, session_id, &gcm_mech,
1509 	    key, &null_crypto_data, mac, template, req));
1510 }
1511 
1512 static int
1513 aes_mac_verify_atomic(crypto_provider_handle_t provider,
1514     crypto_session_id_t session_id, crypto_mechanism_t *mechanism,
1515     crypto_key_t *key, crypto_data_t *data, crypto_data_t *mac,
1516     crypto_spi_ctx_template_t template, crypto_req_handle_t req)
1517 {
1518 	CK_AES_GCM_PARAMS gcm_params;
1519 	crypto_mechanism_t gcm_mech;
1520 	int rv;
1521 
1522 	if ((rv = process_gmac_mech(mechanism, data, &gcm_params))
1523 	    != CRYPTO_SUCCESS)
1524 		return (rv);
1525 
1526 	gcm_mech.cm_type = AES_GCM_MECH_INFO_TYPE;
1527 	gcm_mech.cm_param_len = sizeof (CK_AES_GCM_PARAMS);
1528 	gcm_mech.cm_param = (char *)&gcm_params;
1529 
1530 	return (aes_decrypt_atomic(provider, session_id, &gcm_mech,
1531 	    key, mac, &null_crypto_data, template, req));
1532 }
1533 
1534 /*
1535  * AES Power-Up Self-Test
1536  */
1537 void
1538 aes_POST(int *rc)
1539 {
1540 
1541 	int ret;
1542 
1543 	/* AES Power-Up Self-Test for 128-bit key. */
1544 	ret = fips_aes_post(FIPS_AES_128_KEY_SIZE);
1545 
1546 	if (ret != CRYPTO_SUCCESS)
1547 		goto out;
1548 
1549 	/* AES Power-Up Self-Test for 192-bit key. */
1550 	ret = fips_aes_post(FIPS_AES_192_KEY_SIZE);
1551 
1552 	if (ret != CRYPTO_SUCCESS)
1553 		goto out;
1554 
1555 	/* AES Power-Up Self-Test for 256-bit key. */
1556 	ret = fips_aes_post(FIPS_AES_256_KEY_SIZE);
1557 
1558 out:
1559 	*rc = ret;
1560 
1561 }
1562