X-Git-Url: https://git.cryptolib.org/avr-crypto-lib.git?a=blobdiff_plain;f=bigint%2Fbigint-stub.c;h=13c01f05ecfd2063e2dfee201baac02f8aad9d98;hb=3a9f9d918fb95474996af535c225a7e187d88372;hp=64e8c9112a8779c284552f632109f55de60fdda3;hpb=07fa28cf80d15cb88e128d49c65167d7c3c90b26;p=avr-crypto-lib.git diff --git a/bigint/bigint-stub.c b/bigint/bigint-stub.c index 64e8c91..13c01f0 100644 --- a/bigint/bigint-stub.c +++ b/bigint/bigint-stub.c @@ -58,9 +58,9 @@ /******************************************************************************/ /* -void bigint_copy(bigint_t* dest, const bigint_t* src){ - memcpy(dest->wordv, src->wordv, src->length_B); - dest->length_B = src->length_B; +void bigint_copy(bigint_t *dest, const bigint_t *src){ + memcpy(dest->wordv, src->wordv, src->length_W); + dest->length_W = src->length_W; dest->info = src->info; } */ @@ -68,23 +68,23 @@ void bigint_copy(bigint_t* dest, const bigint_t* src){ /* this should be implemented in assembly */ /* -void bigint_add_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ +void bigint_add_u(bigint_t *dest, const bigint_t *a, const bigint_t *b){ uint16_t t=0, i; - if(a->length_B < b->length_B){ + if(a->length_W < b->length_W){ XCHG_PTR(a,b); } - for(i=0; ilength_B; ++i){ + for(i=0; ilength_W; ++i){ t = a->wordv[i] + b->wordv[i] + t; dest->wordv[i] = (uint8_t)t; t>>=8; } - for(; ilength_B; ++i){ + for(; ilength_W; ++i){ t = a->wordv[i] + t; dest->wordv[i] = (uint8_t)t; t>>=8; } dest->wordv[i++] = t; - dest->length_B = i; + dest->length_W = i; bigint_adjust(dest); } */ @@ -92,29 +92,29 @@ void bigint_add_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /* this should be implemented in assembly */ /* -void bigint_add_scale_u(bigint_t* dest, const bigint_t* a, uint16_t scale){ +void bigint_add_scale_u(bigint_t *dest, const bigint_t *a, uint16_t scale){ uint16_t i,j=0; uint16_t t=0; - if(scale>dest->length_B) - memset(dest->wordv+dest->length_B, 0, scale-dest->length_B); - for(i=scale; ilength_B+scale; ++i,++j){ + if(scale>dest->length_W) + memset(dest->wordv+dest->length_W, 0, scale-dest->length_W); + for(i=scale; ilength_W+scale; ++i,++j){ t = a->wordv[j] + t; - if(dest->length_B>i){ + if(dest->length_W>i){ t += dest->wordv[i]; } dest->wordv[i] = (uint8_t)t; t>>=8; } while(t){ - if(dest->length_B>i){ + if(dest->length_W>i){ t = dest->wordv[i] + t; } dest->wordv[i] = (uint8_t)t; t>>=8; ++i; } - if(dest->length_B < i){ - dest->length_B = i; + if(dest->length_W < i){ + dest->length_W = i; } bigint_adjust(dest); } @@ -122,30 +122,30 @@ void bigint_add_scale_u(bigint_t* dest, const bigint_t* a, uint16_t scale){ /******************************************************************************/ /* this should be implemented in assembly */ -void bigint_sub_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ +void bigint_sub_u(bigint_t *dest, const bigint_t *a, const bigint_t *b){ int8_t borrow=0; int8_t r; int16_t t; uint16_t i, min, max; - min = MIN(a->length_B, b->length_B); - max = MAX(a->length_B, b->length_B); + min = MIN(a->length_W, b->length_W); + max = MAX(a->length_W, b->length_W); r = bigint_cmp_u(a,b); if(r==0){ - dest->length_B = 0; + dest->length_W = 0; dest->wordv[0] = 0; bigint_adjust(dest); return; } - if(b->length_B==0){ - dest->length_B = a->length_B; - memcpy(dest->wordv, a->wordv, a->length_B); + if(b->length_W==0){ + dest->length_W = a->length_W; + memcpy(dest->wordv, a->wordv, a->length_W); dest->info = a->info; SET_POS(dest); return; } - if(a->length_B==0){ - dest->length_B = b->length_B; - memcpy(dest->wordv, b->wordv, b->length_B); + if(a->length_W==0){ + dest->length_W = b->length_W; + memcpy(dest->wordv, b->wordv, b->length_W); dest->info = b->info; SET_NEG(dest); return; @@ -176,25 +176,25 @@ void bigint_sub_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ } SET_POS(dest); - dest->length_B = i; + dest->length_W = i; bigint_adjust(dest); } } /******************************************************************************/ -int8_t bigint_cmp_u(const bigint_t* a, const bigint_t* b){ - if(a->length_B > b->length_B){ +int8_t bigint_cmp_u(const bigint_t *a, const bigint_t *b){ + if(a->length_W > b->length_W){ return 1; } - if(a->length_B < b->length_B){ + if(a->length_W < b->length_W){ return -1; } - if(a->length_B==0){ + if(a->length_W==0){ return 0; } uint16_t i; - i = a->length_B-1; + i = a->length_W-1; do{ if(a->wordv[i]!=b->wordv[i]){ if(a->wordv[i]>b->wordv[i]){ @@ -209,7 +209,7 @@ int8_t bigint_cmp_u(const bigint_t* a, const bigint_t* b){ /******************************************************************************/ -void bigint_add_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ +void bigint_add_s(bigint_t *dest, const bigint_t *a, const bigint_t *b){ uint8_t s; s = GET_SIGN(a)?2:0; s |= GET_SIGN(b)?1:0; @@ -235,7 +235,7 @@ void bigint_add_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /******************************************************************************/ -void bigint_sub_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ +void bigint_sub_s(bigint_t *dest, const bigint_t *a, const bigint_t *b){ uint8_t s; s = GET_SIGN(a)?2:0; s |= GET_SIGN(b)?1:0; @@ -262,9 +262,9 @@ void bigint_sub_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /******************************************************************************/ -int8_t bigint_cmp_s(const bigint_t* a, const bigint_t* b){ +int8_t bigint_cmp_s(const bigint_t *a, const bigint_t *b){ uint8_t s; - if(a->length_B==0 && b->length_B==0){ + if(a->length_W==0 && b->length_W==0){ return 0; } s = GET_SIGN(a)?2:0; @@ -290,18 +290,18 @@ int8_t bigint_cmp_s(const bigint_t* a, const bigint_t* b){ /******************************************************************************/ -void bigint_shiftleft(bigint_t* a, uint16_t shift){ +void bigint_shiftleft(bigint_t *a, uint16_t shift){ uint16_t byteshift; uint16_t i; uint8_t bitshift; uint16_t t=0; byteshift = (shift+3)/8; bitshift = shift&7; - memmove(a->wordv+byteshift, a->wordv, a->length_B); + memmove(a->wordv+byteshift, a->wordv, a->length_W); memset(a->wordv, 0, byteshift); if(bitshift!=0){ if(bitshift<=4){ /* shift to the left */ - for(i=byteshift; ilength_B+byteshift; ++i){ + for(i=byteshift; ilength_W+byteshift; ++i){ t |= (a->wordv[i])<wordv[i] = (uint8_t)t; t >>= 8; @@ -309,7 +309,7 @@ void bigint_shiftleft(bigint_t* a, uint16_t shift){ a->wordv[i] = (uint8_t)t; byteshift++; }else{ /* shift to the right */ - for(i=a->length_B+byteshift-1; i>byteshift-1; --i){ + for(i=a->length_W+byteshift-1; i>byteshift-1; --i){ t |= (a->wordv[i])<<(bitshift); a->wordv[i] = (uint8_t)(t>>8); t <<= 8; @@ -318,34 +318,34 @@ void bigint_shiftleft(bigint_t* a, uint16_t shift){ a->wordv[i] = (uint8_t)(t>>8); } } - a->length_B += byteshift; + a->length_W += byteshift; bigint_adjust(a); } /******************************************************************************/ -void bigint_shiftright(bigint_t* a, uint16_t shift){ +void bigint_shiftright(bigint_t *a, uint16_t shift){ uint16_t byteshift; uint16_t i; uint8_t bitshift; uint16_t t=0; byteshift = shift/8; bitshift = shift&7; - if(byteshift >= a->length_B){ /* we would shift out more than we have */ + if(byteshift >= a->length_W){ /* we would shift out more than we have */ bigint_set_zero(a); return; } - if(byteshift == a->length_B-1 && bitshift>GET_FBS(a)){ + if(byteshift == a->length_W-1 && bitshift>GET_FBS(a)){ bigint_set_zero(a); return; } if(byteshift){ - memmove(a->wordv, a->wordv+byteshift, a->length_B-byteshift); - memset(a->wordv+a->length_B-byteshift, 0, byteshift); + memmove(a->wordv, a->wordv+byteshift, a->length_W-byteshift); + memset(a->wordv+a->length_W-byteshift, 0, byteshift); } if(bitshift!=0){ /* shift to the right */ - for(i=a->length_B-byteshift-1; i>0; --i){ + for(i=a->length_W-byteshift-1; i>0; --i){ t |= (a->wordv[i])<<(8-bitshift); a->wordv[i] = (uint8_t)(t>>8); t <<= 8; @@ -353,15 +353,15 @@ void bigint_shiftright(bigint_t* a, uint16_t shift){ t |= (a->wordv[0])<<(8-bitshift); a->wordv[0] = (uint8_t)(t>>8); } - a->length_B -= byteshift; + a->length_W -= byteshift; bigint_adjust(a); } /******************************************************************************/ -void bigint_xor(bigint_t* dest, const bigint_t* a){ +void bigint_xor(bigint_t *dest, const bigint_t *a){ uint16_t i; - for(i=0; ilength_B; ++i){ + for(i=0; ilength_W; ++i){ dest->wordv[i] ^= a->wordv[i]; } bigint_adjust(dest); @@ -369,85 +369,85 @@ void bigint_xor(bigint_t* dest, const bigint_t* a){ /******************************************************************************/ -void bigint_set_zero(bigint_t* a){ - a->length_B=0; +void bigint_set_zero(bigint_t *a){ + a->length_W=0; } /******************************************************************************/ /* using the Karatsuba-Algorithm */ /* x*y = (xh*yh)*b**2n + ((xh+xl)*(yh+yl) - xh*yh - xl*yl)*b**n + yh*yl */ -void bigint_mul_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ - if(a->length_B==0 || b->length_B==0){ +void bigint_mul_u(bigint_t *dest, const bigint_t *a, const bigint_t *b){ + if(a->length_W==0 || b->length_W==0){ bigint_set_zero(dest); return; } if(dest==a || dest==b){ bigint_t d; - uint8_t d_b[a->length_B+b->length_B]; + uint8_t d_b[a->length_W+b->length_W]; d.wordv = d_b; bigint_mul_u(&d, a, b); bigint_copy(dest, &d); return; } - if(a->length_B==1 || b->length_B==1){ - if(a->length_B!=1){ + if(a->length_W==1 || b->length_W==1){ + if(a->length_W!=1){ XCHG_PTR(a,b); } uint16_t i, t=0; uint8_t x = a->wordv[0]; - for(i=0; ilength_B; ++i){ + for(i=0; ilength_W; ++i){ t += b->wordv[i]*x; dest->wordv[i] = (uint8_t)t; t>>=8; } dest->wordv[i] = (uint8_t)t; - dest->length_B=i+1; + dest->length_W=i+1; bigint_adjust(dest); return; } - if(a->length_B<=4 && b->length_B<=4){ + if(a->length_W<=4 && b->length_W<=4){ uint32_t p=0, q=0; uint64_t r; - memcpy(&p, a->wordv, a->length_B); - memcpy(&q, b->wordv, b->length_B); + memcpy(&p, a->wordv, a->length_W); + memcpy(&q, b->wordv, b->length_W); r = (uint64_t)p*(uint64_t)q; - memcpy(dest->wordv, &r, a->length_B+b->length_B); - dest->length_B = a->length_B+b->length_B; + memcpy(dest->wordv, &r, a->length_W+b->length_W); + dest->length_W = a->length_W+b->length_W; bigint_adjust(dest); return; } bigint_set_zero(dest); /* split a in xh & xl; split b in yh & yl */ uint16_t n; - n=(MAX(a->length_B, b->length_B)+1)/2; + n=(MAX(a->length_W, b->length_W)+1)/2; bigint_t xl, xh, yl, yh; xl.wordv = a->wordv; yl.wordv = b->wordv; - if(a->length_B<=n){ + if(a->length_W<=n){ xh.info=0; - xh.length_B = 0; - xl.length_B = a->length_B; + xh.length_W = 0; + xl.length_W = a->length_W; xl.info = 0; }else{ - xl.length_B=n; + xl.length_W=n; xl.info = 0; bigint_adjust(&xl); xh.wordv = a->wordv+n; - xh.length_B = a->length_B-n; + xh.length_W = a->length_W-n; xh.info = 0; } - if(b->length_B<=n){ + if(b->length_W<=n){ yh.info=0; - yh.length_B = 0; - yl.length_B = b->length_B; + yh.length_W = 0; + yl.length_W = b->length_W; yl.info = b->info; }else{ - yl.length_B=n; + yl.length_W=n; yl.info = 0; bigint_adjust(&yl); yh.wordv = b->wordv+n; - yh.length_B = b->length_B-n; + yh.length_W = b->length_W-n; yh.info = 0; } /* now we have split up a and b */ @@ -470,7 +470,7 @@ void bigint_mul_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /******************************************************************************/ -void bigint_mul_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ +void bigint_mul_s(bigint_t *dest, const bigint_t *a, const bigint_t *b){ uint8_t s; s = GET_SIGN(a)?2:0; s |= GET_SIGN(b)?1:0; @@ -500,33 +500,33 @@ void bigint_mul_s(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /* square */ /* (xh*b^n+xl)^2 = xh^2*b^2n + 2*xh*xl*b^n + xl^2 */ -void bigint_square(bigint_t* dest, const bigint_t* a){ - if(a->length_B<=4){ +void bigint_square(bigint_t *dest, const bigint_t *a){ + if(a->length_W<=4){ uint64_t r=0; - memcpy(&r, a->wordv, a->length_B); + memcpy(&r, a->wordv, a->length_W); r = r*r; - memcpy(dest->wordv, &r, 2*a->length_B); + memcpy(dest->wordv, &r, 2*a->length_W); SET_POS(dest); - dest->length_B=2*a->length_B; + dest->length_W=2*a->length_W; bigint_adjust(dest); return; } if(dest==a){ bigint_t d; - uint8_t d_b[a->length_B*2]; + uint8_t d_b[a->length_W*2]; d.wordv = d_b; bigint_square(&d, a); bigint_copy(dest, &d); return; } uint16_t n; - n=(a->length_B+1)/2; + n=(a->length_W+1)/2; bigint_t xh, xl, tmp; /* x-high, x-low, temp */ uint8_t buffer[2*n+1]; xl.wordv = a->wordv; - xl.length_B = n; + xl.length_W = n; xh.wordv = a->wordv+n; - xh.length_B = a->length_B-n; + xh.length_W = a->length_W-n; tmp.wordv = buffer; bigint_square(dest, &xl); bigint_square(&tmp, &xh); @@ -538,14 +538,14 @@ void bigint_square(bigint_t* dest, const bigint_t* a){ /******************************************************************************/ -void bigint_sub_u_bitscale(bigint_t* a, const bigint_t* b, uint16_t bitscale){ +void bigint_sub_u_bitscale(bigint_t *a, const bigint_t *b, uint16_t bitscale){ bigint_t tmp; - uint8_t tmp_b[b->length_B+1]; + uint8_t tmp_b[b->length_W+1]; uint16_t i,j,byteshift=bitscale/8; uint8_t borrow=0; int16_t t; - if(a->length_B < b->length_B+byteshift){ + if(a->length_W < b->length_W+byteshift){ bigint_set_zero(a); return; } @@ -554,7 +554,7 @@ void bigint_sub_u_bitscale(bigint_t* a, const bigint_t* b, uint16_t bitscale){ bigint_copy(&tmp, b); bigint_shiftleft(&tmp, bitscale&7); - for(j=0,i=byteshift; iwordv[i] - tmp.wordv[j] - borrow; a->wordv[i] = (uint8_t)t; if(t<0){ @@ -564,7 +564,7 @@ void bigint_sub_u_bitscale(bigint_t* a, const bigint_t* b, uint16_t bitscale){ } } while(borrow){ - if(i+1 > a->length_B){ + if(i+1 > a->length_W){ bigint_set_zero(a); return; } @@ -579,17 +579,17 @@ void bigint_sub_u_bitscale(bigint_t* a, const bigint_t* b, uint16_t bitscale){ /******************************************************************************/ -void bigint_reduce(bigint_t* a, const bigint_t* r){ +void bigint_reduce(bigint_t *a, const bigint_t *r){ // bigint_adjust(r); uint8_t rfbs = GET_FBS(r); - if(r->length_B==0 || a->length_B==0){ + if(r->length_W==0 || a->length_W==0){ return; } - while(a->length_B > r->length_B){ - bigint_sub_u_bitscale(a, r, (a->length_B-r->length_B)*8+GET_FBS(a)-rfbs-1); + while(a->length_W > r->length_W){ + bigint_sub_u_bitscale(a, r, (a->length_W-r->length_W)*8+GET_FBS(a)-rfbs-1); } - while((GET_FBS(a) > rfbs+1) && (a->length_B == r->length_B)){ + while((GET_FBS(a) > rfbs+1) && (a->length_W == r->length_W)){ bigint_sub_u_bitscale(a, r, GET_FBS(a)-rfbs-1); } while(bigint_cmp_u(a,r)>=0){ @@ -602,13 +602,13 @@ void bigint_reduce(bigint_t* a, const bigint_t* r){ /* calculate dest = a**exp % r */ /* using square&multiply */ -void bigint_expmod_u(bigint_t* dest, const bigint_t* a, const bigint_t* exp, const bigint_t* r){ - if(a->length_B==0 || r->length_B==0){ +void bigint_expmod_u(bigint_t *dest, const bigint_t *a, const bigint_t *exp, const bigint_t *r){ + if(a->length_W==0 || r->length_W==0){ return; } bigint_t res, base; - uint8_t base_b[MAX(a->length_B,r->length_B*2)], res_b[r->length_B*2]; + uint8_t base_b[MAX(a->length_W,r->length_W*2)], res_b[r->length_W*2]; uint16_t i; uint8_t j, t; res.wordv = res_b; @@ -616,10 +616,10 @@ void bigint_expmod_u(bigint_t* dest, const bigint_t* a, const bigint_t* exp, con bigint_copy(&base, a); bigint_reduce(&base, r); res.wordv[0]=1; - res.length_B=1; + res.length_W=1; res.info = 0; bigint_adjust(&res); - for(i=0; i+1length_B; ++i){ + for(i=0; i+1length_W; ++i){ t=exp->wordv[i]; for(j=0; j<8; ++j){ if(t&1){ @@ -647,32 +647,32 @@ void bigint_expmod_u(bigint_t* dest, const bigint_t* a, const bigint_t* exp, con /******************************************************************************/ /* gcd <-- gcd(x,y) a*x+b*y=gcd */ -void bigint_gcdext(bigint_t* gcd, bigint_t* a, bigint_t* b, const bigint_t* x, const bigint_t* y){ +void bigint_gcdext(bigint_t *gcd, bigint_t *a, bigint_t *b, const bigint_t *x, const bigint_t *y){ bigint_t g, x_, y_, u, v, a_, b_, c_, d_; volatile uint16_t i=0; - if(x->length_B==0 || y->length_B==0){ + if(x->length_W==0 || y->length_W==0){ return; } while(x->wordv[i]==0 && y->wordv[i]==0){ ++i; } - uint8_t g_b[i+2], x_b[x->length_B-i], y_b[y->length_B-i]; - uint8_t u_b[x->length_B-i], v_b[y->length_B-i]; - uint8_t a_b[y->length_B+2], c_b[y->length_B+2]; - uint8_t b_b[x->length_B+2], d_b[x->length_B+2]; + uint8_t g_b[i+2], x_b[x->length_W-i], y_b[y->length_W-i]; + uint8_t u_b[x->length_W-i], v_b[y->length_W-i]; + uint8_t a_b[y->length_W+2], c_b[y->length_W+2]; + uint8_t b_b[x->length_W+2], d_b[x->length_W+2]; g.wordv = g_b; x_.wordv = x_b; y_.wordv = y_b; memset(g_b, 0, i); g_b[i]=1; - g.length_B = i+1; + g.length_W = i+1; g.info=0; x_.info = y_.info = 0; - x_.length_B = x->length_B-i; - y_.length_B = y->length_B-i; - memcpy(x_.wordv, x->wordv+i, x_.length_B); - memcpy(y_.wordv, y->wordv+i, y_.length_B); + x_.length_W = x->length_W-i; + y_.length_W = y->length_W-i; + memcpy(x_.wordv, x->wordv+i, x_.length_W); + memcpy(y_.wordv, y->wordv+i, y_.length_W); for(i=0; (x_.wordv[0]&(1<info&BIGINT_NEG_MASK){ bigint_add_s(dest, dest, m); @@ -753,10 +753,10 @@ void bigint_inverse(bigint_t* dest, const bigint_t* a, const bigint_t* m){ /******************************************************************************/ -void bigint_changeendianess(bigint_t* a){ +void bigint_changeendianess(bigint_t *a){ uint8_t t, *p, *q; p = a->wordv; - q = p+a->length_B-1; + q = p+a->length_W-1; while(p