Expand range of ctrls for AES GCM to support retrieval and setting of
[openssl.git] / crypto / evp / e_aes.c
1 /* ====================================================================
2  * Copyright (c) 2001-2011 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer. 
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    openssl-core@openssl.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  *
49  */
50
51 #define OPENSSL_FIPSAPI
52
53 #include <openssl/opensslconf.h>
54 #ifndef OPENSSL_NO_AES
55 #include <openssl/evp.h>
56 #include <openssl/err.h>
57 #include <string.h>
58 #include <assert.h>
59 #include <openssl/aes.h>
60 #include "evp_locl.h"
61 #include "modes_lcl.h"
62 #include <openssl/rand.h>
63
64 typedef struct
65         {
66         AES_KEY ks;
67         } EVP_AES_KEY;
68
69 typedef struct
70         {
71         AES_KEY ks;             /* AES key schedule to use */
72         int key_set;            /* Set if key initialised */
73         int iv_set;             /* Set if an iv is set */
74         GCM128_CONTEXT gcm;
75         unsigned char *iv;      /* Temporary IV store */
76         int ivlen;              /* IV length */
77         int taglen;
78         int iv_gen;             /* It is OK to generate IVs */
79         int tls_aad_len;        /* TLS AAD length */
80         } EVP_AES_GCM_CTX;
81
82 typedef struct
83         {
84         AES_KEY ks1, ks2;       /* AES key schedules to use */
85         XTS128_CONTEXT xts;
86         } EVP_AES_XTS_CTX;
87
88 typedef struct
89         {
90         AES_KEY ks;             /* AES key schedule to use */
91         int key_set;            /* Set if key initialised */
92         int iv_set;             /* Set if an iv is set */
93         int tag_set;            /* Set if tag is valid */
94         int len_set;            /* Set if message length set */
95         int L, M;               /* L and M parameters from RFC3610 */
96         CCM128_CONTEXT ccm;
97         } EVP_AES_CCM_CTX;
98
99 #define MAXBITCHUNK     ((size_t)1<<(sizeof(size_t)*8-4))
100
101 #if     defined(AES_ASM) && !defined(I386_ONLY) &&      (  \
102         ((defined(__i386)       || defined(__i386__)    || \
103           defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
104         defined(__x86_64)       || defined(__x86_64__)  || \
105         defined(_M_AMD64)       || defined(_M_X64)      || \
106         defined(__INTEL__)                              )
107 /*
108  * AES-NI section
109  */
110 extern unsigned int OPENSSL_ia32cap_P[2];
111 #define AESNI_CAPABLE   (1<<(57-32))
112
113 int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
114                         AES_KEY *key);
115 int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
116                         AES_KEY *key);
117
118 void aesni_encrypt(const unsigned char *in, unsigned char *out,
119                         const AES_KEY *key);
120 void aesni_decrypt(const unsigned char *in, unsigned char *out,
121                         const AES_KEY *key);
122
123 void aesni_ecb_encrypt(const unsigned char *in,
124                         unsigned char *out,
125                         size_t length,
126                         const AES_KEY *key,
127                         int enc);
128 void aesni_cbc_encrypt(const unsigned char *in,
129                         unsigned char *out,
130                         size_t length,
131                         const AES_KEY *key,
132                         unsigned char *ivec, int enc);
133
134 void aesni_ctr32_encrypt_blocks(const unsigned char *in,
135                         unsigned char *out,
136                         size_t blocks,
137                         const void *key,
138                         const unsigned char *ivec);
139
140 void aesni_xts_encrypt(const unsigned char *in,
141                         unsigned char *out,
142                         size_t length,
143                         const AES_KEY *key1, const AES_KEY *key2,
144                         const unsigned char iv[16]);
145
146 void aesni_xts_decrypt(const unsigned char *in,
147                         unsigned char *out,
148                         size_t length,
149                         const AES_KEY *key1, const AES_KEY *key2,
150                         const unsigned char iv[16]);
151
152 void aesni_ccm64_encrypt_blocks (const unsigned char *in,
153                         unsigned char *out,
154                         size_t blocks,
155                         const void *key,
156                         const unsigned char ivec[16],
157                         unsigned char cmac[16]);
158
159 void aesni_ccm64_decrypt_blocks (const unsigned char *in,
160                         unsigned char *out,
161                         size_t blocks,
162                         const void *key,
163                         const unsigned char ivec[16],
164                         unsigned char cmac[16]);
165
166 static int aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
167                    const unsigned char *iv, int enc)
168         {
169         int ret;
170
171         if (((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_ECB_MODE
172             || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CBC_MODE)
173             && !enc) 
174                 ret = aesni_set_decrypt_key(key, ctx->key_len*8, ctx->cipher_data);
175         else
176                 ret = aesni_set_encrypt_key(key, ctx->key_len*8, ctx->cipher_data);
177
178         if(ret < 0)
179                 {
180                 EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
181                 return 0;
182                 }
183
184         return 1;
185         }
186
187 static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
188         const unsigned char *in, size_t len)
189 {
190         aesni_cbc_encrypt(in,out,len,ctx->cipher_data,ctx->iv,ctx->encrypt);
191
192         return 1;
193 }
194
195 static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
196         const unsigned char *in, size_t len)
197 {
198         size_t  bl = ctx->cipher->block_size;
199
200         if (len<bl)     return 1;
201
202         aesni_ecb_encrypt(in,out,len,ctx->cipher_data,ctx->encrypt);
203
204         return 1;
205 }
206
207 static int aesni_ofb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
208         const unsigned char *in,size_t len)
209 {
210         CRYPTO_ofb128_encrypt(in,out,len,ctx->cipher_data,
211                         ctx->iv,&ctx->num,
212                         (block128_f)aesni_encrypt);
213         return 1;
214 }
215
216 static int aesni_cfb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
217         const unsigned char *in,size_t len)
218 {
219         CRYPTO_cfb128_encrypt(in,out,len,ctx->cipher_data,
220                         ctx->iv,&ctx->num,ctx->encrypt,
221                         (block128_f)aesni_encrypt);
222         return 1;
223 }
224
225 static int aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
226         const unsigned char *in,size_t len)
227 {
228         CRYPTO_cfb128_8_encrypt(in,out,len,ctx->cipher_data,
229                         ctx->iv,&ctx->num,ctx->encrypt,
230                         (block128_f)aesni_encrypt);
231         return 1;
232 }
233
234 static int aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
235         const unsigned char *in,size_t len)
236 {
237         if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
238                 CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data,
239                         ctx->iv,&ctx->num,ctx->encrypt,
240                         (block128_f)aesni_encrypt);
241                 return 1;
242         }
243
244         while (len>=MAXBITCHUNK) {
245                 CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data,
246                         ctx->iv,&ctx->num,ctx->encrypt,
247                         (block128_f)aesni_encrypt);
248                 len-=MAXBITCHUNK;
249         }
250         if (len)
251                 CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data,
252                         ctx->iv,&ctx->num,ctx->encrypt,
253                         (block128_f)aesni_encrypt);
254         
255         return 1;
256 }
257
258 static int aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
259                 const unsigned char *in, size_t len)
260 {
261         unsigned int num;
262         num = ctx->num;
263
264         CRYPTO_ctr128_encrypt_ctr32(in,out,len,
265                         ctx->cipher_data,ctx->iv,ctx->buf,&num,
266                         (ctr128_f)aesni_ctr32_encrypt_blocks);
267
268         ctx->num = (size_t)num;
269         return 1;
270 }
271
272 static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
273                         const unsigned char *iv, int enc)
274         {
275         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
276         if (!iv && !key)
277                 return 1;
278         if (key)
279                 {
280                 aesni_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
281                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
282                                 (block128_f)aesni_encrypt);
283                 /* If we have an iv can set it directly, otherwise use
284                  * saved IV.
285                  */
286                 if (iv == NULL && gctx->iv_set)
287                         iv = gctx->iv;
288                 if (iv)
289                         {
290                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
291                         gctx->iv_set = 1;
292                         }
293                 gctx->key_set = 1;
294                 }
295         else
296                 {
297                 /* If key set use IV, otherwise copy */
298                 if (gctx->key_set)
299                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
300                 else
301                         memcpy(gctx->iv, iv, gctx->ivlen);
302                 gctx->iv_set = 1;
303                 gctx->iv_gen = 0;
304                 }
305         return 1;
306         }
307
308 static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
309                 const unsigned char *in, size_t len)
310         {
311         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
312         /* If not set up, return error */
313         if (!gctx->iv_set && !gctx->key_set)
314                 return -1;
315         if (!ctx->encrypt && gctx->taglen < 0)
316                 return -1;
317         if (in)
318                 {
319                 if (out == NULL)
320                         {
321                         if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
322                                 return -1;
323                         }
324                 else if (ctx->encrypt)
325                         {
326                         if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
327                                         in, out, len,
328                                         aesni_ctr32_encrypt_blocks))
329                                 return -1;
330                         }
331                 else
332                         {
333                         if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
334                                         in, out, len,
335                                         aesni_ctr32_encrypt_blocks))
336                                 return -1;
337                         }
338                 return len;
339                 }
340         else
341                 {
342                 if (!ctx->encrypt)
343                         {
344                         if (CRYPTO_gcm128_finish(&gctx->gcm,
345                                         ctx->buf, gctx->taglen) != 0)
346                                 return -1;
347                         gctx->iv_set = 0;
348                         return 0;
349                         }
350                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
351                 gctx->taglen = 16;
352                 /* Don't reuse the IV */
353                 gctx->iv_set = 0;
354                 return 0;
355                 }
356
357         }
358
359 static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
360                         const unsigned char *iv, int enc)
361         {
362         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
363         if (!iv && !key)
364                 return 1;
365
366         if (key)
367                 {
368                 /* key_len is two AES keys */
369                 if (enc)
370                         {
371                         aesni_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
372                         xctx->xts.block1 = (block128_f)aesni_encrypt;
373                         }
374                 else
375                         {
376                         aesni_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
377                         xctx->xts.block1 = (block128_f)aesni_decrypt;
378                         }
379
380                 aesni_set_encrypt_key(key + ctx->key_len/2,
381                                                 ctx->key_len * 4, &xctx->ks2);
382                 xctx->xts.block2 = (block128_f)aesni_encrypt;
383
384                 xctx->xts.key1 = &xctx->ks1;
385                 }
386
387         if (iv)
388                 {
389                 xctx->xts.key2 = &xctx->ks2;
390                 memcpy(ctx->iv, iv, 16);
391                 }
392
393         return 1;
394         }
395
396 static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
397                 const unsigned char *in, size_t len)
398         {
399         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
400         if (!xctx->xts.key1 || !xctx->xts.key2)
401                 return -1;
402         if (!out || !in)
403                 return -1;
404 #ifdef OPENSSL_FIPS
405         /* Requirement of SP800-38E */
406         if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
407                         (len > (1L<<20)*16))
408                 {
409                 EVPerr(EVP_F_AES_XTS, EVP_R_TOO_LARGE);
410                 return -1;
411                 }
412 #endif
413         if (ctx->encrypt)
414                 aesni_xts_encrypt(in, out, len,
415                         xctx->xts.key1, xctx->xts.key2, ctx->iv);
416         else
417                 aesni_xts_decrypt(in, out, len,
418                         xctx->xts.key1, xctx->xts.key2, ctx->iv);
419
420         return len;
421         }
422
423 static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
424                         const unsigned char *iv, int enc)
425         {
426         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
427         if (!iv && !key)
428                 return 1;
429         if (key)
430                 {
431                 aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
432                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
433                                         &cctx->ks, (block128_f)aesni_encrypt);
434                 cctx->key_set = 1;
435                 }
436         if (iv)
437                 {
438                 memcpy(ctx->iv, iv, 15 - cctx->L);
439                 cctx->iv_set = 1;
440                 }
441         return 1;
442         }
443
444 static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
445                 const unsigned char *in, size_t len)
446         {
447         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
448         CCM128_CONTEXT *ccm = &cctx->ccm;
449         /* If not set up, return error */
450         if (!cctx->iv_set && !cctx->key_set)
451                 return -1;
452         if (!ctx->encrypt && !cctx->tag_set)
453                 return -1;
454         if (!out)
455                 {
456                 if (!in)
457                         {
458                         if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
459                                 return -1;
460                         cctx->len_set = 1;
461                         return len;
462                         }
463                 /* If have AAD need message length */
464                 if (!cctx->len_set && len)
465                         return -1;
466                 CRYPTO_ccm128_aad(ccm, in, len);
467                 return len;
468                 }
469         /* EVP_*Final() doesn't return any data */
470         if (!in)
471                 return 0;
472         /* If not set length yet do it */
473         if (!cctx->len_set)
474                 {
475                 if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
476                         return -1;
477                 cctx->len_set = 1;
478                 }
479         if (ctx->encrypt)
480                 {
481                 if (CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
482                                 aesni_ccm64_encrypt_blocks))
483                         return -1;
484                 cctx->tag_set = 1;
485                 return len;
486                 }
487         else
488                 {
489                 int rv = -1;
490                 if (!CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
491                                 aesni_ccm64_decrypt_blocks))
492                         {
493                         unsigned char tag[16];
494                         if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
495                                 {
496                                 if (!memcmp(tag, ctx->buf, cctx->M))
497                                         rv = len;
498                                 }
499                         }
500                 if (rv == -1)
501                         OPENSSL_cleanse(out, len);
502                 cctx->iv_set = 0;
503                 cctx->tag_set = 0;
504                 cctx->len_set = 0;
505                 return rv;
506                 }
507
508         }
509
510 #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
511 static const EVP_CIPHER aesni_##keylen##_##mode = { \
512         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
513         flags|EVP_CIPH_##MODE##_MODE,   \
514         aesni_init_key,                 \
515         aesni_##mode##_cipher,          \
516         NULL,                           \
517         sizeof(EVP_AES_KEY),            \
518         NULL,NULL,NULL,NULL }; \
519 static const EVP_CIPHER aes_##keylen##_##mode = { \
520         nid##_##keylen##_##nmode,blocksize,     \
521         keylen/8,ivlen, \
522         flags|EVP_CIPH_##MODE##_MODE,   \
523         aes_init_key,                   \
524         aes_##mode##_cipher,            \
525         NULL,                           \
526         sizeof(EVP_AES_KEY),            \
527         NULL,NULL,NULL,NULL }; \
528 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
529 { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
530   &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
531
532 #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
533 static const EVP_CIPHER aesni_##keylen##_##mode = { \
534         nid##_##keylen##_##mode,blocksize, \
535         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
536         flags|EVP_CIPH_##MODE##_MODE,   \
537         aesni_##mode##_init_key,        \
538         aesni_##mode##_cipher,          \
539         aes_##mode##_cleanup,           \
540         sizeof(EVP_AES_##MODE##_CTX),   \
541         NULL,NULL,aes_##mode##_ctrl,NULL }; \
542 static const EVP_CIPHER aes_##keylen##_##mode = { \
543         nid##_##keylen##_##mode,blocksize, \
544         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
545         flags|EVP_CIPH_##MODE##_MODE,   \
546         aes_##mode##_init_key,          \
547         aes_##mode##_cipher,            \
548         aes_##mode##_cleanup,           \
549         sizeof(EVP_AES_##MODE##_CTX),   \
550         NULL,NULL,aes_##mode##_ctrl,NULL }; \
551 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
552 { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
553   &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
554
555 #else
556
557 #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
558 static const EVP_CIPHER aes_##keylen##_##mode = { \
559         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
560         flags|EVP_CIPH_##MODE##_MODE,   \
561         aes_init_key,                   \
562         aes_##mode##_cipher,            \
563         NULL,                           \
564         sizeof(EVP_AES_KEY),            \
565         NULL,NULL,NULL,NULL }; \
566 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
567 { return &aes_##keylen##_##mode; }
568
569 #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
570 static const EVP_CIPHER aes_##keylen##_##mode = { \
571         nid##_##keylen##_##mode,blocksize, \
572         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
573         flags|EVP_CIPH_##MODE##_MODE,   \
574         aes_##mode##_init_key,          \
575         aes_##mode##_cipher,            \
576         aes_##mode##_cleanup,           \
577         sizeof(EVP_AES_##MODE##_CTX),   \
578         NULL,NULL,aes_##mode##_ctrl,NULL }; \
579 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
580 { return &aes_##keylen##_##mode; }
581 #endif
582
583 #define BLOCK_CIPHER_generic_pack(nid,keylen,flags)             \
584         BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)     \
585         BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)      \
586         BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
587         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
588         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags)       \
589         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags)       \
590         BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
591
592 static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
593                    const unsigned char *iv, int enc)
594         {
595         int ret;
596
597         if (((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_ECB_MODE
598             || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CBC_MODE)
599             && !enc) 
600                 ret = AES_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
601         else
602                 ret = AES_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
603
604         if(ret < 0)
605                 {
606                 EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
607                 return 0;
608                 }
609
610         return 1;
611         }
612
613 static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
614         const unsigned char *in, size_t len)
615 {
616         AES_cbc_encrypt(in,out,len,ctx->cipher_data,ctx->iv,ctx->encrypt);
617
618         return 1;
619 }
620
621 static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
622         const unsigned char *in, size_t len)
623 {
624         size_t  bl = ctx->cipher->block_size;
625         size_t  i;
626
627         if (len<bl)     return 1;
628
629         if (ctx->encrypt) {
630                 for (i=0,len-=bl;i<=len;i+=bl)
631                         AES_encrypt(in+i,out+i,ctx->cipher_data);
632         } else {
633                 for (i=0,len-=bl;i<=len;i+=bl)
634                         AES_decrypt(in+i,out+i,ctx->cipher_data);
635         }
636
637         return 1;
638 }
639
640 static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
641         const unsigned char *in,size_t len)
642 {
643         CRYPTO_ofb128_encrypt(in,out,len,ctx->cipher_data,
644                         ctx->iv,&ctx->num,
645                         (block128_f)AES_encrypt);
646         return 1;
647 }
648
649 static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
650         const unsigned char *in,size_t len)
651 {
652         CRYPTO_cfb128_encrypt(in,out,len,ctx->cipher_data,
653                         ctx->iv,&ctx->num,ctx->encrypt,
654                         (block128_f)AES_encrypt);
655         return 1;
656 }
657
658 static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
659         const unsigned char *in,size_t len)
660 {
661         CRYPTO_cfb128_8_encrypt(in,out,len,ctx->cipher_data,
662                         ctx->iv,&ctx->num,ctx->encrypt,
663                         (block128_f)AES_encrypt);
664         return 1;
665 }
666
667 static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
668         const unsigned char *in,size_t len)
669 {
670         if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
671                 CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data,
672                         ctx->iv,&ctx->num,ctx->encrypt,
673                         (block128_f)AES_encrypt);
674                 return 1;
675         }
676
677         while (len>=MAXBITCHUNK) {
678                 CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data,
679                         ctx->iv,&ctx->num,ctx->encrypt,
680                         (block128_f)AES_encrypt);
681                 len-=MAXBITCHUNK;
682         }
683         if (len)
684                 CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data,
685                         ctx->iv,&ctx->num,ctx->encrypt,
686                         (block128_f)AES_encrypt);
687         
688         return 1;
689 }
690
691 static int aes_ctr_cipher (EVP_CIPHER_CTX *ctx, unsigned char *out,
692                 const unsigned char *in, size_t len)
693 {
694         unsigned int num;
695         num = ctx->num;
696 #ifdef AES_CTR_ASM
697         void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
698                         size_t blocks, const AES_KEY *key,
699                         const unsigned char ivec[AES_BLOCK_SIZE]);
700
701         CRYPTO_ctr128_encrypt_ctr32(in,out,len,
702                 &((EVP_AES_KEY *)ctx->cipher_data)->ks,
703                 ctx->iv,ctx->buf,&num,(ctr128_f)AES_ctr32_encrypt);
704 #else
705         CRYPTO_ctr128_encrypt(in,out,len,
706                 &((EVP_AES_KEY *)ctx->cipher_data)->ks,
707                 ctx->iv,ctx->buf,&num,(block128_f)AES_encrypt);
708 #endif
709         ctx->num = (size_t)num;
710         return 1;
711 }
712
713 BLOCK_CIPHER_generic_pack(NID_aes,128,EVP_CIPH_FLAG_FIPS)
714 BLOCK_CIPHER_generic_pack(NID_aes,192,EVP_CIPH_FLAG_FIPS)
715 BLOCK_CIPHER_generic_pack(NID_aes,256,EVP_CIPH_FLAG_FIPS)
716
717 static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
718         {
719         EVP_AES_GCM_CTX *gctx = c->cipher_data;
720         OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
721         if (gctx->iv != c->iv)
722                 OPENSSL_free(gctx->iv);
723         return 1;
724         }
725
726 /* increment counter (64-bit int) by 1 */
727 static void ctr64_inc(unsigned char *counter) {
728         int n=8;
729         unsigned char  c;
730
731         do {
732                 --n;
733                 c = counter[n];
734                 ++c;
735                 counter[n] = c;
736                 if (c) return;
737         } while (n);
738 }
739
740 static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
741         {
742         EVP_AES_GCM_CTX *gctx = c->cipher_data;
743         switch (type)
744                 {
745         case EVP_CTRL_INIT:
746                 gctx->key_set = 0;
747                 gctx->iv_set = 0;
748                 gctx->ivlen = c->cipher->iv_len;
749                 gctx->iv = c->iv;
750                 gctx->taglen = -1;
751                 gctx->iv_gen = 0;
752                 gctx->tls_aad_len = -1;
753                 return 1;
754
755         case EVP_CTRL_GCM_SET_IVLEN:
756                 if (arg <= 0)
757                         return 0;
758 #ifdef OPENSSL_FIPS
759                 if (FIPS_module_mode() && !(c->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW)
760                                                  && arg < 12)
761                         return 0;
762 #endif
763                 /* Allocate memory for IV if needed */
764                 if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen))
765                         {
766                         if (gctx->iv != c->iv)
767                                 OPENSSL_free(gctx->iv);
768                         gctx->iv = OPENSSL_malloc(arg);
769                         if (!gctx->iv)
770                                 return 0;
771                         }
772                 gctx->ivlen = arg;
773                 return 1;
774
775         case EVP_CTRL_GCM_SET_TAG:
776                 if (arg <= 0 || arg > 16 || c->encrypt)
777                         return 0;
778                 memcpy(c->buf, ptr, arg);
779                 gctx->taglen = arg;
780                 return 1;
781
782         case EVP_CTRL_GCM_GET_TAG:
783                 if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
784                         return 0;
785                 memcpy(ptr, c->buf, arg);
786                 return 1;
787
788         case EVP_CTRL_GCM_SET_IV_FIXED:
789                 /* Special case: -1 length restores whole IV */
790                 if (arg == -1)
791                         {
792                         memcpy(gctx->iv, ptr, gctx->ivlen);
793                         gctx->iv_gen = 1;
794                         return 1;
795                         }
796                 /* Fixed field must be at least 4 bytes and invocation field
797                  * at least 8.
798                  */
799                 if ((arg < 4) || (gctx->ivlen - arg) < 8)
800                         return 0;
801                 if (arg)
802                         memcpy(gctx->iv, ptr, arg);
803                 if (c->encrypt &&
804                         RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
805                         return 0;
806                 gctx->iv_gen = 1;
807                 return 1;
808
809         case EVP_CTRL_GCM_IV_GEN:
810                 if (gctx->iv_gen == 0 || gctx->key_set == 0)
811                         return 0;
812                 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
813                 if (arg <= 0 || arg > gctx->ivlen)
814                         arg = gctx->ivlen;
815                 memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
816                 /* Invocation field will be at least 8 bytes in size and
817                  * so no need to check wrap around or increment more than
818                  * last 8 bytes.
819                  */
820                 ctr64_inc(gctx->iv + gctx->ivlen - 8);
821                 gctx->iv_set = 1;
822                 return 1;
823
824         case EVP_CTRL_GCM_SET_IV_INV:
825                 if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
826                         return 0;
827                 memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
828                 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
829                 gctx->iv_set = 1;
830                 return 1;
831
832         case EVP_CTRL_AEAD_TLS1_AAD:
833                 /* Save the AAD for later use */
834                 if (arg != 13)
835                         return 0;
836                 memcpy(c->buf, ptr, arg);
837                 gctx->tls_aad_len = arg;
838                         {
839                         unsigned int len=c->buf[arg-2]<<8|c->buf[arg-1];
840                         /* Correct length for explicit IV */
841                         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
842                         /* If decrypting correct for tag too */
843                         if (!c->encrypt)
844                                 len -= EVP_GCM_TLS_TAG_LEN;
845                         c->buf[arg-2] = len>>8;
846                         c->buf[arg-1] = len & 0xff;
847                         }
848                 /* Extra padding: tag appended to record */
849                 return EVP_GCM_TLS_TAG_LEN;
850
851         default:
852                 return -1;
853
854                 }
855         }
856
857 static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
858                         const unsigned char *iv, int enc)
859         {
860         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
861         if (!iv && !key)
862                 return 1;
863         if (key)
864                 {
865                 AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
866                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f)AES_encrypt);
867                 /* If we have an iv can set it directly, otherwise use
868                  * saved IV.
869                  */
870                 if (iv == NULL && gctx->iv_set)
871                         iv = gctx->iv;
872                 if (iv)
873                         {
874                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
875                         gctx->iv_set = 1;
876                         }
877                 gctx->key_set = 1;
878                 }
879         else
880                 {
881                 /* If key set use IV, otherwise copy */
882                 if (gctx->key_set)
883                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
884                 else
885                         memcpy(gctx->iv, iv, gctx->ivlen);
886                 gctx->iv_set = 1;
887                 gctx->iv_gen = 0;
888                 }
889         return 1;
890         }
891
892 /* Handle TLS GCM packet format. This consists of the last portion of the IV
893  * followed by the payload and finally the tag. On encrypt generate IV,
894  * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
895  * and verify tag.
896  */
897
898 static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
899                 const unsigned char *in, size_t len)
900         {
901         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
902         int rv = -1;
903         /* Encrypt/decrypt must be performed in place */
904         if (out != in)
905                 return -1;
906         /* Set IV from start of buffer or generate IV and write to start
907          * of buffer.
908          */
909         if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
910                                 EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
911                                 EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
912                 goto err;
913         /* Use saved AAD */
914         if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
915                 goto err;
916         /* Fix buffer and length to point to payload */
917         in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
918         out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
919         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
920         if (ctx->encrypt)
921                 {
922                 /* Encrypt payload */
923                 if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
924                         goto err;
925                 out += len;
926                 /* Finally write tag */
927                 CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
928                 rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
929                 }
930         else
931                 {
932                 /* Decrypt */
933                 if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
934                         goto err;
935                 /* Retrieve tag */
936                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf,
937                                         EVP_GCM_TLS_TAG_LEN);
938                 /* If tag mismatch wipe buffer */
939                 if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN))
940                         {
941                         OPENSSL_cleanse(out, len);
942                         goto err;
943                         }
944                 rv = len;
945                 }
946
947         err:
948         gctx->iv_set = 0;
949         gctx->tls_aad_len = -1;
950         return rv;
951         }
952
953 static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
954                 const unsigned char *in, size_t len)
955         {
956         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
957         /* If not set up, return error */
958         if (!gctx->key_set)
959                 return -1;
960
961         if (gctx->tls_aad_len >= 0)
962                 return aes_gcm_tls_cipher(ctx, out, in, len);
963
964         if (!gctx->iv_set)
965                 return -1;
966         if (!ctx->encrypt && gctx->taglen < 0)
967                 return -1;
968         if (in)
969                 {
970                 if (out == NULL)
971                         {
972                         if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
973                                 return -1;
974                         }
975                 else if (ctx->encrypt)
976                         {
977                         if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
978                                 return -1;
979                         }
980                 else
981                         {
982                         if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
983                                 return -1;
984                         }
985                 return len;
986                 }
987         else
988                 {
989                 if (!ctx->encrypt)
990                         {
991                         if (CRYPTO_gcm128_finish(&gctx->gcm,
992                                         ctx->buf, gctx->taglen) != 0)
993                                 return -1;
994                         gctx->iv_set = 0;
995                         return 0;
996                         }
997                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
998                 gctx->taglen = 16;
999                 /* Don't reuse the IV */
1000                 gctx->iv_set = 0;
1001                 return 0;
1002                 }
1003
1004         }
1005
1006 #define CUSTOM_FLAGS    (EVP_CIPH_FLAG_DEFAULT_ASN1 \
1007                 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
1008                 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT)
1009
1010 BLOCK_CIPHER_custom(NID_aes,128,1,12,gcm,GCM,
1011                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1012 BLOCK_CIPHER_custom(NID_aes,192,1,12,gcm,GCM,
1013                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1014 BLOCK_CIPHER_custom(NID_aes,256,1,12,gcm,GCM,
1015                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1016
1017 static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1018         {
1019         EVP_AES_XTS_CTX *xctx = c->cipher_data;
1020         if (type != EVP_CTRL_INIT)
1021                 return -1;
1022         /* key1 and key2 are used as an indicator both key and IV are set */
1023         xctx->xts.key1 = NULL;
1024         xctx->xts.key2 = NULL;
1025         return 1;
1026         }
1027
1028 static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1029                         const unsigned char *iv, int enc)
1030         {
1031         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1032         if (!iv && !key)
1033                 return 1;
1034
1035         if (key)
1036                 {
1037                 /* key_len is two AES keys */
1038                 if (enc)
1039                         {
1040                         AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
1041                         xctx->xts.block1 = (block128_f)AES_encrypt;
1042                         }
1043                 else
1044                         {
1045                         AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
1046                         xctx->xts.block1 = (block128_f)AES_decrypt;
1047                         }
1048
1049                 AES_set_encrypt_key(key + ctx->key_len/2,
1050                                                 ctx->key_len * 4, &xctx->ks2);
1051                 xctx->xts.block2 = (block128_f)AES_encrypt;
1052
1053                 xctx->xts.key1 = &xctx->ks1;
1054                 }
1055
1056         if (iv)
1057                 {
1058                 xctx->xts.key2 = &xctx->ks2;
1059                 memcpy(ctx->iv, iv, 16);
1060                 }
1061
1062         return 1;
1063         }
1064
1065 static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1066                 const unsigned char *in, size_t len)
1067         {
1068         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1069         if (!xctx->xts.key1 || !xctx->xts.key2)
1070                 return -1;
1071         if (!out || !in)
1072                 return -1;
1073 #ifdef OPENSSL_FIPS
1074         /* Requirement of SP800-38E */
1075         if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
1076                         (len > (1L<<20)*16))
1077                 {
1078                 EVPerr(EVP_F_AES_XTS, EVP_R_TOO_LARGE);
1079                 return -1;
1080                 }
1081 #endif
1082         if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
1083                                                                 ctx->encrypt))
1084                 return -1;
1085         return len;
1086         }
1087
1088 #define aes_xts_cleanup NULL
1089
1090 BLOCK_CIPHER_custom(NID_aes,128,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1091 BLOCK_CIPHER_custom(NID_aes,256,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1092
1093 static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1094         {
1095         EVP_AES_CCM_CTX *cctx = c->cipher_data;
1096         switch (type)
1097                 {
1098         case EVP_CTRL_INIT:
1099                 cctx->key_set = 0;
1100                 cctx->iv_set = 0;
1101                 cctx->L = 8;
1102                 cctx->M = 12;
1103                 cctx->tag_set = 0;
1104                 cctx->len_set = 0;
1105                 return 1;
1106
1107         case EVP_CTRL_CCM_SET_IVLEN:
1108                 arg = 15 - arg;
1109         case EVP_CTRL_CCM_SET_L:
1110                 if (arg < 2 || arg > 8)
1111                         return 0;
1112                 cctx->L = arg;
1113                 return 1;
1114
1115         case EVP_CTRL_CCM_SET_TAG:
1116                 if ((arg & 1) || arg < 4 || arg > 16)
1117                         return 0;
1118                 if ((c->encrypt && ptr) || (!c->encrypt && !ptr))
1119                         return 0;
1120                 if (ptr)
1121                         {
1122                         cctx->tag_set = 1;
1123                         memcpy(c->buf, ptr, arg);
1124                         }
1125                 cctx->M = arg;
1126                 return 1;
1127
1128         case EVP_CTRL_CCM_GET_TAG:
1129                 if (!c->encrypt || !cctx->tag_set)
1130                         return 0;
1131                 if(!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
1132                         return 0;
1133                 cctx->tag_set = 0;
1134                 cctx->iv_set = 0;
1135                 cctx->len_set = 0;
1136                 return 1;
1137
1138         default:
1139                 return -1;
1140
1141                 }
1142         }
1143
1144 static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1145                         const unsigned char *iv, int enc)
1146         {
1147         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1148         if (!iv && !key)
1149                 return 1;
1150         if (key)
1151                 {
1152                 AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
1153                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
1154                                         &cctx->ks, (block128_f)AES_encrypt);
1155                 cctx->key_set = 1;
1156                 }
1157         if (iv)
1158                 {
1159                 memcpy(ctx->iv, iv, 15 - cctx->L);
1160                 cctx->iv_set = 1;
1161                 }
1162         return 1;
1163         }
1164
1165 static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1166                 const unsigned char *in, size_t len)
1167         {
1168         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1169         CCM128_CONTEXT *ccm = &cctx->ccm;
1170         /* If not set up, return error */
1171         if (!cctx->iv_set && !cctx->key_set)
1172                 return -1;
1173         if (!ctx->encrypt && !cctx->tag_set)
1174                 return -1;
1175         if (!out)
1176                 {
1177                 if (!in)
1178                         {
1179                         if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
1180                                 return -1;
1181                         cctx->len_set = 1;
1182                         return len;
1183                         }
1184                 /* If have AAD need message length */
1185                 if (!cctx->len_set && len)
1186                         return -1;
1187                 CRYPTO_ccm128_aad(ccm, in, len);
1188                 return len;
1189                 }
1190         /* EVP_*Final() doesn't return any data */
1191         if (!in)
1192                 return 0;
1193         /* If not set length yet do it */
1194         if (!cctx->len_set)
1195                 {
1196                 if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
1197                         return -1;
1198                 cctx->len_set = 1;
1199                 }
1200         if (ctx->encrypt)
1201                 {
1202                 if (CRYPTO_ccm128_encrypt(ccm, in, out, len))
1203                         return -1;
1204                 cctx->tag_set = 1;
1205                 return len;
1206                 }
1207         else
1208                 {
1209                 int rv = -1;
1210                 if (!CRYPTO_ccm128_decrypt(ccm, in, out, len))
1211                         {
1212                         unsigned char tag[16];
1213                         if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
1214                                 {
1215                                 if (!memcmp(tag, ctx->buf, cctx->M))
1216                                         rv = len;
1217                                 }
1218                         }
1219                 if (rv == -1)
1220                         OPENSSL_cleanse(out, len);
1221                 cctx->iv_set = 0;
1222                 cctx->tag_set = 0;
1223                 cctx->len_set = 0;
1224                 return rv;
1225                 }
1226
1227         }
1228
1229 #define aes_ccm_cleanup NULL
1230
1231 BLOCK_CIPHER_custom(NID_aes,128,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1232 BLOCK_CIPHER_custom(NID_aes,192,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1233 BLOCK_CIPHER_custom(NID_aes,256,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1234
1235 #endif