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