xref: /openbsd-src/lib/libcrypto/evp/e_aes.c (revision 4ffa82dac1f19f337cd5dd8b2ae033f1374a999c)
1*4ffa82daStb /* $OpenBSD: e_aes.c,v 1.59 2024/09/06 09:57:32 tb Exp $ */
2da347917Sbeck /* ====================================================================
35cdd308eSdjm  * Copyright (c) 2001-2011 The OpenSSL Project.  All rights reserved.
4da347917Sbeck  *
5da347917Sbeck  * Redistribution and use in source and binary forms, with or without
6da347917Sbeck  * modification, are permitted provided that the following conditions
7da347917Sbeck  * are met:
8da347917Sbeck  *
9da347917Sbeck  * 1. Redistributions of source code must retain the above copyright
10da347917Sbeck  *    notice, this list of conditions and the following disclaimer.
11da347917Sbeck  *
12da347917Sbeck  * 2. Redistributions in binary form must reproduce the above copyright
13da347917Sbeck  *    notice, this list of conditions and the following disclaimer in
14da347917Sbeck  *    the documentation and/or other materials provided with the
15da347917Sbeck  *    distribution.
16da347917Sbeck  *
17da347917Sbeck  * 3. All advertising materials mentioning features or use of this
18da347917Sbeck  *    software must display the following acknowledgment:
19da347917Sbeck  *    "This product includes software developed by the OpenSSL Project
20da347917Sbeck  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21da347917Sbeck  *
22da347917Sbeck  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23da347917Sbeck  *    endorse or promote products derived from this software without
24da347917Sbeck  *    prior written permission. For written permission, please contact
25da347917Sbeck  *    openssl-core@openssl.org.
26da347917Sbeck  *
27da347917Sbeck  * 5. Products derived from this software may not be called "OpenSSL"
28da347917Sbeck  *    nor may "OpenSSL" appear in their names without prior written
29da347917Sbeck  *    permission of the OpenSSL Project.
30da347917Sbeck  *
31da347917Sbeck  * 6. Redistributions of any form whatsoever must retain the following
32da347917Sbeck  *    acknowledgment:
33da347917Sbeck  *    "This product includes software developed by the OpenSSL Project
34da347917Sbeck  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35da347917Sbeck  *
36da347917Sbeck  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37da347917Sbeck  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38da347917Sbeck  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39da347917Sbeck  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40da347917Sbeck  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41da347917Sbeck  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42da347917Sbeck  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43da347917Sbeck  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44da347917Sbeck  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45da347917Sbeck  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46da347917Sbeck  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47da347917Sbeck  * OF THE POSSIBILITY OF SUCH DAMAGE.
48da347917Sbeck  * ====================================================================
49da347917Sbeck  *
50da347917Sbeck  */
51da347917Sbeck 
527bd97338Stb #include <limits.h>
53ef624301Sjsing #include <stdlib.h>
548cf4d6a6Sjsing #include <string.h>
558cf4d6a6Sjsing 
568cf4d6a6Sjsing #include <openssl/opensslconf.h>
578cf4d6a6Sjsing 
58*4ffa82daStb #include "crypto_internal.h"
59*4ffa82daStb 
608cf4d6a6Sjsing #ifndef OPENSSL_NO_AES
61da347917Sbeck #include <openssl/aes.h>
628cf4d6a6Sjsing #include <openssl/err.h>
638cf4d6a6Sjsing #include <openssl/evp.h>
648cf4d6a6Sjsing 
65c9675a23Stb #include "evp_local.h"
66c9675a23Stb #include "modes_local.h"
67da347917Sbeck 
68ba3920edSjsing typedef struct {
69da347917Sbeck 	AES_KEY ks;
705cdd308eSdjm 	block128_f block;
715cdd308eSdjm 	union {
725cdd308eSdjm 		cbc128_f cbc;
735cdd308eSdjm 		ctr128_f ctr;
745cdd308eSdjm 	} stream;
75da347917Sbeck } EVP_AES_KEY;
76da347917Sbeck 
77ba3920edSjsing typedef struct {
785cdd308eSdjm 	AES_KEY ks;		/* AES key schedule to use */
795cdd308eSdjm 	int key_set;		/* Set if key initialised */
805cdd308eSdjm 	int iv_set;		/* Set if an iv is set */
815cdd308eSdjm 	GCM128_CONTEXT gcm;
825cdd308eSdjm 	unsigned char *iv;	/* Temporary IV store */
835cdd308eSdjm 	int ivlen;		/* IV length */
845cdd308eSdjm 	int taglen;
855cdd308eSdjm 	int iv_gen;		/* It is OK to generate IVs */
865cdd308eSdjm 	int tls_aad_len;	/* TLS AAD length */
875cdd308eSdjm 	ctr128_f ctr;
885cdd308eSdjm } EVP_AES_GCM_CTX;
89da347917Sbeck 
90ba3920edSjsing typedef struct {
915cdd308eSdjm 	AES_KEY ks1, ks2;	/* AES key schedules to use */
925cdd308eSdjm 	XTS128_CONTEXT xts;
93ba3920edSjsing 	void (*stream)(const unsigned char *in, unsigned char *out,
94ba3920edSjsing 	    size_t length, const AES_KEY *key1, const AES_KEY *key2,
955cdd308eSdjm 	    const unsigned char iv[16]);
965cdd308eSdjm } EVP_AES_XTS_CTX;
97da347917Sbeck 
98ba3920edSjsing typedef struct {
995cdd308eSdjm 	AES_KEY ks;		/* AES key schedule to use */
1005cdd308eSdjm 	int key_set;		/* Set if key initialised */
1015cdd308eSdjm 	int iv_set;		/* Set if an iv is set */
1025cdd308eSdjm 	int tag_set;		/* Set if tag is valid */
1035cdd308eSdjm 	int len_set;		/* Set if message length set */
1045cdd308eSdjm 	int L, M;		/* L and M parameters from RFC3610 */
1055cdd308eSdjm 	CCM128_CONTEXT ccm;
1065cdd308eSdjm 	ccm128_f str;
1075cdd308eSdjm } EVP_AES_CCM_CTX;
10840d8aef3Sdjm 
1095cdd308eSdjm #define MAXBITCHUNK	((size_t)1<<(sizeof(size_t)*8-4))
11040d8aef3Sdjm 
1115cdd308eSdjm #ifdef VPAES_ASM
1125cdd308eSdjm int vpaes_set_encrypt_key(const unsigned char *userKey, int bits,
1135cdd308eSdjm     AES_KEY *key);
1145cdd308eSdjm int vpaes_set_decrypt_key(const unsigned char *userKey, int bits,
1155cdd308eSdjm     AES_KEY *key);
1165cdd308eSdjm 
1175cdd308eSdjm void vpaes_encrypt(const unsigned char *in, unsigned char *out,
1185cdd308eSdjm     const AES_KEY *key);
1195cdd308eSdjm void vpaes_decrypt(const unsigned char *in, unsigned char *out,
1205cdd308eSdjm     const AES_KEY *key);
1215cdd308eSdjm 
122ba3920edSjsing void vpaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
123ba3920edSjsing     size_t length, const AES_KEY *key, unsigned char *ivec, int enc);
1245cdd308eSdjm #endif
1255cdd308eSdjm #ifdef BSAES_ASM
1265cdd308eSdjm void bsaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
127ba3920edSjsing     size_t length, const AES_KEY *key, unsigned char ivec[16], int enc);
1285cdd308eSdjm void bsaes_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
129ba3920edSjsing     size_t len, const AES_KEY *key, const unsigned char ivec[16]);
1305cdd308eSdjm void bsaes_xts_encrypt(const unsigned char *inp, unsigned char *out,
131ba3920edSjsing     size_t len, const AES_KEY *key1, const AES_KEY *key2,
132ba3920edSjsing     const unsigned char iv[16]);
1335cdd308eSdjm void bsaes_xts_decrypt(const unsigned char *inp, unsigned char *out,
134ba3920edSjsing     size_t len, const AES_KEY *key1, const AES_KEY *key2,
135ba3920edSjsing     const unsigned char iv[16]);
1365cdd308eSdjm #endif
1375cdd308eSdjm #ifdef AES_CTR_ASM
1385cdd308eSdjm void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
1395cdd308eSdjm     size_t blocks, const AES_KEY *key,
1405cdd308eSdjm     const unsigned char ivec[AES_BLOCK_SIZE]);
1415cdd308eSdjm #endif
1425cdd308eSdjm #ifdef AES_XTS_ASM
1435cdd308eSdjm void AES_xts_encrypt(const char *inp, char *out, size_t len,
144ba3920edSjsing     const AES_KEY *key1, const AES_KEY *key2, const unsigned char iv[16]);
1455cdd308eSdjm void AES_xts_decrypt(const char *inp, char *out, size_t len,
146ba3920edSjsing     const AES_KEY *key1, const AES_KEY *key2, const unsigned char iv[16]);
1475cdd308eSdjm #endif
1485cdd308eSdjm 
1494647d16fSmiod #if	defined(AES_ASM) &&				(  \
1505cdd308eSdjm 	((defined(__i386)	|| defined(__i386__)	|| \
1515cdd308eSdjm 	  defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
1525cdd308eSdjm 	defined(__x86_64)	|| defined(__x86_64__)	|| \
1535cdd308eSdjm 	defined(_M_AMD64)	|| defined(_M_X64)	|| \
1545cdd308eSdjm 	defined(__INTEL__)				)
1555cdd308eSdjm 
156e60c46c4Smiod #include "x86_arch.h"
1575cdd308eSdjm 
1585cdd308eSdjm #ifdef VPAES_ASM
159*4ffa82daStb #define VPAES_CAPABLE	(crypto_cpu_caps_ia32() & CPUCAP_MASK_SSSE3)
1605cdd308eSdjm #endif
1615cdd308eSdjm #ifdef BSAES_ASM
1625cdd308eSdjm #define BSAES_CAPABLE	VPAES_CAPABLE
1635cdd308eSdjm #endif
1645cdd308eSdjm /*
1655cdd308eSdjm  * AES-NI section
1665cdd308eSdjm  */
167*4ffa82daStb #define	AESNI_CAPABLE	(crypto_cpu_caps_ia32() & CPUCAP_MASK_AESNI)
1685cdd308eSdjm 
1695cdd308eSdjm int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
1705cdd308eSdjm     AES_KEY *key);
1715cdd308eSdjm int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
1725cdd308eSdjm     AES_KEY *key);
1735cdd308eSdjm 
1745cdd308eSdjm void aesni_encrypt(const unsigned char *in, unsigned char *out,
1755cdd308eSdjm     const AES_KEY *key);
1765cdd308eSdjm void aesni_decrypt(const unsigned char *in, unsigned char *out,
1775cdd308eSdjm     const AES_KEY *key);
1785cdd308eSdjm 
179ba3920edSjsing void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
180ba3920edSjsing     size_t length, const AES_KEY *key, int enc);
181ba3920edSjsing void aesni_cbc_encrypt(const unsigned char *in, unsigned char *out,
182ba3920edSjsing     size_t length, const AES_KEY *key, unsigned char *ivec, int enc);
1835cdd308eSdjm 
184ba3920edSjsing void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
185ba3920edSjsing     size_t blocks, const void *key, const unsigned char *ivec);
1865cdd308eSdjm 
187ba3920edSjsing void aesni_xts_encrypt(const unsigned char *in, unsigned char *out,
188ba3920edSjsing     size_t length, const AES_KEY *key1, const AES_KEY *key2,
1895cdd308eSdjm     const unsigned char iv[16]);
1905cdd308eSdjm 
191ba3920edSjsing void aesni_xts_decrypt(const unsigned char *in, unsigned char *out,
192ba3920edSjsing     size_t length, const AES_KEY *key1, const AES_KEY *key2,
1935cdd308eSdjm     const unsigned char iv[16]);
1945cdd308eSdjm 
195ba3920edSjsing void aesni_ccm64_encrypt_blocks (const unsigned char *in, unsigned char *out,
196ba3920edSjsing     size_t blocks, const void *key, const unsigned char ivec[16],
1975cdd308eSdjm     unsigned char cmac[16]);
1985cdd308eSdjm 
199ba3920edSjsing void aesni_ccm64_decrypt_blocks (const unsigned char *in, unsigned char *out,
200ba3920edSjsing     size_t blocks, const void *key, const unsigned char ivec[16],
2015cdd308eSdjm     unsigned char cmac[16]);
2025cdd308eSdjm 
203ba3920edSjsing static int
204ba3920edSjsing aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2055cdd308eSdjm     const unsigned char *iv, int enc)
2065cdd308eSdjm {
2075cdd308eSdjm 	int ret, mode;
2085cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
2095cdd308eSdjm 
2105cdd308eSdjm 	mode = ctx->cipher->flags & EVP_CIPH_MODE;
211ba3920edSjsing 	if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) &&
212ba3920edSjsing 	    !enc) {
213ba3920edSjsing 		ret = aesni_set_decrypt_key(key, ctx->key_len * 8,
214ba3920edSjsing 		    ctx->cipher_data);
2155cdd308eSdjm 		dat->block = (block128_f)aesni_decrypt;
2165cdd308eSdjm 		dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
217ba3920edSjsing 		    (cbc128_f)aesni_cbc_encrypt : NULL;
218ba3920edSjsing 	} else {
219ba3920edSjsing 		ret = aesni_set_encrypt_key(key, ctx->key_len * 8,
220ba3920edSjsing 		    ctx->cipher_data);
2215cdd308eSdjm 		dat->block = (block128_f)aesni_encrypt;
2225cdd308eSdjm 		if (mode == EVP_CIPH_CBC_MODE)
2235cdd308eSdjm 			dat->stream.cbc = (cbc128_f)aesni_cbc_encrypt;
2245cdd308eSdjm 		else if (mode == EVP_CIPH_CTR_MODE)
2255cdd308eSdjm 			dat->stream.ctr = (ctr128_f)aesni_ctr32_encrypt_blocks;
2265cdd308eSdjm 		else
2275cdd308eSdjm 			dat->stream.cbc = NULL;
2285cdd308eSdjm 	}
2295cdd308eSdjm 
230ba3920edSjsing 	if (ret < 0) {
2315067ae9fSbeck 		EVPerror(EVP_R_AES_KEY_SETUP_FAILED);
2325cdd308eSdjm 		return 0;
2335cdd308eSdjm 	}
2345cdd308eSdjm 
2355cdd308eSdjm 	return 1;
2365cdd308eSdjm }
2375cdd308eSdjm 
238ba3920edSjsing static int
239ba3920edSjsing aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2405cdd308eSdjm     const unsigned char *in, size_t len)
2415cdd308eSdjm {
242ba3920edSjsing 	aesni_cbc_encrypt(in, out, len, ctx->cipher_data, ctx->iv,
243ba3920edSjsing 	    ctx->encrypt);
2445cdd308eSdjm 
2455cdd308eSdjm 	return 1;
2465cdd308eSdjm }
2475cdd308eSdjm 
248ba3920edSjsing static int
249ba3920edSjsing aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2505cdd308eSdjm     const unsigned char *in, size_t len)
2515cdd308eSdjm {
2525cdd308eSdjm 	size_t	bl = ctx->cipher->block_size;
2535cdd308eSdjm 
254ba3920edSjsing 	if (len < bl)
255ba3920edSjsing 		return 1;
2565cdd308eSdjm 
2575cdd308eSdjm 	aesni_ecb_encrypt(in, out, len, ctx->cipher_data, ctx->encrypt);
2585cdd308eSdjm 
2595cdd308eSdjm 	return 1;
2605cdd308eSdjm }
2615cdd308eSdjm 
262ba3920edSjsing static int
263ba3920edSjsing aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2645cdd308eSdjm     const unsigned char *iv, int enc)
2655cdd308eSdjm {
2665cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
267ba3920edSjsing 
2685cdd308eSdjm 	if (!iv && !key)
2695cdd308eSdjm 		return 1;
270ba3920edSjsing 	if (key) {
2715cdd308eSdjm 		aesni_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
2725cdd308eSdjm 		CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
2735cdd308eSdjm 		    (block128_f)aesni_encrypt);
2745cdd308eSdjm 		gctx->ctr = (ctr128_f)aesni_ctr32_encrypt_blocks;
2755cdd308eSdjm 		/* If we have an iv can set it directly, otherwise use
2765cdd308eSdjm 		 * saved IV.
2775cdd308eSdjm 		 */
2785cdd308eSdjm 		if (iv == NULL && gctx->iv_set)
2795cdd308eSdjm 			iv = gctx->iv;
280ba3920edSjsing 		if (iv) {
2815cdd308eSdjm 			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
2825cdd308eSdjm 			gctx->iv_set = 1;
2835cdd308eSdjm 		}
2845cdd308eSdjm 		gctx->key_set = 1;
285ba3920edSjsing 	} else {
2865cdd308eSdjm 		/* If key set use IV, otherwise copy */
2875cdd308eSdjm 		if (gctx->key_set)
2885cdd308eSdjm 			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
2895cdd308eSdjm 		else
2905cdd308eSdjm 			memcpy(gctx->iv, iv, gctx->ivlen);
2915cdd308eSdjm 		gctx->iv_set = 1;
2925cdd308eSdjm 		gctx->iv_gen = 0;
2935cdd308eSdjm 	}
2945cdd308eSdjm 	return 1;
2955cdd308eSdjm }
2965cdd308eSdjm 
297ba3920edSjsing static int
298ba3920edSjsing aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2995cdd308eSdjm     const unsigned char *iv, int enc)
3005cdd308eSdjm {
3015cdd308eSdjm 	EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
302ba3920edSjsing 
3035cdd308eSdjm 	if (!iv && !key)
3045cdd308eSdjm 		return 1;
3055cdd308eSdjm 
306ba3920edSjsing 	if (key) {
3075cdd308eSdjm 		/* key_len is two AES keys */
308ba3920edSjsing 		if (enc) {
309ba3920edSjsing 			aesni_set_encrypt_key(key, ctx->key_len * 4,
310ba3920edSjsing 			    &xctx->ks1);
3115cdd308eSdjm 			xctx->xts.block1 = (block128_f)aesni_encrypt;
3125cdd308eSdjm 			xctx->stream = aesni_xts_encrypt;
313ba3920edSjsing 		} else {
314ba3920edSjsing 			aesni_set_decrypt_key(key, ctx->key_len * 4,
315ba3920edSjsing 			    &xctx->ks1);
3165cdd308eSdjm 			xctx->xts.block1 = (block128_f)aesni_decrypt;
3175cdd308eSdjm 			xctx->stream = aesni_xts_decrypt;
3185cdd308eSdjm 		}
3195cdd308eSdjm 
3205cdd308eSdjm 		aesni_set_encrypt_key(key + ctx->key_len / 2,
3215cdd308eSdjm 		    ctx->key_len * 4, &xctx->ks2);
3225cdd308eSdjm 		xctx->xts.block2 = (block128_f)aesni_encrypt;
3235cdd308eSdjm 
3245cdd308eSdjm 		xctx->xts.key1 = &xctx->ks1;
3255cdd308eSdjm 	}
3265cdd308eSdjm 
327ba3920edSjsing 	if (iv) {
3285cdd308eSdjm 		xctx->xts.key2 = &xctx->ks2;
3295cdd308eSdjm 		memcpy(ctx->iv, iv, 16);
3305cdd308eSdjm 	}
3315cdd308eSdjm 
3325cdd308eSdjm 	return 1;
3335cdd308eSdjm }
3345cdd308eSdjm 
335ba3920edSjsing static int
336ba3920edSjsing aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
3375cdd308eSdjm     const unsigned char *iv, int enc)
3385cdd308eSdjm {
3395cdd308eSdjm 	EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
340ba3920edSjsing 
3415cdd308eSdjm 	if (!iv && !key)
3425cdd308eSdjm 		return 1;
343ba3920edSjsing 	if (key) {
3445cdd308eSdjm 		aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
3455cdd308eSdjm 		CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
3465cdd308eSdjm 		    &cctx->ks, (block128_f)aesni_encrypt);
3475cdd308eSdjm 		cctx->str = enc ? (ccm128_f)aesni_ccm64_encrypt_blocks :
3485cdd308eSdjm 		    (ccm128_f)aesni_ccm64_decrypt_blocks;
3495cdd308eSdjm 		cctx->key_set = 1;
3505cdd308eSdjm 	}
351ba3920edSjsing 	if (iv) {
3525cdd308eSdjm 		memcpy(ctx->iv, iv, 15 - cctx->L);
3535cdd308eSdjm 		cctx->iv_set = 1;
3545cdd308eSdjm 	}
3555cdd308eSdjm 	return 1;
3565cdd308eSdjm }
3575cdd308eSdjm 
3585cdd308eSdjm #endif
3595cdd308eSdjm 
360ba3920edSjsing static int
361ba3920edSjsing aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
36240d8aef3Sdjm     const unsigned char *iv, int enc)
36340d8aef3Sdjm {
3645cdd308eSdjm 	int ret, mode;
3655cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
366da347917Sbeck 
3675cdd308eSdjm 	mode = ctx->cipher->flags & EVP_CIPH_MODE;
368ba3920edSjsing 	if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) &&
369ba3920edSjsing 	    !enc)
3705cdd308eSdjm #ifdef BSAES_CAPABLE
371ba3920edSjsing 		if (BSAES_CAPABLE && mode == EVP_CIPH_CBC_MODE) {
372ba3920edSjsing 			ret = AES_set_decrypt_key(key, ctx->key_len * 8,
373ba3920edSjsing 			    &dat->ks);
3745cdd308eSdjm 			dat->block = (block128_f)AES_decrypt;
3755cdd308eSdjm 			dat->stream.cbc = (cbc128_f)bsaes_cbc_encrypt;
376ba3920edSjsing 		} else
3775cdd308eSdjm #endif
3785cdd308eSdjm #ifdef VPAES_CAPABLE
379ba3920edSjsing 		if (VPAES_CAPABLE) {
380ba3920edSjsing 			ret = vpaes_set_decrypt_key(key, ctx->key_len * 8,
381ba3920edSjsing 			    &dat->ks);
3825cdd308eSdjm 			dat->block = (block128_f)vpaes_decrypt;
3835cdd308eSdjm 			dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
384ba3920edSjsing 			    (cbc128_f)vpaes_cbc_encrypt : NULL;
385ba3920edSjsing 		} else
3865cdd308eSdjm #endif
3875cdd308eSdjm 		{
388ba3920edSjsing 			ret = AES_set_decrypt_key(key, ctx->key_len * 8,
389ba3920edSjsing 			    &dat->ks);
3905cdd308eSdjm 			dat->block = (block128_f)AES_decrypt;
3915cdd308eSdjm 			dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
392ba3920edSjsing 			    (cbc128_f)AES_cbc_encrypt : NULL;
393ba3920edSjsing 		} else
3945cdd308eSdjm #ifdef BSAES_CAPABLE
395ba3920edSjsing 		if (BSAES_CAPABLE && mode == EVP_CIPH_CTR_MODE) {
396ba3920edSjsing 			ret = AES_set_encrypt_key(key, ctx->key_len * 8,
397ba3920edSjsing 			    &dat->ks);
3985cdd308eSdjm 			dat->block = (block128_f)AES_encrypt;
3995cdd308eSdjm 			dat->stream.ctr = (ctr128_f)bsaes_ctr32_encrypt_blocks;
400ba3920edSjsing 		} else
4015cdd308eSdjm #endif
4025cdd308eSdjm #ifdef VPAES_CAPABLE
403ba3920edSjsing 		if (VPAES_CAPABLE) {
404ba3920edSjsing 			ret = vpaes_set_encrypt_key(key, ctx->key_len * 8,
405ba3920edSjsing 			    &dat->ks);
4065cdd308eSdjm 			dat->block = (block128_f)vpaes_encrypt;
4075cdd308eSdjm 			dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
408ba3920edSjsing 			    (cbc128_f)vpaes_cbc_encrypt : NULL;
409ba3920edSjsing 		} else
4105cdd308eSdjm #endif
4115cdd308eSdjm 		{
412ba3920edSjsing 			ret = AES_set_encrypt_key(key, ctx->key_len * 8,
413ba3920edSjsing 			    &dat->ks);
4145cdd308eSdjm 			dat->block = (block128_f)AES_encrypt;
4155cdd308eSdjm 			dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
416ba3920edSjsing 			    (cbc128_f)AES_cbc_encrypt : NULL;
4175cdd308eSdjm #ifdef AES_CTR_ASM
4185cdd308eSdjm 			if (mode == EVP_CIPH_CTR_MODE)
4195cdd308eSdjm 				dat->stream.ctr = (ctr128_f)AES_ctr32_encrypt;
4205cdd308eSdjm #endif
4215cdd308eSdjm 		}
42240d8aef3Sdjm 
423ba3920edSjsing 	if (ret < 0) {
4245067ae9fSbeck 		EVPerror(EVP_R_AES_KEY_SETUP_FAILED);
42540d8aef3Sdjm 		return 0;
42640d8aef3Sdjm 	}
427da347917Sbeck 
428da347917Sbeck 	return 1;
429da347917Sbeck }
430da347917Sbeck 
431ba3920edSjsing static int
432ba3920edSjsing aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
4335cdd308eSdjm     const unsigned char *in, size_t len)
4345cdd308eSdjm {
4355cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
4365cdd308eSdjm 
4375cdd308eSdjm 	if (dat->stream.cbc)
438ba3920edSjsing 		(*dat->stream.cbc)(in, out, len, &dat->ks, ctx->iv,
439ba3920edSjsing 		    ctx->encrypt);
4405cdd308eSdjm 	else if (ctx->encrypt)
441ba3920edSjsing 		CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv,
442ba3920edSjsing 		    dat->block);
4435cdd308eSdjm 	else
444ba3920edSjsing 		CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, ctx->iv,
445ba3920edSjsing 		    dat->block);
4465cdd308eSdjm 
4475cdd308eSdjm 	return 1;
4485cdd308eSdjm }
4495cdd308eSdjm 
450ba3920edSjsing static int
451ba3920edSjsing aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
4525cdd308eSdjm     const unsigned char *in, size_t len)
4535cdd308eSdjm {
4545cdd308eSdjm 	size_t	bl = ctx->cipher->block_size;
4555cdd308eSdjm 	size_t	i;
4565cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
4575cdd308eSdjm 
458ba3920edSjsing 	if (len < bl)
459ba3920edSjsing 		return 1;
4605cdd308eSdjm 
4615cdd308eSdjm 	for (i = 0, len -= bl; i <= len; i += bl)
4625cdd308eSdjm 		(*dat->block)(in + i, out + i, &dat->ks);
4635cdd308eSdjm 
4645cdd308eSdjm 	return 1;
4655cdd308eSdjm }
4665cdd308eSdjm 
467ba3920edSjsing static int
468ba3920edSjsing aes_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
4695cdd308eSdjm     const unsigned char *in, size_t len)
4705cdd308eSdjm {
4715cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
4725cdd308eSdjm 
473ba3920edSjsing 	CRYPTO_ofb128_encrypt(in, out, len, &dat->ks, ctx->iv, &ctx->num,
474ba3920edSjsing 	    dat->block);
4755cdd308eSdjm 	return 1;
4765cdd308eSdjm }
4775cdd308eSdjm 
478ba3920edSjsing static int
479ba3920edSjsing aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
4805cdd308eSdjm     const unsigned char *in, size_t len)
4815cdd308eSdjm {
4825cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
4835cdd308eSdjm 
484ba3920edSjsing 	CRYPTO_cfb128_encrypt(in, out, len, &dat->ks, ctx->iv, &ctx->num,
485ba3920edSjsing 	    ctx->encrypt, dat->block);
4865cdd308eSdjm 	return 1;
4875cdd308eSdjm }
4885cdd308eSdjm 
489ba3920edSjsing static int
490ba3920edSjsing aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
4915cdd308eSdjm     const unsigned char *in, size_t len)
4925cdd308eSdjm {
4935cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
4945cdd308eSdjm 
495ba3920edSjsing 	CRYPTO_cfb128_8_encrypt(in, out, len, &dat->ks, ctx->iv, &ctx->num,
496ba3920edSjsing 	    ctx->encrypt, dat->block);
4975cdd308eSdjm 	return 1;
4985cdd308eSdjm }
4995cdd308eSdjm 
500ba3920edSjsing static int
501ba3920edSjsing aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
5025cdd308eSdjm     const unsigned char *in, size_t len)
5035cdd308eSdjm {
5045cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
5055cdd308eSdjm 
5065cdd308eSdjm 	if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
507ba3920edSjsing 		CRYPTO_cfb128_1_encrypt(in, out, len, &dat->ks, ctx->iv,
508ba3920edSjsing 		    &ctx->num, ctx->encrypt, dat->block);
5095cdd308eSdjm 		return 1;
5105cdd308eSdjm 	}
5115cdd308eSdjm 
5125cdd308eSdjm 	while (len >= MAXBITCHUNK) {
5135cdd308eSdjm 		CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK*8, &dat->ks,
5145cdd308eSdjm 		    ctx->iv, &ctx->num, ctx->encrypt, dat->block);
5155cdd308eSdjm 		len -= MAXBITCHUNK;
51622d8895cSjsing 		in += MAXBITCHUNK;
51722d8895cSjsing 		out += MAXBITCHUNK;
5185cdd308eSdjm 	}
5195cdd308eSdjm 	if (len)
5205cdd308eSdjm 		CRYPTO_cfb128_1_encrypt(in, out, len*8, &dat->ks,
5215cdd308eSdjm 		    ctx->iv, &ctx->num, ctx->encrypt, dat->block);
5225cdd308eSdjm 
5235cdd308eSdjm 	return 1;
5245cdd308eSdjm }
5255cdd308eSdjm 
52688d3205aSjsing static int
52788d3205aSjsing aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
5285cdd308eSdjm     const unsigned char *in, size_t len)
5295cdd308eSdjm {
5305cdd308eSdjm 	unsigned int num = ctx->num;
5315cdd308eSdjm 	EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
5325cdd308eSdjm 
5335cdd308eSdjm 	if (dat->stream.ctr)
5345cdd308eSdjm 		CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks,
5355cdd308eSdjm 		    ctx->iv, ctx->buf, &num, dat->stream.ctr);
5365cdd308eSdjm 	else
5375cdd308eSdjm 		CRYPTO_ctr128_encrypt(in, out, len, &dat->ks,
5385cdd308eSdjm 		    ctx->iv, ctx->buf, &num, dat->block);
5395cdd308eSdjm 	ctx->num = (size_t)num;
5405cdd308eSdjm 	return 1;
5415cdd308eSdjm }
5425cdd308eSdjm 
54388d3205aSjsing 
54488d3205aSjsing #ifdef AESNI_CAPABLE
54588d3205aSjsing static const EVP_CIPHER aesni_128_cbc = {
54688d3205aSjsing 	.nid = NID_aes_128_cbc,
54788d3205aSjsing 	.block_size = 16,
548e986f667Sjsing 	.key_len = 16,
54988d3205aSjsing 	.iv_len = 16,
55022b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
55188d3205aSjsing 	.init = aesni_init_key,
55288d3205aSjsing 	.do_cipher = aesni_cbc_cipher,
55388d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
55488d3205aSjsing };
55588d3205aSjsing #endif
55688d3205aSjsing 
55788d3205aSjsing static const EVP_CIPHER aes_128_cbc = {
55888d3205aSjsing 	.nid = NID_aes_128_cbc,
55988d3205aSjsing 	.block_size = 16,
560e986f667Sjsing 	.key_len = 16,
56188d3205aSjsing 	.iv_len = 16,
56222b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
56388d3205aSjsing 	.init = aes_init_key,
56488d3205aSjsing 	.do_cipher = aes_cbc_cipher,
56588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
56688d3205aSjsing };
56788d3205aSjsing 
56888d3205aSjsing const EVP_CIPHER *
56988d3205aSjsing EVP_aes_128_cbc(void)
57088d3205aSjsing {
57188d3205aSjsing #ifdef AESNI_CAPABLE
57288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_cbc : &aes_128_cbc;
57388d3205aSjsing #else
57488d3205aSjsing 	return &aes_128_cbc;
57588d3205aSjsing #endif
57688d3205aSjsing }
5779bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_cbc);
57888d3205aSjsing 
57988d3205aSjsing #ifdef AESNI_CAPABLE
58088d3205aSjsing static const EVP_CIPHER aesni_128_ecb = {
58188d3205aSjsing 	.nid = NID_aes_128_ecb,
58288d3205aSjsing 	.block_size = 16,
583e986f667Sjsing 	.key_len = 16,
58488d3205aSjsing 	.iv_len = 0,
58522b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
58688d3205aSjsing 	.init = aesni_init_key,
58788d3205aSjsing 	.do_cipher = aesni_ecb_cipher,
58888d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
58988d3205aSjsing };
59088d3205aSjsing #endif
59188d3205aSjsing 
59288d3205aSjsing static const EVP_CIPHER aes_128_ecb = {
59388d3205aSjsing 	.nid = NID_aes_128_ecb,
59488d3205aSjsing 	.block_size = 16,
595e986f667Sjsing 	.key_len = 16,
59688d3205aSjsing 	.iv_len = 0,
59722b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
59888d3205aSjsing 	.init = aes_init_key,
59988d3205aSjsing 	.do_cipher = aes_ecb_cipher,
60088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
60188d3205aSjsing };
60288d3205aSjsing 
60388d3205aSjsing const EVP_CIPHER *
60488d3205aSjsing EVP_aes_128_ecb(void)
60588d3205aSjsing {
60688d3205aSjsing #ifdef AESNI_CAPABLE
60788d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_ecb : &aes_128_ecb;
60888d3205aSjsing #else
60988d3205aSjsing 	return &aes_128_ecb;
61088d3205aSjsing #endif
61188d3205aSjsing }
6129bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_ecb);
61388d3205aSjsing 
61488d3205aSjsing #ifdef AESNI_CAPABLE
61588d3205aSjsing static const EVP_CIPHER aesni_128_ofb = {
61688d3205aSjsing 	.nid = NID_aes_128_ofb128,
61788d3205aSjsing 	.block_size = 1,
618e986f667Sjsing 	.key_len = 16,
61988d3205aSjsing 	.iv_len = 16,
62022b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
62188d3205aSjsing 	.init = aesni_init_key,
622af21c550Sjsing 	.do_cipher = aes_ofb_cipher,
62388d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
62488d3205aSjsing };
62588d3205aSjsing #endif
62688d3205aSjsing 
62788d3205aSjsing static const EVP_CIPHER aes_128_ofb = {
62888d3205aSjsing 	.nid = NID_aes_128_ofb128,
62988d3205aSjsing 	.block_size = 1,
630e986f667Sjsing 	.key_len = 16,
63188d3205aSjsing 	.iv_len = 16,
63222b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
63388d3205aSjsing 	.init = aes_init_key,
63488d3205aSjsing 	.do_cipher = aes_ofb_cipher,
63588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
63688d3205aSjsing };
63788d3205aSjsing 
63888d3205aSjsing const EVP_CIPHER *
63988d3205aSjsing EVP_aes_128_ofb(void)
64088d3205aSjsing {
64188d3205aSjsing #ifdef AESNI_CAPABLE
64288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_ofb : &aes_128_ofb;
64388d3205aSjsing #else
64488d3205aSjsing 	return &aes_128_ofb;
64588d3205aSjsing #endif
64688d3205aSjsing }
6479bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_ofb);
64888d3205aSjsing 
64988d3205aSjsing #ifdef AESNI_CAPABLE
65088d3205aSjsing static const EVP_CIPHER aesni_128_cfb = {
65188d3205aSjsing 	.nid = NID_aes_128_cfb128,
65288d3205aSjsing 	.block_size = 1,
653e986f667Sjsing 	.key_len = 16,
65488d3205aSjsing 	.iv_len = 16,
65522b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
65688d3205aSjsing 	.init = aesni_init_key,
657af21c550Sjsing 	.do_cipher = aes_cfb_cipher,
65888d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
65988d3205aSjsing };
66088d3205aSjsing #endif
66188d3205aSjsing 
66288d3205aSjsing static const EVP_CIPHER aes_128_cfb = {
66388d3205aSjsing 	.nid = NID_aes_128_cfb128,
66488d3205aSjsing 	.block_size = 1,
665e986f667Sjsing 	.key_len = 16,
66688d3205aSjsing 	.iv_len = 16,
66722b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
66888d3205aSjsing 	.init = aes_init_key,
66988d3205aSjsing 	.do_cipher = aes_cfb_cipher,
67088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
67188d3205aSjsing };
67288d3205aSjsing 
67388d3205aSjsing const EVP_CIPHER *
674e0aedb9aSbeck EVP_aes_128_cfb128(void)
67588d3205aSjsing {
67688d3205aSjsing #ifdef AESNI_CAPABLE
67788d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_cfb : &aes_128_cfb;
67888d3205aSjsing #else
67988d3205aSjsing 	return &aes_128_cfb;
68088d3205aSjsing #endif
68188d3205aSjsing }
6829bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_cfb128);
68388d3205aSjsing 
68488d3205aSjsing #ifdef AESNI_CAPABLE
68588d3205aSjsing static const EVP_CIPHER aesni_128_cfb1 = {
68688d3205aSjsing 	.nid = NID_aes_128_cfb1,
68788d3205aSjsing 	.block_size = 1,
688e986f667Sjsing 	.key_len = 16,
68988d3205aSjsing 	.iv_len = 16,
69022b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
69188d3205aSjsing 	.init = aesni_init_key,
692af21c550Sjsing 	.do_cipher = aes_cfb1_cipher,
69388d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
69488d3205aSjsing };
69588d3205aSjsing #endif
69688d3205aSjsing 
69788d3205aSjsing static const EVP_CIPHER aes_128_cfb1 = {
69888d3205aSjsing 	.nid = NID_aes_128_cfb1,
69988d3205aSjsing 	.block_size = 1,
700e986f667Sjsing 	.key_len = 16,
70188d3205aSjsing 	.iv_len = 16,
70222b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
70388d3205aSjsing 	.init = aes_init_key,
70488d3205aSjsing 	.do_cipher = aes_cfb1_cipher,
70588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
70688d3205aSjsing };
70788d3205aSjsing 
70888d3205aSjsing const EVP_CIPHER *
70988d3205aSjsing EVP_aes_128_cfb1(void)
71088d3205aSjsing {
71188d3205aSjsing #ifdef AESNI_CAPABLE
71288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_cfb1 : &aes_128_cfb1;
71388d3205aSjsing #else
71488d3205aSjsing 	return &aes_128_cfb1;
71588d3205aSjsing #endif
71688d3205aSjsing }
7179bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_cfb1);
71888d3205aSjsing 
71988d3205aSjsing #ifdef AESNI_CAPABLE
72088d3205aSjsing static const EVP_CIPHER aesni_128_cfb8 = {
72188d3205aSjsing 	.nid = NID_aes_128_cfb8,
72288d3205aSjsing 	.block_size = 1,
723e986f667Sjsing 	.key_len = 16,
72488d3205aSjsing 	.iv_len = 16,
72522b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
72688d3205aSjsing 	.init = aesni_init_key,
727af21c550Sjsing 	.do_cipher = aes_cfb8_cipher,
72888d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
72988d3205aSjsing };
73088d3205aSjsing #endif
73188d3205aSjsing 
73288d3205aSjsing static const EVP_CIPHER aes_128_cfb8 = {
73388d3205aSjsing 	.nid = NID_aes_128_cfb8,
73488d3205aSjsing 	.block_size = 1,
735e986f667Sjsing 	.key_len = 16,
73688d3205aSjsing 	.iv_len = 16,
73722b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
73888d3205aSjsing 	.init = aes_init_key,
73988d3205aSjsing 	.do_cipher = aes_cfb8_cipher,
74088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
74188d3205aSjsing };
74288d3205aSjsing 
74388d3205aSjsing const EVP_CIPHER *
74488d3205aSjsing EVP_aes_128_cfb8(void)
74588d3205aSjsing {
74688d3205aSjsing #ifdef AESNI_CAPABLE
74788d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_cfb8 : &aes_128_cfb8;
74888d3205aSjsing #else
74988d3205aSjsing 	return &aes_128_cfb8;
75088d3205aSjsing #endif
75188d3205aSjsing }
7529bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_cfb8);
75388d3205aSjsing 
75488d3205aSjsing #ifdef AESNI_CAPABLE
75588d3205aSjsing static const EVP_CIPHER aesni_128_ctr = {
75688d3205aSjsing 	.nid = NID_aes_128_ctr,
75788d3205aSjsing 	.block_size = 1,
758e986f667Sjsing 	.key_len = 16,
75988d3205aSjsing 	.iv_len = 16,
76022b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
76188d3205aSjsing 	.init = aesni_init_key,
762af21c550Sjsing 	.do_cipher = aes_ctr_cipher,
76388d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
76488d3205aSjsing };
76588d3205aSjsing #endif
76688d3205aSjsing 
76788d3205aSjsing static const EVP_CIPHER aes_128_ctr = {
76888d3205aSjsing 	.nid = NID_aes_128_ctr,
76988d3205aSjsing 	.block_size = 1,
770e986f667Sjsing 	.key_len = 16,
77188d3205aSjsing 	.iv_len = 16,
77222b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
77388d3205aSjsing 	.init = aes_init_key,
77488d3205aSjsing 	.do_cipher = aes_ctr_cipher,
77588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
77688d3205aSjsing };
77788d3205aSjsing 
77888d3205aSjsing const EVP_CIPHER *
77988d3205aSjsing EVP_aes_128_ctr(void)
78088d3205aSjsing {
78188d3205aSjsing #ifdef AESNI_CAPABLE
78288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_ctr : &aes_128_ctr;
78388d3205aSjsing #else
78488d3205aSjsing 	return &aes_128_ctr;
78588d3205aSjsing #endif
78688d3205aSjsing }
7879bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_ctr);
78888d3205aSjsing 
78988d3205aSjsing 
79088d3205aSjsing #ifdef AESNI_CAPABLE
79188d3205aSjsing static const EVP_CIPHER aesni_192_cbc = {
79288d3205aSjsing 	.nid = NID_aes_192_cbc,
79388d3205aSjsing 	.block_size = 16,
794e986f667Sjsing 	.key_len = 24,
79588d3205aSjsing 	.iv_len = 16,
79622b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
79788d3205aSjsing 	.init = aesni_init_key,
79888d3205aSjsing 	.do_cipher = aesni_cbc_cipher,
79988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
80088d3205aSjsing };
80188d3205aSjsing #endif
80288d3205aSjsing 
80388d3205aSjsing static const EVP_CIPHER aes_192_cbc = {
80488d3205aSjsing 	.nid = NID_aes_192_cbc,
80588d3205aSjsing 	.block_size = 16,
806e986f667Sjsing 	.key_len = 24,
80788d3205aSjsing 	.iv_len = 16,
80822b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
80988d3205aSjsing 	.init = aes_init_key,
81088d3205aSjsing 	.do_cipher = aes_cbc_cipher,
81188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
81288d3205aSjsing };
81388d3205aSjsing 
81488d3205aSjsing const EVP_CIPHER *
81588d3205aSjsing EVP_aes_192_cbc(void)
81688d3205aSjsing {
81788d3205aSjsing #ifdef AESNI_CAPABLE
81888d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_cbc : &aes_192_cbc;
81988d3205aSjsing #else
82088d3205aSjsing 	return &aes_192_cbc;
82188d3205aSjsing #endif
82288d3205aSjsing }
8239bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_cbc);
82488d3205aSjsing 
82588d3205aSjsing #ifdef AESNI_CAPABLE
82688d3205aSjsing static const EVP_CIPHER aesni_192_ecb = {
82788d3205aSjsing 	.nid = NID_aes_192_ecb,
82888d3205aSjsing 	.block_size = 16,
829e986f667Sjsing 	.key_len = 24,
83088d3205aSjsing 	.iv_len = 0,
83122b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
83288d3205aSjsing 	.init = aesni_init_key,
83388d3205aSjsing 	.do_cipher = aesni_ecb_cipher,
83488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
83588d3205aSjsing };
83688d3205aSjsing #endif
83788d3205aSjsing 
83888d3205aSjsing static const EVP_CIPHER aes_192_ecb = {
83988d3205aSjsing 	.nid = NID_aes_192_ecb,
84088d3205aSjsing 	.block_size = 16,
841e986f667Sjsing 	.key_len = 24,
84288d3205aSjsing 	.iv_len = 0,
84322b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
84488d3205aSjsing 	.init = aes_init_key,
84588d3205aSjsing 	.do_cipher = aes_ecb_cipher,
84688d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
84788d3205aSjsing };
84888d3205aSjsing 
84988d3205aSjsing const EVP_CIPHER *
85088d3205aSjsing EVP_aes_192_ecb(void)
85188d3205aSjsing {
85288d3205aSjsing #ifdef AESNI_CAPABLE
85388d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_ecb : &aes_192_ecb;
85488d3205aSjsing #else
85588d3205aSjsing 	return &aes_192_ecb;
85688d3205aSjsing #endif
85788d3205aSjsing }
8589bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_ecb);
85988d3205aSjsing 
86088d3205aSjsing #ifdef AESNI_CAPABLE
86188d3205aSjsing static const EVP_CIPHER aesni_192_ofb = {
86288d3205aSjsing 	.nid = NID_aes_192_ofb128,
86388d3205aSjsing 	.block_size = 1,
864e986f667Sjsing 	.key_len = 24,
86588d3205aSjsing 	.iv_len = 16,
86622b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
86788d3205aSjsing 	.init = aesni_init_key,
868af21c550Sjsing 	.do_cipher = aes_ofb_cipher,
86988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
87088d3205aSjsing };
87188d3205aSjsing #endif
87288d3205aSjsing 
87388d3205aSjsing static const EVP_CIPHER aes_192_ofb = {
87488d3205aSjsing 	.nid = NID_aes_192_ofb128,
87588d3205aSjsing 	.block_size = 1,
876e986f667Sjsing 	.key_len = 24,
87788d3205aSjsing 	.iv_len = 16,
87822b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
87988d3205aSjsing 	.init = aes_init_key,
88088d3205aSjsing 	.do_cipher = aes_ofb_cipher,
88188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
88288d3205aSjsing };
88388d3205aSjsing 
88488d3205aSjsing const EVP_CIPHER *
88588d3205aSjsing EVP_aes_192_ofb(void)
88688d3205aSjsing {
88788d3205aSjsing #ifdef AESNI_CAPABLE
88888d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_ofb : &aes_192_ofb;
88988d3205aSjsing #else
89088d3205aSjsing 	return &aes_192_ofb;
89188d3205aSjsing #endif
89288d3205aSjsing }
8939bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_ofb);
89488d3205aSjsing 
89588d3205aSjsing #ifdef AESNI_CAPABLE
89688d3205aSjsing static const EVP_CIPHER aesni_192_cfb = {
89788d3205aSjsing 	.nid = NID_aes_192_cfb128,
89888d3205aSjsing 	.block_size = 1,
899e986f667Sjsing 	.key_len = 24,
90088d3205aSjsing 	.iv_len = 16,
90122b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
90288d3205aSjsing 	.init = aesni_init_key,
903af21c550Sjsing 	.do_cipher = aes_cfb_cipher,
90488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
90588d3205aSjsing };
90688d3205aSjsing #endif
90788d3205aSjsing 
90888d3205aSjsing static const EVP_CIPHER aes_192_cfb = {
90988d3205aSjsing 	.nid = NID_aes_192_cfb128,
91088d3205aSjsing 	.block_size = 1,
911e986f667Sjsing 	.key_len = 24,
91288d3205aSjsing 	.iv_len = 16,
91322b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
91488d3205aSjsing 	.init = aes_init_key,
91588d3205aSjsing 	.do_cipher = aes_cfb_cipher,
91688d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
91788d3205aSjsing };
91888d3205aSjsing 
91988d3205aSjsing const EVP_CIPHER *
920e0aedb9aSbeck EVP_aes_192_cfb128(void)
92188d3205aSjsing {
92288d3205aSjsing #ifdef AESNI_CAPABLE
92388d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_cfb : &aes_192_cfb;
92488d3205aSjsing #else
92588d3205aSjsing 	return &aes_192_cfb;
92688d3205aSjsing #endif
92788d3205aSjsing }
9289bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_cfb128);
92988d3205aSjsing 
93088d3205aSjsing #ifdef AESNI_CAPABLE
93188d3205aSjsing static const EVP_CIPHER aesni_192_cfb1 = {
93288d3205aSjsing 	.nid = NID_aes_192_cfb1,
93388d3205aSjsing 	.block_size = 1,
934e986f667Sjsing 	.key_len = 24,
93588d3205aSjsing 	.iv_len = 16,
93622b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
93788d3205aSjsing 	.init = aesni_init_key,
938af21c550Sjsing 	.do_cipher = aes_cfb1_cipher,
93988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
94088d3205aSjsing };
94188d3205aSjsing #endif
94288d3205aSjsing 
94388d3205aSjsing static const EVP_CIPHER aes_192_cfb1 = {
94488d3205aSjsing 	.nid = NID_aes_192_cfb1,
94588d3205aSjsing 	.block_size = 1,
946e986f667Sjsing 	.key_len = 24,
94788d3205aSjsing 	.iv_len = 16,
94822b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
94988d3205aSjsing 	.init = aes_init_key,
95088d3205aSjsing 	.do_cipher = aes_cfb1_cipher,
95188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
95288d3205aSjsing };
95388d3205aSjsing 
95488d3205aSjsing const EVP_CIPHER *
95588d3205aSjsing EVP_aes_192_cfb1(void)
95688d3205aSjsing {
95788d3205aSjsing #ifdef AESNI_CAPABLE
95888d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_cfb1 : &aes_192_cfb1;
95988d3205aSjsing #else
96088d3205aSjsing 	return &aes_192_cfb1;
96188d3205aSjsing #endif
96288d3205aSjsing }
9639bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_cfb1);
96488d3205aSjsing 
96588d3205aSjsing #ifdef AESNI_CAPABLE
96688d3205aSjsing static const EVP_CIPHER aesni_192_cfb8 = {
96788d3205aSjsing 	.nid = NID_aes_192_cfb8,
96888d3205aSjsing 	.block_size = 1,
969e986f667Sjsing 	.key_len = 24,
97088d3205aSjsing 	.iv_len = 16,
97122b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
97288d3205aSjsing 	.init = aesni_init_key,
973af21c550Sjsing 	.do_cipher = aes_cfb8_cipher,
97488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
97588d3205aSjsing };
97688d3205aSjsing #endif
97788d3205aSjsing 
97888d3205aSjsing static const EVP_CIPHER aes_192_cfb8 = {
97988d3205aSjsing 	.nid = NID_aes_192_cfb8,
98088d3205aSjsing 	.block_size = 1,
981e986f667Sjsing 	.key_len = 24,
98288d3205aSjsing 	.iv_len = 16,
98322b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
98488d3205aSjsing 	.init = aes_init_key,
98588d3205aSjsing 	.do_cipher = aes_cfb8_cipher,
98688d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
98788d3205aSjsing };
98888d3205aSjsing 
98988d3205aSjsing const EVP_CIPHER *
99088d3205aSjsing EVP_aes_192_cfb8(void)
99188d3205aSjsing {
99288d3205aSjsing #ifdef AESNI_CAPABLE
99388d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_cfb8 : &aes_192_cfb8;
99488d3205aSjsing #else
99588d3205aSjsing 	return &aes_192_cfb8;
99688d3205aSjsing #endif
99788d3205aSjsing }
9989bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_cfb8);
99988d3205aSjsing 
100088d3205aSjsing #ifdef AESNI_CAPABLE
100188d3205aSjsing static const EVP_CIPHER aesni_192_ctr = {
100288d3205aSjsing 	.nid = NID_aes_192_ctr,
100388d3205aSjsing 	.block_size = 1,
1004e986f667Sjsing 	.key_len = 24,
100588d3205aSjsing 	.iv_len = 16,
100622b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
100788d3205aSjsing 	.init = aesni_init_key,
1008af21c550Sjsing 	.do_cipher = aes_ctr_cipher,
100988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
101088d3205aSjsing };
101188d3205aSjsing #endif
101288d3205aSjsing 
101388d3205aSjsing static const EVP_CIPHER aes_192_ctr = {
101488d3205aSjsing 	.nid = NID_aes_192_ctr,
101588d3205aSjsing 	.block_size = 1,
1016e986f667Sjsing 	.key_len = 24,
101788d3205aSjsing 	.iv_len = 16,
101822b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
101988d3205aSjsing 	.init = aes_init_key,
102088d3205aSjsing 	.do_cipher = aes_ctr_cipher,
102188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
102288d3205aSjsing };
102388d3205aSjsing 
102488d3205aSjsing const EVP_CIPHER *
102588d3205aSjsing EVP_aes_192_ctr(void)
102688d3205aSjsing {
102788d3205aSjsing #ifdef AESNI_CAPABLE
102888d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_ctr : &aes_192_ctr;
102988d3205aSjsing #else
103088d3205aSjsing 	return &aes_192_ctr;
103188d3205aSjsing #endif
103288d3205aSjsing }
10339bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_ctr);
103488d3205aSjsing 
103588d3205aSjsing 
103688d3205aSjsing #ifdef AESNI_CAPABLE
103788d3205aSjsing static const EVP_CIPHER aesni_256_cbc = {
103888d3205aSjsing 	.nid = NID_aes_256_cbc,
103988d3205aSjsing 	.block_size = 16,
1040e986f667Sjsing 	.key_len = 32,
104188d3205aSjsing 	.iv_len = 16,
104222b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
104388d3205aSjsing 	.init = aesni_init_key,
104488d3205aSjsing 	.do_cipher = aesni_cbc_cipher,
104588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
104688d3205aSjsing };
104788d3205aSjsing #endif
104888d3205aSjsing 
104988d3205aSjsing static const EVP_CIPHER aes_256_cbc = {
105088d3205aSjsing 	.nid = NID_aes_256_cbc,
105188d3205aSjsing 	.block_size = 16,
1052e986f667Sjsing 	.key_len = 32,
105388d3205aSjsing 	.iv_len = 16,
105422b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CBC_MODE,
105588d3205aSjsing 	.init = aes_init_key,
105688d3205aSjsing 	.do_cipher = aes_cbc_cipher,
105788d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
105888d3205aSjsing };
105988d3205aSjsing 
106088d3205aSjsing const EVP_CIPHER *
106188d3205aSjsing EVP_aes_256_cbc(void)
106288d3205aSjsing {
106388d3205aSjsing #ifdef AESNI_CAPABLE
106488d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_cbc : &aes_256_cbc;
106588d3205aSjsing #else
106688d3205aSjsing 	return &aes_256_cbc;
106788d3205aSjsing #endif
106888d3205aSjsing }
10699bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_cbc);
107088d3205aSjsing 
107188d3205aSjsing #ifdef AESNI_CAPABLE
107288d3205aSjsing static const EVP_CIPHER aesni_256_ecb = {
107388d3205aSjsing 	.nid = NID_aes_256_ecb,
107488d3205aSjsing 	.block_size = 16,
1075e986f667Sjsing 	.key_len = 32,
107688d3205aSjsing 	.iv_len = 0,
107722b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
107888d3205aSjsing 	.init = aesni_init_key,
107988d3205aSjsing 	.do_cipher = aesni_ecb_cipher,
108088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
108188d3205aSjsing };
108288d3205aSjsing #endif
108388d3205aSjsing 
108488d3205aSjsing static const EVP_CIPHER aes_256_ecb = {
108588d3205aSjsing 	.nid = NID_aes_256_ecb,
108688d3205aSjsing 	.block_size = 16,
1087e986f667Sjsing 	.key_len = 32,
108888d3205aSjsing 	.iv_len = 0,
108922b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE,
109088d3205aSjsing 	.init = aes_init_key,
109188d3205aSjsing 	.do_cipher = aes_ecb_cipher,
109288d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
109388d3205aSjsing };
109488d3205aSjsing 
109588d3205aSjsing const EVP_CIPHER *
109688d3205aSjsing EVP_aes_256_ecb(void)
109788d3205aSjsing {
109888d3205aSjsing #ifdef AESNI_CAPABLE
109988d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_ecb : &aes_256_ecb;
110088d3205aSjsing #else
110188d3205aSjsing 	return &aes_256_ecb;
110288d3205aSjsing #endif
110388d3205aSjsing }
11049bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_ecb);
110588d3205aSjsing 
110688d3205aSjsing #ifdef AESNI_CAPABLE
110788d3205aSjsing static const EVP_CIPHER aesni_256_ofb = {
110888d3205aSjsing 	.nid = NID_aes_256_ofb128,
110988d3205aSjsing 	.block_size = 1,
1110e986f667Sjsing 	.key_len = 32,
111188d3205aSjsing 	.iv_len = 16,
111222b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
111388d3205aSjsing 	.init = aesni_init_key,
1114af21c550Sjsing 	.do_cipher = aes_ofb_cipher,
111588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
111688d3205aSjsing };
111788d3205aSjsing #endif
111888d3205aSjsing 
111988d3205aSjsing static const EVP_CIPHER aes_256_ofb = {
112088d3205aSjsing 	.nid = NID_aes_256_ofb128,
112188d3205aSjsing 	.block_size = 1,
1122e986f667Sjsing 	.key_len = 32,
112388d3205aSjsing 	.iv_len = 16,
112422b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_OFB_MODE,
112588d3205aSjsing 	.init = aes_init_key,
112688d3205aSjsing 	.do_cipher = aes_ofb_cipher,
112788d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
112888d3205aSjsing };
112988d3205aSjsing 
113088d3205aSjsing const EVP_CIPHER *
113188d3205aSjsing EVP_aes_256_ofb(void)
113288d3205aSjsing {
113388d3205aSjsing #ifdef AESNI_CAPABLE
113488d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_ofb : &aes_256_ofb;
113588d3205aSjsing #else
113688d3205aSjsing 	return &aes_256_ofb;
113788d3205aSjsing #endif
113888d3205aSjsing }
11399bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_ofb);
114088d3205aSjsing 
114188d3205aSjsing #ifdef AESNI_CAPABLE
114288d3205aSjsing static const EVP_CIPHER aesni_256_cfb = {
114388d3205aSjsing 	.nid = NID_aes_256_cfb128,
114488d3205aSjsing 	.block_size = 1,
1145e986f667Sjsing 	.key_len = 32,
114688d3205aSjsing 	.iv_len = 16,
114722b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
114888d3205aSjsing 	.init = aesni_init_key,
1149af21c550Sjsing 	.do_cipher = aes_cfb_cipher,
115088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
115188d3205aSjsing };
115288d3205aSjsing #endif
115388d3205aSjsing 
115488d3205aSjsing static const EVP_CIPHER aes_256_cfb = {
115588d3205aSjsing 	.nid = NID_aes_256_cfb128,
115688d3205aSjsing 	.block_size = 1,
1157e986f667Sjsing 	.key_len = 32,
115888d3205aSjsing 	.iv_len = 16,
115922b24b0eSjsing 	.flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE,
116088d3205aSjsing 	.init = aes_init_key,
116188d3205aSjsing 	.do_cipher = aes_cfb_cipher,
116288d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
116388d3205aSjsing };
116488d3205aSjsing 
116588d3205aSjsing const EVP_CIPHER *
1166e0aedb9aSbeck EVP_aes_256_cfb128(void)
116788d3205aSjsing {
116888d3205aSjsing #ifdef AESNI_CAPABLE
116988d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_cfb : &aes_256_cfb;
117088d3205aSjsing #else
117188d3205aSjsing 	return &aes_256_cfb;
117288d3205aSjsing #endif
117388d3205aSjsing }
11749bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_cfb128);
117588d3205aSjsing 
117688d3205aSjsing #ifdef AESNI_CAPABLE
117788d3205aSjsing static const EVP_CIPHER aesni_256_cfb1 = {
117888d3205aSjsing 	.nid = NID_aes_256_cfb1,
117988d3205aSjsing 	.block_size = 1,
1180e986f667Sjsing 	.key_len = 32,
118188d3205aSjsing 	.iv_len = 16,
118222b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
118388d3205aSjsing 	.init = aesni_init_key,
1184af21c550Sjsing 	.do_cipher = aes_cfb1_cipher,
118588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
118688d3205aSjsing };
118788d3205aSjsing #endif
118888d3205aSjsing 
118988d3205aSjsing static const EVP_CIPHER aes_256_cfb1 = {
119088d3205aSjsing 	.nid = NID_aes_256_cfb1,
119188d3205aSjsing 	.block_size = 1,
1192e986f667Sjsing 	.key_len = 32,
119388d3205aSjsing 	.iv_len = 16,
119422b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
119588d3205aSjsing 	.init = aes_init_key,
119688d3205aSjsing 	.do_cipher = aes_cfb1_cipher,
119788d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
119888d3205aSjsing };
119988d3205aSjsing 
120088d3205aSjsing const EVP_CIPHER *
120188d3205aSjsing EVP_aes_256_cfb1(void)
120288d3205aSjsing {
120388d3205aSjsing #ifdef AESNI_CAPABLE
120488d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_cfb1 : &aes_256_cfb1;
120588d3205aSjsing #else
120688d3205aSjsing 	return &aes_256_cfb1;
120788d3205aSjsing #endif
120888d3205aSjsing }
12099bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_cfb1);
121088d3205aSjsing 
121188d3205aSjsing #ifdef AESNI_CAPABLE
121288d3205aSjsing static const EVP_CIPHER aesni_256_cfb8 = {
121388d3205aSjsing 	.nid = NID_aes_256_cfb8,
121488d3205aSjsing 	.block_size = 1,
1215e986f667Sjsing 	.key_len = 32,
121688d3205aSjsing 	.iv_len = 16,
121722b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
121888d3205aSjsing 	.init = aesni_init_key,
1219af21c550Sjsing 	.do_cipher = aes_cfb8_cipher,
122088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
122188d3205aSjsing };
122288d3205aSjsing #endif
122388d3205aSjsing 
122488d3205aSjsing static const EVP_CIPHER aes_256_cfb8 = {
122588d3205aSjsing 	.nid = NID_aes_256_cfb8,
122688d3205aSjsing 	.block_size = 1,
1227e986f667Sjsing 	.key_len = 32,
122888d3205aSjsing 	.iv_len = 16,
122922b24b0eSjsing 	.flags = EVP_CIPH_CFB_MODE,
123088d3205aSjsing 	.init = aes_init_key,
123188d3205aSjsing 	.do_cipher = aes_cfb8_cipher,
123288d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
123388d3205aSjsing };
123488d3205aSjsing 
123588d3205aSjsing const EVP_CIPHER *
123688d3205aSjsing EVP_aes_256_cfb8(void)
123788d3205aSjsing {
123888d3205aSjsing #ifdef AESNI_CAPABLE
123988d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_cfb8 : &aes_256_cfb8;
124088d3205aSjsing #else
124188d3205aSjsing 	return &aes_256_cfb8;
124288d3205aSjsing #endif
124388d3205aSjsing }
12449bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_cfb8);
124588d3205aSjsing 
124688d3205aSjsing #ifdef AESNI_CAPABLE
124788d3205aSjsing static const EVP_CIPHER aesni_256_ctr = {
124888d3205aSjsing 	.nid = NID_aes_256_ctr,
124988d3205aSjsing 	.block_size = 1,
1250e986f667Sjsing 	.key_len = 32,
125188d3205aSjsing 	.iv_len = 16,
125222b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
125388d3205aSjsing 	.init = aesni_init_key,
1254af21c550Sjsing 	.do_cipher = aes_ctr_cipher,
125588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
125688d3205aSjsing };
125788d3205aSjsing #endif
125888d3205aSjsing 
125988d3205aSjsing static const EVP_CIPHER aes_256_ctr = {
126088d3205aSjsing 	.nid = NID_aes_256_ctr,
126188d3205aSjsing 	.block_size = 1,
1262e986f667Sjsing 	.key_len = 32,
126388d3205aSjsing 	.iv_len = 16,
126422b24b0eSjsing 	.flags = EVP_CIPH_CTR_MODE,
126588d3205aSjsing 	.init = aes_init_key,
126688d3205aSjsing 	.do_cipher = aes_ctr_cipher,
126788d3205aSjsing 	.ctx_size = sizeof(EVP_AES_KEY),
126888d3205aSjsing };
126988d3205aSjsing 
127088d3205aSjsing const EVP_CIPHER *
127188d3205aSjsing EVP_aes_256_ctr(void)
127288d3205aSjsing {
127388d3205aSjsing #ifdef AESNI_CAPABLE
127488d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_ctr : &aes_256_ctr;
127588d3205aSjsing #else
127688d3205aSjsing 	return &aes_256_ctr;
127788d3205aSjsing #endif
127888d3205aSjsing }
12799bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_ctr);
12805cdd308eSdjm 
1281d8fdcedaStb static int
1282ba3920edSjsing aes_gcm_cleanup(EVP_CIPHER_CTX *c)
12835cdd308eSdjm {
12845cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = c->cipher_data;
1285ba3920edSjsing 
12865cdd308eSdjm 	if (gctx->iv != c->iv)
12876f3a6cb1Sbeck 		free(gctx->iv);
1288b8185953Sjsing 
12890f777b12Sjsing 	explicit_bzero(gctx, sizeof(*gctx));
1290d8fdcedaStb 
1291d8fdcedaStb 	return 1;
12925cdd308eSdjm }
12935cdd308eSdjm 
12945cdd308eSdjm /* increment counter (64-bit int) by 1 */
1295ba3920edSjsing static void
12965ffa517cSjsing ctr64_inc(unsigned char *counter)
12975ffa517cSjsing {
12985cdd308eSdjm 	int n = 8;
12995cdd308eSdjm 	unsigned char  c;
13005cdd308eSdjm 
13015cdd308eSdjm 	do {
13025cdd308eSdjm 		--n;
13035cdd308eSdjm 		c = counter[n];
13045cdd308eSdjm 		++c;
13055cdd308eSdjm 		counter[n] = c;
1306ba3920edSjsing 		if (c)
1307ba3920edSjsing 			return;
13085cdd308eSdjm 	} while (n);
13095cdd308eSdjm }
13105cdd308eSdjm 
1311ba3920edSjsing static int
1312ba3920edSjsing aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
13135cdd308eSdjm {
13145cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = c->cipher_data;
1315ba3920edSjsing 
1316ba3920edSjsing 	switch (type) {
13175cdd308eSdjm 	case EVP_CTRL_INIT:
13185cdd308eSdjm 		gctx->key_set = 0;
13195cdd308eSdjm 		gctx->iv_set = 0;
13209ebe8809Stb 		if (c->cipher->iv_len == 0) {
13219ebe8809Stb 			EVPerror(EVP_R_INVALID_IV_LENGTH);
13229ebe8809Stb 			return 0;
13239ebe8809Stb 		}
13245cdd308eSdjm 		gctx->ivlen = c->cipher->iv_len;
13255cdd308eSdjm 		gctx->iv = c->iv;
13265cdd308eSdjm 		gctx->taglen = -1;
13275cdd308eSdjm 		gctx->iv_gen = 0;
13285cdd308eSdjm 		gctx->tls_aad_len = -1;
13295cdd308eSdjm 		return 1;
13305cdd308eSdjm 
133177e08d39Stb 	case EVP_CTRL_AEAD_GET_IVLEN:
133277e08d39Stb 		*(int *)ptr = gctx->ivlen;
133377e08d39Stb 		return 1;
133477e08d39Stb 
133577e08d39Stb 	case EVP_CTRL_AEAD_SET_IVLEN:
13365cdd308eSdjm 		if (arg <= 0)
13375cdd308eSdjm 			return 0;
13385cdd308eSdjm 		/* Allocate memory for IV if needed */
1339ba3920edSjsing 		if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen)) {
13405cdd308eSdjm 			if (gctx->iv != c->iv)
13416f3a6cb1Sbeck 				free(gctx->iv);
13426f3a6cb1Sbeck 			gctx->iv = malloc(arg);
13435cdd308eSdjm 			if (!gctx->iv)
13445cdd308eSdjm 				return 0;
13455cdd308eSdjm 		}
13465cdd308eSdjm 		gctx->ivlen = arg;
13475cdd308eSdjm 		return 1;
13485cdd308eSdjm 
13495cdd308eSdjm 	case EVP_CTRL_GCM_SET_TAG:
13505cdd308eSdjm 		if (arg <= 0 || arg > 16 || c->encrypt)
13515cdd308eSdjm 			return 0;
13525cdd308eSdjm 		memcpy(c->buf, ptr, arg);
13535cdd308eSdjm 		gctx->taglen = arg;
13545cdd308eSdjm 		return 1;
13555cdd308eSdjm 
13565cdd308eSdjm 	case EVP_CTRL_GCM_GET_TAG:
13575cdd308eSdjm 		if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
13585cdd308eSdjm 			return 0;
13595cdd308eSdjm 		memcpy(ptr, c->buf, arg);
13605cdd308eSdjm 		return 1;
13615cdd308eSdjm 
13625cdd308eSdjm 	case EVP_CTRL_GCM_SET_IV_FIXED:
13635cdd308eSdjm 		/* Special case: -1 length restores whole IV */
1364ba3920edSjsing 		if (arg == -1) {
13655cdd308eSdjm 			memcpy(gctx->iv, ptr, gctx->ivlen);
13665cdd308eSdjm 			gctx->iv_gen = 1;
13675cdd308eSdjm 			return 1;
13685cdd308eSdjm 		}
13695cdd308eSdjm 		/* Fixed field must be at least 4 bytes and invocation field
13705cdd308eSdjm 		 * at least 8.
13715cdd308eSdjm 		 */
13725cdd308eSdjm 		if ((arg < 4) || (gctx->ivlen - arg) < 8)
13735cdd308eSdjm 			return 0;
13745cdd308eSdjm 		if (arg)
13755cdd308eSdjm 			memcpy(gctx->iv, ptr, arg);
1376ef624301Sjsing 		if (c->encrypt)
1377ef624301Sjsing 			arc4random_buf(gctx->iv + arg, gctx->ivlen - arg);
13785cdd308eSdjm 		gctx->iv_gen = 1;
13795cdd308eSdjm 		return 1;
13805cdd308eSdjm 
13815cdd308eSdjm 	case EVP_CTRL_GCM_IV_GEN:
13825cdd308eSdjm 		if (gctx->iv_gen == 0 || gctx->key_set == 0)
13835cdd308eSdjm 			return 0;
13845cdd308eSdjm 		CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
13855cdd308eSdjm 		if (arg <= 0 || arg > gctx->ivlen)
13865cdd308eSdjm 			arg = gctx->ivlen;
13875cdd308eSdjm 		memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
13885cdd308eSdjm 		/* Invocation field will be at least 8 bytes in size and
13895cdd308eSdjm 		 * so no need to check wrap around or increment more than
13905cdd308eSdjm 		 * last 8 bytes.
13915cdd308eSdjm 		 */
13925cdd308eSdjm 		ctr64_inc(gctx->iv + gctx->ivlen - 8);
13935cdd308eSdjm 		gctx->iv_set = 1;
13945cdd308eSdjm 		return 1;
13955cdd308eSdjm 
13965cdd308eSdjm 	case EVP_CTRL_GCM_SET_IV_INV:
13975cdd308eSdjm 		if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
13985cdd308eSdjm 			return 0;
13995cdd308eSdjm 		memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
14005cdd308eSdjm 		CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
14015cdd308eSdjm 		gctx->iv_set = 1;
14025cdd308eSdjm 		return 1;
14035cdd308eSdjm 
14045cdd308eSdjm 	case EVP_CTRL_AEAD_TLS1_AAD:
14055cdd308eSdjm 		/* Save the AAD for later use */
14065cdd308eSdjm 		if (arg != 13)
14075cdd308eSdjm 			return 0;
14085cdd308eSdjm 		memcpy(c->buf, ptr, arg);
14095cdd308eSdjm 		gctx->tls_aad_len = arg;
14105cdd308eSdjm 		{
1411ba3920edSjsing 			unsigned int len = c->buf[arg - 2] << 8 |
1412ba3920edSjsing 			    c->buf[arg - 1];
1413ba3920edSjsing 
14145cdd308eSdjm 			/* Correct length for explicit IV */
1415afe21ec4Sinoguchi 			if (len < EVP_GCM_TLS_EXPLICIT_IV_LEN)
1416afe21ec4Sinoguchi 				return 0;
14175cdd308eSdjm 			len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
1418ba3920edSjsing 
14195cdd308eSdjm 			/* If decrypting correct for tag too */
1420afe21ec4Sinoguchi 			if (!c->encrypt) {
1421afe21ec4Sinoguchi 				if (len < EVP_GCM_TLS_TAG_LEN)
1422afe21ec4Sinoguchi 					return 0;
14235cdd308eSdjm 				len -= EVP_GCM_TLS_TAG_LEN;
1424afe21ec4Sinoguchi 			}
14255cdd308eSdjm 			c->buf[arg - 2] = len >> 8;
14265cdd308eSdjm 			c->buf[arg - 1] = len & 0xff;
14275cdd308eSdjm 		}
14285cdd308eSdjm 		/* Extra padding: tag appended to record */
14295cdd308eSdjm 		return EVP_GCM_TLS_TAG_LEN;
14305cdd308eSdjm 
143182bbfebbSmiod 	case EVP_CTRL_COPY:
143282bbfebbSmiod 	    {
143382bbfebbSmiod 		EVP_CIPHER_CTX *out = ptr;
143482bbfebbSmiod 		EVP_AES_GCM_CTX *gctx_out = out->cipher_data;
143582bbfebbSmiod 
14369262e070Stb 		if (gctx->gcm.key) {
14379262e070Stb 			if (gctx->gcm.key != &gctx->ks)
14389262e070Stb 				return 0;
14399262e070Stb 			gctx_out->gcm.key = &gctx_out->ks;
14409262e070Stb 		}
14419262e070Stb 
144257e7da8eSjsing 		if (gctx->iv == c->iv) {
144382bbfebbSmiod 			gctx_out->iv = out->iv;
144457e7da8eSjsing 		} else {
144557e7da8eSjsing 			if ((gctx_out->iv = calloc(1, gctx->ivlen)) == NULL)
144682bbfebbSmiod 				return 0;
144782bbfebbSmiod 			memcpy(gctx_out->iv, gctx->iv, gctx->ivlen);
144882bbfebbSmiod 		}
144982bbfebbSmiod 		return 1;
145082bbfebbSmiod 	    }
145182bbfebbSmiod 
14525cdd308eSdjm 	default:
14535cdd308eSdjm 		return -1;
14545cdd308eSdjm 
14555cdd308eSdjm 	}
14565cdd308eSdjm }
14575cdd308eSdjm 
1458fc0ee2ebSjsing static ctr128_f
1459fc0ee2ebSjsing aes_gcm_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx,
1460fc0ee2ebSjsing     const unsigned char *key, size_t key_len)
1461fc0ee2ebSjsing {
1462fc0ee2ebSjsing #ifdef BSAES_CAPABLE
1463fc0ee2ebSjsing 	if (BSAES_CAPABLE) {
1464fc0ee2ebSjsing 		AES_set_encrypt_key(key, key_len * 8, aes_key);
1465fc0ee2ebSjsing 		CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
1466fc0ee2ebSjsing 		return (ctr128_f)bsaes_ctr32_encrypt_blocks;
1467fc0ee2ebSjsing 	} else
1468fc0ee2ebSjsing #endif
1469fc0ee2ebSjsing #ifdef VPAES_CAPABLE
1470fc0ee2ebSjsing 	if (VPAES_CAPABLE) {
1471fc0ee2ebSjsing 		vpaes_set_encrypt_key(key, key_len * 8, aes_key);
1472fc0ee2ebSjsing 		CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)vpaes_encrypt);
1473fc0ee2ebSjsing 		return NULL;
1474fc0ee2ebSjsing 	} else
1475fc0ee2ebSjsing #endif
1476fc0ee2ebSjsing 		(void)0; /* terminate potentially open 'else' */
1477fc0ee2ebSjsing 
1478fc0ee2ebSjsing 	AES_set_encrypt_key(key, key_len * 8, aes_key);
1479fc0ee2ebSjsing 	CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
1480fc0ee2ebSjsing #ifdef AES_CTR_ASM
1481fc0ee2ebSjsing 	return (ctr128_f)AES_ctr32_encrypt;
1482fc0ee2ebSjsing #else
1483fc0ee2ebSjsing 	return NULL;
1484fc0ee2ebSjsing #endif
1485fc0ee2ebSjsing }
1486fc0ee2ebSjsing 
1487ba3920edSjsing static int
1488ba3920edSjsing aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
14895cdd308eSdjm     const unsigned char *iv, int enc)
14905cdd308eSdjm {
14915cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1492ba3920edSjsing 
14935cdd308eSdjm 	if (!iv && !key)
14945cdd308eSdjm 		return 1;
1495ba3920edSjsing 	if (key) {
1496fc0ee2ebSjsing 		gctx->ctr = aes_gcm_set_key(&gctx->ks, &gctx->gcm,
1497fc0ee2ebSjsing 		    key, ctx->key_len);
14985cdd308eSdjm 
14995cdd308eSdjm 		/* If we have an iv can set it directly, otherwise use
15005cdd308eSdjm 		 * saved IV.
15015cdd308eSdjm 		 */
15025cdd308eSdjm 		if (iv == NULL && gctx->iv_set)
15035cdd308eSdjm 			iv = gctx->iv;
1504ba3920edSjsing 		if (iv) {
15055cdd308eSdjm 			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
15065cdd308eSdjm 			gctx->iv_set = 1;
15075cdd308eSdjm 		}
15085cdd308eSdjm 		gctx->key_set = 1;
1509ba3920edSjsing 	} else {
15105cdd308eSdjm 		/* If key set use IV, otherwise copy */
15115cdd308eSdjm 		if (gctx->key_set)
15125cdd308eSdjm 			CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
15135cdd308eSdjm 		else
15145cdd308eSdjm 			memcpy(gctx->iv, iv, gctx->ivlen);
15155cdd308eSdjm 		gctx->iv_set = 1;
15165cdd308eSdjm 		gctx->iv_gen = 0;
15175cdd308eSdjm 	}
15185cdd308eSdjm 	return 1;
15195cdd308eSdjm }
15205cdd308eSdjm 
15215cdd308eSdjm /* Handle TLS GCM packet format. This consists of the last portion of the IV
15225cdd308eSdjm  * followed by the payload and finally the tag. On encrypt generate IV,
15235cdd308eSdjm  * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
15245cdd308eSdjm  * and verify tag.
15255cdd308eSdjm  */
15265cdd308eSdjm 
1527ba3920edSjsing static int
1528ba3920edSjsing aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
15295cdd308eSdjm     const unsigned char *in, size_t len)
15305cdd308eSdjm {
15315cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
15325cdd308eSdjm 	int rv = -1;
1533ba3920edSjsing 
15345cdd308eSdjm 	/* Encrypt/decrypt must be performed in place */
1535ba3920edSjsing 	if (out != in ||
1536ba3920edSjsing 	    len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
15375cdd308eSdjm 		return -1;
1538ba3920edSjsing 
15395cdd308eSdjm 	/* Set IV from start of buffer or generate IV and write to start
15405cdd308eSdjm 	 * of buffer.
15415cdd308eSdjm 	 */
15425cdd308eSdjm 	if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
15435cdd308eSdjm 	    EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
15445cdd308eSdjm 	    EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
15455cdd308eSdjm 		goto err;
1546ba3920edSjsing 
15475cdd308eSdjm 	/* Use saved AAD */
15485cdd308eSdjm 	if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
15495cdd308eSdjm 		goto err;
1550ba3920edSjsing 
15515cdd308eSdjm 	/* Fix buffer and length to point to payload */
15525cdd308eSdjm 	in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
15535cdd308eSdjm 	out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
15545cdd308eSdjm 	len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1555ba3920edSjsing 	if (ctx->encrypt) {
15565cdd308eSdjm 		/* Encrypt payload */
1557ba3920edSjsing 		if (gctx->ctr) {
1558ba3920edSjsing 			if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm, in, out,
1559ba3920edSjsing 			    len, gctx->ctr))
15605cdd308eSdjm 				goto err;
1561ba3920edSjsing 		} else {
15625cdd308eSdjm 			if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
15635cdd308eSdjm 				goto err;
15645cdd308eSdjm 		}
15655cdd308eSdjm 		out += len;
1566ba3920edSjsing 
15675cdd308eSdjm 		/* Finally write tag */
15685cdd308eSdjm 		CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
15695cdd308eSdjm 		rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1570ba3920edSjsing 	} else {
15715cdd308eSdjm 		/* Decrypt */
1572ba3920edSjsing 		if (gctx->ctr) {
1573ba3920edSjsing 			if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm, in, out,
1574ba3920edSjsing 			    len, gctx->ctr))
15755cdd308eSdjm 				goto err;
1576ba3920edSjsing 		} else {
15775cdd308eSdjm 			if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
15785cdd308eSdjm 				goto err;
15795cdd308eSdjm 		}
15805cdd308eSdjm 		/* Retrieve tag */
1581ba3920edSjsing 		CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, EVP_GCM_TLS_TAG_LEN);
1582ba3920edSjsing 
15835cdd308eSdjm 		/* If tag mismatch wipe buffer */
1584ba3920edSjsing 		if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) {
15850f777b12Sjsing 			explicit_bzero(out, len);
15865cdd308eSdjm 			goto err;
15875cdd308eSdjm 		}
15885cdd308eSdjm 		rv = len;
15895cdd308eSdjm 	}
15905cdd308eSdjm 
15915cdd308eSdjm err:
15925cdd308eSdjm 	gctx->iv_set = 0;
15935cdd308eSdjm 	gctx->tls_aad_len = -1;
15945cdd308eSdjm 	return rv;
15955cdd308eSdjm }
15965cdd308eSdjm 
1597ba3920edSjsing static int
1598ba3920edSjsing aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
15995cdd308eSdjm     const unsigned char *in, size_t len)
16005cdd308eSdjm {
16015cdd308eSdjm 	EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1602ba3920edSjsing 
16035cdd308eSdjm 	/* If not set up, return error */
16045cdd308eSdjm 	if (!gctx->key_set)
16055cdd308eSdjm 		return -1;
16065cdd308eSdjm 
16075cdd308eSdjm 	if (gctx->tls_aad_len >= 0)
16085cdd308eSdjm 		return aes_gcm_tls_cipher(ctx, out, in, len);
16095cdd308eSdjm 
16105cdd308eSdjm 	if (!gctx->iv_set)
16115cdd308eSdjm 		return -1;
1612ba3920edSjsing 
1613ba3920edSjsing 	if (in) {
1614ba3920edSjsing 		if (out == NULL) {
16155cdd308eSdjm 			if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
16165cdd308eSdjm 				return -1;
1617ba3920edSjsing 		} else if (ctx->encrypt) {
1618ba3920edSjsing 			if (gctx->ctr) {
16195cdd308eSdjm 				if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
1620ba3920edSjsing 				    in, out, len, gctx->ctr))
1621ba3920edSjsing 					return -1;
1622ba3920edSjsing 			} else {
1623ba3920edSjsing 				if (CRYPTO_gcm128_encrypt(&gctx->gcm,
1624ba3920edSjsing 				    in, out, len))
16255cdd308eSdjm 					return -1;
16265cdd308eSdjm 			}
1627ba3920edSjsing 		} else {
1628ba3920edSjsing 			if (gctx->ctr) {
16295cdd308eSdjm 				if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
1630ba3920edSjsing 				    in, out, len, gctx->ctr))
16315cdd308eSdjm 					return -1;
1632ba3920edSjsing 			} else {
1633ba3920edSjsing 				if (CRYPTO_gcm128_decrypt(&gctx->gcm,
1634ba3920edSjsing 				    in, out, len))
16355cdd308eSdjm 					return -1;
16365cdd308eSdjm 			}
16375cdd308eSdjm 		}
16385cdd308eSdjm 		return len;
1639ba3920edSjsing 	} else {
1640ba3920edSjsing 		if (!ctx->encrypt) {
164197222eddSmiod 			if (gctx->taglen < 0)
164297222eddSmiod 				return -1;
1643ba3920edSjsing 			if (CRYPTO_gcm128_finish(&gctx->gcm, ctx->buf,
1644ba3920edSjsing 			    gctx->taglen) != 0)
16455cdd308eSdjm 				return -1;
16465cdd308eSdjm 			gctx->iv_set = 0;
16475cdd308eSdjm 			return 0;
16485cdd308eSdjm 		}
16495cdd308eSdjm 		CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
16505cdd308eSdjm 		gctx->taglen = 16;
1651ba3920edSjsing 
16525cdd308eSdjm 		/* Don't reuse the IV */
16535cdd308eSdjm 		gctx->iv_set = 0;
16545cdd308eSdjm 		return 0;
16555cdd308eSdjm 	}
16565cdd308eSdjm 
16575cdd308eSdjm }
16585cdd308eSdjm 
165982bbfebbSmiod #define CUSTOM_FLAGS \
166082bbfebbSmiod     ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \
166177e08d39Stb       EVP_CIPH_FLAG_CUSTOM_IV_LENGTH | \
166282bbfebbSmiod       EVP_CIPH_FLAG_CUSTOM_CIPHER | EVP_CIPH_ALWAYS_CALL_INIT | \
166382bbfebbSmiod       EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY )
16645cdd308eSdjm 
166588d3205aSjsing 
166688d3205aSjsing #ifdef AESNI_CAPABLE
166788d3205aSjsing static const EVP_CIPHER aesni_128_gcm = {
166888d3205aSjsing 	.nid = NID_aes_128_gcm,
166988d3205aSjsing 	.block_size = 1,
1670e986f667Sjsing 	.key_len = 16,
167188d3205aSjsing 	.iv_len = 12,
167222b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
167388d3205aSjsing 	.init = aesni_gcm_init_key,
1674af21c550Sjsing 	.do_cipher = aes_gcm_cipher,
167588d3205aSjsing 	.cleanup = aes_gcm_cleanup,
167688d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
167788d3205aSjsing 	.ctrl = aes_gcm_ctrl,
167888d3205aSjsing };
167988d3205aSjsing #endif
168088d3205aSjsing 
168188d3205aSjsing static const EVP_CIPHER aes_128_gcm = {
168288d3205aSjsing 	.nid = NID_aes_128_gcm,
168388d3205aSjsing 	.block_size = 1,
1684e986f667Sjsing 	.key_len = 16,
168588d3205aSjsing 	.iv_len = 12,
168622b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
168788d3205aSjsing 	.init = aes_gcm_init_key,
168888d3205aSjsing 	.do_cipher = aes_gcm_cipher,
168988d3205aSjsing 	.cleanup = aes_gcm_cleanup,
169088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
169188d3205aSjsing 	.ctrl = aes_gcm_ctrl,
169288d3205aSjsing };
169388d3205aSjsing 
169488d3205aSjsing const EVP_CIPHER *
169588d3205aSjsing EVP_aes_128_gcm(void)
169688d3205aSjsing {
169788d3205aSjsing #ifdef AESNI_CAPABLE
169888d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_gcm : &aes_128_gcm;
169988d3205aSjsing #else
170088d3205aSjsing 	return &aes_128_gcm;
170188d3205aSjsing #endif
170288d3205aSjsing }
17039bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_gcm);
170488d3205aSjsing 
170588d3205aSjsing #ifdef AESNI_CAPABLE
170688d3205aSjsing static const EVP_CIPHER aesni_192_gcm = {
170788d3205aSjsing 	.nid = NID_aes_192_gcm,
170888d3205aSjsing 	.block_size = 1,
1709e986f667Sjsing 	.key_len = 24,
171088d3205aSjsing 	.iv_len = 12,
171122b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
171288d3205aSjsing 	.init = aesni_gcm_init_key,
1713af21c550Sjsing 	.do_cipher = aes_gcm_cipher,
171488d3205aSjsing 	.cleanup = aes_gcm_cleanup,
171588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
171688d3205aSjsing 	.ctrl = aes_gcm_ctrl,
171788d3205aSjsing };
171888d3205aSjsing #endif
171988d3205aSjsing 
172088d3205aSjsing static const EVP_CIPHER aes_192_gcm = {
172188d3205aSjsing 	.nid = NID_aes_192_gcm,
172288d3205aSjsing 	.block_size = 1,
1723e986f667Sjsing 	.key_len = 24,
172488d3205aSjsing 	.iv_len = 12,
172522b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
172688d3205aSjsing 	.init = aes_gcm_init_key,
172788d3205aSjsing 	.do_cipher = aes_gcm_cipher,
172888d3205aSjsing 	.cleanup = aes_gcm_cleanup,
172988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
173088d3205aSjsing 	.ctrl = aes_gcm_ctrl,
173188d3205aSjsing };
173288d3205aSjsing 
173388d3205aSjsing const EVP_CIPHER *
173488d3205aSjsing EVP_aes_192_gcm(void)
173588d3205aSjsing {
173688d3205aSjsing #ifdef AESNI_CAPABLE
173788d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_gcm : &aes_192_gcm;
173888d3205aSjsing #else
173988d3205aSjsing 	return &aes_192_gcm;
174088d3205aSjsing #endif
174188d3205aSjsing }
17429bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_gcm);
174388d3205aSjsing 
174488d3205aSjsing #ifdef AESNI_CAPABLE
174588d3205aSjsing static const EVP_CIPHER aesni_256_gcm = {
174688d3205aSjsing 	.nid = NID_aes_256_gcm,
174788d3205aSjsing 	.block_size = 1,
1748e986f667Sjsing 	.key_len = 32,
174988d3205aSjsing 	.iv_len = 12,
175022b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
175188d3205aSjsing 	.init = aesni_gcm_init_key,
1752af21c550Sjsing 	.do_cipher = aes_gcm_cipher,
175388d3205aSjsing 	.cleanup = aes_gcm_cleanup,
175488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
175588d3205aSjsing 	.ctrl = aes_gcm_ctrl,
175688d3205aSjsing };
175788d3205aSjsing #endif
175888d3205aSjsing 
175988d3205aSjsing static const EVP_CIPHER aes_256_gcm = {
176088d3205aSjsing 	.nid = NID_aes_256_gcm,
176188d3205aSjsing 	.block_size = 1,
1762e986f667Sjsing 	.key_len = 32,
176388d3205aSjsing 	.iv_len = 12,
176422b24b0eSjsing 	.flags = EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS | EVP_CIPH_GCM_MODE,
176588d3205aSjsing 	.init = aes_gcm_init_key,
176688d3205aSjsing 	.do_cipher = aes_gcm_cipher,
176788d3205aSjsing 	.cleanup = aes_gcm_cleanup,
176888d3205aSjsing 	.ctx_size = sizeof(EVP_AES_GCM_CTX),
176988d3205aSjsing 	.ctrl = aes_gcm_ctrl,
177088d3205aSjsing };
177188d3205aSjsing 
177288d3205aSjsing const EVP_CIPHER *
177388d3205aSjsing EVP_aes_256_gcm(void)
177488d3205aSjsing {
177588d3205aSjsing #ifdef AESNI_CAPABLE
177688d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_gcm : &aes_256_gcm;
177788d3205aSjsing #else
177888d3205aSjsing 	return &aes_256_gcm;
177988d3205aSjsing #endif
178088d3205aSjsing }
17819bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_gcm);
17825cdd308eSdjm 
1783ba3920edSjsing static int
1784ba3920edSjsing aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
17855cdd308eSdjm {
17865cdd308eSdjm 	EVP_AES_XTS_CTX *xctx = c->cipher_data;
1787ba3920edSjsing 
178882bbfebbSmiod 	switch (type) {
178982bbfebbSmiod 	case EVP_CTRL_INIT:
179082bbfebbSmiod 		/*
179182bbfebbSmiod 		 * key1 and key2 are used as an indicator both key and IV
179282bbfebbSmiod 		 * are set
179382bbfebbSmiod 		 */
17945cdd308eSdjm 		xctx->xts.key1 = NULL;
17955cdd308eSdjm 		xctx->xts.key2 = NULL;
17965cdd308eSdjm 		return 1;
179782bbfebbSmiod 
179882bbfebbSmiod 	case EVP_CTRL_COPY:
179982bbfebbSmiod 	    {
180082bbfebbSmiod 		EVP_CIPHER_CTX *out = ptr;
180182bbfebbSmiod 		EVP_AES_XTS_CTX *xctx_out = out->cipher_data;
180282bbfebbSmiod 
180382bbfebbSmiod 		if (xctx->xts.key1) {
180482bbfebbSmiod 			if (xctx->xts.key1 != &xctx->ks1)
180582bbfebbSmiod 				return 0;
180682bbfebbSmiod 			xctx_out->xts.key1 = &xctx_out->ks1;
180782bbfebbSmiod 		}
180882bbfebbSmiod 		if (xctx->xts.key2) {
180982bbfebbSmiod 			if (xctx->xts.key2 != &xctx->ks2)
181082bbfebbSmiod 				return 0;
181182bbfebbSmiod 			xctx_out->xts.key2 = &xctx_out->ks2;
181282bbfebbSmiod 		}
181382bbfebbSmiod 		return 1;
181482bbfebbSmiod 	    }
181582bbfebbSmiod 	}
181682bbfebbSmiod 	return -1;
18175cdd308eSdjm }
18185cdd308eSdjm 
1819ba3920edSjsing static int
1820ba3920edSjsing aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
18215cdd308eSdjm     const unsigned char *iv, int enc)
18225cdd308eSdjm {
18235cdd308eSdjm 	EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1824ba3920edSjsing 
18255cdd308eSdjm 	if (!iv && !key)
18265cdd308eSdjm 		return 1;
18275cdd308eSdjm 
1828ba3920edSjsing 	if (key) do {
18295cdd308eSdjm #ifdef AES_XTS_ASM
18305cdd308eSdjm 		xctx->stream = enc ? AES_xts_encrypt : AES_xts_decrypt;
18315cdd308eSdjm #else
18325cdd308eSdjm 		xctx->stream = NULL;
18335cdd308eSdjm #endif
18345cdd308eSdjm 		/* key_len is two AES keys */
18355cdd308eSdjm #ifdef BSAES_CAPABLE
18365cdd308eSdjm 		if (BSAES_CAPABLE)
1837ba3920edSjsing 			xctx->stream = enc ? bsaes_xts_encrypt :
1838ba3920edSjsing 			    bsaes_xts_decrypt;
18395cdd308eSdjm 		else
18405cdd308eSdjm #endif
18415cdd308eSdjm #ifdef VPAES_CAPABLE
1842ba3920edSjsing 		if (VPAES_CAPABLE) {
1843ba3920edSjsing 			if (enc) {
1844ba3920edSjsing 				vpaes_set_encrypt_key(key, ctx->key_len * 4,
1845ba3920edSjsing 				    &xctx->ks1);
18465cdd308eSdjm 				xctx->xts.block1 = (block128_f)vpaes_encrypt;
1847ba3920edSjsing 			} else {
1848ba3920edSjsing 				vpaes_set_decrypt_key(key, ctx->key_len * 4,
1849ba3920edSjsing 				    &xctx->ks1);
18505cdd308eSdjm 				xctx->xts.block1 = (block128_f)vpaes_decrypt;
18515cdd308eSdjm 			}
18525cdd308eSdjm 
18535cdd308eSdjm 			vpaes_set_encrypt_key(key + ctx->key_len / 2,
18545cdd308eSdjm 			    ctx->key_len * 4, &xctx->ks2);
18555cdd308eSdjm 			xctx->xts.block2 = (block128_f)vpaes_encrypt;
18565cdd308eSdjm 
18575cdd308eSdjm 			xctx->xts.key1 = &xctx->ks1;
18585cdd308eSdjm 			break;
1859ba3920edSjsing 		} else
18605cdd308eSdjm #endif
186197222eddSmiod 			(void)0;	/* terminate potentially open 'else' */
186297222eddSmiod 
1863ba3920edSjsing 		if (enc) {
18645cdd308eSdjm 			AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
18655cdd308eSdjm 			xctx->xts.block1 = (block128_f)AES_encrypt;
1866ba3920edSjsing 		} else {
18675cdd308eSdjm 			AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
18685cdd308eSdjm 			xctx->xts.block1 = (block128_f)AES_decrypt;
18695cdd308eSdjm 		}
18705cdd308eSdjm 
18715cdd308eSdjm 		AES_set_encrypt_key(key + ctx->key_len / 2,
18725cdd308eSdjm 		    ctx->key_len * 4, &xctx->ks2);
18735cdd308eSdjm 		xctx->xts.block2 = (block128_f)AES_encrypt;
18745cdd308eSdjm 
18755cdd308eSdjm 		xctx->xts.key1 = &xctx->ks1;
18765cdd308eSdjm 	} while (0);
18775cdd308eSdjm 
1878ba3920edSjsing 	if (iv) {
18795cdd308eSdjm 		xctx->xts.key2 = &xctx->ks2;
18805cdd308eSdjm 		memcpy(ctx->iv, iv, 16);
18815cdd308eSdjm 	}
18825cdd308eSdjm 
18835cdd308eSdjm 	return 1;
18845cdd308eSdjm }
18855cdd308eSdjm 
1886ba3920edSjsing static int
1887ba3920edSjsing aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
18885cdd308eSdjm     const unsigned char *in, size_t len)
18895cdd308eSdjm {
18905cdd308eSdjm 	EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1891ba3920edSjsing 
18925cdd308eSdjm 	if (!xctx->xts.key1 || !xctx->xts.key2)
18935cdd308eSdjm 		return 0;
18945cdd308eSdjm 	if (!out || !in || len < AES_BLOCK_SIZE)
18955cdd308eSdjm 		return 0;
1896ba3920edSjsing 
18975cdd308eSdjm 	if (xctx->stream)
1898ba3920edSjsing 		(*xctx->stream)(in, out, len, xctx->xts.key1, xctx->xts.key2,
1899ba3920edSjsing 		    ctx->iv);
19005cdd308eSdjm 	else if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
19015cdd308eSdjm 	    ctx->encrypt))
19025cdd308eSdjm 		return 0;
19035cdd308eSdjm 	return 1;
19045cdd308eSdjm }
19055cdd308eSdjm 
190682bbfebbSmiod #define XTS_FLAGS \
190782bbfebbSmiod     ( EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV | \
190882bbfebbSmiod       EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY )
19095cdd308eSdjm 
191088d3205aSjsing 
191188d3205aSjsing #ifdef AESNI_CAPABLE
191288d3205aSjsing static const EVP_CIPHER aesni_128_xts = {
191388d3205aSjsing 	.nid = NID_aes_128_xts,
191488d3205aSjsing 	.block_size = 1,
1915e986f667Sjsing 	.key_len = 2 * 16,
191688d3205aSjsing 	.iv_len = 16,
191722b24b0eSjsing 	.flags = XTS_FLAGS | EVP_CIPH_XTS_MODE,
191888d3205aSjsing 	.init = aesni_xts_init_key,
1919af21c550Sjsing 	.do_cipher = aes_xts_cipher,
1920f1c66056Sjsing 	.cleanup = NULL,
192188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_XTS_CTX),
192288d3205aSjsing 	.ctrl = aes_xts_ctrl,
192388d3205aSjsing };
192488d3205aSjsing #endif
192588d3205aSjsing 
192688d3205aSjsing static const EVP_CIPHER aes_128_xts = {
192788d3205aSjsing 	.nid = NID_aes_128_xts,
192888d3205aSjsing 	.block_size = 1,
1929e986f667Sjsing 	.key_len = 2 * 16,
193088d3205aSjsing 	.iv_len = 16,
193122b24b0eSjsing 	.flags = XTS_FLAGS | EVP_CIPH_XTS_MODE,
193288d3205aSjsing 	.init = aes_xts_init_key,
193388d3205aSjsing 	.do_cipher = aes_xts_cipher,
1934f1c66056Sjsing 	.cleanup = NULL,
193588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_XTS_CTX),
193688d3205aSjsing 	.ctrl = aes_xts_ctrl,
193788d3205aSjsing };
193888d3205aSjsing 
193988d3205aSjsing const EVP_CIPHER *
194088d3205aSjsing EVP_aes_128_xts(void)
194188d3205aSjsing {
194288d3205aSjsing #ifdef AESNI_CAPABLE
194388d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_xts : &aes_128_xts;
194488d3205aSjsing #else
194588d3205aSjsing 	return &aes_128_xts;
194688d3205aSjsing #endif
194788d3205aSjsing }
19489bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_xts);
194988d3205aSjsing 
195088d3205aSjsing #ifdef AESNI_CAPABLE
195188d3205aSjsing static const EVP_CIPHER aesni_256_xts = {
195288d3205aSjsing 	.nid = NID_aes_256_xts,
195388d3205aSjsing 	.block_size = 1,
1954e986f667Sjsing 	.key_len = 2 * 32,
195588d3205aSjsing 	.iv_len = 16,
195622b24b0eSjsing 	.flags = XTS_FLAGS | EVP_CIPH_XTS_MODE,
195788d3205aSjsing 	.init = aesni_xts_init_key,
1958af21c550Sjsing 	.do_cipher = aes_xts_cipher,
1959f1c66056Sjsing 	.cleanup = NULL,
196088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_XTS_CTX),
196188d3205aSjsing 	.ctrl = aes_xts_ctrl,
196288d3205aSjsing };
196388d3205aSjsing #endif
196488d3205aSjsing 
196588d3205aSjsing static const EVP_CIPHER aes_256_xts = {
196688d3205aSjsing 	.nid = NID_aes_256_xts,
196788d3205aSjsing 	.block_size = 1,
1968e986f667Sjsing 	.key_len = 2 * 32,
196988d3205aSjsing 	.iv_len = 16,
197022b24b0eSjsing 	.flags = XTS_FLAGS | EVP_CIPH_XTS_MODE,
197188d3205aSjsing 	.init = aes_xts_init_key,
197288d3205aSjsing 	.do_cipher = aes_xts_cipher,
1973f1c66056Sjsing 	.cleanup = NULL,
197488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_XTS_CTX),
197588d3205aSjsing 	.ctrl = aes_xts_ctrl,
197688d3205aSjsing };
197788d3205aSjsing 
197888d3205aSjsing const EVP_CIPHER *
197988d3205aSjsing EVP_aes_256_xts(void)
198088d3205aSjsing {
198188d3205aSjsing #ifdef AESNI_CAPABLE
198288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_xts : &aes_256_xts;
198388d3205aSjsing #else
198488d3205aSjsing 	return &aes_256_xts;
198588d3205aSjsing #endif
198688d3205aSjsing }
19879bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_xts);
19885cdd308eSdjm 
1989ba3920edSjsing static int
1990ba3920edSjsing aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
19915cdd308eSdjm {
19925cdd308eSdjm 	EVP_AES_CCM_CTX *cctx = c->cipher_data;
1993ba3920edSjsing 
1994ba3920edSjsing 	switch (type) {
19955cdd308eSdjm 	case EVP_CTRL_INIT:
19965cdd308eSdjm 		cctx->key_set = 0;
19975cdd308eSdjm 		cctx->iv_set = 0;
19985cdd308eSdjm 		cctx->L = 8;
19995cdd308eSdjm 		cctx->M = 12;
20005cdd308eSdjm 		cctx->tag_set = 0;
20015cdd308eSdjm 		cctx->len_set = 0;
20025cdd308eSdjm 		return 1;
20035cdd308eSdjm 
200477e08d39Stb 	case EVP_CTRL_AEAD_GET_IVLEN:
200577e08d39Stb 		*(int *)ptr = 15 - cctx->L;
200677e08d39Stb 		return 1;
200777e08d39Stb 
200877e08d39Stb 	case EVP_CTRL_AEAD_SET_IVLEN:
20095cdd308eSdjm 		arg = 15 - arg;
2010ba3920edSjsing 
20115cdd308eSdjm 	case EVP_CTRL_CCM_SET_L:
20125cdd308eSdjm 		if (arg < 2 || arg > 8)
20135cdd308eSdjm 			return 0;
20145cdd308eSdjm 		cctx->L = arg;
20155cdd308eSdjm 		return 1;
20165cdd308eSdjm 
20175cdd308eSdjm 	case EVP_CTRL_CCM_SET_TAG:
20185cdd308eSdjm 		if ((arg & 1) || arg < 4 || arg > 16)
20195cdd308eSdjm 			return 0;
20205cdd308eSdjm 		if ((c->encrypt && ptr) || (!c->encrypt && !ptr))
20215cdd308eSdjm 			return 0;
2022ba3920edSjsing 		if (ptr) {
20235cdd308eSdjm 			cctx->tag_set = 1;
20245cdd308eSdjm 			memcpy(c->buf, ptr, arg);
20255cdd308eSdjm 		}
20265cdd308eSdjm 		cctx->M = arg;
20275cdd308eSdjm 		return 1;
20285cdd308eSdjm 
20295cdd308eSdjm 	case EVP_CTRL_CCM_GET_TAG:
20305cdd308eSdjm 		if (!c->encrypt || !cctx->tag_set)
20315cdd308eSdjm 			return 0;
20325cdd308eSdjm 		if (!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
20335cdd308eSdjm 			return 0;
20345cdd308eSdjm 		cctx->tag_set = 0;
20355cdd308eSdjm 		cctx->iv_set = 0;
20365cdd308eSdjm 		cctx->len_set = 0;
20375cdd308eSdjm 		return 1;
20385cdd308eSdjm 
203982bbfebbSmiod 	case EVP_CTRL_COPY:
2040fc5c647fStb 	    {
2041fc5c647fStb 		EVP_CIPHER_CTX *out = ptr;
2042fc5c647fStb 		EVP_AES_CCM_CTX *cctx_out = out->cipher_data;
2043fc5c647fStb 
2044fc5c647fStb 		if (cctx->ccm.key) {
2045fc5c647fStb 			if (cctx->ccm.key != &cctx->ks)
2046fc5c647fStb 				return 0;
2047fc5c647fStb 			cctx_out->ccm.key = &cctx_out->ks;
2048fc5c647fStb 		}
204982bbfebbSmiod 		return 1;
2050fc5c647fStb 	    }
205182bbfebbSmiod 
20525cdd308eSdjm 	default:
20535cdd308eSdjm 		return -1;
20545cdd308eSdjm 	}
20555cdd308eSdjm }
20565cdd308eSdjm 
2057ba3920edSjsing static int
2058ba3920edSjsing aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
20595cdd308eSdjm     const unsigned char *iv, int enc)
20605cdd308eSdjm {
20615cdd308eSdjm 	EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
2062ba3920edSjsing 
20635cdd308eSdjm 	if (!iv && !key)
20645cdd308eSdjm 		return 1;
2065ba3920edSjsing 	if (key) do {
20665cdd308eSdjm #ifdef VPAES_CAPABLE
2067ba3920edSjsing 		if (VPAES_CAPABLE) {
20685cdd308eSdjm 			vpaes_set_encrypt_key(key, ctx->key_len*8, &cctx->ks);
20695cdd308eSdjm 			CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
20705cdd308eSdjm 			    &cctx->ks, (block128_f)vpaes_encrypt);
207197222eddSmiod 			cctx->str = NULL;
20725cdd308eSdjm 			cctx->key_set = 1;
20735cdd308eSdjm 			break;
20745cdd308eSdjm 		}
20755cdd308eSdjm #endif
20765cdd308eSdjm 		AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
20775cdd308eSdjm 		CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
20785cdd308eSdjm 		    &cctx->ks, (block128_f)AES_encrypt);
20795cdd308eSdjm 		cctx->str = NULL;
20805cdd308eSdjm 		cctx->key_set = 1;
20815cdd308eSdjm 	} while (0);
2082ba3920edSjsing 	if (iv) {
20835cdd308eSdjm 		memcpy(ctx->iv, iv, 15 - cctx->L);
20845cdd308eSdjm 		cctx->iv_set = 1;
20855cdd308eSdjm 	}
20865cdd308eSdjm 	return 1;
20875cdd308eSdjm }
20885cdd308eSdjm 
2089ba3920edSjsing static int
2090ba3920edSjsing aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
20915cdd308eSdjm     const unsigned char *in, size_t len)
20925cdd308eSdjm {
20935cdd308eSdjm 	EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
20945cdd308eSdjm 	CCM128_CONTEXT *ccm = &cctx->ccm;
2095ba3920edSjsing 
20965cdd308eSdjm 	/* If not set up, return error */
20975cdd308eSdjm 	if (!cctx->iv_set && !cctx->key_set)
20985cdd308eSdjm 		return -1;
20995cdd308eSdjm 	if (!ctx->encrypt && !cctx->tag_set)
21005cdd308eSdjm 		return -1;
2101ba3920edSjsing 
2102ba3920edSjsing 	if (!out) {
2103ba3920edSjsing 		if (!in) {
2104ba3920edSjsing 			if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,
2105ba3920edSjsing 			    len))
21065cdd308eSdjm 				return -1;
21075cdd308eSdjm 			cctx->len_set = 1;
21085cdd308eSdjm 			return len;
21095cdd308eSdjm 		}
21105cdd308eSdjm 		/* If have AAD need message length */
21115cdd308eSdjm 		if (!cctx->len_set && len)
21125cdd308eSdjm 			return -1;
21135cdd308eSdjm 		CRYPTO_ccm128_aad(ccm, in, len);
21145cdd308eSdjm 		return len;
21155cdd308eSdjm 	}
21165cdd308eSdjm 	/* EVP_*Final() doesn't return any data */
21175cdd308eSdjm 	if (!in)
21185cdd308eSdjm 		return 0;
21195cdd308eSdjm 	/* If not set length yet do it */
2120ba3920edSjsing 	if (!cctx->len_set) {
21215cdd308eSdjm 		if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
21225cdd308eSdjm 			return -1;
21235cdd308eSdjm 		cctx->len_set = 1;
21245cdd308eSdjm 	}
2125ba3920edSjsing 	if (ctx->encrypt) {
21265cdd308eSdjm 		if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
2127ba3920edSjsing 		    cctx->str) : CRYPTO_ccm128_encrypt(ccm, in, out, len))
21285cdd308eSdjm 			return -1;
21295cdd308eSdjm 		cctx->tag_set = 1;
21305cdd308eSdjm 		return len;
2131ba3920edSjsing 	} else {
21325cdd308eSdjm 		int rv = -1;
21335cdd308eSdjm 		if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
2134ba3920edSjsing 		    cctx->str) : !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
21355cdd308eSdjm 			unsigned char tag[16];
2136ba3920edSjsing 			if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
21375cdd308eSdjm 				if (!memcmp(tag, ctx->buf, cctx->M))
21385cdd308eSdjm 					rv = len;
21395cdd308eSdjm 			}
21405cdd308eSdjm 		}
21415cdd308eSdjm 		if (rv == -1)
21420f777b12Sjsing 			explicit_bzero(out, len);
21435cdd308eSdjm 		cctx->iv_set = 0;
21445cdd308eSdjm 		cctx->tag_set = 0;
21455cdd308eSdjm 		cctx->len_set = 0;
21465cdd308eSdjm 		return rv;
21475cdd308eSdjm 	}
21485cdd308eSdjm 
21495cdd308eSdjm }
21505cdd308eSdjm 
215188d3205aSjsing #ifdef AESNI_CAPABLE
215288d3205aSjsing static const EVP_CIPHER aesni_128_ccm = {
215388d3205aSjsing 	.nid = NID_aes_128_ccm,
215488d3205aSjsing 	.block_size = 1,
2155e986f667Sjsing 	.key_len = 16,
215688d3205aSjsing 	.iv_len = 12,
215722b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
215888d3205aSjsing 	.init = aesni_ccm_init_key,
2159af21c550Sjsing 	.do_cipher = aes_ccm_cipher,
2160f1c66056Sjsing 	.cleanup = NULL,
216188d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
216288d3205aSjsing 	.ctrl = aes_ccm_ctrl,
216388d3205aSjsing };
216488d3205aSjsing #endif
216588d3205aSjsing 
216688d3205aSjsing static const EVP_CIPHER aes_128_ccm = {
216788d3205aSjsing 	.nid = NID_aes_128_ccm,
216888d3205aSjsing 	.block_size = 1,
2169e986f667Sjsing 	.key_len = 16,
217088d3205aSjsing 	.iv_len = 12,
217122b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
217288d3205aSjsing 	.init = aes_ccm_init_key,
217388d3205aSjsing 	.do_cipher = aes_ccm_cipher,
2174f1c66056Sjsing 	.cleanup = NULL,
217588d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
217688d3205aSjsing 	.ctrl = aes_ccm_ctrl,
217788d3205aSjsing };
217888d3205aSjsing 
217988d3205aSjsing const EVP_CIPHER *
218088d3205aSjsing EVP_aes_128_ccm(void)
218188d3205aSjsing {
218288d3205aSjsing #ifdef AESNI_CAPABLE
218388d3205aSjsing 	return AESNI_CAPABLE ? &aesni_128_ccm : &aes_128_ccm;
218488d3205aSjsing #else
218588d3205aSjsing 	return &aes_128_ccm;
218688d3205aSjsing #endif
218788d3205aSjsing }
21889bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_ccm);
218988d3205aSjsing 
219088d3205aSjsing #ifdef AESNI_CAPABLE
219188d3205aSjsing static const EVP_CIPHER aesni_192_ccm = {
219288d3205aSjsing 	.nid = NID_aes_192_ccm,
219388d3205aSjsing 	.block_size = 1,
2194e986f667Sjsing 	.key_len = 24,
219588d3205aSjsing 	.iv_len = 12,
219622b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
219788d3205aSjsing 	.init = aesni_ccm_init_key,
2198af21c550Sjsing 	.do_cipher = aes_ccm_cipher,
2199f1c66056Sjsing 	.cleanup = NULL,
220088d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
220188d3205aSjsing 	.ctrl = aes_ccm_ctrl,
220288d3205aSjsing };
220388d3205aSjsing #endif
220488d3205aSjsing 
220588d3205aSjsing static const EVP_CIPHER aes_192_ccm = {
220688d3205aSjsing 	.nid = NID_aes_192_ccm,
220788d3205aSjsing 	.block_size = 1,
2208e986f667Sjsing 	.key_len = 24,
220988d3205aSjsing 	.iv_len = 12,
221022b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
221188d3205aSjsing 	.init = aes_ccm_init_key,
221288d3205aSjsing 	.do_cipher = aes_ccm_cipher,
2213f1c66056Sjsing 	.cleanup = NULL,
221488d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
221588d3205aSjsing 	.ctrl = aes_ccm_ctrl,
221688d3205aSjsing };
221788d3205aSjsing 
221888d3205aSjsing const EVP_CIPHER *
221988d3205aSjsing EVP_aes_192_ccm(void)
222088d3205aSjsing {
222188d3205aSjsing #ifdef AESNI_CAPABLE
222288d3205aSjsing 	return AESNI_CAPABLE ? &aesni_192_ccm : &aes_192_ccm;
222388d3205aSjsing #else
222488d3205aSjsing 	return &aes_192_ccm;
222588d3205aSjsing #endif
222688d3205aSjsing }
22279bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_ccm);
222888d3205aSjsing 
222988d3205aSjsing #ifdef AESNI_CAPABLE
223088d3205aSjsing static const EVP_CIPHER aesni_256_ccm = {
223188d3205aSjsing 	.nid = NID_aes_256_ccm,
223288d3205aSjsing 	.block_size = 1,
2233e986f667Sjsing 	.key_len = 32,
223488d3205aSjsing 	.iv_len = 12,
223522b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
223688d3205aSjsing 	.init = aesni_ccm_init_key,
2237af21c550Sjsing 	.do_cipher = aes_ccm_cipher,
2238f1c66056Sjsing 	.cleanup = NULL,
223988d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
224088d3205aSjsing 	.ctrl = aes_ccm_ctrl,
224188d3205aSjsing };
224288d3205aSjsing #endif
224388d3205aSjsing 
224488d3205aSjsing static const EVP_CIPHER aes_256_ccm = {
224588d3205aSjsing 	.nid = NID_aes_256_ccm,
224688d3205aSjsing 	.block_size = 1,
2247e986f667Sjsing 	.key_len = 32,
224888d3205aSjsing 	.iv_len = 12,
224922b24b0eSjsing 	.flags = CUSTOM_FLAGS | EVP_CIPH_CCM_MODE,
225088d3205aSjsing 	.init = aes_ccm_init_key,
225188d3205aSjsing 	.do_cipher = aes_ccm_cipher,
2252f1c66056Sjsing 	.cleanup = NULL,
225388d3205aSjsing 	.ctx_size = sizeof(EVP_AES_CCM_CTX),
225488d3205aSjsing 	.ctrl = aes_ccm_ctrl,
225588d3205aSjsing };
225688d3205aSjsing 
225788d3205aSjsing const EVP_CIPHER *
225888d3205aSjsing EVP_aes_256_ccm(void)
225988d3205aSjsing {
226088d3205aSjsing #ifdef AESNI_CAPABLE
226188d3205aSjsing 	return AESNI_CAPABLE ? &aesni_256_ccm : &aes_256_ccm;
226288d3205aSjsing #else
226388d3205aSjsing 	return &aes_256_ccm;
226488d3205aSjsing #endif
226588d3205aSjsing }
22669bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_ccm);
22675cdd308eSdjm 
2268fc0ee2ebSjsing #define EVP_AEAD_AES_GCM_TAG_LEN 16
2269fc0ee2ebSjsing 
2270fc0ee2ebSjsing struct aead_aes_gcm_ctx {
2271fc0ee2ebSjsing 	union {
2272fc0ee2ebSjsing 		double align;
2273fc0ee2ebSjsing 		AES_KEY ks;
2274fc0ee2ebSjsing 	} ks;
2275fc0ee2ebSjsing 	GCM128_CONTEXT gcm;
2276fc0ee2ebSjsing 	ctr128_f ctr;
2277fc0ee2ebSjsing 	unsigned char tag_len;
2278fc0ee2ebSjsing };
2279fc0ee2ebSjsing 
2280fc0ee2ebSjsing static int
2281fc0ee2ebSjsing aead_aes_gcm_init(EVP_AEAD_CTX *ctx, const unsigned char *key, size_t key_len,
2282fc0ee2ebSjsing     size_t tag_len)
2283fc0ee2ebSjsing {
2284fc0ee2ebSjsing 	struct aead_aes_gcm_ctx *gcm_ctx;
2285fc0ee2ebSjsing 	const size_t key_bits = key_len * 8;
2286fc0ee2ebSjsing 
2287dda9d7c0Sjsing 	/* EVP_AEAD_CTX_init should catch this. */
2288fc0ee2ebSjsing 	if (key_bits != 128 && key_bits != 256) {
22895067ae9fSbeck 		EVPerror(EVP_R_BAD_KEY_LENGTH);
2290dda9d7c0Sjsing 		return 0;
2291fc0ee2ebSjsing 	}
2292fc0ee2ebSjsing 
2293fc0ee2ebSjsing 	if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH)
2294fc0ee2ebSjsing 		tag_len = EVP_AEAD_AES_GCM_TAG_LEN;
2295fc0ee2ebSjsing 
2296fc0ee2ebSjsing 	if (tag_len > EVP_AEAD_AES_GCM_TAG_LEN) {
22975067ae9fSbeck 		EVPerror(EVP_R_TAG_TOO_LARGE);
2298fc0ee2ebSjsing 		return 0;
2299fc0ee2ebSjsing 	}
2300fc0ee2ebSjsing 
230157e7da8eSjsing 	if ((gcm_ctx = calloc(1, sizeof(struct aead_aes_gcm_ctx))) == NULL)
2302fc0ee2ebSjsing 		return 0;
2303fc0ee2ebSjsing 
2304fc0ee2ebSjsing #ifdef AESNI_CAPABLE
2305fc0ee2ebSjsing 	if (AESNI_CAPABLE) {
2306fc0ee2ebSjsing 		aesni_set_encrypt_key(key, key_bits, &gcm_ctx->ks.ks);
2307fc0ee2ebSjsing 		CRYPTO_gcm128_init(&gcm_ctx->gcm, &gcm_ctx->ks.ks,
2308fc0ee2ebSjsing 		    (block128_f)aesni_encrypt);
2309fc0ee2ebSjsing 		gcm_ctx->ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
2310fc0ee2ebSjsing 	} else
2311fc0ee2ebSjsing #endif
2312fc0ee2ebSjsing 	{
2313fc0ee2ebSjsing 		gcm_ctx->ctr = aes_gcm_set_key(&gcm_ctx->ks.ks, &gcm_ctx->gcm,
2314fc0ee2ebSjsing 		    key, key_len);
2315fc0ee2ebSjsing 	}
2316fc0ee2ebSjsing 	gcm_ctx->tag_len = tag_len;
2317fc0ee2ebSjsing 	ctx->aead_state = gcm_ctx;
2318fc0ee2ebSjsing 
2319fc0ee2ebSjsing 	return 1;
2320fc0ee2ebSjsing }
2321fc0ee2ebSjsing 
2322fc0ee2ebSjsing static void
2323fc0ee2ebSjsing aead_aes_gcm_cleanup(EVP_AEAD_CTX *ctx)
2324fc0ee2ebSjsing {
2325fc0ee2ebSjsing 	struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state;
2326fc0ee2ebSjsing 
23277de8a684Sderaadt 	freezero(gcm_ctx, sizeof(*gcm_ctx));
2328fc0ee2ebSjsing }
2329fc0ee2ebSjsing 
2330dda9d7c0Sjsing static int
2331dda9d7c0Sjsing aead_aes_gcm_seal(const EVP_AEAD_CTX *ctx, unsigned char *out, size_t *out_len,
2332fc0ee2ebSjsing     size_t max_out_len, const unsigned char *nonce, size_t nonce_len,
2333fc0ee2ebSjsing     const unsigned char *in, size_t in_len, const unsigned char *ad,
2334fc0ee2ebSjsing     size_t ad_len)
2335fc0ee2ebSjsing {
2336fc0ee2ebSjsing 	const struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state;
2337fc0ee2ebSjsing 	GCM128_CONTEXT gcm;
2338dda9d7c0Sjsing 	size_t bulk = 0;
2339fc0ee2ebSjsing 
2340fc0ee2ebSjsing 	if (max_out_len < in_len + gcm_ctx->tag_len) {
23415067ae9fSbeck 		EVPerror(EVP_R_BUFFER_TOO_SMALL);
2342dda9d7c0Sjsing 		return 0;
2343fc0ee2ebSjsing 	}
2344fc0ee2ebSjsing 
2345fc0ee2ebSjsing 	memcpy(&gcm, &gcm_ctx->gcm, sizeof(gcm));
2346539125b0Stb 
2347539125b0Stb 	if (nonce_len == 0) {
2348539125b0Stb 		EVPerror(EVP_R_INVALID_IV_LENGTH);
2349539125b0Stb 		return 0;
2350539125b0Stb 	}
2351fc0ee2ebSjsing 	CRYPTO_gcm128_setiv(&gcm, nonce, nonce_len);
2352fc0ee2ebSjsing 
2353fc0ee2ebSjsing 	if (ad_len > 0 && CRYPTO_gcm128_aad(&gcm, ad, ad_len))
2354dda9d7c0Sjsing 		return 0;
2355fc0ee2ebSjsing 
2356fc0ee2ebSjsing 	if (gcm_ctx->ctr) {
2357fc0ee2ebSjsing 		if (CRYPTO_gcm128_encrypt_ctr32(&gcm, in + bulk, out + bulk,
2358fc0ee2ebSjsing 		    in_len - bulk, gcm_ctx->ctr))
2359dda9d7c0Sjsing 			return 0;
2360fc0ee2ebSjsing 	} else {
2361fc0ee2ebSjsing 		if (CRYPTO_gcm128_encrypt(&gcm, in + bulk, out + bulk,
2362fc0ee2ebSjsing 		    in_len - bulk))
2363dda9d7c0Sjsing 			return 0;
2364fc0ee2ebSjsing 	}
2365fc0ee2ebSjsing 
2366fc0ee2ebSjsing 	CRYPTO_gcm128_tag(&gcm, out + in_len, gcm_ctx->tag_len);
2367dda9d7c0Sjsing 	*out_len = in_len + gcm_ctx->tag_len;
2368dda9d7c0Sjsing 
2369dda9d7c0Sjsing 	return 1;
2370fc0ee2ebSjsing }
2371fc0ee2ebSjsing 
2372dda9d7c0Sjsing static int
2373dda9d7c0Sjsing aead_aes_gcm_open(const EVP_AEAD_CTX *ctx, unsigned char *out, size_t *out_len,
2374fc0ee2ebSjsing     size_t max_out_len, const unsigned char *nonce, size_t nonce_len,
2375fc0ee2ebSjsing     const unsigned char *in, size_t in_len, const unsigned char *ad,
2376fc0ee2ebSjsing     size_t ad_len)
2377fc0ee2ebSjsing {
2378fc0ee2ebSjsing 	const struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state;
2379fc0ee2ebSjsing 	unsigned char tag[EVP_AEAD_AES_GCM_TAG_LEN];
2380fc0ee2ebSjsing 	GCM128_CONTEXT gcm;
2381dda9d7c0Sjsing 	size_t plaintext_len;
2382dda9d7c0Sjsing 	size_t bulk = 0;
2383fc0ee2ebSjsing 
2384fc0ee2ebSjsing 	if (in_len < gcm_ctx->tag_len) {
23855067ae9fSbeck 		EVPerror(EVP_R_BAD_DECRYPT);
2386dda9d7c0Sjsing 		return 0;
2387fc0ee2ebSjsing 	}
2388fc0ee2ebSjsing 
2389dda9d7c0Sjsing 	plaintext_len = in_len - gcm_ctx->tag_len;
2390fc0ee2ebSjsing 
2391dda9d7c0Sjsing 	if (max_out_len < plaintext_len) {
23925067ae9fSbeck 		EVPerror(EVP_R_BUFFER_TOO_SMALL);
2393dda9d7c0Sjsing 		return 0;
2394fc0ee2ebSjsing 	}
2395fc0ee2ebSjsing 
2396fc0ee2ebSjsing 	memcpy(&gcm, &gcm_ctx->gcm, sizeof(gcm));
2397539125b0Stb 
2398539125b0Stb 	if (nonce_len == 0) {
2399539125b0Stb 		EVPerror(EVP_R_INVALID_IV_LENGTH);
2400539125b0Stb 		return 0;
2401539125b0Stb 	}
2402fc0ee2ebSjsing 	CRYPTO_gcm128_setiv(&gcm, nonce, nonce_len);
2403fc0ee2ebSjsing 
2404fc0ee2ebSjsing 	if (CRYPTO_gcm128_aad(&gcm, ad, ad_len))
2405dda9d7c0Sjsing 		return 0;
2406fc0ee2ebSjsing 
2407fc0ee2ebSjsing 	if (gcm_ctx->ctr) {
2408fc0ee2ebSjsing 		if (CRYPTO_gcm128_decrypt_ctr32(&gcm, in + bulk, out + bulk,
2409fc0ee2ebSjsing 		    in_len - bulk - gcm_ctx->tag_len, gcm_ctx->ctr))
2410dda9d7c0Sjsing 			return 0;
2411fc0ee2ebSjsing 	} else {
2412fc0ee2ebSjsing 		if (CRYPTO_gcm128_decrypt(&gcm, in + bulk, out + bulk,
2413fc0ee2ebSjsing 		    in_len - bulk - gcm_ctx->tag_len))
2414dda9d7c0Sjsing 			return 0;
2415fc0ee2ebSjsing 	}
2416fc0ee2ebSjsing 
2417fc0ee2ebSjsing 	CRYPTO_gcm128_tag(&gcm, tag, gcm_ctx->tag_len);
2418e88e0363Sjsing 	if (timingsafe_memcmp(tag, in + plaintext_len, gcm_ctx->tag_len) != 0) {
24195067ae9fSbeck 		EVPerror(EVP_R_BAD_DECRYPT);
2420dda9d7c0Sjsing 		return 0;
2421fc0ee2ebSjsing 	}
2422fc0ee2ebSjsing 
2423dda9d7c0Sjsing 	*out_len = plaintext_len;
2424dda9d7c0Sjsing 
2425dda9d7c0Sjsing 	return 1;
2426fc0ee2ebSjsing }
2427fc0ee2ebSjsing 
2428fc0ee2ebSjsing static const EVP_AEAD aead_aes_128_gcm = {
2429fc0ee2ebSjsing 	.key_len = 16,
2430fc0ee2ebSjsing 	.nonce_len = 12,
2431fc0ee2ebSjsing 	.overhead = EVP_AEAD_AES_GCM_TAG_LEN,
2432fc0ee2ebSjsing 	.max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN,
2433fc0ee2ebSjsing 
2434fc0ee2ebSjsing 	.init = aead_aes_gcm_init,
2435fc0ee2ebSjsing 	.cleanup = aead_aes_gcm_cleanup,
2436fc0ee2ebSjsing 	.seal = aead_aes_gcm_seal,
2437fc0ee2ebSjsing 	.open = aead_aes_gcm_open,
2438fc0ee2ebSjsing };
2439fc0ee2ebSjsing 
2440fc0ee2ebSjsing static const EVP_AEAD aead_aes_256_gcm = {
2441fc0ee2ebSjsing 	.key_len = 32,
2442fc0ee2ebSjsing 	.nonce_len = 12,
2443fc0ee2ebSjsing 	.overhead = EVP_AEAD_AES_GCM_TAG_LEN,
2444fc0ee2ebSjsing 	.max_tag_len = EVP_AEAD_AES_GCM_TAG_LEN,
2445fc0ee2ebSjsing 
2446fc0ee2ebSjsing 	.init = aead_aes_gcm_init,
2447fc0ee2ebSjsing 	.cleanup = aead_aes_gcm_cleanup,
2448fc0ee2ebSjsing 	.seal = aead_aes_gcm_seal,
2449fc0ee2ebSjsing 	.open = aead_aes_gcm_open,
2450fc0ee2ebSjsing };
2451fc0ee2ebSjsing 
2452fc0ee2ebSjsing const EVP_AEAD *
2453fc0ee2ebSjsing EVP_aead_aes_128_gcm(void)
2454fc0ee2ebSjsing {
2455fc0ee2ebSjsing 	return &aead_aes_128_gcm;
2456fc0ee2ebSjsing }
24579bac3682Sbeck LCRYPTO_ALIAS(EVP_aead_aes_128_gcm);
2458fc0ee2ebSjsing 
2459fc0ee2ebSjsing const EVP_AEAD *
2460fc0ee2ebSjsing EVP_aead_aes_256_gcm(void)
2461fc0ee2ebSjsing {
2462fc0ee2ebSjsing 	return &aead_aes_256_gcm;
2463fc0ee2ebSjsing }
24649bac3682Sbeck LCRYPTO_ALIAS(EVP_aead_aes_256_gcm);
2465fc0ee2ebSjsing 
24667bd97338Stb typedef struct {
24677bd97338Stb 	union {
24687bd97338Stb 		double align;
24697bd97338Stb 		AES_KEY ks;
24707bd97338Stb 	} ks;
24717bd97338Stb 	unsigned char *iv;
24727bd97338Stb } EVP_AES_WRAP_CTX;
24737bd97338Stb 
24747bd97338Stb static int
24757bd97338Stb aes_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
24767bd97338Stb     const unsigned char *iv, int enc)
24777bd97338Stb {
24787bd97338Stb 	EVP_AES_WRAP_CTX *wctx = (EVP_AES_WRAP_CTX *)ctx->cipher_data;
24797bd97338Stb 
24807bd97338Stb 	if (iv == NULL && key == NULL)
24817bd97338Stb 		return 1;
24827bd97338Stb 
24837bd97338Stb 	if (key != NULL) {
24847bd97338Stb 		if (ctx->encrypt)
24857bd97338Stb 			AES_set_encrypt_key(key, 8 * ctx->key_len,
24867bd97338Stb 			    &wctx->ks.ks);
24877bd97338Stb 		else
24887bd97338Stb 			AES_set_decrypt_key(key, 8 * ctx->key_len,
24897bd97338Stb 			    &wctx->ks.ks);
24907bd97338Stb 
24917bd97338Stb 		if (iv == NULL)
24927bd97338Stb 			wctx->iv = NULL;
24937bd97338Stb 	}
24947bd97338Stb 
24957bd97338Stb 	if (iv != NULL) {
24960a5044deStb 		int iv_len = EVP_CIPHER_CTX_iv_length(ctx);
24970a5044deStb 
24980a5044deStb 		if (iv_len < 0 || iv_len > sizeof(ctx->iv))
24990a5044deStb 			return 0;
25000a5044deStb 		memcpy(ctx->iv, iv, iv_len);
25017bd97338Stb 		wctx->iv = ctx->iv;
25027bd97338Stb 	}
25037bd97338Stb 
25047bd97338Stb 	return 1;
25057bd97338Stb }
25067bd97338Stb 
25077bd97338Stb static int
25087bd97338Stb aes_wrap_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
25097bd97338Stb     const unsigned char *in, size_t inlen)
25107bd97338Stb {
25117bd97338Stb 	EVP_AES_WRAP_CTX *wctx = ctx->cipher_data;
25127bd97338Stb 	int ret;
25137bd97338Stb 
25147bd97338Stb 	if (in == NULL)
25157bd97338Stb 		return 0;
25167bd97338Stb 
25177bd97338Stb 	if (inlen % 8 != 0)
25187bd97338Stb 		return -1;
25197bd97338Stb 	if (ctx->encrypt && inlen < 8)
25207bd97338Stb 		return -1;
25217bd97338Stb 	if (!ctx->encrypt && inlen < 16)
25227bd97338Stb 		return -1;
25237bd97338Stb 	if (inlen > INT_MAX)
25247bd97338Stb 		return -1;
25257bd97338Stb 
25267bd97338Stb 	if (out == NULL) {
25277bd97338Stb 		if (ctx->encrypt)
25287bd97338Stb 			return inlen + 8;
25297bd97338Stb 		else
25307bd97338Stb 			return inlen - 8;
25317bd97338Stb 	}
25327bd97338Stb 
25337bd97338Stb 	if (ctx->encrypt)
25347bd97338Stb 		ret = AES_wrap_key(&wctx->ks.ks, wctx->iv, out, in,
25357bd97338Stb 		    (unsigned int)inlen);
25367bd97338Stb 	else
25377bd97338Stb 		ret = AES_unwrap_key(&wctx->ks.ks, wctx->iv, out, in,
25387bd97338Stb 		    (unsigned int)inlen);
25397bd97338Stb 
25407bd97338Stb 	return ret != 0 ? ret : -1;
25417bd97338Stb }
25427bd97338Stb 
2543f72711c6Stb static int
2544f72711c6Stb aes_wrap_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
2545f72711c6Stb {
2546f72711c6Stb 	EVP_AES_WRAP_CTX *wctx = c->cipher_data;
2547f72711c6Stb 
2548f72711c6Stb 	switch (type) {
2549f72711c6Stb 	case EVP_CTRL_COPY:
2550f72711c6Stb 	    {
2551f72711c6Stb 		EVP_CIPHER_CTX *out = ptr;
2552f72711c6Stb 		EVP_AES_WRAP_CTX *wctx_out = out->cipher_data;
2553f72711c6Stb 
2554f72711c6Stb 		if (wctx->iv != NULL) {
2555f72711c6Stb 			if (c->iv != wctx->iv)
2556f72711c6Stb 				return 0;
2557f72711c6Stb 
2558f72711c6Stb 			wctx_out->iv = out->iv;
2559f72711c6Stb 		}
2560f72711c6Stb 
2561f72711c6Stb 		return 1;
2562f72711c6Stb 	    }
2563f72711c6Stb 	}
2564f72711c6Stb 
2565f72711c6Stb 	return -1;
2566f72711c6Stb }
2567f72711c6Stb 
25687bd97338Stb #define WRAP_FLAGS \
25697bd97338Stb     ( EVP_CIPH_WRAP_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | \
2570f72711c6Stb       EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1 | \
2571f72711c6Stb       EVP_CIPH_CUSTOM_COPY )
25727bd97338Stb 
25737bd97338Stb static const EVP_CIPHER aes_128_wrap = {
25747bd97338Stb 	.nid = NID_id_aes128_wrap,
25757bd97338Stb 	.block_size = 8,
25767bd97338Stb 	.key_len = 16,
25777bd97338Stb 	.iv_len = 8,
25787bd97338Stb 	.flags = WRAP_FLAGS,
25797bd97338Stb 	.init = aes_wrap_init_key,
25807bd97338Stb 	.do_cipher = aes_wrap_cipher,
25817bd97338Stb 	.cleanup = NULL,
25827bd97338Stb 	.ctx_size = sizeof(EVP_AES_WRAP_CTX),
25837bd97338Stb 	.set_asn1_parameters = NULL,
25847bd97338Stb 	.get_asn1_parameters = NULL,
2585f72711c6Stb 	.ctrl = aes_wrap_ctrl,
25867bd97338Stb };
25877bd97338Stb 
25887bd97338Stb const EVP_CIPHER *
25897bd97338Stb EVP_aes_128_wrap(void)
25907bd97338Stb {
25917bd97338Stb 	return &aes_128_wrap;
25927bd97338Stb }
25939bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_128_wrap);
25947bd97338Stb 
25957bd97338Stb static const EVP_CIPHER aes_192_wrap = {
25967bd97338Stb 	.nid = NID_id_aes192_wrap,
25977bd97338Stb 	.block_size = 8,
25987bd97338Stb 	.key_len = 24,
25997bd97338Stb 	.iv_len = 8,
26007bd97338Stb 	.flags = WRAP_FLAGS,
26017bd97338Stb 	.init = aes_wrap_init_key,
26027bd97338Stb 	.do_cipher = aes_wrap_cipher,
26037bd97338Stb 	.cleanup = NULL,
26047bd97338Stb 	.ctx_size = sizeof(EVP_AES_WRAP_CTX),
26057bd97338Stb 	.set_asn1_parameters = NULL,
26067bd97338Stb 	.get_asn1_parameters = NULL,
2607f72711c6Stb 	.ctrl = aes_wrap_ctrl,
26087bd97338Stb };
26097bd97338Stb 
26107bd97338Stb const EVP_CIPHER *
26117bd97338Stb EVP_aes_192_wrap(void)
26127bd97338Stb {
26137bd97338Stb 	return &aes_192_wrap;
26147bd97338Stb }
26159bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_192_wrap);
26167bd97338Stb 
26177bd97338Stb static const EVP_CIPHER aes_256_wrap = {
26187bd97338Stb 	.nid = NID_id_aes256_wrap,
26197bd97338Stb 	.block_size = 8,
26207bd97338Stb 	.key_len = 32,
26217bd97338Stb 	.iv_len = 8,
26227bd97338Stb 	.flags = WRAP_FLAGS,
26237bd97338Stb 	.init = aes_wrap_init_key,
26247bd97338Stb 	.do_cipher = aes_wrap_cipher,
26257bd97338Stb 	.cleanup = NULL,
26267bd97338Stb 	.ctx_size = sizeof(EVP_AES_WRAP_CTX),
26277bd97338Stb 	.set_asn1_parameters = NULL,
26287bd97338Stb 	.get_asn1_parameters = NULL,
2629f72711c6Stb 	.ctrl = aes_wrap_ctrl,
26307bd97338Stb };
26317bd97338Stb 
26327bd97338Stb const EVP_CIPHER *
26337bd97338Stb EVP_aes_256_wrap(void)
26347bd97338Stb {
26357bd97338Stb 	return &aes_256_wrap;
26367bd97338Stb }
26379bac3682Sbeck LCRYPTO_ALIAS(EVP_aes_256_wrap);
26387bd97338Stb 
26395cdd308eSdjm #endif
2640