From 4a42e2640499ce46d2733c4316c5fe4594a37c54 Mon Sep 17 00:00:00 2001 From: Shane Lontis Date: Mon, 26 Aug 2019 17:05:08 +1000 Subject: Cleanup ciphers and Add 3des ciphers. Moved the relevant ciphers into default and restructed headers to allow the move. This removed most of the cases of #ifdef NO_XXX (which are now specified in build.info) Reviewed-by: Richard Levitte (Merged from https://github.com/openssl/openssl/pull/9482) --- crypto/des/build.info | 9 +- crypto/err/openssl.txt | 1 + crypto/evp/evp_enc.c | 39 +++- crypto/include/internal/ciphermode_platform.h | 7 + doc/man7/provider-cipher.pod | 6 + include/openssl/core_names.h | 1 + providers/common/ciphers/block.c | 1 + providers/common/ciphers/build.info | 23 ++- providers/common/ciphers/cipher_aes.c | 3 +- providers/common/ciphers/cipher_aes.h | 1 + providers/common/ciphers/cipher_aes_ccm.c | 2 + providers/common/ciphers/cipher_aes_ccm_hw.c | 64 +++++++ .../common/ciphers/cipher_aes_ccm_hw_aesni.inc | 5 +- providers/common/ciphers/cipher_aes_ccm_hw_t4.inc | 2 +- providers/common/ciphers/cipher_aes_gcm.c | 2 + providers/common/ciphers/cipher_aes_gcm_hw.c | 78 ++++++++ .../common/ciphers/cipher_aes_gcm_hw_aesni.inc | 5 +- providers/common/ciphers/cipher_aes_gcm_hw_t4.inc | 2 +- providers/common/ciphers/cipher_aes_hw.c | 3 +- providers/common/ciphers/cipher_aria.c | 79 -------- providers/common/ciphers/cipher_aria.h | 31 ---- providers/common/ciphers/cipher_aria_ccm.c | 38 ---- providers/common/ciphers/cipher_aria_ccm_hw.inc | 42 ----- providers/common/ciphers/cipher_aria_gcm.c | 38 ---- providers/common/ciphers/cipher_aria_gcm_hw.inc | 53 ------ providers/common/ciphers/cipher_aria_hw.c | 48 ----- providers/common/ciphers/cipher_camellia.c | 82 --------- providers/common/ciphers/cipher_camellia.h | 32 ---- providers/common/ciphers/cipher_camellia_hw.c | 65 ------- providers/common/ciphers/cipher_camellia_hw_t4.inc | 83 --------- providers/common/ciphers/cipher_ccm.c | 2 + providers/common/ciphers/cipher_ccm.h | 136 -------------- providers/common/ciphers/cipher_ccm_hw.c | 76 ++------ providers/common/ciphers/cipher_common.c | 84 ++++----- providers/common/ciphers/cipher_common_hw.c | 3 - providers/common/ciphers/cipher_gcm.c | 2 + providers/common/ciphers/cipher_gcm.h | 165 ----------------- providers/common/ciphers/cipher_gcm_hw.c | 101 +---------- providers/common/ciphers/cipher_locl.h | 194 ++------------------ providers/common/ciphers/cipher_tdes.c | 116 ++++++++++++ providers/common/ciphers/cipher_tdes_hw.c | 82 +++++++++ .../common/include/internal/ciphers/cipher_aead.h | 49 +++++ .../common/include/internal/ciphers/cipher_ccm.h | 135 ++++++++++++++ .../common/include/internal/ciphers/cipher_gcm.h | 161 +++++++++++++++++ .../common/include/internal/ciphers/cipher_tdes.h | 96 ++++++++++ .../common/include/internal/ciphers/ciphercommon.h | 149 +++++++++++++++ providers/common/include/internal/provider_algs.h | 18 ++ .../common/include/internal/providercommonerr.h | 3 +- providers/common/provider_err.c | 2 + providers/default/build.info | 2 +- providers/default/ciphers/build.info | 22 +++ providers/default/ciphers/cipher_aria.c | 80 +++++++++ providers/default/ciphers/cipher_aria.h | 30 ++++ providers/default/ciphers/cipher_aria_ccm.c | 40 +++++ providers/default/ciphers/cipher_aria_ccm.h | 22 +++ providers/default/ciphers/cipher_aria_ccm_hw.c | 40 +++++ providers/default/ciphers/cipher_aria_gcm.c | 39 ++++ providers/default/ciphers/cipher_aria_gcm.h | 22 +++ providers/default/ciphers/cipher_aria_gcm_hw.c | 50 ++++++ providers/default/ciphers/cipher_aria_hw.c | 48 +++++ providers/default/ciphers/cipher_camellia.c | 81 +++++++++ providers/default/ciphers/cipher_camellia.h | 29 +++ providers/default/ciphers/cipher_camellia_hw.c | 64 +++++++ .../default/ciphers/cipher_camellia_hw_t4.inc | 83 +++++++++ providers/default/ciphers/cipher_desx.c | 15 ++ providers/default/ciphers/cipher_desx_hw.c | 62 +++++++ providers/default/ciphers/cipher_tdes_default.c | 29 +++ providers/default/ciphers/cipher_tdes_default.h | 25 +++ providers/default/ciphers/cipher_tdes_default_hw.c | 140 +++++++++++++++ providers/default/ciphers/cipher_tdes_wrap.c | 199 +++++++++++++++++++++ providers/default/ciphers/cipher_tdes_wrap_hw.c | 14 ++ providers/default/defltprov.c | 12 ++ providers/fips/fipsprov.c | 2 + test/recipes/30-test_evp_data/evpciph.txt | 10 ++ 74 files changed, 2270 insertions(+), 1309 deletions(-) create mode 100644 providers/common/ciphers/cipher_aes_ccm_hw.c create mode 100644 providers/common/ciphers/cipher_aes_gcm_hw.c delete mode 100644 providers/common/ciphers/cipher_aria.c delete mode 100644 providers/common/ciphers/cipher_aria.h delete mode 100644 providers/common/ciphers/cipher_aria_ccm.c delete mode 100644 providers/common/ciphers/cipher_aria_ccm_hw.inc delete mode 100644 providers/common/ciphers/cipher_aria_gcm.c delete mode 100644 providers/common/ciphers/cipher_aria_gcm_hw.inc delete mode 100644 providers/common/ciphers/cipher_aria_hw.c delete mode 100644 providers/common/ciphers/cipher_camellia.c delete mode 100644 providers/common/ciphers/cipher_camellia.h delete mode 100644 providers/common/ciphers/cipher_camellia_hw.c delete mode 100644 providers/common/ciphers/cipher_camellia_hw_t4.inc delete mode 100644 providers/common/ciphers/cipher_ccm.h delete mode 100644 providers/common/ciphers/cipher_gcm.h create mode 100644 providers/common/ciphers/cipher_tdes.c create mode 100644 providers/common/ciphers/cipher_tdes_hw.c create mode 100644 providers/common/include/internal/ciphers/cipher_aead.h create mode 100644 providers/common/include/internal/ciphers/cipher_ccm.h create mode 100644 providers/common/include/internal/ciphers/cipher_gcm.h create mode 100644 providers/common/include/internal/ciphers/cipher_tdes.h create mode 100644 providers/common/include/internal/ciphers/ciphercommon.h create mode 100644 providers/default/ciphers/build.info create mode 100644 providers/default/ciphers/cipher_aria.c create mode 100644 providers/default/ciphers/cipher_aria.h create mode 100644 providers/default/ciphers/cipher_aria_ccm.c create mode 100644 providers/default/ciphers/cipher_aria_ccm.h create mode 100644 providers/default/ciphers/cipher_aria_ccm_hw.c create mode 100644 providers/default/ciphers/cipher_aria_gcm.c create mode 100644 providers/default/ciphers/cipher_aria_gcm.h create mode 100644 providers/default/ciphers/cipher_aria_gcm_hw.c create mode 100644 providers/default/ciphers/cipher_aria_hw.c create mode 100644 providers/default/ciphers/cipher_camellia.c create mode 100644 providers/default/ciphers/cipher_camellia.h create mode 100644 providers/default/ciphers/cipher_camellia_hw.c create mode 100644 providers/default/ciphers/cipher_camellia_hw_t4.inc create mode 100644 providers/default/ciphers/cipher_desx.c create mode 100644 providers/default/ciphers/cipher_desx_hw.c create mode 100644 providers/default/ciphers/cipher_tdes_default.c create mode 100644 providers/default/ciphers/cipher_tdes_default.h create mode 100644 providers/default/ciphers/cipher_tdes_default_hw.c create mode 100644 providers/default/ciphers/cipher_tdes_wrap.c create mode 100644 providers/default/ciphers/cipher_tdes_wrap_hw.c diff --git a/crypto/des/build.info b/crypto/des/build.info index 474d14e229..33dd90c89a 100644 --- a/crypto/des/build.info +++ b/crypto/des/build.info @@ -13,13 +13,14 @@ IF[{- !$disabled{asm} -}] ENDIF LIBS=../../libcrypto -SOURCE[../../libcrypto]=\ - set_key.c ecb_enc.c cbc_enc.c \ - ecb3_enc.c cfb64enc.c cfb64ede.c cfb_enc.c \ +$COMMON=set_key.c ecb3_enc.c $DESASM +SOURCE[../../libcrypto]=$COMMON\ + ecb_enc.c cbc_enc.c \ + cfb64enc.c cfb64ede.c cfb_enc.c \ ofb64ede.c ofb64enc.c ofb_enc.c \ str2key.c pcbc_enc.c qud_cksm.c rand_key.c \ - $DESASM \ fcrypt.c xcbc_enc.c cbc_cksm.c +SOURCE[../../providers/fips]=$COMMON GENERATE[des_enc-sparc.S]=asm/des_enc.m4 GENERATE[dest4-sparcv9.S]=asm/dest4-sparcv9.pl $(PERLASM_SCHEME) diff --git a/crypto/err/openssl.txt b/crypto/err/openssl.txt index a545636447..58f6c4894f 100644 --- a/crypto/err/openssl.txt +++ b/crypto/err/openssl.txt @@ -2708,6 +2708,7 @@ PROP_R_TRAILING_CHARACTERS:110:trailing characters PROV_R_AES_KEY_SETUP_FAILED:101:aes key setup failed PROV_R_BAD_DECRYPT:100:bad decrypt PROV_R_CIPHER_OPERATION_FAILED:102:cipher operation failed +PROV_R_FAILED_TO_GENERATE_KEY:121:failed to generate key PROV_R_FAILED_TO_GET_PARAMETER:103:failed to get parameter PROV_R_FAILED_TO_SET_PARAMETER:104:failed to set parameter PROV_R_INVALID_AAD:108:invalid aad diff --git a/crypto/evp/evp_enc.c b/crypto/evp/evp_enc.c index e67e20c7ba..5723fe888e 100644 --- a/crypto/evp/evp_enc.c +++ b/crypto/evp/evp_enc.c @@ -217,6 +217,18 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, case NID_camellia_256_ctr: case NID_camellia_192_ctr: case NID_camellia_128_ctr: + case NID_des_ede3_cbc: + case NID_des_ede3_ecb: + case NID_des_ede3_ofb64: + case NID_des_ede3_cfb64: + case NID_des_ede3_cfb8: + case NID_des_ede3_cfb1: + case NID_des_ede_cbc: + case NID_des_ede_ecb: + case NID_des_ede_ofb64: + case NID_des_ede_cfb64: + case NID_desx_cbc: + case NID_id_smime_alg_CMS3DESwrap: break; default: goto legacy; @@ -1030,6 +1042,12 @@ int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_KEYLEN, &arg); break; case EVP_CTRL_RAND_KEY: /* Used by DES */ + set_params = 0; + params[0] = + OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_RANDOM_KEY, + ptr, (size_t)arg); + break; + case EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS: /* Used by DASYNC */ case EVP_CTRL_INIT: /* TODO(3.0) Purely legacy, no provider counterpart */ default: @@ -1141,19 +1159,24 @@ const OSSL_PARAM *EVP_CIPHER_CTX_gettable_params(const EVP_CIPHER *cipher) return NULL; } -#if !defined(FIPS_MODE) -/* TODO(3.0): No support for RAND yet in the FIPS module */ int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key) { - int kl; if (ctx->cipher->flags & EVP_CIPH_RAND_KEY) return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key); - kl = EVP_CIPHER_CTX_key_length(ctx); - if (kl <= 0 || RAND_priv_bytes(key, kl) <= 0) - return 0; - return 1; + +#ifdef FIPS_MODE + return 0; +#else + { + int kl; + + kl = EVP_CIPHER_CTX_key_length(ctx); + if (kl <= 0 || RAND_priv_bytes(key, kl) <= 0) + return 0; + return 1; + } +#endif /* FIPS_MODE */ } -#endif int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in) { diff --git a/crypto/include/internal/ciphermode_platform.h b/crypto/include/internal/ciphermode_platform.h index 934d8136d3..5db2e23eb9 100644 --- a/crypto/include/internal/ciphermode_platform.h +++ b/crypto/include/internal/ciphermode_platform.h @@ -223,6 +223,7 @@ void cmll256_t4_ctr32_encrypt(const unsigned char *in, unsigned char *out, # define SPARC_AES_CAPABLE (OPENSSL_sparcv9cap_P[1] & CFR_AES) +# define SPARC_DES_CAPABLE (OPENSSL_sparcv9cap_P[1] & CFR_DES) # define HWAES_CAPABLE (OPENSSL_sparcv9cap_P[0] & SPARCV9_FJAESX) # define HWAES_set_encrypt_key aes_fx_set_encrypt_key # define HWAES_set_decrypt_key aes_fx_set_decrypt_key @@ -237,6 +238,12 @@ void aes_t4_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); void aes_t4_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); +void des_t4_key_expand(const void *key, DES_key_schedule *ks); +void des_t4_ede3_cbc_encrypt(const void *inp, void *out, size_t len, + const DES_key_schedule ks[3], unsigned char iv[8]); +void des_t4_ede3_cbc_decrypt(const void *inp, void *out, size_t len, + const DES_key_schedule ks[3], unsigned char iv[8]); + /* * Key-length specific subroutines were chosen for following reason. * Each SPARC T4 core can execute up to 8 threads which share core's diff --git a/doc/man7/provider-cipher.pod b/doc/man7/provider-cipher.pod index 2e2e73b68b..040a34c126 100644 --- a/doc/man7/provider-cipher.pod +++ b/doc/man7/provider-cipher.pod @@ -302,6 +302,12 @@ IV length and the tag length. Sets the IV length to be used for an AEAD cipher for the associated cipher ctx. +=item B (octet_string) + +Gets a implementation specific randomly generated key for the associated +cipher ctx. This is currently only supported by 3DES (which sets the key to +odd parity). + =back =head1 RETURN VALUES diff --git a/include/openssl/core_names.h b/include/openssl/core_names.h index 11232cb177..448bc50e8a 100644 --- a/include/openssl/core_names.h +++ b/include/openssl/core_names.h @@ -54,6 +54,7 @@ extern "C" { #define OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD "tlsaadpad" /* size_t */ #define OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED "tlsivfixed" /* octet_string */ #define OSSL_CIPHER_PARAM_AEAD_IVLEN "aeadivlen" /* size_t */ +#define OSSL_CIPHER_PARAM_RANDOM_KEY "randkey" /* octet_string */ /* digest parameters */ #define OSSL_DIGEST_PARAM_XOFLEN "xoflen" diff --git a/providers/common/ciphers/block.c b/providers/common/ciphers/block.c index 73e17e1a11..a53e9255c9 100644 --- a/providers/common/ciphers/block.c +++ b/providers/common/ciphers/block.c @@ -9,6 +9,7 @@ #include #include "cipher_locl.h" +#include "internal/providercommonerr.h" /* * Fills a single block of buffered data from the input, and returns the amount diff --git a/providers/common/ciphers/build.info b/providers/common/ciphers/build.info index 4a816d0f4d..0302cf151e 100644 --- a/providers/common/ciphers/build.info +++ b/providers/common/ciphers/build.info @@ -1,21 +1,18 @@ LIBS=../../../libcrypto +IF[{- !$disabled{des} -}] + $COMMON_DES=cipher_tdes.c cipher_tdes_hw.c +ENDIF + $COMMON=cipher_common.c cipher_common_hw.c block.c \ cipher_aes.c cipher_aes_hw.c \ - cipher_gcm.c cipher_aes_gcm.c cipher_gcm_hw.c \ - cipher_ccm.c cipher_aes_ccm.c cipher_ccm_hw.c - + cipher_gcm.c cipher_gcm_hw.c \ + cipher_aes_gcm.c cipher_aes_gcm_hw.c \ + cipher_ccm.c cipher_ccm_hw.c \ + cipher_aes_ccm.c cipher_aes_ccm_hw.c \ + $COMMON_DES + SOURCE[../../../libcrypto]=$COMMON -IF[{- !$disabled{aria} -}] - SOURCE[../../../libcrypto]=\ - cipher_aria.c cipher_aria_hw.c \ - cipher_aria_gcm.c cipher_aria_ccm.c -ENDIF - -IF[{- !$disabled{camellia} -}] - SOURCE[../../../libcrypto]=\ - cipher_camellia.c cipher_camellia_hw.c -ENDIF INCLUDE[../../../libcrypto]=. ../../../crypto SOURCE[../../fips]=$COMMON diff --git a/providers/common/ciphers/cipher_aes.c b/providers/common/ciphers/cipher_aes.c index 15433bf326..46880e0bf7 100644 --- a/providers/common/ciphers/cipher_aes.c +++ b/providers/common/ciphers/cipher_aes.c @@ -9,7 +9,8 @@ /* Dispatch functions for AES cipher modes ecb, cbc, ofb, cfb, ctr */ -#include "cipher_locl.h" +#include "cipher_aes.h" +#include "internal/provider_algs.h" static OSSL_OP_cipher_freectx_fn aes_freectx; static OSSL_OP_cipher_dupctx_fn aes_dupctx; diff --git a/providers/common/ciphers/cipher_aes.h b/providers/common/ciphers/cipher_aes.h index 6c4a6237c0..741b20f6e3 100644 --- a/providers/common/ciphers/cipher_aes.h +++ b/providers/common/ciphers/cipher_aes.h @@ -8,6 +8,7 @@ */ #include +#include "internal/ciphers/ciphercommon.h" typedef struct prov_aes_ctx_st { PROV_CIPHER_CTX base; /* Must be first */ diff --git a/providers/common/ciphers/cipher_aes_ccm.c b/providers/common/ciphers/cipher_aes_ccm.c index 26b508df29..75f6e3fc9d 100644 --- a/providers/common/ciphers/cipher_aes_ccm.c +++ b/providers/common/ciphers/cipher_aes_ccm.c @@ -10,6 +10,8 @@ /* Dispatch functions for AES CCM mode */ #include "cipher_locl.h" +#include "internal/ciphers/cipher_ccm.h" +#include "internal/provider_algs.h" static void *aes_ccm_newctx(void *provctx, size_t keybits) { diff --git a/providers/common/ciphers/cipher_aes_ccm_hw.c b/providers/common/ciphers/cipher_aes_ccm_hw.c new file mode 100644 index 0000000000..f445cb73b7 --- /dev/null +++ b/providers/common/ciphers/cipher_aes_ccm_hw.c @@ -0,0 +1,64 @@ +/* + * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* AES CCM mode */ + +#include "cipher_locl.h" +#include "internal/ciphers/cipher_ccm.h" + +#define AES_HW_CCM_SET_KEY_FN(fn_set_enc_key, fn_blk, fn_ccm_enc, fn_ccm_dec) \ + fn_set_enc_key(key, keylen * 8, &actx->ccm.ks.ks); \ + CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ccm.ks.ks, \ + (block128_f)fn_blk); \ + ctx->str = ctx->enc ? (ccm128_f)fn_ccm_enc : (ccm128_f)fn_ccm_dec; \ + ctx->key_set = 1; + +static int ccm_generic_aes_initkey(PROV_CCM_CTX *ctx, const unsigned char *key, + size_t keylen) +{ + PROV_AES_CCM_CTX *actx = (PROV_AES_CCM_CTX *)ctx; + +#ifdef HWAES_CAPABLE + if (HWAES_CAPABLE) { + AES_HW_CCM_SET_KEY_FN(HWAES_set_encrypt_key, HWAES_encrypt, NULL, NULL); + } else +#endif /* HWAES_CAPABLE */ + +#ifdef VPAES_CAPABLE + if (VPAES_CAPABLE) { + AES_HW_CCM_SET_KEY_FN(vpaes_set_encrypt_key, vpaes_encrypt, NULL, NULL); + } else +#endif + { + AES_HW_CCM_SET_KEY_FN(AES_set_encrypt_key, AES_encrypt, NULL, NULL) + } + return 1; +} + +static const PROV_CCM_HW aes_ccm = { + ccm_generic_aes_initkey, + ccm_generic_setiv, + ccm_generic_setaad, + ccm_generic_auth_encrypt, + ccm_generic_auth_decrypt, + ccm_generic_gettag +}; + +#if defined(S390X_aes_128_CAPABLE) +# include "cipher_aes_ccm_hw_s390x.inc" +#elif defined(AESNI_CAPABLE) +# include "cipher_aes_ccm_hw_aesni.inc" +#elif defined(SPARC_AES_CAPABLE) +# include "cipher_aes_ccm_hw_t4.inc" +#else +const PROV_CCM_HW *PROV_AES_HW_ccm(size_t keybits) +{ + return &aes_ccm; +} +#endif diff --git a/providers/common/ciphers/cipher_aes_ccm_hw_aesni.inc b/providers/common/ciphers/cipher_aes_ccm_hw_aesni.inc index 0ace026a89..3a5e4a740d 100644 --- a/providers/common/ciphers/cipher_aes_ccm_hw_aesni.inc +++ b/providers/common/ciphers/cipher_aes_ccm_hw_aesni.inc @@ -17,8 +17,9 @@ static int ccm_aesni_initkey(PROV_CCM_CTX *ctx, const unsigned char *key, { PROV_AES_CCM_CTX *actx = (PROV_AES_CCM_CTX *)ctx; - AES_CCM_SET_KEY_FN(aesni_set_encrypt_key, aesni_encrypt, - aesni_ccm64_encrypt_blocks, aesni_ccm64_decrypt_blocks); + AES_HW_CCM_SET_KEY_FN(aesni_set_encrypt_key, aesni_encrypt, + aesni_ccm64_encrypt_blocks, + aesni_ccm64_decrypt_blocks); return 1; } diff --git a/providers/common/ciphers/cipher_aes_ccm_hw_t4.inc b/providers/common/ciphers/cipher_aes_ccm_hw_t4.inc index 0dc6efcef4..21bf6861e0 100644 --- a/providers/common/ciphers/cipher_aes_ccm_hw_t4.inc +++ b/providers/common/ciphers/cipher_aes_ccm_hw_t4.inc @@ -17,7 +17,7 @@ static int ccm_t4_aes_initkey(PROV_CCM_CTX *ctx, const unsigned char *key, { PROV_AES_CCM_CTX *actx = (PROV_AES_CCM_CTX *)ctx; - AES_CCM_SET_KEY_FN(aes_t4_set_encrypt_key, aes_t4_encrypt, NULL, NULL); + AES_HW_CCM_SET_KEY_FN(aes_t4_set_encrypt_key, aes_t4_encrypt, NULL, NULL); return 1; } diff --git a/providers/common/ciphers/cipher_aes_gcm.c b/providers/common/ciphers/cipher_aes_gcm.c index 60df02588f..69c98f4e13 100644 --- a/providers/common/ciphers/cipher_aes_gcm.c +++ b/providers/common/ciphers/cipher_aes_gcm.c @@ -10,6 +10,8 @@ /* Dispatch functions for AES GCM mode */ #include "cipher_locl.h" +#include "internal/ciphers/cipher_gcm.h" +#include "internal/provider_algs.h" static void *aes_gcm_newctx(void *provctx, size_t keybits) { diff --git a/providers/common/ciphers/cipher_aes_gcm_hw.c b/providers/common/ciphers/cipher_aes_gcm_hw.c new file mode 100644 index 0000000000..3f56e6861d --- /dev/null +++ b/providers/common/ciphers/cipher_aes_gcm_hw.c @@ -0,0 +1,78 @@ +/* + * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +/* Dispatch functions for AES GCM mode */ + +#include "cipher_locl.h" +#include "internal/ciphers/cipher_gcm.h" + +static int generic_aes_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key, + size_t keylen) +{ + PROV_AES_GCM_CTX *actx = (PROV_AES_GCM_CTX *)ctx; + AES_KEY *ks = &actx->ks.ks; + +# ifdef HWAES_CAPABLE + if (HWAES_CAPABLE) { +# ifdef HWAES_ctr32_encrypt_blocks + GCM_HW_SET_KEY_CTR_FN(ks, HWAES_set_encrypt_key, HWAES_encrypt, + HWAES_ctr32_encrypt_blocks); +# else + GCM_HW_SET_KEY_CTR_FN(ks, HWAES_set_encrypt_key, HWAES_encrypt, NULL); +# endif /* HWAES_ctr32_encrypt_blocks */ + } else +# endif /* HWAES_CAPABLE */ + +# ifdef BSAES_CAPABLE + if (BSAES_CAPABLE) { + GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt, + bsaes_ctr32_encrypt_blocks); + } else +# endif /* BSAES_CAPABLE */ + +# ifdef VPAES_CAPABLE + if (VPAES_CAPABLE) { + GCM_HW_SET_KEY_CTR_FN(ks, vpaes_set_encrypt_key, vpaes_encrypt, NULL); + } else +# endif /* VPAES_CAPABLE */ + + { +# ifdef AES_CTR_ASM + GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt, + AES_ctr32_encrypt); +# else + GCM_HW_SET_KEY_CTR_FN(ks, AES_set_encrypt_key, AES_encrypt, NULL); +# endif /* AES_CTR_ASM */ + } + ctx->key_set = 1; + return 1; +} + +static const PROV_GCM_HW aes_gcm = { + generic_aes_gcm_initkey, + gcm_setiv, + gcm_aad_update, + gcm_cipher_update, + gcm_cipher_final, + gcm_one_shot +}; + +#if defined(S390X_aes_128_CAPABLE) +# include "cipher_aes_gcm_hw_s390x.inc" +#elif defined(AESNI_CAPABLE) +# include "cipher_aes_gcm_hw_aesni.inc" +#elif defined(SPARC_AES_CAPABLE) +# include "cipher_aes_gcm_hw_t4.inc" +#else +const PROV_GCM_HW *PROV_AES_HW_gcm(size_t keybits) +{ + return &aes_gcm; +} +#endif + diff --git a/providers/common/ciphers/cipher_aes_gcm_hw_aesni.inc b/providers/common/ciphers/cipher_aes_gcm_hw_aesni.inc index c0cb231ff4..eb2a3f343a 100644 --- a/providers/common/ciphers/cipher_aes_gcm_hw_aesni.inc +++ b/providers/common/ciphers/cipher_aes_gcm_hw_aesni.inc @@ -17,9 +17,8 @@ static int aesni_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key, { PROV_AES_GCM_CTX *actx = (PROV_AES_GCM_CTX *)ctx; AES_KEY *ks = &actx->ks.ks; - - SET_KEY_CTR_FN(ks, aesni_set_encrypt_key, aesni_encrypt, - aesni_ctr32_encrypt_blocks); + GCM_HW_SET_KEY_CTR_FN(ks, aesni_set_encrypt_key, aesni_encrypt, + aesni_ctr32_encrypt_blocks); return 1; } diff --git a/providers/common/ciphers/cipher_aes_gcm_hw_t4.inc b/providers/common/ciphers/cipher_aes_gcm_hw_t4.inc index 0cb3f811e1..19e9ccb760 100644 --- a/providers/common/ciphers/cipher_aes_gcm_hw_t4.inc +++ b/providers/common/ciphers/cipher_aes_gcm_hw_t4.inc @@ -34,7 +34,7 @@ static int t4_aes_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key, return 0; } - SET_KEY_CTR_FN(ks, aes_t4_set_encrypt_key, aes_t4_encrypt, ctr); + GCM_HW_SET_KEY_CTR_FN(ks, aes_t4_set_encrypt_key, aes_t4_encrypt, ctr); return 1; } diff --git a/providers/common/ciphers/cipher_aes_hw.c b/providers/common/ciphers/cipher_aes_hw.c index d80c63ecf9..e9b6388300 100644 --- a/providers/common/ciphers/cipher_aes_hw.c +++ b/providers/common/ciphers/cipher_aes_hw.c @@ -7,7 +7,8 @@ * https://www.openssl.org/source/license.html */ -#include "cipher_locl.h" +#include "cipher_aes.h" +#include "internal/providercommonerr.h" static int cipher_hw_aes_initkey(PROV_CIPHER_CTX *dat, const unsigned char *key, size_t keylen) diff --git a/providers/common/ciphers/cipher_aria.c b/providers/common/ciphers/cipher_aria.c deleted file mode 100644 index 5b7e8398bc..0000000000 --- a/providers/common/ciphers/cipher_aria.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* Dispatch functions for ARIA cipher modes ecb, cbc, ofb, cfb, ctr */ - -#include "cipher_locl.h" - -static OSSL_OP_cipher_freectx_fn aria_freectx; -static OSSL_OP_cipher_dupctx_fn aria_dupctx; - -static void aria_freectx(void *vctx) -{ - PROV_ARIA_CTX *ctx = (PROV_ARIA_CTX *)vctx; - - OPENSSL_clear_free(ctx, sizeof(*ctx)); -} - -static void *aria_dupctx(void *ctx) -{ - PROV_ARIA_CTX *in = (PROV_ARIA_CTX *)ctx; - PROV_ARIA_CTX *ret = OPENSSL_malloc(sizeof(*ret)); - - if (ret == NULL) { - ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); - return NULL; - } - *ret = *in; - - return ret; -} - -/* aria256ecb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ecb, ECB, 0, 256, 128, 0, block) -/* aria192ecb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ecb, ECB, 0, 192, 128, 0, block) -/* aria128ecb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ecb, ECB, 0, 128, 128, 0, block) -/* aria256cbc_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cbc, CBC, 0, 256, 128, 128, block) -/* aria192cbc_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cbc, CBC, 0, 192, 128, 128, block) -/* aria128cbc_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cbc, CBC, 0, 128, 128, 128, block) -/* aria256ofb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ofb, OFB, 0, 256, 8, 128, stream) -/* aria192ofb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ofb, OFB, 0, 192, 8, 128, stream) -/* aria128ofb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ofb, OFB, 0, 128, 8, 128, stream) -/* aria256cfb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb, CFB, 0, 256, 8, 128, stream) -/* aria192cfb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb, CFB, 0, 192, 8, 128, stream) -/* aria128cfb_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb, CFB, 0, 128, 8, 128, stream) -/* aria256cfb1_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb1, CFB, 0, 256, 8, 128, stream) -/* aria192cfb1_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb1, CFB, 0, 192, 8, 128, stream) -/* aria128cfb1_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb1, CFB, 0, 128, 8, 128, stream) -/* aria256cfb8_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb8, CFB, 0, 256, 8, 128, stream) -/* aria192cfb8_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb8, CFB, 0, 192, 8, 128, stream) -/* aria128cfb8_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, cfb8, CFB, 0, 128, 8, 128, stream) -/* aria256ctr_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ctr, CTR, 0, 256, 8, 128, stream) -/* aria192ctr_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ctr, CTR, 0, 192, 8, 128, stream) -/* aria128ctr_functions */ -IMPLEMENT_generic_cipher(aria, ARIA, ctr, CTR, 0, 128, 8, 128, stream) diff --git a/providers/common/ciphers/cipher_aria.h b/providers/common/ciphers/cipher_aria.h deleted file mode 100644 index 2b8015f6d7..0000000000 --- a/providers/common/ciphers/cipher_aria.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#if !defined(OPENSSL_NO_ARIA) -# include "internal/aria.h" - -typedef struct prov_aria_ctx_st { - PROV_CIPHER_CTX base; /* Must be first */ - union { - OSSL_UNION_ALIGN; - ARIA_KEY ks; - } ks; -} PROV_ARIA_CTX; - -# define PROV_CIPHER_HW_aria_ofb PROV_CIPHER_HW_aria_ofb128 -# define PROV_CIPHER_HW_aria_cfb PROV_CIPHER_HW_aria_cfb128 -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_ecb(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_cbc(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_ofb128(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_cfb128(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_cfb1(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_cfb8(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_ctr(size_t keybits); - -#endif /* OPENSSL_NO_ARIA */ diff --git a/providers/common/ciphers/cipher_aria_ccm.c b/providers/common/ciphers/cipher_aria_ccm.c deleted file mode 100644 index 061ce53176..0000000000 --- a/providers/common/ciphers/cipher_aria_ccm.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* Dispatch functions for ARIA CCM mode */ - -#include "cipher_locl.h" - -static void *aria_ccm_newctx(void *provctx, size_t keybits) -{ - PROV_ARIA_CCM_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); - - if (ctx != NULL) - ccm_initctx(&ctx->base, keybits, PROV_ARIA_HW_ccm(keybits)); - return ctx; -} - -static OSSL_OP_cipher_freectx_fn aria_ccm_freectx; -static void aria_ccm_freectx(void *vctx) -{ - PROV_ARIA_CCM_CTX *ctx = (PROV_ARIA_CCM_CTX *)vctx; - - ccm_finalctx((PROV_CCM_CTX *)ctx); - OPENSSL_clear_free(ctx, sizeof(*ctx)); -} - -/* aria128ccm functions */ -IMPLEMENT_aead_cipher(aria, ccm, CCM, AEAD_FLAGS, 128, 8, 96); -/* aria192ccm functions */ -IMPLEMENT_aead_cipher(aria, ccm, CCM, AEAD_FLAGS, 192, 8, 96); -/* aria256ccm functions */ -IMPLEMENT_aead_cipher(aria, ccm, CCM, AEAD_FLAGS, 256, 8, 96); - diff --git a/providers/common/ciphers/cipher_aria_ccm_hw.inc b/providers/common/ciphers/cipher_aria_ccm_hw.inc deleted file mode 100644 index d980fa9b97..0000000000 --- a/providers/common/ciphers/cipher_aria_ccm_hw.inc +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/*- - * Generic support for ARIA CCM. - * This file is included by cipher_ccm_hw.c - */ - -#if !defined(OPENSSL_NO_ARIA) && !defined(FIPS_MODE) - -static int ccm_aria_initkey(PROV_CCM_CTX *ctx, - const unsigned char *key, size_t keylen) -{ - PROV_ARIA_CCM_CTX *actx = (PROV_ARIA_CCM_CTX *)ctx; - - aria_set_encrypt_key(key, keylen * 8, &actx->ks.ks); - CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ks.ks, - (block128_f)aria_encrypt); - ctx->str = NULL; - ctx->key_set = 1; - return 1; -} - -static const PROV_CCM_HW ccm_aria = { - ccm_aria_initkey, - ccm_generic_setiv, - ccm_generic_setaad, - ccm_generic_auth_encrypt, - ccm_generic_auth_decrypt, - ccm_generic_gettag -}; -const PROV_CCM_HW *PROV_ARIA_HW_ccm(size_t keybits) -{ - return &ccm_aria; -} -#endif /* OPENSSL_NO_ARIA */ diff --git a/providers/common/ciphers/cipher_aria_gcm.c b/providers/common/ciphers/cipher_aria_gcm.c deleted file mode 100644 index c68ad2c3ae..0000000000 --- a/providers/common/ciphers/cipher_aria_gcm.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* Dispatch functions for ARIA GCM mode */ - -#include "cipher_locl.h" - -static void *aria_gcm_newctx(void *provctx, size_t keybits) -{ - PROV_ARIA_GCM_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); - - if (ctx != NULL) - gcm_initctx(provctx, &ctx->base, keybits, PROV_ARIA_HW_gcm(keybits), 4); - return ctx; -} - -static OSSL_OP_cipher_freectx_fn aria_gcm_freectx; -static void aria_gcm_freectx(void *vctx) -{ - PROV_ARIA_GCM_CTX *ctx = (PROV_ARIA_GCM_CTX *)vctx; - - gcm_deinitctx((PROV_GCM_CTX *)ctx); - OPENSSL_clear_free(ctx, sizeof(*ctx)); -} - -/* aria128gcm_functions */ -IMPLEMENT_aead_cipher(aria, gcm, GCM, AEAD_FLAGS, 128, 8, 96); -/* aria192gcm_functions */ -IMPLEMENT_aead_cipher(aria, gcm, GCM, AEAD_FLAGS, 192, 8, 96); -/* aria256gcm_functions */ -IMPLEMENT_aead_cipher(aria, gcm, GCM, AEAD_FLAGS, 256, 8, 96); - diff --git a/providers/common/ciphers/cipher_aria_gcm_hw.inc b/providers/common/ciphers/cipher_aria_gcm_hw.inc deleted file mode 100644 index fcb9bfce2b..0000000000 --- a/providers/common/ciphers/cipher_aria_gcm_hw.inc +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/*- - * Generic support for ARIA GCM. - * This file is included by cipher_gcm_hw.c - */ - -#if !defined(OPENSSL_NO_ARIA) && !defined(FIPS_MODE) - -static int aria_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key, - size_t keylen) -{ - PROV_ARIA_GCM_CTX *actx = (PROV_ARIA_GCM_CTX *)ctx; - ARIA_KEY *ks = &actx->ks.ks; - - SET_KEY_CTR_FN(ks, aria_set_encrypt_key, aria_encrypt, NULL); - return 1; -} - -static int aria_cipher_update(PROV_GCM_CTX *ctx, const unsigned char *in, - size_t len, unsigned char *out) -{ - if (ctx->enc) { - if (CRYPTO_gcm128_encrypt(&ctx->gcm, in, out, len)) - return 0; - } else { - if (CRYPTO_gcm128_decrypt(&ctx->gcm, in, out, len)) - return 0; - } - return 1; -} - -static const PROV_GCM_HW aria_gcm = { - aria_gcm_initkey, - gcm_setiv, - gcm_aad_update, - aria_cipher_update, - gcm_cipher_final, - gcm_one_shot -}; -const PROV_GCM_HW *PROV_ARIA_HW_gcm(size_t keybits) -{ - return &aria_gcm; -} - -#endif /* !defined(OPENSSL_NO_ARIA) && !defined(FIPS_MODE) */ diff --git a/providers/common/ciphers/cipher_aria_hw.c b/providers/common/ciphers/cipher_aria_hw.c deleted file mode 100644 index 2a89573521..0000000000 --- a/providers/common/ciphers/cipher_aria_hw.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "cipher_locl.h" - -static int cipher_hw_aria_initkey(PROV_CIPHER_CTX *dat, - const unsigned char *key, size_t keylen) -{ - int ret, mode = dat->mode; - PROV_ARIA_CTX *adat = (PROV_ARIA_CTX *)dat; - ARIA_KEY *ks = &adat->ks.ks; - - if (dat->enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE)) - ret = aria_set_encrypt_key(key, keylen * 8, ks); - else - ret = aria_set_decrypt_key(key, keylen * 8, ks); - if (ret < 0) { - ERR_raise(ERR_LIB_PROV, EVP_R_ARIA_KEY_SETUP_FAILED); - return 0; - } - dat->ks = ks; - dat->block = (block128_f)aria_encrypt; - return 1; -} - -# define PROV_CIPHER_HW_aria_mode(mode) \ -static const PROV_CIPHER_HW aria_##mode = { \ - cipher_hw_aria_initkey, \ - cipher_hw_chunked_##mode \ -}; \ -const PROV_CIPHER_HW *PROV_CIPHER_HW_aria_##mode(size_t keybits) \ -{ \ - return &aria_##mode; \ -} - -PROV_CIPHER_HW_aria_mode(cbc) -PROV_CIPHER_HW_aria_mode(ecb) -PROV_CIPHER_HW_aria_mode(ofb128) -PROV_CIPHER_HW_aria_mode(cfb128) -PROV_CIPHER_HW_aria_mode(cfb1) -PROV_CIPHER_HW_aria_mode(cfb8) -PROV_CIPHER_HW_aria_mode(ctr) diff --git a/providers/common/ciphers/cipher_camellia.c b/providers/common/ciphers/cipher_camellia.c deleted file mode 100644 index 9215346924..0000000000 --- a/providers/common/ciphers/cipher_camellia.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/* Dispatch functions for CAMELLIA cipher modes ecb, cbc, ofb, cfb, ctr */ - -#include "cipher_locl.h" - -#if !defined(OPENSSL_NO_CAMELLIA) -static OSSL_OP_cipher_freectx_fn camellia_freectx; -static OSSL_OP_cipher_dupctx_fn camellia_dupctx; - -static void camellia_freectx(void *vctx) -{ - PROV_CAMELLIA_CTX *ctx = (PROV_CAMELLIA_CTX *)vctx; - - OPENSSL_clear_free(ctx, sizeof(*ctx)); -} - -static void *camellia_dupctx(void *ctx) -{ - PROV_CAMELLIA_CTX *in = (PROV_CAMELLIA_CTX *)ctx; - PROV_CAMELLIA_CTX *ret = OPENSSL_malloc(sizeof(*ret)); - - if (ret == NULL) { - ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); - return NULL; - } - *ret = *in; - - return ret; -} - -/* camellia256ecb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ecb, ECB, 0, 256, 128, 0, block) -/* camellia192ecb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ecb, ECB, 0, 192, 128, 0, block) -/* camellia128ecb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ecb, ECB, 0, 128, 128, 0, block) -/* camellia256cbc_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cbc, CBC, 0, 256, 128, 128, block) -/* camellia192cbc_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cbc, CBC, 0, 192, 128, 128, block) -/* camellia128cbc_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cbc, CBC, 0, 128, 128, 128, block) -/* camellia256ofb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ofb, OFB, 0, 256, 8, 128, stream) -/* camellia192ofb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ofb, OFB, 0, 192, 8, 128, stream) -/* camellia128ofb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ofb, OFB, 0, 128, 8, 128, stream) -/* camellia256cfb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb, CFB, 0, 256, 8, 128, stream) -/* camellia192cfb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb, CFB, 0, 192, 8, 128, stream) -/* camellia128cfb_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb, CFB, 0, 128, 8, 128, stream) -/* camellia256cfb1_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb1, CFB, 0, 256, 8, 128, stream) -/* camellia192cfb1_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb1, CFB, 0, 192, 8, 128, stream) -/* camellia128cfb1_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb1, CFB, 0, 128, 8, 128, stream) -/* camellia256cfb8_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb8, CFB, 0, 256, 8, 128, stream) -/* camellia192cfb8_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb8, CFB, 0, 192, 8, 128, stream) -/* camellia128cfb8_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, cfb8, CFB, 0, 128, 8, 128, stream) -/* camellia256ctr_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ctr, CTR, 0, 256, 8, 128, stream) -/* camellia192ctr_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ctr, CTR, 0, 192, 8, 128, stream) -/* camellia128ctr_functions */ -IMPLEMENT_generic_cipher(camellia, CAMELLIA, ctr, CTR, 0, 128, 8, 128, stream) - -#endif /* OPENSSL_NO_CAMELLIA */ diff --git a/providers/common/ciphers/cipher_camellia.h b/providers/common/ciphers/cipher_camellia.h deleted file mode 100644 index e8e96bad81..0000000000 --- a/providers/common/ciphers/cipher_camellia.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#ifndef OPENSSL_NO_CAMELLIA - -# include - -typedef struct prov_camellia_ctx_st { - PROV_CIPHER_CTX base; /* Must be first */ - union { - OSSL_UNION_ALIGN; - CAMELLIA_KEY ks; - } ks; -} PROV_CAMELLIA_CTX; - -# define PROV_CIPHER_HW_camellia_ofb PROV_CIPHER_HW_camellia_ofb128 -# define PROV_CIPHER_HW_camellia_cfb PROV_CIPHER_HW_camellia_cfb128 -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_ecb(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_cbc(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_ofb128(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_cfb128(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_cfb1(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_cfb8(size_t keybits); -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_ctr(size_t keybits); - -#endif /* OPENSSL_NO_CAMELLIA */ diff --git a/providers/common/ciphers/cipher_camellia_hw.c b/providers/common/ciphers/cipher_camellia_hw.c deleted file mode 100644 index dd65b31aef..0000000000 --- a/providers/common/ciphers/cipher_camellia_hw.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -#include "cipher_locl.h" - -#if !defined(OPENSSL_NO_CAMELLIA) -static int cipher_hw_camellia_initkey(PROV_CIPHER_CTX *dat, - const unsigned char *key, size_t keylen) -{ - int ret, mode = dat->mode; - PROV_CAMELLIA_CTX *adat = (PROV_CAMELLIA_CTX *)dat; - CAMELLIA_KEY *ks = &adat->ks.ks; - - dat->ks = ks; - ret = Camellia_set_key(key, keylen * 8, ks); - if (ret < 0) { - ERR_raise(ERR_LIB_PROV, EVP_R_ARIA_KEY_SETUP_FAILED); - return 0; - } - if (dat->enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE)) { - dat->block = (block128_f) Camellia_encrypt; - dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? - (cbc128_f) Camellia_cbc_encrypt : NULL; - } else { - dat->block = (block128_f) Camellia_decrypt; - dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? - (cbc128_f) Camellia_cbc_encrypt : NULL; - } - return 1; -} - -# if defined(SPARC_CMLL_CAPABLE) -# include "cipher_camellia_hw_t4.inc" -# else -/* The generic case */ -# define PROV_CIPHER_HW_declare(mode) -# define PROV_CIPHER_HW_select(mode) -# endif /* SPARC_CMLL_CAPABLE */ - -#define PROV_CIPHER_HW_camellia_mode(mode) \ -static const PROV_CIPHER_HW camellia_##mode = { \ - cipher_hw_camellia_initkey, \ - cipher_hw_generic_##mode \ -}; \ -PROV_CIPHER_HW_declare(mode) \ -const PROV_CIPHER_HW *PROV_CIPHER_HW_camellia_##mode(size_t keybits) \ -{ \ - PROV_CIPHER_HW_select(mode) \ - return &camellia_##mode; \ -} - -PROV_CIPHER_HW_camellia_mode(cbc) -PROV_CIPHER_HW_camellia_mode(ecb) -PROV_CIPHER_HW_camellia_mode(ofb128) -PROV_CIPHER_HW_camellia_mode(cfb128) -PROV_CIPHER_HW_camellia_mode(cfb1) -PROV_CIPHER_HW_camellia_mode(cfb8) -PROV_CIPHER_HW_camellia_mode(ctr) -#endif /* OPENSSL_NO_CAMELLIA */ diff --git a/providers/common/ciphers/cipher_camellia_hw_t4.inc b/providers/common/ciphers/cipher_camellia_hw_t4.inc deleted file mode 100644 index 24e104646b..0000000000 --- a/providers/common/ciphers/cipher_camellia_hw_t4.inc +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -/*- - * Fujitsu SPARC64 X support for camellia modes. - * This file is included by cipher_camellia_hw.c - */ - -static int cipher_hw_camellia_t4_initkey(PROV_CIPHER_CTX *dat, - const unsigned char *key, - size_t keylen) -{ - int ret = 0, bits, mode = dat->mode; - PROV_CAMELLIA_CTX *adat = (PROV_CAMELLIA_CTX *)dat; - CAMELLIA_KEY *ks = &adat->ks.ks; - - dat->ks = ks; - bits = keylen * 8; - - cmll_t4_set_key(key, bits, ks); - - if (dat->enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE)) { - dat->block = (block128_f) cmll_t4_encrypt; - switch (bits) { - case 128: - if (mode == EVP_CIPH_CBC_MODE) - dat->stream.cbc = (cbc128_f) cmll128_t4_cbc_encrypt; - else if (mode == EVP_CIPH_CTR_MODE) - dat->stream.ctr = (ctr128_f) cmll128_t4_ctr32_encrypt; - else - dat->stream.cbc = NULL; - break; - case 192: - case 256: - if (mode == EVP_CIPH_CBC_MODE) - dat->stream.cbc = (cbc128_f) cmll256_t4_cbc_encrypt; - else if (mode == EVP_CIPH_CTR_MODE) - dat->stream.ctr = (ctr128_f) cmll256_t4_ctr32_encrypt; - else - dat->stream.cbc = NULL; - break; - default: - ret = -1; - break; - } - } else { - dat->block = (block128_f) cmll_t4_decrypt; - switch (bits) { - case 128: - dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? - (cbc128_f) cmll128_t4_cbc_decrypt : NULL; - break; - case 192: - case 256: - dat->stream.cbc = mode == EVP_CIPH_CBC_MODE ? - (cbc128_f) cmll256_t4_cbc_decrypt : NULL; - break; - default: - ret = -1; - break; - } - } - if (ret < 0) { - ERR_raise(ERR_LIB_PROV, EVP_R_CAMELLIA_KEY_SETUP_FAILED); - return 0; - } - return 1; -} - -#define PROV_CIPHER_HW_declare(mode) \ -static const PROV_CIPHER_HW t4_camellia_##mode = { \ - cipher_hw_camellia_t4_initkey, \ - cipher_hw_generic_##mode \ -}; -#define PROV_CIPHER_HW_select(mode) \ -if (SPARC_CMLL_CAPABLE) \ - return &t4_camellia_##mode; diff --git a/providers/common/ciphers/cipher_ccm.c b/providers/common/ciphers/cipher_ccm.c index fcfef73197..211b64f768 100644 --- a/providers/common/ciphers/cipher_ccm.c +++ b/providers/common/ciphers/cipher_ccm.c @@ -10,6 +10,8 @@ /* Dispatch functions for ccm mode */ #include "cipher_locl.h" +#include "internal/ciphers/cipher_ccm.h" +#include "internal/providercommonerr.h" static int ccm_cipher_internal(PROV_CCM_CTX *ctx, unsigned char *out, size_t *padlen, const unsigned char *in, diff --git a/providers/common/ciphers/cipher_ccm.h b/providers/common/ciphers/cipher_ccm.h deleted file mode 100644 index d91ad0013e..0000000000 --- a/providers/common/ciphers/cipher_ccm.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. - * - * Licensed under the Apache License 2.0 (the "License"). You may not use - * this file except in compliance with the License. You can obtain a copy - * in the file LICENSE in the source distribution or at - * https://www.openssl.org/source/license.html - */ - -typedef struct prov_ccm_hw_st PROV_CCM_HW; - -#if defined(OPENSSL_CPUID_OBJ) && defined(__s390__) -/*- - * KMAC-AES parameter block - begin - * (see z/Architecture Principles of Operation >= SA22-7832-08) - */ -typedef struct S390X_kmac_params_st { - union { - unsigned long long g[2]; - unsigned char b[16]; - } icv; - unsigned char k[32]; -} S390X_KMAC_PARAMS; -/* KMAC-AES parameter block - end */ -#endif - -/* Base structure that is shared by AES & ARIA for CCM MODE */ -typedef struct prov_ccm_st { - int enc; - int key_set; /* Set if key initialised */ - int iv_set; /* Set if an iv is set */ - int tag_set; /* Set if tag is valid */ - int len_set; /* Set if message length set */ - size_t l, m; /* L and M parameters from RFC3610 */ - size_t keylen; - int tls_aad_len; /* TLS AAD length */ - int tls_aad_pad_sz; - unsigned char iv[AES_BLOCK_SIZE]; - unsigned char buf[AES_BLOCK_SIZE]; - CCM128_CONTEXT ccm_ctx; - ccm128_f str; - const PROV_CCM_HW *hw; /* hardware specific methods */ -} PROV_CCM_CTX; - -typedef struct prov_aes_ccm_ctx_st { - PROV_CCM_CTX base; /* Must be first */ - union { - OSSL_UNION_ALIGN; - /*- - * Padding is chosen so that s390x.kmac.k overlaps with ks.ks and - * fc with ks.ks.rounds. Remember that on s390x, an AES_KEY's - * rounds field is used to store the function code and that the key - * schedule is not stored (if aes hardware support is detected). - */ - struct { - unsigned char pad[16]; - AES_KEY ks; - } ks; -#if defined(OPENSSL_CPUID_OBJ) && defined(__s390__) - struct { - S390X_KMAC_PARAMS kmac; - unsigned long long blocks; - union { - unsigned long long g[2]; - unsigned char b[AES_BLOCK_SIZE]; - } nonce; - union { - unsigned long long g[2]; - unsigned char b[AES_BLOCK_SIZE]; - } buf; - unsigned char dummy_pad[168]; - unsigned int fc; /* fc has same offset as ks.ks.rounds */ - } s390x; -#endif /* defined(OPENSSL_CPUID_OBJ) && defined(__s390__) */ - } ccm; -} PROV_AES_CCM_CTX; - -PROV_CIPHER_FUNC(int, CCM_cipher, (PROV_CCM_CTX *ctx, unsigned char *out, \ - size_t *padlen, const unsigned char *in, \ - size_t len)); -PROV_CIPHER_FUNC(int, CCM_setkey, (PROV_CCM_CTX *ctx, \ - const unsigned char *key, size_t keylen)); -PROV_CIPHER_FUNC(int, CCM_setiv, (PROV_CCM_CTX *dat, \ - const unsigned char *iv, size_t ivlen, \ - size_t mlen)); -PROV_CIPHER_FUNC(int, CCM_setaad, (PROV_CCM_CTX *ctx, \ - const unsigned char *aad, size_t aadlen)); -PROV_CIPHER_FUNC(int, CCM_auth_encrypt, (PROV_CCM_CTX *ctx, \ - const unsigned char *in, \ - unsigned char *out, size_t len, \ - unsigned char *tag, size_t taglen)); -PROV_CIPHER_FUNC(int, CCM_auth_decrypt, (PROV_CCM_CTX *ctx, \ - const unsigned char *in, \ - unsigned char *out, size_t len, \ - unsigned char *tag, size_t taglen)); -PROV_CIPHER_FUNC(int, CCM_gettag, (PROV_CCM_CTX *ctx, \ - unsigned char *tag, size_t taglen)); - -/* - * CCM Mode internal method table used to handle hardware specific differences, - * (and different algorithms). - */ -struct prov_ccm_hw_st { - OSSL_CCM_setkey_fn setkey; - OSSL_CCM_setiv_fn setiv; - OSSL_CCM_setaad_fn setaad; - OSSL_CCM_auth_encrypt_fn auth_encrypt; - OSSL_CCM_auth_decrypt_fn auth_decrypt; - OSSL_CCM_gettag_fn gettag; -}; - -const PROV_CCM_HW *PROV_AES_HW_ccm(size_t keylen); - -#if !defined(OPENSSL_NO_ARIA) && !defined(FIPS_MODE) -# include "internal/aria.h" -typedef struct prov_aria_ccm_ctx_st { - PROV_CCM_CTX base; /* Must be first */ - union { - OSSL_UNION_ALIGN; - ARIA_KEY ks; - } ks; /* ARIA key schedule to use */ -} PROV_ARIA_CCM_CTX; - -const PROV_CCM_HW *PROV_ARIA_HW_ccm(size_t keylen); - -#endif /* !defined(OPENSSL_NO_ARIA) && !defined(FIPS_MODE) */ - -OSSL_OP_cipher_encrypt_init_fn ccm_einit; -OSSL_OP_cipher_decrypt_init_fn ccm_dinit; -OSSL_OP_cipher_get_ctx_params_fn ccm_get_ctx_params; -OSSL_OP_cipher_set_ctx_params_fn ccm_set_ctx_params; -OSSL_OP_cipher_update_fn ccm_stream_update; -OSSL_OP_cipher_final_fn ccm_stream_final; -OSSL_OP_cipher_cipher_fn ccm_cipher; -void ccm_initctx(PROV_CCM_CTX *ctx, size_t keybits, const PROV_CCM_HW *hw); -void ccm_finalctx(PROV_CCM_CTX *ctx); diff --git a/providers/common/ciphers/cipher_ccm_hw.c b/providers/common/ciphers/cipher_ccm_hw.c index 3036bfaa2e..b093b768e7 100644 --- a/providers/common/ciphers/cipher_ccm_hw.c +++ b/providers/common/ciphers/cipher_ccm_hw.c @@ -7,58 +7,29 @@ * https://www.openssl.org/source/license.html */ -#include "cipher_locl.h" +#include "internal/ciphers/ciphercommon.h" +#include "internal/ciphers/cipher_ccm.h" -#define AES_CCM_SET_KEY_FN(fn_set_enc_key, fn_blk, fn_ccm_enc, fn_ccm_dec) \ - fn_set_enc_key(key, keylen * 8, &actx->ccm.ks.ks); \ - CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ccm.ks.ks, \ - (block128_f)fn_blk); \ - ctx->str = ctx->enc ? (ccm128_f)fn_ccm_enc : (ccm128_f)fn_ccm_dec; \ - ctx->key_set = 1; - -static int ccm_generic_aes_initkey(PROV_CCM_CTX *ctx, const unsigned char *key, - size_t keylen) -{ - PROV_AES_CCM_CTX *actx = (PROV_AES_CCM_CTX *)ctx; - -#ifdef HWAES_CAPABLE - if (HWAES_CAPABLE) { - AES_CCM_SET_KEY_FN(HWAES_set_encrypt_key, HWAES_encrypt, NULL, NULL); - } else -#endif /* HWAES_CAPABLE */ -#ifdef VPAES_CAPABLE - if (VPAES_CAPABLE) { - AES_CCM_SET_KEY_FN(vpaes_set_encrypt_key, vpaes_encrypt, NULL, NULL); - } else -#endif - { - AES_CCM_SET_KEY_FN(AES_set_encrypt_key, AES_encrypt, NULL, NULL) - } - return 1; -} - -static int ccm_generic_setiv(PROV_CCM_CTX *ctx, const unsigned char *nonce, - size_t nlen, size_t mlen) +int ccm_generic_setiv(PROV_CCM_CTX *ctx, const unsigned char *nonce, + size_t nlen, size_t mlen) { return CRYPTO_ccm128_setiv(&ctx->ccm_ctx, nonce, nlen, mlen) == 0; } -static int ccm_generic_setaad(PROV_CCM_CTX *ctx, const unsigned char *aad, - size_t alen) +int ccm_generic_setaad(PROV_CCM_CTX *ctx, const unsigned char *aad, size_t alen) { CRYPTO_ccm128_aad(&ctx->ccm_ctx, aad, alen); return 1; } -static int ccm_generic_gettag(PROV_CCM_CTX *ctx, unsigned char *tag, - size_t tlen) +int ccm_generic_gettag(PROV_CCM_CTX *ctx, unsigned char *tag, size_t tlen) { return CRYPTO_ccm128_tag(&ctx->ccm_ctx, tag, tlen) > 0; } -static int ccm_generic_auth_encrypt(PROV_CCM_CTX *ctx, const unsigned char *in, - unsigned char *out, size_t len, - unsigned char *tag, size_t taglen) +int ccm_generic_auth_encrypt(PROV_CCM_CTX *ctx, const unsigned char *in, + unsigned char *out, size_t len, + unsigned char *tag, size_t taglen) { int rv; @@ -73,10 +44,9 @@ static int ccm_generic_auth_encrypt(PROV_CCM_CTX *ctx, const unsigned char *in, return rv; } -static int ccm_generic_auth_decrypt(PROV_CCM_CTX *ctx, const unsigned char *in, - unsigned char *out, size_t len, - unsigned char *expected_tag, - size_t taglen) +int ccm_generic_auth_decrypt(PROV_CCM_CTX *ctx, const unsigned char *in, + unsigned char *out, size_t len, + unsigned char *expected_tag, size_t taglen) { int rv = 0; @@ -97,25 +67,3 @@ static int ccm_generic_auth_decrypt(PROV_CCM_CTX *ctx, const unsigned char *in, return rv; } -static const PROV_CCM_HW aes_ccm = { - ccm_generic_aes_initkey, - ccm_generic_setiv, - ccm_generic_setaad, - ccm_generic_auth_encrypt, - ccm_generic_auth_decrypt, - ccm_generic_gettag -}; -#if defined(S390X_aes_128_CAPABLE) -# include "cipher_aes_ccm_hw_s390x.inc" -#elif defined(AESNI_CAPABLE) -# include "cipher_aes_ccm_hw_aesni.inc" -#elif defined(SPARC_AES_CAPABLE) -# include "cipher_aes_ccm_hw_t4.inc" -#else -const PROV_CCM_HW *PROV_AES_HW_ccm(size_t keybits) -{ - return &aes_ccm; -} -#endif - -#include "cipher_aria_ccm_hw.inc" diff --git a/providers/common/ciphers/cipher_common.c b/providers/common/ciphers/cipher_common.c index 9c9047ca52..5abd2c0010 100644 --- a/providers/common/ciphers/cipher_common.c +++ b/providers/common/ciphers/cipher_common.c @@ -12,12 +12,11 @@ */ #include "cipher_locl.h" - -#define MAXCHUNK ((size_t)1 << (sizeof(long) * 8 - 2)) -#define MAXBITCHUNK ((size_t)1 << (sizeof(size_t) * 8 - 4)) +#include "internal/provider_ctx.h" +#include "internal/providercommonerr.h" /*- - * Default cipher functions for OSSL_PARAM gettables and settables + * Generic cipher functions for OSSL_PARAM gettables and settables */ static const OSSL_PARAM cipher_known_gettable_params[] = { OSSL_PARAM_int(OSSL_CIPHER_PARAM_MODE, NULL), @@ -26,12 +25,12 @@ static const OSSL_PARAM cipher_known_gettable_params[] = { OSSL_PARAM_int(OSSL_CIPHER_PARAM_BLOCK_SIZE, NULL), OSSL_PARAM_END }; -const OSSL_PARAM *cipher_default_gettable_params(void) +const OSSL_PARAM *cipher_generic_gettable_params(void) { return cipher_known_gettable_params; } -int cipher_default_get_params(OSSL_PARAM params[], int md, unsigned long flags, +int cipher_generic_get_params(OSSL_PARAM params[], int md, unsigned long flags, int kbits, int blkbits, int ivbits) { OSSL_PARAM *p; @@ -64,18 +63,8 @@ int cipher_default_get_params(OSSL_PARAM params[], int md, unsigned long flags, return 1; } -static const OSSL_PARAM cipher_known_gettable_ctx_params[] = { - OSSL_PARAM_int(OSSL_CIPHER_PARAM_KEYLEN, NULL), - OSSL_PARAM_int(OSSL_CIPHER_PARAM_IVLEN, NULL), - OSSL_PARAM_int(OSSL_CIPHER_PARAM_PADDING, NULL), - OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_NUM, NULL), - OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV, NULL, 0), - OSSL_PARAM_END -}; -const OSSL_PARAM *cipher_default_gettable_ctx_params(void) -{ - return cipher_known_gettable_ctx_params; -} +CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_START(cipher_generic) +CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_END(cipher_generic) static const OSSL_PARAM cipher_known_settable_ctx_params[] = { OSSL_PARAM_int(OSSL_CIPHER_PARAM_KEYLEN, NULL), @@ -83,7 +72,7 @@ static const OSSL_PARAM cipher_known_settable_ctx_params[] = { OSSL_PARAM_int(OSSL_CIPHER_PARAM_NUM, NULL), OSSL_PARAM_END }; -const OSSL_PARAM *cipher_default_settable_ctx_params(void) +const OSSL_PARAM *cipher_generic_settable_ctx_params(void) { return cipher_known_settable_ctx_params; } @@ -125,11 +114,11 @@ static int cipher_generic_init_internal(PROV_CIPHER_CTX *ctx, ctx->enc = enc; if (iv != NULL && ctx->mode != EVP_CIPH_ECB_MODE) { - if (ivlen != GENERIC_BLOCK_SIZE) { + if (ivlen != ctx->ivlen) { ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR); return 0; } - memcpy(ctx->iv, iv, GENERIC_BLOCK_SIZE); + memcpy(ctx->iv, iv, ctx->ivlen); } if (key != NULL) { if (keylen != ctx->keylen) { @@ -161,34 +150,34 @@ int cipher_generic_block_update(void *vctx, unsigned char *out, size_t *outl, { size_t outlint = 0; PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx; - size_t nextblocks = fillblock(ctx->buf, &ctx->bufsz, GENERIC_BLOCK_SIZE, &in, - &inl); + size_t blksz = ctx->blocksize; + size_t nextblocks = fillblock(ctx->buf, &ctx->bufsz, blksz, &in, &inl); /* * If we're decrypting and we end an update on a block boundary we hold * the last block back in case this is the last update call and the last * block is padded. */ - if (ctx->bufsz == GENERIC_BLOCK_SIZE && (ctx->enc || inl > 0 || !ctx->pad)) { - if (outsize < GENERIC_BLOCK_SIZE) { + if (ctx->bufsz == blksz && (ctx->enc || inl > 0 || !ctx->pad)) { + if (outsize < blksz) { ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL); return 0; } - if (!ctx->hw->cipher(ctx, out, ctx->buf, GENERIC_BLOCK_SIZE)) { + if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) { ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED); return 0; } ctx->bufsz = 0; - outlint = GENERIC_BLOCK_SIZE; - out += GENERIC_BLOCK_SIZE; + outlint = blksz; + out += blksz; } if (nextblocks > 0) { if (!ctx->enc && ctx->pad && nextblocks == inl) { - if (!ossl_assert(inl >= GENERIC_BLOCK_SIZE)) { + if (!ossl_assert(inl >= blksz)) { ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL); return 0; } - nextblocks -= GENERIC_BLOCK_SIZE; + nextblocks -= blksz; } outlint += nextblocks; if (outsize < outlint) { @@ -202,7 +191,7 @@ int cipher_generic_block_update(void *vctx, unsigned char *out, size_t *outl, in += nextblocks; inl -= nextblocks; } - if (!trailingdata(ctx->buf, &ctx->bufsz, GENERIC_BLOCK_SIZE, &in, &inl)) { +