summaryrefslogtreecommitdiffstats
path: root/providers
diff options
context:
space:
mode:
authorJerry Shih <bignose1007@gmail.com>2023-09-25 08:45:55 +0800
committerHugo Landau <hlandau@openssl.org>2023-10-26 15:55:50 +0100
commit3e56c0efe72aad6d4246149d9461af48072b681b (patch)
tree4323aaada7d4d8354e4d474c59924d1209e70524 /providers
parenta5871e951d3f3c3f0c498a0420c5ce1f53c425a5 (diff)
riscv: Provide vector crypto implementation of AES-128/256-XTS mode.
To accelerate the performance of the AES-XTS mode, in this patch, we have the specialized multi-block implementation for AES-128-XTS and AES-256-XTS. Signed-off-by: Jerry Shih <jerry.shih@sifive.com> Signed-off-by: Phoebe Chen <phoebe.chen@sifive.com> Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Hugo Landau <hlandau@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21923)
Diffstat (limited to 'providers')
-rw-r--r--providers/implementations/ciphers/cipher_aes_xts_hw.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/providers/implementations/ciphers/cipher_aes_xts_hw.c b/providers/implementations/ciphers/cipher_aes_xts_hw.c
index 24b8fb17df..b35b71020e 100644
--- a/providers/implementations/ciphers/cipher_aes_xts_hw.c
+++ b/providers/implementations/ciphers/cipher_aes_xts_hw.c
@@ -175,9 +175,31 @@ static int cipher_hw_aes_xts_rv64i_zknd_zkne_initkey(PROV_CIPHER_CTX *ctx,
return 1;
}
+static int cipher_hw_aes_xts_rv64i_zvbb_zvkg_zvkned_initkey(
+ PROV_CIPHER_CTX *ctx, const unsigned char *key, size_t keylen)
+{
+ PROV_AES_XTS_CTX *xctx = (PROV_AES_XTS_CTX *)ctx;
+ OSSL_xts_stream_fn stream_enc = NULL;
+ OSSL_xts_stream_fn stream_dec = NULL;
+
+ /* Zvkned only supports 128 and 256 bit keys. */
+ if (keylen * 8 == 128 * 2 || keylen * 8 == 256 * 2) {
+ XTS_SET_KEY_FN(rv64i_zvkned_set_encrypt_key,
+ rv64i_zvkned_set_decrypt_key, rv64i_zvkned_encrypt,
+ rv64i_zvkned_decrypt,
+ rv64i_zvbb_zvkg_zvkned_aes_xts_encrypt,
+ rv64i_zvbb_zvkg_zvkned_aes_xts_decrypt);
+ } else {
+ XTS_SET_KEY_FN(AES_set_encrypt_key, AES_set_encrypt_key,
+ rv64i_zvkned_encrypt, rv64i_zvkned_decrypt,
+ stream_enc, stream_dec);
+ }
+ return 1;
+}
+
static int cipher_hw_aes_xts_rv64i_zvkned_initkey(PROV_CIPHER_CTX *ctx,
- const unsigned char *key,
- size_t keylen)
+ const unsigned char *key,
+ size_t keylen)
{
PROV_AES_XTS_CTX *xctx = (PROV_AES_XTS_CTX *)ctx;
OSSL_xts_stream_fn stream_enc = NULL;
@@ -207,13 +229,21 @@ static const PROV_CIPHER_HW aes_xts_rv64i_zvkned = { \
cipher_hw_aes_xts_rv64i_zvkned_initkey, \
NULL, \
cipher_hw_aes_xts_copyctx \
+}; \
+static const PROV_CIPHER_HW aes_xts_rv64i_zvbb_zvkg_zvkned = { \
+ cipher_hw_aes_xts_rv64i_zvbb_zvkg_zvkned_initkey, \
+ NULL, \
+ cipher_hw_aes_xts_copyctx \
};
# define PROV_CIPHER_HW_select_xts() \
+if (RISCV_HAS_ZVBB() && RISCV_HAS_ZVKG() && RISCV_HAS_ZVKNED() && \
+ riscv_vlen() >= 128) \
+ return &aes_xts_rv64i_zvbb_zvkg_zvkned; \
if (RISCV_HAS_ZVKNED() && riscv_vlen() >= 128) \
return &aes_xts_rv64i_zvkned; \
else if (RISCV_HAS_ZKND_AND_ZKNE()) \
- return &aes_xts_rv64i_zknd_zkne; \
+ return &aes_xts_rv64i_zknd_zkne;
#elif defined(__riscv) && __riscv_xlen == 32