| #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; |
| } |