Coverage Report

Created: 2022-11-30 06:20

/src/openssl/crypto/evp/e_aes.c
Line
Count
Source (jump to first uncovered line)
1
/* ====================================================================
2
 * Copyright (c) 2001-2011 The OpenSSL Project.  All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or without
5
 * modification, are permitted provided that the following conditions
6
 * are met:
7
 *
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 *
11
 * 2. Redistributions in binary form must reproduce the above copyright
12
 *    notice, this list of conditions and the following disclaimer in
13
 *    the documentation and/or other materials provided with the
14
 *    distribution.
15
 *
16
 * 3. All advertising materials mentioning features or use of this
17
 *    software must display the following acknowledgment:
18
 *    "This product includes software developed by the OpenSSL Project
19
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20
 *
21
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22
 *    endorse or promote products derived from this software without
23
 *    prior written permission. For written permission, please contact
24
 *    openssl-core@openssl.org.
25
 *
26
 * 5. Products derived from this software may not be called "OpenSSL"
27
 *    nor may "OpenSSL" appear in their names without prior written
28
 *    permission of the OpenSSL Project.
29
 *
30
 * 6. Redistributions of any form whatsoever must retain the following
31
 *    acknowledgment:
32
 *    "This product includes software developed by the OpenSSL Project
33
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34
 *
35
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46
 * OF THE POSSIBILITY OF SUCH DAMAGE.
47
 * ====================================================================
48
 *
49
 */
50
51
#include <openssl/opensslconf.h>
52
#ifndef OPENSSL_NO_AES
53
#include <openssl/crypto.h>
54
# include <openssl/evp.h>
55
# include <openssl/err.h>
56
# include <string.h>
57
# include <assert.h>
58
# include <openssl/aes.h>
59
# include "evp_locl.h"
60
# include "modes_lcl.h"
61
# include <openssl/rand.h>
62
63
# undef EVP_CIPH_FLAG_FIPS
64
# define EVP_CIPH_FLAG_FIPS 0
65
66
typedef struct {
67
    union {
68
        double align;
69
        AES_KEY ks;
70
    } ks;
71
    block128_f block;
72
    union {
73
        cbc128_f cbc;
74
        ctr128_f ctr;
75
    } stream;
76
} EVP_AES_KEY;
77
78
typedef struct {
79
    union {
80
        double align;
81
        AES_KEY ks;
82
    } ks;                       /* AES key schedule to use */
83
    int key_set;                /* Set if key initialised */
84
    int iv_set;                 /* Set if an iv is set */
85
    GCM128_CONTEXT gcm;
86
    unsigned char *iv;          /* Temporary IV store */
87
    int ivlen;                  /* IV length */
88
    int taglen;
89
    int iv_gen;                 /* It is OK to generate IVs */
90
    int tls_aad_len;            /* TLS AAD length */
91
    ctr128_f ctr;
92
} EVP_AES_GCM_CTX;
93
94
typedef struct {
95
    union {
96
        double align;
97
        AES_KEY ks;
98
    } ks1, ks2;                 /* AES key schedules to use */
99
    XTS128_CONTEXT xts;
100
    void (*stream) (const unsigned char *in,
101
                    unsigned char *out, size_t length,
102
                    const AES_KEY *key1, const AES_KEY *key2,
103
                    const unsigned char iv[16]);
104
} EVP_AES_XTS_CTX;
105
106
typedef struct {
107
    union {
108
        double align;
109
        AES_KEY ks;
110
    } ks;                       /* AES key schedule to use */
111
    int key_set;                /* Set if key initialised */
112
    int iv_set;                 /* Set if an iv is set */
113
    int tag_set;                /* Set if tag is valid */
114
    int len_set;                /* Set if message length set */
115
    int L, M;                   /* L and M parameters from RFC3610 */
116
    CCM128_CONTEXT ccm;
117
    ccm128_f str;
118
} EVP_AES_CCM_CTX;
119
120
0
# define MAXBITCHUNK     ((size_t)1<<(sizeof(size_t)*8-4))
121
122
# ifdef VPAES_ASM
123
int vpaes_set_encrypt_key(const unsigned char *userKey, int bits,
124
                          AES_KEY *key);
125
int vpaes_set_decrypt_key(const unsigned char *userKey, int bits,
126
                          AES_KEY *key);
127
128
void vpaes_encrypt(const unsigned char *in, unsigned char *out,
129
                   const AES_KEY *key);
130
void vpaes_decrypt(const unsigned char *in, unsigned char *out,
131
                   const AES_KEY *key);
132
133
void vpaes_cbc_encrypt(const unsigned char *in,
134
                       unsigned char *out,
135
                       size_t length,
136
                       const AES_KEY *key, unsigned char *ivec, int enc);
137
# endif
138
# ifdef BSAES_ASM
139
void bsaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
140
                       size_t length, const AES_KEY *key,
141
                       unsigned char ivec[16], int enc);
142
void bsaes_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
143
                                size_t len, const AES_KEY *key,
144
                                const unsigned char ivec[16]);
145
void bsaes_xts_encrypt(const unsigned char *inp, unsigned char *out,
146
                       size_t len, const AES_KEY *key1,
147
                       const AES_KEY *key2, const unsigned char iv[16]);
148
void bsaes_xts_decrypt(const unsigned char *inp, unsigned char *out,
149
                       size_t len, const AES_KEY *key1,
150
                       const AES_KEY *key2, const unsigned char iv[16]);
151
# endif
152
# ifdef AES_CTR_ASM
153
void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
154
                       size_t blocks, const AES_KEY *key,
155
                       const unsigned char ivec[AES_BLOCK_SIZE]);
156
# endif
157
# ifdef AES_XTS_ASM
158
void AES_xts_encrypt(const unsigned char *inp, unsigned char *out, size_t len,
159
                     const AES_KEY *key1, const AES_KEY *key2,
160
                     const unsigned char iv[16]);
161
void AES_xts_decrypt(const unsigned char *inp, unsigned char *out, size_t len,
162
                     const AES_KEY *key1, const AES_KEY *key2,
163
                     const unsigned char iv[16]);
164
# endif
165
166
# if     defined(OPENSSL_CPUID_OBJ) && (defined(__powerpc__) || defined(__ppc__) || defined(_ARCH_PPC))
167
#  include "ppc_arch.h"
168
#  ifdef VPAES_ASM
169
#   define VPAES_CAPABLE (OPENSSL_ppccap_P & PPC_ALTIVEC)
170
#  endif
171
#  define HWAES_CAPABLE  (OPENSSL_ppccap_P & PPC_CRYPTO207)
172
#  define HWAES_set_encrypt_key aes_p8_set_encrypt_key
173
#  define HWAES_set_decrypt_key aes_p8_set_decrypt_key
174
#  define HWAES_encrypt aes_p8_encrypt
175
#  define HWAES_decrypt aes_p8_decrypt
176
#  define HWAES_cbc_encrypt aes_p8_cbc_encrypt
177
#  define HWAES_ctr32_encrypt_blocks aes_p8_ctr32_encrypt_blocks
178
# endif
179
180
# if     defined(AES_ASM) && !defined(I386_ONLY) &&      (  \
181
        ((defined(__i386)       || defined(__i386__)    || \
182
          defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
183
        defined(__x86_64)       || defined(__x86_64__)  || \
184
        defined(_M_AMD64)       || defined(_M_X64)      || \
185
        defined(__INTEL__)                              )
186
187
extern unsigned int OPENSSL_ia32cap_P[];
188
189
#  ifdef VPAES_ASM
190
0
#   define VPAES_CAPABLE   (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
191
#  endif
192
#  ifdef BSAES_ASM
193
0
#   define BSAES_CAPABLE   (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
194
#  endif
195
/*
196
 * AES-NI section
197
 */
198
646
#  define AESNI_CAPABLE   (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
199
200
int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
201
                          AES_KEY *key);
202
int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
203
                          AES_KEY *key);
204
205
void aesni_encrypt(const unsigned char *in, unsigned char *out,
206
                   const AES_KEY *key);
207
void aesni_decrypt(const unsigned char *in, unsigned char *out,
208
                   const AES_KEY *key);
209
210
void aesni_ecb_encrypt(const unsigned char *in,
211
                       unsigned char *out,
212
                       size_t length, const AES_KEY *key, int enc);
213
void aesni_cbc_encrypt(const unsigned char *in,
214
                       unsigned char *out,
215
                       size_t length,
216
                       const AES_KEY *key, unsigned char *ivec, int enc);
217
218
void aesni_ctr32_encrypt_blocks(const unsigned char *in,
219
                                unsigned char *out,
220
                                size_t blocks,
221
                                const void *key, const unsigned char *ivec);
222
223
void aesni_xts_encrypt(const unsigned char *in,
224
                       unsigned char *out,
225
                       size_t length,
226
                       const AES_KEY *key1, const AES_KEY *key2,
227
                       const unsigned char iv[16]);
228
229
void aesni_xts_decrypt(const unsigned char *in,
230
                       unsigned char *out,
231
                       size_t length,
232
                       const AES_KEY *key1, const AES_KEY *key2,
233
                       const unsigned char iv[16]);
234
235
void aesni_ccm64_encrypt_blocks(const unsigned char *in,
236
                                unsigned char *out,
237
                                size_t blocks,
238
                                const void *key,
239
                                const unsigned char ivec[16],
240
                                unsigned char cmac[16]);
241
242
void aesni_ccm64_decrypt_blocks(const unsigned char *in,
243
                                unsigned char *out,
244
                                size_t blocks,
245
                                const void *key,
246
                                const unsigned char ivec[16],
247
                                unsigned char cmac[16]);
248
249
#  if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
250
size_t aesni_gcm_encrypt(const unsigned char *in,
251
                         unsigned char *out,
252
                         size_t len,
253
                         const void *key, unsigned char ivec[16], u64 *Xi);
254
0
#   define AES_gcm_encrypt aesni_gcm_encrypt
255
size_t aesni_gcm_decrypt(const unsigned char *in,
256
                         unsigned char *out,
257
                         size_t len,
258
                         const void *key, unsigned char ivec[16], u64 *Xi);
259
0
#   define AES_gcm_decrypt aesni_gcm_decrypt
260
void gcm_ghash_avx(u64 Xi[2], const u128 Htable[16], const u8 *in,
261
                   size_t len);
262
0
#   define AES_GCM_ASM(gctx)       (gctx->ctr==aesni_ctr32_encrypt_blocks && \
263
0
                                 gctx->gcm.ghash==gcm_ghash_avx)
264
#   define AES_GCM_ASM2(gctx)      (gctx->gcm.block==(block128_f)aesni_encrypt && \
265
                                 gctx->gcm.ghash==gcm_ghash_avx)
266
#   undef AES_GCM_ASM2          /* minor size optimization */
267
#  endif
268
269
static int aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
270
                          const unsigned char *iv, int enc)
271
0
{
272
0
    int ret, mode;
273
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
274
275
0
    mode = ctx->cipher->flags & EVP_CIPH_MODE;
276
0
    if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
277
0
        && !enc) {
278
0
        ret = aesni_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
279
0
        dat->block = (block128_f) aesni_decrypt;
280
0
        dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
281
0
            (cbc128_f) aesni_cbc_encrypt : NULL;
282
0
    } else {
283
0
        ret = aesni_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
284
0
        dat->block = (block128_f) aesni_encrypt;
285
0
        if (mode == EVP_CIPH_CBC_MODE)
286
0
            dat->stream.cbc = (cbc128_f) aesni_cbc_encrypt;
287
0
        else if (mode == EVP_CIPH_CTR_MODE)
288
0
            dat->stream.ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
289
0
        else
290
0
            dat->stream.cbc = NULL;
291
0
    }
292
293
0
    if (ret < 0) {
294
0
        EVPerr(EVP_F_AESNI_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
295
0
        return 0;
296
0
    }
297
298
0
    return 1;
299
0
}
300
301
static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
302
                            const unsigned char *in, size_t len)
303
0
{
304
0
    aesni_cbc_encrypt(in, out, len, ctx->cipher_data, ctx->iv, ctx->encrypt);
305
306
0
    return 1;
307
0
}
308
309
static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
310
                            const unsigned char *in, size_t len)
311
0
{
312
0
    size_t bl = ctx->cipher->block_size;
313
314
0
    if (len < bl)
315
0
        return 1;
316
317
0
    aesni_ecb_encrypt(in, out, len, ctx->cipher_data, ctx->encrypt);
318
319
0
    return 1;
320
0
}
321
322
#  define aesni_ofb_cipher aes_ofb_cipher
323
static int aesni_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
324
                            const unsigned char *in, size_t len);
325
326
#  define aesni_cfb_cipher aes_cfb_cipher
327
static int aesni_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
328
                            const unsigned char *in, size_t len);
329
330
#  define aesni_cfb8_cipher aes_cfb8_cipher
331
static int aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
332
                             const unsigned char *in, size_t len);
333
334
#  define aesni_cfb1_cipher aes_cfb1_cipher
335
static int aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
336
                             const unsigned char *in, size_t len);
337
338
#  define aesni_ctr_cipher aes_ctr_cipher
339
static int aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
340
                            const unsigned char *in, size_t len);
341
342
static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
343
                              const unsigned char *iv, int enc)
344
0
{
345
0
    EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
346
0
    if (!iv && !key)
347
0
        return 1;
348
0
    if (key) {
349
0
        aesni_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
350
0
        CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f) aesni_encrypt);
351
0
        gctx->ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
352
        /*
353
         * If we have an iv can set it directly, otherwise use saved IV.
354
         */
355
0
        if (iv == NULL && gctx->iv_set)
356
0
            iv = gctx->iv;
357
0
        if (iv) {
358
0
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
359
0
            gctx->iv_set = 1;
360
0
        }
361
0
        gctx->key_set = 1;
362
0
    } else {
363
        /* If key set use IV, otherwise copy */
364
0
        if (gctx->key_set)
365
0
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
366
0
        else
367
0
            memcpy(gctx->iv, iv, gctx->ivlen);
368
0
        gctx->iv_set = 1;
369
0
        gctx->iv_gen = 0;
370
0
    }
371
0
    return 1;
372
0
}
373
374
#  define aesni_gcm_cipher aes_gcm_cipher
375
static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
376
                            const unsigned char *in, size_t len);
377
378
static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
379
                              const unsigned char *iv, int enc)
380
0
{
381
0
    EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
382
0
    if (!iv && !key)
383
0
        return 1;
384
385
0
    if (key) {
386
        /* key_len is two AES keys */
387
0
        if (enc) {
388
0
            aesni_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1.ks);
389
0
            xctx->xts.block1 = (block128_f) aesni_encrypt;
390
0
            xctx->stream = aesni_xts_encrypt;
391
0
        } else {
392
0
            aesni_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1.ks);
393
0
            xctx->xts.block1 = (block128_f) aesni_decrypt;
394
0
            xctx->stream = aesni_xts_decrypt;
395
0
        }
396
397
0
        aesni_set_encrypt_key(key + ctx->key_len / 2,
398
0
                              ctx->key_len * 4, &xctx->ks2.ks);
399
0
        xctx->xts.block2 = (block128_f) aesni_encrypt;
400
401
0
        xctx->xts.key1 = &xctx->ks1;
402
0
    }
403
404
0
    if (iv) {
405
0
        xctx->xts.key2 = &xctx->ks2;
406
0
        memcpy(ctx->iv, iv, 16);
407
0
    }
408
409
0
    return 1;
410
0
}
411
412
#  define aesni_xts_cipher aes_xts_cipher
413
static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
414
                            const unsigned char *in, size_t len);
415
416
static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
417
                              const unsigned char *iv, int enc)
418
0
{
419
0
    EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
420
0
    if (!iv && !key)
421
0
        return 1;
422
0
    if (key) {
423
0
        aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks.ks);
424
0
        CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
425
0
                           &cctx->ks, (block128_f) aesni_encrypt);
426
0
        cctx->str = enc ? (ccm128_f) aesni_ccm64_encrypt_blocks :
427
0
            (ccm128_f) aesni_ccm64_decrypt_blocks;
428
0
        cctx->key_set = 1;
429
0
    }
430
0
    if (iv) {
431
0
        memcpy(ctx->iv, iv, 15 - cctx->L);
432
0
        cctx->iv_set = 1;
433
0
    }
434
0
    return 1;
435
0
}
436
437
#  define aesni_ccm_cipher aes_ccm_cipher
438
static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
439
                            const unsigned char *in, size_t len);
440
441
#  define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
442
static const EVP_CIPHER aesni_##keylen##_##mode = { \
443
        nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
444
        flags|EVP_CIPH_##MODE##_MODE,   \
445
        aesni_init_key,                 \
446
        aesni_##mode##_cipher,          \
447
        NULL,                           \
448
        sizeof(EVP_AES_KEY),            \
449
        NULL,NULL,NULL,NULL }; \
450
static const EVP_CIPHER aes_##keylen##_##mode = { \
451
        nid##_##keylen##_##nmode,blocksize,     \
452
        keylen/8,ivlen, \
453
        flags|EVP_CIPH_##MODE##_MODE,   \
454
        aes_init_key,                   \
455
        aes_##mode##_cipher,            \
456
        NULL,                           \
457
        sizeof(EVP_AES_KEY),            \
458
        NULL,NULL,NULL,NULL }; \
459
456
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
456
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_cbc
Line
Count
Source
459
38
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
38
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_ecb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_ofb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_cfb128
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_cfb1
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_cfb8
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_ctr
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_cbc
Line
Count
Source
459
38
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
38
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_ecb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_ofb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_cfb128
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_cfb1
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_cfb8
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_ctr
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_cbc
Line
Count
Source
459
38
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
38
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_ecb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_ofb
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_cfb128
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_cfb1
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_cfb8
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_ctr
Line
Count
Source
459
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
460
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
461
462
#  define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
463
static const EVP_CIPHER aesni_##keylen##_##mode = { \
464
        nid##_##keylen##_##mode,blocksize, \
465
        (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
466
        flags|EVP_CIPH_##MODE##_MODE,   \
467
        aesni_##mode##_init_key,        \
468
        aesni_##mode##_cipher,          \
469
        aes_##mode##_cleanup,           \
470
        sizeof(EVP_AES_##MODE##_CTX),   \
471
        NULL,NULL,aes_##mode##_ctrl,NULL }; \
472
static const EVP_CIPHER aes_##keylen##_##mode = { \
473
        nid##_##keylen##_##mode,blocksize, \
474
        (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
475
        flags|EVP_CIPH_##MODE##_MODE,   \
476
        aes_##mode##_init_key,          \
477
        aes_##mode##_cipher,            \
478
        aes_##mode##_cleanup,           \
479
        sizeof(EVP_AES_##MODE##_CTX),   \
480
        NULL,NULL,aes_##mode##_ctrl,NULL }; \
481
190
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
190
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_gcm
Line
Count
Source
481
38
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
38
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_gcm
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_gcm
Line
Count
Source
481
38
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
38
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_xts
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_xts
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_128_ccm
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_192_ccm
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
EVP_aes_256_ccm
Line
Count
Source
481
19
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
482
19
{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
483
484
# elif   defined(AES_ASM) && (defined(__sparc) || defined(__sparc__))
485
486
#  include "sparc_arch.h"
487
488
extern unsigned int OPENSSL_sparcv9cap_P[];
489
490
#  define SPARC_AES_CAPABLE       (OPENSSL_sparcv9cap_P[1] & CFR_AES)
491
492
void aes_t4_set_encrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
493
void aes_t4_set_decrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
494
void aes_t4_encrypt(const unsigned char *in, unsigned char *out,
495
                    const AES_KEY *key);
496
void aes_t4_decrypt(const unsigned char *in, unsigned char *out,
497
                    const AES_KEY *key);
498
/*
499
 * Key-length specific subroutines were chosen for following reason.
500
 * Each SPARC T4 core can execute up to 8 threads which share core's
501
 * resources. Loading as much key material to registers allows to
502
 * minimize references to shared memory interface, as well as amount
503
 * of instructions in inner loops [much needed on T4]. But then having
504
 * non-key-length specific routines would require conditional branches
505
 * either in inner loops or on subroutines' entries. Former is hardly
506
 * acceptable, while latter means code size increase to size occupied
507
 * by multiple key-length specfic subroutines, so why fight?
508
 */
509
void aes128_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
510
                           size_t len, const AES_KEY *key,
511
                           unsigned char *ivec);
512
void aes128_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
513
                           size_t len, const AES_KEY *key,
514
                           unsigned char *ivec);
515
void aes192_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
516
                           size_t len, const AES_KEY *key,
517
                           unsigned char *ivec);
518
void aes192_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
519
                           size_t len, const AES_KEY *key,
520
                           unsigned char *ivec);
521
void aes256_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
522
                           size_t len, const AES_KEY *key,
523
                           unsigned char *ivec);
524
void aes256_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
525
                           size_t len, const AES_KEY *key,
526
                           unsigned char *ivec);
527
void aes128_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
528
                             size_t blocks, const AES_KEY *key,
529
                             unsigned char *ivec);
530
void aes192_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
531
                             size_t blocks, const AES_KEY *key,
532
                             unsigned char *ivec);
533
void aes256_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
534
                             size_t blocks, const AES_KEY *key,
535
                             unsigned char *ivec);
536
void aes128_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
537
                           size_t blocks, const AES_KEY *key1,
538
                           const AES_KEY *key2, const unsigned char *ivec);
539
void aes128_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
540
                           size_t blocks, const AES_KEY *key1,
541
                           const AES_KEY *key2, const unsigned char *ivec);
542
void aes256_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
543
                           size_t blocks, const AES_KEY *key1,
544
                           const AES_KEY *key2, const unsigned char *ivec);
545
void aes256_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
546
                           size_t blocks, const AES_KEY *key1,
547
                           const AES_KEY *key2, const unsigned char *ivec);
548
549
static int aes_t4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
550
                           const unsigned char *iv, int enc)
551
{
552
    int ret, mode, bits;
553
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
554
555
    mode = ctx->cipher->flags & EVP_CIPH_MODE;
556
    bits = ctx->key_len * 8;
557
    if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
558
        && !enc) {
559
        ret = 0;
560
        aes_t4_set_decrypt_key(key, bits, ctx->cipher_data);
561
        dat->block = (block128_f) aes_t4_decrypt;
562
        switch (bits) {
563
        case 128:
564
            dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
565
                (cbc128_f) aes128_t4_cbc_decrypt : NULL;
566
            break;
567
        case 192:
568
            dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
569
                (cbc128_f) aes192_t4_cbc_decrypt : NULL;
570
            break;
571
        case 256:
572
            dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
573
                (cbc128_f) aes256_t4_cbc_decrypt : NULL;
574
            break;
575
        default:
576
            ret = -1;
577
        }
578
    } else {
579
        ret = 0;
580
        aes_t4_set_encrypt_key(key, bits, ctx->cipher_data);
581
        dat->block = (block128_f) aes_t4_encrypt;
582
        switch (bits) {
583
        case 128:
584
            if (mode == EVP_CIPH_CBC_MODE)
585
                dat->stream.cbc = (cbc128_f) aes128_t4_cbc_encrypt;
586
            else if (mode == EVP_CIPH_CTR_MODE)
587
                dat->stream.ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
588
            else
589
                dat->stream.cbc = NULL;
590
            break;
591
        case 192:
592
            if (mode == EVP_CIPH_CBC_MODE)
593
                dat->stream.cbc = (cbc128_f) aes192_t4_cbc_encrypt;
594
            else if (mode == EVP_CIPH_CTR_MODE)
595
                dat->stream.ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
596
            else
597
                dat->stream.cbc = NULL;
598
            break;
599
        case 256:
600
            if (mode == EVP_CIPH_CBC_MODE)
601
                dat->stream.cbc = (cbc128_f) aes256_t4_cbc_encrypt;
602
            else if (mode == EVP_CIPH_CTR_MODE)
603
                dat->stream.ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
604
            else
605
                dat->stream.cbc = NULL;
606
            break;
607
        default:
608
            ret = -1;
609
        }
610
    }
611
612
    if (ret < 0) {
613
        EVPerr(EVP_F_AES_T4_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
614
        return 0;
615
    }
616
617
    return 1;
618
}
619
620
#  define aes_t4_cbc_cipher aes_cbc_cipher
621
static int aes_t4_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
622
                             const unsigned char *in, size_t len);
623
624
#  define aes_t4_ecb_cipher aes_ecb_cipher
625
static int aes_t4_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
626
                             const unsigned char *in, size_t len);
627
628
#  define aes_t4_ofb_cipher aes_ofb_cipher
629
static int aes_t4_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
630
                             const unsigned char *in, size_t len);
631
632
#  define aes_t4_cfb_cipher aes_cfb_cipher
633
static int aes_t4_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
634
                             const unsigned char *in, size_t len);
635
636
#  define aes_t4_cfb8_cipher aes_cfb8_cipher
637
static int aes_t4_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
638
                              const unsigned char *in, size_t len);
639
640
#  define aes_t4_cfb1_cipher aes_cfb1_cipher
641
static int aes_t4_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
642
                              const unsigned char *in, size_t len);
643
644
#  define aes_t4_ctr_cipher aes_ctr_cipher
645
static int aes_t4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
646
                             const unsigned char *in, size_t len);
647
648
static int aes_t4_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
649
                               const unsigned char *iv, int enc)
650
{
651
    EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
652
    if (!iv && !key)
653
        return 1;
654
    if (key) {
655
        int bits = ctx->key_len * 8;
656
        aes_t4_set_encrypt_key(key, bits, &gctx->ks.ks);
657
        CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
658
                           (block128_f) aes_t4_encrypt);
659
        switch (bits) {
660
        case 128:
661
            gctx->ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
662
            break;
663
        case 192:
664
            gctx->ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
665
            break;
666
        case 256:
667
            gctx->ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
668
            break;
669
        default:
670
            return 0;
671
        }
672
        /*
673
         * If we have an iv can set it directly, otherwise use saved IV.
674
         */
675
        if (iv == NULL && gctx->iv_set)
676
            iv = gctx->iv;
677
        if (iv) {
678
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
679
            gctx->iv_set = 1;
680
        }
681
        gctx->key_set = 1;
682
    } else {
683
        /* If key set use IV, otherwise copy */
684
        if (gctx->key_set)
685
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
686
        else
687
            memcpy(gctx->iv, iv, gctx->ivlen);
688
        gctx->iv_set = 1;
689
        gctx->iv_gen = 0;
690
    }
691
    return 1;
692
}
693
694
#  define aes_t4_gcm_cipher aes_gcm_cipher
695
static int aes_t4_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
696
                             const unsigned char *in, size_t len);
697
698
static int aes_t4_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
699
                               const unsigned char *iv, int enc)
700
{
701
    EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
702
    if (!iv && !key)
703
        return 1;
704
705
    if (key) {
706
        int bits = ctx->key_len * 4;
707
        xctx->stream = NULL;
708
        /* key_len is two AES keys */
709
        if (enc) {
710
            aes_t4_set_encrypt_key(key, bits, &xctx->ks1.ks);
711
            xctx->xts.block1 = (block128_f) aes_t4_encrypt;
712
            switch (bits) {
713
            case 128:
714
                xctx->stream = aes128_t4_xts_encrypt;
715
                break;
716
#  if 0                         /* not yet */
717
            case 192:
718
                xctx->stream = aes192_t4_xts_encrypt;
719
                break;
720
#  endif
721
            case 256:
722
                xctx->stream = aes256_t4_xts_encrypt;
723
                break;
724
            default:
725
                return 0;
726
            }
727
        } else {
728
            aes_t4_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1.ks);
729
            xctx->xts.block1 = (block128_f) aes_t4_decrypt;
730
            switch (bits) {
731
            case 128:
732
                xctx->stream = aes128_t4_xts_decrypt;
733
                break;
734
#  if 0                         /* not yet */
735
            case 192:
736
                xctx->stream = aes192_t4_xts_decrypt;
737
                break;
738
#  endif
739
            case 256:
740
                xctx->stream = aes256_t4_xts_decrypt;
741
                break;
742
            default:
743
                return 0;
744
            }
745
        }
746
747
        aes_t4_set_encrypt_key(key + ctx->key_len / 2,
748
                               ctx->key_len * 4, &xctx->ks2.ks);
749
        xctx->xts.block2 = (block128_f) aes_t4_encrypt;
750
751
        xctx->xts.key1 = &xctx->ks1;
752
    }
753
754
    if (iv) {
755
        xctx->xts.key2 = &xctx->ks2;
756
        memcpy(ctx->iv, iv, 16);
757
    }
758
759
    return 1;
760
}
761
762
#  define aes_t4_xts_cipher aes_xts_cipher
763
static int aes_t4_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
764
                             const unsigned char *in, size_t len);
765
766
static int aes_t4_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
767
                               const unsigned char *iv, int enc)
768
{
769
    EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
770
    if (!iv && !key)
771
        return 1;
772
    if (key) {
773
        int bits = ctx->key_len * 8;
774
        aes_t4_set_encrypt_key(key, bits, &cctx->ks.ks);
775
        CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
776
                           &cctx->ks, (block128_f) aes_t4_encrypt);
777
#  if 0                         /* not yet */
778
        switch (bits) {
779
        case 128:
780
            cctx->str = enc ? (ccm128_f) aes128_t4_ccm64_encrypt :
781
                (ccm128_f) ae128_t4_ccm64_decrypt;
782
            break;
783
        case 192:
784
            cctx->str = enc ? (ccm128_f) aes192_t4_ccm64_encrypt :
785
                (ccm128_f) ae192_t4_ccm64_decrypt;
786
            break;
787
        case 256:
788
            cctx->str = enc ? (ccm128_f) aes256_t4_ccm64_encrypt :
789
                (ccm128_f) ae256_t4_ccm64_decrypt;
790
            break;
791
        default:
792
            return 0;
793
        }
794
#  else
795
        cctx->str = NULL;
796
#  endif
797
        cctx->key_set = 1;
798
    }
799
    if (iv) {
800
        memcpy(ctx->iv, iv, 15 - cctx->L);
801
        cctx->iv_set = 1;
802
    }
803
    return 1;
804
}
805
806
#  define aes_t4_ccm_cipher aes_ccm_cipher
807
static int aes_t4_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
808
                             const unsigned char *in, size_t len);
809
810
#  define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
811
static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
812
        nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
813
        flags|EVP_CIPH_##MODE##_MODE,   \
814
        aes_t4_init_key,                \
815
        aes_t4_##mode##_cipher,         \
816
        NULL,                           \
817
        sizeof(EVP_AES_KEY),            \
818
        NULL,NULL,NULL,NULL }; \
819
static const EVP_CIPHER aes_##keylen##_##mode = { \
820
        nid##_##keylen##_##nmode,blocksize,     \
821
        keylen/8,ivlen, \
822
        flags|EVP_CIPH_##MODE##_MODE,   \
823
        aes_init_key,                   \
824
        aes_##mode##_cipher,            \
825
        NULL,                           \
826
        sizeof(EVP_AES_KEY),            \
827
        NULL,NULL,NULL,NULL }; \
828
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
829
{ return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
830
831
#  define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
832
static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
833
        nid##_##keylen##_##mode,blocksize, \
834
        (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
835
        flags|EVP_CIPH_##MODE##_MODE,   \
836
        aes_t4_##mode##_init_key,       \
837
        aes_t4_##mode##_cipher,         \
838
        aes_##mode##_cleanup,           \
839
        sizeof(EVP_AES_##MODE##_CTX),   \
840
        NULL,NULL,aes_##mode##_ctrl,NULL }; \
841
static const EVP_CIPHER aes_##keylen##_##mode = { \
842
        nid##_##keylen##_##mode,blocksize, \
843
        (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
844
        flags|EVP_CIPH_##MODE##_MODE,   \
845
        aes_##mode##_init_key,          \
846
        aes_##mode##_cipher,            \
847
        aes_##mode##_cleanup,           \
848
        sizeof(EVP_AES_##MODE##_CTX),   \
849
        NULL,NULL,aes_##mode##_ctrl,NULL }; \
850
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
851
{ return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
852
853
# else
854
855
#  define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
856
static const EVP_CIPHER aes_##keylen##_##mode = { \
857
        nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
858
        flags|EVP_CIPH_##MODE##_MODE,   \
859
        aes_init_key,                   \
860
        aes_##mode##_cipher,            \
861
        NULL,                           \
862
        sizeof(EVP_AES_KEY),            \
863
        NULL,NULL,NULL,NULL }; \
864
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
865
{ return &aes_##keylen##_##mode; }
866
867
#  define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
868
static const EVP_CIPHER aes_##keylen##_##mode = { \
869
        nid##_##keylen##_##mode,blocksize, \
870
        (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
871
        flags|EVP_CIPH_##MODE##_MODE,   \
872
        aes_##mode##_init_key,          \
873
        aes_##mode##_cipher,            \
874
        aes_##mode##_cleanup,           \
875
        sizeof(EVP_AES_##MODE##_CTX),   \
876
        NULL,NULL,aes_##mode##_ctrl,NULL }; \
877
const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
878
{ return &aes_##keylen##_##mode; }
879
# endif
880
881
# if defined(OPENSSL_CPUID_OBJ) && (defined(__arm__) || defined(__arm) || defined(__aarch64__))
882
#  include "arm_arch.h"
883
#  if __ARM_MAX_ARCH__>=7
884
#   if defined(BSAES_ASM)
885
#    define BSAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
886
#   endif
887
#   define HWAES_CAPABLE (OPENSSL_armcap_P & ARMV8_AES)
888
#   define HWAES_set_encrypt_key aes_v8_set_encrypt_key
889
#   define HWAES_set_decrypt_key aes_v8_set_decrypt_key
890
#   define HWAES_encrypt aes_v8_encrypt
891
#   define HWAES_decrypt aes_v8_decrypt
892
#   define HWAES_cbc_encrypt aes_v8_cbc_encrypt
893
#   define HWAES_ctr32_encrypt_blocks aes_v8_ctr32_encrypt_blocks
894
#  endif
895
# endif
896
897
# if defined(HWAES_CAPABLE)
898
int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
899
                          AES_KEY *key);
900
int HWAES_set_decrypt_key(const unsigned char *userKey, const int bits,
901
                          AES_KEY *key);
902
void HWAES_encrypt(const unsigned char *in, unsigned char *out,
903
                   const AES_KEY *key);
904
void HWAES_decrypt(const unsigned char *in, unsigned char *out,
905
                   const AES_KEY *key);
906
void HWAES_cbc_encrypt(const unsigned char *in, unsigned char *out,
907
                       size_t length, const AES_KEY *key,
908
                       unsigned char *ivec, const int enc);
909
void HWAES_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
910
                                size_t len, const AES_KEY *key,
911
                                const unsigned char ivec[16]);
912
# endif
913
914
# define BLOCK_CIPHER_generic_pack(nid,keylen,flags)             \
915
        BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)     \
916
        BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)      \
917
        BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
918
        BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
919
        BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags)       \
920
        BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags)       \
921
        BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
922
923
static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
924
                        const unsigned char *iv, int enc)
925
0
{
926
0
    int ret, mode;
927
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
928
929
0
    mode = ctx->cipher->flags & EVP_CIPH_MODE;
930
0
    if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
931
0
        && !enc)
932
# ifdef HWAES_CAPABLE
933
        if (HWAES_CAPABLE) {
934
            ret = HWAES_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
935
            dat->block = (block128_f) HWAES_decrypt;
936
            dat->stream.cbc = NULL;
937
#  ifdef HWAES_cbc_encrypt
938
            if (mode == EVP_CIPH_CBC_MODE)
939
                dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
940
#  endif
941
        } else
942
# endif
943
0
# ifdef BSAES_CAPABLE
944
0
        if (BSAES_CAPABLE && mode == EVP_CIPH_CBC_MODE) {
945
0
            ret = AES_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
946
0
            dat->block = (block128_f) AES_decrypt;
947
0
            dat->stream.cbc = (cbc128_f) bsaes_cbc_encrypt;
948
0
        } else
949
0
# endif
950
0
# ifdef VPAES_CAPABLE
951
0
        if (VPAES_CAPABLE) {
952
0
            ret = vpaes_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
953
0
            dat->block = (block128_f) vpaes_decrypt;
954
0
            dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
955
0
                (cbc128_f) vpaes_cbc_encrypt : NULL;
956
0
        } else
957
0
# endif
958
0
        {
959
0
            ret = AES_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
960
0
            dat->block = (block128_f) AES_decrypt;
961
0
            dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
962
0
                (cbc128_f) AES_cbc_encrypt : NULL;
963
0
    } else
964
# ifdef HWAES_CAPABLE
965
    if (HWAES_CAPABLE) {
966
        ret = HWAES_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
967
        dat->block = (block128_f) HWAES_encrypt;
968
        dat->stream.cbc = NULL;
969
#  ifdef HWAES_cbc_encrypt
970
        if (mode == EVP_CIPH_CBC_MODE)
971
            dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
972
        else
973
#  endif
974
#  ifdef HWAES_ctr32_encrypt_blocks
975
        if (mode == EVP_CIPH_CTR_MODE)
976
            dat->stream.ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
977
        else
978
#  endif
979
            (void)0;            /* terminate potentially open 'else' */
980
    } else
981
# endif
982
0
# ifdef BSAES_CAPABLE
983
0
    if (BSAES_CAPABLE && mode == EVP_CIPH_CTR_MODE) {
984
0
        ret = AES_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
985
0
        dat->block = (block128_f) AES_encrypt;
986
0
        dat->stream.ctr = (ctr128_f) bsaes_ctr32_encrypt_blocks;
987
0
    } else
988
0
# endif
989
0
# ifdef VPAES_CAPABLE
990
0
    if (VPAES_CAPABLE) {
991
0
        ret = vpaes_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
992
0
        dat->block = (block128_f) vpaes_encrypt;
993
0
        dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
994
0
            (cbc128_f) vpaes_cbc_encrypt : NULL;
995
0
    } else
996
0
# endif
997
0
    {
998
0
        ret = AES_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
999
0
        dat->block = (block128_f) AES_encrypt;
1000
0
        dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
1001
0
            (cbc128_f) AES_cbc_encrypt : NULL;
1002
# ifdef AES_CTR_ASM
1003
        if (mode == EVP_CIPH_CTR_MODE)
1004
            dat->stream.ctr = (ctr128_f) AES_ctr32_encrypt;
1005
# endif
1006
0
    }
1007
1008
0
    if (ret < 0) {
1009
0
        EVPerr(EVP_F_AES_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
1010
0
        return 0;
1011
0
    }
1012
1013
0
    return 1;
1014
0
}
1015
1016
static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1017
                          const unsigned char *in, size_t len)
1018
0
{
1019
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1020
1021
0
    if (dat->stream.cbc)
1022
0
        (*dat->stream.cbc) (in, out, len, &dat->ks, ctx->iv, ctx->encrypt);
1023
0
    else if (ctx->encrypt)
1024
0
        CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv, dat->block);
1025
0
    else
1026
0
        CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, ctx->iv, dat->block);
1027
1028
0
    return 1;
1029
0
}
1030
1031
static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1032
                          const unsigned char *in, size_t len)
1033
0
{
1034
0
    size_t bl = ctx->cipher->block_size;
1035
0
    size_t i;
1036
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1037
1038
0
    if (len < bl)
1039
0
        return 1;
1040
1041
0
    for (i = 0, len -= bl; i <= len; i += bl)
1042
0
        (*dat->block) (in + i, out + i, &dat->ks);
1043
1044
0
    return 1;
1045
0
}
1046
1047
static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1048
                          const unsigned char *in, size_t len)
1049
0
{
1050
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1051
1052
0
    CRYPTO_ofb128_encrypt(in, out, len, &dat->ks,
1053
0
                          ctx->iv, &ctx->num, dat->block);
1054
0
    return 1;
1055
0
}
1056
1057
static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1058
                          const unsigned char *in, size_t len)
1059
0
{
1060
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1061
1062
0
    CRYPTO_cfb128_encrypt(in, out, len, &dat->ks,
1063
0
                          ctx->iv, &ctx->num, ctx->encrypt, dat->block);
1064
0
    return 1;
1065
0
}
1066
1067
static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1068
                           const unsigned char *in, size_t len)
1069
0
{
1070
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1071
1072
0
    CRYPTO_cfb128_8_encrypt(in, out, len, &dat->ks,
1073
0
                            ctx->iv, &ctx->num, ctx->encrypt, dat->block);
1074
0
    return 1;
1075
0
}
1076
1077
static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1078
                           const unsigned char *in, size_t len)
1079
0
{
1080
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1081
1082
0
    if (ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) {
1083
0
        CRYPTO_cfb128_1_encrypt(in, out, len, &dat->ks,
1084
0
                                ctx->iv, &ctx->num, ctx->encrypt, dat->block);
1085
0
        return 1;
1086
0
    }
1087
1088
0
    while (len >= MAXBITCHUNK) {
1089
0
        CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK * 8, &dat->ks,
1090
0
                                ctx->iv, &ctx->num, ctx->encrypt, dat->block);
1091
0
        len -= MAXBITCHUNK;
1092
0
    }
1093
0
    if (len)
1094
0
        CRYPTO_cfb128_1_encrypt(in, out, len * 8, &dat->ks,
1095
0
                                ctx->iv, &ctx->num, ctx->encrypt, dat->block);
1096
1097
0
    return 1;
1098
0
}
1099
1100
static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1101
                          const unsigned char *in, size_t len)
1102
0
{
1103
0
    unsigned int num = ctx->num;
1104
0
    EVP_AES_KEY *dat = (EVP_AES_KEY *) ctx->cipher_data;
1105
1106
0
    if (dat->stream.ctr)
1107
0
        CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks,
1108
0
                                    ctx->iv, ctx->buf, &num, dat->stream.ctr);
1109
0
    else
1110
0
        CRYPTO_ctr128_encrypt(in, out, len, &dat->ks,
1111
0
                              ctx->iv, ctx->buf, &num, dat->block);
1112
0
    ctx->num = (size_t)num;
1113
0
    return 1;
1114
0
}
1115
1116
BLOCK_CIPHER_generic_pack(NID_aes, 128, EVP_CIPH_FLAG_FIPS)
1117
    BLOCK_CIPHER_generic_pack(NID_aes, 192, EVP_CIPH_FLAG_FIPS)
1118
    BLOCK_CIPHER_generic_pack(NID_aes, 256, EVP_CIPH_FLAG_FIPS)
1119
1120
static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
1121
0
{
1122
0
    EVP_AES_GCM_CTX *gctx = c->cipher_data;
1123
0
    if (gctx == NULL)
1124
0
        return 0;
1125
0
    OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
1126
0
    if (gctx->iv != c->iv)
1127
0
        OPENSSL_free(gctx->iv);
1128
0
    return 1;
1129
0
}
1130
1131
/* increment counter (64-bit int) by 1 */
1132
static void ctr64_inc(unsigned char *counter)
1133
0
{
1134
0
    int n = 8;
1135
0
    unsigned char c;
1136
1137
0
    do {
1138
0
        --n;
1139
0
        c = counter[n];
1140
0
        ++c;
1141
0
        counter[n] = c;
1142
0
        if (c)
1143
0
            return;
1144
0
    } while (n);
1145
0
}
1146
1147
static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1148
0
{
1149
0
    EVP_AES_GCM_CTX *gctx = c->cipher_data;
1150
0
    switch (type) {
1151
0
    case EVP_CTRL_INIT:
1152
0
        gctx->key_set = 0;
1153
0
        gctx->iv_set = 0;
1154
0
        gctx->ivlen = c->cipher->iv_len;
1155
0
        gctx->iv = c->iv;
1156
0
        gctx->taglen = -1;
1157
0
        gctx->iv_gen = 0;
1158
0
        gctx->tls_aad_len = -1;
1159
0
        return 1;
1160
1161
0
    case EVP_CTRL_GCM_SET_IVLEN:
1162
0
        if (arg <= 0)
1163
0
            return 0;
1164
        /* Allocate memory for IV if needed */
1165
0
        if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen)) {
1166
0
            if (gctx->iv != c->iv)
1167
0
                OPENSSL_free(gctx->iv);
1168
0
            gctx->iv = OPENSSL_malloc(arg);
1169
0
            if (!gctx->iv)
1170
0
                return 0;
1171
0
        }
1172
0
        gctx->ivlen = arg;
1173
0
        return 1;
1174
1175
0
    case EVP_CTRL_GCM_SET_TAG:
1176
0
        if (arg <= 0 || arg > 16 || c->encrypt)
1177
0
            return 0;
1178
0
        memcpy(c->buf, ptr, arg);
1179
0
        gctx->taglen = arg;
1180
0
        return 1;
1181
1182
0
    case EVP_CTRL_GCM_GET_TAG:
1183
0
        if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
1184
0
            return 0;
1185
0
        memcpy(ptr, c->buf, arg);
1186
0
        return 1;
1187
1188
0
    case EVP_CTRL_GCM_SET_IV_FIXED:
1189
        /* Special case: -1 length restores whole IV */
1190
0
        if (arg == -1) {
1191
0
            memcpy(gctx->iv, ptr, gctx->ivlen);
1192
0
            gctx->iv_gen = 1;
1193
0
            return 1;
1194
0
        }
1195
        /*
1196
         * Fixed field must be at least 4 bytes and invocation field at least
1197
         * 8.
1198
         */
1199
0
        if ((arg < 4) || (gctx->ivlen - arg) < 8)
1200
0
            return 0;
1201
0
        if (arg)
1202
0
            memcpy(gctx->iv, ptr, arg);
1203
0
        if (c->encrypt && RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
1204
0
            return 0;
1205
0
        gctx->iv_gen = 1;
1206
0
        return 1;
1207
1208
0
    case EVP_CTRL_GCM_IV_GEN:
1209
0
        if (gctx->iv_gen == 0 || gctx->key_set == 0)
1210
0
            return 0;
1211
0
        CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
1212
0
        if (arg <= 0 || arg > gctx->ivlen)
1213
0
            arg = gctx->ivlen;
1214
0
        memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
1215
        /*
1216
         * Invocation field will be at least 8 bytes in size and so no need
1217
         * to check wrap around or increment more than last 8 bytes.
1218
         */
1219
0
        ctr64_inc(gctx->iv + gctx->ivlen - 8);
1220
0
        gctx->iv_set = 1;
1221
0
        return 1;
1222
1223
0
    case EVP_CTRL_GCM_SET_IV_INV:
1224
0
        if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
1225
0
            return 0;
1226
0
        memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
1227
0
        CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
1228
0
        gctx->iv_set = 1;
1229
0
        return 1;
1230
1231
0
    case EVP_CTRL_AEAD_TLS1_AAD:
1232
        /* Save the AAD for later use */
1233
0
        if (arg != EVP_AEAD_TLS1_AAD_LEN)
1234
0
            return 0;
1235
0
        memcpy(c->buf, ptr, arg);
1236
0
        gctx->tls_aad_len = arg;
1237
0
        {
1238
0
            unsigned int len = c->buf[arg - 2] << 8 | c->buf[arg - 1];
1239
            /* Correct length for explicit IV */
1240
0
            if (len < EVP_GCM_TLS_EXPLICIT_IV_LEN)
1241
0
                return 0;
1242
0
            len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
1243
            /* If decrypting correct for tag too */
1244
0
            if (!c->encrypt) {
1245
0
                if (len < EVP_GCM_TLS_TAG_LEN)
1246
0
                    return 0;
1247
0
                len -= EVP_GCM_TLS_TAG_LEN;
1248
0
            }
1249
0
            c->buf[arg - 2] = len >> 8;
1250
0
            c->buf[arg - 1] = len & 0xff;
1251
0
        }
1252
        /* Extra padding: tag appended to record */
1253
0
        return EVP_GCM_TLS_TAG_LEN;
1254
1255
0
    case EVP_CTRL_COPY:
1256
0
        {
1257
0
            EVP_CIPHER_CTX *out = ptr;
1258
0
            EVP_AES_GCM_CTX *gctx_out = out->cipher_data;
1259
0
            if (gctx->gcm.key) {
1260
0
                if (gctx->gcm.key != &gctx->ks)
1261
0
                    return 0;
1262
0
                gctx_out->gcm.key = &gctx_out->ks;
1263
0
            }
1264
0
            if (gctx->iv == c->iv)
1265
0
                gctx_out->iv = out->iv;
1266
0
            else {
1267
0
                gctx_out->iv = OPENSSL_malloc(gctx->ivlen);
1268
0
                if (!gctx_out->iv)
1269
0
                    return 0;
1270
0
                memcpy(gctx_out->iv, gctx->iv, gctx->ivlen);
1271
0
            }
1272
0
            return 1;
1273
0
        }
1274
1275
0
    default:
1276
0
        return -1;
1277
1278
0
    }
1279
0
}
1280
1281
static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1282
                            const unsigned char *iv, int enc)
1283
0
{
1284
0
    EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1285
0
    if (!iv && !key)
1286
0
        return 1;
1287
0
    if (key) {
1288
0
        do {
1289
# ifdef HWAES_CAPABLE
1290
            if (HWAES_CAPABLE) {
1291
                HWAES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
1292
                CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1293
                                   (block128_f) HWAES_encrypt);
1294
#  ifdef HWAES_ctr32_encrypt_blocks
1295
                gctx->ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
1296
#  else
1297
                gctx->ctr = NULL;
1298
#  endif
1299
                break;
1300
            } else
1301
# endif
1302
0
# ifdef BSAES_CAPABLE
1303
0
            if (BSAES_CAPABLE) {
1304
0
                AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
1305
0
                CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1306
0
                                   (block128_f) AES_encrypt);
1307
0
                gctx->ctr = (ctr128_f) bsaes_ctr32_encrypt_blocks;
1308
0
                break;
1309
0
            } else
1310
0
# endif
1311
0
# ifdef VPAES_CAPABLE
1312
0
            if (VPAES_CAPABLE) {
1313
0
                vpaes_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
1314
0
                CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1315
0
                                   (block128_f) vpaes_encrypt);
1316
0
                gctx->ctr = NULL;
1317
0
                break;
1318
0
            } else
1319
0
# endif
1320
0
                (void)0;        /* terminate potentially open 'else' */
1321
1322
0
            AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
1323
0
            CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1324
0
                               (block128_f) AES_encrypt);
1325
# ifdef AES_CTR_ASM
1326
            gctx->ctr = (ctr128_f) AES_ctr32_encrypt;
1327
# else
1328
0
            gctx->ctr = NULL;
1329
0
# endif
1330
0
        } while (0);
1331
1332
        /*
1333
         * If we have an iv can set it directly, otherwise use saved IV.
1334
         */
1335
0
        if (iv == NULL && gctx->iv_set)
1336
0
            iv = gctx->iv;
1337
0
        if (iv) {
1338
0
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
1339
0
            gctx->iv_set = 1;
1340
0
        }
1341
0
        gctx->key_set = 1;
1342
0
    } else {
1343
        /* If key set use IV, otherwise copy */
1344
0
        if (gctx->key_set)
1345
0
            CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
1346
0
        else
1347
0
            memcpy(gctx->iv, iv, gctx->ivlen);
1348
0
        gctx->iv_set = 1;
1349
0
        gctx->iv_gen = 0;
1350
0
    }
1351
0
    return 1;
1352
0
}
1353
1354
/*
1355
 * Handle TLS GCM packet format. This consists of the last portion of the IV
1356
 * followed by the payload and finally the tag. On encrypt generate IV,
1357
 * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
1358
 * and verify tag.
1359
 */
1360
1361
static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1362
                              const unsigned char *in, size_t len)
1363
0
{
1364
0
    EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1365
0
    int rv = -1;
1366
    /* Encrypt/decrypt must be performed in place */
1367
0
    if (out != in
1368
0
        || len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
1369
0
        return -1;
1370
    /*
1371
     * Set IV from start of buffer or generate IV and write to start of
1372
     * buffer.
1373
     */
1374
0
    if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
1375
0
                            EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
1376
0
                            EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
1377
0
        goto err;
1378
    /* Use saved AAD */
1379
0
    if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
1380
0
        goto err;
1381
    /* Fix buffer and length to point to payload */
1382
0
    in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1383
0
    out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1384
0
    len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1385
0
    if (ctx->encrypt) {
1386
        /* Encrypt payload */
1387
0
        if (gctx->ctr) {
1388
0
            size_t bulk = 0;
1389
0
# if defined(AES_GCM_ASM)
1390
0
            if (len >= 32 && AES_GCM_ASM(gctx)) {
1391
0
                if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
1392
0
                    return -1;
1393
1394
0
                bulk = AES_gcm_encrypt(in, out, len,
1395
0
                                       gctx->gcm.key,
1396
0
                                       gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1397
0
                gctx->gcm.len.u[1] += bulk;
1398
0
            }
1399
0
# endif
1400
0
            if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
1401
0
                                            in + bulk,
1402
0
                                            out + bulk,
1403
0
                                            len - bulk, gctx->ctr))
1404
0
                goto err;
1405
0
        } else {
1406
0
            size_t bulk = 0;
1407
# if defined(AES_GCM_ASM2)
1408
            if (len >= 32 && AES_GCM_ASM2(gctx)) {
1409
                if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
1410
                    return -1;
1411
1412
                bulk = AES_gcm_encrypt(in, out, len,
1413
                                       gctx->gcm.key,
1414
                                       gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1415
                gctx->gcm.len.u[1] += bulk;
1416
            }
1417
# endif
1418
0
            if (CRYPTO_gcm128_encrypt(&gctx->gcm,
1419
0
                                      in + bulk, out + bulk, len - bulk))
1420
0
                goto err;
1421
0
        }
1422
0
        out += len;
1423
        /* Finally write tag */
1424
0
        CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
1425
0
        rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1426
0
    } else {
1427
        /* Decrypt */
1428
0
        if (gctx->ctr) {
1429
0
            size_t bulk = 0;
1430
0
# if defined(AES_GCM_ASM)
1431
0
            if (len >= 16 && AES_GCM_ASM(gctx)) {
1432
0
                if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
1433
0
                    return -1;
1434
1435
0
                bulk = AES_gcm_decrypt(in, out, len,
1436
0
                                       gctx->gcm.key,
1437
0
                                       gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1438
0
                gctx->gcm.len.u[1] += bulk;
1439
0
            }
1440
0
# endif
1441
0
            if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
1442
0
                                            in + bulk,
1443
0
                                            out + bulk,
1444
0
                                            len - bulk, gctx->ctr))
1445
0
                goto err;
1446
0
        } else {
1447
0
            size_t bulk = 0;
1448
# if defined(AES_GCM_ASM2)
1449
            if (len >= 16 && AES_GCM_ASM2(gctx)) {
1450
                if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
1451
                    return -1;
1452
1453
                bulk = AES_gcm_decrypt(in, out, len,
1454
                                       gctx->gcm.key,
1455
                                       gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1456
                gctx->gcm.len.u[1] += bulk;
1457
            }
1458
# endif
1459
0
            if (CRYPTO_gcm128_decrypt(&gctx->gcm,
1460
0
                                      in + bulk, out + bulk, len - bulk))
1461
0
                goto err;
1462
0
        }
1463
        /* Retrieve tag */
1464
0
        CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, EVP_GCM_TLS_TAG_LEN);
1465
        /* If tag mismatch wipe buffer */
1466
0
        if (CRYPTO_memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) {
1467
0
            OPENSSL_cleanse(out, len);
1468
0
            goto err;
1469
0
        }
1470
0
        rv = len;
1471
0
    }
1472
1473
0
 err:
1474
0
    gctx->iv_set = 0;
1475
0
    gctx->tls_aad_len = -1;
1476
0
    return rv;
1477
0
}
1478
1479
static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1480
                          const unsigned char *in, size_t len)
1481
0
{
1482
0
    EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1483
    /* If not set up, return error */
1484
0
    if (!gctx->key_set)
1485
0
        return -1;
1486
1487
0
    if (gctx->tls_aad_len >= 0)
1488
0
        return aes_gcm_tls_cipher(ctx, out, in, len);
1489
1490
0
    if (!gctx->iv_set)
1491
0
        return -1;
1492
0
    if (in) {
1493
0
        if (out == NULL) {
1494
0
            if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
1495
0
                return -1;
1496
0
        } else if (ctx->encrypt) {
1497
0
            if (gctx->ctr) {
1498
0
                size_t bulk = 0;
1499
0
# if defined(AES_GCM_ASM)
1500
0
                if (len >= 32 && AES_GCM_ASM(gctx)) {
1501
0
                    size_t res = (16 - gctx->gcm.mres) % 16;
1502
1503
0
                    if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
1504
0
                        return -1;
1505
1506
0
                    bulk = AES_gcm_encrypt(in + res,
1507
0
                                           out + res, len - res,
1508
0
                                           gctx->gcm.key, gctx->gcm.Yi.c,
1509
0
                                           gctx->gcm.Xi.u);
1510
0
                    gctx->gcm.len.u[1] += bulk;
1511
0
                    bulk += res;
1512
0
                }
1513
0
# endif
1514
0
                if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
1515
0
                                                in + bulk,
1516
0
                                                out + bulk,
1517
0
                                                len - bulk, gctx->ctr))
1518
0
                    return -1;
1519
0
            } else {
1520
0
                size_t bulk = 0;
1521
# if defined(AES_GCM_ASM2)
1522
                if (len >= 32 && AES_GCM_ASM2(gctx)) {
1523
                    size_t res = (16 - gctx->gcm.mres) % 16;
1524
1525
                    if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
1526
                        return -1;
1527
1528
                    bulk = AES_gcm_encrypt(in + res,
1529
                                           out + res, len - res,
1530
                                           gctx->gcm.key, gctx->gcm.Yi.c,
1531
                                           gctx->gcm.Xi.u);
1532
                    gctx->gcm.len.u[1] += bulk;
1533
                    bulk += res;
1534
                }
1535
# endif
1536
0
                if (CRYPTO_gcm128_encrypt(&gctx->gcm,
1537
0
                                          in + bulk, out + bulk, len - bulk))
1538
0
                    return -1;
1539
0
            }
1540
0
        } else {
1541
0
            if (gctx->ctr) {
1542
0
                size_t bulk = 0;
1543
0
# if defined(AES_GCM_ASM)
1544
0
                if (len >= 16 && AES_GCM_ASM(gctx)) {
1545
0
                    size_t res = (16 - gctx->gcm.mres) % 16;
1546
1547
0
                    if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
1548
0
                        return -1;
1549
1550
0
                    bulk = AES_gcm_decrypt(in + res,
1551
0
                                           out + res, len - res,
1552
0
                                           gctx->gcm.key,
1553
0
                                           gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1554
0
                    gctx->gcm.len.u[1] += bulk;
1555
0
                    bulk += res;
1556
0
                }
1557
0
# endif
1558
0
                if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
1559
0
                                                in + bulk,
1560
0
                                                out + bulk,
1561
0
                                                len - bulk, gctx->ctr))
1562
0
                    return -1;
1563
0
            } else {
1564
0
                size_t bulk = 0;
1565
# if defined(AES_GCM_ASM2)
1566
                if (len >= 16 && AES_GCM_ASM2(gctx)) {
1567
                    size_t res = (16 - gctx->gcm.mres) % 16;
1568
1569
                    if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
1570
                        return -1;
1571
1572
                    bulk = AES_gcm_decrypt(in + res,
1573
                                           out + res, len - res,
1574
                                           gctx->gcm.key,
1575
                                           gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1576
                    gctx->gcm.len.u[1] += bulk;
1577
                    bulk += res;
1578
                }
1579
# endif
1580
0
                if (CRYPTO_gcm128_decrypt(&gctx->gcm,
1581
0
                                          in + bulk, out + bulk, len - bulk))
1582
0
                    return -1;
1583
0
            }
1584
0
        }
1585
0
        return len;
1586
0
    } else {
1587
0
        if (!ctx->encrypt) {
1588
0
            if (gctx->taglen < 0)
1589
0
                return -1;
1590
0
            if (CRYPTO_gcm128_finish(&gctx->gcm, ctx->buf, gctx->taglen) != 0)
1591
0
                return -1;
1592
0
            gctx->iv_set = 0;
1593
0
            return 0;
1594
0
        }
1595
0
        CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
1596
0
        gctx->taglen = 16;
1597
        /* Don't reuse the IV */
1598
0
        gctx->iv_set = 0;
1599
0
        return 0;
1600
0
    }
1601
1602
0
}
1603
1604
# define CUSTOM_FLAGS    (EVP_CIPH_FLAG_DEFAULT_ASN1 \
1605
                | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
1606
                | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
1607
                | EVP_CIPH_CUSTOM_COPY)
1608
1609
BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM,
1610
                    EVP_CIPH_FLAG_FIPS | EVP_CIPH_FLAG_AEAD_CIPHER |
1611
                    CUSTOM_FLAGS)
1612
    BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, gcm, GCM,
1613
                    EVP_CIPH_FLAG_FIPS | EVP_CIPH_FLAG_AEAD_CIPHER |
1614
                    CUSTOM_FLAGS)
1615
    BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, gcm, GCM,
1616
                    EVP_CIPH_FLAG_FIPS | EVP_CIPH_FLAG_AEAD_CIPHER |
1617
                    CUSTOM_FLAGS)
1618
1619
static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1620
0
{
1621
0
    EVP_AES_XTS_CTX *xctx = c->cipher_data;
1622
0
    if (type == EVP_CTRL_COPY) {
1623
0
        EVP_CIPHER_CTX *out = ptr;
1624
0
        EVP_AES_XTS_CTX *xctx_out = out->cipher_data;
1625
0
        if (xctx->xts.key1) {
1626
0
            if (xctx->xts.key1 != &xctx->ks1)
1627
0
                return 0;
1628
0
            xctx_out->xts.key1 = &xctx_out->ks1;
1629
0
        }
1630
0
        if (xctx->xts.key2) {
1631
0
            if (xctx->xts.key2 != &xctx->ks2)
1632
0
                return 0;
1633
0
            xctx_out->xts.key2 = &xctx_out->ks2;
1634
0
        }
1635
0
        return 1;
1636
0
    } else if (type != EVP_CTRL_INIT)
1637
0
        return -1;
1638
    /* key1 and key2 are used as an indicator both key and IV are set */
1639
0
    xctx->xts.key1 = NULL;
1640
0
    xctx->xts.key2 = NULL;
1641
0
    return 1;
1642
0
}
1643
1644
static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1645
                            const unsigned char *iv, int enc)
1646
0
{
1647
0
    EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1648
0
    if (!iv && !key)
1649
0
        return 1;
1650
1651
0
    if (key)
1652
0
        do {
1653
# ifdef AES_XTS_ASM
1654
            xctx->stream = enc ? AES_xts_encrypt : AES_xts_decrypt;
1655
# else
1656
0
            xctx->stream = NULL;
1657
0
# endif
1658
            /* key_len is two AES keys */
1659
# ifdef HWAES_CAPABLE
1660
            if (HWAES_CAPABLE) {
1661
                if (enc) {
1662
                    HWAES_set_encrypt_key(key, ctx->key_len * 4,
1663
                                          &xctx->ks1.ks);
1664
                    xctx->xts.block1 = (block128_f) HWAES_encrypt;
1665
                } else {
1666
                    HWAES_set_decrypt_key(key, ctx->key_len * 4,
1667
                                          &xctx->ks1.ks);
1668
                    xctx->xts.block1 = (block128_f) HWAES_decrypt;
1669
                }
1670
1671
                HWAES_set_encrypt_key(key + ctx->key_len / 2,
1672
                                      ctx->key_len * 4, &xctx->ks2.ks);
1673
                xctx->xts.block2 = (block128_f) HWAES_encrypt;
1674
1675
                xctx->xts.key1 = &xctx->ks1;
1676
                break;
1677
            } else
1678
# endif
1679
0
# ifdef BSAES_CAPABLE
1680
0
            if (BSAES_CAPABLE)
1681
0
                xctx->stream = enc ? bsaes_xts_encrypt : bsaes_xts_decrypt;
1682
0
            else
1683
0
# endif
1684
0
# ifdef VPAES_CAPABLE
1685
0
            if (VPAES_CAPABLE) {
1686
0
                if (enc) {
1687
0
                    vpaes_set_encrypt_key(key, ctx->key_len * 4,
1688
0
                                          &xctx->ks1.ks);
1689
0
                    xctx->xts.block1 = (block128_f) vpaes_encrypt;
1690
0
                } else {
1691
0
                    vpaes_set_decrypt_key(key, ctx->key_len * 4,
1692
0
                                          &xctx->ks1.ks);
1693
0
                    xctx->xts.block1 = (block128_f) vpaes_decrypt;
1694
0
                }
1695
1696
0
                vpaes_set_encrypt_key(key + ctx->key_len / 2,
1697
0
                                      ctx->key_len * 4, &xctx->ks2.ks);
1698
0
                xctx->xts.block2 = (block128_f) vpaes_encrypt;
1699
1700
0
                xctx->xts.key1 = &xctx->ks1;
1701
0
                break;
1702
0
            } else
1703
0
# endif
1704
0
                (void)0;        /* terminate potentially open 'else' */
1705
1706
0
            if (enc) {
1707
0
                AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1.ks);
1708
0
                xctx->xts.block1 = (block128_f) AES_encrypt;
1709
0
            } else {
1710
0
                AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1.ks);
1711
0
                xctx->xts.block1 = (block128_f) AES_decrypt;
1712
0
            }
1713
1714
0
            AES_set_encrypt_key(key + ctx->key_len / 2,
1715
0
                                ctx->key_len * 4, &xctx->ks2.ks);
1716
0
            xctx->xts.block2 = (block128_f) AES_encrypt;
1717
1718
0
            xctx->xts.key1 = &xctx->ks1;
1719
0
        } while (0);
1720
1721
0
    if (iv) {
1722
0
        xctx->xts.key2 = &xctx->ks2;
1723
0
        memcpy(ctx->iv, iv, 16);
1724
0
    }
1725
1726
0
    return 1;
1727
0
}
1728
1729
static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1730
                          const unsigned char *in, size_t len)
1731
0
{
1732
0
    EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1733
0
    if (!xctx->xts.key1 || !xctx->xts.key2)
1734
0
        return 0;
1735
0
    if (!out || !in || len < AES_BLOCK_SIZE)
1736
0
        return 0;
1737
0
    if (xctx->stream)
1738
0
        (*xctx->stream) (in, out, len,
1739
0
                         xctx->xts.key1, xctx->xts.key2, ctx->iv);
1740
0
    else if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
1741
0
                                   ctx->encrypt))
1742
0
        return 0;
1743
0
    return 1;
1744
0
}
1745
1746
# define aes_xts_cleanup NULL
1747
1748
# define XTS_FLAGS       (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
1749
                         | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
1750
                         | EVP_CIPH_CUSTOM_COPY)
1751
1752
BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS,
1753
                    EVP_CIPH_FLAG_FIPS | XTS_FLAGS)
1754
    BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS,
1755
                    EVP_CIPH_FLAG_FIPS | XTS_FLAGS)
1756
1757
static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1758
0
{
1759
0
    EVP_AES_CCM_CTX *cctx = c->cipher_data;
1760
0
    switch (type) {
1761
0
    case EVP_CTRL_INIT:
1762
0
        cctx->key_set = 0;
1763
0
        cctx->iv_set = 0;
1764
0
        cctx->L = 8;
1765
0
        cctx->M = 12;
1766
0
        cctx->tag_set = 0;
1767
0
        cctx->len_set = 0;
1768
0
        return 1;
1769
1770
0
    case EVP_CTRL_CCM_SET_IVLEN:
1771
0
        arg = 15 - arg;
1772
0
    case EVP_CTRL_CCM_SET_L:
1773
0
        if (arg < 2 || arg > 8)
1774
0
            return 0;
1775
0
        cctx->L = arg;
1776
0
        return 1;
1777
1778
0
    case EVP_CTRL_CCM_SET_TAG:
1779
0
        if ((arg & 1) || arg < 4 || arg > 16)
1780
0
            return 0;
1781
0
        if (c->encrypt && ptr)
1782
0
            return 0;
1783
0
        if (ptr) {
1784
0
            cctx->tag_set = 1;
1785
0
            memcpy(c->buf, ptr, arg);
1786
0
        }
1787
0
        cctx->M = arg;
1788
0
        return 1;
1789
1790
0
    case EVP_CTRL_CCM_GET_TAG:
1791
0
        if (!c->encrypt || !cctx->tag_set)
1792
0
            return 0;
1793
0
        if (!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
1794
0
            return 0;
1795
0
        cctx->tag_set = 0;
1796
0
        cctx->iv_set = 0;
1797
0
        cctx->len_set = 0;
1798
0
        return 1;
1799
1800
0
    case EVP_CTRL_COPY:
1801
0
        {
1802
0
            EVP_CIPHER_CTX *out = ptr;
1803
0
            EVP_AES_CCM_CTX *cctx_out = out->cipher_data;
1804
0
            if (cctx->ccm.key) {
1805
0
                if (cctx->ccm.key != &cctx->ks)
1806
0
                    return 0;
1807
0
                cctx_out->ccm.key = &cctx_out->ks;
1808
0
            }
1809
0
            return 1;
1810
0
        }
1811
1812
0
    default:
1813
0
        return -1;
1814
1815
0
    }
1816
0
}
1817
1818
static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1819
                            const unsigned char *iv, int enc)
1820
0
{
1821
0
    EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1822
0
    if (!iv && !key)
1823
0
        return 1;
1824
0
    if (key)
1825
0
        do {
1826
# ifdef HWAES_CAPABLE
1827
            if (HWAES_CAPABLE) {
1828
                HWAES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks.ks);
1829
1830
                CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
1831
                                   &cctx->ks, (block128_f) HWAES_encrypt);
1832
                cctx->str = NULL;
1833
                cctx->key_set = 1;
1834
                break;
1835
            } else
1836
# endif
1837
0
# ifdef VPAES_CAPABLE
1838
0
            if (VPAES_CAPABLE) {
1839
0
                vpaes_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks.ks);
1840
0
                CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
1841
0
                                   &cctx->ks, (block128_f) vpaes_encrypt);
1842
0
                cctx->str = NULL;
1843
0
                cctx->key_set = 1;
1844
0
                break;
1845
0
            }
1846
0
# endif
1847
0
            AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks.ks);
1848
0
            CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
1849
0
                               &cctx->ks, (block128_f) AES_encrypt);
1850
0
            cctx->str = NULL;
1851
0
            cctx->key_set = 1;
1852
0
        } while (0);
1853
0
    if (iv) {
1854
0
        memcpy(ctx->iv, iv, 15 - cctx->L);
1855
0
        cctx->iv_set = 1;
1856
0
    }
1857
0
    return 1;
1858
0
}
1859
1860
static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1861
                          const unsigned char *in, size_t len)
1862
0
{
1863
0
    EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1864
0
    CCM128_CONTEXT *ccm = &cctx->ccm;
1865
    /* If not set up, return error */
1866
0
    if (!cctx->iv_set && !cctx->key_set)
1867
0
        return -1;
1868
0
    if (!ctx->encrypt && !cctx->tag_set)
1869
0
        return -1;
1870
0
    if (!out) {
1871
0
        if (!in) {
1872
0
            if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
1873
0
                return -1;
1874
0
            cctx->len_set = 1;
1875
0
            return len;
1876
0
        }
1877
        /* If have AAD need message length */
1878
0
        if (!cctx->len_set && len)
1879
0
            return -1;
1880
0
        CRYPTO_ccm128_aad(ccm, in, len);
1881
0
        return len;
1882
0
    }
1883
    /* EVP_*Final() doesn't return any data */
1884
0
    if (!in)
1885
0
        return 0;
1886
    /* If not set length yet do it */
1887
0
    if (!cctx->len_set) {
1888
0
        if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
1889
0
            return -1;
1890
0
        cctx->len_set = 1;
1891
0
    }
1892
0
    if (ctx->encrypt) {
1893
0
        if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
1894
0
                                                    cctx->str) :
1895
0
            CRYPTO_ccm128_encrypt(ccm, in, out, len))
1896
0
            return -1;
1897
0
        cctx->tag_set = 1;
1898
0
        return len;
1899
0
    } else {
1900
0
        int rv = -1;
1901
0
        if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
1902
0
                                                     cctx->str) :
1903
0
            !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
1904
0
            unsigned char tag[16];
1905
0
            if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
1906
0
                if (!CRYPTO_memcmp(tag, ctx->buf, cctx->M))
1907
0
                    rv = len;
1908
0
            }
1909
0
        }
1910
0
        if (rv == -1)
1911
0
            OPENSSL_cleanse(out, len);
1912
0
        cctx->iv_set = 0;
1913
0
        cctx->tag_set = 0;
1914
0
        cctx->len_set = 0;
1915
0
        return rv;
1916
0
    }
1917
1918
0
}
1919
1920
# define aes_ccm_cleanup NULL
1921
1922
BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, ccm, CCM,
1923
                    EVP_CIPH_FLAG_FIPS | CUSTOM_FLAGS)
1924
    BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, ccm, CCM,
1925
                    EVP_CIPH_FLAG_FIPS | CUSTOM_FLAGS)
1926
    BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, ccm, CCM,
1927
                    EVP_CIPH_FLAG_FIPS | CUSTOM_FLAGS)
1928
#endif
1929
typedef struct {
1930
    union {
1931
        double align;
1932
        AES_KEY ks;
1933
    } ks;
1934
    /* Indicates if IV has been set */
1935
    unsigned char *iv;
1936
} EVP_AES_WRAP_CTX;
1937
1938
static int aes_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1939
                             const unsigned char *iv, int enc)
1940
0
{
1941
0
    EVP_AES_WRAP_CTX *wctx = ctx->cipher_data;
1942
0
    if (!iv && !key)
1943
0
        return 1;
1944
0
    if (key) {
1945
0
        if (ctx->encrypt)
1946
0
            AES_set_encrypt_key(key, ctx->key_len * 8, &wctx->ks.ks);
1947
0
        else
1948
0
            AES_set_decrypt_key(key, ctx->key_len * 8, &wctx->ks.ks);
1949
0
        if (!iv)
1950
0
            wctx->iv = NULL;
1951
0
    }
1952
0
    if (iv) {
1953
0
        memcpy(ctx->iv, iv, 8);
1954
0
        wctx->iv = ctx->iv;
1955
0
    }
1956
0
    return 1;
1957
0
}
1958
1959
static int aes_wrap_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1960
                           const unsigned char *in, size_t inlen)
1961
0
{
1962
0
    EVP_AES_WRAP_CTX *wctx = ctx->cipher_data;
1963
0
    size_t rv;
1964
0
    if (!in)
1965
0
        return 0;
1966
0
    if (inlen % 8)
1967
0
        return -1;
1968
0
    if (ctx->encrypt && inlen < 8)
1969
0
        return -1;
1970
0
    if (!ctx->encrypt && inlen < 16)
1971
0
        return -1;
1972
0
    if (!out) {
1973
0
        if (ctx->encrypt)
1974
0
            return inlen + 8;
1975
0
        else
1976
0
            return inlen - 8;
1977
0
    }
1978
0
    if (ctx->encrypt)
1979
0
        rv = CRYPTO_128_wrap(&wctx->ks.ks, wctx->iv, out, in, inlen,
1980
0
                             (block128_f) AES_encrypt);
1981
0
    else
1982
0
        rv = CRYPTO_128_unwrap(&wctx->ks.ks, wctx->iv, out, in, inlen,
1983
0
                               (block128_f) AES_decrypt);
1984
0
    return rv ? (int)rv : -1;
1985
0
}
1986
1987
#define WRAP_FLAGS      (EVP_CIPH_WRAP_MODE \
1988
                | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
1989
                | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1)
1990
1991
static const EVP_CIPHER aes_128_wrap = {
1992
    NID_id_aes128_wrap,
1993
    8, 16, 8, WRAP_FLAGS,
1994
    aes_wrap_init_key, aes_wrap_cipher,
1995
    NULL,
1996
    sizeof(EVP_AES_WRAP_CTX),
1997
    NULL, NULL, NULL, NULL
1998
};
1999
2000
const EVP_CIPHER *EVP_aes_128_wrap(void)
2001
19
{
2002
19
    return &aes_128_wrap;
2003
19
}
2004
2005
static const EVP_CIPHER aes_192_wrap = {
2006
    NID_id_aes192_wrap,
2007
    8, 24, 8, WRAP_FLAGS,
2008
    aes_wrap_init_key, aes_wrap_cipher,
2009
    NULL,
2010
    sizeof(EVP_AES_WRAP_CTX),
2011
    NULL, NULL, NULL, NULL
2012
};
2013
2014
const EVP_CIPHER *EVP_aes_192_wrap(void)
2015
19
{
2016
19
    return &aes_192_wrap;
2017
19
}
2018
2019
static const EVP_CIPHER aes_256_wrap = {
2020
    NID_id_aes256_wrap,
2021
    8, 32, 8, WRAP_FLAGS,
2022
    aes_wrap_init_key, aes_wrap_cipher,
2023
    NULL,
2024
    sizeof(EVP_AES_WRAP_CTX),
2025
    NULL, NULL, NULL, NULL
2026
};
2027
2028
const EVP_CIPHER *EVP_aes_256_wrap(void)
2029
19
{
2030
19
    return &aes_256_wrap;
2031
19
}