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 (at) 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 #include <openssl/aead.h> 50 #include <openssl/aes.h> 51 #include <openssl/cipher.h> 52 #include <openssl/cpu.h> 53 #include <openssl/err.h> 54 #include <openssl/mem.h> 55 #include <openssl/modes.h> 56 #include <openssl/obj.h> 57 #include <openssl/rand.h> 58 59 #include "internal.h" 60 #include "../modes/internal.h" 61 62 63 typedef struct { 64 union { 65 double align; 66 AES_KEY ks; 67 } ks; 68 block128_f block; 69 union { 70 cbc128_f cbc; 71 ctr128_f ctr; 72 } stream; 73 } EVP_AES_KEY; 74 75 typedef struct { 76 union { 77 double align; 78 AES_KEY ks; 79 } 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 uint8_t *iv; /* Temporary IV store */ 84 int ivlen; /* IV length */ 85 int taglen; 86 int iv_gen; /* It is OK to generate IVs */ 87 ctr128_f ctr; 88 } EVP_AES_GCM_CTX; 89 90 #if !defined(OPENSSL_NO_ASM) && \ 91 (defined(OPENSSL_X86_64) || defined(OPENSSL_X86)) 92 #define VPAES 93 extern unsigned int OPENSSL_ia32cap_P[]; 94 95 static char vpaes_capable(void) { 96 return (OPENSSL_ia32cap_P[1] & (1 << (41 - 32))) != 0; 97 } 98 99 #if defined(OPENSSL_X86_64) 100 #define BSAES 101 static char bsaes_capable(void) { 102 return vpaes_capable(); 103 } 104 #endif 105 106 #elif !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) 107 #include "../arm_arch.h" 108 #if __ARM_ARCH__ >= 7 109 #define BSAES 110 static char bsaes_capable(void) { 111 return CRYPTO_is_NEON_capable(); 112 } 113 #endif /* __ARM_ARCH__ >= 7 */ 114 #endif /* OPENSSL_ARM */ 115 116 #if defined(BSAES) 117 /* On platforms where BSAES gets defined (just above), then these functions are 118 * provided by asm. */ 119 void bsaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 120 const AES_KEY *key, uint8_t ivec[16], int enc); 121 void bsaes_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, 122 const AES_KEY *key, const uint8_t ivec[16]); 123 #else 124 static char bsaes_capable(void) { 125 return 0; 126 } 127 128 /* On other platforms, bsaes_capable() will always return false and so the 129 * following will never be called. */ 130 void bsaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 131 const AES_KEY *key, uint8_t ivec[16], int enc) { 132 abort(); 133 } 134 135 void bsaes_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t len, 136 const AES_KEY *key, const uint8_t ivec[16]) { 137 abort(); 138 } 139 #endif 140 141 #if defined(VPAES) 142 /* On platforms where VPAES gets defined (just above), then these functions are 143 * provided by asm. */ 144 int vpaes_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key); 145 int vpaes_set_decrypt_key(const uint8_t *userKey, int bits, AES_KEY *key); 146 147 void vpaes_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 148 void vpaes_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 149 150 void vpaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 151 const AES_KEY *key, uint8_t *ivec, int enc); 152 #else 153 static char vpaes_capable(void) { 154 return 0; 155 } 156 157 /* On other platforms, vpaes_capable() will always return false and so the 158 * following will never be called. */ 159 int vpaes_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key) { 160 abort(); 161 } 162 int vpaes_set_decrypt_key(const uint8_t *userKey, int bits, AES_KEY *key) { 163 abort(); 164 } 165 void vpaes_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { 166 abort(); 167 } 168 void vpaes_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { 169 abort(); 170 } 171 void vpaes_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 172 const AES_KEY *key, uint8_t *ivec, int enc) { 173 abort(); 174 } 175 #endif 176 177 #if !defined(OPENSSL_NO_ASM) && \ 178 (defined(OPENSSL_X86_64) || defined(OPENSSL_X86)) 179 int aesni_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key); 180 int aesni_set_decrypt_key(const uint8_t *userKey, int bits, AES_KEY *key); 181 182 void aesni_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 183 void aesni_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key); 184 185 void aesni_ecb_encrypt(const uint8_t *in, uint8_t *out, size_t length, 186 const AES_KEY *key, int enc); 187 void aesni_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t length, 188 const AES_KEY *key, uint8_t *ivec, int enc); 189 190 void aesni_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t blocks, 191 const void *key, const uint8_t *ivec); 192 193 #if defined(OPENSSL_X86_64) 194 size_t aesni_gcm_encrypt(const uint8_t *in, uint8_t *out, size_t len, 195 const void *key, uint8_t ivec[16], uint64_t *Xi); 196 #define AES_gcm_encrypt aesni_gcm_encrypt 197 size_t aesni_gcm_decrypt(const uint8_t *in, uint8_t *out, size_t len, 198 const void *key, uint8_t ivec[16], uint64_t *Xi); 199 #define AES_gcm_decrypt aesni_gcm_decrypt 200 void gcm_ghash_avx(uint64_t Xi[2], const u128 Htable[16], const uint8_t *in, 201 size_t len); 202 #define AES_GCM_ASM(gctx) \ 203 (gctx->ctr == aesni_ctr32_encrypt_blocks && gctx->gcm.ghash == gcm_ghash_avx) 204 #endif /* OPENSSL_X86_64 */ 205 206 #else 207 208 /* On other platforms, aesni_capable() will always return false and so the 209 * following will never be called. */ 210 void aesni_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) { 211 abort(); 212 } 213 int aesni_set_encrypt_key(const uint8_t *userKey, int bits, AES_KEY *key) { 214 abort(); 215 } 216 void aesni_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t blocks, 217 const void *key, const uint8_t *ivec) { 218 abort(); 219 } 220 221 #endif 222 223 static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, 224 const uint8_t *iv, int enc) { 225 int ret, mode; 226 EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; 227 228 mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK; 229 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) { 230 if (bsaes_capable() && mode == EVP_CIPH_CBC_MODE) { 231 ret = AES_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 232 dat->block = (block128_f)AES_decrypt; 233 dat->stream.cbc = (cbc128_f)bsaes_cbc_encrypt; 234 } else if (vpaes_capable()) { 235 ret = vpaes_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 236 dat->block = (block128_f)vpaes_decrypt; 237 dat->stream.cbc = 238 mode == EVP_CIPH_CBC_MODE ? (cbc128_f)vpaes_cbc_encrypt : NULL; 239 } else { 240 ret = AES_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 241 dat->block = (block128_f)AES_decrypt; 242 dat->stream.cbc = 243 mode == EVP_CIPH_CBC_MODE ? (cbc128_f)AES_cbc_encrypt : NULL; 244 } 245 } else if (bsaes_capable() && mode == EVP_CIPH_CTR_MODE) { 246 ret = AES_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 247 dat->block = (block128_f)AES_encrypt; 248 dat->stream.ctr = (ctr128_f)bsaes_ctr32_encrypt_blocks; 249 } else if (vpaes_capable()) { 250 ret = vpaes_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 251 dat->block = (block128_f)vpaes_encrypt; 252 dat->stream.cbc = 253 mode == EVP_CIPH_CBC_MODE ? (cbc128_f)vpaes_cbc_encrypt : NULL; 254 } else { 255 ret = AES_set_encrypt_key(key, ctx->key_len * 8, &dat->ks.ks); 256 dat->block = (block128_f)AES_encrypt; 257 dat->stream.cbc = 258 mode == EVP_CIPH_CBC_MODE ? (cbc128_f)AES_cbc_encrypt : NULL; 259 } 260 261 if (ret < 0) { 262 OPENSSL_PUT_ERROR(CIPHER, aes_init_key, CIPHER_R_AES_KEY_SETUP_FAILED); 263 return 0; 264 } 265 266 return 1; 267 } 268 269 static int aes_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 270 const unsigned char *in, size_t len) { 271 EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; 272 273 if (dat->stream.cbc) { 274 (*dat->stream.cbc)(in, out, len, &dat->ks, ctx->iv, ctx->encrypt); 275 } else if (ctx->encrypt) { 276 CRYPTO_cbc128_encrypt(in, out, len, &dat->ks, ctx->iv, dat->block); 277 } else { 278 CRYPTO_cbc128_decrypt(in, out, len, &dat->ks, ctx->iv, dat->block); 279 } 280 281 return 1; 282 } 283 284 static int aes_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 285 const unsigned char *in, size_t len) { 286 size_t bl = ctx->cipher->block_size; 287 size_t i; 288 EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; 289 290 if (len < bl) { 291 return 1; 292 } 293 294 for (i = 0, len -= bl; i <= len; i += bl) { 295 (*dat->block)(in + i, out + i, &dat->ks); 296 } 297 298 return 1; 299 } 300 301 static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 302 const unsigned char *in, size_t len) { 303 unsigned int num = ctx->num; 304 EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; 305 306 if (dat->stream.ctr) { 307 CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks, ctx->iv, ctx->buf, &num, 308 dat->stream.ctr); 309 } else { 310 CRYPTO_ctr128_encrypt(in, out, len, &dat->ks, ctx->iv, ctx->buf, &num, 311 dat->block); 312 } 313 ctx->num = (size_t)num; 314 return 1; 315 } 316 317 static ctr128_f aes_gcm_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx, 318 const uint8_t *key, size_t key_len) { 319 if (bsaes_capable()) { 320 AES_set_encrypt_key(key, key_len * 8, aes_key); 321 CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt); 322 return (ctr128_f)bsaes_ctr32_encrypt_blocks; 323 } 324 325 if (vpaes_capable()) { 326 vpaes_set_encrypt_key(key, key_len * 8, aes_key); 327 CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)vpaes_encrypt); 328 return NULL; 329 } 330 331 AES_set_encrypt_key(key, key_len * 8, aes_key); 332 CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt); 333 return NULL; 334 } 335 336 static int aes_gcm_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, 337 const uint8_t *iv, int enc) { 338 EVP_AES_GCM_CTX *gctx = ctx->cipher_data; 339 if (!iv && !key) { 340 return 1; 341 } 342 if (key) { 343 gctx->ctr = aes_gcm_set_key(&gctx->ks.ks, &gctx->gcm, key, ctx->key_len); 344 /* If we have an iv can set it directly, otherwise use saved IV. */ 345 if (iv == NULL && gctx->iv_set) { 346 iv = gctx->iv; 347 } 348 if (iv) { 349 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen); 350 gctx->iv_set = 1; 351 } 352 gctx->key_set = 1; 353 } else { 354 /* If key set use IV, otherwise copy */ 355 if (gctx->key_set) { 356 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen); 357 } else { 358 memcpy(gctx->iv, iv, gctx->ivlen); 359 } 360 gctx->iv_set = 1; 361 gctx->iv_gen = 0; 362 } 363 return 1; 364 } 365 366 static int aes_gcm_cleanup(EVP_CIPHER_CTX *c) { 367 EVP_AES_GCM_CTX *gctx = c->cipher_data; 368 OPENSSL_cleanse(&gctx->gcm, sizeof(gctx->gcm)); 369 if (gctx->iv != c->iv) { 370 OPENSSL_free(gctx->iv); 371 } 372 return 1; 373 } 374 375 /* increment counter (64-bit int) by 1 */ 376 static void ctr64_inc(uint8_t *counter) { 377 int n = 8; 378 uint8_t c; 379 380 do { 381 --n; 382 c = counter[n]; 383 ++c; 384 counter[n] = c; 385 if (c) { 386 return; 387 } 388 } while (n); 389 } 390 391 static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) { 392 EVP_AES_GCM_CTX *gctx = c->cipher_data; 393 switch (type) { 394 case EVP_CTRL_INIT: 395 gctx->key_set = 0; 396 gctx->iv_set = 0; 397 gctx->ivlen = c->cipher->iv_len; 398 gctx->iv = c->iv; 399 gctx->taglen = -1; 400 gctx->iv_gen = 0; 401 return 1; 402 403 case EVP_CTRL_GCM_SET_IVLEN: 404 if (arg <= 0) { 405 return 0; 406 } 407 408 /* Allocate memory for IV if needed */ 409 if (arg > EVP_MAX_IV_LENGTH && arg > gctx->ivlen) { 410 if (gctx->iv != c->iv) { 411 OPENSSL_free(gctx->iv); 412 } 413 gctx->iv = OPENSSL_malloc(arg); 414 if (!gctx->iv) { 415 return 0; 416 } 417 } 418 gctx->ivlen = arg; 419 return 1; 420 421 case EVP_CTRL_GCM_SET_TAG: 422 if (arg <= 0 || arg > 16 || c->encrypt) { 423 return 0; 424 } 425 memcpy(c->buf, ptr, arg); 426 gctx->taglen = arg; 427 return 1; 428 429 case EVP_CTRL_GCM_GET_TAG: 430 if (arg <= 0 || arg > 16 || !c->encrypt || gctx->taglen < 0) { 431 return 0; 432 } 433 memcpy(ptr, c->buf, arg); 434 return 1; 435 436 case EVP_CTRL_GCM_SET_IV_FIXED: 437 /* Special case: -1 length restores whole IV */ 438 if (arg == -1) { 439 memcpy(gctx->iv, ptr, gctx->ivlen); 440 gctx->iv_gen = 1; 441 return 1; 442 } 443 /* Fixed field must be at least 4 bytes and invocation field 444 * at least 8. */ 445 if (arg < 4 || (gctx->ivlen - arg) < 8) { 446 return 0; 447 } 448 if (arg) { 449 memcpy(gctx->iv, ptr, arg); 450 } 451 if (c->encrypt && 452 RAND_pseudo_bytes(gctx->iv + arg, gctx->ivlen - arg) <= 0) { 453 return 0; 454 } 455 gctx->iv_gen = 1; 456 return 1; 457 458 case EVP_CTRL_GCM_IV_GEN: 459 if (gctx->iv_gen == 0 || gctx->key_set == 0) { 460 return 0; 461 } 462 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen); 463 if (arg <= 0 || arg > gctx->ivlen) { 464 arg = gctx->ivlen; 465 } 466 memcpy(ptr, gctx->iv + gctx->ivlen - arg, arg); 467 /* Invocation field will be at least 8 bytes in size and 468 * so no need to check wrap around or increment more than 469 * last 8 bytes. */ 470 ctr64_inc(gctx->iv + gctx->ivlen - 8); 471 gctx->iv_set = 1; 472 return 1; 473 474 case EVP_CTRL_GCM_SET_IV_INV: 475 if (gctx->iv_gen == 0 || gctx->key_set == 0 || c->encrypt) { 476 return 0; 477 } 478 memcpy(gctx->iv + gctx->ivlen - arg, ptr, arg); 479 CRYPTO_gcm128_setiv(&gctx->gcm, gctx->iv, gctx->ivlen); 480 gctx->iv_set = 1; 481 return 1; 482 483 case EVP_CTRL_COPY: { 484 EVP_CIPHER_CTX *out = ptr; 485 EVP_AES_GCM_CTX *gctx_out = out->cipher_data; 486 if (gctx->gcm.key) { 487 if (gctx->gcm.key != &gctx->ks) { 488 return 0; 489 } 490 gctx_out->gcm.key = &gctx_out->ks; 491 } 492 if (gctx->iv == c->iv) { 493 gctx_out->iv = out->iv; 494 } else { 495 gctx_out->iv = OPENSSL_malloc(gctx->ivlen); 496 if (!gctx_out->iv) { 497 return 0; 498 } 499 memcpy(gctx_out->iv, gctx->iv, gctx->ivlen); 500 } 501 return 1; 502 } 503 504 default: 505 return -1; 506 } 507 } 508 509 static int aes_gcm_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, 510 size_t len) { 511 EVP_AES_GCM_CTX *gctx = ctx->cipher_data; 512 513 /* If not set up, return error */ 514 if (!gctx->key_set) { 515 return -1; 516 } 517 if (!gctx->iv_set) { 518 return -1; 519 } 520 521 if (in) { 522 if (out == NULL) { 523 if (!CRYPTO_gcm128_aad(&gctx->gcm, in, len)) { 524 return -1; 525 } 526 } else if (ctx->encrypt) { 527 if (gctx->ctr) { 528 size_t bulk = 0; 529 #if defined(AES_GCM_ASM) 530 if (len >= 32 && AES_GCM_ASM(gctx)) { 531 size_t res = (16 - gctx->gcm.mres) % 16; 532 533 if (!CRYPTO_gcm128_encrypt(&gctx->gcm, in, out, res)) { 534 return -1; 535 } 536 537 bulk = AES_gcm_encrypt(in + res, out + res, len - res, gctx->gcm.key, 538 gctx->gcm.Yi.c, gctx->gcm.Xi.u); 539 gctx->gcm.len.u[1] += bulk; 540 bulk += res; 541 } 542 #endif 543 if (!CRYPTO_gcm128_encrypt_ctr32(&gctx->gcm, in + bulk, out + bulk, 544 len - bulk, gctx->ctr)) { 545 return -1; 546 } 547 } else { 548 size_t bulk = 0; 549 if (!CRYPTO_gcm128_encrypt(&gctx->gcm, in + bulk, out + bulk, 550 len - bulk)) { 551 return -1; 552 } 553 } 554 } else { 555 if (gctx->ctr) { 556 size_t bulk = 0; 557 #if defined(AES_GCM_ASM) 558 if (len >= 16 && AES_GCM_ASM(gctx)) { 559 size_t res = (16 - gctx->gcm.mres) % 16; 560 561 if (!CRYPTO_gcm128_decrypt(&gctx->gcm, in, out, res)) { 562 return -1; 563 } 564 565 bulk = AES_gcm_decrypt(in + res, out + res, len - res, gctx->gcm.key, 566 gctx->gcm.Yi.c, gctx->gcm.Xi.u); 567 gctx->gcm.len.u[1] += bulk; 568 bulk += res; 569 } 570 #endif 571 if (!CRYPTO_gcm128_decrypt_ctr32(&gctx->gcm, in + bulk, out + bulk, 572 len - bulk, gctx->ctr)) { 573 return -1; 574 } 575 } else { 576 size_t bulk = 0; 577 if (!CRYPTO_gcm128_decrypt(&gctx->gcm, in + bulk, out + bulk, 578 len - bulk)) { 579 return -1; 580 } 581 } 582 } 583 return len; 584 } else { 585 if (!ctx->encrypt) { 586 if (gctx->taglen < 0 || 587 !CRYPTO_gcm128_finish(&gctx->gcm, ctx->buf, gctx->taglen) != 0) { 588 return -1; 589 } 590 gctx->iv_set = 0; 591 return 0; 592 } 593 CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, 16); 594 gctx->taglen = 16; 595 /* Don't reuse the IV */ 596 gctx->iv_set = 0; 597 return 0; 598 } 599 } 600 601 static const EVP_CIPHER aes_128_cbc = { 602 NID_aes_128_cbc, 16 /* block_size */, 16 /* key_size */, 603 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, 604 NULL /* app_data */, aes_init_key, aes_cbc_cipher, 605 NULL /* cleanup */, NULL /* ctrl */}; 606 607 static const EVP_CIPHER aes_128_ctr = { 608 NID_aes_128_ctr, 1 /* block_size */, 16 /* key_size */, 609 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, 610 NULL /* app_data */, aes_init_key, aes_ctr_cipher, 611 NULL /* cleanup */, NULL /* ctrl */}; 612 613 static const EVP_CIPHER aes_128_ecb = { 614 NID_aes_128_ecb, 16 /* block_size */, 16 /* key_size */, 615 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, 616 NULL /* app_data */, aes_init_key, aes_ecb_cipher, 617 NULL /* cleanup */, NULL /* ctrl */}; 618 619 static const EVP_CIPHER aes_128_gcm = { 620 NID_aes_128_gcm, 1 /* block_size */, 16 /* key_size */, 12 /* iv_len */, 621 sizeof(EVP_AES_GCM_CTX), 622 EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | 623 EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | 624 EVP_CIPH_FLAG_AEAD_CIPHER, 625 NULL /* app_data */, aes_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, 626 aes_gcm_ctrl}; 627 628 629 static const EVP_CIPHER aes_256_cbc = { 630 NID_aes_128_cbc, 16 /* block_size */, 32 /* key_size */, 631 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, 632 NULL /* app_data */, aes_init_key, aes_cbc_cipher, 633 NULL /* cleanup */, NULL /* ctrl */}; 634 635 static const EVP_CIPHER aes_256_ctr = { 636 NID_aes_128_ctr, 1 /* block_size */, 32 /* key_size */, 637 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, 638 NULL /* app_data */, aes_init_key, aes_ctr_cipher, 639 NULL /* cleanup */, NULL /* ctrl */}; 640 641 static const EVP_CIPHER aes_256_ecb = { 642 NID_aes_128_ecb, 16 /* block_size */, 32 /* key_size */, 643 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, 644 NULL /* app_data */, aes_init_key, aes_ecb_cipher, 645 NULL /* cleanup */, NULL /* ctrl */}; 646 647 static const EVP_CIPHER aes_256_gcm = { 648 NID_aes_128_gcm, 1 /* block_size */, 32 /* key_size */, 12 /* iv_len */, 649 sizeof(EVP_AES_GCM_CTX), 650 EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | 651 EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | 652 EVP_CIPH_FLAG_AEAD_CIPHER, 653 NULL /* app_data */, aes_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, 654 aes_gcm_ctrl}; 655 656 #if !defined(OPENSSL_NO_ASM) && \ 657 (defined(OPENSSL_X86_64) || defined(OPENSSL_X86)) 658 659 /* AES-NI section. */ 660 661 static char aesni_capable(void) { 662 return (OPENSSL_ia32cap_P[1] & (1 << (57 - 32))) != 0; 663 } 664 665 static int aesni_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, 666 const uint8_t *iv, int enc) { 667 int ret, mode; 668 EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; 669 670 mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK; 671 if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) { 672 ret = aesni_set_decrypt_key(key, ctx->key_len * 8, ctx->cipher_data); 673 dat->block = (block128_f)aesni_decrypt; 674 dat->stream.cbc = 675 mode == EVP_CIPH_CBC_MODE ? (cbc128_f)aesni_cbc_encrypt : NULL; 676 } else { 677 ret = aesni_set_encrypt_key(key, ctx->key_len * 8, ctx->cipher_data); 678 dat->block = (block128_f)aesni_encrypt; 679 if (mode == EVP_CIPH_CBC_MODE) { 680 dat->stream.cbc = (cbc128_f)aesni_cbc_encrypt; 681 } else if (mode == EVP_CIPH_CTR_MODE) { 682 dat->stream.ctr = (ctr128_f)aesni_ctr32_encrypt_blocks; 683 } else { 684 dat->stream.cbc = NULL; 685 } 686 } 687 688 if (ret < 0) { 689 OPENSSL_PUT_ERROR(CIPHER, aesni_init_key, CIPHER_R_AES_KEY_SETUP_FAILED); 690 return 0; 691 } 692 693 return 1; 694 } 695 696 static int aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, 697 const uint8_t *in, size_t len) { 698 aesni_cbc_encrypt(in, out, len, ctx->cipher_data, ctx->iv, ctx->encrypt); 699 700 return 1; 701 } 702 703 static int aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, 704 const uint8_t *in, size_t len) { 705 size_t bl = ctx->cipher->block_size; 706 707 if (len < bl) { 708 return 1; 709 } 710 711 aesni_ecb_encrypt(in, out, len, ctx->cipher_data, ctx->encrypt); 712 713 return 1; 714 } 715 716 static int aesni_gcm_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, 717 const uint8_t *iv, int enc) { 718 EVP_AES_GCM_CTX *gctx = ctx->cipher_data; 719 if (!iv && !key) { 720 return 1; 721 } 722 if (key) { 723 aesni_set_encrypt_key(key, ctx->key_len * 8, &gctx->ks.ks); 724 CRYPTO_gcm128_init(&gctx->gcm, &gctx->ks, (block128_f)aesni_encrypt); 725 gctx->ctr = (ctr128_f)aesni_ctr32_encrypt_blocks; 726 /* If we have an iv can set it directly, otherwise use 727 * saved IV. */ 728 if (iv == NULL && gctx->iv_set) { 729 iv = gctx->iv; 730 } 731 if (iv) { 732 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen); 733 gctx->iv_set = 1; 734 } 735 gctx->key_set = 1; 736 } else { 737 /* If key set use IV, otherwise copy */ 738 if (gctx->key_set) { 739 CRYPTO_gcm128_setiv(&gctx->gcm, iv, gctx->ivlen); 740 } else { 741 memcpy(gctx->iv, iv, gctx->ivlen); 742 } 743 gctx->iv_set = 1; 744 gctx->iv_gen = 0; 745 } 746 return 1; 747 } 748 749 static const EVP_CIPHER aesni_128_cbc = { 750 NID_aes_128_cbc, 16 /* block_size */, 16 /* key_size */, 751 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, 752 NULL /* app_data */, aesni_init_key, aesni_cbc_cipher, 753 NULL /* cleanup */, NULL /* ctrl */}; 754 755 static const EVP_CIPHER aesni_128_ctr = { 756 NID_aes_128_ctr, 1 /* block_size */, 16 /* key_size */, 757 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, 758 NULL /* app_data */, aesni_init_key, aes_ctr_cipher, 759 NULL /* cleanup */, NULL /* ctrl */}; 760 761 static const EVP_CIPHER aesni_128_ecb = { 762 NID_aes_128_ecb, 16 /* block_size */, 16 /* key_size */, 763 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, 764 NULL /* app_data */, aesni_init_key, aesni_ecb_cipher, 765 NULL /* cleanup */, NULL /* ctrl */}; 766 767 static const EVP_CIPHER aesni_128_gcm = { 768 NID_aes_128_gcm, 1 /* block_size */, 16 /* key_size */, 12 /* iv_len */, 769 sizeof(EVP_AES_GCM_CTX), 770 EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | 771 EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | 772 EVP_CIPH_FLAG_AEAD_CIPHER, 773 NULL /* app_data */, aesni_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, 774 aes_gcm_ctrl}; 775 776 777 static const EVP_CIPHER aesni_256_cbc = { 778 NID_aes_128_cbc, 16 /* block_size */, 32 /* key_size */, 779 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CBC_MODE, 780 NULL /* app_data */, aesni_init_key, aesni_cbc_cipher, 781 NULL /* cleanup */, NULL /* ctrl */}; 782 783 static const EVP_CIPHER aesni_256_ctr = { 784 NID_aes_128_ctr, 1 /* block_size */, 32 /* key_size */, 785 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_CTR_MODE, 786 NULL /* app_data */, aesni_init_key, aes_ctr_cipher, 787 NULL /* cleanup */, NULL /* ctrl */}; 788 789 static const EVP_CIPHER aesni_256_ecb = { 790 NID_aes_128_ecb, 16 /* block_size */, 32 /* key_size */, 791 16 /* iv_len */, sizeof(EVP_AES_KEY), EVP_CIPH_ECB_MODE, 792 NULL /* app_data */, aesni_init_key, aesni_ecb_cipher, 793 NULL /* cleanup */, NULL /* ctrl */}; 794 795 static const EVP_CIPHER aesni_256_gcm = { 796 NID_aes_256_gcm, 1 /* block_size */, 32 /* key_size */, 12 /* iv_len */, 797 sizeof(EVP_AES_GCM_CTX), 798 EVP_CIPH_GCM_MODE | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER | 799 EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT | EVP_CIPH_CUSTOM_COPY | 800 EVP_CIPH_FLAG_AEAD_CIPHER, 801 NULL /* app_data */, aesni_gcm_init_key, aes_gcm_cipher, aes_gcm_cleanup, 802 aes_gcm_ctrl}; 803 804 #define EVP_CIPHER_FUNCTION(keybits, mode) \ 805 const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \ 806 if (aesni_capable()) { \ 807 return &aesni_##keybits##_##mode; \ 808 } else { \ 809 return &aes_##keybits##_##mode; \ 810 } \ 811 } 812 813 #else /* ^^^ OPENSSL_X86_64 || OPENSSL_X86 */ 814 815 static char aesni_capable(void) { 816 return 0; 817 } 818 819 #define EVP_CIPHER_FUNCTION(keybits, mode) \ 820 const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \ 821 return &aes_##keybits##_##mode; \ 822 } 823 824 #endif 825 826 EVP_CIPHER_FUNCTION(128, cbc) 827 EVP_CIPHER_FUNCTION(128, ctr) 828 EVP_CIPHER_FUNCTION(128, ecb) 829 EVP_CIPHER_FUNCTION(128, gcm) 830 831 EVP_CIPHER_FUNCTION(256, cbc) 832 EVP_CIPHER_FUNCTION(256, ctr) 833 EVP_CIPHER_FUNCTION(256, ecb) 834 EVP_CIPHER_FUNCTION(256, gcm) 835 836 837 #define EVP_AEAD_AES_GCM_TAG_LEN 16 838 839 struct aead_aes_gcm_ctx { 840 union { 841 double align; 842 AES_KEY ks; 843 } ks; 844 GCM128_CONTEXT gcm; 845 ctr128_f ctr; 846 uint8_t tag_len; 847 }; 848 849 static int aead_aes_gcm_init(EVP_AEAD_CTX *ctx, const uint8_t *key, 850 size_t key_len, size_t tag_len) { 851 struct aead_aes_gcm_ctx *gcm_ctx; 852 const size_t key_bits = key_len * 8; 853 854 if (key_bits != 128 && key_bits != 256) { 855 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_init, CIPHER_R_BAD_KEY_LENGTH); 856 return 0; /* EVP_AEAD_CTX_init should catch this. */ 857 } 858 859 if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) { 860 tag_len = EVP_AEAD_AES_GCM_TAG_LEN; 861 } 862 863 if (tag_len > EVP_AEAD_AES_GCM_TAG_LEN) { 864 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_init, CIPHER_R_TAG_TOO_LARGE); 865 return 0; 866 } 867 868 gcm_ctx = OPENSSL_malloc(sizeof(struct aead_aes_gcm_ctx)); 869 if (gcm_ctx == NULL) { 870 return 0; 871 } 872 873 if (aesni_capable()) { 874 aesni_set_encrypt_key(key, key_len * 8, &gcm_ctx->ks.ks); 875 CRYPTO_gcm128_init(&gcm_ctx->gcm, &gcm_ctx->ks.ks, 876 (block128_f)aesni_encrypt); 877 gcm_ctx->ctr = (ctr128_f)aesni_ctr32_encrypt_blocks; 878 } else { 879 gcm_ctx->ctr = 880 aes_gcm_set_key(&gcm_ctx->ks.ks, &gcm_ctx->gcm, key, key_len); 881 } 882 gcm_ctx->tag_len = tag_len; 883 ctx->aead_state = gcm_ctx; 884 885 return 1; 886 } 887 888 static void aead_aes_gcm_cleanup(EVP_AEAD_CTX *ctx) { 889 struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state; 890 OPENSSL_cleanse(gcm_ctx, sizeof(struct aead_aes_gcm_ctx)); 891 OPENSSL_free(gcm_ctx); 892 } 893 894 static int aead_aes_gcm_seal(const EVP_AEAD_CTX *ctx, uint8_t *out, 895 size_t *out_len, size_t max_out_len, 896 const uint8_t *nonce, size_t nonce_len, 897 const uint8_t *in, size_t in_len, 898 const uint8_t *ad, size_t ad_len) { 899 size_t bulk = 0; 900 const struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state; 901 GCM128_CONTEXT gcm; 902 903 if (in_len + gcm_ctx->tag_len < in_len) { 904 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_seal, CIPHER_R_TOO_LARGE); 905 return 0; 906 } 907 908 if (max_out_len < in_len + gcm_ctx->tag_len) { 909 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_seal, CIPHER_R_BUFFER_TOO_SMALL); 910 return 0; 911 } 912 913 memcpy(&gcm, &gcm_ctx->gcm, sizeof(gcm)); 914 CRYPTO_gcm128_setiv(&gcm, nonce, nonce_len); 915 916 if (ad_len > 0 && !CRYPTO_gcm128_aad(&gcm, ad, ad_len)) { 917 return 0; 918 } 919 920 if (gcm_ctx->ctr) { 921 if (!CRYPTO_gcm128_encrypt_ctr32(&gcm, in + bulk, out + bulk, in_len - bulk, 922 gcm_ctx->ctr)) { 923 return 0; 924 } 925 } else { 926 if (!CRYPTO_gcm128_encrypt(&gcm, in + bulk, out + bulk, in_len - bulk)) { 927 return 0; 928 } 929 } 930 931 CRYPTO_gcm128_tag(&gcm, out + in_len, gcm_ctx->tag_len); 932 *out_len = in_len + gcm_ctx->tag_len; 933 return 1; 934 } 935 936 static int aead_aes_gcm_open(const EVP_AEAD_CTX *ctx, uint8_t *out, 937 size_t *out_len, size_t max_out_len, 938 const uint8_t *nonce, size_t nonce_len, 939 const uint8_t *in, size_t in_len, 940 const uint8_t *ad, size_t ad_len) { 941 size_t bulk = 0; 942 const struct aead_aes_gcm_ctx *gcm_ctx = ctx->aead_state; 943 uint8_t tag[EVP_AEAD_AES_GCM_TAG_LEN]; 944 size_t plaintext_len; 945 GCM128_CONTEXT gcm; 946 947 if (in_len < gcm_ctx->tag_len) { 948 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_open, CIPHER_R_BAD_DECRYPT); 949 return 0; 950 } 951 952 plaintext_len = in_len - gcm_ctx->tag_len; 953 954 if (max_out_len < plaintext_len) { 955 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_open, CIPHER_R_BUFFER_TOO_SMALL); 956 return 0; 957 } 958 959 memcpy(&gcm, &gcm_ctx->gcm, sizeof(gcm)); 960 CRYPTO_gcm128_setiv(&gcm, nonce, nonce_len); 961 962 if (!CRYPTO_gcm128_aad(&gcm, ad, ad_len)) { 963 return 0; 964 } 965 966 if (gcm_ctx->ctr) { 967 if (!CRYPTO_gcm128_decrypt_ctr32(&gcm, in + bulk, out + bulk, 968 in_len - bulk - gcm_ctx->tag_len, 969 gcm_ctx->ctr)) { 970 return 0; 971 } 972 } else { 973 if (!CRYPTO_gcm128_decrypt(&gcm, in + bulk, out + bulk, 974 in_len - bulk - gcm_ctx->tag_len)) { 975 return 0; 976 } 977 } 978 979 CRYPTO_gcm128_tag(&gcm, tag, gcm_ctx->tag_len); 980 if (CRYPTO_memcmp(tag, in + plaintext_len, gcm_ctx->tag_len) != 0) { 981 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_open, CIPHER_R_BAD_DECRYPT); 982 return 0; 983 } 984 985 *out_len = plaintext_len; 986 return 1; 987 } 988 989 static const EVP_AEAD aead_aes_128_gcm = { 990 16, /* key len */ 991 12, /* nonce len */ 992 EVP_AEAD_AES_GCM_TAG_LEN, /* overhead */ 993 EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ 994 aead_aes_gcm_init, aead_aes_gcm_cleanup, 995 aead_aes_gcm_seal, aead_aes_gcm_open, 996 }; 997 998 static const EVP_AEAD aead_aes_256_gcm = { 999 32, /* key len */ 1000 12, /* nonce len */ 1001 EVP_AEAD_AES_GCM_TAG_LEN, /* overhead */ 1002 EVP_AEAD_AES_GCM_TAG_LEN, /* max tag length */ 1003 aead_aes_gcm_init, aead_aes_gcm_cleanup, 1004 aead_aes_gcm_seal, aead_aes_gcm_open, 1005 }; 1006 1007 const EVP_AEAD *EVP_aead_aes_128_gcm(void) { return &aead_aes_128_gcm; } 1008 1009 const EVP_AEAD *EVP_aead_aes_256_gcm(void) { return &aead_aes_256_gcm; } 1010 1011 1012 /* AES Key Wrap is specified in 1013 * http://csrc.nist.gov/groups/ST/toolkit/documents/kms/key-wrap.pdf 1014 * or https://tools.ietf.org/html/rfc3394 */ 1015 1016 struct aead_aes_key_wrap_ctx { 1017 uint8_t key[32]; 1018 unsigned key_bits; 1019 }; 1020 1021 static int aead_aes_key_wrap_init(EVP_AEAD_CTX *ctx, const uint8_t *key, 1022 size_t key_len, size_t tag_len) { 1023 struct aead_aes_key_wrap_ctx *kw_ctx; 1024 const size_t key_bits = key_len * 8; 1025 1026 if (key_bits != 128 && key_bits != 256) { 1027 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_init, CIPHER_R_BAD_KEY_LENGTH); 1028 return 0; /* EVP_AEAD_CTX_init should catch this. */ 1029 } 1030 1031 if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) { 1032 tag_len = 8; 1033 } 1034 1035 if (tag_len != 8) { 1036 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_init, 1037 CIPHER_R_UNSUPPORTED_TAG_SIZE); 1038 return 0; 1039 } 1040 1041 kw_ctx = OPENSSL_malloc(sizeof(struct aead_aes_key_wrap_ctx)); 1042 if (kw_ctx == NULL) { 1043 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_init, ERR_R_MALLOC_FAILURE); 1044 return 0; 1045 } 1046 1047 memcpy(kw_ctx->key, key, key_len); 1048 kw_ctx->key_bits = key_bits; 1049 1050 ctx->aead_state = kw_ctx; 1051 return 1; 1052 } 1053 1054 static void aead_aes_key_wrap_cleanup(EVP_AEAD_CTX *ctx) { 1055 struct aead_aes_key_wrap_ctx *kw_ctx = ctx->aead_state; 1056 OPENSSL_cleanse(kw_ctx, sizeof(struct aead_aes_key_wrap_ctx)); 1057 OPENSSL_free(kw_ctx); 1058 } 1059 1060 /* kDefaultAESKeyWrapNonce is the default nonce value given in 2.2.3.1. */ 1061 static const uint8_t kDefaultAESKeyWrapNonce[8] = {0xa6, 0xa6, 0xa6, 0xa6, 1062 0xa6, 0xa6, 0xa6, 0xa6}; 1063 1064 1065 static int aead_aes_key_wrap_seal(const EVP_AEAD_CTX *ctx, uint8_t *out, 1066 size_t *out_len, size_t max_out_len, 1067 const uint8_t *nonce, size_t nonce_len, 1068 const uint8_t *in, size_t in_len, 1069 const uint8_t *ad, size_t ad_len) { 1070 const struct aead_aes_key_wrap_ctx *kw_ctx = ctx->aead_state; 1071 union { 1072 double align; 1073 AES_KEY ks; 1074 } ks; 1075 /* Variables in this function match up with the variables in the second half 1076 * of section 2.2.1. */ 1077 unsigned i, j, n; 1078 uint8_t A[AES_BLOCK_SIZE]; 1079 1080 if (ad_len != 0) { 1081 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1082 CIPHER_R_UNSUPPORTED_AD_SIZE); 1083 return 0; 1084 } 1085 1086 if (nonce_len == 0) { 1087 nonce = kDefaultAESKeyWrapNonce; 1088 nonce_len = sizeof(kDefaultAESKeyWrapNonce); 1089 } 1090 1091 if (nonce_len != 8) { 1092 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1093 CIPHER_R_UNSUPPORTED_NONCE_SIZE); 1094 return 0; 1095 } 1096 1097 if (in_len % 8 != 0) { 1098 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1099 CIPHER_R_UNSUPPORTED_INPUT_SIZE); 1100 return 0; 1101 } 1102 1103 /* The code below only handles a 32-bit |t| thus 6*|n| must be less than 1104 * 2^32, where |n| is |in_len| / 8. So in_len < 4/3 * 2^32 and we 1105 * conservatively cap it to 2^32-16 to stop 32-bit platforms complaining that 1106 * a comparision is always true. */ 1107 if (in_len > 0xfffffff0) { 1108 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, CIPHER_R_TOO_LARGE); 1109 return 0; 1110 } 1111 1112 n = in_len / 8; 1113 1114 if (n < 2) { 1115 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1116 CIPHER_R_UNSUPPORTED_INPUT_SIZE); 1117 return 0; 1118 } 1119 1120 if (in_len + 8 < in_len) { 1121 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, CIPHER_R_TOO_LARGE); 1122 return 0; 1123 } 1124 1125 if (max_out_len < in_len + 8) { 1126 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1127 CIPHER_R_BUFFER_TOO_SMALL); 1128 return 0; 1129 } 1130 1131 if (AES_set_encrypt_key(kw_ctx->key, kw_ctx->key_bits, &ks.ks) < 0) { 1132 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_seal, 1133 CIPHER_R_AES_KEY_SETUP_FAILED); 1134 return 0; 1135 } 1136 1137 memmove(out + 8, in, in_len); 1138 memcpy(A, nonce, 8); 1139 1140 for (j = 0; j < 6; j++) { 1141 for (i = 1; i <= n; i++) { 1142 uint32_t t; 1143 1144 memcpy(A + 8, out + 8 * i, 8); 1145 AES_encrypt(A, A, &ks.ks); 1146 t = n * j + i; 1147 A[7] ^= t & 0xff; 1148 A[6] ^= (t >> 8) & 0xff; 1149 A[5] ^= (t >> 16) & 0xff; 1150 A[4] ^= (t >> 24) & 0xff; 1151 memcpy(out + 8 * i, A + 8, 8); 1152 } 1153 } 1154 1155 memcpy(out, A, 8); 1156 *out_len = in_len + 8; 1157 return 1; 1158 } 1159 1160 static int aead_aes_key_wrap_open(const EVP_AEAD_CTX *ctx, uint8_t *out, 1161 size_t *out_len, size_t max_out_len, 1162 const uint8_t *nonce, size_t nonce_len, 1163 const uint8_t *in, size_t in_len, 1164 const uint8_t *ad, size_t ad_len) { 1165 const struct aead_aes_key_wrap_ctx *kw_ctx = ctx->aead_state; 1166 union { 1167 double align; 1168 AES_KEY ks; 1169 } ks; 1170 /* Variables in this function match up with the variables in the second half 1171 * of section 2.2.1. */ 1172 unsigned i, j, n; 1173 uint8_t A[AES_BLOCK_SIZE]; 1174 1175 if (ad_len != 0) { 1176 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, 1177 CIPHER_R_UNSUPPORTED_AD_SIZE); 1178 return 0; 1179 } 1180 1181 if (nonce_len == 0) { 1182 nonce = kDefaultAESKeyWrapNonce; 1183 nonce_len = sizeof(kDefaultAESKeyWrapNonce); 1184 } 1185 1186 if (nonce_len != 8) { 1187 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, 1188 CIPHER_R_UNSUPPORTED_NONCE_SIZE); 1189 return 0; 1190 } 1191 1192 if (in_len % 8 != 0) { 1193 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, 1194 CIPHER_R_UNSUPPORTED_INPUT_SIZE); 1195 return 0; 1196 } 1197 1198 /* The code below only handles a 32-bit |t| thus 6*|n| must be less than 1199 * 2^32, where |n| is |in_len| / 8. So in_len < 4/3 * 2^32 and we 1200 * conservatively cap it to 2^32-8 to stop 32-bit platforms complaining that 1201 * a comparision is always true. */ 1202 if (in_len > 0xfffffff8) { 1203 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, CIPHER_R_TOO_LARGE); 1204 return 0; 1205 } 1206 1207 if (in_len < 24) { 1208 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_open, CIPHER_R_BAD_DECRYPT); 1209 return 0; 1210 } 1211 1212 n = (in_len / 8) - 1; 1213 1214 if (max_out_len < in_len - 8) { 1215 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, 1216 CIPHER_R_BUFFER_TOO_SMALL); 1217 return 0; 1218 } 1219 1220 if (AES_set_decrypt_key(kw_ctx->key, kw_ctx->key_bits, &ks.ks) < 0) { 1221 OPENSSL_PUT_ERROR(CIPHER, aead_aes_key_wrap_open, 1222 CIPHER_R_AES_KEY_SETUP_FAILED); 1223 return 0; 1224 } 1225 1226 memcpy(A, in, 8); 1227 memmove(out, in + 8, in_len - 8); 1228 1229 for (j = 5; j < 6; j--) { 1230 for (i = n; i > 0; i--) { 1231 uint32_t t; 1232 1233 t = n * j + i; 1234 A[7] ^= t & 0xff; 1235 A[6] ^= (t >> 8) & 0xff; 1236 A[5] ^= (t >> 16) & 0xff; 1237 A[4] ^= (t >> 24) & 0xff; 1238 memcpy(A + 8, out + 8 * (i - 1), 8); 1239 AES_decrypt(A, A, &ks.ks); 1240 memcpy(out + 8 * (i - 1), A + 8, 8); 1241 } 1242 } 1243 1244 if (CRYPTO_memcmp(A, nonce, 8) != 0) { 1245 OPENSSL_PUT_ERROR(CIPHER, aead_aes_gcm_open, CIPHER_R_BAD_DECRYPT); 1246 return 0; 1247 } 1248 1249 *out_len = in_len - 8; 1250 return 1; 1251 } 1252 1253 static const EVP_AEAD aead_aes_128_key_wrap = { 1254 16, /* key len */ 1255 8, /* nonce len */ 1256 8, /* overhead */ 1257 8, /* max tag length */ 1258 aead_aes_key_wrap_init, aead_aes_key_wrap_cleanup, 1259 aead_aes_key_wrap_seal, aead_aes_key_wrap_open, 1260 }; 1261 1262 static const EVP_AEAD aead_aes_256_key_wrap = { 1263 32, /* key len */ 1264 8, /* nonce len */ 1265 8, /* overhead */ 1266 8, /* max tag length */ 1267 aead_aes_key_wrap_init, aead_aes_key_wrap_cleanup, 1268 aead_aes_key_wrap_seal, aead_aes_key_wrap_open, 1269 }; 1270 1271 const EVP_AEAD *EVP_aead_aes_128_key_wrap(void) { return &aead_aes_128_key_wrap; } 1272 1273 const EVP_AEAD *EVP_aead_aes_256_key_wrap(void) { return &aead_aes_256_key_wrap; } 1274 1275 int EVP_has_aes_hardware(void) { 1276 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) 1277 return aesni_capable() && crypto_gcm_clmul_enabled(); 1278 #else 1279 return 0; 1280 #endif 1281 } 1282