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