diff options
| -rw-r--r-- | src/lib/libcrypto/dsa/dsa_pmeth.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/lib/libcrypto/dsa/dsa_pmeth.c b/src/lib/libcrypto/dsa/dsa_pmeth.c index afc01a7791..b4ce58eef8 100644 --- a/src/lib/libcrypto/dsa/dsa_pmeth.c +++ b/src/lib/libcrypto/dsa/dsa_pmeth.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: dsa_pmeth.c,v 1.14 2022/11/19 06:33:00 tb Exp $ */ | 1 | /* $OpenBSD: dsa_pmeth.c,v 1.15 2022/11/19 11:53:38 tb Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2006. | 3 | * project 2006. |
| 4 | */ | 4 | */ |
| @@ -128,24 +128,28 @@ pkey_dsa_cleanup(EVP_PKEY_CTX *ctx) | |||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | static int | 130 | static int |
| 131 | pkey_dsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | 131 | pkey_dsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *out_siglen, |
| 132 | const unsigned char *tbs, size_t tbslen) | 132 | const unsigned char *tbs, size_t tbslen) |
| 133 | { | 133 | { |
| 134 | int ret, type; | ||
| 135 | unsigned int sltmp; | ||
| 136 | DSA_PKEY_CTX *dctx = ctx->data; | ||
| 137 | DSA *dsa = ctx->pkey->pkey.dsa; | 134 | DSA *dsa = ctx->pkey->pkey.dsa; |
| 135 | DSA_PKEY_CTX *dctx = ctx->data; | ||
| 136 | unsigned int siglen; | ||
| 138 | 137 | ||
| 139 | if (dctx->md) | 138 | *out_siglen = 0; |
| 140 | type = EVP_MD_type(dctx->md); | 139 | |
| 141 | else | 140 | if (tbslen > INT_MAX) |
| 142 | type = NID_sha1; | 141 | return 0; |
| 143 | 142 | ||
| 144 | ret = DSA_sign(type, tbs, tbslen, sig, &sltmp, dsa); | 143 | if (dctx->md != NULL) { |
| 144 | if (tbslen != EVP_MD_size(dctx->md)) | ||
| 145 | return 0; | ||
| 146 | } | ||
| 147 | |||
| 148 | if (!DSA_sign(0, tbs, tbslen, sig, &siglen, dsa)) | ||
| 149 | return 0; | ||
| 150 | |||
| 151 | *out_siglen = siglen; | ||
| 145 | 152 | ||
| 146 | if (ret <= 0) | ||
| 147 | return ret; | ||
| 148 | *siglen = sltmp; | ||
| 149 | return 1; | 153 | return 1; |
| 150 | } | 154 | } |
| 151 | 155 | ||
| @@ -153,18 +157,18 @@ static int | |||
| 153 | pkey_dsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, | 157 | pkey_dsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, |
| 154 | const unsigned char *tbs, size_t tbslen) | 158 | const unsigned char *tbs, size_t tbslen) |
| 155 | { | 159 | { |
| 156 | int ret, type; | ||
| 157 | DSA_PKEY_CTX *dctx = ctx->data; | ||
| 158 | DSA *dsa = ctx->pkey->pkey.dsa; | 160 | DSA *dsa = ctx->pkey->pkey.dsa; |
| 161 | DSA_PKEY_CTX *dctx = ctx->data; | ||
| 159 | 162 | ||
| 160 | if (dctx->md) | 163 | if (tbslen > INT_MAX || siglen > INT_MAX) |
| 161 | type = EVP_MD_type(dctx->md); | 164 | return 0; |
| 162 | else | ||
| 163 | type = NID_sha1; | ||
| 164 | 165 | ||
| 165 | ret = DSA_verify(type, tbs, tbslen, sig, siglen, dsa); | 166 | if (dctx->md != NULL) { |
| 167 | if (tbslen != EVP_MD_size(dctx->md)) | ||
| 168 | return 0; | ||
| 169 | } | ||
| 166 | 170 | ||
| 167 | return ret; | 171 | return DSA_verify(0, tbs, tbslen, sig, siglen, dsa); |
| 168 | } | 172 | } |
| 169 | 173 | ||
| 170 | static int | 174 | static int |
