diff options
author | jsing <> | 2025-05-19 01:49:23 +0000 |
---|---|---|
committer | jsing <> | 2025-05-19 01:49:23 +0000 |
commit | dbe0564d1cb9d64e3c92a2a76d70de8f71f75b6a (patch) | |
tree | ee91a9ff0248f5701535d28cb535254d0e55e5ed /src/lib/libcrypto/evp/e_aes.c | |
parent | acc0eedcf426632ede939ed94b1e1299e1ae3e05 (diff) | |
download | openbsd-dbe0564d1cb9d64e3c92a2a76d70de8f71f75b6a.tar.gz openbsd-dbe0564d1cb9d64e3c92a2a76d70de8f71f75b6a.tar.bz2 openbsd-dbe0564d1cb9d64e3c92a2a76d70de8f71f75b6a.zip |
Simplify EVP AES code for CFB.
Provide AES-NI with its own aesni_cfb*_cipher() functions, which then
allows us to change the existing aes_cfb*_cipher() functions to () to call
AES_cfb*_encrypt() directly.
ok beck@ tb@
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/evp/e_aes.c | 104 |
1 files changed, 79 insertions, 25 deletions
diff --git a/src/lib/libcrypto/evp/e_aes.c b/src/lib/libcrypto/evp/e_aes.c index 23710a5a9b..b16a1e930e 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.65 2025/05/18 11:11:12 jsing Exp $ */ | 1 | /* $OpenBSD: e_aes.c,v 1.66 2025/05/19 01:49:23 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 | * |
@@ -198,6 +198,57 @@ aesni_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
198 | } | 198 | } |
199 | 199 | ||
200 | static int | 200 | static int |
201 | aesni_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
202 | const unsigned char *in, size_t len) | ||
203 | { | ||
204 | EVP_AES_KEY *eak = ctx->cipher_data; | ||
205 | |||
206 | CRYPTO_cfb128_encrypt(in, out, len, &eak->ks, ctx->iv, &ctx->num, | ||
207 | ctx->encrypt, (block128_f)aesni_encrypt); | ||
208 | |||
209 | return 1; | ||
210 | } | ||
211 | |||
212 | static int | ||
213 | aesni_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
214 | const unsigned char *in, size_t len) | ||
215 | { | ||
216 | EVP_AES_KEY *eak = ctx->cipher_data; | ||
217 | |||
218 | CRYPTO_cfb128_8_encrypt(in, out, len, &eak->ks, ctx->iv, &ctx->num, | ||
219 | ctx->encrypt, (block128_f)aesni_encrypt); | ||
220 | |||
221 | return 1; | ||
222 | } | ||
223 | |||
224 | static int | ||
225 | aesni_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | ||
226 | const unsigned char *in, size_t len) | ||
227 | { | ||
228 | EVP_AES_KEY *eak = ctx->cipher_data; | ||
229 | |||
230 | if ((ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) != 0) { | ||
231 | CRYPTO_cfb128_1_encrypt(in, out, len, &eak->ks, ctx->iv, | ||
232 | &ctx->num, ctx->encrypt, (block128_f)aesni_encrypt); | ||
233 | return 1; | ||
234 | } | ||
235 | |||
236 | while (len >= MAXBITCHUNK) { | ||
237 | CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK * 8, &eak->ks, | ||
238 | ctx->iv, &ctx->num, ctx->encrypt, (block128_f)aesni_encrypt); | ||
239 | len -= MAXBITCHUNK; | ||
240 | in += MAXBITCHUNK; | ||
241 | out += MAXBITCHUNK; | ||
242 | } | ||
243 | if (len > 0) { | ||
244 | CRYPTO_cfb128_1_encrypt(in, out, len * 8, &eak->ks, | ||
245 | ctx->iv, &ctx->num, ctx->encrypt, (block128_f)aesni_encrypt); | ||
246 | } | ||
247 | |||
248 | return 1; | ||
249 | } | ||
250 | |||
251 | static int | ||
201 | aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 252 | aesni_ctr_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
202 | const unsigned char *in, size_t len) | 253 | const unsigned char *in, size_t len) |
203 | { | 254 | { |
@@ -412,10 +463,11 @@ static int | |||
412 | aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 463 | aes_cfb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
413 | const unsigned char *in, size_t len) | 464 | const unsigned char *in, size_t len) |
414 | { | 465 | { |
415 | EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; | 466 | EVP_AES_KEY *eak = ctx->cipher_data; |
467 | |||
468 | AES_cfb128_encrypt(in, out, len, &eak->ks, ctx->iv, &ctx->num, | ||
469 | ctx->encrypt); | ||
416 | 470 | ||
417 | CRYPTO_cfb128_encrypt(in, out, len, &dat->ks, ctx->iv, &ctx->num, | ||
418 | ctx->encrypt, dat->block); | ||
419 | return 1; | 471 | return 1; |
420 | } | 472 | } |
421 | 473 | ||
@@ -423,10 +475,11 @@ static int | |||
423 | aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 475 | aes_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
424 | const unsigned char *in, size_t len) | 476 | const unsigned char *in, size_t len) |
425 | { | 477 | { |
426 | EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; | 478 | EVP_AES_KEY *eak = ctx->cipher_data; |
479 | |||
480 | AES_cfb8_encrypt(in, out, len, &eak->ks, ctx->iv, &ctx->num, | ||
481 | ctx->encrypt); | ||
427 | 482 | ||
428 | CRYPTO_cfb128_8_encrypt(in, out, len, &dat->ks, ctx->iv, &ctx->num, | ||
429 | ctx->encrypt, dat->block); | ||
430 | return 1; | 483 | return 1; |
431 | } | 484 | } |
432 | 485 | ||
@@ -434,24 +487,25 @@ static int | |||
434 | aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 487 | aes_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
435 | const unsigned char *in, size_t len) | 488 | const unsigned char *in, size_t len) |
436 | { | 489 | { |
437 | EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; | 490 | EVP_AES_KEY *eak = ctx->cipher_data; |
438 | 491 | ||
439 | if (ctx->flags&EVP_CIPH_FLAG_LENGTH_BITS) { | 492 | if ((ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) != 0) { |
440 | CRYPTO_cfb128_1_encrypt(in, out, len, &dat->ks, ctx->iv, | 493 | AES_cfb1_encrypt(in, out, len, &eak->ks, ctx->iv, &ctx->num, |
441 | &ctx->num, ctx->encrypt, dat->block); | 494 | ctx->encrypt); |
442 | return 1; | 495 | return 1; |
443 | } | 496 | } |
444 | 497 | ||
445 | while (len >= MAXBITCHUNK) { | 498 | while (len >= MAXBITCHUNK) { |
446 | CRYPTO_cfb128_1_encrypt(in, out, MAXBITCHUNK*8, &dat->ks, | 499 | AES_cfb1_encrypt(in, out, MAXBITCHUNK * 8, &eak->ks, ctx->iv, |
447 | ctx->iv, &ctx->num, ctx->encrypt, dat->block); | 500 | &ctx->num, ctx->encrypt); |
448 | len -= MAXBITCHUNK; | 501 | len -= MAXBITCHUNK; |
449 | in += MAXBITCHUNK; | 502 | in += MAXBITCHUNK; |
450 | out += MAXBITCHUNK; | 503 | out += MAXBITCHUNK; |
451 | } | 504 | } |
452 | if (len) | 505 | if (len > 0) { |
453 | CRYPTO_cfb128_1_encrypt(in, out, len*8, &dat->ks, | 506 | AES_cfb1_encrypt(in, out, len * 8, &eak->ks, ctx->iv, &ctx->num, |
454 | ctx->iv, &ctx->num, ctx->encrypt, dat->block); | 507 | ctx->encrypt); |
508 | } | ||
455 | 509 | ||
456 | return 1; | 510 | return 1; |
457 | } | 511 | } |
@@ -583,7 +637,7 @@ static const EVP_CIPHER aesni_128_cfb = { | |||
583 | .iv_len = 16, | 637 | .iv_len = 16, |
584 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, | 638 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, |
585 | .init = aesni_init_key, | 639 | .init = aesni_init_key, |
586 | .do_cipher = aes_cfb_cipher, | 640 | .do_cipher = aesni_cfb_cipher, |
587 | .ctx_size = sizeof(EVP_AES_KEY), | 641 | .ctx_size = sizeof(EVP_AES_KEY), |
588 | }; | 642 | }; |
589 | #endif | 643 | #endif |
@@ -618,7 +672,7 @@ static const EVP_CIPHER aesni_128_cfb1 = { | |||
618 | .iv_len = 16, | 672 | .iv_len = 16, |
619 | .flags = EVP_CIPH_CFB_MODE, | 673 | .flags = EVP_CIPH_CFB_MODE, |
620 | .init = aesni_init_key, | 674 | .init = aesni_init_key, |
621 | .do_cipher = aes_cfb1_cipher, | 675 | .do_cipher = aesni_cfb1_cipher, |
622 | .ctx_size = sizeof(EVP_AES_KEY), | 676 | .ctx_size = sizeof(EVP_AES_KEY), |
623 | }; | 677 | }; |
624 | #endif | 678 | #endif |
@@ -653,7 +707,7 @@ static const EVP_CIPHER aesni_128_cfb8 = { | |||
653 | .iv_len = 16, | 707 | .iv_len = 16, |
654 | .flags = EVP_CIPH_CFB_MODE, | 708 | .flags = EVP_CIPH_CFB_MODE, |
655 | .init = aesni_init_key, | 709 | .init = aesni_init_key, |
656 | .do_cipher = aes_cfb8_cipher, | 710 | .do_cipher = aesni_cfb8_cipher, |
657 | .ctx_size = sizeof(EVP_AES_KEY), | 711 | .ctx_size = sizeof(EVP_AES_KEY), |
658 | }; | 712 | }; |
659 | #endif | 713 | #endif |
@@ -829,7 +883,7 @@ static const EVP_CIPHER aesni_192_cfb = { | |||
829 | .iv_len = 16, | 883 | .iv_len = 16, |
830 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, | 884 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, |
831 | .init = aesni_init_key, | 885 | .init = aesni_init_key, |
832 | .do_cipher = aes_cfb_cipher, | 886 | .do_cipher = aesni_cfb_cipher, |
833 | .ctx_size = sizeof(EVP_AES_KEY), | 887 | .ctx_size = sizeof(EVP_AES_KEY), |
834 | }; | 888 | }; |
835 | #endif | 889 | #endif |
@@ -864,7 +918,7 @@ static const EVP_CIPHER aesni_192_cfb1 = { | |||
864 | .iv_len = 16, | 918 | .iv_len = 16, |
865 | .flags = EVP_CIPH_CFB_MODE, | 919 | .flags = EVP_CIPH_CFB_MODE, |
866 | .init = aesni_init_key, | 920 | .init = aesni_init_key, |
867 | .do_cipher = aes_cfb1_cipher, | 921 | .do_cipher = aesni_cfb1_cipher, |
868 | .ctx_size = sizeof(EVP_AES_KEY), | 922 | .ctx_size = sizeof(EVP_AES_KEY), |
869 | }; | 923 | }; |
870 | #endif | 924 | #endif |
@@ -899,7 +953,7 @@ static const EVP_CIPHER aesni_192_cfb8 = { | |||
899 | .iv_len = 16, | 953 | .iv_len = 16, |
900 | .flags = EVP_CIPH_CFB_MODE, | 954 | .flags = EVP_CIPH_CFB_MODE, |
901 | .init = aesni_init_key, | 955 | .init = aesni_init_key, |
902 | .do_cipher = aes_cfb8_cipher, | 956 | .do_cipher = aesni_cfb8_cipher, |
903 | .ctx_size = sizeof(EVP_AES_KEY), | 957 | .ctx_size = sizeof(EVP_AES_KEY), |
904 | }; | 958 | }; |
905 | #endif | 959 | #endif |
@@ -1075,7 +1129,7 @@ static const EVP_CIPHER aesni_256_cfb = { | |||
1075 | .iv_len = 16, | 1129 | .iv_len = 16, |
1076 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, | 1130 | .flags = EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CFB_MODE, |
1077 | .init = aesni_init_key, | 1131 | .init = aesni_init_key, |
1078 | .do_cipher = aes_cfb_cipher, | 1132 | .do_cipher = aesni_cfb_cipher, |
1079 | .ctx_size = sizeof(EVP_AES_KEY), | 1133 | .ctx_size = sizeof(EVP_AES_KEY), |
1080 | }; | 1134 | }; |
1081 | #endif | 1135 | #endif |
@@ -1110,7 +1164,7 @@ static const EVP_CIPHER aesni_256_cfb1 = { | |||
1110 | .iv_len = 16, | 1164 | .iv_len = 16, |
1111 | .flags = EVP_CIPH_CFB_MODE, | 1165 | .flags = EVP_CIPH_CFB_MODE, |
1112 | .init = aesni_init_key, | 1166 | .init = aesni_init_key, |
1113 | .do_cipher = aes_cfb1_cipher, | 1167 | .do_cipher = aesni_cfb1_cipher, |
1114 | .ctx_size = sizeof(EVP_AES_KEY), | 1168 | .ctx_size = sizeof(EVP_AES_KEY), |
1115 | }; | 1169 | }; |
1116 | #endif | 1170 | #endif |
@@ -1145,7 +1199,7 @@ static const EVP_CIPHER aesni_256_cfb8 = { | |||
1145 | .iv_len = 16, | 1199 | .iv_len = 16, |
1146 | .flags = EVP_CIPH_CFB_MODE, | 1200 | .flags = EVP_CIPH_CFB_MODE, |
1147 | .init = aesni_init_key, | 1201 | .init = aesni_init_key, |
1148 | .do_cipher = aes_cfb8_cipher, | 1202 | .do_cipher = aesni_cfb8_cipher, |
1149 | .ctx_size = sizeof(EVP_AES_KEY), | 1203 | .ctx_size = sizeof(EVP_AES_KEY), |
1150 | }; | 1204 | }; |
1151 | #endif | 1205 | #endif |