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