Blob


1 #include "os.h"
2 #include <mp.h>
3 #include "dat.h"
5 /* convert an mpint into a little endian byte array (least significant byte first) */
7 /* return number of bytes converted */
8 /* if p == nil, allocate and result array */
9 int
10 mptole(mpint *b, uchar *p, uint n, uchar **pp)
11 {
12 int i, j;
13 mpdigit x;
14 uchar *e, *s;
16 if(p == nil){
17 n = (b->top+1)*Dbytes;
18 p = malloc(n);
19 }
20 if(pp != nil)
21 *pp = p;
22 if(p == nil)
23 return -1;
24 memset(p, 0, n);
26 /* special case 0 */
27 if(b->top == 0){
28 if(n < 1)
29 return -1;
30 else
31 return 0;
32 }
34 s = p;
35 e = s+n;
36 for(i = 0; i < b->top-1; i++){
37 x = b->p[i];
38 for(j = 0; j < Dbytes; j++){
39 if(p >= e)
40 return -1;
41 *p++ = x;
42 x >>= 8;
43 }
44 }
45 x = b->p[i];
46 while(x > 0){
47 if(p >= e)
48 return -1;
49 *p++ = x;
50 x >>= 8;
51 }
53 return p - s;
54 }