X-Git-Url: https://git.cryptolib.org/?p=avr-crypto-lib.git;a=blobdiff_plain;f=bigint%2Fbigint-stub.c;h=a5dc765fd470f04f3da231162e8825b1443202ba;hp=64e8c9112a8779c284552f632109f55de60fdda3;hb=fdbda6486df88be6ac2ba948f21e84c396499535;hpb=cd6cc49401a7868a8ce64125e7246a29f2632952 diff --git a/bigint/bigint-stub.c b/bigint/bigint-stub.c index 64e8c91..a5dc765 100644 --- a/bigint/bigint-stub.c +++ b/bigint/bigint-stub.c @@ -59,8 +59,8 @@ /******************************************************************************/ /* void bigint_copy(bigint_t* dest, const bigint_t* src){ - memcpy(dest->wordv, src->wordv, src->length_B); - dest->length_B = src->length_B; + memcpy(dest->wordv, src->wordv, src->length_W); + dest->length_W = src->length_W; dest->info = src->info; } */ @@ -70,21 +70,21 @@ void bigint_copy(bigint_t* dest, const bigint_t* src){ /* 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); } */ @@ -95,26 +95,26 @@ void bigint_add_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ 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); } @@ -127,25 +127,25 @@ void bigint_sub_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ 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,7 +176,7 @@ 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); } } @@ -184,17 +184,17 @@ void bigint_sub_u(bigint_t* dest, const bigint_t* a, const bigint_t* b){ /******************************************************************************/ int8_t bigint_cmp_u(const bigint_t* a, const bigint_t* b){ - if(a->length_B > b->length_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]){ @@ -264,7 +264,7 @@ 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){ 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; @@ -297,11 +297,11 @@ void bigint_shiftleft(bigint_t* a, uint16_t shift){ 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,7 +318,7 @@ 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); } @@ -331,21 +331,21 @@ void bigint_shiftright(bigint_t* a, uint16_t shift){ 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,7 +353,7 @@ 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); } @@ -361,7 +361,7 @@ void bigint_shiftright(bigint_t* a, uint16_t shift){ 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); @@ -370,7 +370,7 @@ void bigint_xor(bigint_t* dest, const bigint_t* a){ /******************************************************************************/ void bigint_set_zero(bigint_t* a){ - a->length_B=0; + a->length_W=0; } /******************************************************************************/ @@ -378,76 +378,76 @@ void bigint_set_zero(bigint_t* a){ /* 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){ + 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 */ @@ -501,32 +501,32 @@ 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){ + 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); @@ -540,12 +540,12 @@ 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){ 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; } @@ -583,13 +583,13 @@ 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){ @@ -603,12 +603,12 @@ 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){ + 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){ @@ -650,29 +650,29 @@ void bigint_expmod_u(bigint_t* dest, const bigint_t* a, const bigint_t* exp, con 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<wordv; - q = p+a->length_B-1; + q = p+a->length_W-1; while(p