summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec')
-rw-r--r--src/lib/libcrypto/ec/ec.h12
-rw-r--r--src/lib/libcrypto/ec/ec_key.c13
-rw-r--r--src/lib/libcrypto/ec/ec_kmeth.c112
-rw-r--r--src/lib/libcrypto/ec/ec_lcl.h17
4 files changed, 125 insertions, 29 deletions
diff --git a/src/lib/libcrypto/ec/ec.h b/src/lib/libcrypto/ec/ec.h
index 1173459dae..0b8d2cb355 100644
--- a/src/lib/libcrypto/ec/ec.h
+++ b/src/lib/libcrypto/ec/ec.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec.h,v 1.14 2019/01/19 01:07:00 tb Exp $ */ 1/* $OpenBSD: ec.h,v 1.15 2019/01/19 01:12:48 tb Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller for the OpenSSL project. 3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */ 4 */
@@ -966,6 +966,11 @@ void EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth,
966 int (*set_group)(EC_KEY *key, const EC_GROUP *grp), 966 int (*set_group)(EC_KEY *key, const EC_GROUP *grp),
967 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key), 967 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key),
968 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key)); 968 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key));
969void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth,
970 int (*keygen)(EC_KEY *key));
971void EC_KEY_METHOD_set_compute_key(EC_KEY_METHOD *meth,
972 int (*ckey)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
973 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen)));
969void EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth, 974void EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth,
970 int (**pinit)(EC_KEY *key), 975 int (**pinit)(EC_KEY *key),
971 void (**pfinish)(EC_KEY *key), 976 void (**pfinish)(EC_KEY *key),
@@ -973,6 +978,11 @@ void EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth,
973 int (**pset_group)(EC_KEY *key, const EC_GROUP *grp), 978 int (**pset_group)(EC_KEY *key, const EC_GROUP *grp),
974 int (**pset_private)(EC_KEY *key, const BIGNUM *priv_key), 979 int (**pset_private)(EC_KEY *key, const BIGNUM *priv_key),
975 int (**pset_public)(EC_KEY *key, const EC_POINT *pub_key)); 980 int (**pset_public)(EC_KEY *key, const EC_POINT *pub_key));
981void EC_KEY_METHOD_get_keygen(EC_KEY_METHOD *meth,
982 int (**pkeygen)(EC_KEY *key));
983void EC_KEY_METHOD_get_compute_key(EC_KEY_METHOD *meth,
984 int (**pck)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
985 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen)));
976 986
977EC_KEY *ECParameters_dup(EC_KEY *key); 987EC_KEY *ECParameters_dup(EC_KEY *key);
978 988
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c
index f57e078c7f..1d0a03ac88 100644
--- a/src/lib/libcrypto/ec/ec_key.c
+++ b/src/lib/libcrypto/ec/ec_key.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_key.c,v 1.23 2019/01/19 01:07:00 tb Exp $ */ 1/* $OpenBSD: ec_key.c,v 1.24 2019/01/19 01:12:48 tb Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -247,9 +247,18 @@ EC_KEY_get_ex_data(const EC_KEY *r, int idx)
247 return CRYPTO_get_ex_data(&r->ex_data, idx); 247 return CRYPTO_get_ex_data(&r->ex_data, idx);
248} 248}
249 249
250int 250int
251EC_KEY_generate_key(EC_KEY *eckey) 251EC_KEY_generate_key(EC_KEY *eckey)
252{ 252{
253 if (eckey->meth->keygen != NULL)
254 return eckey->meth->keygen(eckey);
255 ECerror(EC_R_NOT_IMPLEMENTED);
256 return 0;
257}
258
259int
260ossl_ec_key_gen(EC_KEY *eckey)
261{
253 int ok = 0; 262 int ok = 0;
254 BN_CTX *ctx = NULL; 263 BN_CTX *ctx = NULL;
255 BIGNUM *priv_key = NULL, *order = NULL; 264 BIGNUM *priv_key = NULL, *order = NULL;
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}
diff --git a/src/lib/libcrypto/ec/ec_lcl.h b/src/lib/libcrypto/ec/ec_lcl.h
index cff0892e89..8948e51d69 100644
--- a/src/lib/libcrypto/ec/ec_lcl.h
+++ b/src/lib/libcrypto/ec/ec_lcl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_lcl.h,v 1.12 2019/01/19 01:07:00 tb Exp $ */ 1/* $OpenBSD: ec_lcl.h,v 1.13 2019/01/19 01:12:48 tb Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller for the OpenSSL project. 3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */ 4 */
@@ -457,6 +457,9 @@ struct ec_key_method_st {
457 int (*set_group)(EC_KEY *key, const EC_GROUP *grp); 457 int (*set_group)(EC_KEY *key, const EC_GROUP *grp);
458 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key); 458 int (*set_private)(EC_KEY *key, const BIGNUM *priv_key);
459 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key); 459 int (*set_public)(EC_KEY *key, const EC_POINT *pub_key);
460 int (*keygen)(EC_KEY *key);
461 int (*compute_key)(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
462 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen));
460 int (*sign)(int type, const unsigned char *dgst, int dlen, unsigned char 463 int (*sign)(int type, const unsigned char *dgst, int dlen, unsigned char
461 *sig, unsigned int *siglen, const BIGNUM *kinv, 464 *sig, unsigned int *siglen, const BIGNUM *kinv,
462 const BIGNUM *r, EC_KEY *eckey); 465 const BIGNUM *r, EC_KEY *eckey);
@@ -465,10 +468,22 @@ struct ec_key_method_st {
465 ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, int dgst_len, 468 ECDSA_SIG *(*sign_sig)(const unsigned char *dgst, int dgst_len,
466 const BIGNUM *in_kinv, const BIGNUM *in_r, 469 const BIGNUM *in_kinv, const BIGNUM *in_r,
467 EC_KEY *eckey); 470 EC_KEY *eckey);
471 int (*verify)(int type, const unsigned char *dgst, int dgst_len,
472 const unsigned char *sigbuf, int sig_len, EC_KEY *eckey);
473 int (*verify_sig)(const unsigned char *dgst, int dgst_len,
474 const ECDSA_SIG *sig, EC_KEY *eckey);
468} /* EC_KEY_METHOD */; 475} /* EC_KEY_METHOD */;
469 476
470#define EC_KEY_METHOD_DYNAMIC 1 477#define EC_KEY_METHOD_DYNAMIC 1
471 478
479int ossl_ec_key_gen(EC_KEY *eckey);
480int ossl_ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
481 void *(*KDF) (const void *in, size_t inlen, void *out, size_t *outlen));
482int ossl_ecdsa_verify(int type, const unsigned char *dgst, int dgst_len,
483 const unsigned char *sigbuf, int sig_len, EC_KEY *eckey);
484int ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len,
485 const ECDSA_SIG *sig, EC_KEY *eckey);
486
472/* method functions in ecp_nistp521.c */ 487/* method functions in ecp_nistp521.c */
473int ec_GFp_nistp521_group_init(EC_GROUP *group); 488int ec_GFp_nistp521_group_init(EC_GROUP *group);
474int ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *); 489int ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *);