annotate bignum.h @ 174:a32c592fab07 draft

Fix CRLF
author Gavin Andresen <gavinandresen@gmail.com>
date Wed, 14 Jul 2010 15:54:31 +0000
parents 52226e2e4fc3
children 5ed273f2e723
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
174
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
2 // Distributed under the MIT/X11 software license, see the accompanying
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
3 // file license.txt or http://www.opensource.org/licenses/mit-license.php.
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
4
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
5 #include <stdexcept>
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
6 #include <vector>
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
7 #include <openssl/bn.h>
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
8
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
9
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
10
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
11
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
12
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
13 class bignum_error : public std::runtime_error
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
14 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
15 public:
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
16 explicit bignum_error(const std::string& str) : std::runtime_error(str) {}
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
17 };
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
18
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
19
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
20
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
21 class CAutoBN_CTX
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
22 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
23 protected:
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
24 BN_CTX* pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
25 BN_CTX* operator=(BN_CTX* pnew) { return pctx = pnew; }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
26
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
27 public:
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
28 CAutoBN_CTX()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
29 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
30 pctx = BN_CTX_new();
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
31 if (pctx == NULL)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
32 throw bignum_error("CAutoBN_CTX : BN_CTX_new() returned NULL");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
33 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
34
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
35 ~CAutoBN_CTX()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
36 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
37 if (pctx != NULL)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
38 BN_CTX_free(pctx);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
39 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
40
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
41 operator BN_CTX*() { return pctx; }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
42 BN_CTX& operator*() { return *pctx; }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
43 BN_CTX** operator&() { return &pctx; }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
44 bool operator!() { return (pctx == NULL); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
45 };
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
46
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
47
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
48
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
49 class CBigNum : public BIGNUM
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
50 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
51 public:
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
52 CBigNum()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
53 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
54 BN_init(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
55 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
56
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
57 CBigNum(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
58 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
59 BN_init(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
60 if (!BN_copy(this, &b))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
61 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
62 BN_clear_free(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
63 throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_copy failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
64 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
65 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
66
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
67 CBigNum& operator=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
68 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
69 if (!BN_copy(this, &b))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
70 throw bignum_error("CBigNum::operator= : BN_copy failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
71 return (*this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
72 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
73
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
74 ~CBigNum()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
75 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
76 BN_clear_free(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
77 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
78
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
79 CBigNum(char n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
80 CBigNum(short n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
81 CBigNum(int n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
82 CBigNum(long n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
83 CBigNum(int64 n) { BN_init(this); setint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
84 CBigNum(unsigned char n) { BN_init(this); setulong(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
85 CBigNum(unsigned short n) { BN_init(this); setulong(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
86 CBigNum(unsigned int n) { BN_init(this); setulong(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
87 CBigNum(unsigned long n) { BN_init(this); setulong(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
88 CBigNum(uint64 n) { BN_init(this); setuint64(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
89 explicit CBigNum(uint256 n) { BN_init(this); setuint256(n); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
90
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
91 explicit CBigNum(const std::vector<unsigned char>& vch)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
92 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
93 BN_init(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
94 setvch(vch);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
95 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
96
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
97 void setulong(unsigned long n)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
98 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
99 if (!BN_set_word(this, n))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
100 throw bignum_error("CBigNum conversion from unsigned long : BN_set_word failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
101 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
102
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
103 unsigned long getulong() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
104 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
105 return BN_get_word(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
106 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
107
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
108 unsigned int getuint() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
109 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
110 return BN_get_word(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
111 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
112
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
113 int getint() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
114 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
115 unsigned long n = BN_get_word(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
116 if (!BN_is_negative(this))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
117 return (n > INT_MAX ? INT_MAX : n);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
118 else
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
119 return (n > INT_MAX ? INT_MIN : -(int)n);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
120 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
121
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
122 void setint64(int64 n)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
123 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
124 unsigned char pch[sizeof(n) + 6];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
125 unsigned char* p = pch + 4;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
126 bool fNegative = false;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
127 if (n < (int64)0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
128 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
129 n = -n;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
130 fNegative = true;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
131 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
132 bool fLeadingZeroes = true;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
133 for (int i = 0; i < 8; i++)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
134 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
135 unsigned char c = (n >> 56) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
136 n <<= 8;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
137 if (fLeadingZeroes)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
138 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
139 if (c == 0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
140 continue;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
141 if (c & 0x80)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
142 *p++ = (fNegative ? 0x80 : 0);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
143 else if (fNegative)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
144 c |= 0x80;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
145 fLeadingZeroes = false;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
146 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
147 *p++ = c;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
148 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
149 unsigned int nSize = p - (pch + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
150 pch[0] = (nSize >> 24) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
151 pch[1] = (nSize >> 16) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
152 pch[2] = (nSize >> 8) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
153 pch[3] = (nSize) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
154 BN_mpi2bn(pch, p - pch, this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
155 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
156
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
157 void setuint64(uint64 n)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
158 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
159 unsigned char pch[sizeof(n) + 6];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
160 unsigned char* p = pch + 4;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
161 bool fLeadingZeroes = true;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
162 for (int i = 0; i < 8; i++)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
163 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
164 unsigned char c = (n >> 56) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
165 n <<= 8;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
166 if (fLeadingZeroes)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
167 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
168 if (c == 0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
169 continue;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
170 if (c & 0x80)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
171 *p++ = 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
172 fLeadingZeroes = false;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
173 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
174 *p++ = c;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
175 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
176 unsigned int nSize = p - (pch + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
177 pch[0] = (nSize >> 24) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
178 pch[1] = (nSize >> 16) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
179 pch[2] = (nSize >> 8) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
180 pch[3] = (nSize) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
181 BN_mpi2bn(pch, p - pch, this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
182 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
183
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
184 void setuint256(uint256 n)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
185 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
186 unsigned char pch[sizeof(n) + 6];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
187 unsigned char* p = pch + 4;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
188 bool fLeadingZeroes = true;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
189 unsigned char* pbegin = (unsigned char*)&n;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
190 unsigned char* psrc = pbegin + sizeof(n);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
191 while (psrc != pbegin)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
192 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
193 unsigned char c = *(--psrc);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
194 if (fLeadingZeroes)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
195 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
196 if (c == 0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
197 continue;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
198 if (c & 0x80)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
199 *p++ = 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
200 fLeadingZeroes = false;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
201 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
202 *p++ = c;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
203 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
204 unsigned int nSize = p - (pch + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
205 pch[0] = (nSize >> 24) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
206 pch[1] = (nSize >> 16) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
207 pch[2] = (nSize >> 8) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
208 pch[3] = (nSize >> 0) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
209 BN_mpi2bn(pch, p - pch, this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
210 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
211
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
212 uint256 getuint256()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
213 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
214 unsigned int nSize = BN_bn2mpi(this, NULL);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
215 if (nSize < 4)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
216 return 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
217 std::vector<unsigned char> vch(nSize);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
218 BN_bn2mpi(this, &vch[0]);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
219 if (vch.size() > 4)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
220 vch[4] &= 0x7f;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
221 uint256 n = 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
222 for (int i = 0, j = vch.size()-1; i < sizeof(n) && j >= 4; i++, j--)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
223 ((unsigned char*)&n)[i] = vch[j];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
224 return n;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
225 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
226
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
227 void setvch(const std::vector<unsigned char>& vch)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
228 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
229 std::vector<unsigned char> vch2(vch.size() + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
230 unsigned int nSize = vch.size();
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
231 vch2[0] = (nSize >> 24) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
232 vch2[1] = (nSize >> 16) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
233 vch2[2] = (nSize >> 8) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
234 vch2[3] = (nSize >> 0) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
235 reverse_copy(vch.begin(), vch.end(), vch2.begin() + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
236 BN_mpi2bn(&vch2[0], vch2.size(), this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
237 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
238
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
239 std::vector<unsigned char> getvch() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
240 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
241 unsigned int nSize = BN_bn2mpi(this, NULL);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
242 if (nSize < 4)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
243 return std::vector<unsigned char>();
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
244 std::vector<unsigned char> vch(nSize);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
245 BN_bn2mpi(this, &vch[0]);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
246 vch.erase(vch.begin(), vch.begin() + 4);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
247 reverse(vch.begin(), vch.end());
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
248 return vch;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
249 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
250
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
251 CBigNum& SetCompact(unsigned int nCompact)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
252 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
253 unsigned int nSize = nCompact >> 24;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
254 std::vector<unsigned char> vch(4 + nSize);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
255 vch[3] = nSize;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
256 if (nSize >= 1) vch[4] = (nCompact >> 16) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
257 if (nSize >= 2) vch[5] = (nCompact >> 8) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
258 if (nSize >= 3) vch[6] = (nCompact >> 0) & 0xff;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
259 BN_mpi2bn(&vch[0], vch.size(), this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
260 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
261 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
262
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
263 unsigned int GetCompact() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
264 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
265 unsigned int nSize = BN_bn2mpi(this, NULL);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
266 std::vector<unsigned char> vch(nSize);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
267 nSize -= 4;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
268 BN_bn2mpi(this, &vch[0]);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
269 unsigned int nCompact = nSize << 24;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
270 if (nSize >= 1) nCompact |= (vch[4] << 16);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
271 if (nSize >= 2) nCompact |= (vch[5] << 8);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
272 if (nSize >= 3) nCompact |= (vch[6] << 0);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
273 return nCompact;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
274 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
275
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
276 void SetHex(const std::string& str)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
277 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
278 // skip 0x
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
279 const char* psz = str.c_str();
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
280 while (isspace(*psz))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
281 psz++;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
282 bool fNegative = false;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
283 if (*psz == '-')
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
284 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
285 fNegative = true;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
286 psz++;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
287 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
288 if (psz[0] == '0' && tolower(psz[1]) == 'x')
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
289 psz += 2;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
290 while (isspace(*psz))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
291 psz++;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
292
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
293 // hex string to bignum
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
294 static char phexdigit[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0xa,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0,0,0,0,0 };
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
295 *this = 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
296 while (isxdigit(*psz))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
297 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
298 *this <<= 4;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
299 int n = phexdigit[*psz++];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
300 *this += n;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
301 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
302 if (fNegative)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
303 *this = 0 - *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
304 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
305
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
306 std::string ToString(int nBase=10) const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
307 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
308 CAutoBN_CTX pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
309 CBigNum bnBase = nBase;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
310 CBigNum bn0 = 0;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
311 string str;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
312 CBigNum bn = *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
313 BN_set_negative(&bn, false);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
314 CBigNum dv;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
315 CBigNum rem;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
316 if (BN_cmp(&bn, &bn0) == 0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
317 return "0";
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
318 while (BN_cmp(&bn, &bn0) > 0)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
319 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
320 if (!BN_div(&dv, &rem, &bn, &bnBase, pctx))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
321 throw bignum_error("CBigNum::ToString() : BN_div failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
322 bn = dv;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
323 unsigned int c = rem.getulong();
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
324 str += "0123456789abcdef"[c];
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
325 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
326 if (BN_is_negative(this))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
327 str += "-";
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
328 reverse(str.begin(), str.end());
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
329 return str;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
330 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
331
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
332 std::string GetHex() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
333 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
334 return ToString(16);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
335 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
336
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
337 unsigned int GetSerializeSize(int nType=0, int nVersion=VERSION) const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
338 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
339 return ::GetSerializeSize(getvch(), nType, nVersion);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
340 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
341
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
342 template<typename Stream>
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
343 void Serialize(Stream& s, int nType=0, int nVersion=VERSION) const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
344 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
345 ::Serialize(s, getvch(), nType, nVersion);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
346 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
347
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
348 template<typename Stream>
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
349 void Unserialize(Stream& s, int nType=0, int nVersion=VERSION)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
350 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
351 vector<unsigned char> vch;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
352 ::Unserialize(s, vch, nType, nVersion);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
353 setvch(vch);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
354 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
355
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
356
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
357 bool operator!() const
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
358 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
359 return BN_is_zero(this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
360 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
361
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
362 CBigNum& operator+=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
363 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
364 if (!BN_add(this, this, &b))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
365 throw bignum_error("CBigNum::operator+= : BN_add failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
366 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
367 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
368
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
369 CBigNum& operator-=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
370 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
371 *this = *this - b;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
372 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
373 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
374
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
375 CBigNum& operator*=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
376 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
377 CAutoBN_CTX pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
378 if (!BN_mul(this, this, &b, pctx))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
379 throw bignum_error("CBigNum::operator*= : BN_mul failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
380 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
381 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
382
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
383 CBigNum& operator/=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
384 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
385 *this = *this / b;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
386 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
387 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
388
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
389 CBigNum& operator%=(const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
390 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
391 *this = *this % b;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
392 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
393 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
394
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
395 CBigNum& operator<<=(unsigned int shift)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
396 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
397 if (!BN_lshift(this, this, shift))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
398 throw bignum_error("CBigNum:operator<<= : BN_lshift failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
399 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
400 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
401
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
402 CBigNum& operator>>=(unsigned int shift)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
403 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
404 // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
405 if (!BN_rshift(this, this, shift))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
406 throw bignum_error("CBigNum:operator>>= : BN_rshift failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
407 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
408 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
409
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
410
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
411 CBigNum& operator++()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
412 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
413 // prefix operator
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
414 if (!BN_add(this, this, BN_value_one()))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
415 throw bignum_error("CBigNum::operator++ : BN_add failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
416 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
417 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
418
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
419 const CBigNum operator++(int)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
420 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
421 // postfix operator
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
422 const CBigNum ret = *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
423 ++(*this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
424 return ret;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
425 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
426
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
427 CBigNum& operator--()
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
428 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
429 // prefix operator
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
430 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
431 if (!BN_sub(&r, this, BN_value_one()))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
432 throw bignum_error("CBigNum::operator-- : BN_sub failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
433 *this = r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
434 return *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
435 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
436
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
437 const CBigNum operator--(int)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
438 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
439 // postfix operator
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
440 const CBigNum ret = *this;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
441 --(*this);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
442 return ret;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
443 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
444
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
445
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
446 friend inline const CBigNum operator-(const CBigNum& a, const CBigNum& b);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
447 friend inline const CBigNum operator/(const CBigNum& a, const CBigNum& b);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
448 friend inline const CBigNum operator%(const CBigNum& a, const CBigNum& b);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
449 };
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
450
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
451
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
452
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
453 inline const CBigNum operator+(const CBigNum& a, const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
454 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
455 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
456 if (!BN_add(&r, &a, &b))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
457 throw bignum_error("CBigNum::operator+ : BN_add failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
458 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
459 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
460
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
461 inline const CBigNum operator-(const CBigNum& a, const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
462 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
463 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
464 if (!BN_sub(&r, &a, &b))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
465 throw bignum_error("CBigNum::operator- : BN_sub failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
466 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
467 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
468
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
469 inline const CBigNum operator-(const CBigNum& a)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
470 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
471 CBigNum r(a);
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
472 BN_set_negative(&r, !BN_is_negative(&r));
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
473 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
474 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
475
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
476 inline const CBigNum operator*(const CBigNum& a, const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
477 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
478 CAutoBN_CTX pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
479 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
480 if (!BN_mul(&r, &a, &b, pctx))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
481 throw bignum_error("CBigNum::operator* : BN_mul failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
482 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
483 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
484
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
485 inline const CBigNum operator/(const CBigNum& a, const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
486 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
487 CAutoBN_CTX pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
488 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
489 if (!BN_div(&r, NULL, &a, &b, pctx))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
490 throw bignum_error("CBigNum::operator/ : BN_div failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
491 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
492 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
493
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
494 inline const CBigNum operator%(const CBigNum& a, const CBigNum& b)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
495 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
496 CAutoBN_CTX pctx;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
497 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
498 if (!BN_mod(&r, &a, &b, pctx))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
499 throw bignum_error("CBigNum::operator% : BN_div failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
500 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
501 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
502
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
503 inline const CBigNum operator<<(const CBigNum& a, unsigned int shift)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
504 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
505 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
506 if (!BN_lshift(&r, &a, shift))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
507 throw bignum_error("CBigNum:operator<< : BN_lshift failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
508 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
509 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
510
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
511 inline const CBigNum operator>>(const CBigNum& a, unsigned int shift)
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
512 {
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
513 CBigNum r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
514 // Note: BN_rshift segfaults on 64-bit ubuntu 9.10 if 2^shift is greater than the number
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
515 if (!BN_rshift(&r, &a, shift))
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
516 throw bignum_error("CBigNum:operator>> : BN_rshift failed");
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
517 return r;
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
518 }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
519
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
520 inline bool operator==(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) == 0); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
521 inline bool operator!=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) != 0); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
522 inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) <= 0); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
523 inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) >= 0); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
524 inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) < 0); }
a32c592fab07 Fix CRLF
Gavin Andresen <gavinandresen@gmail.com>
parents: 134
diff changeset
525 inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) > 0); }