DSA verification should insist that r and s are in the allowed range.
This commit is contained in:
		
							
								
								
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								CHANGES
									
									
									
									
									
								
							@@ -4,6 +4,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 Changes between 0.9.6a and 0.9.6b  [XX xxx XXXX]
 | 
					 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
 | 
					  *) 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
 | 
					     used: it isn't thread safe and the add_lock_callback should handle
 | 
				
			||||||
     that itself.
 | 
					     that itself.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -240,6 +240,17 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
 | 
				
			|||||||
	BN_init(&u2);
 | 
						BN_init(&u2);
 | 
				
			||||||
	BN_init(&t1);
 | 
						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
 | 
						/* Calculate W = inv(S) mod Q
 | 
				
			||||||
	 * save W in u2 */
 | 
						 * save W in u2 */
 | 
				
			||||||
	if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err;
 | 
						if ((BN_mod_inverse(&u2,sig->s,dsa->q,ctx)) == NULL) goto err;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user