Blame


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"
4 b3f61791 2004-03-21 devnull
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 */
8 b3f61791 2004-03-21 devnull int
9 b3f61791 2004-03-21 devnull mptobe(mpint *b, uchar *p, uint n, uchar **pp)
10 b3f61791 2004-03-21 devnull {
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;
14 b3f61791 2004-03-21 devnull
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);
18 b3f61791 2004-03-21 devnull }
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)
22 b3f61791 2004-03-21 devnull *pp = p;
23 b3f61791 2004-03-21 devnull memset(p, 0, n);
24 b3f61791 2004-03-21 devnull
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;
29 b3f61791 2004-03-21 devnull else
30 b3f61791 2004-03-21 devnull return 1;
31 b3f61791 2004-03-21 devnull }
32 fa325e9b 2020-01-10 cross
33 b3f61791 2004-03-21 devnull s = p;
34 b3f61791 2004-03-21 devnull e = s+n;
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;
46 b3f61791 2004-03-21 devnull }
47 b3f61791 2004-03-21 devnull }
48 b3f61791 2004-03-21 devnull
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;
54 b3f61791 2004-03-21 devnull }
55 b3f61791 2004-03-21 devnull
56 b3f61791 2004-03-21 devnull return p - s;
57 b3f61791 2004-03-21 devnull }