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