summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2025-07-22 09:13:49 +0000
committerjsing <>2025-07-22 09:13:49 +0000
commitc128b1d7f07c34584cba1744237fac46230292d7 (patch)
treec109a52c16069d775f54e57aabf8ee4bdc49d5f5 /src
parenta480cc6bd46609c720ef107acb4380c9f5d05fb0 (diff)
downloadopenbsd-c128b1d7f07c34584cba1744237fac46230292d7.tar.gz
openbsd-c128b1d7f07c34584cba1744237fac46230292d7.tar.bz2
openbsd-c128b1d7f07c34584cba1744237fac46230292d7.zip
Move AES-NI for ECB out of EVP.
Make aes_ecb_encrypt_internal() replaceable and provide machine dependent versions for amd64 and i386, which dispatch to AES-NI if appropriate. Remove the AES-NI specific EVP methods for ECB. This removes the last of the machine dependent code from EVP AES. ok bcook@ joshua@ tb@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/aes/aes.c4
-rw-r--r--src/lib/libcrypto/aes/aes_amd64.c26
-rw-r--r--src/lib/libcrypto/aes/aes_i386.c26
-rw-r--r--src/lib/libcrypto/arch/amd64/crypto_arch.h3
-rw-r--r--src/lib/libcrypto/arch/i386/crypto_arch.h3
-rw-r--r--src/lib/libcrypto/evp/e_aes.c83
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}
311LCRYPTO_ALIAS(AES_ecb_encrypt); 311LCRYPTO_ALIAS(AES_ecb_encrypt);
312 312
313#ifndef HAVE_AES_ECB_ENCRYPT_INTERNAL
313void 314void
314aes_ecb_encrypt_internal(const unsigned char *in, unsigned char *out, 315aes_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))
326typedef struct { 328typedef 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,
68void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, 68void 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
71void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
72 size_t length, const AES_KEY *key, int enc);
73
71void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, 74void 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
163void 166void
167aes_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
187void
164aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, 188aes_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,
68void aesni_ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, 68void 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
71void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
72 size_t length, const AES_KEY *key, int enc);
73
71void aesni_xts_encrypt(const unsigned char *in, unsigned char *out, 74void 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
163void 166void
167aes_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
187void
164aes_xts_encrypt_internal(const unsigned char *in, unsigned char *out, 188aes_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
116void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
117 size_t length, const AES_KEY *key, int enc);
118
119static int
120aesni_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
132static int 102static int
133aes_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 103aes_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}
302LCRYPTO_ALIAS(EVP_aes_128_cbc); 272LCRYPTO_ALIAS(EVP_aes_128_cbc);
303 273
304#ifdef AESNI_CAPABLE
305static 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
317static const EVP_CIPHER aes_128_ecb = { 274static 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 = {
328const EVP_CIPHER * 285const EVP_CIPHER *
329EVP_aes_128_ecb(void) 286EVP_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}
337LCRYPTO_ALIAS(EVP_aes_128_ecb); 290LCRYPTO_ALIAS(EVP_aes_128_ecb);
338 291
@@ -444,19 +397,6 @@ EVP_aes_192_cbc(void)
444} 397}
445LCRYPTO_ALIAS(EVP_aes_192_cbc); 398LCRYPTO_ALIAS(EVP_aes_192_cbc);
446 399
447#ifdef AESNI_CAPABLE
448static 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
460static const EVP_CIPHER aes_192_ecb = { 400static 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 = {
471const EVP_CIPHER * 411const EVP_CIPHER *
472EVP_aes_192_ecb(void) 412EVP_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}
480LCRYPTO_ALIAS(EVP_aes_192_ecb); 416LCRYPTO_ALIAS(EVP_aes_192_ecb);
481 417
@@ -587,19 +523,6 @@ EVP_aes_256_cbc(void)
587} 523}
588LCRYPTO_ALIAS(EVP_aes_256_cbc); 524LCRYPTO_ALIAS(EVP_aes_256_cbc);
589 525
590#ifdef AESNI_CAPABLE
591static 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
603static const EVP_CIPHER aes_256_ecb = { 526static 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 = {
614const EVP_CIPHER * 537const EVP_CIPHER *
615EVP_aes_256_ecb(void) 538EVP_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}
623LCRYPTO_ALIAS(EVP_aes_256_ecb); 542LCRYPTO_ALIAS(EVP_aes_256_ecb);
624 543