Skip to content

Commit b74e978

Browse files
committed
Little speed up
1 parent 9b17579 commit b74e978

File tree

5 files changed

+55
-37
lines changed

5 files changed

+55
-37
lines changed

Arduino_ECCDH/ECDH.cpp

+38-26
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,12 @@ inline void addfromto(unsigned char * a, unsigned char * b, unsigned char from,
158158
a[i] = a[i] ^ b[i - from];
159159
}
160160
}
161-
162-
inline unsigned char * mul(unsigned char * a, unsigned char * b, unsigned char * res){ //corrected
161+
inline unsigned char * mul(unsigned char * a, unsigned char * b, unsigned char * res){ // changed
163162
//unsigned char res[SIZE];
164-
cleanPoly(res);
163+
165164
unsigned char tmpa[SIZE];
166165
copyPoly(tmpa, a);
166+
cleanPoly(res);
167167
unsigned char j = 0x01;
168168
for(unsigned char k = 0; k < 8; k++){
169169
for(unsigned char i = 0; i < SIZE; i++){
@@ -289,43 +289,55 @@ unsigned char isBiggerThanOne(unsigned char * b){ // corrected
289289
return true;*/
290290
}
291291

292+
void doperm( unsigned char *tmp_a, unsigned char * tmp_b, unsigned char * tmp, unsigned char * q, unsigned char * t, unsigned char * x0, unsigned char * x1, unsigned char * restmp, unsigned char * res){
293+
while (isBiggerThanOne(tmp_a)) {
294+
//cleanPoly(tmp);
295+
cleanPoly(q);
296+
divMod(tmp_a, tmp_b, tmp, q);// q = a / b;
297+
298+
copyPoly(tmp_a, tmp_b); // a = t;
299+
copyPoly(tmp_b, tmp);// b = tmp;
300+
copyPoly(t, x0); //t = x0;
301+
//cleanPoly(restmp);
302+
//cleanPoly(restmp);
303+
mul(x0, q, x0);
304+
//x0 = restmp;
305+
add(x0, x1);
306+
//copyPoly(x0, restmp); // x0 = x1 + q * x0;
307+
//x0 = x1;
308+
//(unsigned char*)x0 = (unsigned char*)add(x1, mul(q, x0, restmp));
309+
copyPoly(x1, t); //x1 = t;
310+
//x1 = p;
311+
}
312+
copyPoly(res, x1);
313+
}
292314

293-
void inverse(unsigned char * a, unsigned char * b, unsigned char * res){
315+
inline void inverse(unsigned char * a, unsigned char * b, unsigned char * res){
294316
unsigned char tmp_a[SIZE];
295317
copyPoly(tmp_a, a);
296318
unsigned char tmp_b[SIZE];
297319
copyPoly(tmp_b, b);
298320

299-
unsigned char b0[SIZE], t[SIZE], q[SIZE];
300-
copyPoly(b0,b);
321+
unsigned char t[SIZE];
322+
unsigned char q[SIZE];
323+
//copyPoly(b0,b);
301324
cleanPoly(q);
302-
unsigned char x0[SIZE], x1[SIZE];
325+
unsigned char x0[SIZE];
326+
unsigned char x1[SIZE];
327+
//unsigned char * x1 = NULL;
303328
cleanPoly(x0);
304329
x0[0] = 0x01;
305330
cleanPoly(x1);
331+
unsigned char restmp[SIZE];
332+
unsigned char tmp[SIZE];
306333

307-
if (isOne(b)) return;
308-
while (isBiggerThanOne(a)) {
309-
unsigned char tmp[SIZE];
310-
cleanPoly(tmp);
311-
cleanPoly(q);
312-
divMod(a, b, tmp, q);// q = a / b;
313-
copyPoly(t, b);// t = b;
314-
copyPoly(b, tmp);// b = tmp;
315-
copyPoly(a, t); // a = t;
316-
copyPoly(t, x0); //t = x0;
317-
unsigned char restmp[SIZE];
318-
cleanPoly(restmp);
319-
copyPoly(x0, add(x1, mul(q, x0, restmp))); // x0 = x1 + q * x0;
320-
copyPoly(x1, t); //x1 = t;
321-
}
322-
copyPoly(res, x1);
323-
copyPoly(a,tmp_a);
324-
copyPoly(b,tmp_b);
334+
if (isOne(tmp_b)) return;
335+
doperm(tmp_a, tmp_b, tmp, q, t, x0, x1, restmp, res);
336+
//copyPoly(a,tmp_a);
337+
//copyPoly(b,tmp_b);
325338
}
326339

327340

328-
329341
unsigned char * mulRed(unsigned char * a, unsigned char * b, unsigned char * result){
330342
mul(a, b, result);
331343
reduce(result);

Arduino_ECCDH/ECDH.h

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ unsigned char * getPoly(unsigned int a, unsigned char * poly);
3434

3535
void divMod(unsigned char * a, unsigned char * b, unsigned char * m, unsigned char * d);
3636

37+
void doperm( unsigned char *tmp_a, unsigned char * tmp_b, unsigned char * tmp, unsigned char * q, unsigned char * t, unsigned char * x0, unsigned char * x1, unsigned char * restmp, unsigned char * res);
38+
3739
unsigned char isOne(unsigned char * b);
3840

3941
unsigned char * reduce(unsigned char * c);

PC_ECC/main.cpp

+15-11
Original file line numberDiff line numberDiff line change
@@ -547,9 +547,10 @@ inline void addfromto(unsigned char * a, unsigned char * b, unsigned char from,
547547

548548
inline unsigned char * mul(unsigned char * a, unsigned char * b, unsigned char * res){ // changed
549549
//unsigned char res[SIZE];
550-
cleanPoly(res);
550+
551551
unsigned char tmpa[SIZE];
552552
copyPoly(tmpa, a);
553+
cleanPoly(res);
553554
unsigned char j = 0x01;
554555
for(unsigned char k = 0; k < 8; k++){
555556
for(unsigned char i = 0; i < SIZE; i++){
@@ -564,6 +565,7 @@ inline unsigned char * mul(unsigned char * a, unsigned char * b, unsigned char *
564565
}
565566

566567

568+
567569
inline unsigned char * getPoly(unsigned int a, unsigned char * poly){ // changed
568570
unsigned int where = a / 8;
569571
unsigned int which = a % 8;
@@ -692,24 +694,26 @@ inline unsigned char isEqualPoly(unsigned char * a, unsigned char * b){
692694
}
693695

694696
void doperm( unsigned char *tmp_a, unsigned char * tmp_b, unsigned char * tmp, unsigned char * q, unsigned char * t, unsigned char * x0, unsigned char * x1, unsigned char * restmp, unsigned char * res){
695-
while (isBiggerThanOne(tmp_a)) {
697+
while (isBiggerThanOne(tmp_a)) {
696698
//cleanPoly(tmp);
697699
cleanPoly(q);
698700
divMod(tmp_a, tmp_b, tmp, q);// q = a / b;
699-
copyPoly(t, tmp_b);// t = b;
701+
702+
copyPoly(tmp_a, tmp_b); // a = t;
700703
copyPoly(tmp_b, tmp);// b = tmp;
701-
copyPoly(tmp_a, t); // a = t;
702704
copyPoly(t, x0); //t = x0;
703705
//cleanPoly(restmp);
704-
mul(q, x0, restmp);
705-
add(x1, restmp);
706-
copyPoly(x0, x1); // x0 = x1 + q * x0;
706+
//cleanPoly(restmp);
707+
mul(x0, q, x0);
708+
//x0 = restmp;
709+
add(x0, x1);
710+
//copyPoly(x0, restmp); // x0 = x1 + q * x0;
707711
//x0 = x1;
708712
//(unsigned char*)x0 = (unsigned char*)add(x1, mul(q, x0, restmp));
709-
copyPoly(x1, t); //x1 = t;
710-
//x1 = p;
713+
copyPoly(x1, t); //x1 = t;
714+
//x1 = p;
711715
}
712-
copyPoly(res, x1);
716+
copyPoly(res, x1);
713717
}
714718

715719
inline void inverse(unsigned char * a, unsigned char * b, unsigned char * res){
@@ -1034,7 +1038,7 @@ int main(int argc, char *argv[])
10341038
*/
10351039

10361040

1037-
if(argc < 2){
1041+
if(argc < 2){
10381042
cout << "None port given" << endl;
10391043
return 1;
10401044
}

PC_ECC/main.o

-96 Bytes
Binary file not shown.

PC_ECC/try

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)