Add EVP_PKEY_get0_* functions.
Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
This commit is contained in:
parent
2986ecdc08
commit
2872dbe1c4
4 changed files with 72 additions and 22 deletions
|
@ -118,11 +118,11 @@ static ERR_STRING_DATA EVP_str_functs[] = {
|
|||
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT), "EVP_PKEY_encrypt"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT_INIT), "EVP_PKEY_encrypt_init"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_ENCRYPT_OLD), "EVP_PKEY_encrypt_old"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET1_DH), "EVP_PKEY_get1_DH"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET1_DSA), "EVP_PKEY_get1_DSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET1_ECDSA), "EVP_PKEY_GET1_ECDSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET1_EC_KEY), "EVP_PKEY_get1_EC_KEY"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET1_RSA), "EVP_PKEY_get1_RSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET0_DH), "EVP_PKEY_get0_DH"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET0_DSA), "EVP_PKEY_get0_DSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET0_ECDSA), "EVP_PKEY_GET0_ECDSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET0_EC_KEY), "EVP_PKEY_get0_EC_KEY"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_GET0_RSA), "EVP_PKEY_get0_RSA"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_KEYGEN), "EVP_PKEY_keygen"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_KEYGEN_INIT), "EVP_PKEY_keygen_init"},
|
||||
{ERR_FUNC(EVP_F_EVP_PKEY_NEW), "EVP_PKEY_new"},
|
||||
|
|
|
@ -204,6 +204,11 @@ EVP_PKEY *EVP_PKEY_new(void)
|
|||
return (ret);
|
||||
}
|
||||
|
||||
void EVP_PKEY_up_ref(EVP_PKEY *pkey)
|
||||
{
|
||||
CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup a public key ASN1 method and ENGINE from a NID or a string. If pkey
|
||||
* is NULL just return 1 or 0 if the algorithm exists.
|
||||
|
@ -284,15 +289,22 @@ int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key)
|
|||
return ret;
|
||||
}
|
||||
|
||||
RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey)
|
||||
RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey)
|
||||
{
|
||||
if (pkey->type != EVP_PKEY_RSA) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET1_RSA, EVP_R_EXPECTING_AN_RSA_KEY);
|
||||
EVPerr(EVP_F_EVP_PKEY_GET0_RSA, EVP_R_EXPECTING_AN_RSA_KEY);
|
||||
return NULL;
|
||||
}
|
||||
RSA_up_ref(pkey->pkey.rsa);
|
||||
return pkey->pkey.rsa;
|
||||
}
|
||||
|
||||
RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey)
|
||||
{
|
||||
RSA *ret = EVP_PKEY_get0_RSA(pkey);
|
||||
if (ret != NULL)
|
||||
RSA_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
|
@ -304,15 +316,22 @@ int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, DSA *key)
|
|||
return ret;
|
||||
}
|
||||
|
||||
DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
|
||||
DSA *EVP_PKEY_get0_DSA(EVP_PKEY *pkey)
|
||||
{
|
||||
if (pkey->type != EVP_PKEY_DSA) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET1_DSA, EVP_R_EXPECTING_A_DSA_KEY);
|
||||
EVPerr(EVP_F_EVP_PKEY_GET0_DSA, EVP_R_EXPECTING_A_DSA_KEY);
|
||||
return NULL;
|
||||
}
|
||||
DSA_up_ref(pkey->pkey.dsa);
|
||||
return pkey->pkey.dsa;
|
||||
}
|
||||
|
||||
DSA *EVP_PKEY_get1_DSA(EVP_PKEY *pkey)
|
||||
{
|
||||
DSA *ret = EVP_PKEY_get0_DSA(pkey);
|
||||
if (ret != NULL)
|
||||
DSA_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
|
@ -325,15 +344,22 @@ int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key)
|
|||
return ret;
|
||||
}
|
||||
|
||||
EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey)
|
||||
EC_KEY *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey)
|
||||
{
|
||||
if (pkey->type != EVP_PKEY_EC) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET1_EC_KEY, EVP_R_EXPECTING_A_EC_KEY);
|
||||
EVPerr(EVP_F_EVP_PKEY_GET0_EC_KEY, EVP_R_EXPECTING_A_EC_KEY);
|
||||
return NULL;
|
||||
}
|
||||
EC_KEY_up_ref(pkey->pkey.ec);
|
||||
return pkey->pkey.ec;
|
||||
}
|
||||
|
||||
EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey)
|
||||
{
|
||||
EC_KEY *ret = EVP_PKEY_get0_EC_KEY(pkey);
|
||||
if (ret != NULL)
|
||||
EC_KEY_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_DH
|
||||
|
@ -346,15 +372,22 @@ int EVP_PKEY_set1_DH(EVP_PKEY *pkey, DH *key)
|
|||
return ret;
|
||||
}
|
||||
|
||||
DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey)
|
||||
DH *EVP_PKEY_get0_DH(EVP_PKEY *pkey)
|
||||
{
|
||||
if (pkey->type != EVP_PKEY_DH && pkey->type != EVP_PKEY_DHX) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET1_DH, EVP_R_EXPECTING_A_DH_KEY);
|
||||
EVPerr(EVP_F_EVP_PKEY_GET0_DH, EVP_R_EXPECTING_A_DH_KEY);
|
||||
return NULL;
|
||||
}
|
||||
DH_up_ref(pkey->pkey.dh);
|
||||
return pkey->pkey.dh;
|
||||
}
|
||||
|
||||
DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey)
|
||||
{
|
||||
DH *ret = EVP_PKEY_get0_DH(pkey);
|
||||
if (ret != NULL)
|
||||
DH_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
int EVP_PKEY_type(int type)
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
EVP_PKEY_set1_RSA, EVP_PKEY_set1_DSA, EVP_PKEY_set1_DH, EVP_PKEY_set1_EC_KEY,
|
||||
EVP_PKEY_get1_RSA, EVP_PKEY_get1_DSA, EVP_PKEY_get1_DH, EVP_PKEY_get1_EC_KEY,
|
||||
EVP_PKEY_get0_RSA, EVP_PKEY_get0_DSA, EVP_PKEY_get0_DH, EVP_PKEY_get0_EC_KEY,
|
||||
EVP_PKEY_assign_RSA, EVP_PKEY_assign_DSA, EVP_PKEY_assign_DH, EVP_PKEY_assign_EC_KEY,
|
||||
EVP_PKEY_type - EVP_PKEY assignment functions.
|
||||
|
||||
|
@ -21,6 +22,11 @@ EVP_PKEY_type - EVP_PKEY assignment functions.
|
|||
DH *EVP_PKEY_get1_DH(EVP_PKEY *pkey);
|
||||
EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);
|
||||
|
||||
RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey);
|
||||
DSA *EVP_PKEY_get0_DSA(EVP_PKEY *pkey);
|
||||
DH *EVP_PKEY_get0_DH(EVP_PKEY *pkey);
|
||||
EC_KEY *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey);
|
||||
|
||||
int EVP_PKEY_assign_RSA(EVP_PKEY *pkey,RSA *key);
|
||||
int EVP_PKEY_assign_DSA(EVP_PKEY *pkey,DSA *key);
|
||||
int EVP_PKEY_assign_DH(EVP_PKEY *pkey,DH *key);
|
||||
|
@ -37,6 +43,12 @@ EVP_PKEY_get1_RSA(), EVP_PKEY_get1_DSA(), EVP_PKEY_get1_DH() and
|
|||
EVP_PKEY_get1_EC_KEY() return the referenced key in B<pkey> or
|
||||
B<NULL> if the key is not of the correct type.
|
||||
|
||||
EVP_PKEY_get0_RSA(), EVP_PKEY_get0_DSA(), EVP_PKEY_get0_DH() and
|
||||
EVP_PKEY_get0_EC_KEY() also return the referenced key in B<pkey> or
|
||||
B<NULL> if the key is not of the correct type but the reference
|
||||
count of the returned key is B<not> incremented and so must not
|
||||
be freed up after use.
|
||||
|
||||
EVP_PKEY_assign_RSA(), EVP_PKEY_assign_DSA(), EVP_PKEY_assign_DH()
|
||||
and EVP_PKEY_assign_EC_KEY() also set the referenced key to B<key>
|
||||
however these use the supplied B<key> internally and so B<key>
|
||||
|
|
|
@ -966,25 +966,30 @@ void *EVP_PKEY_get0(EVP_PKEY *pkey);
|
|||
# ifndef OPENSSL_NO_RSA
|
||||
struct rsa_st;
|
||||
int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key);
|
||||
struct rsa_st *EVP_PKEY_get0_RSA(EVP_PKEY *pkey);
|
||||
struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey);
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_DSA
|
||||
struct dsa_st;
|
||||
int EVP_PKEY_set1_DSA(EVP_PKEY *pkey, struct dsa_st *key);
|
||||
struct dsa_st *EVP_PKEY_get0_DSA(EVP_PKEY *pkey);
|
||||
struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey);
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_DH
|
||||
struct dh_st;
|
||||
int EVP_PKEY_set1_DH(EVP_PKEY *pkey, struct dh_st *key);
|
||||
struct dh_st *EVP_PKEY_get0_DH(EVP_PKEY *pkey);
|
||||
struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey);
|
||||
# endif
|
||||
# ifndef OPENSSL_NO_EC
|
||||
struct ec_key_st;
|
||||
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, struct ec_key_st *key);
|
||||
struct ec_key_st *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey);
|
||||
struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);
|
||||
# endif
|
||||
|
||||
EVP_PKEY *EVP_PKEY_new(void);
|
||||
void EVP_PKEY_up_ref(EVP_PKEY *pkey);
|
||||
void EVP_PKEY_free(EVP_PKEY *pkey);
|
||||
|
||||
EVP_PKEY *d2i_PublicKey(int type, EVP_PKEY **a, const unsigned char **pp,
|
||||
|
@ -1543,11 +1548,11 @@ void ERR_load_EVP_strings(void);
|
|||
# define EVP_F_EVP_PKEY_ENCRYPT 105
|
||||
# define EVP_F_EVP_PKEY_ENCRYPT_INIT 139
|
||||
# define EVP_F_EVP_PKEY_ENCRYPT_OLD 152
|
||||
# define EVP_F_EVP_PKEY_GET1_DH 119
|
||||
# define EVP_F_EVP_PKEY_GET1_DSA 120
|
||||
# define EVP_F_EVP_PKEY_GET1_ECDSA 130
|
||||
# define EVP_F_EVP_PKEY_GET1_EC_KEY 131
|
||||
# define EVP_F_EVP_PKEY_GET1_RSA 121
|
||||
# define EVP_F_EVP_PKEY_GET0_DH 119
|
||||
# define EVP_F_EVP_PKEY_GET0_DSA 120
|
||||
# define EVP_F_EVP_PKEY_GET0_ECDSA 130
|
||||
# define EVP_F_EVP_PKEY_GET0_EC_KEY 131
|
||||
# define EVP_F_EVP_PKEY_GET0_RSA 121
|
||||
# define EVP_F_EVP_PKEY_KEYGEN 146
|
||||
# define EVP_F_EVP_PKEY_KEYGEN_INIT 147
|
||||
# define EVP_F_EVP_PKEY_NEW 106
|
||||
|
|
Loading…
Reference in a new issue