e_aes.c: fix bug in aesni_gcm_tls_cipher [in HEAD].
[oweals/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 #include <openssl/opensslconf.h>
52 #ifndef OPENSSL_NO_AES
53 #include <openssl/evp.h>
54 #include <openssl/err.h>
55 #include <string.h>
56 #include <assert.h>
57 #include <openssl/aes.h>
58 #include "evp_locl.h"
59 #ifndef OPENSSL_FIPS
60 #include "modes_lcl.h"
61 #include <openssl/rand.h>
62
63 typedef struct
64         {
65         AES_KEY ks;
66         } EVP_AES_KEY;
67
68 typedef struct
69         {
70         AES_KEY ks;             /* AES key schedule to use */
71         int key_set;            /* Set if key initialised */
72         int iv_set;             /* Set if an iv is set */
73         GCM128_CONTEXT gcm;
74         unsigned char *iv;      /* Temporary IV store */
75         int ivlen;              /* IV length */
76         int taglen;
77         int iv_gen;             /* It is OK to generate IVs */
78         int tls_aad_len;        /* TLS AAD length */
79         } EVP_AES_GCM_CTX;
80
81 typedef struct
82         {
83         AES_KEY ks1, ks2;       /* AES key schedules to use */
84         XTS128_CONTEXT xts;
85         } EVP_AES_XTS_CTX;
86
87 typedef struct
88         {
89         AES_KEY ks;             /* AES key schedule to use */
90         int key_set;            /* Set if key initialised */
91         int iv_set;             /* Set if an iv is set */
92         int tag_set;            /* Set if tag is valid */
93         int len_set;            /* Set if message length set */
94         int L, M;               /* L and M parameters from RFC3610 */
95         CCM128_CONTEXT ccm;
96         } EVP_AES_CCM_CTX;
97
98 #define MAXBITCHUNK     ((size_t)1<<(sizeof(size_t)*8-4))
99
100 #if     defined(AES_ASM) && !defined(I386_ONLY) &&      (  \
101         ((defined(__i386)       || defined(__i386__)    || \
102           defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
103         defined(__x86_64)       || defined(__x86_64__)  || \
104         defined(_M_AMD64)       || defined(_M_X64)      || \
105         defined(__INTEL__)                              )
106 /*
107  * AES-NI section
108  */
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_AESNI_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 /* Handle TLS GCM packet format. This consists of the last portion of the IV
309  * followed by the payload and finally the tag. On encrypt generate IV,
310  * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
311  * and verify tag.
312  */
313
314 static int aesni_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
315                 const unsigned char *in, size_t len)
316         {
317         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
318         int rv = -1;
319         /* Encrypt/decrypt must be performed in place */
320         if (out != in)
321                 return -1;
322         /* Set IV from start of buffer or generate IV and write to start
323          * of buffer.
324          */
325         if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
326                                 EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
327                                 EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
328                 goto err;
329         /* Use saved AAD */
330         if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
331                 goto err;
332         /* Fix buffer and length to point to payload */
333         in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
334         out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
335         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
336         if (ctx->encrypt)
337                 {
338                 /* Encrypt payload */
339                 if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm, in, out, len,
340                                                 aesni_ctr32_encrypt_blocks))
341                         goto err;
342                 out += len;
343                 /* Finally write tag */
344                 CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
345                 rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
346                 }
347         else
348                 {
349                 /* Decrypt */
350                 if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm, in, out, len,
351                                                 aesni_ctr32_encrypt_blocks))
352                         goto err;
353                 /* Retrieve tag */
354                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf,
355                                         EVP_GCM_TLS_TAG_LEN);
356                 /* If tag mismatch wipe buffer */
357                 if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN))
358                         {
359                         OPENSSL_cleanse(out, len);
360                         goto err;
361                         }
362                 rv = len;
363                 }
364
365         err:
366         gctx->iv_set = 0;
367         gctx->tls_aad_len = -1;
368         return rv;
369         }
370
371 static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
372                 const unsigned char *in, size_t len)
373         {
374         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
375         /* If not set up, return error */
376         if (!gctx->key_set)
377                 return -1;
378
379         if (gctx->tls_aad_len >= 0)
380                 return aesni_gcm_tls_cipher(ctx, out, in, len);
381
382         if (!gctx->iv_set)
383                 return -1;
384         if (!ctx->encrypt && gctx->taglen < 0)
385                 return -1;
386         if (in)
387                 {
388                 if (out == NULL)
389                         {
390                         if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
391                                 return -1;
392                         }
393                 else if (ctx->encrypt)
394                         {
395                         if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
396                                         in, out, len,
397                                         aesni_ctr32_encrypt_blocks))
398                                 return -1;
399                         }
400                 else
401                         {
402                         if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
403                                         in, out, len,
404                                         aesni_ctr32_encrypt_blocks))
405                                 return -1;
406                         }
407                 return len;
408                 }
409         else
410                 {
411                 if (!ctx->encrypt)
412                         {
413                         if (CRYPTO_gcm128_finish(&gctx->gcm,
414                                         ctx->buf, gctx->taglen) != 0)
415                                 return -1;
416                         gctx->iv_set = 0;
417                         return 0;
418                         }
419                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
420                 gctx->taglen = 16;
421                 /* Don't reuse the IV */
422                 gctx->iv_set = 0;
423                 return 0;
424                 }
425
426         }
427
428 static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
429                         const unsigned char *iv, int enc)
430         {
431         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
432         if (!iv && !key)
433                 return 1;
434
435         if (key)
436                 {
437                 /* key_len is two AES keys */
438                 if (enc)
439                         {
440                         aesni_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
441                         xctx->xts.block1 = (block128_f)aesni_encrypt;
442                         }
443                 else
444                         {
445                         aesni_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
446                         xctx->xts.block1 = (block128_f)aesni_decrypt;
447                         }
448
449                 aesni_set_encrypt_key(key + ctx->key_len/2,
450                                                 ctx->key_len * 4, &xctx->ks2);
451                 xctx->xts.block2 = (block128_f)aesni_encrypt;
452
453                 xctx->xts.key1 = &xctx->ks1;
454                 }
455
456         if (iv)
457                 {
458                 xctx->xts.key2 = &xctx->ks2;
459                 memcpy(ctx->iv, iv, 16);
460                 }
461
462         return 1;
463         }
464
465 static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
466                 const unsigned char *in, size_t len)
467         {
468         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
469         if (!xctx->xts.key1 || !xctx->xts.key2)
470                 return -1;
471         if (!out || !in)
472                 return -1;
473 #ifdef OPENSSL_FIPS
474         /* Requirement of SP800-38E */
475         if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
476                         (len > (1L<<20)*16))
477                 {
478                 EVPerr(EVP_F_AESNI_XTS_CIPHER, EVP_R_TOO_LARGE);
479                 return -1;
480                 }
481 #endif
482         if (ctx->encrypt)
483                 aesni_xts_encrypt(in, out, len,
484                         xctx->xts.key1, xctx->xts.key2, ctx->iv);
485         else
486                 aesni_xts_decrypt(in, out, len,
487                         xctx->xts.key1, xctx->xts.key2, ctx->iv);
488
489         return len;
490         }
491
492 static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
493                         const unsigned char *iv, int enc)
494         {
495         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
496         if (!iv && !key)
497                 return 1;
498         if (key)
499                 {
500                 aesni_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
501                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
502                                         &cctx->ks, (block128_f)aesni_encrypt);
503                 cctx->key_set = 1;
504                 }
505         if (iv)
506                 {
507                 memcpy(ctx->iv, iv, 15 - cctx->L);
508                 cctx->iv_set = 1;
509                 }
510         return 1;
511         }
512
513 static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
514                 const unsigned char *in, size_t len)
515         {
516         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
517         CCM128_CONTEXT *ccm = &cctx->ccm;
518         /* If not set up, return error */
519         if (!cctx->iv_set && !cctx->key_set)
520                 return -1;
521         if (!ctx->encrypt && !cctx->tag_set)
522                 return -1;
523         if (!out)
524                 {
525                 if (!in)
526                         {
527                         if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
528                                 return -1;
529                         cctx->len_set = 1;
530                         return len;
531                         }
532                 /* If have AAD need message length */
533                 if (!cctx->len_set && len)
534                         return -1;
535                 CRYPTO_ccm128_aad(ccm, in, len);
536                 return len;
537                 }
538         /* EVP_*Final() doesn't return any data */
539         if (!in)
540                 return 0;
541         /* If not set length yet do it */
542         if (!cctx->len_set)
543                 {
544                 if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
545                         return -1;
546                 cctx->len_set = 1;
547                 }
548         if (ctx->encrypt)
549                 {
550                 if (CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
551                                 aesni_ccm64_encrypt_blocks))
552                         return -1;
553                 cctx->tag_set = 1;
554                 return len;
555                 }
556         else
557                 {
558                 int rv = -1;
559                 if (!CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
560                                 aesni_ccm64_decrypt_blocks))
561                         {
562                         unsigned char tag[16];
563                         if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
564                                 {
565                                 if (!memcmp(tag, ctx->buf, cctx->M))
566                                         rv = len;
567                                 }
568                         }
569                 if (rv == -1)
570                         OPENSSL_cleanse(out, len);
571                 cctx->iv_set = 0;
572                 cctx->tag_set = 0;
573                 cctx->len_set = 0;
574                 return rv;
575                 }
576
577         }
578
579 #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
580 static const EVP_CIPHER aesni_##keylen##_##mode = { \
581         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
582         flags|EVP_CIPH_##MODE##_MODE,   \
583         aesni_init_key,                 \
584         aesni_##mode##_cipher,          \
585         NULL,                           \
586         sizeof(EVP_AES_KEY),            \
587         NULL,NULL,NULL,NULL }; \
588 static const EVP_CIPHER aes_##keylen##_##mode = { \
589         nid##_##keylen##_##nmode,blocksize,     \
590         keylen/8,ivlen, \
591         flags|EVP_CIPH_##MODE##_MODE,   \
592         aes_init_key,                   \
593         aes_##mode##_cipher,            \
594         NULL,                           \
595         sizeof(EVP_AES_KEY),            \
596         NULL,NULL,NULL,NULL }; \
597 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
598 { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
599   &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
600
601 #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
602 static const EVP_CIPHER aesni_##keylen##_##mode = { \
603         nid##_##keylen##_##mode,blocksize, \
604         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
605         flags|EVP_CIPH_##MODE##_MODE,   \
606         aesni_##mode##_init_key,        \
607         aesni_##mode##_cipher,          \
608         aes_##mode##_cleanup,           \
609         sizeof(EVP_AES_##MODE##_CTX),   \
610         NULL,NULL,aes_##mode##_ctrl,NULL }; \
611 static const EVP_CIPHER aes_##keylen##_##mode = { \
612         nid##_##keylen##_##mode,blocksize, \
613         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
614         flags|EVP_CIPH_##MODE##_MODE,   \
615         aes_##mode##_init_key,          \
616         aes_##mode##_cipher,            \
617         aes_##mode##_cleanup,           \
618         sizeof(EVP_AES_##MODE##_CTX),   \
619         NULL,NULL,aes_##mode##_ctrl,NULL }; \
620 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
621 { return (OPENSSL_ia32cap_P[1]&AESNI_CAPABLE)? \
622   &aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
623
624 #else
625
626 #define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
627 static const EVP_CIPHER aes_##keylen##_##mode = { \
628         nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
629         flags|EVP_CIPH_##MODE##_MODE,   \
630         aes_init_key,                   \
631         aes_##mode##_cipher,            \
632         NULL,                           \
633         sizeof(EVP_AES_KEY),            \
634         NULL,NULL,NULL,NULL }; \
635 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
636 { return &aes_##keylen##_##mode; }
637
638 #define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
639 static const EVP_CIPHER aes_##keylen##_##mode = { \
640         nid##_##keylen##_##mode,blocksize, \
641         (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
642         flags|EVP_CIPH_##MODE##_MODE,   \
643         aes_##mode##_init_key,          \
644         aes_##mode##_cipher,            \
645         aes_##mode##_cleanup,           \
646         sizeof(EVP_AES_##MODE##_CTX),   \
647         NULL,NULL,aes_##mode##_ctrl,NULL }; \
648 const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
649 { return &aes_##keylen##_##mode; }
650 #endif
651
652 #define BLOCK_CIPHER_generic_pack(nid,keylen,flags)             \
653         BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)     \
654         BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)      \
655         BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
656         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1)   \
657         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags)       \
658         BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags)       \
659         BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
660
661 static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
662                    const unsigned char *iv, int enc)
663         {
664         int ret;
665
666         if (((ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_ECB_MODE
667             || (ctx->cipher->flags & EVP_CIPH_MODE) == EVP_CIPH_CBC_MODE)
668             && !enc) 
669                 ret = AES_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
670         else
671                 ret = AES_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data);
672
673         if(ret < 0)
674                 {
675                 EVPerr(EVP_F_AES_INIT_KEY,EVP_R_AES_KEY_SETUP_FAILED);
676                 return 0;
677                 }
678
679         return 1;
680         }
681
682 static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
683         const unsigned char *in, size_t len)
684 {
685         AES_cbc_encrypt(in,out,len,ctx->cipher_data,ctx->iv,ctx->encrypt);
686
687         return 1;
688 }
689
690 static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
691         const unsigned char *in, size_t len)
692 {
693         size_t  bl = ctx->cipher->block_size;
694         size_t  i;
695
696         if (len<bl)     return 1;
697
698         if (ctx->encrypt) {
699                 for (i=0,len-=bl;i<=len;i+=bl)
700                         AES_encrypt(in+i,out+i,ctx->cipher_data);
701         } else {
702                 for (i=0,len-=bl;i<=len;i+=bl)
703                         AES_decrypt(in+i,out+i,ctx->cipher_data);
704         }
705
706         return 1;
707 }
708
709 static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
710         const unsigned char *in,size_t len)
711 {
712         CRYPTO_ofb128_encrypt(in,out,len,ctx->cipher_data,
713                         ctx->iv,&ctx->num,
714                         (block128_f)AES_encrypt);
715         return 1;
716 }
717
718 static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
719         const unsigned char *in,size_t len)
720 {
721         CRYPTO_cfb128_encrypt(in,out,len,ctx->cipher_data,
722                         ctx->iv,&ctx->num,ctx->encrypt,
723                         (block128_f)AES_encrypt);
724         return 1;
725 }
726
727 static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
728         const unsigned char *in,size_t len)
729 {
730         CRYPTO_cfb128_8_encrypt(in,out,len,ctx->cipher_data,
731                         ctx->iv,&ctx->num,ctx->encrypt,
732                         (block128_f)AES_encrypt);
733         return 1;
734 }
735
736 static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
737         const unsigned char *in,size_t len)
738 {
739         if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) {
740                 CRYPTO_cfb128_1_encrypt(in,out,len,ctx->cipher_data,
741                         ctx->iv,&ctx->num,ctx->encrypt,
742                         (block128_f)AES_encrypt);
743                 return 1;
744         }
745
746         while (len>=MAXBITCHUNK) {
747                 CRYPTO_cfb128_1_encrypt(in,out,MAXBITCHUNK*8,ctx->cipher_data,
748                         ctx->iv,&ctx->num,ctx->encrypt,
749                         (block128_f)AES_encrypt);
750                 len-=MAXBITCHUNK;
751         }
752         if (len)
753                 CRYPTO_cfb128_1_encrypt(in,out,len*8,ctx->cipher_data,
754                         ctx->iv,&ctx->num,ctx->encrypt,
755                         (block128_f)AES_encrypt);
756         
757         return 1;
758 }
759
760 static int aes_ctr_cipher (EVP_CIPHER_CTX *ctx, unsigned char *out,
761                 const unsigned char *in, size_t len)
762 {
763         unsigned int num;
764         num = ctx->num;
765 #ifdef AES_CTR_ASM
766         void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
767                         size_t blocks, const AES_KEY *key,
768                         const unsigned char ivec[AES_BLOCK_SIZE]);
769
770         CRYPTO_ctr128_encrypt_ctr32(in,out,len,
771                 &((EVP_AES_KEY *)ctx->cipher_data)->ks,
772                 ctx->iv,ctx->buf,&num,(ctr128_f)AES_ctr32_encrypt);
773 #else
774         CRYPTO_ctr128_encrypt(in,out,len,
775                 &((EVP_AES_KEY *)ctx->cipher_data)->ks,
776                 ctx->iv,ctx->buf,&num,(block128_f)AES_encrypt);
777 #endif
778         ctx->num = (size_t)num;
779         return 1;
780 }
781
782 BLOCK_CIPHER_generic_pack(NID_aes,128,EVP_CIPH_FLAG_FIPS)
783 BLOCK_CIPHER_generic_pack(NID_aes,192,EVP_CIPH_FLAG_FIPS)
784 BLOCK_CIPHER_generic_pack(NID_aes,256,EVP_CIPH_FLAG_FIPS)
785
786 static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
787         {
788         EVP_AES_GCM_CTX *gctx = c->cipher_data;
789         OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
790         if (gctx->iv != c->iv)
791                 OPENSSL_free(gctx->iv);
792         return 1;
793         }
794
795 /* increment counter (64-bit int) by 1 */
796 static void ctr64_inc(unsigned char *counter) {
797         int n=8;
798         unsigned char  c;
799
800         do {
801                 --n;
802                 c = counter[n];
803                 ++c;
804                 counter[n] = c;
805                 if (c) return;
806         } while (n);
807 }
808
809 static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
810         {
811         EVP_AES_GCM_CTX *gctx = c->cipher_data;
812         switch (type)
813                 {
814         case EVP_CTRL_INIT:
815                 gctx->key_set = 0;
816                 gctx->iv_set = 0;
817                 gctx->ivlen = c->cipher->iv_len;
818                 gctx->iv = c->iv;
819                 gctx->taglen = -1;
820                 gctx->iv_gen = 0;
821                 gctx->tls_aad_len = -1;
822                 return 1;
823
824         case EVP_CTRL_GCM_SET_IVLEN:
825                 if (arg <= 0)
826                         return 0;
827 #ifdef OPENSSL_FIPS
828                 if (FIPS_module_mode() && !(c->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW)
829                                                  && arg < 12)
830                         return 0;
831 #endif
832                 /* Allocate memory for IV if needed */
833                 if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen))
834                         {
835                         if (gctx->iv != c->iv)
836                                 OPENSSL_free(gctx->iv);
837                         gctx->iv = OPENSSL_malloc(arg);
838                         if (!gctx->iv)
839                                 return 0;
840                         }
841                 gctx->ivlen = arg;
842                 return 1;
843
844         case EVP_CTRL_GCM_SET_TAG:
845                 if (arg <= 0 || arg > 16 || c->encrypt)
846                         return 0;
847                 memcpy(c->buf, ptr, arg);
848                 gctx->taglen = arg;
849                 return 1;
850
851         case EVP_CTRL_GCM_GET_TAG:
852                 if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0)
853                         return 0;
854                 memcpy(ptr, c->buf, arg);
855                 return 1;
856
857         case EVP_CTRL_GCM_SET_IV_FIXED:
858                 /* Special case: -1 length restores whole IV */
859                 if (arg == -1)
860                         {
861                         memcpy(gctx->iv, ptr, gctx->ivlen);
862                         gctx->iv_gen = 1;
863                         return 1;
864                         }
865                 /* Fixed field must be at least 4 bytes and invocation field
866                  * at least 8.
867                  */
868                 if ((arg < 4) || (gctx->ivlen - arg) < 8)
869                         return 0;
870                 if (arg)
871                         memcpy(gctx->iv, ptr, arg);
872                 if (c->encrypt &&
873                         RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
874                         return 0;
875                 gctx->iv_gen = 1;
876                 return 1;
877
878         case EVP_CTRL_GCM_IV_GEN:
879                 if (gctx->iv_gen == 0 || gctx->key_set == 0)
880                         return 0;
881                 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
882                 if (arg <= 0 || arg > gctx->ivlen)
883                         arg = gctx->ivlen;
884                 memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
885                 /* Invocation field will be at least 8 bytes in size and
886                  * so no need to check wrap around or increment more than
887                  * last 8 bytes.
888                  */
889                 ctr64_inc(gctx->iv + gctx->ivlen - 8);
890                 gctx->iv_set = 1;
891                 return 1;
892
893         case EVP_CTRL_GCM_SET_IV_INV:
894                 if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt)
895                         return 0;
896                 memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
897                 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
898                 gctx->iv_set = 1;
899                 return 1;
900
901         case EVP_CTRL_AEAD_TLS1_AAD:
902                 /* Save the AAD for later use */
903                 if (arg != 13)
904                         return 0;
905                 memcpy(c->buf, ptr, arg);
906                 gctx->tls_aad_len = arg;
907                         {
908                         unsigned int len=c->buf[arg-2]<<8|c->buf[arg-1];
909                         /* Correct length for explicit IV */
910                         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
911                         /* If decrypting correct for tag too */
912                         if (!c->encrypt)
913                                 len -= EVP_GCM_TLS_TAG_LEN;
914                         c->buf[arg-2] = len>>8;
915                         c->buf[arg-1] = len & 0xff;
916                         }
917                 /* Extra padding: tag appended to record */
918                 return EVP_GCM_TLS_TAG_LEN;
919
920         default:
921                 return -1;
922
923                 }
924         }
925
926 static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
927                         const unsigned char *iv, int enc)
928         {
929         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
930         if (!iv && !key)
931                 return 1;
932         if (key)
933                 {
934                 AES_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks);
935                 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f)AES_encrypt);
936                 /* If we have an iv can set it directly, otherwise use
937                  * saved IV.
938                  */
939                 if (iv == NULL && gctx->iv_set)
940                         iv = gctx->iv;
941                 if (iv)
942                         {
943                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
944                         gctx->iv_set = 1;
945                         }
946                 gctx->key_set = 1;
947                 }
948         else
949                 {
950                 /* If key set use IV, otherwise copy */
951                 if (gctx->key_set)
952                         CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
953                 else
954                         memcpy(gctx->iv, iv, gctx->ivlen);
955                 gctx->iv_set = 1;
956                 gctx->iv_gen = 0;
957                 }
958         return 1;
959         }
960
961 /* Handle TLS GCM packet format. This consists of the last portion of the IV
962  * followed by the payload and finally the tag. On encrypt generate IV,
963  * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
964  * and verify tag.
965  */
966
967 static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
968                 const unsigned char *in, size_t len)
969         {
970         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
971         int rv = -1;
972         /* Encrypt/decrypt must be performed in place */
973         if (out != in)
974                 return -1;
975         /* Set IV from start of buffer or generate IV and write to start
976          * of buffer.
977          */
978         if (EVP_CIPHER_CTX_ctrl(ctx, ctx->encrypt ?
979                                 EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
980                                 EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
981                 goto err;
982         /* Use saved AAD */
983         if (CRYPTO_gcm128_aad(&gctx->gcm, ctx->buf, gctx->tls_aad_len))
984                 goto err;
985         /* Fix buffer and length to point to payload */
986         in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
987         out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
988         len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
989         if (ctx->encrypt)
990                 {
991                 /* Encrypt payload */
992                 if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
993                         goto err;
994                 out += len;
995                 /* Finally write tag */
996                 CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
997                 rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
998                 }
999         else
1000                 {
1001                 /* Decrypt */
1002                 if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
1003                         goto err;
1004                 /* Retrieve tag */
1005                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf,
1006                                         EVP_GCM_TLS_TAG_LEN);
1007                 /* If tag mismatch wipe buffer */
1008                 if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN))
1009                         {
1010                         OPENSSL_cleanse(out, len);
1011                         goto err;
1012                         }
1013                 rv = len;
1014                 }
1015
1016         err:
1017         gctx->iv_set = 0;
1018         gctx->tls_aad_len = -1;
1019         return rv;
1020         }
1021
1022 static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1023                 const unsigned char *in, size_t len)
1024         {
1025         EVP_AES_GCM_CTX *gctx = ctx->cipher_data;
1026         /* If not set up, return error */
1027         if (!gctx->key_set)
1028                 return -1;
1029
1030         if (gctx->tls_aad_len >= 0)
1031                 return aes_gcm_tls_cipher(ctx, out, in, len);
1032
1033         if (!gctx->iv_set)
1034                 return -1;
1035         if (!ctx->encrypt && gctx->taglen < 0)
1036                 return -1;
1037         if (in)
1038                 {
1039                 if (out == NULL)
1040                         {
1041                         if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
1042                                 return -1;
1043                         }
1044                 else if (ctx->encrypt)
1045                         {
1046                         if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, len))
1047                                 return -1;
1048                         }
1049                 else
1050                         {
1051                         if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, len))
1052                                 return -1;
1053                         }
1054                 return len;
1055                 }
1056         else
1057                 {
1058                 if (!ctx->encrypt)
1059                         {
1060                         if (CRYPTO_gcm128_finish(&gctx->gcm,
1061                                         ctx->buf, gctx->taglen) != 0)
1062                                 return -1;
1063                         gctx->iv_set = 0;
1064                         return 0;
1065                         }
1066                 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16);
1067                 gctx->taglen = 16;
1068                 /* Don't reuse the IV */
1069                 gctx->iv_set = 0;
1070                 return 0;
1071                 }
1072
1073         }
1074
1075 #define CUSTOM_FLAGS    (EVP_CIPH_FLAG_DEFAULT_ASN1 \
1076                 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
1077                 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT)
1078
1079 BLOCK_CIPHER_custom(NID_aes,128,1,12,gcm,GCM,
1080                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1081 BLOCK_CIPHER_custom(NID_aes,192,1,12,gcm,GCM,
1082                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1083 BLOCK_CIPHER_custom(NID_aes,256,1,12,gcm,GCM,
1084                 EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_AEAD_CIPHER|CUSTOM_FLAGS)
1085
1086 static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1087         {
1088         EVP_AES_XTS_CTX *xctx = c->cipher_data;
1089         if (type != EVP_CTRL_INIT)
1090                 return -1;
1091         /* key1 and key2 are used as an indicator both key and IV are set */
1092         xctx->xts.key1 = NULL;
1093         xctx->xts.key2 = NULL;
1094         return 1;
1095         }
1096
1097 static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1098                         const unsigned char *iv, int enc)
1099         {
1100         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1101         if (!iv && !key)
1102                 return 1;
1103
1104         if (key)
1105                 {
1106                 /* key_len is two AES keys */
1107                 if (enc)
1108                         {
1109                         AES_set_encrypt_key(key, ctx->key_len * 4, &xctx->ks1);
1110                         xctx->xts.block1 = (block128_f)AES_encrypt;
1111                         }
1112                 else
1113                         {
1114                         AES_set_decrypt_key(key, ctx->key_len * 4, &xctx->ks1);
1115                         xctx->xts.block1 = (block128_f)AES_decrypt;
1116                         }
1117
1118                 AES_set_encrypt_key(key + ctx->key_len/2,
1119                                                 ctx->key_len * 4, &xctx->ks2);
1120                 xctx->xts.block2 = (block128_f)AES_encrypt;
1121
1122                 xctx->xts.key1 = &xctx->ks1;
1123                 }
1124
1125         if (iv)
1126                 {
1127                 xctx->xts.key2 = &xctx->ks2;
1128                 memcpy(ctx->iv, iv, 16);
1129                 }
1130
1131         return 1;
1132         }
1133
1134 static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1135                 const unsigned char *in, size_t len)
1136         {
1137         EVP_AES_XTS_CTX *xctx = ctx->cipher_data;
1138         if (!xctx->xts.key1 || !xctx->xts.key2)
1139                 return -1;
1140         if (!out || !in)
1141                 return -1;
1142 #ifdef OPENSSL_FIPS
1143         /* Requirement of SP800-38E */
1144         if (FIPS_module_mode() && !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW) &&
1145                         (len > (1L<<20)*16))
1146                 {
1147                 EVPerr(EVP_F_AES_XTS_CIPHER, EVP_R_TOO_LARGE);
1148                 return -1;
1149                 }
1150 #endif
1151         if (CRYPTO_xts128_encrypt(&xctx->xts, ctx->iv, in, out, len,
1152                                                                 ctx->encrypt))
1153                 return -1;
1154         return len;
1155         }
1156
1157 #define aes_xts_cleanup NULL
1158
1159 BLOCK_CIPHER_custom(NID_aes,128,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1160 BLOCK_CIPHER_custom(NID_aes,256,1,16,xts,XTS,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1161
1162 static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1163         {
1164         EVP_AES_CCM_CTX *cctx = c->cipher_data;
1165         switch (type)
1166                 {
1167         case EVP_CTRL_INIT:
1168                 cctx->key_set = 0;
1169                 cctx->iv_set = 0;
1170                 cctx->L = 8;
1171                 cctx->M = 12;
1172                 cctx->tag_set = 0;
1173                 cctx->len_set = 0;
1174                 return 1;
1175
1176         case EVP_CTRL_CCM_SET_IVLEN:
1177                 arg = 15 - arg;
1178         case EVP_CTRL_CCM_SET_L:
1179                 if (arg < 2 || arg > 8)
1180                         return 0;
1181                 cctx->L = arg;
1182                 return 1;
1183
1184         case EVP_CTRL_CCM_SET_TAG:
1185                 if ((arg & 1) || arg < 4 || arg > 16)
1186                         return 0;
1187                 if ((c->encrypt && ptr) || (!c->encrypt && !ptr))
1188                         return 0;
1189                 if (ptr)
1190                         {
1191                         cctx->tag_set = 1;
1192                         memcpy(c->buf, ptr, arg);
1193                         }
1194                 cctx->M = arg;
1195                 return 1;
1196
1197         case EVP_CTRL_CCM_GET_TAG:
1198                 if (!c->encrypt || !cctx->tag_set)
1199                         return 0;
1200                 if(!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
1201                         return 0;
1202                 cctx->tag_set = 0;
1203                 cctx->iv_set = 0;
1204                 cctx->len_set = 0;
1205                 return 1;
1206
1207         default:
1208                 return -1;
1209
1210                 }
1211         }
1212
1213 static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
1214                         const unsigned char *iv, int enc)
1215         {
1216         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1217         if (!iv && !key)
1218                 return 1;
1219         if (key)
1220                 {
1221                 AES_set_encrypt_key(key, ctx->key_len * 8, &cctx->ks);
1222                 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
1223                                         &cctx->ks, (block128_f)AES_encrypt);
1224                 cctx->key_set = 1;
1225                 }
1226         if (iv)
1227                 {
1228                 memcpy(ctx->iv, iv, 15 - cctx->L);
1229                 cctx->iv_set = 1;
1230                 }
1231         return 1;
1232         }
1233
1234 static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1235                 const unsigned char *in, size_t len)
1236         {
1237         EVP_AES_CCM_CTX *cctx = ctx->cipher_data;
1238         CCM128_CONTEXT *ccm = &cctx->ccm;
1239         /* If not set up, return error */
1240         if (!cctx->iv_set && !cctx->key_set)
1241                 return -1;
1242         if (!ctx->encrypt && !cctx->tag_set)
1243                 return -1;
1244         if (!out)
1245                 {
1246                 if (!in)
1247                         {
1248                         if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L,len))
1249                                 return -1;
1250                         cctx->len_set = 1;
1251                         return len;
1252                         }
1253                 /* If have AAD need message length */
1254                 if (!cctx->len_set && len)
1255                         return -1;
1256                 CRYPTO_ccm128_aad(ccm, in, len);
1257                 return len;
1258                 }
1259         /* EVP_*Final() doesn't return any data */
1260         if (!in)
1261                 return 0;
1262         /* If not set length yet do it */
1263         if (!cctx->len_set)
1264                 {
1265                 if (CRYPTO_ccm128_setiv(ccm, ctx->iv, 15 - cctx->L, len))
1266                         return -1;
1267                 cctx->len_set = 1;
1268                 }
1269         if (ctx->encrypt)
1270                 {
1271                 if (CRYPTO_ccm128_encrypt(ccm, in, out, len))
1272                         return -1;
1273                 cctx->tag_set = 1;
1274                 return len;
1275                 }
1276         else
1277                 {
1278                 int rv = -1;
1279                 if (!CRYPTO_ccm128_decrypt(ccm, in, out, len))
1280                         {
1281                         unsigned char tag[16];
1282                         if (CRYPTO_ccm128_tag(ccm, tag, cctx->M))
1283                                 {
1284                                 if (!memcmp(tag, ctx->buf, cctx->M))
1285                                         rv = len;
1286                                 }
1287                         }
1288                 if (rv == -1)
1289                         OPENSSL_cleanse(out, len);
1290                 cctx->iv_set = 0;
1291                 cctx->tag_set = 0;
1292                 cctx->len_set = 0;
1293                 return rv;
1294                 }
1295
1296         }
1297
1298 #define aes_ccm_cleanup NULL
1299
1300 BLOCK_CIPHER_custom(NID_aes,128,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1301 BLOCK_CIPHER_custom(NID_aes,192,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1302 BLOCK_CIPHER_custom(NID_aes,256,1,12,ccm,CCM,EVP_CIPH_FLAG_FIPS|CUSTOM_FLAGS)
1303
1304 #endif
1305 #endif