]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/e_aes.c
Don't use magic numbers in aes_ocb_cipher()
[thirdparty/openssl.git] / crypto / evp / e_aes.c
CommitLineData
aa6bb135
RS
1/*
2 * Copyright 2001-2016 The OpenSSL Project Authors. All Rights Reserved.
deb2c1a1 3 *
aa6bb135
RS
4 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
deb2c1a1
DSH
8 */
9
8c84b677 10#include <openssl/opensslconf.h>
5158c763
MC
11#include <openssl/crypto.h>
12#include <openssl/evp.h>
13#include <openssl/err.h>
14#include <string.h>
15#include <assert.h>
16#include <openssl/aes.h>
17#include "internal/evp_int.h"
18#include "modes_lcl.h"
19#include <openssl/rand.h>
0f113f3e
MC
20
21typedef struct {
22 union {
23 double align;
24 AES_KEY ks;
25 } ks;
26 block128_f block;
27 union {
28 cbc128_f cbc;
29 ctr128_f ctr;
30 } stream;
31} EVP_AES_KEY;
32
33typedef struct {
34 union {
35 double align;
36 AES_KEY ks;
37 } ks; /* AES key schedule to use */
38 int key_set; /* Set if key initialised */
39 int iv_set; /* Set if an iv is set */
40 GCM128_CONTEXT gcm;
41 unsigned char *iv; /* Temporary IV store */
42 int ivlen; /* IV length */
43 int taglen;
44 int iv_gen; /* It is OK to generate IVs */
45 int tls_aad_len; /* TLS AAD length */
46 ctr128_f ctr;
47} EVP_AES_GCM_CTX;
48
49typedef struct {
50 union {
51 double align;
52 AES_KEY ks;
53 } ks1, ks2; /* AES key schedules to use */
54 XTS128_CONTEXT xts;
55 void (*stream) (const unsigned char *in,
56 unsigned char *out, size_t length,
57 const AES_KEY *key1, const AES_KEY *key2,
58 const unsigned char iv[16]);
59} EVP_AES_XTS_CTX;
60
61typedef struct {
62 union {
63 double align;
64 AES_KEY ks;
65 } ks; /* AES key schedule to use */
66 int key_set; /* Set if key initialised */
67 int iv_set; /* Set if an iv is set */
68 int tag_set; /* Set if tag is valid */
69 int len_set; /* Set if message length set */
70 int L, M; /* L and M parameters from RFC3610 */
e75c5a79 71 int tls_aad_len; /* TLS AAD length */
0f113f3e
MC
72 CCM128_CONTEXT ccm;
73 ccm128_f str;
74} EVP_AES_CCM_CTX;
75
5158c763 76#ifndef OPENSSL_NO_OCB
0f113f3e 77typedef struct {
bdc985b1
AP
78 union {
79 double align;
80 AES_KEY ks;
81 } ksenc; /* AES key schedule to use for encryption */
82 union {
83 double align;
84 AES_KEY ks;
85 } ksdec; /* AES key schedule to use for decryption */
0f113f3e
MC
86 int key_set; /* Set if key initialised */
87 int iv_set; /* Set if an iv is set */
88 OCB128_CONTEXT ocb;
89 unsigned char *iv; /* Temporary IV store */
90 unsigned char tag[16];
91 unsigned char data_buf[16]; /* Store partial data blocks */
92 unsigned char aad_buf[16]; /* Store partial AAD blocks */
93 int data_buf_len;
94 int aad_buf_len;
95 int ivlen; /* IV length */
96 int taglen;
97} EVP_AES_OCB_CTX;
5158c763 98#endif
e6b336ef 99
5158c763 100#define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4))
17f121de 101
5158c763 102#ifdef VPAES_ASM
8ca28da0 103int vpaes_set_encrypt_key(const unsigned char *userKey, int bits,
0f113f3e 104 AES_KEY *key);
8ca28da0 105int vpaes_set_decrypt_key(const unsigned char *userKey, int bits,
0f113f3e 106 AES_KEY *key);
8ca28da0
AP
107
108void vpaes_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e 109 const AES_KEY *key);
8ca28da0 110void vpaes_decrypt(const unsigned char *in, unsigned char *out,
0f113f3e 111 const AES_KEY *key);
8ca28da0
AP
112
113void vpaes_cbc_encrypt(const unsigned char *in,
0f113f3e
MC
114 unsigned char *out,
115 size_t length,
116 const AES_KEY *key, unsigned char *ivec, int enc);
5158c763
MC
117#endif
118#ifdef BSAES_ASM
a75a52a4 119void bsaes_cbc_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e
MC
120 size_t length, const AES_KEY *key,
121 unsigned char ivec[16], int enc);
993adc05 122void bsaes_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
0f113f3e
MC
123 size_t len, const AES_KEY *key,
124 const unsigned char ivec[16]);
60d4e99c 125void bsaes_xts_encrypt(const unsigned char *inp, unsigned char *out,
0f113f3e
MC
126 size_t len, const AES_KEY *key1,
127 const AES_KEY *key2, const unsigned char iv[16]);
60d4e99c 128void bsaes_xts_decrypt(const unsigned char *inp, unsigned char *out,
0f113f3e
MC
129 size_t len, const AES_KEY *key1,
130 const AES_KEY *key2, const unsigned char iv[16]);
5158c763
MC
131#endif
132#ifdef AES_CTR_ASM
07904e0c 133void AES_ctr32_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e
MC
134 size_t blocks, const AES_KEY *key,
135 const unsigned char ivec[AES_BLOCK_SIZE]);
5158c763
MC
136#endif
137#ifdef AES_XTS_ASM
96cce820 138void AES_xts_encrypt(const unsigned char *inp, unsigned char *out, size_t len,
0f113f3e
MC
139 const AES_KEY *key1, const AES_KEY *key2,
140 const unsigned char iv[16]);
96cce820 141void AES_xts_decrypt(const unsigned char *inp, unsigned char *out, size_t len,
0f113f3e
MC
142 const AES_KEY *key1, const AES_KEY *key2,
143 const unsigned char iv[16]);
5158c763 144#endif
8ca28da0 145
6944565b 146#if defined(OPENSSL_CPUID_OBJ) && (defined(__powerpc__) || defined(__ppc__) || defined(_ARCH_PPC))
5158c763
MC
147# include "ppc_arch.h"
148# ifdef VPAES_ASM
149# define VPAES_CAPABLE (OPENSSL_ppccap_P & PPC_ALTIVEC)
de51e830 150# endif
5158c763
MC
151# define HWAES_CAPABLE (OPENSSL_ppccap_P & PPC_CRYPTO207)
152# define HWAES_set_encrypt_key aes_p8_set_encrypt_key
153# define HWAES_set_decrypt_key aes_p8_set_decrypt_key
154# define HWAES_encrypt aes_p8_encrypt
155# define HWAES_decrypt aes_p8_decrypt
156# define HWAES_cbc_encrypt aes_p8_cbc_encrypt
157# define HWAES_ctr32_encrypt_blocks aes_p8_ctr32_encrypt_blocks
46f047d7
AP
158# define HWAES_xts_encrypt aes_p8_xts_encrypt
159# define HWAES_xts_decrypt aes_p8_xts_decrypt
5158c763 160#endif
07f3e4f3 161
5158c763 162#if defined(AES_ASM) && !defined(I386_ONLY) && ( \
0f113f3e
MC
163 ((defined(__i386) || defined(__i386__) || \
164 defined(_M_IX86)) && defined(OPENSSL_IA32_SSE2))|| \
165 defined(__x86_64) || defined(__x86_64__) || \
b1a07c38 166 defined(_M_AMD64) || defined(_M_X64) )
8ca28da0 167
c5f6da54 168extern unsigned int OPENSSL_ia32cap_P[];
8ca28da0 169
5158c763
MC
170# ifdef VPAES_ASM
171# define VPAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
172# endif
173# ifdef BSAES_ASM
174# define BSAES_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(41-32)))
175# endif
17f121de
AP
176/*
177 * AES-NI section
178 */
5158c763 179# define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))
d1fff483
AP
180
181int aesni_set_encrypt_key(const unsigned char *userKey, int bits,
0f113f3e 182 AES_KEY *key);
d1fff483 183int aesni_set_decrypt_key(const unsigned char *userKey, int bits,
0f113f3e 184 AES_KEY *key);
d1fff483
AP
185
186void aesni_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e 187 const AES_KEY *key);
d1fff483 188void aesni_decrypt(const unsigned char *in, unsigned char *out,
0f113f3e 189 const AES_KEY *key);
d1fff483
AP
190
191void aesni_ecb_encrypt(const unsigned char *in,
0f113f3e
MC
192 unsigned char *out,
193 size_t length, const AES_KEY *key, int enc);
d1fff483 194void aesni_cbc_encrypt(const unsigned char *in,
0f113f3e
MC
195 unsigned char *out,
196 size_t length,
197 const AES_KEY *key, unsigned char *ivec, int enc);
d1fff483
AP
198
199void aesni_ctr32_encrypt_blocks(const unsigned char *in,
0f113f3e
MC
200 unsigned char *out,
201 size_t blocks,
202 const void *key, const unsigned char *ivec);
17f121de
AP
203
204void aesni_xts_encrypt(const unsigned char *in,
0f113f3e
MC
205 unsigned char *out,
206 size_t length,
207 const AES_KEY *key1, const AES_KEY *key2,
208 const unsigned char iv[16]);
17f121de
AP
209
210void aesni_xts_decrypt(const unsigned char *in,
0f113f3e
MC
211 unsigned char *out,
212 size_t length,
213 const AES_KEY *key1, const AES_KEY *key2,
214 const unsigned char iv[16]);
215
216void aesni_ccm64_encrypt_blocks(const unsigned char *in,
217 unsigned char *out,
218 size_t blocks,
219 const void *key,
220 const unsigned char ivec[16],
221 unsigned char cmac[16]);
222
223void aesni_ccm64_decrypt_blocks(const unsigned char *in,
224 unsigned char *out,
225 size_t blocks,
226 const void *key,
227 const unsigned char ivec[16],
228 unsigned char cmac[16]);
229
5158c763 230# if defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
4e049c52 231size_t aesni_gcm_encrypt(const unsigned char *in,
0f113f3e
MC
232 unsigned char *out,
233 size_t len,
234 const void *key, unsigned char ivec[16], u64 *Xi);
5158c763 235# define AES_gcm_encrypt aesni_gcm_encrypt
4e049c52 236size_t aesni_gcm_decrypt(const unsigned char *in,
0f113f3e
MC
237 unsigned char *out,
238 size_t len,
239 const void *key, unsigned char ivec[16], u64 *Xi);
5158c763 240# define AES_gcm_decrypt aesni_gcm_decrypt
0f113f3e
MC
241void gcm_ghash_avx(u64 Xi[2], const u128 Htable[16], const u8 *in,
242 size_t len);
5158c763 243# define AES_GCM_ASM(gctx) (gctx->ctr==aesni_ctr32_encrypt_blocks && \
0f113f3e 244 gctx->gcm.ghash==gcm_ghash_avx)
5158c763 245# define AES_GCM_ASM2(gctx) (gctx->gcm.block==(block128_f)aesni_encrypt && \
0f113f3e 246 gctx->gcm.ghash==gcm_ghash_avx)
5158c763
MC
247# undef AES_GCM_ASM2 /* minor size optimization */
248# endif
4e049c52 249
17f121de 250static int aesni_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
251 const unsigned char *iv, int enc)
252{
253 int ret, mode;
6435f0f6 254 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
0f113f3e 255
6435f0f6 256 mode = EVP_CIPHER_CTX_mode(ctx);
0f113f3e
MC
257 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
258 && !enc) {
6435f0f6
RL
259 ret = aesni_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
260 &dat->ks.ks);
0f113f3e
MC
261 dat->block = (block128_f) aesni_decrypt;
262 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
263 (cbc128_f) aesni_cbc_encrypt : NULL;
264 } else {
6435f0f6
RL
265 ret = aesni_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
266 &dat->ks.ks);
0f113f3e
MC
267 dat->block = (block128_f) aesni_encrypt;
268 if (mode == EVP_CIPH_CBC_MODE)
269 dat->stream.cbc = (cbc128_f) aesni_cbc_encrypt;
270 else if (mode == EVP_CIPH_CTR_MODE)
271 dat->stream.ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
272 else
273 dat->stream.cbc = NULL;
274 }
275
276 if (ret < 0) {
277 EVPerr(EVP_F_AESNI_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
278 return 0;
279 }
280
281 return 1;
282}
283
284static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
285 const unsigned char *in, size_t len)
d1fff483 286{
6435f0f6
RL
287 aesni_cbc_encrypt(in, out, len, &EVP_C_DATA(EVP_AES_KEY,ctx)->ks.ks,
288 EVP_CIPHER_CTX_iv_noconst(ctx),
289 EVP_CIPHER_CTX_encrypting(ctx));
d1fff483 290
0f113f3e 291 return 1;
d1fff483
AP
292}
293
0f113f3e
MC
294static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
295 const unsigned char *in, size_t len)
d1fff483 296{
6435f0f6 297 size_t bl = EVP_CIPHER_CTX_block_size(ctx);
d1fff483 298
0f113f3e
MC
299 if (len < bl)
300 return 1;
d1fff483 301
6435f0f6
RL
302 aesni_ecb_encrypt(in, out, len, &EVP_C_DATA(EVP_AES_KEY,ctx)->ks.ks,
303 EVP_CIPHER_CTX_encrypting(ctx));
d1fff483 304
0f113f3e 305 return 1;
d1fff483
AP
306}
307
5158c763 308# define aesni_ofb_cipher aes_ofb_cipher
0f113f3e
MC
309static int aesni_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
310 const unsigned char *in, size_t len);
d1fff483 311
5158c763 312# define aesni_cfb_cipher aes_cfb_cipher
0f113f3e
MC
313static int aesni_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
314 const unsigned char *in, size_t len);
d1fff483 315
5158c763 316# define aesni_cfb8_cipher aes_cfb8_cipher
0f113f3e
MC
317static int aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
318 const unsigned char *in, size_t len);
d1fff483 319
5158c763 320# define aesni_cfb1_cipher aes_cfb1_cipher
0f113f3e
MC
321static int aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
322 const unsigned char *in, size_t len);
d1fff483 323
5158c763 324# define aesni_ctr_cipher aes_ctr_cipher
17f121de 325static int aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 326 const unsigned char *in, size_t len);
d1fff483 327
17f121de 328static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
329 const unsigned char *iv, int enc)
330{
6435f0f6 331 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
0f113f3e
MC
332 if (!iv && !key)
333 return 1;
334 if (key) {
6435f0f6
RL
335 aesni_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
336 &gctx->ks.ks);
0f113f3e
MC
337 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f) aesni_encrypt);
338 gctx->ctr = (ctr128_f) aesni_ctr32_encrypt_blocks;
339 /*
340 * If we have an iv can set it directly, otherwise use saved IV.
341 */
342 if (iv == NULL && gctx->iv_set)
343 iv = gctx->iv;
344 if (iv) {
345 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
346 gctx->iv_set = 1;
347 }
348 gctx->key_set = 1;
349 } else {
350 /* If key set use IV, otherwise copy */
351 if (gctx->key_set)
352 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
353 else
354 memcpy(gctx->iv, iv, gctx->ivlen);
355 gctx->iv_set = 1;
356 gctx->iv_gen = 0;
357 }
358 return 1;
359}
360
5158c763 361# define aesni_gcm_cipher aes_gcm_cipher
17f121de 362static int aesni_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 363 const unsigned char *in, size_t len);
17f121de
AP
364
365static int aesni_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
366 const unsigned char *iv, int enc)
367{
6435f0f6 368 EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
0f113f3e
MC
369 if (!iv && !key)
370 return 1;
371
372 if (key) {
373 /* key_len is two AES keys */
374 if (enc) {
6435f0f6
RL
375 aesni_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 4,
376 &xctx->ks1.ks);
0f113f3e
MC
377 xctx->xts.block1 = (block128_f) aesni_encrypt;
378 xctx->stream = aesni_xts_encrypt;
379 } else {
6435f0f6
RL
380 aesni_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 4,
381 &xctx->ks1.ks);
0f113f3e
MC
382 xctx->xts.block1 = (block128_f) aesni_decrypt;
383 xctx->stream = aesni_xts_decrypt;
384 }
385
6435f0f6
RL
386 aesni_set_encrypt_key(key + EVP_CIPHER_CTX_key_length(ctx) / 2,
387 EVP_CIPHER_CTX_key_length(ctx) * 4,
388 &xctx->ks2.ks);
0f113f3e
MC
389 xctx->xts.block2 = (block128_f) aesni_encrypt;
390
391 xctx->xts.key1 = &xctx->ks1;
392 }
393
394 if (iv) {
395 xctx->xts.key2 = &xctx->ks2;
6435f0f6 396 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 16);
0f113f3e
MC
397 }
398
399 return 1;
400}
401
5158c763 402# define aesni_xts_cipher aes_xts_cipher
17f121de 403static int aesni_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 404 const unsigned char *in, size_t len);
17f121de
AP
405
406static int aesni_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
407 const unsigned char *iv, int enc)
408{
6435f0f6 409 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
0f113f3e
MC
410 if (!iv && !key)
411 return 1;
412 if (key) {
6435f0f6
RL
413 aesni_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
414 &cctx->ks.ks);
0f113f3e
MC
415 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
416 &cctx->ks, (block128_f) aesni_encrypt);
417 cctx->str = enc ? (ccm128_f) aesni_ccm64_encrypt_blocks :
418 (ccm128_f) aesni_ccm64_decrypt_blocks;
419 cctx->key_set = 1;
420 }
421 if (iv) {
6435f0f6 422 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 15 - cctx->L);
0f113f3e
MC
423 cctx->iv_set = 1;
424 }
425 return 1;
426}
427
5158c763 428# define aesni_ccm_cipher aes_ccm_cipher
17f121de 429static int aesni_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 430 const unsigned char *in, size_t len);
17f121de 431
5158c763 432# ifndef OPENSSL_NO_OCB
bd30091c
AP
433void aesni_ocb_encrypt(const unsigned char *in, unsigned char *out,
434 size_t blocks, const void *key,
435 size_t start_block_num,
436 unsigned char offset_i[16],
437 const unsigned char L_[][16],
438 unsigned char checksum[16]);
439void aesni_ocb_decrypt(const unsigned char *in, unsigned char *out,
440 size_t blocks, const void *key,
441 size_t start_block_num,
442 unsigned char offset_i[16],
443 const unsigned char L_[][16],
444 unsigned char checksum[16]);
445
e6b336ef 446static int aesni_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
447 const unsigned char *iv, int enc)
448{
6435f0f6 449 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
0f113f3e
MC
450 if (!iv && !key)
451 return 1;
452 if (key) {
453 do {
454 /*
455 * We set both the encrypt and decrypt key here because decrypt
456 * needs both. We could possibly optimise to remove setting the
457 * decrypt for an encryption operation.
458 */
6435f0f6
RL
459 aesni_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
460 &octx->ksenc.ks);
461 aesni_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
462 &octx->ksdec.ks);
bdc985b1
AP
463 if (!CRYPTO_ocb128_init(&octx->ocb,
464 &octx->ksenc.ks, &octx->ksdec.ks,
0f113f3e 465 (block128_f) aesni_encrypt,
bd30091c
AP
466 (block128_f) aesni_decrypt,
467 enc ? aesni_ocb_encrypt
468 : aesni_ocb_decrypt))
0f113f3e
MC
469 return 0;
470 }
471 while (0);
472
473 /*
474 * If we have an iv we can set it directly, otherwise use saved IV.
475 */
476 if (iv == NULL && octx->iv_set)
477 iv = octx->iv;
478 if (iv) {
479 if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
480 != 1)
481 return 0;
482 octx->iv_set = 1;
483 }
484 octx->key_set = 1;
485 } else {
486 /* If key set use IV, otherwise copy */
487 if (octx->key_set)
488 CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
489 else
490 memcpy(octx->iv, iv, octx->ivlen);
491 octx->iv_set = 1;
492 }
493 return 1;
494}
495
5158c763 496# define aesni_ocb_cipher aes_ocb_cipher
e6b336ef 497static int aesni_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 498 const unsigned char *in, size_t len);
5158c763 499# endif /* OPENSSL_NO_OCB */
e6b336ef 500
5158c763 501# define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
17f121de 502static const EVP_CIPHER aesni_##keylen##_##mode = { \
0f113f3e
MC
503 nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
504 flags|EVP_CIPH_##MODE##_MODE, \
505 aesni_init_key, \
506 aesni_##mode##_cipher, \
507 NULL, \
508 sizeof(EVP_AES_KEY), \
509 NULL,NULL,NULL,NULL }; \
17f121de 510static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
511 nid##_##keylen##_##nmode,blocksize, \
512 keylen/8,ivlen, \
513 flags|EVP_CIPH_##MODE##_MODE, \
514 aes_init_key, \
515 aes_##mode##_cipher, \
516 NULL, \
517 sizeof(EVP_AES_KEY), \
518 NULL,NULL,NULL,NULL }; \
17f121de 519const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
8ca28da0 520{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
17f121de 521
5158c763 522# define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
17f121de 523static const EVP_CIPHER aesni_##keylen##_##mode = { \
0f113f3e
MC
524 nid##_##keylen##_##mode,blocksize, \
525 (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
526 flags|EVP_CIPH_##MODE##_MODE, \
527 aesni_##mode##_init_key, \
528 aesni_##mode##_cipher, \
529 aes_##mode##_cleanup, \
530 sizeof(EVP_AES_##MODE##_CTX), \
531 NULL,NULL,aes_##mode##_ctrl,NULL }; \
17f121de 532static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
533 nid##_##keylen##_##mode,blocksize, \
534 (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
535 flags|EVP_CIPH_##MODE##_MODE, \
536 aes_##mode##_init_key, \
537 aes_##mode##_cipher, \
538 aes_##mode##_cleanup, \
539 sizeof(EVP_AES_##MODE##_CTX), \
540 NULL,NULL,aes_##mode##_ctrl,NULL }; \
17f121de 541const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
8ca28da0 542{ return AESNI_CAPABLE?&aesni_##keylen##_##mode:&aes_##keylen##_##mode; }
d1fff483 543
5158c763 544#elif defined(AES_ASM) && (defined(__sparc) || defined(__sparc__))
c5f6da54 545
5158c763 546# include "sparc_arch.h"
c5f6da54
AP
547
548extern unsigned int OPENSSL_sparcv9cap_P[];
549
6944565b
AP
550/*
551 * Initial Fujitsu SPARC64 X support
552 */
553# define HWAES_CAPABLE (OPENSSL_sparcv9cap_P[0] & SPARCV9_FJAESX)
554# define HWAES_set_encrypt_key aes_fx_set_encrypt_key
555# define HWAES_set_decrypt_key aes_fx_set_decrypt_key
556# define HWAES_encrypt aes_fx_encrypt
557# define HWAES_decrypt aes_fx_decrypt
365f95ad
AP
558# define HWAES_cbc_encrypt aes_fx_cbc_encrypt
559# define HWAES_ctr32_encrypt_blocks aes_fx_ctr32_encrypt_blocks
6944565b 560
5158c763 561# define SPARC_AES_CAPABLE (OPENSSL_sparcv9cap_P[1] & CFR_AES)
c5f6da54 562
0f113f3e
MC
563void aes_t4_set_encrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
564void aes_t4_set_decrypt_key(const unsigned char *key, int bits, AES_KEY *ks);
565void aes_t4_encrypt(const unsigned char *in, unsigned char *out,
566 const AES_KEY *key);
567void aes_t4_decrypt(const unsigned char *in, unsigned char *out,
568 const AES_KEY *key);
c5f6da54
AP
569/*
570 * Key-length specific subroutines were chosen for following reason.
571 * Each SPARC T4 core can execute up to 8 threads which share core's
572 * resources. Loading as much key material to registers allows to
573 * minimize references to shared memory interface, as well as amount
574 * of instructions in inner loops [much needed on T4]. But then having
575 * non-key-length specific routines would require conditional branches
576 * either in inner loops or on subroutines' entries. Former is hardly
577 * acceptable, while latter means code size increase to size occupied
0d4fb843 578 * by multiple key-length specific subroutines, so why fight?
c5f6da54 579 */
0f113f3e
MC
580void aes128_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
581 size_t len, const AES_KEY *key,
582 unsigned char *ivec);
583void aes128_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
584 size_t len, const AES_KEY *key,
585 unsigned char *ivec);
586void aes192_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
587 size_t len, const AES_KEY *key,
588 unsigned char *ivec);
589void aes192_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
590 size_t len, const AES_KEY *key,
591 unsigned char *ivec);
592void aes256_t4_cbc_encrypt(const unsigned char *in, unsigned char *out,
593 size_t len, const AES_KEY *key,
594 unsigned char *ivec);
595void aes256_t4_cbc_decrypt(const unsigned char *in, unsigned char *out,
596 size_t len, const AES_KEY *key,
597 unsigned char *ivec);
598void aes128_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
599 size_t blocks, const AES_KEY *key,
600 unsigned char *ivec);
601void aes192_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
602 size_t blocks, const AES_KEY *key,
603 unsigned char *ivec);
604void aes256_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out,
605 size_t blocks, const AES_KEY *key,
606 unsigned char *ivec);
607void aes128_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
608 size_t blocks, const AES_KEY *key1,
609 const AES_KEY *key2, const unsigned char *ivec);
610void aes128_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
611 size_t blocks, const AES_KEY *key1,
612 const AES_KEY *key2, const unsigned char *ivec);
613void aes256_t4_xts_encrypt(const unsigned char *in, unsigned char *out,
614 size_t blocks, const AES_KEY *key1,
615 const AES_KEY *key2, const unsigned char *ivec);
616void aes256_t4_xts_decrypt(const unsigned char *in, unsigned char *out,
617 size_t blocks, const AES_KEY *key1,
618 const AES_KEY *key2, const unsigned char *ivec);
c5f6da54
AP
619
620static int aes_t4_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
621 const unsigned char *iv, int enc)
622{
623 int ret, mode, bits;
6435f0f6 624 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
0f113f3e 625
6435f0f6
RL
626 mode = EVP_CIPHER_CTX_mode(ctx);
627 bits = EVP_CIPHER_CTX_key_length(ctx) * 8;
0f113f3e
MC
628 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
629 && !enc) {
630 ret = 0;
6435f0f6 631 aes_t4_set_decrypt_key(key, bits, &dat->ks.ks);
0f113f3e
MC
632 dat->block = (block128_f) aes_t4_decrypt;
633 switch (bits) {
634 case 128:
635 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
636 (cbc128_f) aes128_t4_cbc_decrypt : NULL;
637 break;
638 case 192:
639 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
640 (cbc128_f) aes192_t4_cbc_decrypt : NULL;
641 break;
642 case 256:
643 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
644 (cbc128_f) aes256_t4_cbc_decrypt : NULL;
645 break;
646 default:
647 ret = -1;
648 }
649 } else {
650 ret = 0;
6435f0f6 651 aes_t4_set_encrypt_key(key, bits, &dat->ks.ks);
0f113f3e
MC
652 dat->block = (block128_f) aes_t4_encrypt;
653 switch (bits) {
654 case 128:
655 if (mode == EVP_CIPH_CBC_MODE)
656 dat->stream.cbc = (cbc128_f) aes128_t4_cbc_encrypt;
657 else if (mode == EVP_CIPH_CTR_MODE)
658 dat->stream.ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
659 else
660 dat->stream.cbc = NULL;
661 break;
662 case 192:
663 if (mode == EVP_CIPH_CBC_MODE)
664 dat->stream.cbc = (cbc128_f) aes192_t4_cbc_encrypt;
665 else if (mode == EVP_CIPH_CTR_MODE)
666 dat->stream.ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
667 else
668 dat->stream.cbc = NULL;
669 break;
670 case 256:
671 if (mode == EVP_CIPH_CBC_MODE)
672 dat->stream.cbc = (cbc128_f) aes256_t4_cbc_encrypt;
673 else if (mode == EVP_CIPH_CTR_MODE)
674 dat->stream.ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
675 else
676 dat->stream.cbc = NULL;
677 break;
678 default:
679 ret = -1;
680 }
681 }
682
683 if (ret < 0) {
684 EVPerr(EVP_F_AES_T4_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
685 return 0;
686 }
687
688 return 1;
689}
690
5158c763 691# define aes_t4_cbc_cipher aes_cbc_cipher
0f113f3e
MC
692static int aes_t4_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
693 const unsigned char *in, size_t len);
694
5158c763 695# define aes_t4_ecb_cipher aes_ecb_cipher
0f113f3e
MC
696static int aes_t4_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
697 const unsigned char *in, size_t len);
698
5158c763 699# define aes_t4_ofb_cipher aes_ofb_cipher
0f113f3e
MC
700static int aes_t4_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
701 const unsigned char *in, size_t len);
702
5158c763 703# define aes_t4_cfb_cipher aes_cfb_cipher
0f113f3e
MC
704static int aes_t4_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
705 const unsigned char *in, size_t len);
706
5158c763 707# define aes_t4_cfb8_cipher aes_cfb8_cipher
0f113f3e
MC
708static int aes_t4_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
709 const unsigned char *in, size_t len);
710
5158c763 711# define aes_t4_cfb1_cipher aes_cfb1_cipher
0f113f3e
MC
712static int aes_t4_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
713 const unsigned char *in, size_t len);
714
5158c763 715# define aes_t4_ctr_cipher aes_ctr_cipher
c5f6da54 716static int aes_t4_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 717 const unsigned char *in, size_t len);
c5f6da54
AP
718
719static int aes_t4_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
720 const unsigned char *iv, int enc)
721{
6435f0f6 722 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
0f113f3e
MC
723 if (!iv && !key)
724 return 1;
725 if (key) {
6435f0f6 726 int bits = EVP_CIPHER_CTX_key_length(ctx) * 8;
0f113f3e
MC
727 aes_t4_set_encrypt_key(key, bits, &gctx->ks.ks);
728 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
729 (block128_f) aes_t4_encrypt);
730 switch (bits) {
731 case 128:
732 gctx->ctr = (ctr128_f) aes128_t4_ctr32_encrypt;
733 break;
734 case 192:
735 gctx->ctr = (ctr128_f) aes192_t4_ctr32_encrypt;
736 break;
737 case 256:
738 gctx->ctr = (ctr128_f) aes256_t4_ctr32_encrypt;
739 break;
740 default:
741 return 0;
742 }
743 /*
744 * If we have an iv can set it directly, otherwise use saved IV.
745 */
746 if (iv == NULL && gctx->iv_set)
747 iv = gctx->iv;
748 if (iv) {
749 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
750 gctx->iv_set = 1;
751 }
752 gctx->key_set = 1;
753 } else {
754 /* If key set use IV, otherwise copy */
755 if (gctx->key_set)
756 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
757 else
758 memcpy(gctx->iv, iv, gctx->ivlen);
759 gctx->iv_set = 1;
760 gctx->iv_gen = 0;
761 }
762 return 1;
763}
764
5158c763 765# define aes_t4_gcm_cipher aes_gcm_cipher
c5f6da54 766static int aes_t4_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 767 const unsigned char *in, size_t len);
c5f6da54
AP
768
769static int aes_t4_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
770 const unsigned char *iv, int enc)
771{
6435f0f6 772 EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
0f113f3e
MC
773 if (!iv && !key)
774 return 1;
775
776 if (key) {
6435f0f6 777 int bits = EVP_CIPHER_CTX_key_length(ctx) * 4;
0f113f3e
MC
778 xctx->stream = NULL;
779 /* key_len is two AES keys */
780 if (enc) {
781 aes_t4_set_encrypt_key(key, bits, &xctx->ks1.ks);
782 xctx->xts.block1 = (block128_f) aes_t4_encrypt;
783 switch (bits) {
784 case 128:
785 xctx->stream = aes128_t4_xts_encrypt;
786 break;
0f113f3e
MC
787 case 256:
788 xctx->stream = aes256_t4_xts_encrypt;
789 break;
790 default:
791 return 0;
792 }
793 } else {
6435f0f6
RL
794 aes_t4_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 4,
795 &xctx->ks1.ks);
0f113f3e
MC
796 xctx->xts.block1 = (block128_f) aes_t4_decrypt;
797 switch (bits) {
798 case 128:
799 xctx->stream = aes128_t4_xts_decrypt;
800 break;
0f113f3e
MC
801 case 256:
802 xctx->stream = aes256_t4_xts_decrypt;
803 break;
804 default:
805 return 0;
806 }
807 }
808
6435f0f6
RL
809 aes_t4_set_encrypt_key(key + EVP_CIPHER_CTX_key_length(ctx) / 2,
810 EVP_CIPHER_CTX_key_length(ctx) * 4,
811 &xctx->ks2.ks);
0f113f3e
MC
812 xctx->xts.block2 = (block128_f) aes_t4_encrypt;
813
814 xctx->xts.key1 = &xctx->ks1;
815 }
816
817 if (iv) {
818 xctx->xts.key2 = &xctx->ks2;
6435f0f6 819 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 16);
0f113f3e
MC
820 }
821
822 return 1;
823}
824
5158c763 825# define aes_t4_xts_cipher aes_xts_cipher
c5f6da54 826static int aes_t4_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 827 const unsigned char *in, size_t len);
c5f6da54
AP
828
829static int aes_t4_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
830 const unsigned char *iv, int enc)
831{
6435f0f6 832 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
0f113f3e
MC
833 if (!iv && !key)
834 return 1;
835 if (key) {
6435f0f6 836 int bits = EVP_CIPHER_CTX_key_length(ctx) * 8;
0f113f3e
MC
837 aes_t4_set_encrypt_key(key, bits, &cctx->ks.ks);
838 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
839 &cctx->ks, (block128_f) aes_t4_encrypt);
bdc985b1 840 cctx->str = NULL;
0f113f3e
MC
841 cctx->key_set = 1;
842 }
843 if (iv) {
6435f0f6 844 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 15 - cctx->L);
0f113f3e
MC
845 cctx->iv_set = 1;
846 }
847 return 1;
848}
849
5158c763 850# define aes_t4_ccm_cipher aes_ccm_cipher
c5f6da54 851static int aes_t4_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 852 const unsigned char *in, size_t len);
c5f6da54 853
5158c763 854# ifndef OPENSSL_NO_OCB
e6b336ef 855static int aes_t4_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
856 const unsigned char *iv, int enc)
857{
6435f0f6 858 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
0f113f3e
MC
859 if (!iv && !key)
860 return 1;
861 if (key) {
862 do {
863 /*
864 * We set both the encrypt and decrypt key here because decrypt
865 * needs both. We could possibly optimise to remove setting the
866 * decrypt for an encryption operation.
867 */
6435f0f6
RL
868 aes_t4_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
869 &octx->ksenc.ks);
870 aes_t4_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
871 &octx->ksdec.ks);
bdc985b1
AP
872 if (!CRYPTO_ocb128_init(&octx->ocb,
873 &octx->ksenc.ks, &octx->ksdec.ks,
0f113f3e 874 (block128_f) aes_t4_encrypt,
02dc0b82
AP
875 (block128_f) aes_t4_decrypt,
876 NULL))
0f113f3e
MC
877 return 0;
878 }
879 while (0);
880
881 /*
882 * If we have an iv we can set it directly, otherwise use saved IV.
883 */
884 if (iv == NULL && octx->iv_set)
885 iv = octx->iv;
886 if (iv) {
887 if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
888 != 1)
889 return 0;
890 octx->iv_set = 1;
891 }
892 octx->key_set = 1;
893 } else {
894 /* If key set use IV, otherwise copy */
895 if (octx->key_set)
896 CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
897 else
898 memcpy(octx->iv, iv, octx->ivlen);
899 octx->iv_set = 1;
900 }
901 return 1;
902}
903
5158c763 904# define aes_t4_ocb_cipher aes_ocb_cipher
e6b336ef 905static int aes_t4_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e 906 const unsigned char *in, size_t len);
5158c763 907# endif /* OPENSSL_NO_OCB */
e6b336ef 908
5158c763 909# define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
c5f6da54 910static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
0f113f3e
MC
911 nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
912 flags|EVP_CIPH_##MODE##_MODE, \
913 aes_t4_init_key, \
914 aes_t4_##mode##_cipher, \
915 NULL, \
916 sizeof(EVP_AES_KEY), \
917 NULL,NULL,NULL,NULL }; \
c5f6da54 918static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
919 nid##_##keylen##_##nmode,blocksize, \
920 keylen/8,ivlen, \
921 flags|EVP_CIPH_##MODE##_MODE, \
922 aes_init_key, \
923 aes_##mode##_cipher, \
924 NULL, \
925 sizeof(EVP_AES_KEY), \
926 NULL,NULL,NULL,NULL }; \
c5f6da54
AP
927const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
928{ return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
929
5158c763 930# define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
c5f6da54 931static const EVP_CIPHER aes_t4_##keylen##_##mode = { \
0f113f3e
MC
932 nid##_##keylen##_##mode,blocksize, \
933 (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
934 flags|EVP_CIPH_##MODE##_MODE, \
935 aes_t4_##mode##_init_key, \
936 aes_t4_##mode##_cipher, \
937 aes_##mode##_cleanup, \
938 sizeof(EVP_AES_##MODE##_CTX), \
939 NULL,NULL,aes_##mode##_ctrl,NULL }; \
c5f6da54 940static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
941 nid##_##keylen##_##mode,blocksize, \
942 (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
943 flags|EVP_CIPH_##MODE##_MODE, \
944 aes_##mode##_init_key, \
945 aes_##mode##_cipher, \
946 aes_##mode##_cleanup, \
947 sizeof(EVP_AES_##MODE##_CTX), \
948 NULL,NULL,aes_##mode##_ctrl,NULL }; \
c5f6da54
AP
949const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
950{ return SPARC_AES_CAPABLE?&aes_t4_##keylen##_##mode:&aes_##keylen##_##mode; }
951
5158c763 952#else
17f121de 953
5158c763 954# define BLOCK_CIPHER_generic(nid,keylen,blocksize,ivlen,nmode,mode,MODE,flags) \
17f121de 955static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
956 nid##_##keylen##_##nmode,blocksize,keylen/8,ivlen, \
957 flags|EVP_CIPH_##MODE##_MODE, \
958 aes_init_key, \
959 aes_##mode##_cipher, \
960 NULL, \
961 sizeof(EVP_AES_KEY), \
962 NULL,NULL,NULL,NULL }; \
17f121de
AP
963const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
964{ return &aes_##keylen##_##mode; }
d1fff483 965
5158c763 966# define BLOCK_CIPHER_custom(nid,keylen,blocksize,ivlen,mode,MODE,flags) \
17f121de 967static const EVP_CIPHER aes_##keylen##_##mode = { \
0f113f3e
MC
968 nid##_##keylen##_##mode,blocksize, \
969 (EVP_CIPH_##MODE##_MODE==EVP_CIPH_XTS_MODE?2:1)*keylen/8, ivlen, \
970 flags|EVP_CIPH_##MODE##_MODE, \
971 aes_##mode##_init_key, \
972 aes_##mode##_cipher, \
973 aes_##mode##_cleanup, \
974 sizeof(EVP_AES_##MODE##_CTX), \
975 NULL,NULL,aes_##mode##_ctrl,NULL }; \
17f121de
AP
976const EVP_CIPHER *EVP_aes_##keylen##_##mode(void) \
977{ return &aes_##keylen##_##mode; }
9575d1a9 978
5158c763 979#endif
9575d1a9 980
5158c763
MC
981#if defined(OPENSSL_CPUID_OBJ) && (defined(__arm__) || defined(__arm) || defined(__aarch64__))
982# include "arm_arch.h"
983# if __ARM_MAX_ARCH__>=7
984# if defined(BSAES_ASM)
985# define BSAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
986# endif
987# if defined(VPAES_ASM)
988# define VPAES_CAPABLE (OPENSSL_armcap_P & ARMV7_NEON)
0f113f3e 989# endif
5158c763
MC
990# define HWAES_CAPABLE (OPENSSL_armcap_P & ARMV8_AES)
991# define HWAES_set_encrypt_key aes_v8_set_encrypt_key
992# define HWAES_set_decrypt_key aes_v8_set_decrypt_key
993# define HWAES_encrypt aes_v8_encrypt
994# define HWAES_decrypt aes_v8_decrypt
995# define HWAES_cbc_encrypt aes_v8_cbc_encrypt
996# define HWAES_ctr32_encrypt_blocks aes_v8_ctr32_encrypt_blocks
ddacb8f2 997# endif
5158c763 998#endif
d1fff483 999
5158c763 1000#if defined(HWAES_CAPABLE)
ddacb8f2 1001int HWAES_set_encrypt_key(const unsigned char *userKey, const int bits,
0f113f3e 1002 AES_KEY *key);
ddacb8f2 1003int HWAES_set_decrypt_key(const unsigned char *userKey, const int bits,
0f113f3e 1004 AES_KEY *key);
ddacb8f2 1005void HWAES_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e 1006 const AES_KEY *key);
ddacb8f2 1007void HWAES_decrypt(const unsigned char *in, unsigned char *out,
0f113f3e 1008 const AES_KEY *key);
ddacb8f2 1009void HWAES_cbc_encrypt(const unsigned char *in, unsigned char *out,
0f113f3e
MC
1010 size_t length, const AES_KEY *key,
1011 unsigned char *ivec, const int enc);
ddacb8f2 1012void HWAES_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out,
0f113f3e
MC
1013 size_t len, const AES_KEY *key,
1014 const unsigned char ivec[16]);
46f047d7
AP
1015void HWAES_xts_encrypt(const unsigned char *inp, unsigned char *out,
1016 size_t len, const AES_KEY *key1,
1017 const AES_KEY *key2, const unsigned char iv[16]);
1018void HWAES_xts_decrypt(const unsigned char *inp, unsigned char *out,
1019 size_t len, const AES_KEY *key1,
1020 const AES_KEY *key2, const unsigned char iv[16]);
5158c763 1021#endif
ddacb8f2 1022
5158c763 1023#define BLOCK_CIPHER_generic_pack(nid,keylen,flags) \
0f113f3e
MC
1024 BLOCK_CIPHER_generic(nid,keylen,16,16,cbc,cbc,CBC,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
1025 BLOCK_CIPHER_generic(nid,keylen,16,0,ecb,ecb,ECB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
1026 BLOCK_CIPHER_generic(nid,keylen,1,16,ofb128,ofb,OFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
1027 BLOCK_CIPHER_generic(nid,keylen,1,16,cfb128,cfb,CFB,flags|EVP_CIPH_FLAG_DEFAULT_ASN1) \
1028 BLOCK_CIPHER_generic(nid,keylen,1,16,cfb1,cfb1,CFB,flags) \
1029 BLOCK_CIPHER_generic(nid,keylen,1,16,cfb8,cfb8,CFB,flags) \
1030 BLOCK_CIPHER_generic(nid,keylen,1,16,ctr,ctr,CTR,flags)
d1fff483
AP
1031
1032static int aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
1033 const unsigned char *iv, int enc)
1034{
1035 int ret, mode;
6435f0f6 1036 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
0f113f3e 1037
6435f0f6 1038 mode = EVP_CIPHER_CTX_mode(ctx);
0f113f3e 1039 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE)
c01a3c6d 1040 && !enc) {
5158c763 1041#ifdef HWAES_CAPABLE
0f113f3e 1042 if (HWAES_CAPABLE) {
6435f0f6
RL
1043 ret = HWAES_set_decrypt_key(key,
1044 EVP_CIPHER_CTX_key_length(ctx) * 8,
1045 &dat->ks.ks);
0f113f3e
MC
1046 dat->block = (block128_f) HWAES_decrypt;
1047 dat->stream.cbc = NULL;
5158c763 1048# ifdef HWAES_cbc_encrypt
0f113f3e
MC
1049 if (mode == EVP_CIPH_CBC_MODE)
1050 dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
0f113f3e 1051# endif
5158c763
MC
1052 } else
1053#endif
1054#ifdef BSAES_CAPABLE
0f113f3e 1055 if (BSAES_CAPABLE && mode == EVP_CIPH_CBC_MODE) {
6435f0f6
RL
1056 ret = AES_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1057 &dat->ks.ks);
0f113f3e
MC
1058 dat->block = (block128_f) AES_decrypt;
1059 dat->stream.cbc = (cbc128_f) bsaes_cbc_encrypt;
1060 } else
5158c763
MC
1061#endif
1062#ifdef VPAES_CAPABLE
0f113f3e 1063 if (VPAES_CAPABLE) {
6435f0f6
RL
1064 ret = vpaes_set_decrypt_key(key,
1065 EVP_CIPHER_CTX_key_length(ctx) * 8,
1066 &dat->ks.ks);
0f113f3e
MC
1067 dat->block = (block128_f) vpaes_decrypt;
1068 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
1069 (cbc128_f) vpaes_cbc_encrypt : NULL;
1070 } else
5158c763 1071#endif
0f113f3e 1072 {
6435f0f6
RL
1073 ret = AES_set_decrypt_key(key,
1074 EVP_CIPHER_CTX_key_length(ctx) * 8,
1075 &dat->ks.ks);
0f113f3e
MC
1076 dat->block = (block128_f) AES_decrypt;
1077 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
1078 (cbc128_f) AES_cbc_encrypt : NULL;
c01a3c6d 1079 }
0f113f3e 1080 } else
5158c763 1081#ifdef HWAES_CAPABLE
0f113f3e 1082 if (HWAES_CAPABLE) {
6435f0f6
RL
1083 ret = HWAES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1084 &dat->ks.ks);
0f113f3e
MC
1085 dat->block = (block128_f) HWAES_encrypt;
1086 dat->stream.cbc = NULL;
5158c763 1087# ifdef HWAES_cbc_encrypt
0f113f3e
MC
1088 if (mode == EVP_CIPH_CBC_MODE)
1089 dat->stream.cbc = (cbc128_f) HWAES_cbc_encrypt;
1090 else
5158c763
MC
1091# endif
1092# ifdef HWAES_ctr32_encrypt_blocks
0f113f3e
MC
1093 if (mode == EVP_CIPH_CTR_MODE)
1094 dat->stream.ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
1095 else
5158c763 1096# endif
0f113f3e
MC
1097 (void)0; /* terminate potentially open 'else' */
1098 } else
5158c763
MC
1099#endif
1100#ifdef BSAES_CAPABLE
0f113f3e 1101 if (BSAES_CAPABLE && mode == EVP_CIPH_CTR_MODE) {
6435f0f6
RL
1102 ret = AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1103 &dat->ks.ks);
0f113f3e
MC
1104 dat->block = (block128_f) AES_encrypt;
1105 dat->stream.ctr = (ctr128_f) bsaes_ctr32_encrypt_blocks;
1106 } else
5158c763
MC
1107#endif
1108#ifdef VPAES_CAPABLE
0f113f3e 1109 if (VPAES_CAPABLE) {
6435f0f6
RL
1110 ret = vpaes_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1111 &dat->ks.ks);
0f113f3e
MC
1112 dat->block = (block128_f) vpaes_encrypt;
1113 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
1114 (cbc128_f) vpaes_cbc_encrypt : NULL;
1115 } else
5158c763 1116#endif
0f113f3e 1117 {
6435f0f6
RL
1118 ret = AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1119 &dat->ks.ks);
0f113f3e
MC
1120 dat->block = (block128_f) AES_encrypt;
1121 dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ?
1122 (cbc128_f) AES_cbc_encrypt : NULL;
5158c763 1123#ifdef AES_CTR_ASM
0f113f3e
MC
1124 if (mode == EVP_CIPH_CTR_MODE)
1125 dat->stream.ctr = (ctr128_f) AES_ctr32_encrypt;
5158c763 1126#endif
0f113f3e 1127 }
d1fff483 1128
0f113f3e
MC
1129 if (ret < 0) {
1130 EVPerr(EVP_F_AES_INIT_KEY, EVP_R_AES_KEY_SETUP_FAILED);
1131 return 0;
1132 }
d1fff483 1133
0f113f3e
MC
1134 return 1;
1135}
d1fff483 1136
0f113f3e
MC
1137static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1138 const unsigned char *in, size_t len)
17f121de 1139{
6435f0f6 1140 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
8ca28da0 1141
0f113f3e 1142 if (dat->stream.cbc)
6435f0f6
RL
1143 (*dat->stream.cbc) (in, out, len, &dat->ks,
1144 EVP_CIPHER_CTX_iv_noconst(ctx),
1145 EVP_CIPHER_CTX_encrypting(ctx));
1146 else if (EVP_CIPHER_CTX_encrypting(ctx))
1147 CRYPTO_cbc128_encrypt(in, out, len, &dat->ks,
1148 EVP_CIPHER_CTX_iv_noconst(ctx), dat->block);
0f113f3e 1149 else
6435f0f6
RL
1150 CRYPTO_cbc128_decrypt(in, out, len, &dat->ks,
1151 EVP_CIPHER_CTX_iv_noconst(ctx), dat->block);
17f121de 1152
0f113f3e 1153 return 1;
17f121de
AP
1154}
1155
0f113f3e
MC
1156static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1157 const unsigned char *in, size_t len)
17f121de 1158{
6435f0f6 1159 size_t bl = EVP_CIPHER_CTX_block_size(ctx);
0f113f3e 1160 size_t i;
6435f0f6 1161 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
17f121de 1162
0f113f3e
MC
1163 if (len < bl)
1164 return 1;
17f121de 1165
0f113f3e
MC
1166 for (i = 0, len -= bl; i <= len; i += bl)
1167 (*dat->block) (in + i, out + i, &dat->ks);
17f121de 1168
0f113f3e 1169 return 1;
17f121de 1170}
deb2c1a1 1171
0f113f3e
MC
1172static int aes_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1173 const unsigned char *in, size_t len)
17f121de 1174{
6435f0f6 1175 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
8ca28da0 1176
6435f0f6 1177 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1178 CRYPTO_ofb128_encrypt(in, out, len, &dat->ks,
6435f0f6
RL
1179 EVP_CIPHER_CTX_iv_noconst(ctx), &num, dat->block);
1180 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e 1181 return 1;
17f121de 1182}
deb2c1a1 1183
0f113f3e
MC
1184static int aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1185 const unsigned char *in, size_t len)
17f121de 1186{
6435f0f6 1187 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
8ca28da0 1188
6435f0f6 1189 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1190 CRYPTO_cfb128_encrypt(in, out, len, &dat->ks,
6435f0f6
RL
1191 EVP_CIPHER_CTX_iv_noconst(ctx), &num,
1192 EVP_CIPHER_CTX_encrypting(ctx), dat->block);
1193 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e 1194 return 1;
17f121de
AP
1195}
1196
0f113f3e
MC
1197static int aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1198 const unsigned char *in, size_t len)
17f121de 1199{
6435f0f6 1200 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
8ca28da0 1201
6435f0f6 1202 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1203 CRYPTO_cfb128_8_encrypt(in, out, len, &dat->ks,
6435f0f6
RL
1204 EVP_CIPHER_CTX_iv_noconst(ctx), &num,
1205 EVP_CIPHER_CTX_encrypting(ctx), dat->block);
1206 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e 1207 return 1;
17f121de 1208}
8d1ebe0b 1209
0f113f3e
MC
1210static int aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1211 const unsigned char *in, size_t len)
17f121de 1212{
6435f0f6 1213 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
0f113f3e 1214
6435f0f6
RL
1215 if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS)) {
1216 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1217 CRYPTO_cfb128_1_encrypt(in, out, len, &dat->ks,
6435f0f6
RL
1218 EVP_CIPHER_CTX_iv_noconst(ctx), &num,
1219 EVP_CIPHER_CTX_encrypting(ctx), dat->block);
1220 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e
MC
1221 return 1;
1222 }
1223
1224 while (len >= MAXBITCHUNK) {
6435f0f6 1225 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1226 CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK * 8, &dat->ks,
6435f0f6
RL
1227 EVP_CIPHER_CTX_iv_noconst(ctx), &num,
1228 EVP_CIPHER_CTX_encrypting(ctx), dat->block);
1229 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e
MC
1230 len -= MAXBITCHUNK;
1231 }
6435f0f6
RL
1232 if (len) {
1233 int num = EVP_CIPHER_CTX_num(ctx);
0f113f3e 1234 CRYPTO_cfb128_1_encrypt(in, out, len * 8, &dat->ks,
6435f0f6
RL
1235 EVP_CIPHER_CTX_iv_noconst(ctx), &num,
1236 EVP_CIPHER_CTX_encrypting(ctx), dat->block);
1237 EVP_CIPHER_CTX_set_num(ctx, num);
1238 }
0f113f3e
MC
1239
1240 return 1;
17f121de 1241}
8d1ebe0b 1242
0f113f3e
MC
1243static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1244 const unsigned char *in, size_t len)
d976f992 1245{
6435f0f6
RL
1246 unsigned int num = EVP_CIPHER_CTX_num(ctx);
1247 EVP_AES_KEY *dat = EVP_C_DATA(EVP_AES_KEY,ctx);
0f113f3e
MC
1248
1249 if (dat->stream.ctr)
1250 CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks,
6435f0f6
RL
1251 EVP_CIPHER_CTX_iv_noconst(ctx),
1252 EVP_CIPHER_CTX_buf_noconst(ctx),
1253 &num, dat->stream.ctr);
0f113f3e
MC
1254 else
1255 CRYPTO_ctr128_encrypt(in, out, len, &dat->ks,
6435f0f6
RL
1256 EVP_CIPHER_CTX_iv_noconst(ctx),
1257 EVP_CIPHER_CTX_buf_noconst(ctx), &num,
1258 dat->block);
1259 EVP_CIPHER_CTX_set_num(ctx, num);
0f113f3e 1260 return 1;
d976f992
AP
1261}
1262
0f113f3e
MC
1263BLOCK_CIPHER_generic_pack(NID_aes, 128, 0)
1264 BLOCK_CIPHER_generic_pack(NID_aes, 192, 0)
1265 BLOCK_CIPHER_generic_pack(NID_aes, 256, 0)
bdaa5415
DSH
1266
1267static int aes_gcm_cleanup(EVP_CIPHER_CTX *c)
0f113f3e 1268{
6435f0f6 1269 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,c);
0f113f3e 1270 OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm));
6435f0f6 1271 if (gctx->iv != EVP_CIPHER_CTX_iv_noconst(c))
0f113f3e
MC
1272 OPENSSL_free(gctx->iv);
1273 return 1;
1274}
bdaa5415 1275
b3d8022e 1276/* increment counter (64-bit int) by 1 */
0f113f3e
MC
1277static void ctr64_inc(unsigned char *counter)
1278{
1279 int n = 8;
1280 unsigned char c;
1281
1282 do {
1283 --n;
1284 c = counter[n];
1285 ++c;
1286 counter[n] = c;
1287 if (c)
1288 return;
1289 } while (n);
b3d8022e
DSH
1290}
1291
bdaa5415 1292static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
0f113f3e 1293{
6435f0f6 1294 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,c);
0f113f3e
MC
1295 switch (type) {
1296 case EVP_CTRL_INIT:
1297 gctx->key_set = 0;
1298 gctx->iv_set = 0;
6435f0f6
RL
1299 gctx->ivlen = EVP_CIPHER_CTX_iv_length(c);
1300 gctx->iv = EVP_CIPHER_CTX_iv_noconst(c);
0f113f3e
MC
1301 gctx->taglen = -1;
1302 gctx->iv_gen = 0;
1303 gctx->tls_aad_len = -1;
1304 return 1;
1305
e640fa02 1306 case EVP_CTRL_AEAD_SET_IVLEN:
0f113f3e
MC
1307 if (arg <= 0)
1308 return 0;
1309 /* Allocate memory for IV if needed */
1310 if ((arg > EVP_MAX_IV_LENGTH) && (arg > gctx->ivlen)) {
6435f0f6 1311 if (gctx->iv != EVP_CIPHER_CTX_iv_noconst(c))
0f113f3e
MC
1312 OPENSSL_free(gctx->iv);
1313 gctx->iv = OPENSSL_malloc(arg);
90945fa3 1314 if (gctx->iv == NULL)
0f113f3e
MC
1315 return 0;
1316 }
1317 gctx->ivlen = arg;
1318 return 1;
1319
e640fa02 1320 case EVP_CTRL_AEAD_SET_TAG:
6435f0f6 1321 if (arg <= 0 || arg > 16 || EVP_CIPHER_CTX_encrypting(c))
0f113f3e 1322 return 0;
6435f0f6 1323 memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
0f113f3e
MC
1324 gctx->taglen = arg;
1325 return 1;
1326
e640fa02 1327 case EVP_CTRL_AEAD_GET_TAG:
6435f0f6
RL
1328 if (arg <= 0 || arg > 16 || !EVP_CIPHER_CTX_encrypting(c)
1329 || gctx->taglen < 0)
0f113f3e 1330 return 0;
6435f0f6 1331 memcpy(ptr, EVP_CIPHER_CTX_buf_noconst(c), arg);
0f113f3e
MC
1332 return 1;
1333
1334 case EVP_CTRL_GCM_SET_IV_FIXED:
1335 /* Special case: -1 length restores whole IV */
1336 if (arg == -1) {
1337 memcpy(gctx->iv, ptr, gctx->ivlen);
1338 gctx->iv_gen = 1;
1339 return 1;
1340 }
1341 /*
1342 * Fixed field must be at least 4 bytes and invocation field at least
1343 * 8.
1344 */
1345 if ((arg < 4) || (gctx->ivlen - arg) < 8)
1346 return 0;
1347 if (arg)
1348 memcpy(gctx->iv, ptr, arg);
6435f0f6
RL
1349 if (EVP_CIPHER_CTX_encrypting(c)
1350 && RAND_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0)
0f113f3e
MC
1351 return 0;
1352 gctx->iv_gen = 1;
1353 return 1;
1354
1355 case EVP_CTRL_GCM_IV_GEN:
1356 if (gctx->iv_gen == 0 || gctx->key_set == 0)
1357 return 0;
1358 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
1359 if (arg <= 0 || arg > gctx->ivlen)
1360 arg = gctx->ivlen;
1361 memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg);
1362 /*
1363 * Invocation field will be at least 8 bytes in size and so no need
1364 * to check wrap around or increment more than last 8 bytes.
1365 */
1366 ctr64_inc(gctx->iv + gctx->ivlen - 8);
1367 gctx->iv_set = 1;
1368 return 1;
1369
1370 case EVP_CTRL_GCM_SET_IV_INV:
6435f0f6
RL
1371 if (gctx->iv_gen == 0 || gctx->key_set == 0
1372 || EVP_CIPHER_CTX_encrypting(c))
0f113f3e
MC
1373 return 0;
1374 memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg);
1375 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen);
1376 gctx->iv_set = 1;
1377 return 1;
1378
1379 case EVP_CTRL_AEAD_TLS1_AAD:
1380 /* Save the AAD for later use */
c8269881 1381 if (arg != EVP_AEAD_TLS1_AAD_LEN)
0f113f3e 1382 return 0;
6435f0f6 1383 memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
0f113f3e
MC
1384 gctx->tls_aad_len = arg;
1385 {
6435f0f6
RL
1386 unsigned int len =
1387 EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] << 8
1388 | EVP_CIPHER_CTX_buf_noconst(c)[arg - 1];
0f113f3e
MC
1389 /* Correct length for explicit IV */
1390 len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
1391 /* If decrypting correct for tag too */
6435f0f6 1392 if (!EVP_CIPHER_CTX_encrypting(c))
0f113f3e 1393 len -= EVP_GCM_TLS_TAG_LEN;
6435f0f6
RL
1394 EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] = len >> 8;
1395 EVP_CIPHER_CTX_buf_noconst(c)[arg - 1] = len & 0xff;
0f113f3e
MC
1396 }
1397 /* Extra padding: tag appended to record */
1398 return EVP_GCM_TLS_TAG_LEN;
1399
1400 case EVP_CTRL_COPY:
1401 {
1402 EVP_CIPHER_CTX *out = ptr;
6435f0f6 1403 EVP_AES_GCM_CTX *gctx_out = EVP_C_DATA(EVP_AES_GCM_CTX,out);
0f113f3e
MC
1404 if (gctx->gcm.key) {
1405 if (gctx->gcm.key != &gctx->ks)
1406 return 0;
1407 gctx_out->gcm.key = &gctx_out->ks;
1408 }
6435f0f6
RL
1409 if (gctx->iv == EVP_CIPHER_CTX_iv_noconst(c))
1410 gctx_out->iv = EVP_CIPHER_CTX_iv_noconst(out);
0f113f3e
MC
1411 else {
1412 gctx_out->iv = OPENSSL_malloc(gctx->ivlen);
90945fa3 1413 if (gctx_out->iv == NULL)
0f113f3e
MC
1414 return 0;
1415 memcpy(gctx_out->iv, gctx->iv, gctx->ivlen);
1416 }
1417 return 1;
1418 }
1419
1420 default:
1421 return -1;
1422
1423 }
1424}
bdaa5415
DSH
1425
1426static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
1427 const unsigned char *iv, int enc)
1428{
6435f0f6 1429 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
0f113f3e
MC
1430 if (!iv && !key)
1431 return 1;
1432 if (key) {
1433 do {
5158c763 1434#ifdef HWAES_CAPABLE
0f113f3e 1435 if (HWAES_CAPABLE) {
6435f0f6
RL
1436 HWAES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1437 &gctx->ks.ks);
0f113f3e
MC
1438 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1439 (block128_f) HWAES_encrypt);
5158c763 1440# ifdef HWAES_ctr32_encrypt_blocks
0f113f3e 1441 gctx->ctr = (ctr128_f) HWAES_ctr32_encrypt_blocks;
5158c763 1442# else
0f113f3e 1443 gctx->ctr = NULL;
5158c763 1444# endif
0f113f3e
MC
1445 break;
1446 } else
5158c763
MC
1447#endif
1448#ifdef BSAES_CAPABLE
0f113f3e 1449 if (BSAES_CAPABLE) {
6435f0f6
RL
1450 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1451 &gctx->ks.ks);
0f113f3e
MC
1452 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1453 (block128_f) AES_encrypt);
1454 gctx->ctr = (ctr128_f) bsaes_ctr32_encrypt_blocks;
1455 break;
1456 } else
5158c763
MC
1457#endif
1458#ifdef VPAES_CAPABLE
0f113f3e 1459 if (VPAES_CAPABLE) {
6435f0f6
RL
1460 vpaes_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1461 &gctx->ks.ks);
0f113f3e
MC
1462 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1463 (block128_f) vpaes_encrypt);
1464 gctx->ctr = NULL;
1465 break;
1466 } else
5158c763 1467#endif
0f113f3e
MC
1468 (void)0; /* terminate potentially open 'else' */
1469
6435f0f6
RL
1470 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
1471 &gctx->ks.ks);
0f113f3e
MC
1472 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks,
1473 (block128_f) AES_encrypt);
5158c763 1474#ifdef AES_CTR_ASM
0f113f3e 1475 gctx->ctr = (ctr128_f) AES_ctr32_encrypt;
5158c763 1476#else
0f113f3e 1477 gctx->ctr = NULL;
5158c763 1478#endif
0f113f3e
MC
1479 } while (0);
1480
1481 /*
1482 * If we have an iv can set it directly, otherwise use saved IV.
1483 */
1484 if (iv == NULL && gctx->iv_set)
1485 iv = gctx->iv;
1486 if (iv) {
1487 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
1488 gctx->iv_set = 1;
1489 }
1490 gctx->key_set = 1;
1491 } else {
1492 /* If key set use IV, otherwise copy */
1493 if (gctx->key_set)
1494 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen);
1495 else
1496 memcpy(gctx->iv, iv, gctx->ivlen);
1497 gctx->iv_set = 1;
1498 gctx->iv_gen = 0;
1499 }
1500 return 1;
1501}
1502
1503/*
1504 * Handle TLS GCM packet format. This consists of the last portion of the IV
28dd49fa
DSH
1505 * followed by the payload and finally the tag. On encrypt generate IV,
1506 * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
1507 * and verify tag.
1508 */
1509
1510static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
1511 const unsigned char *in, size_t len)
1512{
6435f0f6 1513 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
0f113f3e
MC
1514 int rv = -1;
1515 /* Encrypt/decrypt must be performed in place */
1516 if (out != in
1517 || len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
1518 return -1;
1519 /*
1520 * Set IV from start of buffer or generate IV and write to start of
1521 * buffer.
1522 */
6435f0f6 1523 if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CIPHER_CTX_encrypting(ctx) ?
0f113f3e
MC
1524 EVP_CTRL_GCM_IV_GEN : EVP_CTRL_GCM_SET_IV_INV,
1525 EVP_GCM_TLS_EXPLICIT_IV_LEN, out) <= 0)
1526 goto err;
1527 /* Use saved AAD */
6435f0f6
RL
1528 if (CRYPTO_gcm128_aad(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx),
1529 gctx->tls_aad_len))
0f113f3e
MC
1530 goto err;
1531 /* Fix buffer and length to point to payload */
1532 in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1533 out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
1534 len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
6435f0f6 1535 if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
1536 /* Encrypt payload */
1537 if (gctx->ctr) {
1538 size_t bulk = 0;
5158c763 1539#if defined(AES_GCM_ASM)
0f113f3e
MC
1540 if (len >= 32 && AES_GCM_ASM(gctx)) {
1541 if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
1542 return -1;
1543
1544 bulk = AES_gcm_encrypt(in, out, len,
1545 gctx->gcm.key,
1546 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1547 gctx->gcm.len.u[1] += bulk;
1548 }
5158c763 1549#endif
0f113f3e
MC
1550 if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
1551 in + bulk,
1552 out + bulk,
1553 len - bulk, gctx->ctr))
1554 goto err;
1555 } else {
1556 size_t bulk = 0;
5158c763 1557#if defined(AES_GCM_ASM2)
0f113f3e
MC
1558 if (len >= 32 && AES_GCM_ASM2(gctx)) {
1559 if (CRYPTO_gcm128_encrypt(&gctx->gcm, NULL, NULL, 0))
1560 return -1;
1561
1562 bulk = AES_gcm_encrypt(in, out, len,
1563 gctx->gcm.key,
1564 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1565 gctx->gcm.len.u[1] += bulk;
1566 }
5158c763 1567#endif
0f113f3e
MC
1568 if (CRYPTO_gcm128_encrypt(&gctx->gcm,
1569 in + bulk, out + bulk, len - bulk))
1570 goto err;
1571 }
1572 out += len;
1573 /* Finally write tag */
1574 CRYPTO_gcm128_tag(&gctx->gcm, out, EVP_GCM_TLS_TAG_LEN);
1575 rv = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
1576 } else {
1577 /* Decrypt */
1578 if (gctx->ctr) {
1579 size_t bulk = 0;
5158c763 1580#if defined(AES_GCM_ASM)
0f113f3e
MC
1581 if (len >= 16 && AES_GCM_ASM(gctx)) {
1582 if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
1583 return -1;
1584
1585 bulk = AES_gcm_decrypt(in, out, len,
1586 gctx->gcm.key,
1587 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1588 gctx->gcm.len.u[1] += bulk;
1589 }
5158c763 1590#endif
0f113f3e
MC
1591 if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
1592 in + bulk,
1593 out + bulk,
1594 len - bulk, gctx->ctr))
1595 goto err;
1596 } else {
1597 size_t bulk = 0;
5158c763 1598#if defined(AES_GCM_ASM2)
0f113f3e
MC
1599 if (len >= 16 && AES_GCM_ASM2(gctx)) {
1600 if (CRYPTO_gcm128_decrypt(&gctx->gcm, NULL, NULL, 0))
1601 return -1;
1602
1603 bulk = AES_gcm_decrypt(in, out, len,
1604 gctx->gcm.key,
1605 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1606 gctx->gcm.len.u[1] += bulk;
1607 }
5158c763 1608#endif
0f113f3e
MC
1609 if (CRYPTO_gcm128_decrypt(&gctx->gcm,
1610 in + bulk, out + bulk, len - bulk))
1611 goto err;
1612 }
1613 /* Retrieve tag */
6435f0f6
RL
1614 CRYPTO_gcm128_tag(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx),
1615 EVP_GCM_TLS_TAG_LEN);
0f113f3e 1616 /* If tag mismatch wipe buffer */
6435f0f6
RL
1617 if (CRYPTO_memcmp(EVP_CIPHER_CTX_buf_noconst(ctx), in + len,
1618 EVP_GCM_TLS_TAG_LEN)) {
0f113f3e
MC
1619 OPENSSL_cleanse(out, len);
1620 goto err;
1621 }
1622 rv = len;
1623 }
1624
1625 err:
1626 gctx->iv_set = 0;
1627 gctx->tls_aad_len = -1;
1628 return rv;
1629}
28dd49fa 1630
17f121de 1631static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
1632 const unsigned char *in, size_t len)
1633{
6435f0f6 1634 EVP_AES_GCM_CTX *gctx = EVP_C_DATA(EVP_AES_GCM_CTX,ctx);
0f113f3e
MC
1635 /* If not set up, return error */
1636 if (!gctx->key_set)
1637 return -1;
1638
1639 if (gctx->tls_aad_len >= 0)
1640 return aes_gcm_tls_cipher(ctx, out, in, len);
1641
1642 if (!gctx->iv_set)
1643 return -1;
1644 if (in) {
1645 if (out == NULL) {
1646 if (CRYPTO_gcm128_aad(&gctx->gcm, in, len))
1647 return -1;
6435f0f6 1648 } else if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
1649 if (gctx->ctr) {
1650 size_t bulk = 0;
5158c763 1651#if defined(AES_GCM_ASM)
0f113f3e
MC
1652 if (len >= 32 && AES_GCM_ASM(gctx)) {
1653 size_t res = (16 - gctx->gcm.mres) % 16;
1654
1655 if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
1656 return -1;
1657
1658 bulk = AES_gcm_encrypt(in + res,
1659 out + res, len - res,
1660 gctx->gcm.key, gctx->gcm.Yi.c,
1661 gctx->gcm.Xi.u);
1662 gctx->gcm.len.u[1] += bulk;
1663 bulk += res;
1664 }
5158c763 1665#endif
0f113f3e
MC
1666 if (CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm,
1667 in + bulk,
1668 out + bulk,
1669 len - bulk, gctx->ctr))
1670 return -1;
1671 } else {
1672 size_t bulk = 0;
5158c763 1673#if defined(AES_GCM_ASM2)
0f113f3e
MC
1674 if (len >= 32 && AES_GCM_ASM2(gctx)) {
1675 size_t res = (16 - gctx->gcm.mres) % 16;
1676
1677 if (CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res))
1678 return -1;
1679
1680 bulk = AES_gcm_encrypt(in + res,
1681 out + res, len - res,
1682 gctx->gcm.key, gctx->gcm.Yi.c,
1683 gctx->gcm.Xi.u);
1684 gctx->gcm.len.u[1] += bulk;
1685 bulk += res;
1686 }
5158c763 1687#endif
0f113f3e
MC
1688 if (CRYPTO_gcm128_encrypt(&gctx->gcm,
1689 in + bulk, out + bulk, len - bulk))
1690 return -1;
1691 }
1692 } else {
1693 if (gctx->ctr) {
1694 size_t bulk = 0;
5158c763 1695#if defined(AES_GCM_ASM)
0f113f3e
MC
1696 if (len >= 16 && AES_GCM_ASM(gctx)) {
1697 size_t res = (16 - gctx->gcm.mres) % 16;
1698
1699 if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
1700 return -1;
1701
1702 bulk = AES_gcm_decrypt(in + res,
1703 out + res, len - res,
1704 gctx->gcm.key,
1705 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1706 gctx->gcm.len.u[1] += bulk;
1707 bulk += res;
1708 }
5158c763 1709#endif
0f113f3e
MC
1710 if (CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm,
1711 in + bulk,
1712 out + bulk,
1713 len - bulk, gctx->ctr))
1714 return -1;
1715 } else {
1716 size_t bulk = 0;
5158c763 1717#if defined(AES_GCM_ASM2)
0f113f3e
MC
1718 if (len >= 16 && AES_GCM_ASM2(gctx)) {
1719 size_t res = (16 - gctx->gcm.mres) % 16;
1720
1721 if (CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res))
1722 return -1;
1723
1724 bulk = AES_gcm_decrypt(in + res,
1725 out + res, len - res,
1726 gctx->gcm.key,
1727 gctx->gcm.Yi.c, gctx->gcm.Xi.u);
1728 gctx->gcm.len.u[1] += bulk;
1729 bulk += res;
1730 }
5158c763 1731#endif
0f113f3e
MC
1732 if (CRYPTO_gcm128_decrypt(&gctx->gcm,
1733 in + bulk, out + bulk, len - bulk))
1734 return -1;
1735 }
1736 }
1737 return len;
1738 } else {
6435f0f6 1739 if (!EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
1740 if (gctx->taglen < 0)
1741 return -1;
6435f0f6
RL
1742 if (CRYPTO_gcm128_finish(&gctx->gcm,
1743 EVP_CIPHER_CTX_buf_noconst(ctx),
1744 gctx->taglen) != 0)
0f113f3e
MC
1745 return -1;
1746 gctx->iv_set = 0;
1747 return 0;
1748 }
6435f0f6 1749 CRYPTO_gcm128_tag(&gctx->gcm, EVP_CIPHER_CTX_buf_noconst(ctx), 16);
0f113f3e
MC
1750 gctx->taglen = 16;
1751 /* Don't reuse the IV */
1752 gctx->iv_set = 0;
1753 return 0;
1754 }
1755
1756}
1757
5158c763 1758#define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 \
0f113f3e
MC
1759 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
1760 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
1761 | EVP_CIPH_CUSTOM_COPY)
1762
1763BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM,
1764 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
1765 BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, gcm, GCM,
1766 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
1767 BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, gcm, GCM,
1768 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
32a2d8dd
DSH
1769
1770static int aes_xts_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
0f113f3e 1771{
6435f0f6 1772 EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,c);
0f113f3e
MC
1773 if (type == EVP_CTRL_COPY) {
1774 EVP_CIPHER_CTX *out = ptr;
6435f0f6 1775 EVP_AES_XTS_CTX *xctx_out = EVP_C_DATA(EVP_AES_XTS_CTX,out);
0f113f3e
MC
1776 if (xctx->xts.key1) {
1777 if (xctx->xts.key1 != &xctx->ks1)
1778 return 0;
1779 xctx_out->xts.key1 = &xctx_out->ks1;
1780 }
1781 if (xctx->xts.key2) {
1782 if (xctx->xts.key2 != &xctx->ks2)
1783 return 0;
1784 xctx_out->xts.key2 = &xctx_out->ks2;
1785 }
1786 return 1;
1787 } else if (type != EVP_CTRL_INIT)
1788 return -1;
1789 /* key1 and key2 are used as an indicator both key and IV are set */
1790 xctx->xts.key1 = NULL;
1791 xctx->xts.key2 = NULL;
1792 return 1;
1793}
32a2d8dd
DSH
1794
1795static int aes_xts_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
1796 const unsigned char *iv, int enc)
1797{
6435f0f6 1798 EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
0f113f3e
MC
1799 if (!iv && !key)
1800 return 1;
1801
1802 if (key)
1803 do {
5158c763 1804#ifdef AES_XTS_ASM
0f113f3e 1805 xctx->stream = enc ? AES_xts_encrypt : AES_xts_decrypt;
5158c763 1806#else
0f113f3e 1807 xctx->stream = NULL;
5158c763 1808#endif
0f113f3e 1809 /* key_len is two AES keys */
5158c763 1810#ifdef HWAES_CAPABLE
0f113f3e
MC
1811 if (HWAES_CAPABLE) {
1812 if (enc) {
6435f0f6
RL
1813 HWAES_set_encrypt_key(key,
1814 EVP_CIPHER_CTX_key_length(ctx) * 4,
0f113f3e
MC
1815 &xctx->ks1.ks);
1816 xctx->xts.block1 = (block128_f) HWAES_encrypt;
46f047d7
AP
1817# ifdef HWAES_xts_encrypt
1818 xctx->stream = HWAES_xts_encrypt;
1819# endif
0f113f3e 1820 } else {
6435f0f6
RL
1821 HWAES_set_decrypt_key(key,
1822 EVP_CIPHER_CTX_key_length(ctx) * 4,
0f113f3e
MC
1823 &xctx->ks1.ks);
1824 xctx->xts.block1 = (block128_f) HWAES_decrypt;
46f047d7
AP
1825# ifdef HWAES_xts_decrypt
1826 xctx->stream = HWAES_xts_decrypt;
1827#endif
0f113f3e
MC
1828 }
1829
6435f0f6
RL
1830 HWAES_set_encrypt_key(key + EVP_CIPHER_CTX_key_length(ctx) / 2,
1831 EVP_CIPHER_CTX_key_length(ctx) * 4,
1832 &xctx->ks2.ks);
0f113f3e
MC
1833 xctx->xts.block2 = (block128_f) HWAES_encrypt;
1834
1835 xctx->xts.key1 = &xctx->ks1;
1836 break;
1837 } else
5158c763
MC
1838#endif
1839#ifdef BSAES_CAPABLE
0f113f3e
MC
1840 if (BSAES_CAPABLE)
1841 xctx->stream = enc ? bsaes_xts_encrypt : bsaes_xts_decrypt;
1842 else
5158c763
MC
1843#endif
1844#ifdef VPAES_CAPABLE
0f113f3e
MC
1845 if (VPAES_CAPABLE) {
1846 if (enc) {
6435f0f6
RL
1847 vpaes_set_encrypt_key(key,
1848 EVP_CIPHER_CTX_key_length(ctx) * 4,
0f113f3e
MC
1849 &xctx->ks1.ks);
1850 xctx->xts.block1 = (block128_f) vpaes_encrypt;
1851 } else {
6435f0f6
RL
1852 vpaes_set_decrypt_key(key,
1853 EVP_CIPHER_CTX_key_length(ctx) * 4,
0f113f3e
MC
1854 &xctx->ks1.ks);
1855 xctx->xts.block1 = (block128_f) vpaes_decrypt;
1856 }
1857
6435f0f6
RL
1858 vpaes_set_encrypt_key(key + EVP_CIPHER_CTX_key_length(ctx) / 2,
1859 EVP_CIPHER_CTX_key_length(ctx) * 4,
1860 &xctx->ks2.ks);
0f113f3e
MC
1861 xctx->xts.block2 = (block128_f) vpaes_encrypt;
1862
1863 xctx->xts.key1 = &xctx->ks1;
1864 break;
1865 } else
5158c763 1866#endif
0f113f3e
MC
1867 (void)0; /* terminate potentially open 'else' */
1868
1869 if (enc) {
6435f0f6
RL
1870 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 4,
1871 &xctx->ks1.ks);
0f113f3e
MC
1872 xctx->xts.block1 = (block128_f) AES_encrypt;
1873 } else {
6435f0f6
RL
1874 AES_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 4,
1875 &xctx->ks1.ks);
0f113f3e
MC
1876 xctx->xts.block1 = (block128_f) AES_decrypt;
1877 }
1878
6435f0f6
RL
1879 AES_set_encrypt_key(key + EVP_CIPHER_CTX_key_length(ctx) / 2,
1880 EVP_CIPHER_CTX_key_length(ctx) * 4,
1881 &xctx->ks2.ks);
0f113f3e
MC
1882 xctx->xts.block2 = (block128_f) AES_encrypt;
1883
1884 xctx->xts.key1 = &xctx->ks1;
1885 } while (0);
1886
1887 if (iv) {
1888 xctx->xts.key2 = &xctx->ks2;
6435f0f6 1889 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 16);
0f113f3e
MC
1890 }
1891
1892 return 1;
1893}
32a2d8dd 1894
17f121de 1895static int aes_xts_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
1896 const unsigned char *in, size_t len)
1897{
6435f0f6 1898 EVP_AES_XTS_CTX *xctx = EVP_C_DATA(EVP_AES_XTS_CTX,ctx);
0f113f3e
MC
1899 if (!xctx->xts.key1 || !xctx->xts.key2)
1900 return 0;
1901 if (!out || !in || len < AES_BLOCK_SIZE)
1902 return 0;
1903 if (xctx->stream)
1904 (*xctx->stream) (in, out, len,
6435f0f6
RL
1905 xctx->xts.key1, xctx->xts.key2,
1906 EVP_CIPHER_CTX_iv_noconst(ctx));
1907 else if (CRYPTO_xts128_encrypt(&xctx->xts, EVP_CIPHER_CTX_iv_noconst(ctx),
1908 in, out, len,
1909 EVP_CIPHER_CTX_encrypting(ctx)))
0f113f3e
MC
1910 return 0;
1911 return 1;
1912}
1913
5158c763 1914#define aes_xts_cleanup NULL
0f113f3e 1915
5158c763 1916#define XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
0f113f3e
MC
1917 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT \
1918 | EVP_CIPH_CUSTOM_COPY)
1919
1920BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, XTS_FLAGS)
1921 BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, XTS_FLAGS)
23916810
DSH
1922
1923static int aes_ccm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
0f113f3e 1924{
6435f0f6 1925 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,c);
0f113f3e
MC
1926 switch (type) {
1927 case EVP_CTRL_INIT:
1928 cctx->key_set = 0;
1929 cctx->iv_set = 0;
1930 cctx->L = 8;
1931 cctx->M = 12;
1932 cctx->tag_set = 0;
1933 cctx->len_set = 0;
e75c5a79
DSH
1934 cctx->tls_aad_len = -1;
1935 return 1;
1936
1937 case EVP_CTRL_AEAD_TLS1_AAD:
1938 /* Save the AAD for later use */
1939 if (arg != EVP_AEAD_TLS1_AAD_LEN)
1940 return 0;
6435f0f6 1941 memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
e75c5a79
DSH
1942 cctx->tls_aad_len = arg;
1943 {
6435f0f6
RL
1944 uint16_t len =
1945 EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] << 8
1946 | EVP_CIPHER_CTX_buf_noconst(c)[arg - 1];
e75c5a79
DSH
1947 /* Correct length for explicit IV */
1948 len -= EVP_CCM_TLS_EXPLICIT_IV_LEN;
1949 /* If decrypting correct for tag too */
6435f0f6 1950 if (!EVP_CIPHER_CTX_encrypting(c))
e75c5a79 1951 len -= cctx->M;
6435f0f6
RL
1952 EVP_CIPHER_CTX_buf_noconst(c)[arg - 2] = len >> 8;
1953 EVP_CIPHER_CTX_buf_noconst(c)[arg - 1] = len & 0xff;
e75c5a79
DSH
1954 }
1955 /* Extra padding: tag appended to record */
1956 return cctx->M;
1957
1958 case EVP_CTRL_CCM_SET_IV_FIXED:
1959 /* Sanity check length */
1960 if (arg != EVP_CCM_TLS_FIXED_IV_LEN)
1961 return 0;
1962 /* Just copy to first part of IV */
6435f0f6 1963 memcpy(EVP_CIPHER_CTX_iv_noconst(c), ptr, arg);
0f113f3e
MC
1964 return 1;
1965
e640fa02 1966 case EVP_CTRL_AEAD_SET_IVLEN:
0f113f3e
MC
1967 arg = 15 - arg;
1968 case EVP_CTRL_CCM_SET_L:
1969 if (arg < 2 || arg > 8)
1970 return 0;
1971 cctx->L = arg;
1972 return 1;
1973
e640fa02 1974 case EVP_CTRL_AEAD_SET_TAG:
0f113f3e
MC
1975 if ((arg & 1) || arg < 4 || arg > 16)
1976 return 0;
6435f0f6 1977 if (EVP_CIPHER_CTX_encrypting(c) && ptr)
0f113f3e
MC
1978 return 0;
1979 if (ptr) {
1980 cctx->tag_set = 1;
6435f0f6 1981 memcpy(EVP_CIPHER_CTX_buf_noconst(c), ptr, arg);
0f113f3e
MC
1982 }
1983 cctx->M = arg;
1984 return 1;
1985
e640fa02 1986 case EVP_CTRL_AEAD_GET_TAG:
6435f0f6 1987 if (!EVP_CIPHER_CTX_encrypting(c) || !cctx->tag_set)
0f113f3e
MC
1988 return 0;
1989 if (!CRYPTO_ccm128_tag(&cctx->ccm, ptr, (size_t)arg))
1990 return 0;
1991 cctx->tag_set = 0;
1992 cctx->iv_set = 0;
1993 cctx->len_set = 0;
1994 return 1;
1995
1996 case EVP_CTRL_COPY:
1997 {
1998 EVP_CIPHER_CTX *out = ptr;
6435f0f6 1999 EVP_AES_CCM_CTX *cctx_out = EVP_C_DATA(EVP_AES_CCM_CTX,out);
0f113f3e
MC
2000 if (cctx->ccm.key) {
2001 if (cctx->ccm.key != &cctx->ks)
2002 return 0;
2003 cctx_out->ccm.key = &cctx_out->ks;
2004 }
2005 return 1;
2006 }
2007
2008 default:
2009 return -1;
2010
2011 }
2012}
23916810
DSH
2013
2014static int aes_ccm_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
2015 const unsigned char *iv, int enc)
2016{
6435f0f6 2017 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
0f113f3e
MC
2018 if (!iv && !key)
2019 return 1;
2020 if (key)
2021 do {
5158c763 2022#ifdef HWAES_CAPABLE
0f113f3e 2023 if (HWAES_CAPABLE) {
6435f0f6
RL
2024 HWAES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2025 &cctx->ks.ks);
0f113f3e
MC
2026
2027 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
2028 &cctx->ks, (block128_f) HWAES_encrypt);
2029 cctx->str = NULL;
2030 cctx->key_set = 1;
2031 break;
2032 } else
5158c763
MC
2033#endif
2034#ifdef VPAES_CAPABLE
0f113f3e 2035 if (VPAES_CAPABLE) {
6435f0f6
RL
2036 vpaes_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2037 &cctx->ks.ks);
0f113f3e
MC
2038 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
2039 &cctx->ks, (block128_f) vpaes_encrypt);
2040 cctx->str = NULL;
2041 cctx->key_set = 1;
2042 break;
2043 }
5158c763 2044#endif
6435f0f6
RL
2045 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2046 &cctx->ks.ks);
0f113f3e
MC
2047 CRYPTO_ccm128_init(&cctx->ccm, cctx->M, cctx->L,
2048 &cctx->ks, (block128_f) AES_encrypt);
2049 cctx->str = NULL;
2050 cctx->key_set = 1;
2051 } while (0);
2052 if (iv) {
6435f0f6 2053 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, 15 - cctx->L);
0f113f3e
MC
2054 cctx->iv_set = 1;
2055 }
2056 return 1;
2057}
23916810 2058
e75c5a79
DSH
2059static int aes_ccm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2060 const unsigned char *in, size_t len)
2061{
6435f0f6 2062 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
e75c5a79
DSH
2063 CCM128_CONTEXT *ccm = &cctx->ccm;
2064 /* Encrypt/decrypt must be performed in place */
2065 if (out != in || len < (EVP_CCM_TLS_EXPLICIT_IV_LEN + (size_t)cctx->M))
2066 return -1;
2067 /* If encrypting set explicit IV from sequence number (start of AAD) */
6435f0f6
RL
2068 if (EVP_CIPHER_CTX_encrypting(ctx))
2069 memcpy(out, EVP_CIPHER_CTX_buf_noconst(ctx),
2070 EVP_CCM_TLS_EXPLICIT_IV_LEN);
e75c5a79 2071 /* Get rest of IV from explicit IV */
6435f0f6
RL
2072 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx) + EVP_CCM_TLS_FIXED_IV_LEN, in,
2073 EVP_CCM_TLS_EXPLICIT_IV_LEN);
e75c5a79
DSH
2074 /* Correct length value */
2075 len -= EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->M;
6435f0f6
RL
2076 if (CRYPTO_ccm128_setiv(ccm, EVP_CIPHER_CTX_iv_noconst(ctx), 15 - cctx->L,
2077 len))
e75c5a79
DSH
2078 return -1;
2079 /* Use saved AAD */
6435f0f6 2080 CRYPTO_ccm128_aad(ccm, EVP_CIPHER_CTX_buf_noconst(ctx), cctx->tls_aad_len);
e75c5a79
DSH
2081 /* Fix buffer to point to payload */
2082 in += EVP_CCM_TLS_EXPLICIT_IV_LEN;
2083 out += EVP_CCM_TLS_EXPLICIT_IV_LEN;
6435f0f6 2084 if (EVP_CIPHER_CTX_encrypting(ctx)) {
e75c5a79
DSH
2085 if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
2086 cctx->str) :
2087 CRYPTO_ccm128_encrypt(ccm, in, out, len))
2088 return -1;
2089 if (!CRYPTO_ccm128_tag(ccm, out + len, cctx->M))
2090 return -1;
2091 return len + EVP_CCM_TLS_EXPLICIT_IV_LEN + cctx->M;
2092 } else {
2093 if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
2094 cctx->str) :
2095 !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
2096 unsigned char tag[16];
2097 if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
2098 if (!CRYPTO_memcmp(tag, in + len, cctx->M))
2099 return len;
2100 }
2101 }
2102 OPENSSL_cleanse(out, len);
2103 return -1;
2104 }
2105}
2106
17f121de 2107static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
2108 const unsigned char *in, size_t len)
2109{
6435f0f6 2110 EVP_AES_CCM_CTX *cctx = EVP_C_DATA(EVP_AES_CCM_CTX,ctx);
0f113f3e
MC
2111 CCM128_CONTEXT *ccm = &cctx->ccm;
2112 /* If not set up, return error */
e75c5a79
DSH
2113 if (!cctx->key_set)
2114 return -1;
2115
2116 if (cctx->tls_aad_len >= 0)
2117 return aes_ccm_tls_cipher(ctx, out, in, len);
2118
2119 if (!cctx->iv_set)
0f113f3e 2120 return -1;
e75c5a79 2121
6435f0f6 2122 if (!EVP_CIPHER_CTX_encrypting(ctx) && !cctx->tag_set)
0f113f3e
MC
2123 return -1;
2124 if (!out) {
2125 if (!in) {
6435f0f6
RL
2126 if (CRYPTO_ccm128_setiv(ccm, EVP_CIPHER_CTX_iv_noconst(ctx),
2127 15 - cctx->L, len))
0f113f3e
MC
2128 return -1;
2129 cctx->len_set = 1;
2130 return len;
2131 }
2132 /* If have AAD need message length */
2133 if (!cctx->len_set && len)
2134 return -1;
2135 CRYPTO_ccm128_aad(ccm, in, len);
2136 return len;
2137 }
2138 /* EVP_*Final() doesn't return any data */
2139 if (!in)
2140 return 0;
2141 /* If not set length yet do it */
2142 if (!cctx->len_set) {
6435f0f6
RL
2143 if (CRYPTO_ccm128_setiv(ccm, EVP_CIPHER_CTX_iv_noconst(ctx),
2144 15 - cctx->L, len))
0f113f3e
MC
2145 return -1;
2146 cctx->len_set = 1;
2147 }
6435f0f6 2148 if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
2149 if (cctx->str ? CRYPTO_ccm128_encrypt_ccm64(ccm, in, out, len,
2150 cctx->str) :
2151 CRYPTO_ccm128_encrypt(ccm, in, out, len))
2152 return -1;
2153 cctx->tag_set = 1;
2154 return len;
2155 } else {
2156 int rv = -1;
2157 if (cctx->str ? !CRYPTO_ccm128_decrypt_ccm64(ccm, in, out, len,
2158 cctx->str) :
2159 !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {
2160 unsigned char tag[16];
2161 if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) {
6435f0f6
RL
2162 if (!CRYPTO_memcmp(tag, EVP_CIPHER_CTX_buf_noconst(ctx),
2163 cctx->M))
0f113f3e
MC
2164 rv = len;
2165 }
2166 }
2167 if (rv == -1)
2168 OPENSSL_cleanse(out, len);
2169 cctx->iv_set = 0;
2170 cctx->tag_set = 0;
2171 cctx->len_set = 0;
2172 return rv;
2173 }
0f113f3e
MC
2174}
2175
5158c763 2176#define aes_ccm_cleanup NULL
0f113f3e 2177
e75c5a79
DSH
2178BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, ccm, CCM,
2179 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
2180 BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, ccm, CCM,
2181 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
2182 BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, ccm, CCM,
2183 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
0f113f3e
MC
2184
2185typedef struct {
2186 union {
2187 double align;
2188 AES_KEY ks;
2189 } ks;
2190 /* Indicates if IV has been set */
2191 unsigned char *iv;
2192} EVP_AES_WRAP_CTX;
97cf1f6c
DSH
2193
2194static int aes_wrap_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
2195 const unsigned char *iv, int enc)
2196{
6435f0f6 2197 EVP_AES_WRAP_CTX *wctx = EVP_C_DATA(EVP_AES_WRAP_CTX,ctx);
0f113f3e
MC
2198 if (!iv && !key)
2199 return 1;
2200 if (key) {
6435f0f6
RL
2201 if (EVP_CIPHER_CTX_encrypting(ctx))
2202 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2203 &wctx->ks.ks);
0f113f3e 2204 else
6435f0f6
RL
2205 AES_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2206 &wctx->ks.ks);
0f113f3e
MC
2207 if (!iv)
2208 wctx->iv = NULL;
2209 }
2210 if (iv) {
6435f0f6
RL
2211 memcpy(EVP_CIPHER_CTX_iv_noconst(ctx), iv, EVP_CIPHER_CTX_iv_length(ctx));
2212 wctx->iv = EVP_CIPHER_CTX_iv_noconst(ctx);
0f113f3e
MC
2213 }
2214 return 1;
2215}
97cf1f6c
DSH
2216
2217static int aes_wrap_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
2218 const unsigned char *in, size_t inlen)
2219{
6435f0f6 2220 EVP_AES_WRAP_CTX *wctx = EVP_C_DATA(EVP_AES_WRAP_CTX,ctx);
0f113f3e
MC
2221 size_t rv;
2222 /* AES wrap with padding has IV length of 4, without padding 8 */
2223 int pad = EVP_CIPHER_CTX_iv_length(ctx) == 4;
2224 /* No final operation so always return zero length */
2225 if (!in)
2226 return 0;
2227 /* Input length must always be non-zero */
2228 if (!inlen)
2229 return -1;
2230 /* If decrypting need at least 16 bytes and multiple of 8 */
6435f0f6 2231 if (!EVP_CIPHER_CTX_encrypting(ctx) && (inlen < 16 || inlen & 0x7))
0f113f3e
MC
2232 return -1;
2233 /* If not padding input must be multiple of 8 */
2234 if (!pad && inlen & 0x7)
2235 return -1;
2236 if (!out) {
6435f0f6 2237 if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
2238 /* If padding round up to multiple of 8 */
2239 if (pad)
2240 inlen = (inlen + 7) / 8 * 8;
2241 /* 8 byte prefix */
2242 return inlen + 8;
2243 } else {
2244 /*
2245 * If not padding output will be exactly 8 bytes smaller than
2246 * input. If padding it will be at least 8 bytes smaller but we
2247 * don't know how much.
2248 */
2249 return inlen - 8;
2250 }
2251 }
2252 if (pad) {
6435f0f6 2253 if (EVP_CIPHER_CTX_encrypting(ctx))
0f113f3e
MC
2254 rv = CRYPTO_128_wrap_pad(&wctx->ks.ks, wctx->iv,
2255 out, in, inlen,
2256 (block128_f) AES_encrypt);
2257 else
2258 rv = CRYPTO_128_unwrap_pad(&wctx->ks.ks, wctx->iv,
2259 out, in, inlen,
2260 (block128_f) AES_decrypt);
2261 } else {
6435f0f6 2262 if (EVP_CIPHER_CTX_encrypting(ctx))
0f113f3e
MC
2263 rv = CRYPTO_128_wrap(&wctx->ks.ks, wctx->iv,
2264 out, in, inlen, (block128_f) AES_encrypt);
2265 else
2266 rv = CRYPTO_128_unwrap(&wctx->ks.ks, wctx->iv,
2267 out, in, inlen, (block128_f) AES_decrypt);
2268 }
2269 return rv ? (int)rv : -1;
2270}
2271
5158c763 2272#define WRAP_FLAGS (EVP_CIPH_WRAP_MODE \
0f113f3e
MC
2273 | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
2274 | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1)
97cf1f6c
DSH
2275
2276static const EVP_CIPHER aes_128_wrap = {
0f113f3e
MC
2277 NID_id_aes128_wrap,
2278 8, 16, 8, WRAP_FLAGS,
2279 aes_wrap_init_key, aes_wrap_cipher,
2280 NULL,
2281 sizeof(EVP_AES_WRAP_CTX),
2282 NULL, NULL, NULL, NULL
2283};
97cf1f6c
DSH
2284
2285const EVP_CIPHER *EVP_aes_128_wrap(void)
0f113f3e
MC
2286{
2287 return &aes_128_wrap;
2288}
97cf1f6c
DSH
2289
2290static const EVP_CIPHER aes_192_wrap = {
0f113f3e
MC
2291 NID_id_aes192_wrap,
2292 8, 24, 8, WRAP_FLAGS,
2293 aes_wrap_init_key, aes_wrap_cipher,
2294 NULL,
2295 sizeof(EVP_AES_WRAP_CTX),
2296 NULL, NULL, NULL, NULL
2297};
97cf1f6c
DSH
2298
2299const EVP_CIPHER *EVP_aes_192_wrap(void)
0f113f3e
MC
2300{
2301 return &aes_192_wrap;
2302}
97cf1f6c
DSH
2303
2304static const EVP_CIPHER aes_256_wrap = {
0f113f3e
MC
2305 NID_id_aes256_wrap,
2306 8, 32, 8, WRAP_FLAGS,
2307 aes_wrap_init_key, aes_wrap_cipher,
2308 NULL,
2309 sizeof(EVP_AES_WRAP_CTX),
2310 NULL, NULL, NULL, NULL
2311};
97cf1f6c
DSH
2312
2313const EVP_CIPHER *EVP_aes_256_wrap(void)
0f113f3e
MC
2314{
2315 return &aes_256_wrap;
2316}
97cf1f6c 2317
d31fed73 2318static const EVP_CIPHER aes_128_wrap_pad = {
0f113f3e
MC
2319 NID_id_aes128_wrap_pad,
2320 8, 16, 4, WRAP_FLAGS,
2321 aes_wrap_init_key, aes_wrap_cipher,
2322 NULL,
2323 sizeof(EVP_AES_WRAP_CTX),
2324 NULL, NULL, NULL, NULL
2325};
d31fed73
DSH
2326
2327const EVP_CIPHER *EVP_aes_128_wrap_pad(void)
0f113f3e
MC
2328{
2329 return &aes_128_wrap_pad;
2330}
d31fed73
DSH
2331
2332static const EVP_CIPHER aes_192_wrap_pad = {
0f113f3e
MC
2333 NID_id_aes192_wrap_pad,
2334 8, 24, 4, WRAP_FLAGS,
2335 aes_wrap_init_key, aes_wrap_cipher,
2336 NULL,
2337 sizeof(EVP_AES_WRAP_CTX),
2338 NULL, NULL, NULL, NULL
2339};
d31fed73
DSH
2340
2341const EVP_CIPHER *EVP_aes_192_wrap_pad(void)
0f113f3e
MC
2342{
2343 return &aes_192_wrap_pad;
2344}
d31fed73
DSH
2345
2346static const EVP_CIPHER aes_256_wrap_pad = {
0f113f3e
MC
2347 NID_id_aes256_wrap_pad,
2348 8, 32, 4, WRAP_FLAGS,
2349 aes_wrap_init_key, aes_wrap_cipher,
2350 NULL,
2351 sizeof(EVP_AES_WRAP_CTX),
2352 NULL, NULL, NULL, NULL
2353};
d31fed73
DSH
2354
2355const EVP_CIPHER *EVP_aes_256_wrap_pad(void)
0f113f3e
MC
2356{
2357 return &aes_256_wrap_pad;
2358}
d31fed73 2359
5158c763 2360#ifndef OPENSSL_NO_OCB
e6b336ef 2361static int aes_ocb_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
0f113f3e 2362{
6435f0f6 2363 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,c);
0f113f3e
MC
2364 EVP_CIPHER_CTX *newc;
2365 EVP_AES_OCB_CTX *new_octx;
2366
2367 switch (type) {
2368 case EVP_CTRL_INIT:
2369 octx->key_set = 0;
2370 octx->iv_set = 0;
6435f0f6
RL
2371 octx->ivlen = EVP_CIPHER_CTX_iv_length(c);
2372 octx->iv = EVP_CIPHER_CTX_iv_noconst(c);
0f113f3e
MC
2373 octx->taglen = 16;
2374 octx->data_buf_len = 0;
2375 octx->aad_buf_len = 0;
2376 return 1;
2377
e640fa02 2378 case EVP_CTRL_AEAD_SET_IVLEN:
0f113f3e
MC
2379 /* IV len must be 1 to 15 */
2380 if (arg <= 0 || arg > 15)
2381 return 0;
2382
2383 octx->ivlen = arg;
2384 return 1;
2385
e640fa02 2386 case EVP_CTRL_AEAD_SET_TAG:
d57d135c
MC
2387 if (!ptr) {
2388 /* Tag len must be 0 to 16 */
2389 if (arg < 0 || arg > 16)
2390 return 0;
2391
2392 octx->taglen = arg;
2393 return 1;
2394 }
6435f0f6 2395 if (arg != octx->taglen || EVP_CIPHER_CTX_encrypting(c))
0f113f3e
MC
2396 return 0;
2397 memcpy(octx->tag, ptr, arg);
2398 return 1;
2399
e640fa02 2400 case EVP_CTRL_AEAD_GET_TAG:
6435f0f6 2401 if (arg != octx->taglen || !EVP_CIPHER_CTX_encrypting(c))
0f113f3e
MC
2402 return 0;
2403
2404 memcpy(ptr, octx->tag, arg);
2405 return 1;
2406
2407 case EVP_CTRL_COPY:
2408 newc = (EVP_CIPHER_CTX *)ptr;
6435f0f6 2409 new_octx = EVP_C_DATA(EVP_AES_OCB_CTX,newc);
0f113f3e 2410 return CRYPTO_ocb128_copy_ctx(&new_octx->ocb, &octx->ocb,
bdc985b1
AP
2411 &new_octx->ksenc.ks,
2412 &new_octx->ksdec.ks);
0f113f3e
MC
2413
2414 default:
2415 return -1;
2416
2417 }
2418}
e6b336ef 2419
5158c763
MC
2420# ifdef HWAES_CAPABLE
2421# ifdef HWAES_ocb_encrypt
02dc0b82
AP
2422void HWAES_ocb_encrypt(const unsigned char *in, unsigned char *out,
2423 size_t blocks, const void *key,
2424 size_t start_block_num,
2425 unsigned char offset_i[16],
2426 const unsigned char L_[][16],
2427 unsigned char checksum[16]);
5158c763 2428# else
365f95ad 2429# define HWAES_ocb_encrypt ((ocb128_f)NULL)
5158c763
MC
2430# endif
2431# ifdef HWAES_ocb_decrypt
02dc0b82
AP
2432void HWAES_ocb_decrypt(const unsigned char *in, unsigned char *out,
2433 size_t blocks, const void *key,
2434 size_t start_block_num,
2435 unsigned char offset_i[16],
2436 const unsigned char L_[][16],
2437 unsigned char checksum[16]);
5158c763 2438# else
365f95ad 2439# define HWAES_ocb_decrypt ((ocb128_f)NULL)
02dc0b82 2440# endif
5158c763 2441# endif
02dc0b82 2442
e6b336ef 2443static int aes_ocb_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
0f113f3e
MC
2444 const unsigned char *iv, int enc)
2445{
6435f0f6 2446 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
0f113f3e
MC
2447 if (!iv && !key)
2448 return 1;
2449 if (key) {
2450 do {
2451 /*
2452 * We set both the encrypt and decrypt key here because decrypt
2453 * needs both. We could possibly optimise to remove setting the
2454 * decrypt for an encryption operation.
2455 */
5158c763 2456# ifdef HWAES_CAPABLE
02dc0b82 2457 if (HWAES_CAPABLE) {
6435f0f6
RL
2458 HWAES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2459 &octx->ksenc.ks);
2460 HWAES_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2461 &octx->ksdec.ks);
02dc0b82
AP
2462 if (!CRYPTO_ocb128_init(&octx->ocb,
2463 &octx->ksenc.ks, &octx->ksdec.ks,
2464 (block128_f) HWAES_encrypt,
2465 (block128_f) HWAES_decrypt,
2466 enc ? HWAES_ocb_encrypt
2467 : HWAES_ocb_decrypt))
2468 return 0;
2469 break;
2470 }
5158c763
MC
2471# endif
2472# ifdef VPAES_CAPABLE
0f113f3e 2473 if (VPAES_CAPABLE) {
6435f0f6
RL
2474 vpaes_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2475 &octx->ksenc.ks);
2476 vpaes_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2477 &octx->ksdec.ks);
bdc985b1
AP
2478 if (!CRYPTO_ocb128_init(&octx->ocb,
2479 &octx->ksenc.ks, &octx->ksdec.ks,
2480 (block128_f) vpaes_encrypt,
bd30091c
AP
2481 (block128_f) vpaes_decrypt,
2482 NULL))
0f113f3e
MC
2483 return 0;
2484 break;
2485 }
5158c763 2486# endif
6435f0f6
RL
2487 AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2488 &octx->ksenc.ks);
2489 AES_set_decrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8,
2490 &octx->ksdec.ks);
bdc985b1
AP
2491 if (!CRYPTO_ocb128_init(&octx->ocb,
2492 &octx->ksenc.ks, &octx->ksdec.ks,
0f113f3e 2493 (block128_f) AES_encrypt,
bd30091c
AP
2494 (block128_f) AES_decrypt,
2495 NULL))
0f113f3e
MC
2496 return 0;
2497 }
2498 while (0);
2499
2500 /*
2501 * If we have an iv we can set it directly, otherwise use saved IV.
2502 */
2503 if (iv == NULL && octx->iv_set)
2504 iv = octx->iv;
2505 if (iv) {
2506 if (CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen)
2507 != 1)
2508 return 0;
2509 octx->iv_set = 1;
2510 }
2511 octx->key_set = 1;
2512 } else {
2513 /* If key set use IV, otherwise copy */
2514 if (octx->key_set)
2515 CRYPTO_ocb128_setiv(&octx->ocb, iv, octx->ivlen, octx->taglen);
2516 else
2517 memcpy(octx->iv, iv, octx->ivlen);
2518 octx->iv_set = 1;
2519 }
2520 return 1;
2521}
e6b336ef
MC
2522
2523static int aes_ocb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
0f113f3e
MC
2524 const unsigned char *in, size_t len)
2525{
2526 unsigned char *buf;
2527 int *buf_len;
2528 int written_len = 0;
2529 size_t trailing_len;
6435f0f6 2530 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,ctx);
0f113f3e
MC
2531
2532 /* If IV or Key not set then return error */
2533 if (!octx->iv_set)
2534 return -1;
2535
2536 if (!octx->key_set)
2537 return -1;
2538
0ba5a9ea 2539 if (in != NULL) {
0f113f3e
MC
2540 /*
2541 * Need to ensure we are only passing full blocks to low level OCB
2542 * routines. We do it here rather than in EVP_EncryptUpdate/
2543 * EVP_DecryptUpdate because we need to pass full blocks of AAD too
2544 * and those routines don't support that
2545 */
2546
2547 /* Are we dealing with AAD or normal data here? */
2548 if (out == NULL) {
2549 buf = octx->aad_buf;
2550 buf_len = &(octx->aad_buf_len);
2551 } else {
2552 buf = octx->data_buf;
2553 buf_len = &(octx->data_buf_len);
2554 }
2555
2556 /*
2557 * If we've got a partially filled buffer from a previous call then
2558 * use that data first
2559 */
0ba5a9ea 2560 if (*buf_len > 0) {
0f113f3e
MC
2561 unsigned int remaining;
2562
0ba5a9ea 2563 remaining = AES_BLOCK_SIZE - (*buf_len);
0f113f3e
MC
2564 if (remaining > len) {
2565 memcpy(buf + (*buf_len), in, len);
2566 *(buf_len) += len;
2567 return 0;
2568 }
2569 memcpy(buf + (*buf_len), in, remaining);
2570
2571 /*
2572 * If we get here we've filled the buffer, so process it
2573 */
2574 len -= remaining;
2575 in += remaining;
2576 if (out == NULL) {
0ba5a9ea 2577 if (!CRYPTO_ocb128_aad(&octx->ocb, buf, AES_BLOCK_SIZE))
0f113f3e 2578 return -1;
6435f0f6 2579 } else if (EVP_CIPHER_CTX_encrypting(ctx)) {
0ba5a9ea
MC
2580 if (!CRYPTO_ocb128_encrypt(&octx->ocb, buf, out,
2581 AES_BLOCK_SIZE))
0f113f3e
MC
2582 return -1;
2583 } else {
0ba5a9ea
MC
2584 if (!CRYPTO_ocb128_decrypt(&octx->ocb, buf, out,
2585 AES_BLOCK_SIZE))
0f113f3e
MC
2586 return -1;
2587 }
0ba5a9ea 2588 written_len = AES_BLOCK_SIZE;
0f113f3e
MC
2589 *buf_len = 0;
2590 }
2591
2592 /* Do we have a partial block to handle at the end? */
0ba5a9ea 2593 trailing_len = len % AES_BLOCK_SIZE;
0f113f3e
MC
2594
2595 /*
2596 * If we've got some full blocks to handle, then process these first
2597 */
2598 if (len != trailing_len) {
2599 if (out == NULL) {
2600 if (!CRYPTO_ocb128_aad(&octx->ocb, in, len - trailing_len))
2601 return -1;
6435f0f6 2602 } else if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
2603 if (!CRYPTO_ocb128_encrypt
2604 (&octx->ocb, in, out, len - trailing_len))
2605 return -1;
2606 } else {
2607 if (!CRYPTO_ocb128_decrypt
2608 (&octx->ocb, in, out, len - trailing_len))
2609 return -1;
2610 }
2611 written_len += len - trailing_len;
2612 in += len - trailing_len;
2613 }
2614
2615 /* Handle any trailing partial block */
0ba5a9ea 2616 if (trailing_len > 0) {
0f113f3e
MC
2617 memcpy(buf, in, trailing_len);
2618 *buf_len = trailing_len;
2619 }
2620
2621 return written_len;
2622 } else {
2623 /*
2624 * First of all empty the buffer of any partial block that we might
2625 * have been provided - both for data and AAD
2626 */
0ba5a9ea 2627 if (octx->data_buf_len > 0) {
6435f0f6 2628 if (EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
2629 if (!CRYPTO_ocb128_encrypt(&octx->ocb, octx->data_buf, out,
2630 octx->data_buf_len))
2631 return -1;
2632 } else {
2633 if (!CRYPTO_ocb128_decrypt(&octx->ocb, octx->data_buf, out,
2634 octx->data_buf_len))
2635 return -1;
2636 }
2637 written_len = octx->data_buf_len;
2638 octx->data_buf_len = 0;
2639 }
0ba5a9ea 2640 if (octx->aad_buf_len > 0) {
0f113f3e
MC
2641 if (!CRYPTO_ocb128_aad
2642 (&octx->ocb, octx->aad_buf, octx->aad_buf_len))
2643 return -1;
2644 octx->aad_buf_len = 0;
2645 }
2646 /* If decrypting then verify */
6435f0f6 2647 if (!EVP_CIPHER_CTX_encrypting(ctx)) {
0f113f3e
MC
2648 if (octx->taglen < 0)
2649 return -1;
2650 if (CRYPTO_ocb128_finish(&octx->ocb,
2651 octx->tag, octx->taglen) != 0)
2652 return -1;
2653 octx->iv_set = 0;
2654 return written_len;
2655 }
2656 /* If encrypting then just get the tag */
2657 if (CRYPTO_ocb128_tag(&octx->ocb, octx->tag, 16) != 1)
2658 return -1;
2659 /* Don't reuse the IV */
2660 octx->iv_set = 0;
2661 return written_len;
2662 }
2663}
e6b336ef
MC
2664
2665static int aes_ocb_cleanup(EVP_CIPHER_CTX *c)
0f113f3e 2666{
6435f0f6 2667 EVP_AES_OCB_CTX *octx = EVP_C_DATA(EVP_AES_OCB_CTX,c);
0f113f3e
MC
2668 CRYPTO_ocb128_cleanup(&octx->ocb);
2669 return 1;
2670}
e6b336ef 2671
c4aede20
MC
2672BLOCK_CIPHER_custom(NID_aes, 128, 16, 12, ocb, OCB,
2673 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
2674BLOCK_CIPHER_custom(NID_aes, 192, 16, 12, ocb, OCB,
2675 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
2676BLOCK_CIPHER_custom(NID_aes, 256, 16, 12, ocb, OCB,
2677 EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
5158c763 2678#endif /* OPENSSL_NO_OCB */