Latest update.
This commit is contained in:
+54
-84
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -36,6 +36,7 @@
|
||||
#include "internal/evp.h"
|
||||
#include "internal/provider.h"
|
||||
#include "evp_local.h"
|
||||
DEFINE_STACK_OF(X509_ATTRIBUTE)
|
||||
|
||||
#include "crypto/ec.h"
|
||||
|
||||
@@ -627,14 +628,6 @@ RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey)
|
||||
# endif
|
||||
|
||||
# ifndef OPENSSL_NO_DSA
|
||||
int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
|
||||
{
|
||||
int ret = EVP_PKEY_assign_DSA(pkey, key);
|
||||
if (ret)
|
||||
DSA_up_ref(key);
|
||||
return ret;
|
||||
}
|
||||
|
||||
DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey)
|
||||
{
|
||||
if (!evp_pkey_downgrade((EVP_PKEY *)pkey)) {
|
||||
@@ -648,6 +641,13 @@ DSA *EVP_PKEY_get0_DSA(const EVP_PKEY *pkey)
|
||||
return pkey->pkey.dsa;
|
||||
}
|
||||
|
||||
int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
|
||||
{
|
||||
int ret = EVP_PKEY_assign_DSA(pkey, key);
|
||||
if (ret)
|
||||
DSA_up_ref(key);
|
||||
return ret;
|
||||
}
|
||||
DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
|
||||
{
|
||||
DSA *ret = EVP_PKEY_get0_DSA(pkey);
|
||||
@@ -655,10 +655,11 @@ DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
|
||||
DSA_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
# endif
|
||||
# endif /* OPENSSL_NO_DSA */
|
||||
#endif /* FIPS_MODE */
|
||||
|
||||
#ifndef FIPS_MODE
|
||||
# ifndef OPENSSL_NO_EC
|
||||
|
||||
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key)
|
||||
{
|
||||
int ret = EVP_PKEY_assign_EC_KEY(pkey, key);
|
||||
@@ -1007,28 +1008,10 @@ int EVP_PKEY_get_default_digest_nid(EVP_PKEY *pkey, int *pnid)
|
||||
int EVP_PKEY_get_default_digest_name(EVP_PKEY *pkey,
|
||||
char *mdname, size_t mdname_sz)
|
||||
{
|
||||
if (pkey->ameth == NULL) {
|
||||
OSSL_PARAM params[3];
|
||||
char mddefault[100] = "";
|
||||
char mdmandatory[100] = "";
|
||||
|
||||
params[0] =
|
||||
OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_DEFAULT_DIGEST,
|
||||
mddefault, sizeof(mddefault));
|
||||
params[1] =
|
||||
OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_MANDATORY_DIGEST,
|
||||
mdmandatory,
|
||||
sizeof(mdmandatory));
|
||||
params[2] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
|
||||
return 0;
|
||||
if (mdmandatory[0] != '\0') {
|
||||
OPENSSL_strlcpy(mdname, mdmandatory, mdname_sz);
|
||||
return 2;
|
||||
}
|
||||
OPENSSL_strlcpy(mdname, mddefault, mdname_sz);
|
||||
return 1;
|
||||
}
|
||||
if (pkey->ameth == NULL)
|
||||
return evp_keymgmt_util_get_deflt_digest_name(pkey->keymgmt,
|
||||
pkey->keydata,
|
||||
mdname, mdname_sz);
|
||||
|
||||
{
|
||||
int nid = NID_undef;
|
||||
@@ -1568,24 +1551,38 @@ int evp_pkey_downgrade(EVP_PKEY *pk)
|
||||
if (pk->ameth->import_from == NULL) {
|
||||
ERR_raise_data(ERR_LIB_EVP, EVP_R_NO_IMPORT_FUNCTION,
|
||||
"key type = %s", keytype);
|
||||
} else if (evp_keymgmt_export(keymgmt, keydata,
|
||||
OSSL_KEYMGMT_SELECT_ALL,
|
||||
pk->ameth->import_from, pk)) {
|
||||
} else {
|
||||
/*
|
||||
* Save the provider side data in the operation cache, so they'll
|
||||
* find it again. evp_pkey_free_it() cleared the cache, so it's
|
||||
* safe to assume slot zero is free.
|
||||
* Note that evp_keymgmt_util_cache_keydata() increments keymgmt's
|
||||
* reference count.
|
||||
* We perform the export in the same libctx as the keymgmt that we
|
||||
* are using.
|
||||
*/
|
||||
evp_keymgmt_util_cache_keydata(pk, 0, keymgmt, keydata);
|
||||
OPENSSL_CTX *libctx = ossl_provider_library_context(keymgmt->prov);
|
||||
EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_pkey(libctx, pk, NULL);
|
||||
if (pctx == NULL)
|
||||
ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE);
|
||||
|
||||
/* Synchronize the dirty count */
|
||||
pk->dirty_cnt_copy = pk->ameth->dirty_cnt(pk);
|
||||
if (pctx != NULL
|
||||
&& evp_keymgmt_export(keymgmt, keydata,
|
||||
OSSL_KEYMGMT_SELECT_ALL,
|
||||
pk->ameth->import_from, pctx)) {
|
||||
/*
|
||||
* Save the provider side data in the operation cache, so they'll
|
||||
* find it again. evp_pkey_free_it() cleared the cache, so it's
|
||||
* safe to assume slot zero is free.
|
||||
* Note that evp_keymgmt_util_cache_keydata() increments keymgmt's
|
||||
* reference count.
|
||||
*/
|
||||
evp_keymgmt_util_cache_keydata(pk, 0, keymgmt, keydata);
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
|
||||
/* evp_keymgmt_export() increased the refcount... */
|
||||
EVP_KEYMGMT_free(keymgmt);
|
||||
return 1;
|
||||
/* Synchronize the dirty count */
|
||||
pk->dirty_cnt_copy = pk->ameth->dirty_cnt(pk);
|
||||
|
||||
/* evp_keymgmt_export() increased the refcount... */
|
||||
EVP_KEYMGMT_free(keymgmt);
|
||||
return 1;
|
||||
}
|
||||
EVP_PKEY_CTX_free(pctx);
|
||||
}
|
||||
|
||||
ERR_raise_data(ERR_LIB_EVP, EVP_R_KEYMGMT_EXPORT_FAILURE,
|
||||
@@ -1620,23 +1617,11 @@ const OSSL_PARAM *EVP_PKEY_gettable_params(EVP_PKEY *pkey)
|
||||
return evp_keymgmt_gettable_params(pkey->keymgmt);
|
||||
}
|
||||
|
||||
/*
|
||||
* For the following methods param->return_size is set to a value
|
||||
* larger than can be returned by the call to evp_keymgmt_get_params().
|
||||
* If it is still this value then the parameter was ignored - and in this
|
||||
* case it returns an error..
|
||||
*/
|
||||
|
||||
int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
|
||||
{
|
||||
int ret = 0;
|
||||
OSSL_PARAM params[2];
|
||||
unsigned char buffer[2048];
|
||||
/*
|
||||
* Use -1 as the terminator here instead of sizeof(buffer) + 1 since
|
||||
* -1 is less likely to be a valid value.
|
||||
*/
|
||||
const size_t not_set = (size_t)-1;
|
||||
unsigned char *buf = NULL;
|
||||
size_t buf_sz = 0;
|
||||
|
||||
@@ -1649,12 +1634,9 @@ int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
|
||||
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
params[0] = OSSL_PARAM_construct_BN(key_name, buffer, sizeof(buffer));
|
||||
/* If the return_size is still not_set then we know it was not found */
|
||||
params[0].return_size = not_set;
|
||||
params[1] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)) {
|
||||
if (params[0].return_size == not_set
|
||||
|| params[0].return_size == 0)
|
||||
if (!OSSL_PARAM_modified(params) || params[0].return_size == 0)
|
||||
return 0;
|
||||
buf_sz = params[0].return_size;
|
||||
/*
|
||||
@@ -1671,7 +1653,7 @@ int EVP_PKEY_get_bn_param(EVP_PKEY *pkey, const char *key_name, BIGNUM **bn)
|
||||
goto err;
|
||||
}
|
||||
/* Fail if the param was not found */
|
||||
if (params[0].return_size == not_set)
|
||||
if (!OSSL_PARAM_modified(params))
|
||||
goto err;
|
||||
ret = OSSL_PARAM_get_BN(params, bn);
|
||||
err:
|
||||
@@ -1684,7 +1666,6 @@ int EVP_PKEY_get_octet_string_param(EVP_PKEY *pkey, const char *key_name,
|
||||
size_t *out_sz)
|
||||
{
|
||||
OSSL_PARAM params[2];
|
||||
const size_t not_set = max_buf_sz + 1;
|
||||
|
||||
if (pkey == NULL
|
||||
|| pkey->keymgmt == NULL
|
||||
@@ -1693,11 +1674,9 @@ int EVP_PKEY_get_octet_string_param(EVP_PKEY *pkey, const char *key_name,
|
||||
return 0;
|
||||
|
||||
params[0] = OSSL_PARAM_construct_octet_string(key_name, buf, max_buf_sz);
|
||||
params[0].return_size = not_set;
|
||||
params[1] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
|
||||
return 0;
|
||||
if (params[0].return_size == not_set)
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
|
||||
|| !OSSL_PARAM_modified(params))
|
||||
return 0;
|
||||
if (out_sz != NULL)
|
||||
*out_sz = params[0].return_size;
|
||||
@@ -1709,7 +1688,6 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
|
||||
size_t *out_sz)
|
||||
{
|
||||
OSSL_PARAM params[2];
|
||||
const size_t not_set = max_buf_sz + 1;
|
||||
|
||||
if (pkey == NULL
|
||||
|| pkey->keymgmt == NULL
|
||||
@@ -1718,11 +1696,9 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
|
||||
return 0;
|
||||
|
||||
params[0] = OSSL_PARAM_construct_utf8_string(key_name, str, max_buf_sz);
|
||||
params[0].return_size = not_set;
|
||||
params[1] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
|
||||
return 0;
|
||||
if (params[0].return_size == not_set)
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
|
||||
|| !OSSL_PARAM_modified(params))
|
||||
return 0;
|
||||
if (out_sz != NULL)
|
||||
*out_sz = params[0].return_size;
|
||||
@@ -1732,7 +1708,6 @@ int EVP_PKEY_get_utf8_string_param(EVP_PKEY *pkey, const char *key_name,
|
||||
int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
|
||||
{
|
||||
OSSL_PARAM params[2];
|
||||
const size_t not_set = sizeof(int) + 1;
|
||||
|
||||
if (pkey == NULL
|
||||
|| pkey->keymgmt == NULL
|
||||
@@ -1741,11 +1716,9 @@ int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
|
||||
return 0;
|
||||
|
||||
params[0] = OSSL_PARAM_construct_int(key_name, out);
|
||||
params[0].return_size = not_set;
|
||||
params[1] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
|
||||
return 0;
|
||||
if (params[0].return_size == not_set)
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
|
||||
|| !OSSL_PARAM_modified(params))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@@ -1753,7 +1726,6 @@ int EVP_PKEY_get_int_param(EVP_PKEY *pkey, const char *key_name, int *out)
|
||||
int EVP_PKEY_get_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t *out)
|
||||
{
|
||||
OSSL_PARAM params[2];
|
||||
const size_t not_set = sizeof(size_t) + 1;
|
||||
|
||||
if (pkey == NULL
|
||||
|| pkey->keymgmt == NULL
|
||||
@@ -1762,11 +1734,9 @@ int EVP_PKEY_get_size_t_param(EVP_PKEY *pkey, const char *key_name, size_t *out)
|
||||
return 0;
|
||||
|
||||
params[0] = OSSL_PARAM_construct_size_t(key_name, out);
|
||||
params[0].return_size = not_set;
|
||||
params[1] = OSSL_PARAM_construct_end();
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params))
|
||||
return 0;
|
||||
if (params[0].return_size == not_set)
|
||||
if (!evp_keymgmt_get_params(pkey->keymgmt, pkey->keydata, params)
|
||||
|| !OSSL_PARAM_modified(params))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
Reference in New Issue
Block a user