#include "os.h" | |
#include <mp.h> | |
#include "dat.h" | |
/* convert a big-endian byte array (most significant byte first) to an mpint */ | |
mpint* | |
betomp(uchar *p, uint n, mpint *b) | |
{ | |
int m, s; | |
mpdigit x; | |
if(b == nil) | |
b = mpnew(0); | |
/* dump leading zeros */ | |
while(*p == 0 && n > 1){ | |
p++; | |
n--; | |
} | |
/* get the space */ | |
mpbits(b, n*8); | |
b->top = DIGITS(n*8); | |
m = b->top-1; | |
/* first digit might not be Dbytes long */ | |
s = ((n-1)*8)%Dbits; | |
x = 0; | |
for(; n > 0; n--){ | |
x |= ((mpdigit)(*p++)) << s; | |
s -= 8; | |
if(s < 0){ | |
b->p[m--] = x; | |
s = Dbits-8; | |
x = 0; | |
} | |
} | |
return b; | |
} |