diff options
author | tb <> | 2022-11-19 11:53:38 +0000 |
---|---|---|
committer | tb <> | 2022-11-19 11:53:38 +0000 |
commit | 70ddf26a8fd6a69b3352837ca8e572eabcdfb7c1 (patch) | |
tree | 43f97556a03caa392123ac17cb7a5449d5a04051 | |
parent | b78141471e53d13ea11d14dd53817687e84a5a92 (diff) | |
download | openbsd-70ddf26a8fd6a69b3352837ca8e572eabcdfb7c1.tar.gz openbsd-70ddf26a8fd6a69b3352837ca8e572eabcdfb7c1.tar.bz2 openbsd-70ddf26a8fd6a69b3352837ca8e572eabcdfb7c1.zip |
Rework pkey_dsa_sign() and pkey_dsa_verify()
Since DSA_sign() and DSA_verify() ignore their type argument, don't bother
to determine it here. Check all size_t for overflow before passing them as
int arguments. Follow OpenSSL and add a check to see if the tbs blob's
length matches the one of the md, in case it is set on the EVP_PKEY_CTX.
Fix return value check of DSA_sign().
ok jsing
-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 |