mirror of https://github.com/openssl/openssl.git
				
				
				
			fix BIGNUM flag handling
This commit is contained in:
		
							parent
							
								
									0d7f6fc76a
								
							
						
					
					
						commit
						7c9882eb24
					
				
							
								
								
									
										4
									
								
								CHANGES
								
								
								
								
							
							
						
						
									
										4
									
								
								CHANGES
								
								
								
								
							|  | @ -610,6 +610,10 @@ | ||||||
| 
 | 
 | ||||||
|  Changes between 0.9.8g and 0.9.8h  [xx XXX xxxx] |  Changes between 0.9.8g and 0.9.8h  [xx XXX xxxx] | ||||||
| 
 | 
 | ||||||
|  |   *) Fix BN flag handling in RSA_eay_mod_exp() and BN_MONT_CTX_set() | ||||||
|  |      to get the expected BN_FLG_CONSTTIME behavior. | ||||||
|  |      [Bodo Moeller (Google)] | ||||||
|  |    | ||||||
|   *) Netware support: |   *) Netware support: | ||||||
| 
 | 
 | ||||||
|      - fixed wrong usage of ioctlsocket() when build for LIBC BSD sockets |      - fixed wrong usage of ioctlsocket() when build for LIBC BSD sockets | ||||||
|  |  | ||||||
|  | @ -425,6 +425,7 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx) | ||||||
| 		BIGNUM tmod; | 		BIGNUM tmod; | ||||||
| 		BN_ULONG buf[2]; | 		BN_ULONG buf[2]; | ||||||
| 
 | 
 | ||||||
|  | 		BN_init(&tmod); | ||||||
| 		tmod.d=buf; | 		tmod.d=buf; | ||||||
| 		tmod.dmax=2; | 		tmod.dmax=2; | ||||||
| 		tmod.neg=0; | 		tmod.neg=0; | ||||||
|  |  | ||||||
|  | @ -151,13 +151,13 @@ const RSA_METHOD *RSA_PKCS1_SSLeay(void) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| /* Usage example;
 | /* Usage example;
 | ||||||
|  *    MONT_HELPER(rsa, bn_ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); |  *    MONT_HELPER(rsa->_method_mod_p, bn_ctx, rsa->p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | ||||||
|  */ |  */ | ||||||
| #define MONT_HELPER(rsa, ctx, m, pre_cond, err_instr) \ | #define MONT_HELPER(method_mod, ctx, m, pre_cond, err_instr) \ | ||||||
| 	if((pre_cond) && ((rsa)->_method_mod_##m == NULL) && \ | 	if ((pre_cond) && ((method_mod) == NULL) && \ | ||||||
| 			!BN_MONT_CTX_set_locked(&((rsa)->_method_mod_##m), \ | 			!BN_MONT_CTX_set_locked(&(method_mod), \ | ||||||
| 				CRYPTO_LOCK_RSA, \ | 				CRYPTO_LOCK_RSA, \ | ||||||
| 				(rsa)->m, (ctx))) \ | 				(m), (ctx))) \ | ||||||
| 		err_instr | 		err_instr | ||||||
| 
 | 
 | ||||||
| static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | ||||||
|  | @ -227,13 +227,13 @@ static int RSA_eay_public_encrypt(int flen, const unsigned char *from, | ||||||
| 	if (BN_bin2bn(buf,num,f) == NULL) goto err; | 	if (BN_bin2bn(buf,num,f) == NULL) goto err; | ||||||
| 	 | 	 | ||||||
| 	if (BN_ucmp(f, rsa->n) >= 0) | 	if (BN_ucmp(f, rsa->n) >= 0) | ||||||
| 		{	 | 		{ | ||||||
| 		/* usually the padding functions would catch this */ | 		/* usually the padding functions would catch this */ | ||||||
| 		RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); | 		RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS); | ||||||
| 		goto err; | 		goto err; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 	MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | ||||||
| 
 | 
 | ||||||
| 	if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | 	if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | ||||||
| 		rsa->_method_mod_n)) goto err; | 		rsa->_method_mod_n)) goto err; | ||||||
|  | @ -436,9 +436,9 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, | ||||||
| 			BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); | 			BN_with_flags(d, rsa->d, BN_FLG_CONSTTIME); | ||||||
| 			} | 			} | ||||||
| 		else | 		else | ||||||
| 			d = rsa->d; | 			d= rsa->d; | ||||||
| 
 | 
 | ||||||
| 		MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 		MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | ||||||
| 
 | 
 | ||||||
| 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | ||||||
| 				rsa->_method_mod_n)) goto err; | 				rsa->_method_mod_n)) goto err; | ||||||
|  | @ -559,7 +559,7 @@ static int RSA_eay_private_decrypt(int flen, const unsigned char *from, | ||||||
| 		else | 		else | ||||||
| 			d = rsa->d; | 			d = rsa->d; | ||||||
| 
 | 
 | ||||||
| 		MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 		MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | ||||||
| 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | 		if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx, | ||||||
| 				rsa->_method_mod_n)) | 				rsa->_method_mod_n)) | ||||||
| 		  goto err; | 		  goto err; | ||||||
|  | @ -669,7 +669,7 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, | ||||||
| 		goto err; | 		goto err; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 	MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | ||||||
| 
 | 
 | ||||||
| 	if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | 	if (!rsa->meth->bn_mod_exp(ret,f,rsa->e,rsa->n,ctx, | ||||||
| 		rsa->_method_mod_n)) goto err; | 		rsa->_method_mod_n)) goto err; | ||||||
|  | @ -717,7 +717,6 @@ static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) | ||||||
| 	BIGNUM *r1,*m1,*vrfy; | 	BIGNUM *r1,*m1,*vrfy; | ||||||
| 	BIGNUM local_dmp1,local_dmq1,local_c,local_r1; | 	BIGNUM local_dmp1,local_dmq1,local_c,local_r1; | ||||||
| 	BIGNUM *dmp1,*dmq1,*c,*pr1; | 	BIGNUM *dmp1,*dmq1,*c,*pr1; | ||||||
| 	int bn_flags; |  | ||||||
| 	int ret=0; | 	int ret=0; | ||||||
| 
 | 
 | ||||||
| 	BN_CTX_start(ctx); | 	BN_CTX_start(ctx); | ||||||
|  | @ -725,31 +724,34 @@ static int RSA_eay_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) | ||||||
| 	m1 = BN_CTX_get(ctx); | 	m1 = BN_CTX_get(ctx); | ||||||
| 	vrfy = BN_CTX_get(ctx); | 	vrfy = BN_CTX_get(ctx); | ||||||
| 
 | 
 | ||||||
| 	/* Make sure mod_inverse in montgomerey intialization use correct 
 | 	{ | ||||||
| 	 * BN_FLG_CONSTTIME flag. | 		BIGNUM local_p, local_q; | ||||||
| 	 */ | 		BIGNUM *p = NULL, *q = NULL; | ||||||
| 	bn_flags = rsa->p->flags; |  | ||||||
| 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) |  | ||||||
| 		{ |  | ||||||
| 		rsa->p->flags |= BN_FLG_CONSTTIME; |  | ||||||
| 		} |  | ||||||
| 	MONT_HELPER(rsa, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); |  | ||||||
| 	/* We restore bn_flags back */ |  | ||||||
| 	rsa->p->flags = bn_flags; |  | ||||||
| 
 | 
 | ||||||
|         /* Make sure mod_inverse in montgomerey intialization use correct
 | 		/* Make sure BN_mod_inverse in Montgomery intialization uses the
 | ||||||
|          * BN_FLG_CONSTTIME flag. | 		 * BN_FLG_CONSTTIME flag (unless RSA_FLAG_NO_CONSTTIME is set) | ||||||
|          */ | 		 */ | ||||||
| 	bn_flags = rsa->q->flags; | 		if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) | ||||||
| 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) | 			{ | ||||||
| 		{ | 			BN_init(&local_p); | ||||||
| 		rsa->q->flags |= BN_FLG_CONSTTIME; | 			p = &local_p; | ||||||
| 		} | 			BN_with_flags(p, rsa->p, BN_FLG_CONSTTIME); | ||||||
| 	MONT_HELPER(rsa, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); |  | ||||||
| 	/* We restore bn_flags back */ |  | ||||||
| 	rsa->q->flags = bn_flags;	 |  | ||||||
| 
 | 
 | ||||||
| 	MONT_HELPER(rsa, ctx, n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | 			BN_init(&local_q); | ||||||
|  | 			q = &local_q; | ||||||
|  | 			BN_with_flags(q, rsa->q, BN_FLG_CONSTTIME); | ||||||
|  | 			} | ||||||
|  | 		else | ||||||
|  | 			{ | ||||||
|  | 			p = rsa->p; | ||||||
|  | 			q = rsa->q; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		MONT_HELPER(rsa->_method_mod_p, ctx, p, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | ||||||
|  | 		MONT_HELPER(rsa->_method_mod_q, ctx, q, rsa->flags & RSA_FLAG_CACHE_PRIVATE, goto err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	MONT_HELPER(rsa->_method_mod_n, ctx, rsa->n, rsa->flags & RSA_FLAG_CACHE_PUBLIC, goto err); | ||||||
| 
 | 
 | ||||||
| 	/* compute I mod q */ | 	/* compute I mod q */ | ||||||
| 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) | 	if (!(rsa->flags & RSA_FLAG_NO_CONSTTIME)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue