You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			97 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
| 
											11 years ago
										 | #include "ge.h"
 | ||
|  | 
 | ||
|  | static void slide(signed char *r,const unsigned char *a) | ||
|  | { | ||
|  |   int i; | ||
|  |   int b; | ||
|  |   int k; | ||
|  | 
 | ||
|  |   for (i = 0;i < 256;++i) | ||
|  |     r[i] = 1 & (a[i >> 3] >> (i & 7)); | ||
|  | 
 | ||
|  |   for (i = 0;i < 256;++i) | ||
|  |     if (r[i]) { | ||
|  |       for (b = 1;b <= 6 && i + b < 256;++b) { | ||
|  |         if (r[i + b]) { | ||
|  |           if (r[i] + (r[i + b] << b) <= 15) { | ||
|  |             r[i] += r[i + b] << b; r[i + b] = 0; | ||
|  |           } else if (r[i] - (r[i + b] << b) >= -15) { | ||
|  |             r[i] -= r[i + b] << b; | ||
|  |             for (k = i + b;k < 256;++k) { | ||
|  |               if (!r[k]) { | ||
|  |                 r[k] = 1; | ||
|  |                 break; | ||
|  |               } | ||
|  |               r[k] = 0; | ||
|  |             } | ||
|  |           } else | ||
|  |             break; | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | static ge_precomp Bi[8] = { | ||
|  | #include "base2.h"
 | ||
|  | } ; | ||
|  | 
 | ||
|  | /*
 | ||
|  | r = a * A + b * B | ||
|  | where a = a[0]+256*a[1]+...+256^31 a[31]. | ||
|  | and b = b[0]+256*b[1]+...+256^31 b[31]. | ||
|  | B is the Ed25519 base point (x,4/5) with x positive. | ||
|  | */ | ||
|  | 
 | ||
|  | void ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b) | ||
|  | { | ||
|  |   signed char aslide[256]; | ||
|  |   signed char bslide[256]; | ||
|  |   ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ | ||
|  |   ge_p1p1 t; | ||
|  |   ge_p3 u; | ||
|  |   ge_p3 A2; | ||
|  |   int i; | ||
|  | 
 | ||
|  |   slide(aslide,a); | ||
|  |   slide(bslide,b); | ||
|  | 
 | ||
|  |   ge_p3_to_cached(&Ai[0],A); | ||
|  |   ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); | ||
|  |   ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); | ||
|  |   ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); | ||
|  |   ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); | ||
|  |   ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); | ||
|  |   ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); | ||
|  |   ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); | ||
|  |   ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); | ||
|  | 
 | ||
|  |   ge_p2_0(r); | ||
|  | 
 | ||
|  |   for (i = 255;i >= 0;--i) { | ||
|  |     if (aslide[i] || bslide[i]) break; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (;i >= 0;--i) { | ||
|  |     ge_p2_dbl(&t,r); | ||
|  | 
 | ||
|  |     if (aslide[i] > 0) { | ||
|  |       ge_p1p1_to_p3(&u,&t); | ||
|  |       ge_add(&t,&u,&Ai[aslide[i]/2]); | ||
|  |     } else if (aslide[i] < 0) { | ||
|  |       ge_p1p1_to_p3(&u,&t); | ||
|  |       ge_sub(&t,&u,&Ai[(-aslide[i])/2]); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (bslide[i] > 0) { | ||
|  |       ge_p1p1_to_p3(&u,&t); | ||
|  |       ge_madd(&t,&u,&Bi[bslide[i]/2]); | ||
|  |     } else if (bslide[i] < 0) { | ||
|  |       ge_p1p1_to_p3(&u,&t); | ||
|  |       ge_msub(&t,&u,&Bi[(-bslide[i])/2]); | ||
|  |     } | ||
|  | 
 | ||
|  |     ge_p1p1_to_p2(r,&t); | ||
|  |   } | ||
|  | } |