diff options
Diffstat (limited to 'src/lib/libcrypto')
| -rw-r--r-- | src/lib/libcrypto/aes/aes.c | 4 | ||||
| -rw-r--r-- | src/lib/libcrypto/aes/aes_amd64.c | 26 | ||||
| -rw-r--r-- | src/lib/libcrypto/aes/aes_i386.c | 26 | ||||
| -rw-r--r-- | src/lib/libcrypto/arch/amd64/crypto_arch.h | 3 | ||||
| -rw-r--r-- | src/lib/libcrypto/arch/i386/crypto_arch.h | 3 | ||||
| -rw-r--r-- | src/lib/libcrypto/evp/e_aes.c | 83 |
6 files changed, 58 insertions, 87 deletions
diff --git a/src/lib/libcrypto/aes/aes.c b/src/lib/libcrypto/aes/aes.c index 33e6273268..693badcd66 100644 --- a/src/lib/libcrypto/aes/aes.c +++ b/src/lib/libcrypto/aes/aes.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: aes.c,v 1.13 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: aes.c,v 1.14 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| @@ -310,6 +310,7 @@ AES_ecb_encrypt(const unsigned char *in, unsigned char *out, | |||
| 310 | } | 310 | } |
| 311 | LCRYPTO_ALIAS(AES_ecb_encrypt); | 311 | LCRYPTO_ALIAS(AES_ecb_encrypt); |
| 312 | 312 | ||
| 313 | #ifndef HAVE_AES_ECB_ENCRYPT_INTERNAL | ||
| 313 | void | 314 | void |
| 314 | aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, | 315 | aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, |
| 315 | size_t len, const AES_KEY *key, int encrypt) | 316 | size_t len, const AES_KEY *key, int encrypt) |
| @@ -321,6 +322,7 @@ aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, | |||
| 321 | len -= AES_BLOCK_SIZE; | 322 | len -= AES_BLOCK_SIZE; |
| 322 | } | 323 | } |
| 323 | } | 324 | } |
| 325 | #endif | ||
| 324 | 326 | ||
| 325 | #define N_WORDS (AES_BLOCK_SIZE / sizeof(unsigned long)) | 327 | #define N_WORDS (AES_BLOCK_SIZE / sizeof(unsigned long)) |
| 326 | typedef struct { | 328 | typedef struct { |
diff --git a/src/lib/libcrypto/aes/aes_amd64.c b/src/lib/libcrypto/aes/aes_amd64.c index 436983d872..183a5cce14 100644 --- a/src/lib/libcrypto/aes/aes_amd64.c +++ b/src/lib/libcrypto/aes/aes_amd64.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: aes_amd64.c,v 1.4 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: aes_amd64.c,v 1.5 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -68,6 +68,9 @@ void aesni_ccm64_decrypt_blocks(const unsigned char *in, unsigned char *out, | |||
| 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, | 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, |
| 69 | size_t blocks, const void *key, const unsigned char *ivec); | 69 | size_t blocks, const void *key, const unsigned char *ivec); |
| 70 | 70 | ||
| 71 | void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out, | ||
| 72 | size_t length, const AES_KEY *key, int enc); | ||
| 73 | |||
| 71 | void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, | 74 | void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, |
| 72 | size_t length, const AES_KEY *key1, const AES_KEY *key2, | 75 | size_t length, const AES_KEY *key1, const AES_KEY *key2, |
| 73 | const unsigned char iv[16]); | 76 | const unsigned char iv[16]); |
| @@ -161,6 +164,27 @@ aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, | |||
| 161 | } | 164 | } |
| 162 | 165 | ||
| 163 | void | 166 | void |
| 167 | aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
| 168 | size_t len, const AES_KEY *key, int encrypt) | ||
| 169 | { | ||
| 170 | if ((crypto_cpu_caps_amd64 & CRYPTO_CPU_CAPS_AMD64_AES) != 0) { | ||
| 171 | aesni_ecb_encrypt(in, out, len, key, encrypt); | ||
| 172 | return; | ||
| 173 | } | ||
| 174 | |||
| 175 | while (len >= AES_BLOCK_SIZE) { | ||
| 176 | if (encrypt) | ||
| 177 | aes_encrypt_generic(in, out, key); | ||
| 178 | else | ||
| 179 | aes_decrypt_generic(in, out, key); | ||
| 180 | |||
| 181 | in += AES_BLOCK_SIZE; | ||
| 182 | out += AES_BLOCK_SIZE; | ||
| 183 | len -= AES_BLOCK_SIZE; | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | void | ||
| 164 | aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, | 188 | aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, |
| 165 | size_t len, const AES_KEY *key1, const AES_KEY *key2, | 189 | size_t len, const AES_KEY *key1, const AES_KEY *key2, |
| 166 | const unsigned char iv[16], int encrypt) | 190 | const unsigned char iv[16], int encrypt) |
diff --git a/src/lib/libcrypto/aes/aes_i386.c b/src/lib/libcrypto/aes/aes_i386.c index 7f2241eaf5..85a14454da 100644 --- a/src/lib/libcrypto/aes/aes_i386.c +++ b/src/lib/libcrypto/aes/aes_i386.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: aes_i386.c,v 1.4 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: aes_i386.c,v 1.5 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2025 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -68,6 +68,9 @@ void aesni_ccm64_decrypt_blocks(const unsigned char *in, unsigned char *out, | |||
| 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, | 68 | void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, |
| 69 | size_t blocks, const void *key, const unsigned char *ivec); | 69 | size_t blocks, const void *key, const unsigned char *ivec); |
| 70 | 70 | ||
| 71 | void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out, | ||
| 72 | size_t length, const AES_KEY *key, int enc); | ||
| 73 | |||
| 71 | void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, | 74 | void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, |
| 72 | size_t length, const AES_KEY *key1, const AES_KEY *key2, | 75 | size_t length, const AES_KEY *key1, const AES_KEY *key2, |
| 73 | const unsigned char iv[16]); | 76 | const unsigned char iv[16]); |
| @@ -161,6 +164,27 @@ aes_ctr32_encrypt_internal(const unsigned char *in, unsigned char *out, | |||
| 161 | } | 164 | } |
| 162 | 165 | ||
| 163 | void | 166 | void |
| 167 | aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, | ||
| 168 | size_t len, const AES_KEY *key, int encrypt) | ||
| 169 | { | ||
| 170 | if ((crypto_cpu_caps_i386 & CRYPTO_CPU_CAPS_I386_AES) != 0) { | ||
| 171 | aesni_ecb_encrypt(in, out, len, key, encrypt); | ||
| 172 | return; | ||
| 173 | } | ||
| 174 | |||
| 175 | while (len >= AES_BLOCK_SIZE) { | ||
| 176 | if (encrypt) | ||
| 177 | aes_encrypt_generic(in, out, key); | ||
| 178 | else | ||
| 179 | aes_decrypt_generic(in, out, key); | ||
| 180 | |||
| 181 | in += AES_BLOCK_SIZE; | ||
| 182 | out += AES_BLOCK_SIZE; | ||
| 183 | len -= AES_BLOCK_SIZE; | ||
| 184 | } | ||
| 185 | } | ||
| 186 | |||
| 187 | void | ||
| 164 | aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, | 188 | aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, |
| 165 | size_t len, const AES_KEY *key1, const AES_KEY *key2, | 189 | size_t len, const AES_KEY *key1, const AES_KEY *key2, |
| 166 | const unsigned char iv[16], int encrypt) | 190 | const unsigned char iv[16], int encrypt) |
diff --git a/src/lib/libcrypto/arch/amd64/crypto_arch.h b/src/lib/libcrypto/arch/amd64/crypto_arch.h index a51021a307..e8faf0bca1 100644 --- a/src/lib/libcrypto/arch/amd64/crypto_arch.h +++ b/src/lib/libcrypto/arch/amd64/crypto_arch.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: crypto_arch.h,v 1.11 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: crypto_arch.h,v 1.12 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -40,6 +40,7 @@ extern uint64_t crypto_cpu_caps_amd64; | |||
| 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL | 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL |
| 41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL | 41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL |
| 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL | 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL |
| 43 | #define HAVE_AES_ECB_ENCRYPT_INTERNAL | ||
| 43 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL | 44 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL |
| 44 | 45 | ||
| 45 | #define HAVE_GCM128_INIT | 46 | #define HAVE_GCM128_INIT |
diff --git a/src/lib/libcrypto/arch/i386/crypto_arch.h b/src/lib/libcrypto/arch/i386/crypto_arch.h index 34d041b382..ccaa3e8494 100644 --- a/src/lib/libcrypto/arch/i386/crypto_arch.h +++ b/src/lib/libcrypto/arch/i386/crypto_arch.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: crypto_arch.h,v 1.10 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: crypto_arch.h,v 1.11 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2024 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -40,6 +40,7 @@ extern uint64_t crypto_cpu_caps_i386; | |||
| 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL | 40 | #define HAVE_AES_CBC_ENCRYPT_INTERNAL |
| 41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL | 41 | #define HAVE_AES_CCM64_ENCRYPT_INTERNAL |
| 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL | 42 | #define HAVE_AES_CTR32_ENCRYPT_INTERNAL |
| 43 | #define HAVE_AES_ECB_ENCRYPT_INTERNAL | ||
| 43 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL | 44 | #define HAVE_AES_XTS_ENCRYPT_INTERNAL |
| 44 | 45 | ||
| 45 | #define HAVE_GCM128_INIT | 46 | #define HAVE_GCM128_INIT |
diff --git a/src/lib/libcrypto/evp/e_aes.c b/src/lib/libcrypto/evp/e_aes.c index 0949c8bdb4..005f1c49b2 100644 --- a/src/lib/libcrypto/evp/e_aes.c +++ b/src/lib/libcrypto/evp/e_aes.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: e_aes.c,v 1.80 2025/07/21 10:24:23 jsing Exp $ */ | 1 | /* $OpenBSD: e_aes.c,v 1.81 2025/07/22 09:13:49 jsing Exp $ */ |
| 2 | /* ==================================================================== | 2 | /* ==================================================================== |
| 3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. | 3 | * Copyright (c) 2001-2011 The OpenSSL Project. All rights reserved. |
| 4 | * | 4 | * |
| @@ -99,36 +99,6 @@ typedef struct { | |||
| 99 | 99 | ||
| 100 | #define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4)) | 100 | #define MAXBITCHUNK ((size_t)1<<(sizeof(size_t)*8-4)) |
| 101 | 101 | ||
| 102 | #if defined(AES_ASM) && ( \ | ||
| 103 | ((defined(__i386) || defined(__i386__) || \ | ||
| 104 | defined(_M_IX86)))|| \ | ||
| 105 | defined(__x86_64) || defined(__x86_64__) || \ | ||
| 106 | defined(_M_AMD64) || defined(_M_X64) || \ | ||
| 107 | defined(__INTEL__) ) | ||
| 108 | |||
| 109 | #include "x86_arch.h" | ||
| 110 | |||
| 111 | /* | ||
| 112 | * AES-NI section | ||
| 113 | */ | ||
| 114 | #define AESNI_CAPABLE (crypto_cpu_caps_ia32() & CPUCAP_MASK_AESNI) | ||
| 115 | |||
| 116 | void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out, | ||
| 117 | size_t length, const AES_KEY *key, int enc); | ||
| 118 | |||
| 119 | static int | ||
| 120 | aesni_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
| 121 | const unsigned char *in, size_t len) | ||
| 122 | { | ||
| 123 | if (len < ctx->cipher->block_size) | ||
| 124 | return 1; | ||
| 125 | |||
| 126 | aesni_ecb_encrypt(in, out, len, ctx->cipher_data, ctx->encrypt); | ||
| 127 | |||
| 128 | return 1; | ||
| 129 | } | ||
| 130 | #endif | ||
| 131 | |||
| 132 | static int | 102 | static int |
| 133 | aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 103 | aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
| 134 | const unsigned char *iv, int enc) | 104 | const unsigned char *iv, int enc) |
| @@ -301,19 +271,6 @@ EVP_aes_128_cbc(void) | |||
| 301 | } | 271 | } |
| 302 | LCRYPTO_ALIAS(EVP_aes_128_cbc); | 272 | LCRYPTO_ALIAS(EVP_aes_128_cbc); |
| 303 | 273 | ||
| 304 | #ifdef AESNI_CAPABLE | ||
| 305 | static const EVP_CIPHER aesni_128_ecb = { | ||
| 306 | .nid = NID_aes_128_ecb, | ||
| 307 | .block_size = 16, | ||
| 308 | .key_len = 16, | ||
| 309 | .iv_len = 0, | ||
| 310 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE, | ||
| 311 | .init = aes_ecb_init_key, | ||
| 312 | .do_cipher = aesni_ecb_cipher, | ||
| 313 | .ctx_size = sizeof(EVP_AES_KEY), | ||
| 314 | }; | ||
| 315 | #endif | ||
| 316 | |||
| 317 | static const EVP_CIPHER aes_128_ecb = { | 274 | static const EVP_CIPHER aes_128_ecb = { |
| 318 | .nid = NID_aes_128_ecb, | 275 | .nid = NID_aes_128_ecb, |
| 319 | .block_size = 16, | 276 | .block_size = 16, |
| @@ -328,11 +285,7 @@ static const EVP_CIPHER aes_128_ecb = { | |||
| 328 | const EVP_CIPHER * | 285 | const EVP_CIPHER * |
| 329 | EVP_aes_128_ecb(void) | 286 | EVP_aes_128_ecb(void) |
| 330 | { | 287 | { |
| 331 | #ifdef AESNI_CAPABLE | ||
| 332 | return AESNI_CAPABLE ? &aesni_128_ecb : &aes_128_ecb; | ||
| 333 | #else | ||
| 334 | return &aes_128_ecb; | 288 | return &aes_128_ecb; |
| 335 | #endif | ||
| 336 | } | 289 | } |
| 337 | LCRYPTO_ALIAS(EVP_aes_128_ecb); | 290 | LCRYPTO_ALIAS(EVP_aes_128_ecb); |
| 338 | 291 | ||
| @@ -444,19 +397,6 @@ EVP_aes_192_cbc(void) | |||
| 444 | } | 397 | } |
| 445 | LCRYPTO_ALIAS(EVP_aes_192_cbc); | 398 | LCRYPTO_ALIAS(EVP_aes_192_cbc); |
| 446 | 399 | ||
| 447 | #ifdef AESNI_CAPABLE | ||
| 448 | static const EVP_CIPHER aesni_192_ecb = { | ||
| 449 | .nid = NID_aes_192_ecb, | ||
| 450 | .block_size = 16, | ||
| 451 | .key_len = 24, | ||
| 452 | .iv_len = 0, | ||
| 453 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE, | ||
| 454 | .init = aes_ecb_init_key, | ||
| 455 | .do_cipher = aesni_ecb_cipher, | ||
| 456 | .ctx_size = sizeof(EVP_AES_KEY), | ||
| 457 | }; | ||
| 458 | #endif | ||
| 459 | |||
| 460 | static const EVP_CIPHER aes_192_ecb = { | 400 | static const EVP_CIPHER aes_192_ecb = { |
| 461 | .nid = NID_aes_192_ecb, | 401 | .nid = NID_aes_192_ecb, |
| 462 | .block_size = 16, | 402 | .block_size = 16, |
| @@ -471,11 +411,7 @@ static const EVP_CIPHER aes_192_ecb = { | |||
| 471 | const EVP_CIPHER * | 411 | const EVP_CIPHER * |
| 472 | EVP_aes_192_ecb(void) | 412 | EVP_aes_192_ecb(void) |
| 473 | { | 413 | { |
| 474 | #ifdef AESNI_CAPABLE | ||
| 475 | return AESNI_CAPABLE ? &aesni_192_ecb : &aes_192_ecb; | ||
| 476 | #else | ||
| 477 | return &aes_192_ecb; | 414 | return &aes_192_ecb; |
| 478 | #endif | ||
| 479 | } | 415 | } |
| 480 | LCRYPTO_ALIAS(EVP_aes_192_ecb); | 416 | LCRYPTO_ALIAS(EVP_aes_192_ecb); |
| 481 | 417 | ||
| @@ -587,19 +523,6 @@ EVP_aes_256_cbc(void) | |||
| 587 | } | 523 | } |
| 588 | LCRYPTO_ALIAS(EVP_aes_256_cbc); | 524 | LCRYPTO_ALIAS(EVP_aes_256_cbc); |
| 589 | 525 | ||
| 590 | #ifdef AESNI_CAPABLE | ||
| 591 | static const EVP_CIPHER aesni_256_ecb = { | ||
| 592 | .nid = NID_aes_256_ecb, | ||
| 593 | .block_size = 16, | ||
| 594 | .key_len = 32, | ||
| 595 | .iv_len = 0, | ||
| 596 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_ECB_MODE, | ||
| 597 | .init = aes_ecb_init_key, | ||
| 598 | .do_cipher = aesni_ecb_cipher, | ||
| 599 | .ctx_size = sizeof(EVP_AES_KEY), | ||
| 600 | }; | ||
| 601 | #endif | ||
| 602 | |||
| 603 | static const EVP_CIPHER aes_256_ecb = { | 526 | static const EVP_CIPHER aes_256_ecb = { |
| 604 | .nid = NID_aes_256_ecb, | 527 | .nid = NID_aes_256_ecb, |
| 605 | .block_size = 16, | 528 | .block_size = 16, |
| @@ -614,11 +537,7 @@ static const EVP_CIPHER aes_256_ecb = { | |||
| 614 | const EVP_CIPHER * | 537 | const EVP_CIPHER * |
| 615 | EVP_aes_256_ecb(void) | 538 | EVP_aes_256_ecb(void) |
| 616 | { | 539 | { |
| 617 | #ifdef AESNI_CAPABLE | ||
| 618 | return AESNI_CAPABLE ? &aesni_256_ecb : &aes_256_ecb; | ||
| 619 | #else | ||
| 620 | return &aes_256_ecb; | 540 | return &aes_256_ecb; |
| 621 | #endif | ||
| 622 | } | 541 | } |
| 623 | LCRYPTO_ALIAS(EVP_aes_256_ecb); | 542 | LCRYPTO_ALIAS(EVP_aes_256_ecb); |
| 624 | 543 | ||
