mp_expt_d: bring back pre 921be35779f7d71080ad85c27ed58671602d59b3 state
The implementation of the expt_d functionality is now implemented in the mp_expt_d_ex() function. The user can now choose between the old (more timing resistant) version and the new version by modification of the parameter 'fast'. mp_expt_d() defaults to the old version
This commit is contained in:
		
							parent
							
								
									8ed6043209
								
							
						
					
					
						commit
						e9b1837c8c
					
				| @ -15,41 +15,12 @@ | |||||||
|  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| /* calculate c = a**b  using a square-multiply algorithm */ | /* wrapper function for mp_expt_d_ex() */ | ||||||
| int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) | int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) | ||||||
| { | { | ||||||
|   int     res; |   return mp_expt_d_ex(a, b, c, 0); | ||||||
|   mp_int  g; |  | ||||||
| 
 |  | ||||||
|   if ((res = mp_init_copy (&g, a)) != MP_OKAY) { |  | ||||||
|     return res; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   /* set initial result */ |  | ||||||
|   mp_set (c, 1); |  | ||||||
| 
 |  | ||||||
|   while (b > 0) { |  | ||||||
|     /* if the bit is set multiply */ |  | ||||||
|     if (b & 1) { |  | ||||||
|       if ((res = mp_mul (c, &g, c)) != MP_OKAY) { |  | ||||||
|         mp_clear (&g); |  | ||||||
|         return res; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* square */ |  | ||||||
|     if (b > 1 && (res = mp_sqr (&g, &g)) != MP_OKAY) { |  | ||||||
|       mp_clear (&g); |  | ||||||
|       return res; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /* shift to next bit */ |  | ||||||
|     b >>= 1; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   mp_clear (&g); |  | ||||||
|   return MP_OKAY; |  | ||||||
| } | } | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* $Source$ */ | /* $Source$ */ | ||||||
|  | |||||||
							
								
								
									
										81
									
								
								bn_mp_expt_d_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								bn_mp_expt_d_ex.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | |||||||
|  | #include <tommath.h> | ||||||
|  | #ifdef BN_MP_EXPT_D_EX_C | ||||||
|  | /* LibTomMath, multiple-precision integer library -- Tom St Denis
 | ||||||
|  |  * | ||||||
|  |  * LibTomMath is a library that provides multiple-precision | ||||||
|  |  * integer arithmetic as well as number theoretic functionality. | ||||||
|  |  * | ||||||
|  |  * The library was designed directly after the MPI library by | ||||||
|  |  * Michael Fromberger but has been written from scratch with | ||||||
|  |  * additional optimizations in place. | ||||||
|  |  * | ||||||
|  |  * The library is free for all purposes without any express | ||||||
|  |  * guarantee it works. | ||||||
|  |  * | ||||||
|  |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /* calculate c = a**b  using a square-multiply algorithm */ | ||||||
|  | int mp_expt_d_ex (mp_int * a, mp_digit b, mp_int * c, int fast) | ||||||
|  | { | ||||||
|  |   int     res; | ||||||
|  |   unsigned int x; | ||||||
|  | 
 | ||||||
|  |   mp_int  g; | ||||||
|  | 
 | ||||||
|  |   if ((res = mp_init_copy (&g, a)) != MP_OKAY) { | ||||||
|  |     return res; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /* set initial result */ | ||||||
|  |   mp_set (c, 1); | ||||||
|  | 
 | ||||||
|  |   if (fast) { | ||||||
|  |     while (b > 0) { | ||||||
|  |       /* if the bit is set multiply */ | ||||||
|  |       if (b & 1) { | ||||||
|  |         if ((res = mp_mul (c, &g, c)) != MP_OKAY) { | ||||||
|  |           mp_clear (&g); | ||||||
|  |           return res; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       /* square */ | ||||||
|  |       if (b > 1 && (res = mp_sqr (&g, &g)) != MP_OKAY) { | ||||||
|  |         mp_clear (&g); | ||||||
|  |         return res; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       /* shift to next bit */ | ||||||
|  |       b >>= 1; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     for (x = 0; x < DIGIT_BIT; x++) { | ||||||
|  |       /* square */ | ||||||
|  |       if ((res = mp_sqr (c, c)) != MP_OKAY) { | ||||||
|  |         mp_clear (&g); | ||||||
|  |         return res; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       /* if the bit is set multiply */ | ||||||
|  |       if ((b & (mp_digit) (((mp_digit)1) << (DIGIT_BIT - 1))) != 0) { | ||||||
|  |         if ((res = mp_mul (c, &g, c)) != MP_OKAY) { | ||||||
|  |            mp_clear (&g); | ||||||
|  |            return res; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       /* shift to next bit */ | ||||||
|  |       b <<= 1; | ||||||
|  |     } | ||||||
|  |     } /* if ... else */ | ||||||
|  | 
 | ||||||
|  |     mp_clear (&g); | ||||||
|  |   return MP_OKAY; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* $Source$ */ | ||||||
|  | /* $Revision$ */ | ||||||
|  | /* $Date$ */ | ||||||
							
								
								
									
										2
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								makefile
									
									
									
									
									
								
							| @ -96,7 +96,7 @@ bn_mp_init_multi.o bn_mp_clear_multi.o bn_mp_exteuclid.o bn_mp_toradix_n.o \ | |||||||
| bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o bn_mp_init_set.o \ | bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o bn_mp_init_set.o \ | ||||||
| bn_mp_init_set_int.o bn_mp_invmod_slow.o bn_mp_prime_rabin_miller_trials.o \ | bn_mp_init_set_int.o bn_mp_invmod_slow.o bn_mp_prime_rabin_miller_trials.o \ | ||||||
| bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin_n.o bn_mp_import.o bn_mp_export.o \ | bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin_n.o bn_mp_import.o bn_mp_export.o \ | ||||||
| bn_mp_balance_mul.o | bn_mp_balance_mul.o bn_mp_expt_d_ex.o | ||||||
| 
 | 
 | ||||||
| $(LIBNAME):  $(OBJECTS) | $(LIBNAME):  $(OBJECTS) | ||||||
| 	$(AR) $(ARFLAGS) $@ $(OBJECTS) | 	$(AR) $(ARFLAGS) $@ $(OBJECTS) | ||||||
|  | |||||||
| @ -364,6 +364,7 @@ int mp_div_3(mp_int *a, mp_int *c, mp_digit *d); | |||||||
| 
 | 
 | ||||||
| /* c = a**b */ | /* c = a**b */ | ||||||
| int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); | int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); | ||||||
|  | int mp_expt_d_ex (mp_int * a, mp_digit b, mp_int * c, int fast); | ||||||
| 
 | 
 | ||||||
| /* c = a mod b, 0 <= c < b  */ | /* c = a mod b, 0 <= c < b  */ | ||||||
| int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); | int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); | ||||||
|  | |||||||
| @ -41,6 +41,7 @@ | |||||||
| #define BN_MP_EXCH_C | #define BN_MP_EXCH_C | ||||||
| #define BN_MP_EXPORT_C | #define BN_MP_EXPORT_C | ||||||
| #define BN_MP_EXPT_D_C | #define BN_MP_EXPT_D_C | ||||||
|  | #define BN_MP_EXPT_D_EX_C | ||||||
| #define BN_MP_EXPTMOD_C | #define BN_MP_EXPTMOD_C | ||||||
| #define BN_MP_EXPTMOD_FAST_C | #define BN_MP_EXPTMOD_FAST_C | ||||||
| #define BN_MP_EXTEUCLID_C | #define BN_MP_EXTEUCLID_C | ||||||
| @ -333,6 +334,10 @@ | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if defined(BN_MP_EXPT_D_C) | #if defined(BN_MP_EXPT_D_C) | ||||||
|  |    #define BN_MP_EXPT_D_EX_C | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(BN_MP_EXPT_D_EX_C) | ||||||
|    #define BN_MP_INIT_COPY_C |    #define BN_MP_INIT_COPY_C | ||||||
|    #define BN_MP_SET_C |    #define BN_MP_SET_C | ||||||
|    #define BN_MP_MUL_C |    #define BN_MP_MUL_C | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user