From f842b6b2a4d7cbb9d22e4605c502b73f25bb6a7b Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 24 Oct 2018 20:20:00 +0200 Subject: [PATCH] Add convenience functions EVP_str2ctrl() and EVP_hex2ctrl() These functions are generalizations of EVP_PKEY_CTX_str2ctrl() and EVP_PKEY_CTX_hex2ctrl(). They will parse the value, and then pass the parsed result and length to a callback that knows exactly how to pass them on to a main _ctrl function, along with a context structure pointer. Reviewed-by: Paul Dale (Merged from https://github.com/openssl/openssl/pull/7393) --- crypto/evp/evp_lib.c | 27 +++++++++++++++++++++++++++ include/openssl/evp.h | 8 ++++++++ util/libcrypto.num | 2 ++ 3 files changed, 37 insertions(+) diff --git a/crypto/evp/evp_lib.c b/crypto/evp/evp_lib.c index 1b3c9840c6..01c8939973 100644 --- a/crypto/evp/evp_lib.c +++ b/crypto/evp/evp_lib.c @@ -526,3 +526,30 @@ int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags) { return (ctx->flags & flags); } + +int EVP_str2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen), + void *ctx, int cmd, const char *value) +{ + size_t len; + + len = strlen(value); + if (len > INT_MAX) + return -1; + return cb(ctx, cmd, (void *)value, len); +} + +int EVP_hex2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen), + void *ctx, int cmd, const char *hex) +{ + unsigned char *bin; + long binlen; + int rv = -1; + + bin = OPENSSL_hexstr2buf(hex, &binlen); + if (bin == NULL) + return 0; + if (binlen <= INT_MAX) + rv = cb(ctx, cmd, bin, binlen); + OPENSSL_free(bin); + return rv; +} diff --git a/include/openssl/evp.h b/include/openssl/evp.h index bee003c6ec..4b4c9568b4 100644 --- a/include/openssl/evp.h +++ b/include/openssl/evp.h @@ -1670,6 +1670,14 @@ void EVP_PKEY_meth_get_digest_custom(EVP_PKEY_METHOD *pmeth, EVP_MD_CTX *mctx)); void EVP_add_alg_module(void); +/* + * Convenient helper functions to transfer string based controls. + * The callback gets called with the parsed value. + */ +int EVP_str2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen), + void *ctx, int cmd, const char *value); +int EVP_hex2ctrl(int (*cb)(void *ctx, int cmd, void *buf, size_t buflen), + void *ctx, int cmd, const char *hex); # ifdef __cplusplus } diff --git a/util/libcrypto.num b/util/libcrypto.num index 61236dfba2..f159a40528 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -4595,3 +4595,5 @@ EVP_MAC_nid 4548 1_1_2 EXIST::FUNCTION: EVP_get_macbyname 4549 1_1_2 EXIST::FUNCTION: EVP_MAC_do_all 4550 1_1_2 EXIST::FUNCTION: EVP_MAC_do_all_sorted 4551 1_1_2 EXIST::FUNCTION: +EVP_str2ctrl 4552 1_1_2 EXIST::FUNCTION: +EVP_hex2ctrl 4553 1_1_2 EXIST::FUNCTION: -- 2.25.1