| 
									
										
										
										
											2004-04-11 20:46:22 +00:00
										 |  |  | /* tests the montgomery routines */ | 
					
						
							|  |  |  | #include <tommath.h>
 | 
					
						
							| 
									
										
										
										
											2017-12-09 20:05:39 +01:00
										 |  |  | #include <time.h>
 | 
					
						
							| 
									
										
										
										
											2004-04-11 20:46:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | int main(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    mp_int modulus, R, p, pp; | 
					
						
							|  |  |  |    mp_digit mp; | 
					
						
							| 
									
										
										
										
											2018-02-05 20:22:17 +01:00
										 |  |  |    int x, y; | 
					
						
							| 
									
										
										
										
											2004-04-11 20:46:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    srand(time(NULL)); | 
					
						
							|  |  |  |    mp_init_multi(&modulus, &R, &p, &pp, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    /* loop through various sizes */ | 
					
						
							|  |  |  |    for (x = 4; x < 256; x++) { | 
					
						
							| 
									
										
										
										
											2018-02-05 20:22:17 +01:00
										 |  |  |       printf("DIGITS == %3d...", x); | 
					
						
							| 
									
										
										
										
											2017-10-18 10:44:06 +02:00
										 |  |  |       fflush(stdout); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /* make up the odd modulus */ | 
					
						
							|  |  |  |       mp_rand(&modulus, x); | 
					
						
							| 
									
										
										
										
											2018-02-13 19:04:25 +01:00
										 |  |  |       modulus.dp[0] |= 1uL; | 
					
						
							| 
									
										
										
										
											2017-10-18 10:44:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /* now find the R value */ | 
					
						
							|  |  |  |       mp_montgomery_calc_normalization(&R, &modulus); | 
					
						
							|  |  |  |       mp_montgomery_setup(&modulus, &mp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       /* now run through a bunch tests */ | 
					
						
							|  |  |  |       for (y = 0; y < 1000; y++) { | 
					
						
							|  |  |  |          mp_rand(&p, x/2);        /* p = random */ | 
					
						
							|  |  |  |          mp_mul(&p, &R, &pp);     /* pp = R * p */ | 
					
						
							|  |  |  |          mp_montgomery_reduce(&pp, &modulus, mp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          /* should be equal to p */ | 
					
						
							|  |  |  |          if (mp_cmp(&pp, &p) != MP_EQ) { | 
					
						
							|  |  |  |             printf("FAILURE!\n"); | 
					
						
							|  |  |  |             exit(-1); | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       printf("PASSED\n"); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    return 0; | 
					
						
							| 
									
										
										
										
											2004-04-11 20:46:22 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 16:27:26 +02:00
										 |  |  | /* ref:         $Format:%D$ */ | 
					
						
							|  |  |  | /* git commit:  $Format:%H$ */ | 
					
						
							|  |  |  | /* commit time: $Format:%ai$ */ |