diff options
| author | jsing <> | 2025-05-19 01:49:23 +0000 |
|---|---|---|
| committer | jsing <> | 2025-05-19 01:49:23 +0000 |
| commit | 9b2ac9a3ec139ae9d40a9f6aff9da67390a51333 (patch) | |
| tree | ee91a9ff0248f5701535d28cb535254d0e55e5ed /src | |
| parent | fade7de7f38b7697809f64980d76a6dad65b039d (diff) | |
| download | openbsd-9b2ac9a3ec139ae9d40a9f6aff9da67390a51333.tar.gz openbsd-9b2ac9a3ec139ae9d40a9f6aff9da67390a51333.tar.bz2 openbsd-9b2ac9a3ec139ae9d40a9f6aff9da67390a51333.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 'src')
| -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 |
