summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2022-11-19 11:53:38 +0000
committertb <>2022-11-19 11:53:38 +0000
commit70ddf26a8fd6a69b3352837ca8e572eabcdfb7c1 (patch)
tree43f97556a03caa392123ac17cb7a5449d5a04051
parentb78141471e53d13ea11d14dd53817687e84a5a92 (diff)
downloadopenbsd-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.c46
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
130static int 130static int
131pkey_dsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, 131pkey_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
153pkey_dsa_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, size_t siglen, 157pkey_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
170static int 174static int