mirror of
https://github.com/QuasarApp/openssl.git
synced 2025-04-29 11:14:36 +00:00
Add EVP_PKEY_set1_engine() function.
Add an ENGINE to EVP_PKEY structure which can be used for cryptographic operations: this will typically be used by an HSM key to redirect calls to a custom EVP_PKEY_METHOD. Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/4503)
This commit is contained in:
parent
918a27facd
commit
d19b01ad79
@ -188,9 +188,11 @@ static int pkey_set_type(EVP_PKEY *pkey, int type, const char *str, int len)
|
|||||||
if ((type == pkey->save_type) && pkey->ameth)
|
if ((type == pkey->save_type) && pkey->ameth)
|
||||||
return 1;
|
return 1;
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
/* If we have an ENGINE release it */
|
/* If we have ENGINEs release them */
|
||||||
ENGINE_finish(pkey->engine);
|
ENGINE_finish(pkey->engine);
|
||||||
pkey->engine = NULL;
|
pkey->engine = NULL;
|
||||||
|
ENGINE_finish(pkey->pmeth_engine);
|
||||||
|
pkey->pmeth_engine = NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (str)
|
if (str)
|
||||||
@ -224,7 +226,25 @@ int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len)
|
|||||||
{
|
{
|
||||||
return pkey_set_type(pkey, EVP_PKEY_NONE, str, len);
|
return pkey_set_type(pkey, EVP_PKEY_NONE, str, len);
|
||||||
}
|
}
|
||||||
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
|
int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e)
|
||||||
|
{
|
||||||
|
if (e != NULL) {
|
||||||
|
if (!ENGINE_init(e)) {
|
||||||
|
EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, ERR_R_ENGINE_LIB);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ENGINE_get_pkey_meth(e, pkey->type) == NULL) {
|
||||||
|
ENGINE_finish(e);
|
||||||
|
EVPerr(EVP_F_EVP_PKEY_SET1_ENGINE, EVP_R_UNSUPPORTED_ALGORITHM);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ENGINE_finish(pkey->pmeth_engine);
|
||||||
|
pkey->pmeth_engine = e;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
|
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
|
||||||
{
|
{
|
||||||
if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
|
if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
|
||||||
@ -443,6 +463,8 @@ static void EVP_PKEY_free_it(EVP_PKEY *x)
|
|||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
ENGINE_finish(x->engine);
|
ENGINE_finish(x->engine);
|
||||||
x->engine = NULL;
|
x->engine = NULL;
|
||||||
|
ENGINE_finish(x->pmeth_engine);
|
||||||
|
x->pmeth_engine = NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ static EVP_PKEY_CTX *int_ctx_new(EVP_PKEY *pkey, ENGINE *e, int id)
|
|||||||
}
|
}
|
||||||
#ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
if (e == NULL && pkey != NULL)
|
if (e == NULL && pkey != NULL)
|
||||||
e = pkey->engine;
|
e = pkey->pmeth_engine != NULL ? pkey->pmeth_engine : pkey->engine;
|
||||||
/* Try to find an ENGINE which implements this method */
|
/* Try to find an ENGINE which implements this method */
|
||||||
if (e) {
|
if (e) {
|
||||||
if (!ENGINE_init(e)) {
|
if (!ENGINE_init(e)) {
|
||||||
|
@ -369,6 +369,7 @@ struct evp_pkey_st {
|
|||||||
CRYPTO_REF_COUNT references;
|
CRYPTO_REF_COUNT references;
|
||||||
const EVP_PKEY_ASN1_METHOD *ameth;
|
const EVP_PKEY_ASN1_METHOD *ameth;
|
||||||
ENGINE *engine;
|
ENGINE *engine;
|
||||||
|
ENGINE *pmeth_engine; /* If not NULL public key ENGINE to use */
|
||||||
union {
|
union {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
# ifndef OPENSSL_NO_RSA
|
# ifndef OPENSSL_NO_RSA
|
||||||
|
@ -978,6 +978,9 @@ int EVP_PKEY_security_bits(const EVP_PKEY *pkey);
|
|||||||
int EVP_PKEY_size(EVP_PKEY *pkey);
|
int EVP_PKEY_size(EVP_PKEY *pkey);
|
||||||
int EVP_PKEY_set_type(EVP_PKEY *pkey, int type);
|
int EVP_PKEY_set_type(EVP_PKEY *pkey, int type);
|
||||||
int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len);
|
int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len);
|
||||||
|
# ifndef OPENSSL_NO_ENGINE
|
||||||
|
int EVP_PKEY_set1_engine(EVP_PKEY *pkey, ENGINE *e);
|
||||||
|
# endif
|
||||||
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key);
|
int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key);
|
||||||
void *EVP_PKEY_get0(const EVP_PKEY *pkey);
|
void *EVP_PKEY_get0(const EVP_PKEY *pkey);
|
||||||
const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len);
|
const unsigned char *EVP_PKEY_get0_hmac(const EVP_PKEY *pkey, size_t *len);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user