1*37da2899SCharles.Forsyth #include "os.h" 2*37da2899SCharles.Forsyth #include <mp.h> 3*37da2899SCharles.Forsyth #include "dat.h" 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsyth // convert a big-endian byte array (most significant byte first) to an mpint 6*37da2899SCharles.Forsyth mpint* betomp(uchar * p,uint n,mpint * b)7*37da2899SCharles.Forsythbetomp(uchar *p, uint n, mpint *b) 8*37da2899SCharles.Forsyth { 9*37da2899SCharles.Forsyth int m, s; 10*37da2899SCharles.Forsyth mpdigit x; 11*37da2899SCharles.Forsyth 12*37da2899SCharles.Forsyth if(b == nil) 13*37da2899SCharles.Forsyth b = mpnew(0); 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsyth // dump leading zeros 16*37da2899SCharles.Forsyth while(*p == 0 && n > 1){ 17*37da2899SCharles.Forsyth p++; 18*37da2899SCharles.Forsyth n--; 19*37da2899SCharles.Forsyth } 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsyth // get the space 22*37da2899SCharles.Forsyth mpbits(b, n*8); 23*37da2899SCharles.Forsyth b->top = DIGITS(n*8); 24*37da2899SCharles.Forsyth m = b->top-1; 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth // first digit might not be Dbytes long 27*37da2899SCharles.Forsyth s = ((n-1)*8)%Dbits; 28*37da2899SCharles.Forsyth x = 0; 29*37da2899SCharles.Forsyth for(; n > 0; n--){ 30*37da2899SCharles.Forsyth x |= ((mpdigit)(*p++)) << s; 31*37da2899SCharles.Forsyth s -= 8; 32*37da2899SCharles.Forsyth if(s < 0){ 33*37da2899SCharles.Forsyth b->p[m--] = x; 34*37da2899SCharles.Forsyth s = Dbits-8; 35*37da2899SCharles.Forsyth x = 0; 36*37da2899SCharles.Forsyth } 37*37da2899SCharles.Forsyth } 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth return b; 40*37da2899SCharles.Forsyth } 41