diff options
Diffstat (limited to 'src/lib/libcrypto/ecdsa/ecs_ossl.c')
-rw-r--r-- | src/lib/libcrypto/ecdsa/ecs_ossl.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/lib/libcrypto/ecdsa/ecs_ossl.c b/src/lib/libcrypto/ecdsa/ecs_ossl.c index 4e05cb9aac..791a5c48e1 100644 --- a/src/lib/libcrypto/ecdsa/ecs_ossl.c +++ b/src/lib/libcrypto/ecdsa/ecs_ossl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecs_ossl.c,v 1.17 2019/01/19 01:07:00 tb Exp $ */ | 1 | /* $OpenBSD: ecs_ossl.c,v 1.18 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 | */ |
@@ -56,6 +56,8 @@ | |||
56 | * | 56 | * |
57 | */ | 57 | */ |
58 | 58 | ||
59 | #include <string.h> | ||
60 | |||
59 | #include <openssl/opensslconf.h> | 61 | #include <openssl/opensslconf.h> |
60 | 62 | ||
61 | #include <openssl/err.h> | 63 | #include <openssl/err.h> |
@@ -421,6 +423,32 @@ ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len, | |||
421 | return ecdsa->meth->ecdsa_do_sign(dgst, dgst_len, in_kinv, in_r, eckey); | 423 | return ecdsa->meth->ecdsa_do_sign(dgst, dgst_len, in_kinv, in_r, eckey); |
422 | } | 424 | } |
423 | 425 | ||
426 | int | ||
427 | ossl_ecdsa_verify(int type, const unsigned char *dgst, int dgst_len, | ||
428 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) | ||
429 | { | ||
430 | ECDSA_SIG *s; | ||
431 | unsigned char *der = NULL; | ||
432 | const unsigned char *p = sigbuf; | ||
433 | int derlen = -1; | ||
434 | int ret = -1; | ||
435 | |||
436 | if ((s = ECDSA_SIG_new()) == NULL) | ||
437 | return (ret); | ||
438 | if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) | ||
439 | goto err; | ||
440 | /* Ensure signature uses DER and doesn't have trailing garbage */ | ||
441 | derlen = i2d_ECDSA_SIG(s, &der); | ||
442 | if (derlen != sig_len || memcmp(sigbuf, der, derlen)) | ||
443 | goto err; | ||
444 | ret = ECDSA_do_verify(dgst, dgst_len, s, eckey); | ||
445 | |||
446 | err: | ||
447 | freezero(der, derlen); | ||
448 | ECDSA_SIG_free(s); | ||
449 | return (ret); | ||
450 | } | ||
451 | |||
424 | static int | 452 | static int |
425 | ecdsa_do_verify(const unsigned char *dgst, int dgst_len, const ECDSA_SIG *sig, | 453 | ecdsa_do_verify(const unsigned char *dgst, int dgst_len, const ECDSA_SIG *sig, |
426 | EC_KEY *eckey) | 454 | EC_KEY *eckey) |
@@ -524,3 +552,15 @@ ecdsa_do_verify(const unsigned char *dgst, int dgst_len, const ECDSA_SIG *sig, | |||
524 | EC_POINT_free(point); | 552 | EC_POINT_free(point); |
525 | return ret; | 553 | return ret; |
526 | } | 554 | } |
555 | |||
556 | /* replace w/ ecdsa_do_verify() when ECDSA_METHOD gets removed */ | ||
557 | int | ||
558 | ossl_ecdsa_verify_sig(const unsigned char *dgst, int dgst_len, | ||
559 | const ECDSA_SIG *sig, EC_KEY *eckey) | ||
560 | { | ||
561 | ECDSA_DATA *ecdsa; | ||
562 | |||
563 | if ((ecdsa = ecdsa_check(eckey)) == NULL) | ||
564 | return 0; | ||
565 | return ecdsa->meth->ecdsa_do_verify(dgst, dgst_len, sig, eckey); | ||
566 | } | ||