1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
5 cbeb0b26 2006-04-01 devnull /* convert an mpint into a big endian byte array (most significant byte first) */
6 cbeb0b26 2006-04-01 devnull /* return number of bytes converted */
7 cbeb0b26 2006-04-01 devnull /* if p == nil, allocate and result array */
9 b3f61791 2004-03-21 devnull mptobe(mpint *b, uchar *p, uint n, uchar **pp)
11 b3f61791 2004-03-21 devnull int i, j, suppress;
12 b3f61791 2004-03-21 devnull mpdigit x;
13 b3f61791 2004-03-21 devnull uchar *e, *s, c;
15 b3f61791 2004-03-21 devnull if(p == nil){
16 b3f61791 2004-03-21 devnull n = (b->top+1)*Dbytes;
17 b3f61791 2004-03-21 devnull p = malloc(n);
19 b3f61791 2004-03-21 devnull if(p == nil)
20 b3f61791 2004-03-21 devnull return -1;
21 b3f61791 2004-03-21 devnull if(pp != nil)
23 b3f61791 2004-03-21 devnull memset(p, 0, n);
25 cbeb0b26 2006-04-01 devnull /* special case 0 */
26 b3f61791 2004-03-21 devnull if(b->top == 0){
27 b3f61791 2004-03-21 devnull if(n < 1)
28 b3f61791 2004-03-21 devnull return -1;
30 b3f61791 2004-03-21 devnull return 1;
35 b3f61791 2004-03-21 devnull suppress = 1;
36 b3f61791 2004-03-21 devnull for(i = b->top-1; i >= 0; i--){
37 b3f61791 2004-03-21 devnull x = b->p[i];
38 b3f61791 2004-03-21 devnull for(j = Dbits-8; j >= 0; j -= 8){
39 b3f61791 2004-03-21 devnull c = x>>j;
40 b3f61791 2004-03-21 devnull if(c == 0 && suppress)
41 b3f61791 2004-03-21 devnull continue;
42 b3f61791 2004-03-21 devnull if(p >= e)
43 b3f61791 2004-03-21 devnull return -1;
44 b3f61791 2004-03-21 devnull *p++ = c;
45 b3f61791 2004-03-21 devnull suppress = 0;
49 cbeb0b26 2006-04-01 devnull /* guarantee at least one byte */
50 b3f61791 2004-03-21 devnull if(s == p){
51 b3f61791 2004-03-21 devnull if(p >= e)
52 b3f61791 2004-03-21 devnull return -1;
53 b3f61791 2004-03-21 devnull *p++ = 0;
56 b3f61791 2004-03-21 devnull return p - s;