diff options
| author | tb <> | 2019-01-19 01:12:48 +0000 |
|---|---|---|
| committer | tb <> | 2019-01-19 01:12:48 +0000 |
| commit | dad3267aefbeab3a8910c1c59b2e5f7e9c12b048 (patch) | |
| tree | 5ac3e1c2617f2fd9b71523bfd1836f187ba33661 /src/lib/libcrypto/ec | |
| parent | dc38b357c3a6e0db4a7172af29148961b86b0724 (diff) | |
| download | openbsd-dad3267aefbeab3a8910c1c59b2e5f7e9c12b048.tar.gz openbsd-dad3267aefbeab3a8910c1c59b2e5f7e9c12b048.tar.bz2 openbsd-dad3267aefbeab3a8910c1c59b2e5f7e9c12b048.zip | |
Partial port of EC_KEY_METHOD from OpenSSL 1.1.
This commit adds missing API for ECDH/ECDSA_verify.
from markus
Diffstat (limited to 'src/lib/libcrypto/ec')
| -rw-r--r-- | src/lib/libcrypto/ec/ec.h | 12 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_key.c | 13 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_kmeth.c | 112 | ||||
| -rw-r--r-- | src/lib/libcrypto/ec/ec_lcl.h | 17 |
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)); |
| 969 | void EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, | ||
| 970 | int (*keygen)(EC_KEY *key)); | ||
| 971 | void 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))); | ||
| 969 | void EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth, | 974 | void 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)); |
| 981 | void EC_KEY_METHOD_get_keygen(EC_KEY_METHOD *meth, | ||
| 982 | int (**pkeygen)(EC_KEY *key)); | ||
| 983 | void 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 | ||
| 977 | EC_KEY *ECParameters_dup(EC_KEY *key); | 987 | EC_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 | ||
| 250 | int | 250 | int |
| 251 | EC_KEY_generate_key(EC_KEY *eckey) | 251 | EC_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 | |||
| 259 | int | ||
| 260 | ossl_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 | ||
| 80 | const EC_KEY_METHOD *default_ec_key_meth = &openssl_ec_key_method; | 86 | const 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 | ||
| 199 | void | 205 | void |
| 206 | EC_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 | |||
| 222 | void | ||
| 223 | EC_KEY_METHOD_set_keygen(EC_KEY_METHOD *meth, int (*keygen)(EC_KEY *key)) | ||
| 224 | { | ||
| 225 | meth->keygen = keygen; | ||
| 226 | } | ||
| 227 | |||
| 228 | void | ||
| 229 | EC_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 | |||
| 236 | void | ||
| 237 | EC_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 | |||
| 252 | void | ||
| 253 | EC_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 | |||
| 264 | void | ||
| 200 | EC_KEY_METHOD_get_init(EC_KEY_METHOD *meth, | 265 | EC_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 | ||
| 222 | void | 287 | void |
| 223 | EC_KEY_METHOD_set_init(EC_KEY_METHOD *meth, | 288 | EC_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; | 295 | void |
| 236 | meth->set_public = set_public; | 296 | EC_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 | ||
| 239 | void | 304 | void |
| @@ -256,17 +321,14 @@ EC_KEY_METHOD_get_sign(EC_KEY_METHOD *meth, | |||
| 256 | } | 321 | } |
| 257 | 322 | ||
| 258 | void | 323 | void |
| 259 | EC_KEY_METHOD_set_sign(EC_KEY_METHOD *meth, | 324 | EC_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 | ||
| 479 | int ossl_ec_key_gen(EC_KEY *eckey); | ||
| 480 | int 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)); | ||
| 482 | int ossl_ecdsa_verify(int type, const unsigned char *dgst, int dgst_len, | ||
| 483 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey); | ||
| 484 | int 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 */ |
| 473 | int ec_GFp_nistp521_group_init(EC_GROUP *group); | 488 | int ec_GFp_nistp521_group_init(EC_GROUP *group); |
| 474 | int ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *); | 489 | int ec_GFp_nistp521_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *n, BN_CTX *); |
