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