diff options
author | Richard Levitte <levitte@openssl.org> | 2019-09-19 11:47:46 +0200 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2019-09-20 08:28:47 +0200 |
commit | 4e8b8e47c85a45d1bda3241d7b2852d82db2a255 (patch) | |
tree | 6141920db7bb6b798bf44eb14dc343d9634bc8c9 /providers/common/provider_util.c | |
parent | Add aes_wrap cipher to providers (diff) | |
download | openssl-4e8b8e47c85a45d1bda3241d7b2852d82db2a255.tar.xz openssl-4e8b8e47c85a45d1bda3241d7b2852d82db2a255.zip |
Refactor TLS-PRF's kdf_tls1_prf_mkmacctx() to a provider utility
ossl_prov_macctx_load_from_params() creates a EVP_MAC_CTX *, or sets
new common parameters for an existing one.
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/9946)
Diffstat (limited to '')
-rw-r--r-- | providers/common/provider_util.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/providers/common/provider_util.c b/providers/common/provider_util.c index 199544730a..4056878498 100644 --- a/providers/common/provider_util.c +++ b/providers/common/provider_util.c @@ -165,3 +165,91 @@ const char *ossl_prov_digest_name(const PROV_DIGEST *pd) { return pd->name; } + +int ossl_prov_macctx_load_from_params(EVP_MAC_CTX **macctx, + const OSSL_PARAM params[], + const char *macname, + const char *ciphername, + const char *mdname, + OPENSSL_CTX *libctx) +{ + const OSSL_PARAM *p; + OSSL_PARAM mac_params[5], *mp = mac_params; + const char *properties = NULL; + + if (macname == NULL + && (p = OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_MAC)) != NULL) { + if (p->data_type != OSSL_PARAM_UTF8_STRING) + return 0; + macname = p->data; + } + if ((p = OSSL_PARAM_locate_const(params, + OSSL_ALG_PARAM_PROPERTIES)) != NULL) { + if (p->data_type != OSSL_PARAM_UTF8_STRING) + return 0; + properties = p->data; + } + + /* If we got a new mac name, we make a new EVP_MAC_CTX */ + if (macname != NULL) { + EVP_MAC *mac = EVP_MAC_fetch(libctx, macname, properties); + + EVP_MAC_CTX_free(*macctx); + *macctx = mac == NULL ? NULL : EVP_MAC_CTX_new(mac); + /* The context holds on to the MAC */ + EVP_MAC_free(mac); + if (*macctx == NULL) + return 0; + } + + /* + * If there is no MAC yet (and therefore, no MAC context), we ignore + * all other parameters. + */ + if (*macctx == NULL) + return 1; + + if (mdname == NULL) { + if ((p = OSSL_PARAM_locate_const(params, + OSSL_ALG_PARAM_DIGEST)) != NULL) { + if (p->data_type != OSSL_PARAM_UTF8_STRING) + return 0; + mdname = p->data; + } + } + if (ciphername == NULL) { + if ((p = OSSL_PARAM_locate_const(params, + OSSL_ALG_PARAM_CIPHER)) != NULL) { + if (p->data_type != OSSL_PARAM_UTF8_STRING) + return 0; + ciphername = p->data; + } + } + + if (mdname != NULL) + *mp++ = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, + (char *)mdname, 0); + if (ciphername != NULL) + *mp++ = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, + (char *)ciphername, 0); + if (properties != NULL) + *mp++ = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_PROPERTIES, + (char *)properties, 0); + +#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE) + if ((p = OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_ENGINE)) != NULL) { + if (p->data_type != OSSL_PARAM_UTF8_STRING) + return 0; + *mp++ = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_ENGINE, + p->data, p->data_size); + } +#endif + *mp = OSSL_PARAM_construct_end(); + + if (EVP_MAC_CTX_set_params(*macctx, mac_params)) + return 1; + + EVP_MAC_CTX_free(*macctx); + *macctx = NULL; + return 0; +} |