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