diff --git a/CHANGES b/CHANGES index f5351f857f13c2030a21d0447aa6cee771af9fe6..b8e18dc1e280ef8aebab36a5f0c811cf9374a4a4 100644 --- a/CHANGES +++ b/CHANGES @@ -125,6 +125,9 @@ Changes between 1.0.0b and 1.0.1 [xx XXX xxxx] + *) Add functions to copy EVP_PKEY_METHOD and retrieve flags and id. + [Steve Henson] + *) Add EC_GFp_nistp224_method(), a 64-bit optimized implementation for elliptic curve NIST-P224 with constant-time single point multiplication on typical inputs. EC_GROUP_new_by_curve_name() will automatically use this diff --git a/crypto/evp/evp.h b/crypto/evp/evp.h index 30f3c752f5a5f90c00a36e7865bc337e64f50c3f..4548e6dddada28d60e8d9d2c1d02102eea0ac6af 100644 --- a/crypto/evp/evp.h +++ b/crypto/evp/evp.h @@ -1056,6 +1056,9 @@ void EVP_PKEY_asn1_set_ctrl(EVP_PKEY_ASN1_METHOD *ameth, const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type); EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags); +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth); +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src); void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth); int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth); diff --git a/crypto/evp/pmeth_lib.c b/crypto/evp/pmeth_lib.c index bc7c8305a0e160133446a44468336288e5e72d6f..9820f69b04905dfe941b2e546571cf0427505cef 100644 --- a/crypto/evp/pmeth_lib.c +++ b/crypto/evp/pmeth_lib.c @@ -236,6 +236,56 @@ EVP_PKEY_METHOD* EVP_PKEY_meth_new(int id, int flags) return pmeth; } +void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags, + const EVP_PKEY_METHOD *meth) + { + if (ppkey_id) + *ppkey_id = meth->pkey_id; + if (pflags) + *pflags = meth->flags; + } + +void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src) + { + + dst->init = src->init; + dst->copy = src->copy; + dst->cleanup = src->cleanup; + + dst->paramgen_init = src->paramgen_init; + dst->paramgen = src->paramgen; + + dst->keygen_init = src->keygen_init; + dst->keygen = src->keygen; + + dst->sign_init = src->sign_init; + dst->sign = src->sign; + + dst->verify_init = src->verify_init; + dst->verify = src->verify; + + dst->verify_recover_init = src->verify_recover_init; + dst->verify_recover = src->verify_recover; + + dst->signctx_init = src->signctx_init; + dst->signctx = src->signctx; + + dst->verifyctx_init = src->verifyctx_init; + dst->verifyctx = src->verifyctx; + + dst->encrypt_init = src->encrypt_init; + dst->encrypt = src->encrypt; + + dst->decrypt_init = src->decrypt_init; + dst->decrypt = src->decrypt; + + dst->derive_init = src->derive_init; + dst->derive = src->derive; + + dst->ctrl = src->ctrl; + dst->ctrl_str = src->ctrl_str; + } + void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth) { if (pmeth && (pmeth->flags & EVP_PKEY_FLAG_DYNAMIC))