17dd7cddfSDavid du Colombier #include "os.h" 27dd7cddfSDavid du Colombier #include <mp.h> 37dd7cddfSDavid du Colombier #include "dat.h" 47dd7cddfSDavid du Colombier 57dd7cddfSDavid du Colombier // convert a big-endian byte array (most significant byte first) to an mpint 67dd7cddfSDavid du Colombier mpint* betomp(uchar * p,uint n,mpint * b)77dd7cddfSDavid du Colombierbetomp(uchar *p, uint n, mpint *b) 87dd7cddfSDavid du Colombier { 97dd7cddfSDavid du Colombier int m, s; 107dd7cddfSDavid du Colombier mpdigit x; 117dd7cddfSDavid du Colombier 12*9027b8f7SDavid du Colombier if(b == nil){ 137dd7cddfSDavid du Colombier b = mpnew(0); 14*9027b8f7SDavid du Colombier setmalloctag(b, getcallerpc(&p)); 15*9027b8f7SDavid du Colombier } 167dd7cddfSDavid du Colombier 177dd7cddfSDavid du Colombier // dump leading zeros 187dd7cddfSDavid du Colombier while(*p == 0 && n > 1){ 197dd7cddfSDavid du Colombier p++; 207dd7cddfSDavid du Colombier n--; 217dd7cddfSDavid du Colombier } 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier // get the space 247dd7cddfSDavid du Colombier mpbits(b, n*8); 2559cc4ca5SDavid du Colombier b->top = DIGITS(n*8); 267dd7cddfSDavid du Colombier m = b->top-1; 277dd7cddfSDavid du Colombier 287dd7cddfSDavid du Colombier // first digit might not be Dbytes long 297dd7cddfSDavid du Colombier s = ((n-1)*8)%Dbits; 307dd7cddfSDavid du Colombier x = 0; 317dd7cddfSDavid du Colombier for(; n > 0; n--){ 327dd7cddfSDavid du Colombier x |= ((mpdigit)(*p++)) << s; 337dd7cddfSDavid du Colombier s -= 8; 347dd7cddfSDavid du Colombier if(s < 0){ 357dd7cddfSDavid du Colombier b->p[m--] = x; 367dd7cddfSDavid du Colombier s = Dbits-8; 377dd7cddfSDavid du Colombier x = 0; 387dd7cddfSDavid du Colombier } 397dd7cddfSDavid du Colombier } 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier return b; 427dd7cddfSDavid du Colombier } 43