summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec_kmeth.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec/ec_kmeth.c')
-rw-r--r--src/lib/libcrypto/ec/ec_kmeth.c112
1 files changed, 87 insertions, 25 deletions
diff --git a/src/lib/libcrypto/ec/ec_kmeth.c b/src/lib/libcrypto/ec/ec_kmeth.c
index b714c62236..158f542d40 100644
--- a/src/lib/libcrypto/ec/ec_kmeth.c
+++ b/src/lib/libcrypto/ec/ec_kmeth.c
@@ -72,9 +72,15 @@ static const EC_KEY_METHOD openssl_ec_key_method = {
72 .set_private = NULL, 72 .set_private = NULL,
73 .set_public = NULL, 73 .set_public = NULL,
74 74
75 .keygen = ossl_ec_key_gen,
76 .compute_key = ossl_ecdh_compute_key,
77
75 .sign = ossl_ecdsa_sign, 78 .sign = ossl_ecdsa_sign,
76 .sign_setup = ossl_ecdsa_sign_setup, 79 .sign_setup = ossl_ecdsa_sign_setup,
77 .sign_sig = ossl_ecdsa_sign_sig, 80 .sign_sig = ossl_ecdsa_sign_sig,
81
82 .verify = ossl_ecdsa_verify,
83 .verify_sig = ossl_ecdsa_verify_sig,
78}; 84};
79 85
80const EC_KEY_METHOD *default_ec_key_meth = &openssl_ec_key_method; 86const EC_KEY_METHOD *default_ec_key_meth = &openssl_ec_key_method;
@@ -197,6 +203,65 @@ EC_KEY_METHOD_free(EC_KEY_METHOD *meth)
197} 203}
198 204
199void 205void
206EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth,
207 int (*init)(EC_KEY *key),
208 void (*finish)(EC_KEY *key),
209 int (*copy)(EC_KEY *dest, const EC_KEY *src),
210 int (*set_group)(EC_KEY *key, const EC_GROUP *grp),
211 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key),
212 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key))
213{
214 meth->init = init;
215 meth->finish = finish;
216 meth->copy = copy;
217 meth->set_group = set_group;
218 meth->set_private = set_private;
219 meth->set_public = set_public;
220}
221
222void
223EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, int (*keygen)(EC_KEY *key))
224{
225 meth->keygen = keygen;
226}
227
228void
229EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth,
230 int (*ckey)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
231 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen)))
232{
233 meth->compute_key = ckey;
234}
235
236void
237EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth,
238 int (*sign)(int type, const unsigned char *dgst,
239 int dlen, unsigned char *sig, unsigned int *siglen,
240 const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey),
241 int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in,
242 BIGNUM **kinvp, BIGNUM **rp),
243 ECDSA_SIG *(*sign_sig)(const unsigned char *dgst,
244 int dgst_len, const BIGNUM *in_kinv,
245 const BIGNUM *in_r, EC_KEY *eckey))
246{
247 meth->sign = sign;
248 meth->sign_setup = sign_setup;
249 meth->sign_sig = sign_sig;
250}
251
252void
253EC_KEY_METHOD_set_verify(EC_KEY_METHOD *meth,
254 int (*verify)(int type, const unsigned char *dgst, int dgst_len,
255 const unsigned char *sigbuf, int sig_len, EC_KEY *eckey),
256 int (*verify_sig)(const unsigned char *dgst, int dgst_len,
257 const ECDSA_SIG *sig, EC_KEY *eckey))
258{
259 meth->verify = verify;
260 meth->verify_sig = verify_sig;
261}
262
263
264void
200EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth, 265EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth,
201 int (**pinit)(EC_KEY *key), 266 int (**pinit)(EC_KEY *key),
202 void (**pfinish)(EC_KEY *key), 267 void (**pfinish)(EC_KEY *key),
@@ -220,20 +285,20 @@ EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth,
220} 285}
221 286
222void 287void
223EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, 288EC_KEY_METHOD_get_keygen(EC_KEY_METHOD *meth,
224 int (*init)(EC_KEY *key), 289 int (**pkeygen)(EC_KEY *key))
225 void (*finish)(EC_KEY *key),
226 int (*copy)(EC_KEY *dest, const EC_KEY *src),
227 int (*set_group)(EC_KEY *key, const EC_GROUP *grp),
228 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key),
229 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key))
230{ 290{
231 meth->init = init; 291 if (pkeygen != NULL)
232 meth->finish = finish; 292 *pkeygen = meth->keygen;
233 meth->copy = copy; 293}
234 meth->set_group = set_group; 294
235 meth->set_private = set_private; 295void
236 meth->set_public = set_public; 296EC_KEY_METHOD_get_compute_key(EC_KEY_METHOD *meth,
297 int (**pck)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
298 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen)))
299{
300 if (pck != NULL)
301 *pck = meth->compute_key;
237} 302}
238 303
239void 304void
@@ -256,17 +321,14 @@ EC_KEY_METHOD_get_sign(EC_KEY_METHOD *meth,
256} 321}
257 322
258void 323void
259EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, 324EC_KEY_METHOD_get_verify(EC_KEY_METHOD *meth,
260 int (*sign)(int type, const unsigned char *dgst, 325 int (**pverify)(int type, const unsigned char *dgst, int dgst_len,
261 int dlen, unsigned char *sig, unsigned int *siglen, 326 const unsigned char *sigbuf, int sig_len, EC_KEY *eckey),
262 const BIGNUM *kinv, const BIGNUM *r, EC_KEY *eckey), 327 int (**pverify_sig)(const unsigned char *dgst, int dgst_len,
263 int (*sign_setup)(EC_KEY *eckey, BN_CTX *ctx_in, 328 const ECDSA_SIG *sig, EC_KEY *eckey))
264 BIGNUM **kinvp, BIGNUM **rp),
265 ECDSA_SIG *(*sign_sig)(const unsigned char *dgst,
266 int dgst_len, const BIGNUM *in_kinv,
267 const BIGNUM *in_r, EC_KEY *eckey))
268{ 329{
269 meth->sign = sign; 330 if (pverify != NULL)
270 meth->sign_setup = sign_setup; 331 *pverify = meth->verify;
271 meth->sign_sig = sign_sig; 332 if (pverify_sig != NULL)
333 *pverify_sig = meth->verify_sig;
272} 334}