xref: /freebsd/crypto/openssl/crypto/evp/e_aes.c (revision 535af610)
1 /*
2  * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 /*
11  * This file uses the low level AES functions (which are deprecated for
12  * non-internal use) in order to implement the EVP AES ciphers.
13  */
14 #include "internal/deprecated.h"
15 
16 #include <string.h>
17 #include <assert.h>
18 #include <openssl/opensslconf.h>
19 #include <openssl/crypto.h>
20 #include <openssl/evp.h>
21 #include <openssl/err.h>
22 #include <openssl/aes.h>
23 #include <openssl/rand.h>
24 #include <openssl/cmac.h>
25 #include "crypto/evp.h"
26 #include "internal/cryptlib.h"
27 #include "crypto/modes.h"
28 #include "crypto/siv.h"
29 #include "crypto/aes_platform.h"
30 #include "evp_local.h"
31 
32 typedef struct {
33     union {
34         OSSL_UNION_ALIGN;
35         AES_KEY ks;
36     } ks;
37     block128_f block;
38     union {
39         cbc128_f cbc;
40         ctr128_f ctr;
41     } stream;
42 } EVP_AES_KEY;
43 
44 typedef struct {
45     union {
46         OSSL_UNION_ALIGN;
47         AES_KEY ks;
48     } ks;                       /* AES key schedule to use */
49     int key_set;                /* Set if key initialised */
50     int iv_set;                 /* Set if an iv is set */
51     GCM128_CONTEXT gcm;
52     unsigned char *iv;          /* Temporary IV store */
53     int ivlen;                  /* IV length */
54     int taglen;
55     int iv_gen;                 /* It is OK to generate IVs */
56     int iv_gen_rand;            /* No IV was specified, so generate a rand IV */
57     int tls_aad_len;            /* TLS AAD length */
58     uint64_t tls_enc_records;   /* Number of TLS records encrypted */
59     ctr128_f ctr;
60 } EVP_AES_GCM_CTX;
61 
62 typedef struct {
63     union {
64         OSSL_UNION_ALIGN;
65         AES_KEY ks;
66     } ks1, ks2;                 /* AES key schedules to use */
67     XTS128_CONTEXT xts;
68     void (*stream) (const unsigned char *in,
69                     unsigned char *out, size_t length,
70                     const AES_KEY *key1, const AES_KEY *key2,
71                     const unsigned char iv[16]);
72 } EVP_AES_XTS_CTX;
73 
74 #ifdef FIPS_MODULE
75 static const int allow_insecure_decrypt = 0;
76 #else
77 static const int allow_insecure_decrypt = 1;
78 #endif
79 
80 typedef struct {
81     union {
82         OSSL_UNION_ALIGN;
83         AES_KEY ks;
84     } ks;                       /* AES key schedule to use */
85     int key_set;                /* Set if key initialised */
86     int iv_set;                 /* Set if an iv is set */
87     int tag_set;                /* Set if tag is valid */
88     int len_set;                /* Set if message length set */
89     int L, M;                   /* L and M parameters from RFC3610 */
90     int tls_aad_len;            /* TLS AAD length */
91     CCM128_CONTEXT ccm;
92     ccm128_f str;
93 } EVP_AES_CCM_CTX;
94 
95 #ifndef OPENSSL_NO_OCB
96 typedef struct {
97     union {
98         OSSL_UNION_ALIGN;
99         AES_KEY ks;
100     } ksenc;                    /* AES key schedule to use for encryption */
101     union {
102         OSSL_UNION_ALIGN;
103         AES_KEY ks;
104     } ksdec;                    /* AES key schedule to use for decryption */
105     int key_set;                /* Set if key initialised */
106     int iv_set;                 /* Set if an iv is set */
107     OCB128_CONTEXT ocb;
108     unsigned char *iv;          /* Temporary IV store */
109     unsigned char tag[16];
110     unsigned char data_buf[16]; /* Store partial data blocks */
111     unsigned char aad_buf[16];  /* Store partial AAD blocks */
112     int data_buf_len;
113     int aad_buf_len;
114     int ivlen;                  /* IV length */
115     int taglen;
116 } EVP_AES_OCB_CTX;
117 #endif
118 
119 #define MAXBITCHUNK     ((size_t)1<<(sizeof(size_t)*8-4))
120 
121 /* increment counter (64-bit int) by 1 */
122 static void ctr64_inc(unsigned char *counter)
123 {
124     int n = 8;
125     unsigned char c;
126 
127     do {
128         --n;
129         c = counter[n];
130         ++c;
131         counter[n] = c;
132         if (c)
133             return;
134     } while (n);
135 }
136 
137 #if defined(AESNI_CAPABLE)
138 # if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
139 #  define AES_GCM_ASM2(gctx)      (gctx->gcm.block==(block128_f)aesni_encrypt && \
140                                  gctx->gcm.ghash==gcm_ghash_avx)
141 #  undef AES_GCM_ASM2          /* minor size optimization */
142 # endif
143 
144 static int aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
145                           const unsigned char *iv, int enc)
146 {
147     int ret, mode;
148     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
149 
150     mode = EVP_CIPHER_CTX_get_mode(ctx);
151     if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
152         && !enc) {
153         ret = aesni_set_decrypt_key(key,
154                                     EVP_CIPHER_CTX_get_key_length(ctx) * 8,
155                                     &dat->ks.ks);
156         dat->block = (block128_f) aesni_decrypt;
157         dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
158             (cbc128_f) aesni_cbc_encrypt : NULL;
159     } else {
160         ret = aesni_set_encrypt_key(key,
161                                     EVP_CIPHER_CTX_get_key_length(ctx) * 8,
162                                     &dat->ks.ks);
163         dat->block = (block128_f) aesni_encrypt;
164         if (mode == EVP_CIPH_CBC_MODE)
165             dat->stream.cbc = (cbc128_f) aesni_cbc_encrypt;
166         else if (mode == EVP_CIPH_CTR_MODE)
167             dat->stream.ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
168         else
169             dat->stream.cbc = NULL;
170     }
171 
172     if (ret < 0) {
173         ERR_raise(ERR_LIB_EVP, EVP_R_AES_KEY_SETUP_FAILED);
174         return 0;
175     }
176 
177     return 1;
178 }
179 
180 static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
181                             const unsigned char *in, size_t len)
182 {
183     aesni_cbc_encrypt(in, out, len, &EVP_C_DATA(EVP_AES_KEY,ctx)->ks.ks,
184                       ctx->iv, EVP_CIPHER_CTX_is_encrypting(ctx));
185 
186     return 1;
187 }
188 
189 static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
190                             const unsigned char *in, size_t len)
191 {
192     size_t bl = EVP_CIPHER_CTX_get_block_size(ctx);
193 
194     if (len < bl)
195         return 1;
196 
197     aesni_ecb_encrypt(in, out, len, &EVP_C_DATA(EVP_AES_KEY,ctx)->ks.ks,
198                       EVP_CIPHER_CTX_is_encrypting(ctx));
199 
200     return 1;
201 }
202 
203 # define aesni_ofb_cipher aes_ofb_cipher
204 static int aesni_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
205                             const unsigned char *in, size_t len);
206 
207 # define aesni_cfb_cipher aes_cfb_cipher
208 static int aesni_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
209                             const unsigned char *in, size_t len);
210 
211 # define aesni_cfb8_cipher aes_cfb8_cipher
212 static int aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
213                              const unsigned char *in, size_t len);
214 
215 # define aesni_cfb1_cipher aes_cfb1_cipher
216 static int aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
217                              const unsigned char *in, size_t len);
218 
219 # define aesni_ctr_cipher aes_ctr_cipher
220 static int aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
221                             const unsigned char *in, size_t len);
222 
223 static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
224                               const unsigned char *iv, int enc)
225 {
226     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
227     if (!iv && !key)
228         return 1;
229     if (key) {
230         aesni_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
231                               &gctx->ks.ks);
232         CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f) aesni_encrypt);
233         gctx->ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
234         /*
235          * If we have an iv can set it directly, otherwise use saved IV.
236          */
237         if (iv == NULL && gctx->iv_set)
238             iv = gctx->iv;
239         if (iv) {
240             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
241             gctx->iv_set = 1;
242         }
243         gctx->key_set = 1;
244     } else {
245         /* If key set use IV, otherwise copy */
246         if (gctx->key_set)
247             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
248         else
249             memcpy(gctx->iv, iv, gctx->ivlen);
250         gctx->iv_set = 1;
251         gctx->iv_gen = 0;
252     }
253     return 1;
254 }
255 
256 # define aesni_gcm_cipher aes_gcm_cipher
257 static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
258                             const unsigned char *in, size_t len);
259 
260 static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
261                               const unsigned char *iv, int enc)
262 {
263     EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
264 
265     if (!iv && !key)
266         return 1;
267 
268     if (key) {
269         /* The key is two half length keys in reality */
270         const int bytes = EVP_CIPHER_CTX_get_key_length(ctx) / 2;
271         const int bits = bytes * 8;
272 
273         /*
274          * Verify that the two keys are different.
275          *
276          * This addresses Rogaway's vulnerability.
277          * See comment in aes_xts_init_key() below.
278          */
279         if ((!allow_insecure_decrypt || enc)
280                 && CRYPTO_memcmp(key, key + bytes, bytes) == 0) {
281             ERR_raise(ERR_LIB_EVP, EVP_R_XTS_DUPLICATED_KEYS);
282             return 0;
283         }
284 
285         /* key_len is two AES keys */
286         if (enc) {
287             aesni_set_encrypt_key(key, bits, &xctx->ks1.ks);
288             xctx->xts.block1 = (block128_f) aesni_encrypt;
289             xctx->stream = aesni_xts_encrypt;
290         } else {
291             aesni_set_decrypt_key(key, bits, &xctx->ks1.ks);
292             xctx->xts.block1 = (block128_f) aesni_decrypt;
293             xctx->stream = aesni_xts_decrypt;
294         }
295 
296         aesni_set_encrypt_key(key + bytes, bits, &xctx->ks2.ks);
297         xctx->xts.block2 = (block128_f) aesni_encrypt;
298 
299         xctx->xts.key1 = &xctx->ks1;
300     }
301 
302     if (iv) {
303         xctx->xts.key2 = &xctx->ks2;
304         memcpy(ctx->iv, iv, 16);
305     }
306 
307     return 1;
308 }
309 
310 # define aesni_xts_cipher aes_xts_cipher
311 static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
312                             const unsigned char *in, size_t len);
313 
314 static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
315                               const unsigned char *iv, int enc)
316 {
317     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
318     if (!iv && !key)
319         return 1;
320     if (key) {
321         aesni_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
322                               &cctx->ks.ks);
323         CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
324                            &cctx->ks, (block128_f) aesni_encrypt);
325         cctx->str = enc ? (ccm128_f) aesni_ccm64_encrypt_blocks :
326             (ccm128_f) aesni_ccm64_decrypt_blocks;
327         cctx->key_set = 1;
328     }
329     if (iv) {
330         memcpy(ctx->iv, iv, 15 - cctx->L);
331         cctx->iv_set = 1;
332     }
333     return 1;
334 }
335 
336 # define aesni_ccm_cipher aes_ccm_cipher
337 static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
338                             const unsigned char *in, size_t len);
339 
340 # ifndef OPENSSL_NO_OCB
341 static int aesni_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
342                               const unsigned char *iv, int enc)
343 {
344     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
345     if (!iv && !key)
346         return 1;
347     if (key) {
348         do {
349             /*
350              * We set both the encrypt and decrypt key here because decrypt
351              * needs both. We could possibly optimise to remove setting the
352              * decrypt for an encryption operation.
353              */
354             aesni_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
355                                   &octx->ksenc.ks);
356             aesni_set_decrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
357                                   &octx->ksdec.ks);
358             if (!CRYPTO_ocb128_init(&octx->ocb,
359                                     &octx->ksenc.ks, &octx->ksdec.ks,
360                                     (block128_f) aesni_encrypt,
361                                     (block128_f) aesni_decrypt,
362                                     enc ? aesni_ocb_encrypt
363                                         : aesni_ocb_decrypt))
364                 return 0;
365         }
366         while (0);
367 
368         /*
369          * If we have an iv we can set it directly, otherwise use saved IV.
370          */
371         if (iv == NULL && octx->iv_set)
372             iv = octx->iv;
373         if (iv) {
374             if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
375                 != 1)
376                 return 0;
377             octx->iv_set = 1;
378         }
379         octx->key_set = 1;
380     } else {
381         /* If key set use IV, otherwise copy */
382         if (octx->key_set)
383             CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
384         else
385             memcpy(octx->iv, iv, octx->ivlen);
386         octx->iv_set = 1;
387     }
388     return 1;
389 }
390 
391 #  define aesni_ocb_cipher aes_ocb_cipher
392 static int aesni_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
393                             const unsigned char *in, size_t len);
394 # endif                        /* OPENSSL_NO_OCB */
395 
396 # define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
397 static const EVP_CIPHER aesni_##keylen##_##mode = { \
398         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
399         flags|EVP_CIPH_##MODE##_MODE,   \
400         EVP_ORIG_GLOBAL,                \
401         aesni_init_key,                 \
402         aesni_##mode##_cipher,          \
403         NULL,                           \
404         sizeof(EVP_AES_KEY),            \
405         NULL,NULL,NULL,NULL }; \
406 static const EVP_CIPHER aes_##keylen##_##mode = { \
407         nid##_##keylen##_##nmode,blocksize,     \
408         keylen/8,ivlen,                 \
409         flags|EVP_CIPH_##MODE##_MODE,   \
410         EVP_ORIG_GLOBAL,                 \
411         aes_init_key,                   \
412         aes_##mode##_cipher,            \
413         NULL,                           \
414         sizeof(EVP_AES_KEY),            \
415         NULL,NULL,NULL,NULL }; \
416 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
417 { return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
418 
419 # define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
420 static const EVP_CIPHER aesni_##keylen##_##mode = { \
421         nid##_##keylen##_##mode,blocksize, \
422         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE?2:1)*keylen/8, \
423         ivlen,                          \
424         flags|EVP_CIPH_##MODE##_MODE,   \
425         EVP_ORIG_GLOBAL,                \
426         aesni_##mode##_init_key,        \
427         aesni_##mode##_cipher,          \
428         aes_##mode##_cleanup,           \
429         sizeof(EVP_AES_##MODE##_CTX),   \
430         NULL,NULL,aes_##mode##_ctrl,NULL }; \
431 static const EVP_CIPHER aes_##keylen##_##mode = { \
432         nid##_##keylen##_##mode,blocksize, \
433         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE?2:1)*keylen/8, \
434         ivlen,                          \
435         flags|EVP_CIPH_##MODE##_MODE,   \
436         EVP_ORIG_GLOBAL,                \
437         aes_##mode##_init_key,          \
438         aes_##mode##_cipher,            \
439         aes_##mode##_cleanup,           \
440         sizeof(EVP_AES_##MODE##_CTX),   \
441         NULL,NULL,aes_##mode##_ctrl,NULL }; \
442 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
443 { return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
444 
445 #elif defined(SPARC_AES_CAPABLE)
446 
447 static int aes_t4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
448                            const unsigned char *iv, int enc)
449 {
450     int ret, mode, bits;
451     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
452 
453     mode = EVP_CIPHER_CTX_get_mode(ctx);
454     bits = EVP_CIPHER_CTX_get_key_length(ctx) * 8;
455     if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
456         && !enc) {
457         ret = 0;
458         aes_t4_set_decrypt_key(key, bits, &dat->ks.ks);
459         dat->block = (block128_f) aes_t4_decrypt;
460         switch (bits) {
461         case 128:
462             dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
463                 (cbc128_f) aes128_t4_cbc_decrypt : NULL;
464             break;
465         case 192:
466             dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
467                 (cbc128_f) aes192_t4_cbc_decrypt : NULL;
468             break;
469         case 256:
470             dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
471                 (cbc128_f) aes256_t4_cbc_decrypt : NULL;
472             break;
473         default:
474             ret = -1;
475         }
476     } else {
477         ret = 0;
478         aes_t4_set_encrypt_key(key, bits, &dat->ks.ks);
479         dat->block = (block128_f) aes_t4_encrypt;
480         switch (bits) {
481         case 128:
482             if (mode == EVP_CIPH_CBC_MODE)
483                 dat->stream.cbc = (cbc128_f) aes128_t4_cbc_encrypt;
484             else if (mode == EVP_CIPH_CTR_MODE)
485                 dat->stream.ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
486             else
487                 dat->stream.cbc = NULL;
488             break;
489         case 192:
490             if (mode == EVP_CIPH_CBC_MODE)
491                 dat->stream.cbc = (cbc128_f) aes192_t4_cbc_encrypt;
492             else if (mode == EVP_CIPH_CTR_MODE)
493                 dat->stream.ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
494             else
495                 dat->stream.cbc = NULL;
496             break;
497         case 256:
498             if (mode == EVP_CIPH_CBC_MODE)
499                 dat->stream.cbc = (cbc128_f) aes256_t4_cbc_encrypt;
500             else if (mode == EVP_CIPH_CTR_MODE)
501                 dat->stream.ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
502             else
503                 dat->stream.cbc = NULL;
504             break;
505         default:
506             ret = -1;
507         }
508     }
509 
510     if (ret < 0) {
511         ERR_raise(ERR_LIB_EVP, EVP_R_AES_KEY_SETUP_FAILED);
512         return 0;
513     }
514 
515     return 1;
516 }
517 
518 # define aes_t4_cbc_cipher aes_cbc_cipher
519 static int aes_t4_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
520                              const unsigned char *in, size_t len);
521 
522 # define aes_t4_ecb_cipher aes_ecb_cipher
523 static int aes_t4_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
524                              const unsigned char *in, size_t len);
525 
526 # define aes_t4_ofb_cipher aes_ofb_cipher
527 static int aes_t4_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
528                              const unsigned char *in, size_t len);
529 
530 # define aes_t4_cfb_cipher aes_cfb_cipher
531 static int aes_t4_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
532                              const unsigned char *in, size_t len);
533 
534 # define aes_t4_cfb8_cipher aes_cfb8_cipher
535 static int aes_t4_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
536                               const unsigned char *in, size_t len);
537 
538 # define aes_t4_cfb1_cipher aes_cfb1_cipher
539 static int aes_t4_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
540                               const unsigned char *in, size_t len);
541 
542 # define aes_t4_ctr_cipher aes_ctr_cipher
543 static int aes_t4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
544                              const unsigned char *in, size_t len);
545 
546 static int aes_t4_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
547                                const unsigned char *iv, int enc)
548 {
549     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
550     if (!iv && !key)
551         return 1;
552     if (key) {
553         int bits = EVP_CIPHER_CTX_get_key_length(ctx) * 8;
554         aes_t4_set_encrypt_key(key, bits, &gctx->ks.ks);
555         CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
556                            (block128_f) aes_t4_encrypt);
557         switch (bits) {
558         case 128:
559             gctx->ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
560             break;
561         case 192:
562             gctx->ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
563             break;
564         case 256:
565             gctx->ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
566             break;
567         default:
568             return 0;
569         }
570         /*
571          * If we have an iv can set it directly, otherwise use saved IV.
572          */
573         if (iv == NULL && gctx->iv_set)
574             iv = gctx->iv;
575         if (iv) {
576             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
577             gctx->iv_set = 1;
578         }
579         gctx->key_set = 1;
580     } else {
581         /* If key set use IV, otherwise copy */
582         if (gctx->key_set)
583             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
584         else
585             memcpy(gctx->iv, iv, gctx->ivlen);
586         gctx->iv_set = 1;
587         gctx->iv_gen = 0;
588     }
589     return 1;
590 }
591 
592 # define aes_t4_gcm_cipher aes_gcm_cipher
593 static int aes_t4_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
594                              const unsigned char *in, size_t len);
595 
596 static int aes_t4_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
597                                const unsigned char *iv, int enc)
598 {
599     EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
600 
601     if (!iv && !key)
602         return 1;
603 
604     if (key) {
605         /* The key is two half length keys in reality */
606         const int bytes = EVP_CIPHER_CTX_get_key_length(ctx) / 2;
607         const int bits = bytes * 8;
608 
609         /*
610          * Verify that the two keys are different.
611          *
612          * This addresses Rogaway's vulnerability.
613          * See comment in aes_xts_init_key() below.
614          */
615         if ((!allow_insecure_decrypt || enc)
616                 && CRYPTO_memcmp(key, key + bytes, bytes) == 0) {
617             ERR_raise(ERR_LIB_EVP, EVP_R_XTS_DUPLICATED_KEYS);
618             return 0;
619         }
620 
621         xctx->stream = NULL;
622         /* key_len is two AES keys */
623         if (enc) {
624             aes_t4_set_encrypt_key(key, bits, &xctx->ks1.ks);
625             xctx->xts.block1 = (block128_f) aes_t4_encrypt;
626             switch (bits) {
627             case 128:
628                 xctx->stream = aes128_t4_xts_encrypt;
629                 break;
630             case 256:
631                 xctx->stream = aes256_t4_xts_encrypt;
632                 break;
633             default:
634                 return 0;
635             }
636         } else {
637             aes_t4_set_decrypt_key(key, bits, &xctx->ks1.ks);
638             xctx->xts.block1 = (block128_f) aes_t4_decrypt;
639             switch (bits) {
640             case 128:
641                 xctx->stream = aes128_t4_xts_decrypt;
642                 break;
643             case 256:
644                 xctx->stream = aes256_t4_xts_decrypt;
645                 break;
646             default:
647                 return 0;
648             }
649         }
650 
651         aes_t4_set_encrypt_key(key + bytes, bits, &xctx->ks2.ks);
652         xctx->xts.block2 = (block128_f) aes_t4_encrypt;
653 
654         xctx->xts.key1 = &xctx->ks1;
655     }
656 
657     if (iv) {
658         xctx->xts.key2 = &xctx->ks2;
659         memcpy(ctx->iv, iv, 16);
660     }
661 
662     return 1;
663 }
664 
665 # define aes_t4_xts_cipher aes_xts_cipher
666 static int aes_t4_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
667                              const unsigned char *in, size_t len);
668 
669 static int aes_t4_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
670                                const unsigned char *iv, int enc)
671 {
672     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
673     if (!iv && !key)
674         return 1;
675     if (key) {
676         int bits = EVP_CIPHER_CTX_get_key_length(ctx) * 8;
677         aes_t4_set_encrypt_key(key, bits, &cctx->ks.ks);
678         CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
679                            &cctx->ks, (block128_f) aes_t4_encrypt);
680         cctx->str = NULL;
681         cctx->key_set = 1;
682     }
683     if (iv) {
684         memcpy(ctx->iv, iv, 15 - cctx->L);
685         cctx->iv_set = 1;
686     }
687     return 1;
688 }
689 
690 # define aes_t4_ccm_cipher aes_ccm_cipher
691 static int aes_t4_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
692                              const unsigned char *in, size_t len);
693 
694 # ifndef OPENSSL_NO_OCB
695 static int aes_t4_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
696                                const unsigned char *iv, int enc)
697 {
698     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
699     if (!iv && !key)
700         return 1;
701     if (key) {
702         do {
703             /*
704              * We set both the encrypt and decrypt key here because decrypt
705              * needs both. We could possibly optimise to remove setting the
706              * decrypt for an encryption operation.
707              */
708             aes_t4_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
709                                    &octx->ksenc.ks);
710             aes_t4_set_decrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
711                                    &octx->ksdec.ks);
712             if (!CRYPTO_ocb128_init(&octx->ocb,
713                                     &octx->ksenc.ks, &octx->ksdec.ks,
714                                     (block128_f) aes_t4_encrypt,
715                                     (block128_f) aes_t4_decrypt,
716                                     NULL))
717                 return 0;
718         }
719         while (0);
720 
721         /*
722          * If we have an iv we can set it directly, otherwise use saved IV.
723          */
724         if (iv == NULL && octx->iv_set)
725             iv = octx->iv;
726         if (iv) {
727             if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
728                 != 1)
729                 return 0;
730             octx->iv_set = 1;
731         }
732         octx->key_set = 1;
733     } else {
734         /* If key set use IV, otherwise copy */
735         if (octx->key_set)
736             CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
737         else
738             memcpy(octx->iv, iv, octx->ivlen);
739         octx->iv_set = 1;
740     }
741     return 1;
742 }
743 
744 #  define aes_t4_ocb_cipher aes_ocb_cipher
745 static int aes_t4_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
746                              const unsigned char *in, size_t len);
747 # endif                        /* OPENSSL_NO_OCB */
748 
749 # ifndef OPENSSL_NO_SIV
750 #  define aes_t4_siv_init_key aes_siv_init_key
751 #  define aes_t4_siv_cipher aes_siv_cipher
752 # endif /* OPENSSL_NO_SIV */
753 
754 # define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
755 static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
756         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
757         flags|EVP_CIPH_##MODE##_MODE,   \
758         EVP_ORIG_GLOBAL,                \
759         aes_t4_init_key,                \
760         aes_t4_##mode##_cipher,         \
761         NULL,                           \
762         sizeof(EVP_AES_KEY),            \
763         NULL,NULL,NULL,NULL }; \
764 static const EVP_CIPHER aes_##keylen##_##mode = { \
765         nid##_##keylen##_##nmode,blocksize,     \
766         keylen/8,ivlen, \
767         flags|EVP_CIPH_##MODE##_MODE,   \
768         EVP_ORIG_GLOBAL,                \
769         aes_init_key,                   \
770         aes_##mode##_cipher,            \
771         NULL,                           \
772         sizeof(EVP_AES_KEY),            \
773         NULL,NULL,NULL,NULL }; \
774 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
775 { return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
776 
777 # define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
778 static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
779         nid##_##keylen##_##mode,blocksize, \
780         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE?2:1)*keylen/8, \
781         ivlen,                          \
782         flags|EVP_CIPH_##MODE##_MODE,   \
783         EVP_ORIG_GLOBAL,                \
784         aes_t4_##mode##_init_key,       \
785         aes_t4_##mode##_cipher,         \
786         aes_##mode##_cleanup,           \
787         sizeof(EVP_AES_##MODE##_CTX),   \
788         NULL,NULL,aes_##mode##_ctrl,NULL }; \
789 static const EVP_CIPHER aes_##keylen##_##mode = { \
790         nid##_##keylen##_##mode,blocksize, \
791         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE?2:1)*keylen/8, \
792         ivlen,                          \
793         flags|EVP_CIPH_##MODE##_MODE,   \
794         EVP_ORIG_GLOBAL,                \
795         aes_##mode##_init_key,          \
796         aes_##mode##_cipher,            \
797         aes_##mode##_cleanup,           \
798         sizeof(EVP_AES_##MODE##_CTX),   \
799         NULL,NULL,aes_##mode##_ctrl,NULL }; \
800 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
801 { return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
802 
803 #elif defined(S390X_aes_128_CAPABLE)
804 /* IBM S390X support */
805 typedef struct {
806     union {
807         OSSL_UNION_ALIGN;
808         /*-
809          * KM-AES parameter block - begin
810          * (see z/Architecture Principles of Operation >= SA22-7832-06)
811          */
812         struct {
813             unsigned char k[32];
814         } param;
815         /* KM-AES parameter block - end */
816     } km;
817     unsigned int fc;
818 } S390X_AES_ECB_CTX;
819 
820 typedef struct {
821     union {
822         OSSL_UNION_ALIGN;
823         /*-
824          * KMO-AES parameter block - begin
825          * (see z/Architecture Principles of Operation >= SA22-7832-08)
826          */
827         struct {
828             unsigned char cv[16];
829             unsigned char k[32];
830         } param;
831         /* KMO-AES parameter block - end */
832     } kmo;
833     unsigned int fc;
834 
835     int res;
836 } S390X_AES_OFB_CTX;
837 
838 typedef struct {
839     union {
840         OSSL_UNION_ALIGN;
841         /*-
842          * KMF-AES parameter block - begin
843          * (see z/Architecture Principles of Operation >= SA22-7832-08)
844          */
845         struct {
846             unsigned char cv[16];
847             unsigned char k[32];
848         } param;
849         /* KMF-AES parameter block - end */
850     } kmf;
851     unsigned int fc;
852 
853     int res;
854 } S390X_AES_CFB_CTX;
855 
856 typedef struct {
857     union {
858         OSSL_UNION_ALIGN;
859         /*-
860          * KMA-GCM-AES parameter block - begin
861          * (see z/Architecture Principles of Operation >= SA22-7832-11)
862          */
863         struct {
864             unsigned char reserved[12];
865             union {
866                 unsigned int w;
867                 unsigned char b[4];
868             } cv;
869             union {
870                 unsigned long long g[2];
871                 unsigned char b[16];
872             } t;
873             unsigned char h[16];
874             unsigned long long taadl;
875             unsigned long long tpcl;
876             union {
877                 unsigned long long g[2];
878                 unsigned int w[4];
879             } j0;
880             unsigned char k[32];
881         } param;
882         /* KMA-GCM-AES parameter block - end */
883     } kma;
884     unsigned int fc;
885     int key_set;
886 
887     unsigned char *iv;
888     int ivlen;
889     int iv_set;
890     int iv_gen;
891 
892     int taglen;
893 
894     unsigned char ares[16];
895     unsigned char mres[16];
896     unsigned char kres[16];
897     int areslen;
898     int mreslen;
899     int kreslen;
900 
901     int tls_aad_len;
902     uint64_t tls_enc_records;   /* Number of TLS records encrypted */
903 } S390X_AES_GCM_CTX;
904 
905 typedef struct {
906     union {
907         OSSL_UNION_ALIGN;
908         /*-
909          * Padding is chosen so that ccm.kmac_param.k overlaps with key.k and
910          * ccm.fc with key.k.rounds. Remember that on s390x, an AES_KEY's
911          * rounds field is used to store the function code and that the key
912          * schedule is not stored (if aes hardware support is detected).
913          */
914         struct {
915             unsigned char pad[16];
916             AES_KEY k;
917         } key;
918 
919         struct {
920             /*-
921              * KMAC-AES parameter block - begin
922              * (see z/Architecture Principles of Operation >= SA22-7832-08)
923              */
924             struct {
925                 union {
926                     unsigned long long g[2];
927                     unsigned char b[16];
928                 } icv;
929                 unsigned char k[32];
930             } kmac_param;
931             /* KMAC-AES parameter block - end */
932 
933             union {
934                 unsigned long long g[2];
935                 unsigned char b[16];
936             } nonce;
937             union {
938                 unsigned long long g[2];
939                 unsigned char b[16];
940             } buf;
941 
942             unsigned long long blocks;
943             int l;
944             int m;
945             int tls_aad_len;
946             int iv_set;
947             int tag_set;
948             int len_set;
949             int key_set;
950 
951             unsigned char pad[140];
952             unsigned int fc;
953         } ccm;
954     } aes;
955 } S390X_AES_CCM_CTX;
956 
957 # define s390x_aes_init_key aes_init_key
958 static int s390x_aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
959                               const unsigned char *iv, int enc);
960 
961 # define S390X_AES_CBC_CTX              EVP_AES_KEY
962 
963 # define s390x_aes_cbc_init_key aes_init_key
964 
965 # define s390x_aes_cbc_cipher aes_cbc_cipher
966 static int s390x_aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
967                                 const unsigned char *in, size_t len);
968 
969 static int s390x_aes_ecb_init_key(EVP_CIPHER_CTX *ctx,
970                                   const unsigned char *key,
971                                   const unsigned char *iv, int enc)
972 {
973     S390X_AES_ECB_CTX *cctx = EVP_C_DATA(S390X_AES_ECB_CTX, ctx);
974     const int keylen = EVP_CIPHER_CTX_get_key_length(ctx);
975 
976     cctx->fc = S390X_AES_FC(keylen);
977     if (!enc)
978         cctx->fc |= S390X_DECRYPT;
979 
980     memcpy(cctx->km.param.k, key, keylen);
981     return 1;
982 }
983 
984 static int s390x_aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
985                                 const unsigned char *in, size_t len)
986 {
987     S390X_AES_ECB_CTX *cctx = EVP_C_DATA(S390X_AES_ECB_CTX, ctx);
988 
989     s390x_km(in, len, out, cctx->fc, &cctx->km.param);
990     return 1;
991 }
992 
993 static int s390x_aes_ofb_init_key(EVP_CIPHER_CTX *ctx,
994                                   const unsigned char *key,
995                                   const unsigned char *ivec, int enc)
996 {
997     S390X_AES_OFB_CTX *cctx = EVP_C_DATA(S390X_AES_OFB_CTX, ctx);
998     const unsigned char *iv = ctx->oiv;
999     const int keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1000     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1001 
1002     memcpy(cctx->kmo.param.cv, iv, ivlen);
1003     memcpy(cctx->kmo.param.k, key, keylen);
1004     cctx->fc = S390X_AES_FC(keylen);
1005     cctx->res = 0;
1006     return 1;
1007 }
1008 
1009 static int s390x_aes_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1010                                 const unsigned char *in, size_t len)
1011 {
1012     S390X_AES_OFB_CTX *cctx = EVP_C_DATA(S390X_AES_OFB_CTX, ctx);
1013     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1014     unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
1015     int n = cctx->res;
1016     int rem;
1017 
1018     memcpy(cctx->kmo.param.cv, iv, ivlen);
1019     while (n && len) {
1020         *out = *in ^ cctx->kmo.param.cv[n];
1021         n = (n + 1) & 0xf;
1022         --len;
1023         ++in;
1024         ++out;
1025     }
1026 
1027     rem = len & 0xf;
1028 
1029     len &= ~(size_t)0xf;
1030     if (len) {
1031         s390x_kmo(in, len, out, cctx->fc, &cctx->kmo.param);
1032 
1033         out += len;
1034         in += len;
1035     }
1036 
1037     if (rem) {
1038         s390x_km(cctx->kmo.param.cv, 16, cctx->kmo.param.cv, cctx->fc,
1039                  cctx->kmo.param.k);
1040 
1041         while (rem--) {
1042             out[n] = in[n] ^ cctx->kmo.param.cv[n];
1043             ++n;
1044         }
1045     }
1046 
1047     memcpy(iv, cctx->kmo.param.cv, ivlen);
1048     cctx->res = n;
1049     return 1;
1050 }
1051 
1052 static int s390x_aes_cfb_init_key(EVP_CIPHER_CTX *ctx,
1053                                   const unsigned char *key,
1054                                   const unsigned char *ivec, int enc)
1055 {
1056     S390X_AES_CFB_CTX *cctx = EVP_C_DATA(S390X_AES_CFB_CTX, ctx);
1057     const unsigned char *iv = ctx->oiv;
1058     const int keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1059     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1060 
1061     cctx->fc = S390X_AES_FC(keylen);
1062     cctx->fc |= 16 << 24;   /* 16 bytes cipher feedback */
1063     if (!enc)
1064         cctx->fc |= S390X_DECRYPT;
1065 
1066     cctx->res = 0;
1067     memcpy(cctx->kmf.param.cv, iv, ivlen);
1068     memcpy(cctx->kmf.param.k, key, keylen);
1069     return 1;
1070 }
1071 
1072 static int s390x_aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1073                                 const unsigned char *in, size_t len)
1074 {
1075     S390X_AES_CFB_CTX *cctx = EVP_C_DATA(S390X_AES_CFB_CTX, ctx);
1076     const int keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1077     const int enc = EVP_CIPHER_CTX_is_encrypting(ctx);
1078     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1079     unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
1080     int n = cctx->res;
1081     int rem;
1082     unsigned char tmp;
1083 
1084     memcpy(cctx->kmf.param.cv, iv, ivlen);
1085     while (n && len) {
1086         tmp = *in;
1087         *out = cctx->kmf.param.cv[n] ^ tmp;
1088         cctx->kmf.param.cv[n] = enc ? *out : tmp;
1089         n = (n + 1) & 0xf;
1090         --len;
1091         ++in;
1092         ++out;
1093     }
1094 
1095     rem = len & 0xf;
1096 
1097     len &= ~(size_t)0xf;
1098     if (len) {
1099         s390x_kmf(in, len, out, cctx->fc, &cctx->kmf.param);
1100 
1101         out += len;
1102         in += len;
1103     }
1104 
1105     if (rem) {
1106         s390x_km(cctx->kmf.param.cv, 16, cctx->kmf.param.cv,
1107                  S390X_AES_FC(keylen), cctx->kmf.param.k);
1108 
1109         while (rem--) {
1110             tmp = in[n];
1111             out[n] = cctx->kmf.param.cv[n] ^ tmp;
1112             cctx->kmf.param.cv[n] = enc ? out[n] : tmp;
1113             ++n;
1114         }
1115     }
1116 
1117     memcpy(iv, cctx->kmf.param.cv, ivlen);
1118     cctx->res = n;
1119     return 1;
1120 }
1121 
1122 static int s390x_aes_cfb8_init_key(EVP_CIPHER_CTX *ctx,
1123                                    const unsigned char *key,
1124                                    const unsigned char *ivec, int enc)
1125 {
1126     S390X_AES_CFB_CTX *cctx = EVP_C_DATA(S390X_AES_CFB_CTX, ctx);
1127     const unsigned char *iv = ctx->oiv;
1128     const int keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1129     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1130 
1131     cctx->fc = S390X_AES_FC(keylen);
1132     cctx->fc |= 1 << 24;   /* 1 byte cipher feedback */
1133     if (!enc)
1134         cctx->fc |= S390X_DECRYPT;
1135 
1136     memcpy(cctx->kmf.param.cv, iv, ivlen);
1137     memcpy(cctx->kmf.param.k, key, keylen);
1138     return 1;
1139 }
1140 
1141 static int s390x_aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1142                                  const unsigned char *in, size_t len)
1143 {
1144     S390X_AES_CFB_CTX *cctx = EVP_C_DATA(S390X_AES_CFB_CTX, ctx);
1145     const int ivlen = EVP_CIPHER_CTX_get_iv_length(ctx);
1146     unsigned char *iv = EVP_CIPHER_CTX_iv_noconst(ctx);
1147 
1148     memcpy(cctx->kmf.param.cv, iv, ivlen);
1149     s390x_kmf(in, len, out, cctx->fc, &cctx->kmf.param);
1150     memcpy(iv, cctx->kmf.param.cv, ivlen);
1151     return 1;
1152 }
1153 
1154 # define s390x_aes_cfb1_init_key aes_init_key
1155 
1156 # define s390x_aes_cfb1_cipher aes_cfb1_cipher
1157 static int s390x_aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1158                                  const unsigned char *in, size_t len);
1159 
1160 # define S390X_AES_CTR_CTX              EVP_AES_KEY
1161 
1162 # define s390x_aes_ctr_init_key aes_init_key
1163 
1164 # define s390x_aes_ctr_cipher aes_ctr_cipher
1165 static int s390x_aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1166                                 const unsigned char *in, size_t len);
1167 
1168 /* iv + padding length for iv lengths != 12 */
1169 # define S390X_gcm_ivpadlen(i)  ((((i) + 15) >> 4 << 4) + 16)
1170 
1171 /*-
1172  * Process additional authenticated data. Returns 0 on success. Code is
1173  * big-endian.
1174  */
1175 static int s390x_aes_gcm_aad(S390X_AES_GCM_CTX *ctx, const unsigned char *aad,
1176                              size_t len)
1177 {
1178     unsigned long long alen;
1179     int n, rem;
1180 
1181     if (ctx->kma.param.tpcl)
1182         return -2;
1183 
1184     alen = ctx->kma.param.taadl + len;
1185     if (alen > (U64(1) << 61) || (sizeof(len) == 8 && alen < len))
1186         return -1;
1187     ctx->kma.param.taadl = alen;
1188 
1189     n = ctx->areslen;
1190     if (n) {
1191         while (n && len) {
1192             ctx->ares[n] = *aad;
1193             n = (n + 1) & 0xf;
1194             ++aad;
1195             --len;
1196         }
1197         /* ctx->ares contains a complete block if offset has wrapped around */
1198         if (!n) {
1199             s390x_kma(ctx->ares, 16, NULL, 0, NULL, ctx->fc, &ctx->kma.param);
1200             ctx->fc |= S390X_KMA_HS;
1201         }
1202         ctx->areslen = n;
1203     }
1204 
1205     rem = len & 0xf;
1206 
1207     len &= ~(size_t)0xf;
1208     if (len) {
1209         s390x_kma(aad, len, NULL, 0, NULL, ctx->fc, &ctx->kma.param);
1210         aad += len;
1211         ctx->fc |= S390X_KMA_HS;
1212     }
1213 
1214     if (rem) {
1215         ctx->areslen = rem;
1216 
1217         do {
1218             --rem;
1219             ctx->ares[rem] = aad[rem];
1220         } while (rem);
1221     }
1222     return 0;
1223 }
1224 
1225 /*-
1226  * En/de-crypt plain/cipher-text and authenticate ciphertext. Returns 0 for
1227  * success. Code is big-endian.
1228  */
1229 static int s390x_aes_gcm(S390X_AES_GCM_CTX *ctx, const unsigned char *in,
1230                          unsigned char *out, size_t len)
1231 {
1232     const unsigned char *inptr;
1233     unsigned long long mlen;
1234     union {
1235         unsigned int w[4];
1236         unsigned char b[16];
1237     } buf;
1238     size_t inlen;
1239     int n, rem, i;
1240 
1241     mlen = ctx->kma.param.tpcl + len;
1242     if (mlen > ((U64(1) << 36) - 32) || (sizeof(len) == 8 && mlen < len))
1243         return -1;
1244     ctx->kma.param.tpcl = mlen;
1245 
1246     n = ctx->mreslen;
1247     if (n) {
1248         inptr = in;
1249         inlen = len;
1250         while (n && inlen) {
1251             ctx->mres[n] = *inptr;
1252             n = (n + 1) & 0xf;
1253             ++inptr;
1254             --inlen;
1255         }
1256         /* ctx->mres contains a complete block if offset has wrapped around */
1257         if (!n) {
1258             s390x_kma(ctx->ares, ctx->areslen, ctx->mres, 16, buf.b,
1259                       ctx->fc | S390X_KMA_LAAD, &ctx->kma.param);
1260             ctx->fc |= S390X_KMA_HS;
1261             ctx->areslen = 0;
1262 
1263             /* previous call already encrypted/decrypted its remainder,
1264              * see comment below */
1265             n = ctx->mreslen;
1266             while (n) {
1267                 *out = buf.b[n];
1268                 n = (n + 1) & 0xf;
1269                 ++out;
1270                 ++in;
1271                 --len;
1272             }
1273             ctx->mreslen = 0;
1274         }
1275     }
1276 
1277     rem = len & 0xf;
1278 
1279     len &= ~(size_t)0xf;
1280     if (len) {
1281         s390x_kma(ctx->ares, ctx->areslen, in, len, out,
1282                   ctx->fc | S390X_KMA_LAAD, &ctx->kma.param);
1283         in += len;
1284         out += len;
1285         ctx->fc |= S390X_KMA_HS;
1286         ctx->areslen = 0;
1287     }
1288 
1289     /*-
1290      * If there is a remainder, it has to be saved such that it can be
1291      * processed by kma later. However, we also have to do the for-now
1292      * unauthenticated encryption/decryption part here and now...
1293      */
1294     if (rem) {
1295         if (!ctx->mreslen) {
1296             buf.w[0] = ctx->kma.param.j0.w[0];
1297             buf.w[1] = ctx->kma.param.j0.w[1];
1298             buf.w[2] = ctx->kma.param.j0.w[2];
1299             buf.w[3] = ctx->kma.param.cv.w + 1;
1300             s390x_km(buf.b, 16, ctx->kres, ctx->fc & 0x1f, &ctx->kma.param.k);
1301         }
1302 
1303         n = ctx->mreslen;
1304         for (i = 0; i < rem; i++) {
1305             ctx->mres[n + i] = in[i];
1306             out[i] = in[i] ^ ctx->kres[n + i];
1307         }
1308 
1309         ctx->mreslen += rem;
1310     }
1311     return 0;
1312 }
1313 
1314 /*-
1315  * Initialize context structure. Code is big-endian.
1316  */
1317 static void s390x_aes_gcm_setiv(S390X_AES_GCM_CTX *ctx,
1318                                 const unsigned char *iv)
1319 {
1320     ctx->kma.param.t.g[0] = 0;
1321     ctx->kma.param.t.g[1] = 0;
1322     ctx->kma.param.tpcl = 0;
1323     ctx->kma.param.taadl = 0;
1324     ctx->mreslen = 0;
1325     ctx->areslen = 0;
1326     ctx->kreslen = 0;
1327 
1328     if (ctx->ivlen == 12) {
1329         memcpy(&ctx->kma.param.j0, iv, ctx->ivlen);
1330         ctx->kma.param.j0.w[3] = 1;
1331         ctx->kma.param.cv.w = 1;
1332     } else {
1333         /* ctx->iv has the right size and is already padded. */
1334         memcpy(ctx->iv, iv, ctx->ivlen);
1335         s390x_kma(ctx->iv, S390X_gcm_ivpadlen(ctx->ivlen), NULL, 0, NULL,
1336                   ctx->fc, &ctx->kma.param);
1337         ctx->fc |= S390X_KMA_HS;
1338 
1339         ctx->kma.param.j0.g[0] = ctx->kma.param.t.g[0];
1340         ctx->kma.param.j0.g[1] = ctx->kma.param.t.g[1];
1341         ctx->kma.param.cv.w = ctx->kma.param.j0.w[3];
1342         ctx->kma.param.t.g[0] = 0;
1343         ctx->kma.param.t.g[1] = 0;
1344     }
1345 }
1346 
1347 /*-
1348  * Performs various operations on the context structure depending on control
1349  * type. Returns 1 for success, 0 for failure and -1 for unknown control type.
1350  * Code is big-endian.
1351  */
1352 static int s390x_aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1353 {
1354     S390X_AES_GCM_CTX *gctx = EVP_C_DATA(S390X_AES_GCM_CTX, c);
1355     S390X_AES_GCM_CTX *gctx_out;
1356     EVP_CIPHER_CTX *out;
1357     unsigned char *buf;
1358     int ivlen, enc, len;
1359 
1360     switch (type) {
1361     case EVP_CTRL_INIT:
1362         ivlen = EVP_CIPHER_get_iv_length(c->cipher);
1363         gctx->key_set = 0;
1364         gctx->iv_set = 0;
1365         gctx->ivlen = ivlen;
1366         gctx->iv = c->iv;
1367         gctx->taglen = -1;
1368         gctx->iv_gen = 0;
1369         gctx->tls_aad_len = -1;
1370         return 1;
1371 
1372     case EVP_CTRL_GET_IVLEN:
1373         *(int *)ptr = gctx->ivlen;
1374         return 1;
1375 
1376     case EVP_CTRL_AEAD_SET_IVLEN:
1377         if (arg <= 0)
1378             return 0;
1379 
1380         if (arg != 12) {
1381             len = S390X_gcm_ivpadlen(arg);
1382 
1383             /* Allocate memory for iv if needed. */
1384             if (gctx->ivlen == 12 || len > S390X_gcm_ivpadlen(gctx->ivlen)) {
1385                 if (gctx->iv != c->iv)
1386                     OPENSSL_free(gctx->iv);
1387 
1388                 if ((gctx->iv = OPENSSL_malloc(len)) == NULL) {
1389                     ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1390                     return 0;
1391                 }
1392             }
1393             /* Add padding. */
1394             memset(gctx->iv + arg, 0, len - arg - 8);
1395             *((unsigned long long *)(gctx->iv + len - 8)) = arg << 3;
1396         }
1397         gctx->ivlen = arg;
1398         return 1;
1399 
1400     case EVP_CTRL_AEAD_SET_TAG:
1401         buf = EVP_CIPHER_CTX_buf_noconst(c);
1402         enc = EVP_CIPHER_CTX_is_encrypting(c);
1403         if (arg <= 0 || arg > 16 || enc)
1404             return 0;
1405 
1406         memcpy(buf, ptr, arg);
1407         gctx->taglen = arg;
1408         return 1;
1409 
1410     case EVP_CTRL_AEAD_GET_TAG:
1411         enc = EVP_CIPHER_CTX_is_encrypting(c);
1412         if (arg <= 0 || arg > 16 || !enc || gctx->taglen < 0)
1413             return 0;
1414 
1415         memcpy(ptr, gctx->kma.param.t.b, arg);
1416         return 1;
1417 
1418     case EVP_CTRL_GCM_SET_IV_FIXED:
1419         /* Special case: -1 length restores whole iv */
1420         if (arg == -1) {
1421             memcpy(gctx->iv, ptr, gctx->ivlen);
1422             gctx->iv_gen = 1;
1423             return 1;
1424         }
1425         /*
1426          * Fixed field must be at least 4 bytes and invocation field at least
1427          * 8.
1428          */
1429         if ((arg < 4) || (gctx->ivlen - arg) < 8)
1430             return 0;
1431 
1432         if (arg)
1433             memcpy(gctx->iv, ptr, arg);
1434 
1435         enc = EVP_CIPHER_CTX_is_encrypting(c);
1436         if (enc && RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
1437             return 0;
1438 
1439         gctx->iv_gen = 1;
1440         return 1;
1441 
1442     case EVP_CTRL_GCM_IV_GEN:
1443         if (gctx->iv_gen == 0 || gctx->key_set == 0)
1444             return 0;
1445 
1446         s390x_aes_gcm_setiv(gctx, gctx->iv);
1447 
1448         if (arg <= 0 || arg > gctx->ivlen)
1449             arg = gctx->ivlen;
1450 
1451         memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
1452         /*
1453          * Invocation field will be at least 8 bytes in size and so no need
1454          * to check wrap around or increment more than last 8 bytes.
1455          */
1456         ctr64_inc(gctx->iv + gctx->ivlen - 8);
1457         gctx->iv_set = 1;
1458         return 1;
1459 
1460     case EVP_CTRL_GCM_SET_IV_INV:
1461         enc = EVP_CIPHER_CTX_is_encrypting(c);
1462         if (gctx->iv_gen == 0 || gctx->key_set == 0 || enc)
1463             return 0;
1464 
1465         memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
1466         s390x_aes_gcm_setiv(gctx, gctx->iv);
1467         gctx->iv_set = 1;
1468         return 1;
1469 
1470     case EVP_CTRL_AEAD_TLS1_AAD:
1471         /* Save the aad for later use. */
1472         if (arg != EVP_AEAD_TLS1_AAD_LEN)
1473             return 0;
1474 
1475         buf = EVP_CIPHER_CTX_buf_noconst(c);
1476         memcpy(buf, ptr, arg);
1477         gctx->tls_aad_len = arg;
1478         gctx->tls_enc_records = 0;
1479 
1480         len = buf[arg - 2] << 8 | buf[arg - 1];
1481         /* Correct length for explicit iv. */
1482         if (len < EVP_GCM_TLS_EXPLICIT_IV_LEN)
1483             return 0;
1484         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
1485 
1486         /* If decrypting correct for tag too. */
1487         enc = EVP_CIPHER_CTX_is_encrypting(c);
1488         if (!enc) {
1489             if (len < EVP_GCM_TLS_TAG_LEN)
1490                 return 0;
1491             len -= EVP_GCM_TLS_TAG_LEN;
1492         }
1493         buf[arg - 2] = len >> 8;
1494         buf[arg - 1] = len & 0xff;
1495         /* Extra padding: tag appended to record. */
1496         return EVP_GCM_TLS_TAG_LEN;
1497 
1498     case EVP_CTRL_COPY:
1499         out = ptr;
1500         gctx_out = EVP_C_DATA(S390X_AES_GCM_CTX, out);
1501 
1502         if (gctx->iv == c->iv) {
1503             gctx_out->iv = out->iv;
1504         } else {
1505             len = S390X_gcm_ivpadlen(gctx->ivlen);
1506 
1507             if ((gctx_out->iv = OPENSSL_malloc(len)) == NULL) {
1508                 ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
1509                 return 0;
1510             }
1511 
1512             memcpy(gctx_out->iv, gctx->iv, len);
1513         }
1514         return 1;
1515 
1516     default:
1517         return -1;
1518     }
1519 }
1520 
1521 /*-
1522  * Set key and/or iv. Returns 1 on success. Otherwise 0 is returned.
1523  */
1524 static int s390x_aes_gcm_init_key(EVP_CIPHER_CTX *ctx,
1525                                   const unsigned char *key,
1526                                   const unsigned char *iv, int enc)
1527 {
1528     S390X_AES_GCM_CTX *gctx = EVP_C_DATA(S390X_AES_GCM_CTX, ctx);
1529     int keylen;
1530 
1531     if (iv == NULL && key == NULL)
1532         return 1;
1533 
1534     if (key != NULL) {
1535         keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1536         memcpy(&gctx->kma.param.k, key, keylen);
1537 
1538         gctx->fc = S390X_AES_FC(keylen);
1539         if (!enc)
1540             gctx->fc |= S390X_DECRYPT;
1541 
1542         if (iv == NULL && gctx->iv_set)
1543             iv = gctx->iv;
1544 
1545         if (iv != NULL) {
1546             s390x_aes_gcm_setiv(gctx, iv);
1547             gctx->iv_set = 1;
1548         }
1549         gctx->key_set = 1;
1550     } else {
1551         if (gctx->key_set)
1552             s390x_aes_gcm_setiv(gctx, iv);
1553         else
1554             memcpy(gctx->iv, iv, gctx->ivlen);
1555 
1556         gctx->iv_set = 1;
1557         gctx->iv_gen = 0;
1558     }
1559     return 1;
1560 }
1561 
1562 /*-
1563  * En/de-crypt and authenticate TLS packet. Returns the number of bytes written
1564  * if successful. Otherwise -1 is returned. Code is big-endian.
1565  */
1566 static int s390x_aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1567                                     const unsigned char *in, size_t len)
1568 {
1569     S390X_AES_GCM_CTX *gctx = EVP_C_DATA(S390X_AES_GCM_CTX, ctx);
1570     const unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
1571     const int enc = EVP_CIPHER_CTX_is_encrypting(ctx);
1572     int rv = -1;
1573 
1574     if (out != in || len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
1575         return -1;
1576 
1577     /*
1578      * Check for too many keys as per FIPS 140-2 IG A.5 "Key/IV Pair Uniqueness
1579      * Requirements from SP 800-38D".  The requirements is for one party to the
1580      * communication to fail after 2^64 - 1 keys.  We do this on the encrypting
1581      * side only.
1582      */
1583     if (ctx->encrypt && ++gctx->tls_enc_records == 0) {
1584         ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS);
1585         goto err;
1586     }
1587 
1588     if (EVP_CIPHER_CTX_ctrl(ctx, enc ? EVP_CTRL_GCM_IV_GEN
1589                                      : EVP_CTRL_GCM_SET_IV_INV,
1590                             EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
1591         goto err;
1592 
1593     in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1594     out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1595     len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1596 
1597     gctx->kma.param.taadl = gctx->tls_aad_len << 3;
1598     gctx->kma.param.tpcl = len << 3;
1599     s390x_kma(buf, gctx->tls_aad_len, in, len, out,
1600               gctx->fc | S390X_KMA_LAAD | S390X_KMA_LPC, &gctx->kma.param);
1601 
1602     if (enc) {
1603         memcpy(out + len, gctx->kma.param.t.b, EVP_GCM_TLS_TAG_LEN);
1604         rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1605     } else {
1606         if (CRYPTO_memcmp(gctx->kma.param.t.b, in + len,
1607                           EVP_GCM_TLS_TAG_LEN)) {
1608             OPENSSL_cleanse(out, len);
1609             goto err;
1610         }
1611         rv = len;
1612     }
1613 err:
1614     gctx->iv_set = 0;
1615     gctx->tls_aad_len = -1;
1616     return rv;
1617 }
1618 
1619 /*-
1620  * Called from EVP layer to initialize context, process additional
1621  * authenticated data, en/de-crypt plain/cipher-text and authenticate
1622  * ciphertext or process a TLS packet, depending on context. Returns bytes
1623  * written on success. Otherwise -1 is returned. Code is big-endian.
1624  */
1625 static int s390x_aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1626                                 const unsigned char *in, size_t len)
1627 {
1628     S390X_AES_GCM_CTX *gctx = EVP_C_DATA(S390X_AES_GCM_CTX, ctx);
1629     unsigned char *buf, tmp[16];
1630     int enc;
1631 
1632     if (!gctx->key_set)
1633         return -1;
1634 
1635     if (gctx->tls_aad_len >= 0)
1636         return s390x_aes_gcm_tls_cipher(ctx, out, in, len);
1637 
1638     if (!gctx->iv_set)
1639         return -1;
1640 
1641     if (in != NULL) {
1642         if (out == NULL) {
1643             if (s390x_aes_gcm_aad(gctx, in, len))
1644                 return -1;
1645         } else {
1646             if (s390x_aes_gcm(gctx, in, out, len))
1647                 return -1;
1648         }
1649         return len;
1650     } else {
1651         gctx->kma.param.taadl <<= 3;
1652         gctx->kma.param.tpcl <<= 3;
1653         s390x_kma(gctx->ares, gctx->areslen, gctx->mres, gctx->mreslen, tmp,
1654                   gctx->fc | S390X_KMA_LAAD | S390X_KMA_LPC, &gctx->kma.param);
1655         /* recall that we already did en-/decrypt gctx->mres
1656          * and returned it to caller... */
1657         OPENSSL_cleanse(tmp, gctx->mreslen);
1658         gctx->iv_set = 0;
1659 
1660         enc = EVP_CIPHER_CTX_is_encrypting(ctx);
1661         if (enc) {
1662             gctx->taglen = 16;
1663         } else {
1664             if (gctx->taglen < 0)
1665                 return -1;
1666 
1667             buf = EVP_CIPHER_CTX_buf_noconst(ctx);
1668             if (CRYPTO_memcmp(buf, gctx->kma.param.t.b, gctx->taglen))
1669                 return -1;
1670         }
1671         return 0;
1672     }
1673 }
1674 
1675 static int s390x_aes_gcm_cleanup(EVP_CIPHER_CTX *c)
1676 {
1677     S390X_AES_GCM_CTX *gctx = EVP_C_DATA(S390X_AES_GCM_CTX, c);
1678 
1679     if (gctx == NULL)
1680         return 0;
1681 
1682     if (gctx->iv != c->iv)
1683         OPENSSL_free(gctx->iv);
1684 
1685     OPENSSL_cleanse(gctx, sizeof(*gctx));
1686     return 1;
1687 }
1688 
1689 # define S390X_AES_XTS_CTX              EVP_AES_XTS_CTX
1690 
1691 # define s390x_aes_xts_init_key aes_xts_init_key
1692 static int s390x_aes_xts_init_key(EVP_CIPHER_CTX *ctx,
1693                                   const unsigned char *key,
1694                                   const unsigned char *iv, int enc);
1695 # define s390x_aes_xts_cipher aes_xts_cipher
1696 static int s390x_aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1697                                 const unsigned char *in, size_t len);
1698 # define s390x_aes_xts_ctrl aes_xts_ctrl
1699 static int s390x_aes_xts_ctrl(EVP_CIPHER_CTX *, int type, int arg, void *ptr);
1700 # define s390x_aes_xts_cleanup aes_xts_cleanup
1701 
1702 /*-
1703  * Set nonce and length fields. Code is big-endian.
1704  */
1705 static inline void s390x_aes_ccm_setiv(S390X_AES_CCM_CTX *ctx,
1706                                           const unsigned char *nonce,
1707                                           size_t mlen)
1708 {
1709     ctx->aes.ccm.nonce.b[0] &= ~S390X_CCM_AAD_FLAG;
1710     ctx->aes.ccm.nonce.g[1] = mlen;
1711     memcpy(ctx->aes.ccm.nonce.b + 1, nonce, 15 - ctx->aes.ccm.l);
1712 }
1713 
1714 /*-
1715  * Process additional authenticated data. Code is big-endian.
1716  */
1717 static void s390x_aes_ccm_aad(S390X_AES_CCM_CTX *ctx, const unsigned char *aad,
1718                               size_t alen)
1719 {
1720     unsigned char *ptr;
1721     int i, rem;
1722 
1723     if (!alen)
1724         return;
1725 
1726     ctx->aes.ccm.nonce.b[0] |= S390X_CCM_AAD_FLAG;
1727 
1728     /* Suppress 'type-punned pointer dereference' warning. */
1729     ptr = ctx->aes.ccm.buf.b;
1730 
1731     if (alen < ((1 << 16) - (1 << 8))) {
1732         *(uint16_t *)ptr = alen;
1733         i = 2;
1734     } else if (sizeof(alen) == 8
1735                && alen >= (size_t)1 << (32 % (sizeof(alen) * 8))) {
1736         *(uint16_t *)ptr = 0xffff;
1737         *(uint64_t *)(ptr + 2) = alen;
1738         i = 10;
1739     } else {
1740         *(uint16_t *)ptr = 0xfffe;
1741         *(uint32_t *)(ptr + 2) = alen;
1742         i = 6;
1743     }
1744 
1745     while (i < 16 && alen) {
1746         ctx->aes.ccm.buf.b[i] = *aad;
1747         ++aad;
1748         --alen;
1749         ++i;
1750     }
1751     while (i < 16) {
1752         ctx->aes.ccm.buf.b[i] = 0;
1753         ++i;
1754     }
1755 
1756     ctx->aes.ccm.kmac_param.icv.g[0] = 0;
1757     ctx->aes.ccm.kmac_param.icv.g[1] = 0;
1758     s390x_kmac(ctx->aes.ccm.nonce.b, 32, ctx->aes.ccm.fc,
1759                &ctx->aes.ccm.kmac_param);
1760     ctx->aes.ccm.blocks += 2;
1761 
1762     rem = alen & 0xf;
1763     alen &= ~(size_t)0xf;
1764     if (alen) {
1765         s390x_kmac(aad, alen, ctx->aes.ccm.fc, &ctx->aes.ccm.kmac_param);
1766         ctx->aes.ccm.blocks += alen >> 4;
1767         aad += alen;
1768     }
1769     if (rem) {
1770         for (i = 0; i < rem; i++)
1771             ctx->aes.ccm.kmac_param.icv.b[i] ^= aad[i];
1772 
1773         s390x_km(ctx->aes.ccm.kmac_param.icv.b, 16,
1774                  ctx->aes.ccm.kmac_param.icv.b, ctx->aes.ccm.fc,
1775                  ctx->aes.ccm.kmac_param.k);
1776         ctx->aes.ccm.blocks++;
1777     }
1778 }
1779 
1780 /*-
1781  * En/de-crypt plain/cipher-text. Compute tag from plaintext. Returns 0 for
1782  * success.
1783  */
1784 static int s390x_aes_ccm(S390X_AES_CCM_CTX *ctx, const unsigned char *in,
1785                          unsigned char *out, size_t len, int enc)
1786 {
1787     size_t n, rem;
1788     unsigned int i, l, num;
1789     unsigned char flags;
1790 
1791     flags = ctx->aes.ccm.nonce.b[0];
1792     if (!(flags & S390X_CCM_AAD_FLAG)) {
1793         s390x_km(ctx->aes.ccm.nonce.b, 16, ctx->aes.ccm.kmac_param.icv.b,
1794                  ctx->aes.ccm.fc, ctx->aes.ccm.kmac_param.k);
1795         ctx->aes.ccm.blocks++;
1796     }
1797     l = flags & 0x7;
1798     ctx->aes.ccm.nonce.b[0] = l;
1799 
1800     /*-
1801      * Reconstruct length from encoded length field
1802      * and initialize it with counter value.
1803      */
1804     n = 0;
1805     for (i = 15 - l; i < 15; i++) {
1806         n |= ctx->aes.ccm.nonce.b[i];
1807         ctx->aes.ccm.nonce.b[i] = 0;
1808         n <<= 8;
1809     }
1810     n |= ctx->aes.ccm.nonce.b[15];
1811     ctx->aes.ccm.nonce.b[15] = 1;
1812 
1813     if (n != len)
1814         return -1;              /* length mismatch */
1815 
1816     if (enc) {
1817         /* Two operations per block plus one for tag encryption */
1818         ctx->aes.ccm.blocks += (((len + 15) >> 4) << 1) + 1;
1819         if (ctx->aes.ccm.blocks > (1ULL << 61))
1820             return -2;          /* too much data */
1821     }
1822 
1823     num = 0;
1824     rem = len & 0xf;
1825     len &= ~(size_t)0xf;
1826 
1827     if (enc) {
1828         /* mac-then-encrypt */
1829         if (len)
1830             s390x_kmac(in, len, ctx->aes.ccm.fc, &ctx->aes.ccm.kmac_param);
1831         if (rem) {
1832             for (i = 0; i < rem; i++)
1833                 ctx->aes.ccm.kmac_param.icv.b[i] ^= in[len + i];
1834 
1835             s390x_km(ctx->aes.ccm.kmac_param.icv.b, 16,
1836                      ctx->aes.ccm.kmac_param.icv.b, ctx->aes.ccm.fc,
1837                      ctx->aes.ccm.kmac_param.k);
1838         }
1839 
1840         CRYPTO_ctr128_encrypt_ctr32(in, out, len + rem, &ctx->aes.key.k,
1841                                     ctx->aes.ccm.nonce.b, ctx->aes.ccm.buf.b,
1842                                     &num, (ctr128_f)AES_ctr32_encrypt);
1843     } else {
1844         /* decrypt-then-mac */
1845         CRYPTO_ctr128_encrypt_ctr32(in, out, len + rem, &ctx->aes.key.k,
1846                                     ctx->aes.ccm.nonce.b, ctx->aes.ccm.buf.b,
1847                                     &num, (ctr128_f)AES_ctr32_encrypt);
1848 
1849         if (len)
1850             s390x_kmac(out, len, ctx->aes.ccm.fc, &ctx->aes.ccm.kmac_param);
1851         if (rem) {
1852             for (i = 0; i < rem; i++)
1853                 ctx->aes.ccm.kmac_param.icv.b[i] ^= out[len + i];
1854 
1855             s390x_km(ctx->aes.ccm.kmac_param.icv.b, 16,
1856                      ctx->aes.ccm.kmac_param.icv.b, ctx->aes.ccm.fc,
1857                      ctx->aes.ccm.kmac_param.k);
1858         }
1859     }
1860     /* encrypt tag */
1861     for (i = 15 - l; i < 16; i++)
1862         ctx->aes.ccm.nonce.b[i] = 0;
1863 
1864     s390x_km(ctx->aes.ccm.nonce.b, 16, ctx->aes.ccm.buf.b, ctx->aes.ccm.fc,
1865              ctx->aes.ccm.kmac_param.k);
1866     ctx->aes.ccm.kmac_param.icv.g[0] ^= ctx->aes.ccm.buf.g[0];
1867     ctx->aes.ccm.kmac_param.icv.g[1] ^= ctx->aes.ccm.buf.g[1];
1868 
1869     ctx->aes.ccm.nonce.b[0] = flags;    /* restore flags field */
1870     return 0;
1871 }
1872 
1873 /*-
1874  * En/de-crypt and authenticate TLS packet. Returns the number of bytes written
1875  * if successful. Otherwise -1 is returned.
1876  */
1877 static int s390x_aes_ccm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1878                                     const unsigned char *in, size_t len)
1879 {
1880     S390X_AES_CCM_CTX *cctx = EVP_C_DATA(S390X_AES_CCM_CTX, ctx);
1881     unsigned char *ivec = ctx->iv;
1882     unsigned char *buf = EVP_CIPHER_CTX_buf_noconst(ctx);
1883     const int enc = EVP_CIPHER_CTX_is_encrypting(ctx);
1884 
1885     if (out != in
1886             || len < (EVP_CCM_TLS_EXPLICIT_IV_LEN + (size_t)cctx->aes.ccm.m))
1887         return -1;
1888 
1889     if (enc) {
1890         /* Set explicit iv (sequence number). */
1891         memcpy(out, buf, EVP_CCM_TLS_EXPLICIT_IV_LEN);
1892     }
1893 
1894     len -= EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->aes.ccm.m;
1895     /*-
1896      * Get explicit iv (sequence number). We already have fixed iv
1897      * (server/client_write_iv) here.
1898      */
1899     memcpy(ivec + EVP_CCM_TLS_FIXED_IV_LEN, in, EVP_CCM_TLS_EXPLICIT_IV_LEN);
1900     s390x_aes_ccm_setiv(cctx, ivec, len);
1901 
1902     /* Process aad (sequence number|type|version|length) */
1903     s390x_aes_ccm_aad(cctx, buf, cctx->aes.ccm.tls_aad_len);
1904 
1905     in += EVP_CCM_TLS_EXPLICIT_IV_LEN;
1906     out += EVP_CCM_TLS_EXPLICIT_IV_LEN;
1907 
1908     if (enc) {
1909         if (s390x_aes_ccm(cctx, in, out, len, enc))
1910             return -1;
1911 
1912         memcpy(out + len, cctx->aes.ccm.kmac_param.icv.b, cctx->aes.ccm.m);
1913         return len + EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->aes.ccm.m;
1914     } else {
1915         if (!s390x_aes_ccm(cctx, in, out, len, enc)) {
1916             if (!CRYPTO_memcmp(cctx->aes.ccm.kmac_param.icv.b, in + len,
1917                                cctx->aes.ccm.m))
1918                 return len;
1919         }
1920 
1921         OPENSSL_cleanse(out, len);
1922         return -1;
1923     }
1924 }
1925 
1926 /*-
1927  * Set key and flag field and/or iv. Returns 1 if successful. Otherwise 0 is
1928  * returned.
1929  */
1930 static int s390x_aes_ccm_init_key(EVP_CIPHER_CTX *ctx,
1931                                   const unsigned char *key,
1932                                   const unsigned char *iv, int enc)
1933 {
1934     S390X_AES_CCM_CTX *cctx = EVP_C_DATA(S390X_AES_CCM_CTX, ctx);
1935     int keylen;
1936 
1937     if (iv == NULL && key == NULL)
1938         return 1;
1939 
1940     if (key != NULL) {
1941         keylen = EVP_CIPHER_CTX_get_key_length(ctx);
1942         cctx->aes.ccm.fc = S390X_AES_FC(keylen);
1943         memcpy(cctx->aes.ccm.kmac_param.k, key, keylen);
1944 
1945         /* Store encoded m and l. */
1946         cctx->aes.ccm.nonce.b[0] = ((cctx->aes.ccm.l - 1) & 0x7)
1947                                  | (((cctx->aes.ccm.m - 2) >> 1) & 0x7) << 3;
1948         memset(cctx->aes.ccm.nonce.b + 1, 0,
1949                sizeof(cctx->aes.ccm.nonce.b));
1950         cctx->aes.ccm.blocks = 0;
1951 
1952         cctx->aes.ccm.key_set = 1;
1953     }
1954 
1955     if (iv != NULL) {
1956         memcpy(ctx->iv, iv, 15 - cctx->aes.ccm.l);
1957 
1958         cctx->aes.ccm.iv_set = 1;
1959     }
1960 
1961     return 1;
1962 }
1963 
1964 /*-
1965  * Called from EVP layer to initialize context, process additional
1966  * authenticated data, en/de-crypt plain/cipher-text and authenticate
1967  * plaintext or process a TLS packet, depending on context. Returns bytes
1968  * written on success. Otherwise -1 is returned.
1969  */
1970 static int s390x_aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1971                                 const unsigned char *in, size_t len)
1972 {
1973     S390X_AES_CCM_CTX *cctx = EVP_C_DATA(S390X_AES_CCM_CTX, ctx);
1974     const int enc = EVP_CIPHER_CTX_is_encrypting(ctx);
1975     int rv;
1976     unsigned char *buf;
1977 
1978     if (!cctx->aes.ccm.key_set)
1979         return -1;
1980 
1981     if (cctx->aes.ccm.tls_aad_len >= 0)
1982         return s390x_aes_ccm_tls_cipher(ctx, out, in, len);
1983 
1984     /*-
1985      * Final(): Does not return any data. Recall that ccm is mac-then-encrypt
1986      * so integrity must be checked already at Update() i.e., before
1987      * potentially corrupted data is output.
1988      */
1989     if (in == NULL && out != NULL)
1990         return 0;
1991 
1992     if (!cctx->aes.ccm.iv_set)
1993         return -1;
1994 
1995     if (out == NULL) {
1996         /* Update(): Pass message length. */
1997         if (in == NULL) {
1998             s390x_aes_ccm_setiv(cctx, ctx->iv, len);
1999 
2000             cctx->aes.ccm.len_set = 1;
2001             return len;
2002         }
2003 
2004         /* Update(): Process aad. */
2005         if (!cctx->aes.ccm.len_set && len)
2006             return -1;
2007 
2008         s390x_aes_ccm_aad(cctx, in, len);
2009         return len;
2010     }
2011 
2012     /* The tag must be set before actually decrypting data */
2013     if (!enc && !cctx->aes.ccm.tag_set)
2014         return -1;
2015 
2016     /* Update(): Process message. */
2017 
2018     if (!cctx->aes.ccm.len_set) {
2019         /*-
2020          * In case message length was not previously set explicitly via
2021          * Update(), set it now.
2022          */
2023         s390x_aes_ccm_setiv(cctx, ctx->iv, len);
2024 
2025         cctx->aes.ccm.len_set = 1;
2026     }
2027 
2028     if (enc) {
2029         if (s390x_aes_ccm(cctx, in, out, len, enc))
2030             return -1;
2031 
2032         cctx->aes.ccm.tag_set = 1;
2033         return len;
2034     } else {
2035         rv = -1;
2036 
2037         if (!s390x_aes_ccm(cctx, in, out, len, enc)) {
2038             buf = EVP_CIPHER_CTX_buf_noconst(ctx);
2039             if (!CRYPTO_memcmp(cctx->aes.ccm.kmac_param.icv.b, buf,
2040                                cctx->aes.ccm.m))
2041                 rv = len;
2042         }
2043 
2044         if (rv == -1)
2045             OPENSSL_cleanse(out, len);
2046 
2047         cctx->aes.ccm.iv_set = 0;
2048         cctx->aes.ccm.tag_set = 0;
2049         cctx->aes.ccm.len_set = 0;
2050         return rv;
2051     }
2052 }
2053 
2054 /*-
2055  * Performs various operations on the context structure depending on control
2056  * type. Returns 1 for success, 0 for failure and -1 for unknown control type.
2057  * Code is big-endian.
2058  */
2059 static int s390x_aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
2060 {
2061     S390X_AES_CCM_CTX *cctx = EVP_C_DATA(S390X_AES_CCM_CTX, c);
2062     unsigned char *buf;
2063     int enc, len;
2064 
2065     switch (type) {
2066     case EVP_CTRL_INIT:
2067         cctx->aes.ccm.key_set = 0;
2068         cctx->aes.ccm.iv_set = 0;
2069         cctx->aes.ccm.l = 8;
2070         cctx->aes.ccm.m = 12;
2071         cctx->aes.ccm.tag_set = 0;
2072         cctx->aes.ccm.len_set = 0;
2073         cctx->aes.ccm.tls_aad_len = -1;
2074         return 1;
2075 
2076     case EVP_CTRL_GET_IVLEN:
2077         *(int *)ptr = 15 - cctx->aes.ccm.l;
2078         return 1;
2079 
2080     case EVP_CTRL_AEAD_TLS1_AAD:
2081         if (arg != EVP_AEAD_TLS1_AAD_LEN)
2082             return 0;
2083 
2084         /* Save the aad for later use. */
2085         buf = EVP_CIPHER_CTX_buf_noconst(c);
2086         memcpy(buf, ptr, arg);
2087         cctx->aes.ccm.tls_aad_len = arg;
2088 
2089         len = buf[arg - 2] << 8 | buf[arg - 1];
2090         if (len < EVP_CCM_TLS_EXPLICIT_IV_LEN)
2091             return 0;
2092 
2093         /* Correct length for explicit iv. */
2094         len -= EVP_CCM_TLS_EXPLICIT_IV_LEN;
2095 
2096         enc = EVP_CIPHER_CTX_is_encrypting(c);
2097         if (!enc) {
2098             if (len < cctx->aes.ccm.m)
2099                 return 0;
2100 
2101             /* Correct length for tag. */
2102             len -= cctx->aes.ccm.m;
2103         }
2104 
2105         buf[arg - 2] = len >> 8;
2106         buf[arg - 1] = len & 0xff;
2107 
2108         /* Extra padding: tag appended to record. */
2109         return cctx->aes.ccm.m;
2110 
2111     case EVP_CTRL_CCM_SET_IV_FIXED:
2112         if (arg != EVP_CCM_TLS_FIXED_IV_LEN)
2113             return 0;
2114 
2115         /* Copy to first part of the iv. */
2116         memcpy(c->iv, ptr, arg);
2117         return 1;
2118 
2119     case EVP_CTRL_AEAD_SET_IVLEN:
2120         arg = 15 - arg;
2121         /* fall-through */
2122 
2123     case EVP_CTRL_CCM_SET_L:
2124         if (arg < 2 || arg > 8)
2125             return 0;
2126 
2127         cctx->aes.ccm.l = arg;
2128         return 1;
2129 
2130     case EVP_CTRL_AEAD_SET_TAG:
2131         if ((arg & 1) || arg < 4 || arg > 16)
2132             return 0;
2133 
2134         enc = EVP_CIPHER_CTX_is_encrypting(c);
2135         if (enc && ptr)
2136             return 0;
2137 
2138         if (ptr) {
2139             cctx->aes.ccm.tag_set = 1;
2140             buf = EVP_CIPHER_CTX_buf_noconst(c);
2141             memcpy(buf, ptr, arg);
2142         }
2143 
2144         cctx->aes.ccm.m = arg;
2145         return 1;
2146 
2147     case EVP_CTRL_AEAD_GET_TAG:
2148         enc = EVP_CIPHER_CTX_is_encrypting(c);
2149         if (!enc || !cctx->aes.ccm.tag_set)
2150             return 0;
2151 
2152         if(arg < cctx->aes.ccm.m)
2153             return 0;
2154 
2155         memcpy(ptr, cctx->aes.ccm.kmac_param.icv.b, cctx->aes.ccm.m);
2156         cctx->aes.ccm.tag_set = 0;
2157         cctx->aes.ccm.iv_set = 0;
2158         cctx->aes.ccm.len_set = 0;
2159         return 1;
2160 
2161     case EVP_CTRL_COPY:
2162         return 1;
2163 
2164     default:
2165         return -1;
2166     }
2167 }
2168 
2169 # define s390x_aes_ccm_cleanup aes_ccm_cleanup
2170 
2171 # ifndef OPENSSL_NO_OCB
2172 #  define S390X_AES_OCB_CTX             EVP_AES_OCB_CTX
2173 
2174 #  define s390x_aes_ocb_init_key aes_ocb_init_key
2175 static int s390x_aes_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2176                                   const unsigned char *iv, int enc);
2177 #  define s390x_aes_ocb_cipher aes_ocb_cipher
2178 static int s390x_aes_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2179                                 const unsigned char *in, size_t len);
2180 #  define s390x_aes_ocb_cleanup aes_ocb_cleanup
2181 static int s390x_aes_ocb_cleanup(EVP_CIPHER_CTX *);
2182 #  define s390x_aes_ocb_ctrl aes_ocb_ctrl
2183 static int s390x_aes_ocb_ctrl(EVP_CIPHER_CTX *, int type, int arg, void *ptr);
2184 # endif
2185 
2186 # ifndef OPENSSL_NO_SIV
2187 #  define S390X_AES_SIV_CTX             EVP_AES_SIV_CTX
2188 
2189 #  define s390x_aes_siv_init_key aes_siv_init_key
2190 #  define s390x_aes_siv_cipher aes_siv_cipher
2191 #  define s390x_aes_siv_cleanup aes_siv_cleanup
2192 #  define s390x_aes_siv_ctrl aes_siv_ctrl
2193 # endif
2194 
2195 # define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,    \
2196                               MODE,flags)                               \
2197 static const EVP_CIPHER s390x_aes_##keylen##_##mode = {                 \
2198     nid##_##keylen##_##nmode,blocksize,                                 \
2199     keylen / 8,                                                         \
2200     ivlen,                                                              \
2201     flags | EVP_CIPH_##MODE##_MODE,                                     \
2202     EVP_ORIG_GLOBAL,                                                    \
2203     s390x_aes_##mode##_init_key,                                        \
2204     s390x_aes_##mode##_cipher,                                          \
2205     NULL,                                                               \
2206     sizeof(S390X_AES_##MODE##_CTX),                                     \
2207     NULL,                                                               \
2208     NULL,                                                               \
2209     NULL,                                                               \
2210     NULL                                                                \
2211 };                                                                      \
2212 static const EVP_CIPHER aes_##keylen##_##mode = {                       \
2213     nid##_##keylen##_##nmode,                                           \
2214     blocksize,                                                          \
2215     keylen / 8,                                                         \
2216     ivlen,                                                              \
2217     flags | EVP_CIPH_##MODE##_MODE,                                     \
2218     EVP_ORIG_GLOBAL,                                                    \
2219     aes_init_key,                                                       \
2220     aes_##mode##_cipher,                                                \
2221     NULL,                                                               \
2222     sizeof(EVP_AES_KEY),                                                \
2223     NULL,                                                               \
2224     NULL,                                                               \
2225     NULL,                                                               \
2226     NULL                                                                \
2227 };                                                                      \
2228 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void)                       \
2229 {                                                                       \
2230     return S390X_aes_##keylen##_##mode##_CAPABLE ?                      \
2231            &s390x_aes_##keylen##_##mode : &aes_##keylen##_##mode;       \
2232 }
2233 
2234 # define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags)\
2235 static const EVP_CIPHER s390x_aes_##keylen##_##mode = {                 \
2236     nid##_##keylen##_##mode,                                            \
2237     blocksize,                                                          \
2238     (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8,        \
2239     ivlen,                                                              \
2240     flags | EVP_CIPH_##MODE##_MODE,                                     \
2241     EVP_ORIG_GLOBAL,                                                    \
2242     s390x_aes_##mode##_init_key,                                        \
2243     s390x_aes_##mode##_cipher,                                          \
2244     s390x_aes_##mode##_cleanup,                                         \
2245     sizeof(S390X_AES_##MODE##_CTX),                                     \
2246     NULL,                                                               \
2247     NULL,                                                               \
2248     s390x_aes_##mode##_ctrl,                                            \
2249     NULL                                                                \
2250 };                                                                      \
2251 static const EVP_CIPHER aes_##keylen##_##mode = {                       \
2252     nid##_##keylen##_##mode,blocksize,                                  \
2253     (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8,        \
2254     ivlen,                                                              \
2255     flags | EVP_CIPH_##MODE##_MODE,                                     \
2256     EVP_ORIG_GLOBAL,                                                    \
2257     aes_##mode##_init_key,                                              \
2258     aes_##mode##_cipher,                                                \
2259     aes_##mode##_cleanup,                                               \
2260     sizeof(EVP_AES_##MODE##_CTX),                                       \
2261     NULL,                                                               \
2262     NULL,                                                               \
2263     aes_##mode##_ctrl,                                                  \
2264     NULL                                                                \
2265 };                                                                      \
2266 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void)                       \
2267 {                                                                       \
2268     return S390X_aes_##keylen##_##mode##_CAPABLE ?                      \
2269            &s390x_aes_##keylen##_##mode : &aes_##keylen##_##mode;       \
2270 }
2271 
2272 #else
2273 
2274 # define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
2275 static const EVP_CIPHER aes_##keylen##_##mode = { \
2276         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
2277         flags|EVP_CIPH_##MODE##_MODE,   \
2278         EVP_ORIG_GLOBAL,                \
2279         aes_init_key,                   \
2280         aes_##mode##_cipher,            \
2281         NULL,                           \
2282         sizeof(EVP_AES_KEY),            \
2283         NULL,NULL,NULL,NULL }; \
2284 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
2285 { return &aes_##keylen##_##mode; }
2286 
2287 # define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
2288 static const EVP_CIPHER aes_##keylen##_##mode = { \
2289         nid##_##keylen##_##mode,blocksize, \
2290         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE||EVP_CIPH_##MODE##_MODE==EVP_CIPH_SIV_MODE?2:1)*keylen/8, \
2291         ivlen,                          \
2292         flags|EVP_CIPH_##MODE##_MODE,   \
2293         EVP_ORIG_GLOBAL,                \
2294         aes_##mode##_init_key,          \
2295         aes_##mode##_cipher,            \
2296         aes_##mode##_cleanup,           \
2297         sizeof(EVP_AES_##MODE##_CTX),   \
2298         NULL,NULL,aes_##mode##_ctrl,NULL }; \
2299 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
2300 { return &aes_##keylen##_##mode; }
2301 
2302 #endif
2303 
2304 #define BLOCK_CIPHER_generic_pack(nid,keylen,flags)             \
2305         BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)     \
2306         BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)      \
2307         BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
2308         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
2309         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags)       \
2310         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags)       \
2311         BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
2312 
2313 static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2314                         const unsigned char *iv, int enc)
2315 {
2316     int ret, mode;
2317     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2318 
2319     mode = EVP_CIPHER_CTX_get_mode(ctx);
2320     if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
2321         && !enc) {
2322 #ifdef HWAES_CAPABLE
2323         if (HWAES_CAPABLE) {
2324             ret = HWAES_set_decrypt_key(key,
2325                                         EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2326                                         &dat->ks.ks);
2327             dat->block = (block128_f) HWAES_decrypt;
2328             dat->stream.cbc = NULL;
2329 # ifdef HWAES_cbc_encrypt
2330             if (mode == EVP_CIPH_CBC_MODE)
2331                 dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
2332 # endif
2333         } else
2334 #endif
2335 #ifdef BSAES_CAPABLE
2336         if (BSAES_CAPABLE && mode == EVP_CIPH_CBC_MODE) {
2337             ret = AES_set_decrypt_key(key,
2338                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2339                                       &dat->ks.ks);
2340             dat->block = (block128_f) AES_decrypt;
2341             dat->stream.cbc = (cbc128_f) ossl_bsaes_cbc_encrypt;
2342         } else
2343 #endif
2344 #ifdef VPAES_CAPABLE
2345         if (VPAES_CAPABLE) {
2346             ret = vpaes_set_decrypt_key(key,
2347                                         EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2348                                         &dat->ks.ks);
2349             dat->block = (block128_f) vpaes_decrypt;
2350             dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
2351                 (cbc128_f) vpaes_cbc_encrypt : NULL;
2352         } else
2353 #endif
2354         {
2355             ret = AES_set_decrypt_key(key,
2356                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2357                                       &dat->ks.ks);
2358             dat->block = (block128_f) AES_decrypt;
2359             dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
2360                 (cbc128_f) AES_cbc_encrypt : NULL;
2361         }
2362     } else
2363 #ifdef HWAES_CAPABLE
2364     if (HWAES_CAPABLE) {
2365         ret = HWAES_set_encrypt_key(key,
2366                                     EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2367                                     &dat->ks.ks);
2368         dat->block = (block128_f) HWAES_encrypt;
2369         dat->stream.cbc = NULL;
2370 # ifdef HWAES_cbc_encrypt
2371         if (mode == EVP_CIPH_CBC_MODE)
2372             dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
2373         else
2374 # endif
2375 # ifdef HWAES_ctr32_encrypt_blocks
2376         if (mode == EVP_CIPH_CTR_MODE)
2377             dat->stream.ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
2378         else
2379 # endif
2380             (void)0;            /* terminate potentially open 'else' */
2381     } else
2382 #endif
2383 #ifdef BSAES_CAPABLE
2384     if (BSAES_CAPABLE && mode == EVP_CIPH_CTR_MODE) {
2385         ret = AES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2386                                   &dat->ks.ks);
2387         dat->block = (block128_f) AES_encrypt;
2388         dat->stream.ctr = (ctr128_f) ossl_bsaes_ctr32_encrypt_blocks;
2389     } else
2390 #endif
2391 #ifdef VPAES_CAPABLE
2392     if (VPAES_CAPABLE) {
2393         ret = vpaes_set_encrypt_key(key,
2394                                     EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2395                                     &dat->ks.ks);
2396         dat->block = (block128_f) vpaes_encrypt;
2397         dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
2398             (cbc128_f) vpaes_cbc_encrypt : NULL;
2399     } else
2400 #endif
2401     {
2402         ret = AES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
2403                                   &dat->ks.ks);
2404         dat->block = (block128_f) AES_encrypt;
2405         dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
2406             (cbc128_f) AES_cbc_encrypt : NULL;
2407 #ifdef AES_CTR_ASM
2408         if (mode == EVP_CIPH_CTR_MODE)
2409             dat->stream.ctr = (ctr128_f) AES_ctr32_encrypt;
2410 #endif
2411     }
2412 
2413     if (ret < 0) {
2414         ERR_raise(ERR_LIB_EVP, EVP_R_AES_KEY_SETUP_FAILED);
2415         return 0;
2416     }
2417 
2418     return 1;
2419 }
2420 
2421 static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2422                           const unsigned char *in, size_t len)
2423 {
2424     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2425 
2426     if (dat->stream.cbc)
2427         (*dat->stream.cbc) (in, out, len, &dat->ks, ctx->iv,
2428                             EVP_CIPHER_CTX_is_encrypting(ctx));
2429     else if (EVP_CIPHER_CTX_is_encrypting(ctx))
2430         CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv,
2431                               dat->block);
2432     else
2433         CRYPTO_cbc128_decrypt(in, out, len, &dat->ks,
2434                               ctx->iv, dat->block);
2435 
2436     return 1;
2437 }
2438 
2439 static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2440                           const unsigned char *in, size_t len)
2441 {
2442     size_t bl = EVP_CIPHER_CTX_get_block_size(ctx);
2443     size_t i;
2444     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2445 
2446     if (len < bl)
2447         return 1;
2448 
2449     for (i = 0, len -= bl; i <= len; i += bl)
2450         (*dat->block) (in + i, out + i, &dat->ks);
2451 
2452     return 1;
2453 }
2454 
2455 static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2456                           const unsigned char *in, size_t len)
2457 {
2458     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2459 
2460     int num = EVP_CIPHER_CTX_get_num(ctx);
2461     CRYPTO_ofb128_encrypt(in, out, len, &dat->ks,
2462                           ctx->iv, &num, dat->block);
2463     EVP_CIPHER_CTX_set_num(ctx, num);
2464     return 1;
2465 }
2466 
2467 static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2468                           const unsigned char *in, size_t len)
2469 {
2470     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2471 
2472     int num = EVP_CIPHER_CTX_get_num(ctx);
2473     CRYPTO_cfb128_encrypt(in, out, len, &dat->ks,
2474                           ctx->iv, &num,
2475                           EVP_CIPHER_CTX_is_encrypting(ctx), dat->block);
2476     EVP_CIPHER_CTX_set_num(ctx, num);
2477     return 1;
2478 }
2479 
2480 static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2481                            const unsigned char *in, size_t len)
2482 {
2483     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2484 
2485     int num = EVP_CIPHER_CTX_get_num(ctx);
2486     CRYPTO_cfb128_8_encrypt(in, out, len, &dat->ks,
2487                             ctx->iv, &num,
2488                             EVP_CIPHER_CTX_is_encrypting(ctx), dat->block);
2489     EVP_CIPHER_CTX_set_num(ctx, num);
2490     return 1;
2491 }
2492 
2493 static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2494                            const unsigned char *in, size_t len)
2495 {
2496     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2497 
2498     if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS)) {
2499         int num = EVP_CIPHER_CTX_get_num(ctx);
2500         CRYPTO_cfb128_1_encrypt(in, out, len, &dat->ks,
2501                                 ctx->iv, &num,
2502                                 EVP_CIPHER_CTX_is_encrypting(ctx), dat->block);
2503         EVP_CIPHER_CTX_set_num(ctx, num);
2504         return 1;
2505     }
2506 
2507     while (len >= MAXBITCHUNK) {
2508         int num = EVP_CIPHER_CTX_get_num(ctx);
2509         CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK * 8, &dat->ks,
2510                                 ctx->iv, &num,
2511                                 EVP_CIPHER_CTX_is_encrypting(ctx), dat->block);
2512         EVP_CIPHER_CTX_set_num(ctx, num);
2513         len -= MAXBITCHUNK;
2514         out += MAXBITCHUNK;
2515         in  += MAXBITCHUNK;
2516     }
2517     if (len) {
2518         int num = EVP_CIPHER_CTX_get_num(ctx);
2519         CRYPTO_cfb128_1_encrypt(in, out, len * 8, &dat->ks,
2520                                 ctx->iv, &num,
2521                                 EVP_CIPHER_CTX_is_encrypting(ctx), dat->block);
2522         EVP_CIPHER_CTX_set_num(ctx, num);
2523     }
2524 
2525     return 1;
2526 }
2527 
2528 static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2529                           const unsigned char *in, size_t len)
2530 {
2531     int n = EVP_CIPHER_CTX_get_num(ctx);
2532     unsigned int num;
2533     EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
2534 
2535     if (n < 0)
2536         return 0;
2537     num = (unsigned int)n;
2538 
2539     if (dat->stream.ctr)
2540         CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks,
2541                                     ctx->iv,
2542                                     EVP_CIPHER_CTX_buf_noconst(ctx),
2543                                     &num, dat->stream.ctr);
2544     else
2545         CRYPTO_ctr128_encrypt(in, out, len, &dat->ks,
2546                               ctx->iv,
2547                               EVP_CIPHER_CTX_buf_noconst(ctx), &num,
2548                               dat->block);
2549     EVP_CIPHER_CTX_set_num(ctx, num);
2550     return 1;
2551 }
2552 
2553 BLOCK_CIPHER_generic_pack(NID_aes, 128, 0)
2554     BLOCK_CIPHER_generic_pack(NID_aes, 192, 0)
2555     BLOCK_CIPHER_generic_pack(NID_aes, 256, 0)
2556 
2557 static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
2558 {
2559     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,c);
2560     if (gctx == NULL)
2561         return 0;
2562     OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
2563     if (gctx->iv != c->iv)
2564         OPENSSL_free(gctx->iv);
2565     return 1;
2566 }
2567 
2568 static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
2569 {
2570     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,c);
2571     switch (type) {
2572     case EVP_CTRL_INIT:
2573         gctx->key_set = 0;
2574         gctx->iv_set = 0;
2575         gctx->ivlen = EVP_CIPHER_get_iv_length(c->cipher);
2576         gctx->iv = c->iv;
2577         gctx->taglen = -1;
2578         gctx->iv_gen = 0;
2579         gctx->tls_aad_len = -1;
2580         return 1;
2581 
2582     case EVP_CTRL_GET_IVLEN:
2583         *(int *)ptr = gctx->ivlen;
2584         return 1;
2585 
2586     case EVP_CTRL_AEAD_SET_IVLEN:
2587         if (arg <= 0)
2588             return 0;
2589         /* Allocate memory for IV if needed */
2590         if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen)) {
2591             if (gctx->iv != c->iv)
2592                 OPENSSL_free(gctx->iv);
2593             if ((gctx->iv = OPENSSL_malloc(arg)) == NULL) {
2594                 ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
2595                 return 0;
2596             }
2597         }
2598         gctx->ivlen = arg;
2599         return 1;
2600 
2601     case EVP_CTRL_AEAD_SET_TAG:
2602         if (arg <= 0 || arg > 16 || c->encrypt)
2603             return 0;
2604         memcpy(c->buf, ptr, arg);
2605         gctx->taglen = arg;
2606         return 1;
2607 
2608     case EVP_CTRL_AEAD_GET_TAG:
2609         if (arg <= 0 || arg > 16 || !c->encrypt
2610             || gctx->taglen < 0)
2611             return 0;
2612         memcpy(ptr, c->buf, arg);
2613         return 1;
2614 
2615     case EVP_CTRL_GCM_SET_IV_FIXED:
2616         /* Special case: -1 length restores whole IV */
2617         if (arg == -1) {
2618             memcpy(gctx->iv, ptr, gctx->ivlen);
2619             gctx->iv_gen = 1;
2620             return 1;
2621         }
2622         /*
2623          * Fixed field must be at least 4 bytes and invocation field at least
2624          * 8.
2625          */
2626         if ((arg < 4) || (gctx->ivlen - arg) < 8)
2627             return 0;
2628         if (arg)
2629             memcpy(gctx->iv, ptr, arg);
2630         if (c->encrypt && RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
2631             return 0;
2632         gctx->iv_gen = 1;
2633         return 1;
2634 
2635     case EVP_CTRL_GCM_IV_GEN:
2636         if (gctx->iv_gen == 0 || gctx->key_set == 0)
2637             return 0;
2638         CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
2639         if (arg <= 0 || arg > gctx->ivlen)
2640             arg = gctx->ivlen;
2641         memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
2642         /*
2643          * Invocation field will be at least 8 bytes in size and so no need
2644          * to check wrap around or increment more than last 8 bytes.
2645          */
2646         ctr64_inc(gctx->iv + gctx->ivlen - 8);
2647         gctx->iv_set = 1;
2648         return 1;
2649 
2650     case EVP_CTRL_GCM_SET_IV_INV:
2651         if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
2652             return 0;
2653         memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
2654         CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
2655         gctx->iv_set = 1;
2656         return 1;
2657 
2658     case EVP_CTRL_AEAD_TLS1_AAD:
2659         /* Save the AAD for later use */
2660         if (arg != EVP_AEAD_TLS1_AAD_LEN)
2661             return 0;
2662         memcpy(c->buf, ptr, arg);
2663         gctx->tls_aad_len = arg;
2664         gctx->tls_enc_records = 0;
2665         {
2666             unsigned int len = c->buf[arg - 2] << 8 | c->buf[arg - 1];
2667             /* Correct length for explicit IV */
2668             if (len < EVP_GCM_TLS_EXPLICIT_IV_LEN)
2669                 return 0;
2670             len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
2671             /* If decrypting correct for tag too */
2672             if (!c->encrypt) {
2673                 if (len < EVP_GCM_TLS_TAG_LEN)
2674                     return 0;
2675                 len -= EVP_GCM_TLS_TAG_LEN;
2676             }
2677             c->buf[arg - 2] = len >> 8;
2678             c->buf[arg - 1] = len & 0xff;
2679         }
2680         /* Extra padding: tag appended to record */
2681         return EVP_GCM_TLS_TAG_LEN;
2682 
2683     case EVP_CTRL_COPY:
2684         {
2685             EVP_CIPHER_CTX *out = ptr;
2686             EVP_AES_GCM_CTX *gctx_out = EVP_C_DATA(EVP_AES_GCM_CTX,out);
2687             if (gctx->gcm.key) {
2688                 if (gctx->gcm.key != &gctx->ks)
2689                     return 0;
2690                 gctx_out->gcm.key = &gctx_out->ks;
2691             }
2692             if (gctx->iv == c->iv)
2693                 gctx_out->iv = out->iv;
2694             else {
2695                 if ((gctx_out->iv = OPENSSL_malloc(gctx->ivlen)) == NULL) {
2696                     ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
2697                     return 0;
2698                 }
2699                 memcpy(gctx_out->iv, gctx->iv, gctx->ivlen);
2700             }
2701             return 1;
2702         }
2703 
2704     default:
2705         return -1;
2706 
2707     }
2708 }
2709 
2710 static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
2711                             const unsigned char *iv, int enc)
2712 {
2713     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
2714     if (!iv && !key)
2715         return 1;
2716     if (key) {
2717         do {
2718 #ifdef HWAES_CAPABLE
2719             if (HWAES_CAPABLE) {
2720                 HWAES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
2721                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
2722                                    (block128_f) HWAES_encrypt);
2723 # ifdef HWAES_ctr32_encrypt_blocks
2724                 gctx->ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
2725 # else
2726                 gctx->ctr = NULL;
2727 # endif
2728                 break;
2729             } else
2730 #endif
2731 #ifdef BSAES_CAPABLE
2732             if (BSAES_CAPABLE) {
2733                 AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
2734                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
2735                                    (block128_f) AES_encrypt);
2736                 gctx->ctr = (ctr128_f) ossl_bsaes_ctr32_encrypt_blocks;
2737                 break;
2738             } else
2739 #endif
2740 #ifdef VPAES_CAPABLE
2741             if (VPAES_CAPABLE) {
2742                 vpaes_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
2743                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
2744                                    (block128_f) vpaes_encrypt);
2745                 gctx->ctr = NULL;
2746                 break;
2747             } else
2748 #endif
2749                 (void)0;        /* terminate potentially open 'else' */
2750 
2751             AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks);
2752             CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
2753                                (block128_f) AES_encrypt);
2754 #ifdef AES_CTR_ASM
2755             gctx->ctr = (ctr128_f) AES_ctr32_encrypt;
2756 #else
2757             gctx->ctr = NULL;
2758 #endif
2759         } while (0);
2760 
2761         /*
2762          * If we have an iv can set it directly, otherwise use saved IV.
2763          */
2764         if (iv == NULL && gctx->iv_set)
2765             iv = gctx->iv;
2766         if (iv) {
2767             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
2768             gctx->iv_set = 1;
2769         }
2770         gctx->key_set = 1;
2771     } else {
2772         /* If key set use IV, otherwise copy */
2773         if (gctx->key_set)
2774             CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
2775         else
2776             memcpy(gctx->iv, iv, gctx->ivlen);
2777         gctx->iv_set = 1;
2778         gctx->iv_gen = 0;
2779     }
2780     return 1;
2781 }
2782 
2783 /*
2784  * Handle TLS GCM packet format. This consists of the last portion of the IV
2785  * followed by the payload and finally the tag. On encrypt generate IV,
2786  * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
2787  * and verify tag.
2788  */
2789 
2790 static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2791                               const unsigned char *in, size_t len)
2792 {
2793     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
2794     int rv = -1;
2795     /* Encrypt/decrypt must be performed in place */
2796     if (out != in
2797         || len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
2798         return -1;
2799 
2800     /*
2801      * Check for too many keys as per FIPS 140-2 IG A.5 "Key/IV Pair Uniqueness
2802      * Requirements from SP 800-38D".  The requirements is for one party to the
2803      * communication to fail after 2^64 - 1 keys.  We do this on the encrypting
2804      * side only.
2805      */
2806     if (ctx->encrypt && ++gctx->tls_enc_records == 0) {
2807         ERR_raise(ERR_LIB_EVP, EVP_R_TOO_MANY_RECORDS);
2808         goto err;
2809     }
2810 
2811     /*
2812      * Set IV from start of buffer or generate IV and write to start of
2813      * buffer.
2814      */
2815     if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ? EVP_CTRL_GCM_IV_GEN
2816                                               : EVP_CTRL_GCM_SET_IV_INV,
2817                             EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
2818         goto err;
2819     /* Use saved AAD */
2820     if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
2821         goto err;
2822     /* Fix buffer and length to point to payload */
2823     in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
2824     out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
2825     len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
2826     if (ctx->encrypt) {
2827         /* Encrypt payload */
2828         if (gctx->ctr) {
2829             size_t bulk = 0;
2830 #if defined(AES_GCM_ASM)
2831             if (len >= 32 && AES_GCM_ASM(gctx)) {
2832                 if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
2833                     return -1;
2834 
2835                 bulk = AES_gcm_encrypt(in, out, len,
2836                                        gctx->gcm.key,
2837                                        gctx->gcm.Yi.c, gctx->gcm.Xi.u);
2838                 gctx->gcm.len.u[1] += bulk;
2839             }
2840 #endif
2841             if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
2842                                             in + bulk,
2843                                             out + bulk,
2844                                             len - bulk, gctx->ctr))
2845                 goto err;
2846         } else {
2847             size_t bulk = 0;
2848 #if defined(AES_GCM_ASM2)
2849             if (len >= 32 && AES_GCM_ASM2(gctx)) {
2850                 if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
2851                     return -1;
2852 
2853                 bulk = AES_gcm_encrypt(in, out, len,
2854                                        gctx->gcm.key,
2855                                        gctx->gcm.Yi.c, gctx->gcm.Xi.u);
2856                 gctx->gcm.len.u[1] += bulk;
2857             }
2858 #endif
2859             if (CRYPTO_gcm128_encrypt(&gctx->gcm,
2860                                       in + bulk, out + bulk, len - bulk))
2861                 goto err;
2862         }
2863         out += len;
2864         /* Finally write tag */
2865         CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
2866         rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
2867     } else {
2868         /* Decrypt */
2869         if (gctx->ctr) {
2870             size_t bulk = 0;
2871 #if defined(AES_GCM_ASM)
2872             if (len >= 16 && AES_GCM_ASM(gctx)) {
2873                 if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
2874                     return -1;
2875 
2876                 bulk = AES_gcm_decrypt(in, out, len,
2877                                        gctx->gcm.key,
2878                                        gctx->gcm.Yi.c, gctx->gcm.Xi.u);
2879                 gctx->gcm.len.u[1] += bulk;
2880             }
2881 #endif
2882             if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
2883                                             in + bulk,
2884                                             out + bulk,
2885                                             len - bulk, gctx->ctr))
2886                 goto err;
2887         } else {
2888             size_t bulk = 0;
2889 #if defined(AES_GCM_ASM2)
2890             if (len >= 16 && AES_GCM_ASM2(gctx)) {
2891                 if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
2892                     return -1;
2893 
2894                 bulk = AES_gcm_decrypt(in, out, len,
2895                                        gctx->gcm.key,
2896                                        gctx->gcm.Yi.c, gctx->gcm.Xi.u);
2897                 gctx->gcm.len.u[1] += bulk;
2898             }
2899 #endif
2900             if (CRYPTO_gcm128_decrypt(&gctx->gcm,
2901                                       in + bulk, out + bulk, len - bulk))
2902                 goto err;
2903         }
2904         /* Retrieve tag */
2905         CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, EVP_GCM_TLS_TAG_LEN);
2906         /* If tag mismatch wipe buffer */
2907         if (CRYPTO_memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) {
2908             OPENSSL_cleanse(out, len);
2909             goto err;
2910         }
2911         rv = len;
2912     }
2913 
2914  err:
2915     gctx->iv_set = 0;
2916     gctx->tls_aad_len = -1;
2917     return rv;
2918 }
2919 
2920 #ifdef FIPS_MODULE
2921 /*
2922  * See SP800-38D (GCM) Section 8 "Uniqueness requirement on IVS and keys"
2923  *
2924  * See also 8.2.2 RBG-based construction.
2925  * Random construction consists of a free field (which can be NULL) and a
2926  * random field which will use a DRBG that can return at least 96 bits of
2927  * entropy strength. (The DRBG must be seeded by the FIPS module).
2928  */
2929 static int aes_gcm_iv_generate(EVP_AES_GCM_CTX *gctx, int offset)
2930 {
2931     int sz = gctx->ivlen - offset;
2932 
2933     /* Must be at least 96 bits */
2934     if (sz <= 0 || gctx->ivlen < 12)
2935         return 0;
2936 
2937     /* Use DRBG to generate random iv */
2938     if (RAND_bytes(gctx->iv + offset, sz) <= 0)
2939         return 0;
2940     return 1;
2941 }
2942 #endif /* FIPS_MODULE */
2943 
2944 static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2945                           const unsigned char *in, size_t len)
2946 {
2947     EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
2948 
2949     /* If not set up, return error */
2950     if (!gctx->key_set)
2951         return -1;
2952 
2953     if (gctx->tls_aad_len >= 0)
2954         return aes_gcm_tls_cipher(ctx, out, in, len);
2955 
2956 #ifdef FIPS_MODULE
2957     /*
2958      * FIPS requires generation of AES-GCM IV's inside the FIPS module.
2959      * The IV can still be set externally (the security policy will state that
2960      * this is not FIPS compliant). There are some applications
2961      * where setting the IV externally is the only option available.
2962      */
2963     if (!gctx->iv_set) {
2964         if (!ctx->encrypt || !aes_gcm_iv_generate(gctx, 0))
2965             return -1;
2966         CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
2967         gctx->iv_set = 1;
2968         gctx->iv_gen_rand = 1;
2969     }
2970 #else
2971     if (!gctx->iv_set)
2972         return -1;
2973 #endif /* FIPS_MODULE */
2974 
2975     if (in) {
2976         if (out == NULL) {
2977             if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
2978                 return -1;
2979         } else if (ctx->encrypt) {
2980             if (gctx->ctr) {
2981                 size_t bulk = 0;
2982 #if defined(AES_GCM_ASM)
2983                 if (len >= 32 && AES_GCM_ASM(gctx)) {
2984                     size_t res = (16 - gctx->gcm.mres) % 16;
2985 
2986                     if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
2987                         return -1;
2988 
2989                     bulk = AES_gcm_encrypt(in + res,
2990                                            out + res, len - res,
2991                                            gctx->gcm.key, gctx->gcm.Yi.c,
2992                                            gctx->gcm.Xi.u);
2993                     gctx->gcm.len.u[1] += bulk;
2994                     bulk += res;
2995                 }
2996 #endif
2997                 if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
2998                                                 in + bulk,
2999                                                 out + bulk,
3000                                                 len - bulk, gctx->ctr))
3001                     return -1;
3002             } else {
3003                 size_t bulk = 0;
3004 #if defined(AES_GCM_ASM2)
3005                 if (len >= 32 && AES_GCM_ASM2(gctx)) {
3006                     size_t res = (16 - gctx->gcm.mres) % 16;
3007 
3008                     if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
3009                         return -1;
3010 
3011                     bulk = AES_gcm_encrypt(in + res,
3012                                            out + res, len - res,
3013                                            gctx->gcm.key, gctx->gcm.Yi.c,
3014                                            gctx->gcm.Xi.u);
3015                     gctx->gcm.len.u[1] += bulk;
3016                     bulk += res;
3017                 }
3018 #endif
3019                 if (CRYPTO_gcm128_encrypt(&gctx->gcm,
3020                                           in + bulk, out + bulk, len - bulk))
3021                     return -1;
3022             }
3023         } else {
3024             if (gctx->ctr) {
3025                 size_t bulk = 0;
3026 #if defined(AES_GCM_ASM)
3027                 if (len >= 16 && AES_GCM_ASM(gctx)) {
3028                     size_t res = (16 - gctx->gcm.mres) % 16;
3029 
3030                     if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
3031                         return -1;
3032 
3033                     bulk = AES_gcm_decrypt(in + res,
3034                                            out + res, len - res,
3035                                            gctx->gcm.key,
3036                                            gctx->gcm.Yi.c, gctx->gcm.Xi.u);
3037                     gctx->gcm.len.u[1] += bulk;
3038                     bulk += res;
3039                 }
3040 #endif
3041                 if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
3042                                                 in + bulk,
3043                                                 out + bulk,
3044                                                 len - bulk, gctx->ctr))
3045                     return -1;
3046             } else {
3047                 size_t bulk = 0;
3048 #if defined(AES_GCM_ASM2)
3049                 if (len >= 16 && AES_GCM_ASM2(gctx)) {
3050                     size_t res = (16 - gctx->gcm.mres) % 16;
3051 
3052                     if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
3053                         return -1;
3054 
3055                     bulk = AES_gcm_decrypt(in + res,
3056                                            out + res, len - res,
3057                                            gctx->gcm.key,
3058                                            gctx->gcm.Yi.c, gctx->gcm.Xi.u);
3059                     gctx->gcm.len.u[1] += bulk;
3060                     bulk += res;
3061                 }
3062 #endif
3063                 if (CRYPTO_gcm128_decrypt(&gctx->gcm,
3064                                           in + bulk, out + bulk, len - bulk))
3065                     return -1;
3066             }
3067         }
3068         return len;
3069     } else {
3070         if (!ctx->encrypt) {
3071             if (gctx->taglen < 0)
3072                 return -1;
3073             if (CRYPTO_gcm128_finish(&gctx->gcm, ctx->buf, gctx->taglen) != 0)
3074                 return -1;
3075             gctx->iv_set = 0;
3076             return 0;
3077         }
3078         CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
3079         gctx->taglen = 16;
3080         /* Don't reuse the IV */
3081         gctx->iv_set = 0;
3082         return 0;
3083     }
3084 
3085 }
3086 
3087 #define CUSTOM_FLAGS    (EVP_CIPH_FLAG_DEFAULT_ASN1 \
3088                 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
3089                 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
3090                 | EVP_CIPH_CUSTOM_COPY | EVP_CIPH_CUSTOM_IV_LENGTH)
3091 
3092 BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM,
3093                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3094     BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, gcm, GCM,
3095                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3096     BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, gcm, GCM,
3097                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3098 
3099 static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
3100 {
3101     EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX, c);
3102 
3103     if (type == EVP_CTRL_COPY) {
3104         EVP_CIPHER_CTX *out = ptr;
3105         EVP_AES_XTS_CTX *xctx_out = EVP_C_DATA(EVP_AES_XTS_CTX,out);
3106 
3107         if (xctx->xts.key1) {
3108             if (xctx->xts.key1 != &xctx->ks1)
3109                 return 0;
3110             xctx_out->xts.key1 = &xctx_out->ks1;
3111         }
3112         if (xctx->xts.key2) {
3113             if (xctx->xts.key2 != &xctx->ks2)
3114                 return 0;
3115             xctx_out->xts.key2 = &xctx_out->ks2;
3116         }
3117         return 1;
3118     } else if (type != EVP_CTRL_INIT)
3119         return -1;
3120     /* key1 and key2 are used as an indicator both key and IV are set */
3121     xctx->xts.key1 = NULL;
3122     xctx->xts.key2 = NULL;
3123     return 1;
3124 }
3125 
3126 static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
3127                             const unsigned char *iv, int enc)
3128 {
3129     EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
3130 
3131     if (!iv && !key)
3132         return 1;
3133 
3134     if (key) {
3135         do {
3136             /* The key is two half length keys in reality */
3137             const int bytes = EVP_CIPHER_CTX_get_key_length(ctx) / 2;
3138             const int bits = bytes * 8;
3139 
3140             /*
3141              * Verify that the two keys are different.
3142              *
3143              * This addresses the vulnerability described in Rogaway's
3144              * September 2004 paper:
3145              *
3146              *      "Efficient Instantiations of Tweakable Blockciphers and
3147              *       Refinements to Modes OCB and PMAC".
3148              *      (http://web.cs.ucdavis.edu/~rogaway/papers/offsets.pdf)
3149              *
3150              * FIPS 140-2 IG A.9 XTS-AES Key Generation Requirements states
3151              * that:
3152              *      "The check for Key_1 != Key_2 shall be done at any place
3153              *       BEFORE using the keys in the XTS-AES algorithm to process
3154              *       data with them."
3155              */
3156             if ((!allow_insecure_decrypt || enc)
3157                     && CRYPTO_memcmp(key, key + bytes, bytes) == 0) {
3158                 ERR_raise(ERR_LIB_EVP, EVP_R_XTS_DUPLICATED_KEYS);
3159                 return 0;
3160             }
3161 
3162 #ifdef AES_XTS_ASM
3163             xctx->stream = enc ? AES_xts_encrypt : AES_xts_decrypt;
3164 #else
3165             xctx->stream = NULL;
3166 #endif
3167             /* key_len is two AES keys */
3168 #ifdef HWAES_CAPABLE
3169             if (HWAES_CAPABLE) {
3170                 if (enc) {
3171                     HWAES_set_encrypt_key(key, bits, &xctx->ks1.ks);
3172                     xctx->xts.block1 = (block128_f) HWAES_encrypt;
3173 # ifdef HWAES_xts_encrypt
3174                     xctx->stream = HWAES_xts_encrypt;
3175 # endif
3176                 } else {
3177                     HWAES_set_decrypt_key(key, bits, &xctx->ks1.ks);
3178                     xctx->xts.block1 = (block128_f) HWAES_decrypt;
3179 # ifdef HWAES_xts_decrypt
3180                     xctx->stream = HWAES_xts_decrypt;
3181 #endif
3182                 }
3183 
3184                 HWAES_set_encrypt_key(key + bytes, bits, &xctx->ks2.ks);
3185                 xctx->xts.block2 = (block128_f) HWAES_encrypt;
3186 
3187                 xctx->xts.key1 = &xctx->ks1;
3188                 break;
3189             } else
3190 #endif
3191 #ifdef BSAES_CAPABLE
3192             if (BSAES_CAPABLE)
3193                 xctx->stream = enc ? ossl_bsaes_xts_encrypt : ossl_bsaes_xts_decrypt;
3194             else
3195 #endif
3196 #ifdef VPAES_CAPABLE
3197             if (VPAES_CAPABLE) {
3198                 if (enc) {
3199                     vpaes_set_encrypt_key(key, bits, &xctx->ks1.ks);
3200                     xctx->xts.block1 = (block128_f) vpaes_encrypt;
3201                 } else {
3202                     vpaes_set_decrypt_key(key, bits, &xctx->ks1.ks);
3203                     xctx->xts.block1 = (block128_f) vpaes_decrypt;
3204                 }
3205 
3206                 vpaes_set_encrypt_key(key + bytes, bits, &xctx->ks2.ks);
3207                 xctx->xts.block2 = (block128_f) vpaes_encrypt;
3208 
3209                 xctx->xts.key1 = &xctx->ks1;
3210                 break;
3211             } else
3212 #endif
3213                 (void)0;        /* terminate potentially open 'else' */
3214 
3215             if (enc) {
3216                 AES_set_encrypt_key(key, bits, &xctx->ks1.ks);
3217                 xctx->xts.block1 = (block128_f) AES_encrypt;
3218             } else {
3219                 AES_set_decrypt_key(key, bits, &xctx->ks1.ks);
3220                 xctx->xts.block1 = (block128_f) AES_decrypt;
3221             }
3222 
3223             AES_set_encrypt_key(key + bytes, bits, &xctx->ks2.ks);
3224             xctx->xts.block2 = (block128_f) AES_encrypt;
3225 
3226             xctx->xts.key1 = &xctx->ks1;
3227         } while (0);
3228     }
3229 
3230     if (iv) {
3231         xctx->xts.key2 = &xctx->ks2;
3232         memcpy(ctx->iv, iv, 16);
3233     }
3234 
3235     return 1;
3236 }
3237 
3238 static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
3239                           const unsigned char *in, size_t len)
3240 {
3241     EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
3242 
3243     if (xctx->xts.key1 == NULL
3244             || xctx->xts.key2 == NULL
3245             || out == NULL
3246             || in == NULL
3247             || len < AES_BLOCK_SIZE)
3248         return 0;
3249 
3250     /*
3251      * Impose a limit of 2^20 blocks per data unit as specified by
3252      * IEEE Std 1619-2018.  The earlier and obsolete IEEE Std 1619-2007
3253      * indicated that this was a SHOULD NOT rather than a MUST NOT.
3254      * NIST SP 800-38E mandates the same limit.
3255      */
3256     if (len > XTS_MAX_BLOCKS_PER_DATA_UNIT * AES_BLOCK_SIZE) {
3257         ERR_raise(ERR_LIB_EVP, EVP_R_XTS_DATA_UNIT_IS_TOO_LARGE);
3258         return 0;
3259     }
3260 
3261     if (xctx->stream)
3262         (*xctx->stream) (in, out, len,
3263                          xctx->xts.key1, xctx->xts.key2,
3264                          ctx->iv);
3265     else if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
3266                                    EVP_CIPHER_CTX_is_encrypting(ctx)))
3267         return 0;
3268     return 1;
3269 }
3270 
3271 #define aes_xts_cleanup NULL
3272 
3273 #define XTS_FLAGS       (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
3274                          | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
3275                          | EVP_CIPH_CUSTOM_COPY)
3276 
3277 BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, XTS_FLAGS)
3278     BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, XTS_FLAGS)
3279 
3280 static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
3281 {
3282     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,c);
3283     switch (type) {
3284     case EVP_CTRL_INIT:
3285         cctx->key_set = 0;
3286         cctx->iv_set = 0;
3287         cctx->L = 8;
3288         cctx->M = 12;
3289         cctx->tag_set = 0;
3290         cctx->len_set = 0;
3291         cctx->tls_aad_len = -1;
3292         return 1;
3293 
3294     case EVP_CTRL_GET_IVLEN:
3295         *(int *)ptr = 15 - cctx->L;
3296         return 1;
3297 
3298     case EVP_CTRL_AEAD_TLS1_AAD:
3299         /* Save the AAD for later use */
3300         if (arg != EVP_AEAD_TLS1_AAD_LEN)
3301             return 0;
3302         memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
3303         cctx->tls_aad_len = arg;
3304         {
3305             uint16_t len =
3306                 EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] << 8
3307                 | EVP_CIPHER_CTX_buf_noconst(c)[arg - 1];
3308             /* Correct length for explicit IV */
3309             if (len < EVP_CCM_TLS_EXPLICIT_IV_LEN)
3310                 return 0;
3311             len -= EVP_CCM_TLS_EXPLICIT_IV_LEN;
3312             /* If decrypting correct for tag too */
3313             if (!EVP_CIPHER_CTX_is_encrypting(c)) {
3314                 if (len < cctx->M)
3315                     return 0;
3316                 len -= cctx->M;
3317             }
3318             EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] = len >> 8;
3319             EVP_CIPHER_CTX_buf_noconst(c)[arg - 1] = len & 0xff;
3320         }
3321         /* Extra padding: tag appended to record */
3322         return cctx->M;
3323 
3324     case EVP_CTRL_CCM_SET_IV_FIXED:
3325         /* Sanity check length */
3326         if (arg != EVP_CCM_TLS_FIXED_IV_LEN)
3327             return 0;
3328         /* Just copy to first part of IV */
3329         memcpy(c->iv, ptr, arg);
3330         return 1;
3331 
3332     case EVP_CTRL_AEAD_SET_IVLEN:
3333         arg = 15 - arg;
3334         /* fall thru */
3335     case EVP_CTRL_CCM_SET_L:
3336         if (arg < 2 || arg > 8)
3337             return 0;
3338         cctx->L = arg;
3339         return 1;
3340 
3341     case EVP_CTRL_AEAD_SET_TAG:
3342         if ((arg & 1) || arg < 4 || arg > 16)
3343             return 0;
3344         if (EVP_CIPHER_CTX_is_encrypting(c) && ptr)
3345             return 0;
3346         if (ptr) {
3347             cctx->tag_set = 1;
3348             memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
3349         }
3350         cctx->M = arg;
3351         return 1;
3352 
3353     case EVP_CTRL_AEAD_GET_TAG:
3354         if (!EVP_CIPHER_CTX_is_encrypting(c) || !cctx->tag_set)
3355             return 0;
3356         if (!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
3357             return 0;
3358         cctx->tag_set = 0;
3359         cctx->iv_set = 0;
3360         cctx->len_set = 0;
3361         return 1;
3362 
3363     case EVP_CTRL_COPY:
3364         {
3365             EVP_CIPHER_CTX *out = ptr;
3366             EVP_AES_CCM_CTX *cctx_out = EVP_C_DATA(EVP_AES_CCM_CTX,out);
3367             if (cctx->ccm.key) {
3368                 if (cctx->ccm.key != &cctx->ks)
3369                     return 0;
3370                 cctx_out->ccm.key = &cctx_out->ks;
3371             }
3372             return 1;
3373         }
3374 
3375     default:
3376         return -1;
3377 
3378     }
3379 }
3380 
3381 static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
3382                             const unsigned char *iv, int enc)
3383 {
3384     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
3385     if (!iv && !key)
3386         return 1;
3387     if (key)
3388         do {
3389 #ifdef HWAES_CAPABLE
3390             if (HWAES_CAPABLE) {
3391                 HWAES_set_encrypt_key(key,
3392                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3393                                       &cctx->ks.ks);
3394 
3395                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
3396                                    &cctx->ks, (block128_f) HWAES_encrypt);
3397                 cctx->str = NULL;
3398                 cctx->key_set = 1;
3399                 break;
3400             } else
3401 #endif
3402 #ifdef VPAES_CAPABLE
3403             if (VPAES_CAPABLE) {
3404                 vpaes_set_encrypt_key(key,
3405                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3406                                       &cctx->ks.ks);
3407                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
3408                                    &cctx->ks, (block128_f) vpaes_encrypt);
3409                 cctx->str = NULL;
3410                 cctx->key_set = 1;
3411                 break;
3412             }
3413 #endif
3414             AES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3415                                 &cctx->ks.ks);
3416             CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
3417                                &cctx->ks, (block128_f) AES_encrypt);
3418             cctx->str = NULL;
3419             cctx->key_set = 1;
3420         } while (0);
3421     if (iv) {
3422         memcpy(ctx->iv, iv, 15 - cctx->L);
3423         cctx->iv_set = 1;
3424     }
3425     return 1;
3426 }
3427 
3428 static int aes_ccm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
3429                               const unsigned char *in, size_t len)
3430 {
3431     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
3432     CCM128_CONTEXT *ccm = &cctx->ccm;
3433     /* Encrypt/decrypt must be performed in place */
3434     if (out != in || len < (EVP_CCM_TLS_EXPLICIT_IV_LEN + (size_t)cctx->M))
3435         return -1;
3436     /* If encrypting set explicit IV from sequence number (start of AAD) */
3437     if (EVP_CIPHER_CTX_is_encrypting(ctx))
3438         memcpy(out, EVP_CIPHER_CTX_buf_noconst(ctx),
3439                EVP_CCM_TLS_EXPLICIT_IV_LEN);
3440     /* Get rest of IV from explicit IV */
3441     memcpy(ctx->iv + EVP_CCM_TLS_FIXED_IV_LEN, in,
3442            EVP_CCM_TLS_EXPLICIT_IV_LEN);
3443     /* Correct length value */
3444     len -= EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->M;
3445     if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,
3446                             len))
3447             return -1;
3448     /* Use saved AAD */
3449     CRYPTO_ccm128_aad(ccm, EVP_CIPHER_CTX_buf_noconst(ctx),
3450                       cctx->tls_aad_len);
3451     /* Fix buffer to point to payload */
3452     in += EVP_CCM_TLS_EXPLICIT_IV_LEN;
3453     out += EVP_CCM_TLS_EXPLICIT_IV_LEN;
3454     if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
3455         if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
3456                                                     cctx->str) :
3457             CRYPTO_ccm128_encrypt(ccm, in, out, len))
3458             return -1;
3459         if (!CRYPTO_ccm128_tag(ccm, out + len, cctx->M))
3460             return -1;
3461         return len + EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->M;
3462     } else {
3463         if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
3464                                                      cctx->str) :
3465             !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
3466             unsigned char tag[16];
3467             if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
3468                 if (!CRYPTO_memcmp(tag, in + len, cctx->M))
3469                     return len;
3470             }
3471         }
3472         OPENSSL_cleanse(out, len);
3473         return -1;
3474     }
3475 }
3476 
3477 static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
3478                           const unsigned char *in, size_t len)
3479 {
3480     EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
3481     CCM128_CONTEXT *ccm = &cctx->ccm;
3482     /* If not set up, return error */
3483     if (!cctx->key_set)
3484         return -1;
3485 
3486     if (cctx->tls_aad_len >= 0)
3487         return aes_ccm_tls_cipher(ctx, out, in, len);
3488 
3489     /* EVP_*Final() doesn't return any data */
3490     if (in == NULL && out != NULL)
3491         return 0;
3492 
3493     if (!cctx->iv_set)
3494         return -1;
3495 
3496     if (!out) {
3497         if (!in) {
3498             if (CRYPTO_ccm128_setiv(ccm, ctx->iv,
3499                                     15 - cctx->L, len))
3500                 return -1;
3501             cctx->len_set = 1;
3502             return len;
3503         }
3504         /* If have AAD need message length */
3505         if (!cctx->len_set && len)
3506             return -1;
3507         CRYPTO_ccm128_aad(ccm, in, len);
3508         return len;
3509     }
3510 
3511     /* The tag must be set before actually decrypting data */
3512     if (!EVP_CIPHER_CTX_is_encrypting(ctx) && !cctx->tag_set)
3513         return -1;
3514 
3515     /* If not set length yet do it */
3516     if (!cctx->len_set) {
3517         if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
3518             return -1;
3519         cctx->len_set = 1;
3520     }
3521     if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
3522         if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
3523                                                     cctx->str) :
3524             CRYPTO_ccm128_encrypt(ccm, in, out, len))
3525             return -1;
3526         cctx->tag_set = 1;
3527         return len;
3528     } else {
3529         int rv = -1;
3530         if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
3531                                                      cctx->str) :
3532             !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
3533             unsigned char tag[16];
3534             if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
3535                 if (!CRYPTO_memcmp(tag, EVP_CIPHER_CTX_buf_noconst(ctx),
3536                                    cctx->M))
3537                     rv = len;
3538             }
3539         }
3540         if (rv == -1)
3541             OPENSSL_cleanse(out, len);
3542         cctx->iv_set = 0;
3543         cctx->tag_set = 0;
3544         cctx->len_set = 0;
3545         return rv;
3546     }
3547 }
3548 
3549 #define aes_ccm_cleanup NULL
3550 
3551 BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, ccm, CCM,
3552                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3553 BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, ccm, CCM,
3554                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3555 BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, ccm, CCM,
3556                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
3557 
3558 typedef struct {
3559     union {
3560         OSSL_UNION_ALIGN;
3561         AES_KEY ks;
3562     } ks;
3563     /* Indicates if IV has been set */
3564     unsigned char *iv;
3565 } EVP_AES_WRAP_CTX;
3566 
3567 static int aes_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
3568                              const unsigned char *iv, int enc)
3569 {
3570     int len;
3571     EVP_AES_WRAP_CTX *wctx = EVP_C_DATA(EVP_AES_WRAP_CTX,ctx);
3572 
3573     if (iv == NULL && key == NULL)
3574         return 1;
3575     if (key != NULL) {
3576         if (EVP_CIPHER_CTX_is_encrypting(ctx))
3577             AES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3578                                 &wctx->ks.ks);
3579         else
3580             AES_set_decrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3581                                 &wctx->ks.ks);
3582         if (iv == NULL)
3583             wctx->iv = NULL;
3584     }
3585     if (iv != NULL) {
3586         if ((len = EVP_CIPHER_CTX_get_iv_length(ctx)) < 0)
3587             return 0;
3588         memcpy(ctx->iv, iv, len);
3589         wctx->iv = ctx->iv;
3590     }
3591     return 1;
3592 }
3593 
3594 static int aes_wrap_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
3595                            const unsigned char *in, size_t inlen)
3596 {
3597     EVP_AES_WRAP_CTX *wctx = EVP_C_DATA(EVP_AES_WRAP_CTX,ctx);
3598     size_t rv;
3599     /* AES wrap with padding has IV length of 4, without padding 8 */
3600     int pad = EVP_CIPHER_CTX_get_iv_length(ctx) == 4;
3601     /* No final operation so always return zero length */
3602     if (!in)
3603         return 0;
3604     /* Input length must always be non-zero */
3605     if (!inlen)
3606         return -1;
3607     /* If decrypting need at least 16 bytes and multiple of 8 */
3608     if (!EVP_CIPHER_CTX_is_encrypting(ctx) && (inlen < 16 || inlen & 0x7))
3609         return -1;
3610     /* If not padding input must be multiple of 8 */
3611     if (!pad && inlen & 0x7)
3612         return -1;
3613     if (ossl_is_partially_overlapping(out, in, inlen)) {
3614         ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING);
3615         return 0;
3616     }
3617     if (!out) {
3618         if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
3619             /* If padding round up to multiple of 8 */
3620             if (pad)
3621                 inlen = (inlen + 7) / 8 * 8;
3622             /* 8 byte prefix */
3623             return inlen + 8;
3624         } else {
3625             /*
3626              * If not padding output will be exactly 8 bytes smaller than
3627              * input. If padding it will be at least 8 bytes smaller but we
3628              * don't know how much.
3629              */
3630             return inlen - 8;
3631         }
3632     }
3633     if (pad) {
3634         if (EVP_CIPHER_CTX_is_encrypting(ctx))
3635             rv = CRYPTO_128_wrap_pad(&wctx->ks.ks, wctx->iv,
3636                                      out, in, inlen,
3637                                      (block128_f) AES_encrypt);
3638         else
3639             rv = CRYPTO_128_unwrap_pad(&wctx->ks.ks, wctx->iv,
3640                                        out, in, inlen,
3641                                        (block128_f) AES_decrypt);
3642     } else {
3643         if (EVP_CIPHER_CTX_is_encrypting(ctx))
3644             rv = CRYPTO_128_wrap(&wctx->ks.ks, wctx->iv,
3645                                  out, in, inlen, (block128_f) AES_encrypt);
3646         else
3647             rv = CRYPTO_128_unwrap(&wctx->ks.ks, wctx->iv,
3648                                    out, in, inlen, (block128_f) AES_decrypt);
3649     }
3650     return rv ? (int)rv : -1;
3651 }
3652 
3653 #define WRAP_FLAGS      (EVP_CIPH_WRAP_MODE \
3654                 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
3655                 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1)
3656 
3657 static const EVP_CIPHER aes_128_wrap = {
3658     NID_id_aes128_wrap,
3659     8, 16, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3660     aes_wrap_init_key, aes_wrap_cipher,
3661     NULL,
3662     sizeof(EVP_AES_WRAP_CTX),
3663     NULL, NULL, NULL, NULL
3664 };
3665 
3666 const EVP_CIPHER *EVP_aes_128_wrap(void)
3667 {
3668     return &aes_128_wrap;
3669 }
3670 
3671 static const EVP_CIPHER aes_192_wrap = {
3672     NID_id_aes192_wrap,
3673     8, 24, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3674     aes_wrap_init_key, aes_wrap_cipher,
3675     NULL,
3676     sizeof(EVP_AES_WRAP_CTX),
3677     NULL, NULL, NULL, NULL
3678 };
3679 
3680 const EVP_CIPHER *EVP_aes_192_wrap(void)
3681 {
3682     return &aes_192_wrap;
3683 }
3684 
3685 static const EVP_CIPHER aes_256_wrap = {
3686     NID_id_aes256_wrap,
3687     8, 32, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3688     aes_wrap_init_key, aes_wrap_cipher,
3689     NULL,
3690     sizeof(EVP_AES_WRAP_CTX),
3691     NULL, NULL, NULL, NULL
3692 };
3693 
3694 const EVP_CIPHER *EVP_aes_256_wrap(void)
3695 {
3696     return &aes_256_wrap;
3697 }
3698 
3699 static const EVP_CIPHER aes_128_wrap_pad = {
3700     NID_id_aes128_wrap_pad,
3701     8, 16, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3702     aes_wrap_init_key, aes_wrap_cipher,
3703     NULL,
3704     sizeof(EVP_AES_WRAP_CTX),
3705     NULL, NULL, NULL, NULL
3706 };
3707 
3708 const EVP_CIPHER *EVP_aes_128_wrap_pad(void)
3709 {
3710     return &aes_128_wrap_pad;
3711 }
3712 
3713 static const EVP_CIPHER aes_192_wrap_pad = {
3714     NID_id_aes192_wrap_pad,
3715     8, 24, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3716     aes_wrap_init_key, aes_wrap_cipher,
3717     NULL,
3718     sizeof(EVP_AES_WRAP_CTX),
3719     NULL, NULL, NULL, NULL
3720 };
3721 
3722 const EVP_CIPHER *EVP_aes_192_wrap_pad(void)
3723 {
3724     return &aes_192_wrap_pad;
3725 }
3726 
3727 static const EVP_CIPHER aes_256_wrap_pad = {
3728     NID_id_aes256_wrap_pad,
3729     8, 32, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL,
3730     aes_wrap_init_key, aes_wrap_cipher,
3731     NULL,
3732     sizeof(EVP_AES_WRAP_CTX),
3733     NULL, NULL, NULL, NULL
3734 };
3735 
3736 const EVP_CIPHER *EVP_aes_256_wrap_pad(void)
3737 {
3738     return &aes_256_wrap_pad;
3739 }
3740 
3741 #ifndef OPENSSL_NO_OCB
3742 static int aes_ocb_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
3743 {
3744     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,c);
3745     EVP_CIPHER_CTX *newc;
3746     EVP_AES_OCB_CTX *new_octx;
3747 
3748     switch (type) {
3749     case EVP_CTRL_INIT:
3750         octx->key_set = 0;
3751         octx->iv_set = 0;
3752         octx->ivlen = EVP_CIPHER_get_iv_length(c->cipher);
3753         octx->iv = c->iv;
3754         octx->taglen = 16;
3755         octx->data_buf_len = 0;
3756         octx->aad_buf_len = 0;
3757         return 1;
3758 
3759     case EVP_CTRL_GET_IVLEN:
3760         *(int *)ptr = octx->ivlen;
3761         return 1;
3762 
3763     case EVP_CTRL_AEAD_SET_IVLEN:
3764         /* IV len must be 1 to 15 */
3765         if (arg <= 0 || arg > 15)
3766             return 0;
3767 
3768         octx->ivlen = arg;
3769         return 1;
3770 
3771     case EVP_CTRL_AEAD_SET_TAG:
3772         if (ptr == NULL) {
3773             /* Tag len must be 0 to 16 */
3774             if (arg < 0 || arg > 16)
3775                 return 0;
3776 
3777             octx->taglen = arg;
3778             return 1;
3779         }
3780         if (arg != octx->taglen || EVP_CIPHER_CTX_is_encrypting(c))
3781             return 0;
3782         memcpy(octx->tag, ptr, arg);
3783         return 1;
3784 
3785     case EVP_CTRL_AEAD_GET_TAG:
3786         if (arg != octx->taglen || !EVP_CIPHER_CTX_is_encrypting(c))
3787             return 0;
3788 
3789         memcpy(ptr, octx->tag, arg);
3790         return 1;
3791 
3792     case EVP_CTRL_COPY:
3793         newc = (EVP_CIPHER_CTX *)ptr;
3794         new_octx = EVP_C_DATA(EVP_AES_OCB_CTX,newc);
3795         return CRYPTO_ocb128_copy_ctx(&new_octx->ocb, &octx->ocb,
3796                                       &new_octx->ksenc.ks,
3797                                       &new_octx->ksdec.ks);
3798 
3799     default:
3800         return -1;
3801 
3802     }
3803 }
3804 
3805 static int aes_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
3806                             const unsigned char *iv, int enc)
3807 {
3808     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
3809     if (!iv && !key)
3810         return 1;
3811     if (key) {
3812         do {
3813             /*
3814              * We set both the encrypt and decrypt key here because decrypt
3815              * needs both. We could possibly optimise to remove setting the
3816              * decrypt for an encryption operation.
3817              */
3818 # ifdef HWAES_CAPABLE
3819             if (HWAES_CAPABLE) {
3820                 HWAES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3821                                       &octx->ksenc.ks);
3822                 HWAES_set_decrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3823                                       &octx->ksdec.ks);
3824                 if (!CRYPTO_ocb128_init(&octx->ocb,
3825                                         &octx->ksenc.ks, &octx->ksdec.ks,
3826                                         (block128_f) HWAES_encrypt,
3827                                         (block128_f) HWAES_decrypt,
3828                                         enc ? HWAES_ocb_encrypt
3829                                             : HWAES_ocb_decrypt))
3830                     return 0;
3831                 break;
3832             }
3833 # endif
3834 # ifdef VPAES_CAPABLE
3835             if (VPAES_CAPABLE) {
3836                 vpaes_set_encrypt_key(key,
3837                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3838                                       &octx->ksenc.ks);
3839                 vpaes_set_decrypt_key(key,
3840                                       EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3841                                       &octx->ksdec.ks);
3842                 if (!CRYPTO_ocb128_init(&octx->ocb,
3843                                         &octx->ksenc.ks, &octx->ksdec.ks,
3844                                         (block128_f) vpaes_encrypt,
3845                                         (block128_f) vpaes_decrypt,
3846                                         NULL))
3847                     return 0;
3848                 break;
3849             }
3850 # endif
3851             AES_set_encrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3852                                 &octx->ksenc.ks);
3853             AES_set_decrypt_key(key, EVP_CIPHER_CTX_get_key_length(ctx) * 8,
3854                                 &octx->ksdec.ks);
3855             if (!CRYPTO_ocb128_init(&octx->ocb,
3856                                     &octx->ksenc.ks, &octx->ksdec.ks,
3857                                     (block128_f) AES_encrypt,
3858                                     (block128_f) AES_decrypt,
3859                                     NULL))
3860                 return 0;
3861         }
3862         while (0);
3863 
3864         /*
3865          * If we have an iv we can set it directly, otherwise use saved IV.
3866          */
3867         if (iv == NULL && octx->iv_set)
3868             iv = octx->iv;
3869         if (iv) {
3870             if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
3871                 != 1)
3872                 return 0;
3873             octx->iv_set = 1;
3874         }
3875         octx->key_set = 1;
3876     } else {
3877         /* If key set use IV, otherwise copy */
3878         if (octx->key_set)
3879             CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
3880         else
3881             memcpy(octx->iv, iv, octx->ivlen);
3882         octx->iv_set = 1;
3883     }
3884     return 1;
3885 }
3886 
3887 static int aes_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
3888                           const unsigned char *in, size_t len)
3889 {
3890     unsigned char *buf;
3891     int *buf_len;
3892     int written_len = 0;
3893     size_t trailing_len;
3894     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
3895 
3896     /* If IV or Key not set then return error */
3897     if (!octx->iv_set)
3898         return -1;
3899 
3900     if (!octx->key_set)
3901         return -1;
3902 
3903     if (in != NULL) {
3904         /*
3905          * Need to ensure we are only passing full blocks to low level OCB
3906          * routines. We do it here rather than in EVP_EncryptUpdate/
3907          * EVP_DecryptUpdate because we need to pass full blocks of AAD too
3908          * and those routines don't support that
3909          */
3910 
3911         /* Are we dealing with AAD or normal data here? */
3912         if (out == NULL) {
3913             buf = octx->aad_buf;
3914             buf_len = &(octx->aad_buf_len);
3915         } else {
3916             buf = octx->data_buf;
3917             buf_len = &(octx->data_buf_len);
3918 
3919             if (ossl_is_partially_overlapping(out + *buf_len, in, len)) {
3920                 ERR_raise(ERR_LIB_EVP, EVP_R_PARTIALLY_OVERLAPPING);
3921                 return 0;
3922             }
3923         }
3924 
3925         /*
3926          * If we've got a partially filled buffer from a previous call then
3927          * use that data first
3928          */
3929         if (*buf_len > 0) {
3930             unsigned int remaining;
3931 
3932             remaining = AES_BLOCK_SIZE - (*buf_len);
3933             if (remaining > len) {
3934                 memcpy(buf + (*buf_len), in, len);
3935                 *(buf_len) += len;
3936                 return 0;
3937             }
3938             memcpy(buf + (*buf_len), in, remaining);
3939 
3940             /*
3941              * If we get here we've filled the buffer, so process it
3942              */
3943             len -= remaining;
3944             in += remaining;
3945             if (out == NULL) {
3946                 if (!CRYPTO_ocb128_aad(&octx->ocb, buf, AES_BLOCK_SIZE))
3947                     return -1;
3948             } else if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
3949                 if (!CRYPTO_ocb128_encrypt(&octx->ocb, buf, out,
3950                                            AES_BLOCK_SIZE))
3951                     return -1;
3952             } else {
3953                 if (!CRYPTO_ocb128_decrypt(&octx->ocb, buf, out,
3954                                            AES_BLOCK_SIZE))
3955                     return -1;
3956             }
3957             written_len = AES_BLOCK_SIZE;
3958             *buf_len = 0;
3959             if (out != NULL)
3960                 out += AES_BLOCK_SIZE;
3961         }
3962 
3963         /* Do we have a partial block to handle at the end? */
3964         trailing_len = len % AES_BLOCK_SIZE;
3965 
3966         /*
3967          * If we've got some full blocks to handle, then process these first
3968          */
3969         if (len != trailing_len) {
3970             if (out == NULL) {
3971                 if (!CRYPTO_ocb128_aad(&octx->ocb, in, len - trailing_len))
3972                     return -1;
3973             } else if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
3974                 if (!CRYPTO_ocb128_encrypt
3975                     (&octx->ocb, in, out, len - trailing_len))
3976                     return -1;
3977             } else {
3978                 if (!CRYPTO_ocb128_decrypt
3979                     (&octx->ocb, in, out, len - trailing_len))
3980                     return -1;
3981             }
3982             written_len += len - trailing_len;
3983             in += len - trailing_len;
3984         }
3985 
3986         /* Handle any trailing partial block */
3987         if (trailing_len > 0) {
3988             memcpy(buf, in, trailing_len);
3989             *buf_len = trailing_len;
3990         }
3991 
3992         return written_len;
3993     } else {
3994         /*
3995          * First of all empty the buffer of any partial block that we might
3996          * have been provided - both for data and AAD
3997          */
3998         if (octx->data_buf_len > 0) {
3999             if (EVP_CIPHER_CTX_is_encrypting(ctx)) {
4000                 if (!CRYPTO_ocb128_encrypt(&octx->ocb, octx->data_buf, out,
4001                                            octx->data_buf_len))
4002                     return -1;
4003             } else {
4004                 if (!CRYPTO_ocb128_decrypt(&octx->ocb, octx->data_buf, out,
4005                                            octx->data_buf_len))
4006                     return -1;
4007             }
4008             written_len = octx->data_buf_len;
4009             octx->data_buf_len = 0;
4010         }
4011         if (octx->aad_buf_len > 0) {
4012             if (!CRYPTO_ocb128_aad
4013                 (&octx->ocb, octx->aad_buf, octx->aad_buf_len))
4014                 return -1;
4015             octx->aad_buf_len = 0;
4016         }
4017         /* If decrypting then verify */
4018         if (!EVP_CIPHER_CTX_is_encrypting(ctx)) {
4019             if (octx->taglen < 0)
4020                 return -1;
4021             if (CRYPTO_ocb128_finish(&octx->ocb,
4022                                      octx->tag, octx->taglen) != 0)
4023                 return -1;
4024             octx->iv_set = 0;
4025             return written_len;
4026         }
4027         /* If encrypting then just get the tag */
4028         if (CRYPTO_ocb128_tag(&octx->ocb, octx->tag, 16) != 1)
4029             return -1;
4030         /* Don't reuse the IV */
4031         octx->iv_set = 0;
4032         return written_len;
4033     }
4034 }
4035 
4036 static int aes_ocb_cleanup(EVP_CIPHER_CTX *c)
4037 {
4038     EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,c);
4039     CRYPTO_ocb128_cleanup(&octx->ocb);
4040     return 1;
4041 }
4042 
4043 BLOCK_CIPHER_custom(NID_aes, 128, 16, 12, ocb, OCB,
4044                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
4045 BLOCK_CIPHER_custom(NID_aes, 192, 16, 12, ocb, OCB,
4046                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
4047 BLOCK_CIPHER_custom(NID_aes, 256, 16, 12, ocb, OCB,
4048                     EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
4049 #endif                         /* OPENSSL_NO_OCB */
4050