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