240-eng_devcrypto-add-cipher-CTX-copy-function.patch 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. From a19d1a1d370e2959555fccbafc4e970634840352 Mon Sep 17 00:00:00 2001
  2. From: Eneas U de Queiroz <[email protected]>
  3. Date: Tue, 13 Nov 2018 09:23:22 -0200
  4. Subject: [PATCH 5/7] eng_devcrypto: add cipher CTX copy function
  5. The engine needs a custom cipher context copy function to open a new
  6. /dev/crypto session.
  7. Signed-off-by: Eneas U de Queiroz <[email protected]>
  8. Reviewed-by: Matthias St. Pierre <[email protected]>
  9. Reviewed-by: Richard Levitte <[email protected]>
  10. (Merged from https://github.com/openssl/openssl/pull/7585)
  11. (cherry picked from commit 6d99e238397859f2df58c60e28905193b2dd6762)
  12. --- a/crypto/engine/eng_devcrypto.c
  13. +++ b/crypto/engine/eng_devcrypto.c
  14. @@ -207,6 +207,22 @@ static int cipher_do_cipher(EVP_CIPHER_C
  15. return 1;
  16. }
  17. +static int cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void* p2)
  18. +{
  19. + EVP_CIPHER_CTX *to_ctx = (EVP_CIPHER_CTX *)p2;
  20. + struct cipher_ctx *cipher_ctx;
  21. +
  22. + if (type == EVP_CTRL_COPY) {
  23. + /* when copying the context, a new session needs to be initialized */
  24. + cipher_ctx = (struct cipher_ctx *)EVP_CIPHER_CTX_get_cipher_data(ctx);
  25. + return (cipher_ctx == NULL)
  26. + || cipher_init(to_ctx, cipher_ctx->sess.key, EVP_CIPHER_CTX_iv(ctx),
  27. + (cipher_ctx->op == COP_ENCRYPT));
  28. + }
  29. +
  30. + return -1;
  31. +}
  32. +
  33. static int cipher_cleanup(EVP_CIPHER_CTX *ctx)
  34. {
  35. struct cipher_ctx *cipher_ctx =
  36. @@ -258,10 +274,12 @@ static void prepare_cipher_methods(void)
  37. cipher_data[i].ivlen)
  38. || !EVP_CIPHER_meth_set_flags(known_cipher_methods[i],
  39. cipher_data[i].flags
  40. + | EVP_CIPH_CUSTOM_COPY
  41. | EVP_CIPH_FLAG_DEFAULT_ASN1)
  42. || !EVP_CIPHER_meth_set_init(known_cipher_methods[i], cipher_init)
  43. || !EVP_CIPHER_meth_set_do_cipher(known_cipher_methods[i],
  44. cipher_do_cipher)
  45. + || !EVP_CIPHER_meth_set_ctrl(known_cipher_methods[i], cipher_ctrl)
  46. || !EVP_CIPHER_meth_set_cleanup(known_cipher_methods[i],
  47. cipher_cleanup)
  48. || !EVP_CIPHER_meth_set_impl_ctx_size(known_cipher_methods[i],