DSA verification should insist that r and s are in the allowed range.
authorBodo Möller <bodo@openssl.org>
Tue, 26 Jun 2001 09:48:56 +0000 (09:48 +0000)
committerBodo Möller <bodo@openssl.org>
Tue, 26 Jun 2001 09:48:56 +0000 (09:48 +0000)
CHANGES
crypto/dsa/dsa_ossl.c

diff --git a/CHANGES b/CHANGES
index 7b324389b8e16386a069e226981d893ddaaadd5e..748f0f86543e1dc0d7f32a4969cc5d3585e2276d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@
 
  Changes between 0.9.6a and 0.9.6b  [XX xxx XXXX]
 
+  *) In dsa_do_verify (crypto/dsa/dsa_ossl.c), verify that r and s are
+     positive and less than q.
+     [Bodo Moeller]
+
   *) Don't change *pointer in CRYPTO_add_lock() is add_lock_callback is
      used: it isn't thread safe and the add_lock_callback should handle
      that itself.
index 331d176d6607af0910c3bf164e647b4ba426818d..cac42c362d1713d6c12ac460ff9a1a4ab1705d98 100644 (file)
@@ -240,6 +240,17 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
        BN_init(&u2);
        BN_init(&t1);
 
+       if (BN_is_zero(sig->r) || sig->r->neg || BN_ucmp(sig->r, dsa->q) >= 0)
+               {
+               ret = 0;
+               goto err;
+               }
+       if (BN_is_zero(sig->s) || sig->s->neg || BN_ucmp(sig->s, dsa->q) >= 0)
+               {
+               ret = 0;
+               goto err;
+               }
+
        /* Calculate W = inv(S) mod Q
         * save W in u2 */
        if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err;