| #include "os.h" |
| #include <mp.h> |
| #include "dat.h" |
| |
| /* convert an mpint into a little endian byte array (least significant byte first) */ |
| |
| /* return number of bytes converted */ |
| /* if p == nil, allocate and result array */ |
| int |
| mptole(mpint *b, uchar *p, uint n, uchar **pp) |
| { |
| int i, j; |
| mpdigit x; |
| uchar *e, *s; |
| |
| if(p == nil){ |
| n = (b->top+1)*Dbytes; |
| p = malloc(n); |
| } |
| if(pp != nil) |
| *pp = p; |
| if(p == nil) |
| return -1; |
| memset(p, 0, n); |
| |
| /* special case 0 */ |
| if(b->top == 0){ |
| if(n < 1) |
| return -1; |
| else |
| return 0; |
| } |
| |
| s = p; |
| e = s+n; |
| for(i = 0; i < b->top-1; i++){ |
| x = b->p[i]; |
| for(j = 0; j < Dbytes; j++){ |
| if(p >= e) |
| return -1; |
| *p++ = x; |
| x >>= 8; |
| } |
| } |
| x = b->p[i]; |
| while(x > 0){ |
| if(p >= e) |
| return -1; |
| *p++ = x; |
| x >>= 8; |
| } |
| |
| return p - s; |
| } |