diff options
author | Eneas U de Queiroz <cote2004-github@yahoo.com> | 2018-11-13 09:23:22 -0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2018-12-10 13:22:14 +0100 |
commit | a19d1a1d370e2959555fccbafc4e970634840352 (patch) | |
tree | 53e741d10e352e842ab6183858dc9a744be14f72 | |
parent | 5378c582c8d3f1130b17abb2950bfd09cde099c6 (diff) |
eng_devcrypto: add cipher CTX copy function
The engine needs a custom cipher context copy function to open a new
/dev/crypto session.
Signed-off-by: Eneas U de Queiroz <cote2004-github@yahoo.com>
Reviewed-by: Matthias St. Pierre <Matthias.St.Pierre@ncp-e.com>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7585)
(cherry picked from commit 6d99e238397859f2df58c60e28905193b2dd6762)
-rw-r--r-- | crypto/engine/eng_devcrypto.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/crypto/engine/eng_devcrypto.c b/crypto/engine/eng_devcrypto.c index 1b87774c8a..c882592554 100644 --- a/crypto/engine/eng_devcrypto.c +++ b/crypto/engine/eng_devcrypto.c @@ -207,6 +207,22 @@ static int cipher_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, return 1; } +static int cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void* p2) +{ + EVP_CIPHER_CTX *to_ctx = (EVP_CIPHER_CTX *)p2; + struct cipher_ctx *cipher_ctx; + + if (type == EVP_CTRL_COPY) { + /* when copying the context, a new session needs to be initialized */ + cipher_ctx = (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx); + return (cipher_ctx == NULL) + || cipher_init(to_ctx, cipher_ctx->sess.key, EVP_CIPHER_CTX_iv(ctx), + (cipher_ctx->op == COP_ENCRYPT)); + } + + return -1; +} + static int cipher_cleanup(EVP_CIPHER_CTX *ctx) { struct cipher_ctx *cipher_ctx = @@ -258,10 +274,12 @@ static void prepare_cipher_methods(void) cipher_data[i].ivlen) || !EVP_CIPHER_meth_set_flags(known_cipher_methods[i], cipher_data[i].flags + | EVP_CIPH_CUSTOM_COPY | EVP_CIPH_FLAG_DEFAULT_ASN1) || !EVP_CIPHER_meth_set_init(known_cipher_methods[i], cipher_init) || !EVP_CIPHER_meth_set_do_cipher(known_cipher_methods[i], cipher_do_cipher) + || !EVP_CIPHER_meth_set_ctrl(known_cipher_methods[i], cipher_ctrl) || !EVP_CIPHER_meth_set_cleanup(known_cipher_methods[i], cipher_cleanup) || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i], |