51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* tests the montgomery routines */
 | |
| #include <tommath.h>
 | |
| 
 | |
| int main(void)
 | |
| {
 | |
|    mp_int modulus, R, p, pp;
 | |
|    mp_digit mp;
 | |
|    long x, y;
 | |
| 
 | |
|    srand(time(NULL));
 | |
|    mp_init_multi(&modulus, &R, &p, &pp, NULL);
 | |
| 
 | |
|    /* loop through various sizes */
 | |
|    for (x = 4; x < 256; x++) {
 | |
|        printf("DIGITS == %3ld...", x); fflush(stdout);
 | |
| 
 | |
|        /* make up the odd modulus */
 | |
|        mp_rand(&modulus, x);
 | |
|        modulus.dp[0] |= 1;
 | |
| 
 | |
|        /* 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;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /* $Source: /cvs/libtom/libtommath/etc/mont.c,v $ */
 | |
| /* $Revision: 1.2 $ */
 | |
| /* $Date: 2005/05/05 14:38:47 $ */
 | 
