Blame


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