X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fec%2Fec_kmeth.c;h=51992aff433b504cb9db3e6bb20c30093ff1744d;hb=8a41fa6f9e969c6b58c2bda42631cc238afaf27c;hp=e75417972615006d3643b36450f63bbc0c34b42a;hpb=a0ffedaf7bb7b457b42108b8819d00e64003b3a9;p=oweals%2Fopenssl.git diff --git a/crypto/ec/ec_kmeth.c b/crypto/ec/ec_kmeth.c index e754179726..51992aff43 100644 --- a/crypto/ec/ec_kmeth.c +++ b/crypto/ec/ec_kmeth.c @@ -1,4 +1,3 @@ -/* crypto/ec/ec_kmeth.c */ /* * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project. @@ -93,6 +92,31 @@ void EC_KEY_set_default_method(const EC_KEY_METHOD *meth) default_ec_key_meth = meth; } +const EC_KEY_METHOD *EC_KEY_get_method(const EC_KEY *key) +{ + return key->meth; +} + +int EC_KEY_set_method(EC_KEY *key, const EC_KEY_METHOD *meth) +{ + void (*finish)(EC_KEY *key) = key->meth->finish; + + if (finish != NULL) + finish(key); + +#ifndef OPENSSL_NO_ENGINE + if (key->engine != NULL) { + ENGINE_finish(key->engine); + key->engine = NULL; + } +#endif + + key->meth = meth; + if (meth->init != NULL) + return meth->init(key); + return 1; +} + EC_KEY *EC_KEY_new_method(ENGINE *engine) { EC_KEY *ret = OPENSSL_zalloc(sizeof(*ret)); @@ -101,6 +125,11 @@ EC_KEY *EC_KEY_new_method(ENGINE *engine) ECerr(EC_F_EC_KEY_NEW_METHOD, ERR_R_MALLOC_FAILURE); return (NULL); } + if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_EC_KEY, ret, &ret->ex_data)) { + OPENSSL_free(ret); + return NULL; + } + ret->meth = EC_KEY_get_default_method(); #ifndef OPENSSL_NO_ENGINE if (engine != NULL) { @@ -134,7 +163,7 @@ EC_KEY *EC_KEY_new_method(ENGINE *engine) } int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, - EC_KEY *eckey, + const EC_KEY *eckey, void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen)) { @@ -146,8 +175,8 @@ int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY_METHOD *EC_KEY_METHOD_new(const EC_KEY_METHOD *meth) { - EC_KEY_METHOD *ret; - ret = OPENSSL_zalloc(sizeof(*meth)); + EC_KEY_METHOD *ret = OPENSSL_zalloc(sizeof(*meth)); + if (ret == NULL) return NULL; if (meth != NULL) @@ -190,7 +219,7 @@ void EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth, int (*ckey)(void *out, size_t outlen, const EC_POINT *pub_key, - EC_KEY *ecdh, + const EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, void *out, @@ -268,7 +297,7 @@ void EC_KEY_METHOD_get_compute_key(EC_KEY_METHOD *meth, int (**pck)(void *out, size_t outlen, const EC_POINT *pub_key, - EC_KEY *ecdh, + const EC_KEY *ecdh, void *(*KDF) (const void *in, size_t inlen, void *out,