Black Pharao Release Fix 5 - OpenSSL 3.x and modern Boost compatibility
Port codebase to build with OpenSSL 3.x and Boost 1.90+: - Rewrite bignum.h to use BIGNUM* pointer instead of inheriting from opaque BIGNUM - Fix ECDSA_SIG, EVP_CIPHER_CTX, HMAC_CTX opaque type access across key.cpp, crypter.cpp, smessage.cpp - Modernize Boost.Asio API (io_context, resolver, executor) in trianglesrpc.cpp - Remove embedded Tor v2 client (incompatible with OpenSSL 3.x), keep Tor v3 SOCKS5 approach - Update header logo to Cryptographic Triangles branding (300x63) - Replace Bittrex exchange link with Pinball (313.cash) across all locales - Fix MSYS2/MinGW64 build: linker flags, Boost library names, miniupnpc static linking Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+2
-2
@@ -48,7 +48,7 @@ inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char
|
||||
CBigNum rem;
|
||||
while (bn > bn0)
|
||||
{
|
||||
if (!BN_div(&dv, &rem, &bn, &bn58, pctx))
|
||||
if (!BN_div(dv.get(), rem.get(), bn.get(), bn58.get(), pctx))
|
||||
throw bignum_error("EncodeBase58 : BN_div failed");
|
||||
bn = dv;
|
||||
unsigned int c = rem.getulong();
|
||||
@@ -95,7 +95,7 @@ inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet)
|
||||
break;
|
||||
}
|
||||
bnChar.setulong(p1 - pszBase58);
|
||||
if (!BN_mul(&bn, &bn, &bn58, pctx))
|
||||
if (!BN_mul(bn.get(), bn.get(), bn58.get(), pctx))
|
||||
throw bignum_error("DecodeBase58 : BN_mul failed");
|
||||
bn += bnChar;
|
||||
}
|
||||
|
||||
+99
-78
@@ -54,52 +54,64 @@ public:
|
||||
|
||||
|
||||
/** C++ wrapper for BIGNUM (OpenSSL bignum) */
|
||||
class CBigNum : public BIGNUM
|
||||
class CBigNum
|
||||
{
|
||||
private:
|
||||
BIGNUM* pbn;
|
||||
|
||||
public:
|
||||
CBigNum()
|
||||
{
|
||||
BN_init(this);
|
||||
pbn = BN_new();
|
||||
if (pbn == NULL)
|
||||
throw bignum_error("CBigNum::CBigNum() : BN_new() returned NULL");
|
||||
}
|
||||
|
||||
CBigNum(const CBigNum& b)
|
||||
{
|
||||
BN_init(this);
|
||||
if (!BN_copy(this, &b))
|
||||
pbn = BN_new();
|
||||
if (pbn == NULL)
|
||||
throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_new() returned NULL");
|
||||
if (!BN_copy(pbn, b.pbn))
|
||||
{
|
||||
BN_clear_free(this);
|
||||
BN_clear_free(pbn);
|
||||
throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_copy failed");
|
||||
}
|
||||
}
|
||||
|
||||
CBigNum& operator=(const CBigNum& b)
|
||||
{
|
||||
if (!BN_copy(this, &b))
|
||||
if (!BN_copy(pbn, b.pbn))
|
||||
throw bignum_error("CBigNum::operator= : BN_copy failed");
|
||||
return (*this);
|
||||
}
|
||||
|
||||
~CBigNum()
|
||||
{
|
||||
BN_clear_free(this);
|
||||
if (pbn != NULL)
|
||||
BN_clear_free(pbn);
|
||||
}
|
||||
|
||||
// Access to the underlying BIGNUM pointer
|
||||
BIGNUM* get() { return pbn; }
|
||||
const BIGNUM* get() const { return pbn; }
|
||||
|
||||
//CBigNum(char n) is not portable. Use 'signed char' or 'unsigned char'.
|
||||
CBigNum(signed char n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(short n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(int n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(long n) { BN_init(this); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(long long n) { BN_init(this); setint64(n); }
|
||||
CBigNum(unsigned char n) { BN_init(this); setulong(n); }
|
||||
CBigNum(unsigned short n) { BN_init(this); setulong(n); }
|
||||
CBigNum(unsigned int n) { BN_init(this); setulong(n); }
|
||||
CBigNum(unsigned long n) { BN_init(this); setulong(n); }
|
||||
CBigNum(unsigned long long n) { BN_init(this); setuint64(n); }
|
||||
explicit CBigNum(uint256 n) { BN_init(this); setuint256(n); }
|
||||
CBigNum(signed char n) { pbn = BN_new(); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(short n) { pbn = BN_new(); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(int n) { pbn = BN_new(); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(long n) { pbn = BN_new(); if (n >= 0) setulong(n); else setint64(n); }
|
||||
CBigNum(long long n) { pbn = BN_new(); setint64(n); }
|
||||
CBigNum(unsigned char n) { pbn = BN_new(); setulong(n); }
|
||||
CBigNum(unsigned short n) { pbn = BN_new(); setulong(n); }
|
||||
CBigNum(unsigned int n) { pbn = BN_new(); setulong(n); }
|
||||
CBigNum(unsigned long n) { pbn = BN_new(); setulong(n); }
|
||||
CBigNum(unsigned long long n) { pbn = BN_new(); setuint64(n); }
|
||||
explicit CBigNum(uint256 n) { pbn = BN_new(); setuint256(n); }
|
||||
|
||||
explicit CBigNum(const std::vector<unsigned char>& vch)
|
||||
{
|
||||
BN_init(this);
|
||||
pbn = BN_new();
|
||||
setvch(vch);
|
||||
}
|
||||
|
||||
@@ -110,7 +122,7 @@ public:
|
||||
*/
|
||||
static CBigNum randBignum(const CBigNum& range) {
|
||||
CBigNum ret;
|
||||
if(!BN_rand_range(&ret, &range)){
|
||||
if(!BN_rand_range(ret.pbn, range.pbn)){
|
||||
throw bignum_error("CBigNum:rand element : BN_rand_range failed");
|
||||
}
|
||||
return ret;
|
||||
@@ -122,7 +134,7 @@ public:
|
||||
*/
|
||||
static CBigNum RandKBitBigum(const uint32_t k){
|
||||
CBigNum ret;
|
||||
if(!BN_rand(&ret, k, -1, 0)){
|
||||
if(!BN_rand(ret.pbn, k, -1, 0)){
|
||||
throw bignum_error("CBigNum:rand element : BN_rand failed");
|
||||
}
|
||||
return ret;
|
||||
@@ -133,30 +145,30 @@ public:
|
||||
* @return the size
|
||||
*/
|
||||
int bitSize() const{
|
||||
return BN_num_bits(this);
|
||||
return BN_num_bits(pbn);
|
||||
}
|
||||
|
||||
|
||||
void setulong(unsigned long n)
|
||||
{
|
||||
if (!BN_set_word(this, n))
|
||||
if (!BN_set_word(pbn, n))
|
||||
throw bignum_error("CBigNum conversion from unsigned long : BN_set_word failed");
|
||||
}
|
||||
|
||||
unsigned long getulong() const
|
||||
{
|
||||
return BN_get_word(this);
|
||||
return BN_get_word(pbn);
|
||||
}
|
||||
|
||||
unsigned int getuint() const
|
||||
{
|
||||
return BN_get_word(this);
|
||||
return BN_get_word(pbn);
|
||||
}
|
||||
|
||||
int getint() const
|
||||
{
|
||||
unsigned long n = BN_get_word(this);
|
||||
if (!BN_is_negative(this))
|
||||
unsigned long n = BN_get_word(pbn);
|
||||
if (!BN_is_negative(pbn))
|
||||
return (n > (unsigned long)std::numeric_limits<int>::max() ? std::numeric_limits<int>::max() : n);
|
||||
else
|
||||
return (n > (unsigned long)std::numeric_limits<int>::max() ? std::numeric_limits<int>::min() : -(int)n);
|
||||
@@ -202,16 +214,16 @@ public:
|
||||
pch[1] = (nSize >> 16) & 0xff;
|
||||
pch[2] = (nSize >> 8) & 0xff;
|
||||
pch[3] = (nSize) & 0xff;
|
||||
BN_mpi2bn(pch, p - pch, this);
|
||||
BN_mpi2bn(pch, p - pch, pbn);
|
||||
}
|
||||
|
||||
uint64_t getuint64()
|
||||
{
|
||||
unsigned int nSize = BN_bn2mpi(this, NULL);
|
||||
unsigned int nSize = BN_bn2mpi(pbn, NULL);
|
||||
if (nSize < 4)
|
||||
return 0;
|
||||
std::vector<unsigned char> vch(nSize);
|
||||
BN_bn2mpi(this, &vch[0]);
|
||||
BN_bn2mpi(pbn, &vch[0]);
|
||||
if (vch.size() > 4)
|
||||
vch[4] &= 0x7f;
|
||||
uint64_t n = 0;
|
||||
@@ -244,7 +256,7 @@ public:
|
||||
pch[1] = (nSize >> 16) & 0xff;
|
||||
pch[2] = (nSize >> 8) & 0xff;
|
||||
pch[3] = (nSize) & 0xff;
|
||||
BN_mpi2bn(pch, p - pch, this);
|
||||
BN_mpi2bn(pch, p - pch, pbn);
|
||||
}
|
||||
|
||||
void setuint256(uint256 n)
|
||||
@@ -272,16 +284,16 @@ public:
|
||||
pch[1] = (nSize >> 16) & 0xff;
|
||||
pch[2] = (nSize >> 8) & 0xff;
|
||||
pch[3] = (nSize >> 0) & 0xff;
|
||||
BN_mpi2bn(pch, p - pch, this);
|
||||
BN_mpi2bn(pch, p - pch, pbn);
|
||||
}
|
||||
|
||||
uint256 getuint256() const
|
||||
{
|
||||
unsigned int nSize = BN_bn2mpi(this, NULL);
|
||||
unsigned int nSize = BN_bn2mpi(pbn, NULL);
|
||||
if (nSize < 4)
|
||||
return 0;
|
||||
std::vector<unsigned char> vch(nSize);
|
||||
BN_bn2mpi(this, &vch[0]);
|
||||
BN_bn2mpi(pbn, &vch[0]);
|
||||
if (vch.size() > 4)
|
||||
vch[4] &= 0x7f;
|
||||
uint256 n = 0;
|
||||
@@ -303,16 +315,16 @@ public:
|
||||
vch2[3] = (nSize >> 0) & 0xff;
|
||||
// swap data to big endian
|
||||
reverse_copy(vch.begin(), vch.end(), vch2.begin() + 4);
|
||||
BN_mpi2bn(&vch2[0], vch2.size(), this);
|
||||
BN_mpi2bn(&vch2[0], vch2.size(), pbn);
|
||||
}
|
||||
|
||||
std::vector<unsigned char> getvch() const
|
||||
{
|
||||
unsigned int nSize = BN_bn2mpi(this, NULL);
|
||||
unsigned int nSize = BN_bn2mpi(pbn, NULL);
|
||||
if (nSize <= 4)
|
||||
return std::vector<unsigned char>();
|
||||
std::vector<unsigned char> vch(nSize);
|
||||
BN_bn2mpi(this, &vch[0]);
|
||||
BN_bn2mpi(pbn, &vch[0]);
|
||||
vch.erase(vch.begin(), vch.begin() + 4);
|
||||
reverse(vch.begin(), vch.end());
|
||||
return vch;
|
||||
@@ -326,16 +338,16 @@ public:
|
||||
if (nSize >= 1) vch[4] = (nCompact >> 16) & 0xff;
|
||||
if (nSize >= 2) vch[5] = (nCompact >> 8) & 0xff;
|
||||
if (nSize >= 3) vch[6] = (nCompact >> 0) & 0xff;
|
||||
BN_mpi2bn(&vch[0], vch.size(), this);
|
||||
BN_mpi2bn(&vch[0], vch.size(), pbn);
|
||||
return *this;
|
||||
}
|
||||
|
||||
unsigned int GetCompact() const
|
||||
{
|
||||
unsigned int nSize = BN_bn2mpi(this, NULL);
|
||||
unsigned int nSize = BN_bn2mpi(pbn, NULL);
|
||||
std::vector<unsigned char> vch(nSize);
|
||||
nSize -= 4;
|
||||
BN_bn2mpi(this, &vch[0]);
|
||||
BN_bn2mpi(pbn, &vch[0]);
|
||||
unsigned int nCompact = nSize << 24;
|
||||
if (nSize >= 1) nCompact |= (vch[4] << 16);
|
||||
if (nSize >= 2) nCompact |= (vch[5] << 8);
|
||||
@@ -380,20 +392,20 @@ public:
|
||||
CBigNum bn0 = 0;
|
||||
std::string str;
|
||||
CBigNum bn = *this;
|
||||
BN_set_negative(&bn, false);
|
||||
BN_set_negative(bn.pbn, false);
|
||||
CBigNum dv;
|
||||
CBigNum rem;
|
||||
if (BN_cmp(&bn, &bn0) == 0)
|
||||
if (BN_cmp(bn.pbn, bn0.pbn) == 0)
|
||||
return "0";
|
||||
while (BN_cmp(&bn, &bn0) > 0)
|
||||
while (BN_cmp(bn.pbn, bn0.pbn) > 0)
|
||||
{
|
||||
if (!BN_div(&dv, &rem, &bn, &bnBase, pctx))
|
||||
if (!BN_div(dv.pbn, rem.pbn, bn.pbn, bnBase.pbn, pctx))
|
||||
throw bignum_error("CBigNum::ToString() : BN_div failed");
|
||||
bn = dv;
|
||||
unsigned int c = rem.getulong();
|
||||
str += "0123456789abcdef"[c];
|
||||
}
|
||||
if (BN_is_negative(this))
|
||||
if (BN_is_negative(pbn))
|
||||
str += "-";
|
||||
reverse(str.begin(), str.end());
|
||||
return str;
|
||||
@@ -440,7 +452,7 @@ public:
|
||||
CBigNum pow(const CBigNum& e) const {
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum ret;
|
||||
if (!BN_exp(&ret, this, &e, pctx))
|
||||
if (!BN_exp(ret.pbn, pbn, e.pbn, pctx))
|
||||
throw bignum_error("CBigNum::pow : BN_exp failed");
|
||||
return ret;
|
||||
}
|
||||
@@ -453,9 +465,9 @@ public:
|
||||
CBigNum mul_mod(const CBigNum& b, const CBigNum& m) const {
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum ret;
|
||||
if (!BN_mod_mul(&ret, this, &b, &m, pctx))
|
||||
if (!BN_mod_mul(ret.pbn, pbn, b.pbn, m.pbn, pctx))
|
||||
throw bignum_error("CBigNum::mul_mod : BN_mod_mul failed");
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -471,10 +483,10 @@ public:
|
||||
// g^-x = (g^-1)^x
|
||||
CBigNum inv = this->inverse(m);
|
||||
CBigNum posE = e * -1;
|
||||
if (!BN_mod_exp(&ret, &inv, &posE, &m, pctx))
|
||||
if (!BN_mod_exp(ret.pbn, inv.pbn, posE.pbn, m.pbn, pctx))
|
||||
throw bignum_error("CBigNum::pow_mod: BN_mod_exp failed on negative exponent");
|
||||
}else
|
||||
if (!BN_mod_exp(&ret, this, &e, &m, pctx))
|
||||
if (!BN_mod_exp(ret.pbn, pbn, e.pbn, m.pbn, pctx))
|
||||
throw bignum_error("CBigNum::pow_mod : BN_mod_exp failed");
|
||||
|
||||
return ret;
|
||||
@@ -489,7 +501,7 @@ public:
|
||||
CBigNum inverse(const CBigNum& m) const {
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum ret;
|
||||
if (!BN_mod_inverse(&ret, this, &m, pctx))
|
||||
if (!BN_mod_inverse(ret.pbn, pbn, m.pbn, pctx))
|
||||
throw bignum_error("CBigNum::inverse*= :BN_mod_inverse");
|
||||
return ret;
|
||||
}
|
||||
@@ -502,7 +514,7 @@ public:
|
||||
*/
|
||||
static CBigNum generatePrime(const unsigned int numBits, bool safe = false) {
|
||||
CBigNum ret;
|
||||
if(!BN_generate_prime_ex(&ret, numBits, (safe == true), NULL, NULL, NULL))
|
||||
if(!BN_generate_prime_ex(ret.pbn, numBits, (safe == true), NULL, NULL, NULL))
|
||||
throw bignum_error("CBigNum::generatePrime*= :BN_generate_prime_ex");
|
||||
return ret;
|
||||
}
|
||||
@@ -515,7 +527,7 @@ public:
|
||||
CBigNum gcd( const CBigNum& b) const{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum ret;
|
||||
if (!BN_gcd(&ret, this, &b, pctx))
|
||||
if (!BN_gcd(ret.pbn, pbn, b.pbn, pctx))
|
||||
throw bignum_error("CBigNum::gcd*= :BN_gcd");
|
||||
return ret;
|
||||
}
|
||||
@@ -528,26 +540,26 @@ public:
|
||||
*/
|
||||
bool isPrime(const int checks=BN_prime_checks) const {
|
||||
CAutoBN_CTX pctx;
|
||||
int ret = BN_is_prime(this, checks, NULL, pctx, NULL);
|
||||
int ret = BN_is_prime_ex(pbn, checks, pctx, NULL);
|
||||
if(ret < 0){
|
||||
throw bignum_error("CBigNum::isPrime :BN_is_prime");
|
||||
throw bignum_error("CBigNum::isPrime :BN_is_prime_ex");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool isOne() const {
|
||||
return BN_is_one(this);
|
||||
return BN_is_one(pbn);
|
||||
}
|
||||
|
||||
|
||||
bool operator!() const
|
||||
{
|
||||
return BN_is_zero(this);
|
||||
return BN_is_zero(pbn);
|
||||
}
|
||||
|
||||
CBigNum& operator+=(const CBigNum& b)
|
||||
{
|
||||
if (!BN_add(this, this, &b))
|
||||
if (!BN_add(pbn, pbn, b.pbn))
|
||||
throw bignum_error("CBigNum::operator+= : BN_add failed");
|
||||
return *this;
|
||||
}
|
||||
@@ -561,7 +573,7 @@ public:
|
||||
CBigNum& operator*=(const CBigNum& b)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
if (!BN_mul(this, this, &b, pctx))
|
||||
if (!BN_mul(pbn, pbn, b.pbn, pctx))
|
||||
throw bignum_error("CBigNum::operator*= : BN_mul failed");
|
||||
return *this;
|
||||
}
|
||||
@@ -580,7 +592,7 @@ public:
|
||||
|
||||
CBigNum& operator<<=(unsigned int shift)
|
||||
{
|
||||
if (!BN_lshift(this, this, shift))
|
||||
if (!BN_lshift(pbn, pbn, shift))
|
||||
throw bignum_error("CBigNum:operator<<= : BN_lshift failed");
|
||||
return *this;
|
||||
}
|
||||
@@ -591,13 +603,13 @@ public:
|
||||
// if built on ubuntu 9.04 or 9.10, probably depends on version of OpenSSL
|
||||
CBigNum a = 1;
|
||||
a <<= shift;
|
||||
if (BN_cmp(&a, this) > 0)
|
||||
if (BN_cmp(a.pbn, pbn) > 0)
|
||||
{
|
||||
*this = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
if (!BN_rshift(this, this, shift))
|
||||
if (!BN_rshift(pbn, pbn, shift))
|
||||
throw bignum_error("CBigNum:operator>>= : BN_rshift failed");
|
||||
return *this;
|
||||
}
|
||||
@@ -606,7 +618,7 @@ public:
|
||||
CBigNum& operator++()
|
||||
{
|
||||
// prefix operator
|
||||
if (!BN_add(this, this, BN_value_one()))
|
||||
if (!BN_add(pbn, pbn, BN_value_one()))
|
||||
throw bignum_error("CBigNum::operator++ : BN_add failed");
|
||||
return *this;
|
||||
}
|
||||
@@ -623,7 +635,7 @@ public:
|
||||
{
|
||||
// prefix operator
|
||||
CBigNum r;
|
||||
if (!BN_sub(&r, this, BN_value_one()))
|
||||
if (!BN_sub(r.pbn, pbn, BN_value_one()))
|
||||
throw bignum_error("CBigNum::operator-- : BN_sub failed");
|
||||
*this = r;
|
||||
return *this;
|
||||
@@ -642,7 +654,17 @@ public:
|
||||
friend inline const CBigNum operator/(const CBigNum& a, const CBigNum& b);
|
||||
friend inline const CBigNum operator%(const CBigNum& a, const CBigNum& b);
|
||||
friend inline const CBigNum operator*(const CBigNum& a, const CBigNum& b);
|
||||
friend inline const CBigNum operator+(const CBigNum& a, const CBigNum& b);
|
||||
friend inline const CBigNum operator-(const CBigNum& a);
|
||||
friend inline const CBigNum operator<<(const CBigNum& a, unsigned int shift);
|
||||
friend inline const CBigNum operator>>(const CBigNum& a, unsigned int shift);
|
||||
friend inline bool operator==(const CBigNum& a, const CBigNum& b);
|
||||
friend inline bool operator!=(const CBigNum& a, const CBigNum& b);
|
||||
friend inline bool operator<=(const CBigNum& a, const CBigNum& b);
|
||||
friend inline bool operator>=(const CBigNum& a, const CBigNum& b);
|
||||
friend inline bool operator<(const CBigNum& a, const CBigNum& b);
|
||||
friend inline bool operator>(const CBigNum& a, const CBigNum& b);
|
||||
friend inline std::ostream& operator<<(std::ostream &strm, const CBigNum &b);
|
||||
};
|
||||
|
||||
|
||||
@@ -650,7 +672,7 @@ public:
|
||||
inline const CBigNum operator+(const CBigNum& a, const CBigNum& b)
|
||||
{
|
||||
CBigNum r;
|
||||
if (!BN_add(&r, &a, &b))
|
||||
if (!BN_add(r.pbn, a.pbn, b.pbn))
|
||||
throw bignum_error("CBigNum::operator+ : BN_add failed");
|
||||
return r;
|
||||
}
|
||||
@@ -658,7 +680,7 @@ inline const CBigNum operator+(const CBigNum& a, const CBigNum& b)
|
||||
inline const CBigNum operator-(const CBigNum& a, const CBigNum& b)
|
||||
{
|
||||
CBigNum r;
|
||||
if (!BN_sub(&r, &a, &b))
|
||||
if (!BN_sub(r.pbn, a.pbn, b.pbn))
|
||||
throw bignum_error("CBigNum::operator- : BN_sub failed");
|
||||
return r;
|
||||
}
|
||||
@@ -666,7 +688,7 @@ inline const CBigNum operator-(const CBigNum& a, const CBigNum& b)
|
||||
inline const CBigNum operator-(const CBigNum& a)
|
||||
{
|
||||
CBigNum r(a);
|
||||
BN_set_negative(&r, !BN_is_negative(&r));
|
||||
BN_set_negative(r.pbn, !BN_is_negative(r.pbn));
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -674,7 +696,7 @@ inline const CBigNum operator*(const CBigNum& a, const CBigNum& b)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum r;
|
||||
if (!BN_mul(&r, &a, &b, pctx))
|
||||
if (!BN_mul(r.pbn, a.pbn, b.pbn, pctx))
|
||||
throw bignum_error("CBigNum::operator* : BN_mul failed");
|
||||
return r;
|
||||
}
|
||||
@@ -683,7 +705,7 @@ inline const CBigNum operator/(const CBigNum& a, const CBigNum& b)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum r;
|
||||
if (!BN_div(&r, NULL, &a, &b, pctx))
|
||||
if (!BN_div(r.pbn, NULL, a.pbn, b.pbn, pctx))
|
||||
throw bignum_error("CBigNum::operator/ : BN_div failed");
|
||||
return r;
|
||||
}
|
||||
@@ -692,7 +714,7 @@ inline const CBigNum operator%(const CBigNum& a, const CBigNum& b)
|
||||
{
|
||||
CAutoBN_CTX pctx;
|
||||
CBigNum r;
|
||||
if (!BN_nnmod(&r, &a, &b, pctx))
|
||||
if (!BN_nnmod(r.pbn, a.pbn, b.pbn, pctx))
|
||||
throw bignum_error("CBigNum::operator% : BN_div failed");
|
||||
return r;
|
||||
}
|
||||
@@ -700,7 +722,7 @@ inline const CBigNum operator%(const CBigNum& a, const CBigNum& b)
|
||||
inline const CBigNum operator<<(const CBigNum& a, unsigned int shift)
|
||||
{
|
||||
CBigNum r;
|
||||
if (!BN_lshift(&r, &a, shift))
|
||||
if (!BN_lshift(r.pbn, a.pbn, shift))
|
||||
throw bignum_error("CBigNum:operator<< : BN_lshift failed");
|
||||
return r;
|
||||
}
|
||||
@@ -712,16 +734,15 @@ inline const CBigNum operator>>(const CBigNum& a, unsigned int shift)
|
||||
return r;
|
||||
}
|
||||
|
||||
inline bool operator==(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) == 0); }
|
||||
inline bool operator!=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) != 0); }
|
||||
inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) <= 0); }
|
||||
inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) >= 0); }
|
||||
inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) < 0); }
|
||||
inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(&a, &b) > 0); }
|
||||
inline bool operator==(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) == 0); }
|
||||
inline bool operator!=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) != 0); }
|
||||
inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) <= 0); }
|
||||
inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) >= 0); }
|
||||
inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) < 0); }
|
||||
inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.pbn, b.pbn) > 0); }
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &strm, const CBigNum &b) { return strm << b.ToString(10); }
|
||||
|
||||
typedef CBigNum Bignum;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
+12
-12
@@ -70,15 +70,15 @@ bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned
|
||||
int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
|
||||
vchCiphertext = std::vector<unsigned char> (nCLen);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
||||
if (!ctx) return false;
|
||||
|
||||
bool fOk = true;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
|
||||
if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
if (fOk) fOk = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
if (fOk) fOk = EVP_EncryptUpdate(ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
|
||||
if (fOk) fOk = EVP_EncryptFinal_ex(ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
|
||||
if (!fOk) return false;
|
||||
|
||||
@@ -97,15 +97,15 @@ bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingM
|
||||
|
||||
vchPlaintext = CKeyingMaterial(nPLen);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
||||
if (!ctx) return false;
|
||||
|
||||
bool fOk = true;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
|
||||
if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
|
||||
if (fOk) fOk = EVP_DecryptUpdate(ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
|
||||
if (fOk) fOk = EVP_DecryptFinal_ex(ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
|
||||
if (!fOk) return false;
|
||||
|
||||
|
||||
+9
-8
@@ -17,6 +17,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
|
||||
unsigned int nWalletDBUpdated;
|
||||
@@ -39,7 +40,7 @@ void CDBEnv::EnvShutdown()
|
||||
if (ret != 0)
|
||||
printf("EnvShutdown exception: %s (%d)\n", DbEnv::strerror(ret), ret);
|
||||
if (!fMockDb)
|
||||
DbEnv(0).remove(strPath.c_str(), 0);
|
||||
DbEnv((u_int32_t)0).remove(strPath.c_str(), 0);
|
||||
}
|
||||
|
||||
CDBEnv::CDBEnv() : dbenv(DB_CXX_NO_EXCEPTIONS)
|
||||
@@ -58,7 +59,7 @@ void CDBEnv::Close()
|
||||
EnvShutdown();
|
||||
}
|
||||
|
||||
bool CDBEnv::Open(boost::filesystem::path pathEnv_)
|
||||
bool CDBEnv::Open(fs::path pathEnv_)
|
||||
{
|
||||
if (fDbEnvInit)
|
||||
return true;
|
||||
@@ -67,11 +68,11 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)
|
||||
return false;
|
||||
|
||||
pathEnv = pathEnv_;
|
||||
filesystem::path pathDataDir = pathEnv;
|
||||
fs::path pathDataDir = pathEnv;
|
||||
strPath = pathDataDir.string();
|
||||
filesystem::path pathLogDir = pathDataDir / "database";
|
||||
filesystem::create_directory(pathLogDir);
|
||||
filesystem::path pathErrorFile = pathDataDir / "db.log";
|
||||
fs::path pathLogDir = pathDataDir / "database";
|
||||
fs::create_directory(pathLogDir);
|
||||
fs::path pathErrorFile = pathDataDir / "db.log";
|
||||
printf("dbenv.open LogDir=%s ErrorFile=%s\n", pathLogDir.string().c_str(), pathErrorFile.string().c_str());
|
||||
|
||||
unsigned int nEnvFlags = 0;
|
||||
@@ -517,7 +518,7 @@ bool CAddrDB::Write(const CAddrMan& addr)
|
||||
ssPeers << hash;
|
||||
|
||||
// open temp output file, and associate with CAutoFile
|
||||
boost::filesystem::path pathTmp = GetDataDir() / tmpfn;
|
||||
fs::path pathTmp = GetDataDir() / tmpfn;
|
||||
FILE *file = fopen(pathTmp.string().c_str(), "wb");
|
||||
CAutoFile fileout = CAutoFile(file, SER_DISK, CLIENT_VERSION);
|
||||
if (!fileout)
|
||||
@@ -549,7 +550,7 @@ bool CAddrDB::Read(CAddrMan& addr)
|
||||
return error("CAddrman::Read() : open failed");
|
||||
|
||||
// use file size to size memory buffer
|
||||
int fileSize = boost::filesystem::file_size(pathAddr);
|
||||
int fileSize = fs::file_size(pathAddr);
|
||||
int dataSize = fileSize - sizeof(uint256);
|
||||
// Don't try to resize to a negative number if file is small
|
||||
if ( dataSize < 0 ) dataSize = 0;
|
||||
|
||||
+12
-11
@@ -13,7 +13,7 @@
|
||||
#include "smessage.h"
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/filesystem/fstream.hpp>
|
||||
#include <boost/filesystem/convenience.hpp>
|
||||
// boost/filesystem/convenience.hpp removed in modern Boost; functionality is in filesystem.hpp
|
||||
#include <boost/interprocess/sync/file_lock.hpp>
|
||||
#include <boost/algorithm/string/predicate.hpp>
|
||||
#include <openssl/crypto.h>
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
CWallet* pwalletMain;
|
||||
CClientUIInterface uiInterface;
|
||||
@@ -97,7 +98,7 @@ void Shutdown(void* parg)
|
||||
bitdb.Flush(false);
|
||||
StopNode();
|
||||
bitdb.Flush(true);
|
||||
boost::filesystem::remove(GetPidFile());
|
||||
fs::remove(GetPidFile());
|
||||
UnregisterWallet(pwalletMain);
|
||||
delete pwalletMain;
|
||||
NewThread(ExitTimeout, NULL);
|
||||
@@ -147,7 +148,7 @@ bool AppInit(int argc, char* argv[])
|
||||
//
|
||||
// If Qt is used, parameters/triangles.conf are parsed in qt/triangles.cpp's main()
|
||||
ParseParameters(argc, argv);
|
||||
if (!boost::filesystem::is_directory(GetDataDir(false)))
|
||||
if (!fs::is_directory(GetDataDir(false)))
|
||||
{
|
||||
fprintf(stderr, "Error: Specified directory does not exist\n");
|
||||
Shutdown(NULL);
|
||||
@@ -526,11 +527,11 @@ bool AppInit2()
|
||||
std::string strWalletFileName = GetArg("-wallet", "wallet.dat");
|
||||
|
||||
// strWalletFileName must be a plain filename without a directory
|
||||
if (strWalletFileName != boost::filesystem::basename(strWalletFileName) + boost::filesystem::extension(strWalletFileName))
|
||||
if (strWalletFileName != fs::path(strWalletFileName).stem().string() + fs::path(strWalletFileName).extension().string())
|
||||
return InitError(strprintf(_("Wallet %s resides outside data directory %s."), strWalletFileName.c_str(), strDataDir.c_str()));
|
||||
|
||||
// Make sure only a single Triangles process is using the data directory.
|
||||
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
|
||||
fs::path pathLockFile = GetDataDir() / ".lock";
|
||||
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
|
||||
if (file) fclose(file);
|
||||
static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
|
||||
@@ -594,7 +595,7 @@ bool AppInit2()
|
||||
return false;
|
||||
}
|
||||
|
||||
if (filesystem::exists(GetDataDir() / strWalletFileName))
|
||||
if (fs::exists(GetDataDir() / strWalletFileName))
|
||||
{
|
||||
CDBEnv::VerifyResult r = bitdb.Verify(strWalletFileName, CWalletDB::Recover);
|
||||
if (r == CDBEnv::RECOVER_OK)
|
||||
@@ -690,10 +691,10 @@ bool AppInit2()
|
||||
}
|
||||
} else {
|
||||
string automatic_onion;
|
||||
filesystem::path const hostname_path = GetDataDir(
|
||||
fs::path const hostname_path = GetDataDir(
|
||||
) / "onion" / "hostname";
|
||||
if (
|
||||
!filesystem::exists(
|
||||
!fs::exists(
|
||||
hostname_path
|
||||
)
|
||||
) {
|
||||
@@ -891,13 +892,13 @@ bool AppInit2()
|
||||
exit(0);
|
||||
}
|
||||
|
||||
filesystem::path pathBootstrap = GetDataDir() / "bootstrap.dat";
|
||||
if (filesystem::exists(pathBootstrap)) {
|
||||
fs::path pathBootstrap = GetDataDir() / "bootstrap.dat";
|
||||
if (fs::exists(pathBootstrap)) {
|
||||
uiInterface.InitMessage(_("Importing bootstrap blockchain data file."));
|
||||
|
||||
FILE *file = fopen(pathBootstrap.string().c_str(), "rb");
|
||||
if (file) {
|
||||
filesystem::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
|
||||
fs::path pathBootstrapOld = GetDataDir() / "bootstrap.dat.old";
|
||||
LoadExternalBlockFile(file);
|
||||
RenameOver(pathBootstrap, pathBootstrapOld);
|
||||
}
|
||||
|
||||
+22
-12
@@ -73,12 +73,14 @@ int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned ch
|
||||
const EC_GROUP *group = EC_KEY_get0_group(eckey);
|
||||
if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; }
|
||||
BN_CTX_start(ctx);
|
||||
const BIGNUM *sig_r, *sig_s;
|
||||
ECDSA_SIG_get0(ecsig, &sig_r, &sig_s);
|
||||
order = BN_CTX_get(ctx);
|
||||
if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; }
|
||||
x = BN_CTX_get(ctx);
|
||||
if (!BN_copy(x, order)) { ret=-1; goto err; }
|
||||
if (!BN_mul_word(x, i)) { ret=-1; goto err; }
|
||||
if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; }
|
||||
if (!BN_add(x, x, sig_r)) { ret=-1; goto err; }
|
||||
field = BN_CTX_get(ctx);
|
||||
if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; }
|
||||
if (BN_cmp(x, field) >= 0) { ret=0; goto err; }
|
||||
@@ -96,12 +98,12 @@ int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned ch
|
||||
if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; }
|
||||
if (8*msglen > n) BN_rshift(e, e, 8-(n & 7));
|
||||
zero = BN_CTX_get(ctx);
|
||||
if (!BN_zero(zero)) { ret=-1; goto err; }
|
||||
BN_zero(zero);
|
||||
if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; }
|
||||
rr = BN_CTX_get(ctx);
|
||||
if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; }
|
||||
if (!BN_mod_inverse(rr, sig_r, order, ctx)) { ret=-1; goto err; }
|
||||
sor = BN_CTX_get(ctx);
|
||||
if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; }
|
||||
if (!BN_mod_mul(sor, sig_s, rr, order, ctx)) { ret=-1; goto err; }
|
||||
eor = BN_CTX_get(ctx);
|
||||
if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; }
|
||||
if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; }
|
||||
@@ -355,9 +357,14 @@ bool CKey::Sign(uint256 hash, std::vector<unsigned char>& vchSig)
|
||||
BIGNUM *halforder = BN_CTX_get(ctx);
|
||||
EC_GROUP_get_order(group, order, ctx);
|
||||
BN_rshift1(halforder, order);
|
||||
if (BN_cmp(sig->s, halforder) > 0) {
|
||||
const BIGNUM *sig_r, *sig_s;
|
||||
ECDSA_SIG_get0(sig, &sig_r, &sig_s);
|
||||
if (BN_cmp(sig_s, halforder) > 0) {
|
||||
// enforce low S values, by negating the value (modulo the order) if above order/2.
|
||||
BN_sub(sig->s, order, sig->s);
|
||||
BIGNUM *new_s = BN_new();
|
||||
BN_sub(new_s, order, sig_s);
|
||||
BIGNUM *dup_r = BN_dup(sig_r);
|
||||
ECDSA_SIG_set0(sig, dup_r, new_s);
|
||||
}
|
||||
BN_CTX_end(ctx);
|
||||
BN_CTX_free(ctx);
|
||||
@@ -382,8 +389,10 @@ bool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)
|
||||
return false;
|
||||
vchSig.clear();
|
||||
vchSig.resize(65,0);
|
||||
int nBitsR = BN_num_bits(sig->r);
|
||||
int nBitsS = BN_num_bits(sig->s);
|
||||
const BIGNUM *sig_r, *sig_s;
|
||||
ECDSA_SIG_get0(sig, &sig_r, &sig_s);
|
||||
int nBitsR = BN_num_bits(sig_r);
|
||||
int nBitsS = BN_num_bits(sig_s);
|
||||
if (nBitsR <= 256 && nBitsS <= 256)
|
||||
{
|
||||
int nRecId = -1;
|
||||
@@ -408,8 +417,8 @@ bool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)
|
||||
}
|
||||
|
||||
vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0);
|
||||
BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]);
|
||||
BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]);
|
||||
BN_bn2bin(sig_r,&vchSig[33-(nBitsR+7)/8]);
|
||||
BN_bn2bin(sig_s,&vchSig[65-(nBitsS+7)/8]);
|
||||
fOk = true;
|
||||
}
|
||||
ECDSA_SIG_free(sig);
|
||||
@@ -428,8 +437,9 @@ bool CKey::SetCompactSignature(uint256 hash, const std::vector<unsigned char>& v
|
||||
if (nV<27 || nV>=35)
|
||||
return false;
|
||||
ECDSA_SIG *sig = ECDSA_SIG_new();
|
||||
BN_bin2bn(&vchSig[1],32,sig->r);
|
||||
BN_bin2bn(&vchSig[33],32,sig->s);
|
||||
BIGNUM *sig_r = BN_bin2bn(&vchSig[1],32,NULL);
|
||||
BIGNUM *sig_s = BN_bin2bn(&vchSig[33],32,NULL);
|
||||
ECDSA_SIG_set0(sig, sig_r, sig_s);
|
||||
|
||||
EC_KEY_free(pkey);
|
||||
pkey = EC_KEY_new_by_curve_name(NID_secp256k1);
|
||||
|
||||
+3
-2
@@ -19,6 +19,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
//
|
||||
// Global state
|
||||
@@ -2451,7 +2452,7 @@ bool CBlock::CheckBlockSignature() const
|
||||
|
||||
bool CheckDiskSpace(uint64_t nAdditionalBytes)
|
||||
{
|
||||
uint64_t nFreeBytesAvailable = filesystem::space(GetDataDir()).available;
|
||||
uint64_t nFreeBytesAvailable = fs::space(GetDataDir()).available;
|
||||
|
||||
// Check for nMinDiskSpace bytes (currently 50MB)
|
||||
if (nFreeBytesAvailable < nMinDiskSpace + nAdditionalBytes)
|
||||
@@ -2467,7 +2468,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes)
|
||||
return true;
|
||||
}
|
||||
|
||||
static filesystem::path BlockFilePath(unsigned int nFile)
|
||||
static fs::path BlockFilePath(unsigned int nFile)
|
||||
{
|
||||
string strBlockFn = strprintf("blk%04u.dat", nFile);
|
||||
return GetDataDir() / strBlockFn;
|
||||
|
||||
+10
-17
@@ -27,7 +27,8 @@ using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
extern "C" {
|
||||
int tor_main(int argc, char *argv[]);
|
||||
// Old embedded Tor v2 removed - using external Tor via SOCKS5 for v3
|
||||
// int tor_main(int argc, char *argv[]);
|
||||
}
|
||||
|
||||
static const int MAX_OUTBOUND_CONNECTIONS = 16;
|
||||
@@ -1139,16 +1140,17 @@ void ThreadMapPort2(void* parg)
|
||||
/* miniupnpc 1.5 */
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0);
|
||||
#else
|
||||
/* miniupnpc 1.6 */
|
||||
/* miniupnpc 1.6+ */
|
||||
int error = 0;
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error);
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, 2, &error);
|
||||
#endif
|
||||
|
||||
struct UPNPUrls urls;
|
||||
struct IGDdatas data;
|
||||
int r;
|
||||
|
||||
r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
|
||||
char wanaddr[64] = "";
|
||||
r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr));
|
||||
if (r == 1)
|
||||
{
|
||||
//if (fDiscover) {
|
||||
@@ -1934,19 +1936,10 @@ void static Discover()
|
||||
}
|
||||
|
||||
static void run_tor() {
|
||||
printf("Onion thread started.\n");
|
||||
|
||||
std::string logDecl = "notice file " + GetDataDir().string() + "/tor/tor.log";
|
||||
char *argvLogDecl = (char*) logDecl.c_str();
|
||||
|
||||
char* argv[] = {
|
||||
"tor",
|
||||
"--hush",
|
||||
"--Log",
|
||||
argvLogDecl
|
||||
};
|
||||
|
||||
tor_main(4, argv);
|
||||
// Old embedded Tor v2 client removed - incompatible with OpenSSL 3.x.
|
||||
// Tor v3 onion services are handled by onion_v3.cpp via external Tor/SOCKS5.
|
||||
printf("Tor v3 mode: using external Tor process via SOCKS5 proxy.\n");
|
||||
set_initialized();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -619,14 +619,14 @@ QWidget {
|
||||
<widget class="QLabel" name="lbLogo">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>152</width>
|
||||
<height>32</height>
|
||||
<width>300</width>
|
||||
<height>63</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>152</width>
|
||||
<height>32</height>
|
||||
<width>300</width>
|
||||
<height>63</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
|
||||
@@ -840,7 +840,7 @@ QWidget#line {
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></string>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1430,7 +1430,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1435,7 +1435,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1426,7 +1426,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1426,7 +1426,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1443,7 +1443,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1435,7 +1435,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1435,7 +1435,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1428,7 +1428,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1441,7 +1441,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1431,7 +1431,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1431,7 +1431,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1431,7 +1431,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1430,7 +1430,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1426,7 +1426,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1440,7 +1440,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1441,7 +1441,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1446,7 +1446,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1432,7 +1432,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1427,7 +1427,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1433,7 +1433,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -1434,7 +1434,7 @@ a:active { color:#f26522; text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="https://bittrex.com/Market/Index?MarketName=BTC-TRI"> &#187; TRI on Bittrex</a></body></source>
|
||||
<a href="https://313.cash"> &#187; TRI on Pinball</a></body></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
|
||||
@@ -35,6 +35,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
|
||||
ui->proxyIp->setEnabled(false);
|
||||
ui->proxyPort->setEnabled(false);
|
||||
ui->proxyPort->setValidator(new QIntValidator(1, 65535, this));
|
||||
ui->connectSocks->setText(tr("&Use Tor (SOCKS5):"));
|
||||
|
||||
ui->socksVersion->setEnabled(false);
|
||||
ui->socksVersion->addItem("5", 5);
|
||||
@@ -45,6 +46,7 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
|
||||
connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->proxyPort, SLOT(setEnabled(bool)));
|
||||
connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->socksVersion, SLOT(setEnabled(bool)));
|
||||
connect(ui->connectSocks, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning_Proxy()));
|
||||
connect(ui->connectSocks, SIGNAL(toggled(bool)), this, SLOT(applyTorDefaults(bool)));
|
||||
|
||||
ui->proxyIp->installEventFilter(this);
|
||||
|
||||
@@ -277,6 +279,17 @@ void OptionsDialog::handleProxyIpValid(QValidatedLineEdit *object, bool fState)
|
||||
}
|
||||
}
|
||||
|
||||
void OptionsDialog::applyTorDefaults(bool enabled)
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
// One-click Tor mode: populate standard local Tor SOCKS settings.
|
||||
ui->proxyIp->setText("127.0.0.1");
|
||||
ui->proxyPort->setText("9050");
|
||||
ui->socksVersion->setCurrentIndex(ui->socksVersion->findData(5));
|
||||
}
|
||||
|
||||
bool OptionsDialog::eventFilter(QObject *object, QEvent *event)
|
||||
{
|
||||
if(event->type() == QEvent::FocusOut)
|
||||
|
||||
@@ -44,6 +44,7 @@ private slots:
|
||||
void showRestartWarning_Lang();
|
||||
void updateDisplayUnit();
|
||||
void handleProxyIpValid(QValidatedLineEdit *object, bool fState);
|
||||
void applyTorDefaults(bool enabled);
|
||||
|
||||
signals:
|
||||
void proxyIpValid(QValidatedLineEdit *object, bool fValid);
|
||||
|
||||
@@ -33,6 +33,11 @@ bool static ApplyProxySettings()
|
||||
#endif
|
||||
SetNameProxy(addrProxy, nSocksVersion);
|
||||
}
|
||||
|
||||
// Keep Tor transport aligned with proxy settings for one-click Tor mode.
|
||||
SoftSetArg("-tor", addrProxy.ToStringIPPort());
|
||||
SoftSetArg("-torproxy", addrProxy.ToStringIPPort());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -58,6 +63,11 @@ void OptionsModel::Init()
|
||||
SoftSetArg("-proxy", settings.value("addrProxy").toString().toStdString());
|
||||
if (settings.contains("nSocksVersion") && settings.value("fUseProxy").toBool())
|
||||
SoftSetArg("-socks", settings.value("nSocksVersion").toString().toStdString());
|
||||
if (settings.value("fUseProxy", false).toBool()) {
|
||||
const std::string proxyAddr = settings.value("addrProxy", "127.0.0.1:9050").toString().toStdString();
|
||||
SoftSetArg("-tor", proxyAddr);
|
||||
SoftSetArg("-torproxy", proxyAddr);
|
||||
}
|
||||
if (settings.contains("detachDB"))
|
||||
SoftSetBoolArg("-detachdb", settings.value("detachDB").toBool());
|
||||
if (!language.isEmpty())
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 12 KiB |
+3
-3
@@ -890,17 +890,17 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, co
|
||||
break;
|
||||
|
||||
case OP_MUL:
|
||||
if (!BN_mul(&bn, &bn1, &bn2, pctx))
|
||||
if (!BN_mul(bn.get(), bn1.get(), bn2.get(), pctx))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case OP_DIV:
|
||||
if (!BN_div(&bn, NULL, &bn1, &bn2, pctx))
|
||||
if (!BN_div(bn.get(), NULL, bn1.get(), bn2.get(), pctx))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case OP_MOD:
|
||||
if (!BN_mod(&bn, &bn1, &bn2, pctx))
|
||||
if (!BN_mod(bn.get(), bn1.get(), bn2.get(), pctx))
|
||||
return false;
|
||||
break;
|
||||
|
||||
|
||||
+56
-60
@@ -125,21 +125,22 @@ bool SecMsgCrypter::Encrypt(unsigned char* chPlaintext, uint32_t nPlain, std::ve
|
||||
int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
|
||||
vchCiphertext = std::vector<unsigned char> (nCLen);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
||||
if (!ctx)
|
||||
return false;
|
||||
|
||||
bool fOk = true;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]);
|
||||
if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, chPlaintext, nLen);
|
||||
if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
if (fOk) fOk = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]);
|
||||
if (fOk) fOk = EVP_EncryptUpdate(ctx, &vchCiphertext[0], &nCLen, chPlaintext, nLen);
|
||||
if (fOk) fOk = EVP_EncryptFinal_ex(ctx, (&vchCiphertext[0])+nCLen, &nFLen);
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
|
||||
if (!fOk)
|
||||
return false;
|
||||
|
||||
vchCiphertext.resize(nCLen + nFLen);
|
||||
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
@@ -153,15 +154,16 @@ bool SecMsgCrypter::Decrypt(unsigned char* chCiphertext, uint32_t nCipher, std::
|
||||
|
||||
vchPlaintext.resize(nCipher);
|
||||
|
||||
EVP_CIPHER_CTX ctx;
|
||||
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
|
||||
if (!ctx)
|
||||
return false;
|
||||
|
||||
bool fOk = true;
|
||||
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]);
|
||||
if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &chCiphertext[0], nCipher);
|
||||
if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||
EVP_CIPHER_CTX_cleanup(&ctx);
|
||||
if (fOk) fOk = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, &chKey[0], &chIV[0]);
|
||||
if (fOk) fOk = EVP_DecryptUpdate(ctx, &vchPlaintext[0], &nPLen, &chCiphertext[0], nCipher);
|
||||
if (fOk) fOk = EVP_DecryptFinal_ex(ctx, (&vchPlaintext[0])+nPLen, &nFLen);
|
||||
EVP_CIPHER_CTX_free(ctx);
|
||||
|
||||
if (!fOk)
|
||||
return false;
|
||||
@@ -3154,15 +3156,14 @@ int SecureMsgValidate(unsigned char *pHeader, unsigned char *pPayload, uint32_t
|
||||
for (int i = 0; i < 32; i+=4)
|
||||
memcpy(civ+i, &nonse, 4);
|
||||
|
||||
HMAC_CTX ctx;
|
||||
HMAC_CTX_init(&ctx);
|
||||
|
||||
HMAC_CTX *ctx = HMAC_CTX_new();
|
||||
|
||||
unsigned int nBytes;
|
||||
if (!HMAC_Init_ex(&ctx, &civ[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) pPayload, nPayload)
|
||||
|| !HMAC_Update(&ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(&ctx, sha256Hash, &nBytes)
|
||||
if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) pPayload, nPayload)
|
||||
|| !HMAC_Update(ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(ctx, sha256Hash, &nBytes)
|
||||
|| nBytes != 32)
|
||||
{
|
||||
if (fDebugSmsg)
|
||||
@@ -3178,7 +3179,7 @@ int SecureMsgValidate(unsigned char *pHeader, unsigned char *pPayload, uint32_t
|
||||
printf("Hash Valid.\n");
|
||||
rv = 0; // smsg is valid
|
||||
};
|
||||
|
||||
|
||||
if (memcmp(psmsg->hash, sha256Hash, 4) != 0)
|
||||
{
|
||||
if (fDebugSmsg)
|
||||
@@ -3186,7 +3187,7 @@ int SecureMsgValidate(unsigned char *pHeader, unsigned char *pPayload, uint32_t
|
||||
rv = 3; // checksum mismatch
|
||||
}
|
||||
}
|
||||
HMAC_CTX_cleanup(&ctx);
|
||||
HMAC_CTX_free(ctx);
|
||||
|
||||
return rv;
|
||||
};
|
||||
@@ -3214,34 +3215,33 @@ int SecureMsgSetHash(unsigned char *pHeader, unsigned char *pPayload, uint32_t n
|
||||
//vchHash.resize(32);
|
||||
|
||||
bool found = false;
|
||||
HMAC_CTX ctx;
|
||||
HMAC_CTX_init(&ctx);
|
||||
|
||||
HMAC_CTX *ctx = HMAC_CTX_new();
|
||||
|
||||
uint32_t nonse = 0;
|
||||
|
||||
|
||||
//CBigNum bnTarget(2);
|
||||
//bnTarget = bnTarget.pow(256 - 40);
|
||||
|
||||
// -- break for HMAC_CTX_cleanup
|
||||
|
||||
// -- break for HMAC_CTX_free
|
||||
for (;;)
|
||||
{
|
||||
if (!fSecMsgEnabled)
|
||||
break;
|
||||
|
||||
|
||||
//psmsg->timestamp = GetTime();
|
||||
//memcpy(&psmsg->timestamp, &now, 8);
|
||||
memcpy(&psmsg->nonse[0], &nonse, 4);
|
||||
|
||||
|
||||
for (int i = 0; i < 32; i+=4)
|
||||
memcpy(civ+i, &nonse, 4);
|
||||
|
||||
|
||||
unsigned int nBytes;
|
||||
if (!HMAC_Init_ex(&ctx, &civ[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) pPayload, nPayload)
|
||||
|| !HMAC_Update(&ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(&ctx, sha256Hash, &nBytes)
|
||||
//|| !HMAC_Final(&ctx, &vchHash[0], &nBytes)
|
||||
if (!HMAC_Init_ex(ctx, &civ[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) pHeader+4, SMSG_HDR_LEN-4)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) pPayload, nPayload)
|
||||
|| !HMAC_Update(ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(ctx, sha256Hash, &nBytes)
|
||||
//|| !HMAC_Final(ctx, &vchHash[0], &nBytes)
|
||||
|| nBytes != 32)
|
||||
break;
|
||||
|
||||
@@ -3277,8 +3277,8 @@ int SecureMsgSetHash(unsigned char *pHeader, unsigned char *pPayload, uint32_t n
|
||||
nonse++;
|
||||
};
|
||||
|
||||
HMAC_CTX_cleanup(&ctx);
|
||||
|
||||
HMAC_CTX_free(ctx);
|
||||
|
||||
if (!fSecMsgEnabled)
|
||||
{
|
||||
if (fDebugSmsg)
|
||||
@@ -3423,7 +3423,6 @@ int SecureMsgEncrypt(SecureMessage& smsg, std::string& addressFrom, std::string&
|
||||
//printf("secret_len %d.\n", secret_len);
|
||||
|
||||
// -- ECDH_compute_key returns the same P if fed compressed or uncompressed public keys
|
||||
ECDH_set_method(pkeyr, ECDH_OpenSSL());
|
||||
int lenP = ECDH_compute_key(&vchP[0], 32, EC_KEY_get0_public_key(pkeyK), pkeyr, NULL);
|
||||
|
||||
if (lenP != 32)
|
||||
@@ -3556,17 +3555,16 @@ int SecureMsgEncrypt(SecureMessage& smsg, std::string& addressFrom, std::string&
|
||||
// Message authentication code, (hash of timestamp + destination + payload)
|
||||
bool fHmacOk = true;
|
||||
unsigned int nBytes = 32;
|
||||
HMAC_CTX ctx;
|
||||
HMAC_CTX_init(&ctx);
|
||||
|
||||
if (!HMAC_Init_ex(&ctx, &key_m[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) &smsg.timestamp, sizeof(smsg.timestamp))
|
||||
|| !HMAC_Update(&ctx, &vchCiphertext[0], vchCiphertext.size())
|
||||
|| !HMAC_Final(&ctx, smsg.mac, &nBytes)
|
||||
HMAC_CTX *ctx = HMAC_CTX_new();
|
||||
|
||||
if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) &smsg.timestamp, sizeof(smsg.timestamp))
|
||||
|| !HMAC_Update(ctx, &vchCiphertext[0], vchCiphertext.size())
|
||||
|| !HMAC_Final(ctx, smsg.mac, &nBytes)
|
||||
|| nBytes != 32)
|
||||
fHmacOk = false;
|
||||
|
||||
HMAC_CTX_cleanup(&ctx);
|
||||
|
||||
HMAC_CTX_free(ctx);
|
||||
|
||||
if (!fHmacOk)
|
||||
{
|
||||
@@ -3835,7 +3833,6 @@ int SecureMsgDecrypt(bool fTestOnly, std::string& address, unsigned char *pHeade
|
||||
EC_KEY* pkeyk = keyDest.GetECKey();
|
||||
EC_KEY* pkeyR = keyR.GetECKey();
|
||||
|
||||
ECDH_set_method(pkeyk, ECDH_OpenSSL());
|
||||
int lenPdec = ECDH_compute_key(&vchP[0], 32, EC_KEY_get0_public_key(pkeyR), pkeyk, NULL);
|
||||
|
||||
if (lenPdec != 32)
|
||||
@@ -3858,17 +3855,16 @@ int SecureMsgDecrypt(bool fTestOnly, std::string& address, unsigned char *pHeade
|
||||
unsigned char MAC[32];
|
||||
bool fHmacOk = true;
|
||||
unsigned int nBytes = 32;
|
||||
HMAC_CTX ctx;
|
||||
HMAC_CTX_init(&ctx);
|
||||
|
||||
if (!HMAC_Init_ex(&ctx, &key_m[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(&ctx, (unsigned char*) &psmsg->timestamp, sizeof(psmsg->timestamp))
|
||||
|| !HMAC_Update(&ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(&ctx, MAC, &nBytes)
|
||||
HMAC_CTX *ctx = HMAC_CTX_new();
|
||||
|
||||
if (!HMAC_Init_ex(ctx, &key_m[0], 32, EVP_sha256(), NULL)
|
||||
|| !HMAC_Update(ctx, (unsigned char*) &psmsg->timestamp, sizeof(psmsg->timestamp))
|
||||
|| !HMAC_Update(ctx, pPayload, nPayload)
|
||||
|| !HMAC_Final(ctx, MAC, &nBytes)
|
||||
|| nBytes != 32)
|
||||
fHmacOk = false;
|
||||
|
||||
HMAC_CTX_cleanup(&ctx);
|
||||
|
||||
HMAC_CTX_free(ctx);
|
||||
|
||||
if (!fHmacOk)
|
||||
{
|
||||
|
||||
+6
-5
@@ -89,7 +89,7 @@
|
||||
#ifdef USE_EVP_AES_CTR
|
||||
|
||||
struct aes_cnt_cipher {
|
||||
EVP_CIPHER_CTX evp;
|
||||
EVP_CIPHER_CTX *evp;
|
||||
};
|
||||
|
||||
aes_cnt_cipher_t *
|
||||
@@ -97,7 +97,8 @@ aes_new_cipher(const char *key, const char *iv)
|
||||
{
|
||||
aes_cnt_cipher_t *cipher;
|
||||
cipher = tor_malloc_zero(sizeof(aes_cnt_cipher_t));
|
||||
EVP_EncryptInit(&cipher->evp, EVP_aes_128_ctr(),
|
||||
cipher->evp = EVP_CIPHER_CTX_new();
|
||||
EVP_EncryptInit(cipher->evp, EVP_aes_128_ctr(),
|
||||
(const unsigned char*)key, (const unsigned char *)iv);
|
||||
return cipher;
|
||||
}
|
||||
@@ -106,7 +107,7 @@ aes_cipher_free(aes_cnt_cipher_t *cipher)
|
||||
{
|
||||
if (!cipher)
|
||||
return;
|
||||
EVP_CIPHER_CTX_cleanup(&cipher->evp);
|
||||
EVP_CIPHER_CTX_free(cipher->evp);
|
||||
memwipe(cipher, 0, sizeof(aes_cnt_cipher_t));
|
||||
tor_free(cipher);
|
||||
}
|
||||
@@ -118,7 +119,7 @@ aes_crypt(aes_cnt_cipher_t *cipher, const char *input, size_t len,
|
||||
|
||||
tor_assert(len < INT_MAX);
|
||||
|
||||
EVP_EncryptUpdate(&cipher->evp, (unsigned char*)output,
|
||||
EVP_EncryptUpdate(cipher->evp, (unsigned char*)output,
|
||||
&outl, (const unsigned char *)input, (int)len);
|
||||
}
|
||||
void
|
||||
@@ -128,7 +129,7 @@ aes_crypt_inplace(aes_cnt_cipher_t *cipher, char *data, size_t len)
|
||||
|
||||
tor_assert(len < INT_MAX);
|
||||
|
||||
EVP_EncryptUpdate(&cipher->evp, (unsigned char*)data,
|
||||
EVP_EncryptUpdate(cipher->evp, (unsigned char*)data,
|
||||
&outl, (unsigned char*)data, (int)len);
|
||||
}
|
||||
int
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
#include <memory>
|
||||
|
||||
char const* anonymize_tor_data_directory(
|
||||
) {
|
||||
@@ -43,7 +44,7 @@ int check_interrupted(
|
||||
|
||||
static boost::mutex initializing;
|
||||
|
||||
static std::auto_ptr<boost::unique_lock<boost::mutex> > uninitialized(
|
||||
static std::unique_ptr<boost::unique_lock<boost::mutex> > uninitialized(
|
||||
new boost::unique_lock<boost::mutex>(
|
||||
initializing
|
||||
)
|
||||
|
||||
+70
-48
@@ -71,9 +71,9 @@
|
||||
#define MAX_DNS_LABEL_SIZE 63
|
||||
|
||||
/** Macro: is k a valid RSA public or private key? */
|
||||
#define PUBLIC_KEY_OK(k) ((k) && (k)->key && (k)->key->n)
|
||||
#define PUBLIC_KEY_OK(k) ((k) && (k)->key && RSA_get0_n((k)->key))
|
||||
/** Macro: is k a valid RSA private key? */
|
||||
#define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p)
|
||||
#define PRIVATE_KEY_OK(k) ((k) && (k)->key && RSA_get0_p((k)->key))
|
||||
|
||||
#ifdef TOR_IS_MULTITHREADED
|
||||
/** A number of preallocated mutexes for use by OpenSSL. */
|
||||
@@ -311,8 +311,10 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
|
||||
used by Tor and the set of algorithms available in the engine */
|
||||
log_engine("RSA", ENGINE_get_default_RSA());
|
||||
log_engine("DH", ENGINE_get_default_DH());
|
||||
#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||
log_engine("ECDH", ENGINE_get_default_ECDH());
|
||||
log_engine("ECDSA", ENGINE_get_default_ECDSA());
|
||||
#endif
|
||||
log_engine("RAND", ENGINE_get_default_RAND());
|
||||
log_engine("RAND (which we will not use)", ENGINE_get_default_RAND());
|
||||
log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1));
|
||||
@@ -335,12 +337,14 @@ crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
|
||||
log_info(LD_CRYPTO, "NOT using OpenSSL engine support.");
|
||||
}
|
||||
|
||||
#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||
if (RAND_get_rand_method() != RAND_SSLeay()) {
|
||||
log_notice(LD_CRYPTO, "It appears that one of our engines has provided "
|
||||
"a replacement the OpenSSL RNG. Resetting it to the default "
|
||||
"implementation.");
|
||||
RAND_set_rand_method(RAND_SSLeay());
|
||||
}
|
||||
#endif
|
||||
|
||||
evaluate_evp_for_aes(-1);
|
||||
evaluate_ctr_for_aes();
|
||||
@@ -769,7 +773,7 @@ crypto_pk_public_exponent_ok(crypto_pk_t *env)
|
||||
tor_assert(env);
|
||||
tor_assert(env->key);
|
||||
|
||||
return BN_is_word(env->key->e, 65537);
|
||||
return BN_is_word(RSA_get0_e(env->key), 65537);
|
||||
}
|
||||
|
||||
/** Compare the public-key components of a and b. Return less than 0
|
||||
@@ -792,10 +796,10 @@ crypto_pk_cmp_keys(crypto_pk_t *a, crypto_pk_t *b)
|
||||
|
||||
tor_assert(PUBLIC_KEY_OK(a));
|
||||
tor_assert(PUBLIC_KEY_OK(b));
|
||||
result = BN_cmp((a->key)->n, (b->key)->n);
|
||||
result = BN_cmp(RSA_get0_n(a->key), RSA_get0_n(b->key));
|
||||
if (result)
|
||||
return result;
|
||||
return BN_cmp((a->key)->e, (b->key)->e);
|
||||
return BN_cmp(RSA_get0_e(a->key), RSA_get0_e(b->key));
|
||||
}
|
||||
|
||||
/** Compare the public-key components of a and b. Return non-zero iff
|
||||
@@ -826,9 +830,9 @@ crypto_pk_num_bits(crypto_pk_t *env)
|
||||
{
|
||||
tor_assert(env);
|
||||
tor_assert(env->key);
|
||||
tor_assert(env->key->n);
|
||||
tor_assert(RSA_get0_n(env->key));
|
||||
|
||||
return BN_num_bits(env->key->n);
|
||||
return BN_num_bits(RSA_get0_n(env->key));
|
||||
}
|
||||
|
||||
/** Increase the reference count of <b>env</b>, and return it.
|
||||
@@ -921,7 +925,7 @@ crypto_pk_private_decrypt(crypto_pk_t *env, char *to,
|
||||
tor_assert(env->key);
|
||||
tor_assert(fromlen<INT_MAX);
|
||||
tor_assert(tolen >= crypto_pk_keysize(env));
|
||||
if (!env->key->p)
|
||||
if (!RSA_get0_p(env->key))
|
||||
/* Not a private key */
|
||||
return -1;
|
||||
|
||||
@@ -1027,7 +1031,7 @@ crypto_pk_private_sign(crypto_pk_t *env, char *to, size_t tolen,
|
||||
tor_assert(to);
|
||||
tor_assert(fromlen < INT_MAX);
|
||||
tor_assert(tolen >= crypto_pk_keysize(env));
|
||||
if (!env->key->p)
|
||||
if (!RSA_get0_p(env->key))
|
||||
/* Not a private key */
|
||||
return -1;
|
||||
|
||||
@@ -1713,7 +1717,7 @@ crypto_generate_dynamic_dh_modulus(void)
|
||||
r = DH_check(dh_parameters, &dh_codes);
|
||||
tor_assert(r && !dh_codes);
|
||||
|
||||
BN_copy(dynamic_dh_modulus, dh_parameters->p);
|
||||
BN_copy(dynamic_dh_modulus, DH_get0_p(dh_parameters));
|
||||
tor_assert(dynamic_dh_modulus);
|
||||
|
||||
DH_free(dh_parameters);
|
||||
@@ -1752,12 +1756,17 @@ crypto_store_dynamic_dh_modulus(const char *fname)
|
||||
|
||||
if (!(dh = DH_new()))
|
||||
goto done;
|
||||
if (!(dh->p = BN_dup(dh_param_p_tls)))
|
||||
goto done;
|
||||
if (!(dh->g = BN_new()))
|
||||
goto done;
|
||||
if (!BN_set_word(dh->g, DH_GENERATOR))
|
||||
goto done;
|
||||
{
|
||||
BIGNUM *p_bn = BN_dup(dh_param_p_tls);
|
||||
BIGNUM *g_bn = BN_new();
|
||||
if (!p_bn || !g_bn || !BN_set_word(g_bn, DH_GENERATOR) ||
|
||||
!DH_set0_pqg(dh, p_bn, NULL, g_bn)) {
|
||||
if (p_bn) BN_free(p_bn);
|
||||
if (g_bn) BN_free(g_bn);
|
||||
goto done;
|
||||
}
|
||||
/* DH_set0_pqg takes ownership of p_bn and g_bn, do not free them */
|
||||
}
|
||||
|
||||
len = i2d_DHparams(dh, &dh_string_repr);
|
||||
if ((len < 0) || (dh_string_repr == NULL)) {
|
||||
@@ -1860,7 +1869,7 @@ crypto_get_stored_dynamic_dh_modulus(const char *fname)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!BN_is_word(stored_dh->g, 2)) {
|
||||
if (!BN_is_word(DH_get0_g(stored_dh), 2)) {
|
||||
log_warn(LD_CRYPTO, "Stored dynamic DH parameters do not use '2' "
|
||||
"as the group generator.");
|
||||
goto err;
|
||||
@@ -1868,7 +1877,7 @@ crypto_get_stored_dynamic_dh_modulus(const char *fname)
|
||||
}
|
||||
|
||||
{ /* log the dynamic DH modulus: */
|
||||
char *s = BN_bn2hex(stored_dh->p);
|
||||
char *s = BN_bn2hex(DH_get0_p(stored_dh));
|
||||
tor_assert(s);
|
||||
log_info(LD_OR, "Found stored dynamic DH modulus: [%s]", s);
|
||||
OPENSSL_free(s);
|
||||
@@ -1902,7 +1911,7 @@ crypto_get_stored_dynamic_dh_modulus(const char *fname)
|
||||
tor_free(base64_decoded_dh);
|
||||
|
||||
if (stored_dh) {
|
||||
dynamic_dh_modulus = BN_dup(stored_dh->p);
|
||||
dynamic_dh_modulus = BN_dup(DH_get0_p(stored_dh));
|
||||
DH_free(stored_dh);
|
||||
}
|
||||
|
||||
@@ -2031,18 +2040,23 @@ crypto_dh_new(int dh_type)
|
||||
if (!(res->dh = DH_new()))
|
||||
goto err;
|
||||
|
||||
if (dh_type == DH_TYPE_TLS) {
|
||||
if (!(res->dh->p = BN_dup(dh_param_p_tls)))
|
||||
goto err;
|
||||
} else {
|
||||
if (!(res->dh->p = BN_dup(dh_param_p)))
|
||||
{
|
||||
BIGNUM *p_bn, *g_bn;
|
||||
if (dh_type == DH_TYPE_TLS) {
|
||||
p_bn = BN_dup(dh_param_p_tls);
|
||||
} else {
|
||||
p_bn = BN_dup(dh_param_p);
|
||||
}
|
||||
g_bn = BN_dup(dh_param_g);
|
||||
if (!p_bn || !g_bn || !DH_set0_pqg(res->dh, p_bn, NULL, g_bn)) {
|
||||
if (p_bn) BN_free(p_bn);
|
||||
if (g_bn) BN_free(g_bn);
|
||||
goto err;
|
||||
}
|
||||
/* DH_set0_pqg takes ownership of p_bn and g_bn, do not free them */
|
||||
}
|
||||
|
||||
if (!(res->dh->g = BN_dup(dh_param_g)))
|
||||
goto err;
|
||||
|
||||
res->dh->length = DH_PRIVATE_KEY_BITS;
|
||||
DH_set_length(res->dh, DH_PRIVATE_KEY_BITS);
|
||||
|
||||
return res;
|
||||
err:
|
||||
@@ -2082,13 +2096,11 @@ crypto_dh_generate_public(crypto_dh_t *dh)
|
||||
crypto_log_errors(LOG_WARN, "generating DH key");
|
||||
return -1;
|
||||
}
|
||||
if (tor_check_dh_key(LOG_WARN, dh->dh->pub_key)<0) {
|
||||
if (tor_check_dh_key(LOG_WARN, (BIGNUM*)DH_get0_pub_key(dh->dh))<0) {
|
||||
log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid. I guess once-in-"
|
||||
"the-universe chances really do happen. Trying again.");
|
||||
/* Free and clear the keys, so OpenSSL will actually try again. */
|
||||
BN_clear_free(dh->dh->pub_key);
|
||||
BN_clear_free(dh->dh->priv_key);
|
||||
dh->dh->pub_key = dh->dh->priv_key = NULL;
|
||||
DH_set0_key(dh->dh, NULL, NULL);
|
||||
goto again;
|
||||
}
|
||||
return 0;
|
||||
@@ -2103,13 +2115,13 @@ crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len)
|
||||
{
|
||||
int bytes;
|
||||
tor_assert(dh);
|
||||
if (!dh->dh->pub_key) {
|
||||
if (!DH_get0_pub_key(dh->dh)) {
|
||||
if (crypto_dh_generate_public(dh)<0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
tor_assert(dh->dh->pub_key);
|
||||
bytes = BN_num_bytes(dh->dh->pub_key);
|
||||
tor_assert(DH_get0_pub_key(dh->dh));
|
||||
bytes = BN_num_bytes(DH_get0_pub_key(dh->dh));
|
||||
tor_assert(bytes >= 0);
|
||||
if (pubkey_len < (size_t)bytes) {
|
||||
log_warn(LD_CRYPTO,
|
||||
@@ -2119,7 +2131,7 @@ crypto_dh_get_public(crypto_dh_t *dh, char *pubkey, size_t pubkey_len)
|
||||
}
|
||||
|
||||
memset(pubkey, 0, pubkey_len);
|
||||
BN_bn2bin(dh->dh->pub_key, (unsigned char*)(pubkey+(pubkey_len-bytes)));
|
||||
BN_bn2bin(DH_get0_pub_key(dh->dh), (unsigned char*)(pubkey+(pubkey_len-bytes)));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2605,23 +2617,28 @@ base64_encode(char *dest, size_t destlen, const char *src, size_t srclen)
|
||||
{
|
||||
/* FFFF we might want to rewrite this along the lines of base64_decode, if
|
||||
* it ever shows up in the profile. */
|
||||
EVP_ENCODE_CTX ctx;
|
||||
EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
|
||||
int len, ret;
|
||||
tor_assert(srclen < INT_MAX);
|
||||
|
||||
/* 48 bytes of input -> 64 bytes of output plus newline.
|
||||
Plus one more byte, in case I'm wrong.
|
||||
*/
|
||||
if (destlen < ((srclen/48)+1)*66)
|
||||
if (destlen < ((srclen/48)+1)*66) {
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return -1;
|
||||
if (destlen > SIZE_T_CEILING)
|
||||
}
|
||||
if (destlen > SIZE_T_CEILING) {
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
EVP_EncodeInit(&ctx);
|
||||
EVP_EncodeUpdate(&ctx, (unsigned char*)dest, &len,
|
||||
EVP_EncodeInit(ctx);
|
||||
EVP_EncodeUpdate(ctx, (unsigned char*)dest, &len,
|
||||
(unsigned char*)src, (int)srclen);
|
||||
EVP_EncodeFinal(&ctx, (unsigned char*)(dest+len), &ret);
|
||||
EVP_EncodeFinal(ctx, (unsigned char*)(dest+len), &ret);
|
||||
ret += len;
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2670,21 +2687,26 @@ int
|
||||
base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
|
||||
{
|
||||
#ifdef USE_OPENSSL_BASE64
|
||||
EVP_ENCODE_CTX ctx;
|
||||
EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new();
|
||||
int len, ret;
|
||||
/* 64 bytes of input -> *up to* 48 bytes of output.
|
||||
Plus one more byte, in case I'm wrong.
|
||||
*/
|
||||
if (destlen < ((srclen/64)+1)*49)
|
||||
if (destlen < ((srclen/64)+1)*49) {
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return -1;
|
||||
if (destlen > SIZE_T_CEILING)
|
||||
}
|
||||
if (destlen > SIZE_T_CEILING) {
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
EVP_DecodeInit(&ctx);
|
||||
EVP_DecodeUpdate(&ctx, (unsigned char*)dest, &len,
|
||||
EVP_DecodeInit(ctx);
|
||||
EVP_DecodeUpdate(ctx, (unsigned char*)dest, &len,
|
||||
(unsigned char*)src, srclen);
|
||||
EVP_DecodeFinal(&ctx, (unsigned char*)dest, &ret);
|
||||
EVP_DecodeFinal(ctx, (unsigned char*)dest, &ret);
|
||||
ret += len;
|
||||
EVP_ENCODE_CTX_free(ctx);
|
||||
return ret;
|
||||
#else
|
||||
const char *eos = src+srclen;
|
||||
|
||||
+9
-60
@@ -8,6 +8,13 @@
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
// Ensure inet_pton is available
|
||||
#ifndef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0600
|
||||
#elif _WIN32_WINNT < 0x0600
|
||||
#undef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0600
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "onion_v3.h"
|
||||
@@ -116,12 +123,6 @@ bool DecodeBase32(const std::string& encoded, std::vector<unsigned char>& decode
|
||||
return true;
|
||||
}
|
||||
|
||||
// Legacy function for backward compatibility
|
||||
std::string EncodeBase32(const unsigned char* data, size_t len)
|
||||
{
|
||||
return EncodeBase32Proper(data, len);
|
||||
}
|
||||
|
||||
// CTorV3Service Implementation
|
||||
CTorV3Service::CTorV3Service() : port(19112), isActive(false)
|
||||
{
|
||||
@@ -1722,7 +1723,8 @@ bool CTorV3Manager::ConnectThroughSocks5Proxy(const std::string& onionAddr, int
|
||||
proxyAddr.sin_family = AF_INET;
|
||||
proxyAddr.sin_port = htons(proxyPort);
|
||||
|
||||
if (inet_pton(AF_INET, proxyHost.c_str(), &proxyAddr.sin_addr) <= 0) {
|
||||
proxyAddr.sin_addr.s_addr = inet_addr(proxyHost.c_str());
|
||||
if (proxyAddr.sin_addr.s_addr == INADDR_NONE) {
|
||||
printf("ERROR: Invalid SOCKS5 proxy IP address: %s\n", proxyHost.c_str());
|
||||
closesocket(hSocket);
|
||||
return false;
|
||||
@@ -2004,54 +2006,6 @@ void CTorV3Manager::RequestSeederListFromPeers()
|
||||
}
|
||||
}
|
||||
|
||||
void CTorV3Manager::HandleSeederListMessage(CNode* pfrom, const std::vector<std::string>& seederList)
|
||||
{
|
||||
printf("Received seeder list from %s with %d entries\n",
|
||||
pfrom->addr.ToString().c_str(), (int)seederList.size());
|
||||
|
||||
// Add new seeders to our known list
|
||||
std::set<std::string> newSeeders;
|
||||
|
||||
if (pwalletMain) {
|
||||
CWalletDB walletdb(pwalletMain->strWalletFile);
|
||||
|
||||
// Get existing seeders
|
||||
std::string existingList;
|
||||
walletdb.ReadSetting("known_seeders", existingList);
|
||||
|
||||
std::set<std::string> existing;
|
||||
std::stringstream ss(existingList);
|
||||
std::string seeder;
|
||||
while (std::getline(ss, seeder, ',')) {
|
||||
if (!seeder.empty()) {
|
||||
existing.insert(seeder);
|
||||
}
|
||||
}
|
||||
|
||||
// Add new seeders
|
||||
for (const std::string& newSeeder : seederList) {
|
||||
if (existing.find(newSeeder) == existing.end()) {
|
||||
existing.insert(newSeeder);
|
||||
newSeeders.insert(newSeeder);
|
||||
printf("Added new seeder: %s\n", newSeeder.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
// Save updated list
|
||||
std::string updatedList;
|
||||
for (const std::string& s : existing) {
|
||||
if (!updatedList.empty()) updatedList += ",";
|
||||
updatedList += s;
|
||||
}
|
||||
walletdb.WriteSetting("known_seeders", updatedList);
|
||||
}
|
||||
|
||||
// Auto-connect to new seeders
|
||||
for (const std::string& newSeeder : newSeeders) {
|
||||
ConnectToSeederNode(newSeeder);
|
||||
}
|
||||
}
|
||||
|
||||
void CTorV3Manager::BroadcastSeederList()
|
||||
{
|
||||
if (!torV3Config.enableSeederMode) return;
|
||||
@@ -2153,9 +2107,4 @@ bool InitTorV3()
|
||||
void ShutdownTorV3()
|
||||
{
|
||||
CTorV3Manager::GetInstance()->ShutdownTor();
|
||||
}
|
||||
|
||||
TorV3Config& GetTorV3Config()
|
||||
{
|
||||
return torV3Config;
|
||||
}
|
||||
+1
-1
@@ -60,7 +60,7 @@ public:
|
||||
// Ed25519 key management functions
|
||||
bool ValidateEd25519Keys(const unsigned char* privateKey, const unsigned char* publicKey);
|
||||
bool GenerateV3OnionAddress(const unsigned char* publicKey, std::string& address);
|
||||
bool ValidateOnionAddress(const std::string& address);
|
||||
static bool ValidateOnionAddress(const std::string& address);
|
||||
|
||||
// Key extraction and validation
|
||||
bool ExtractKeysFromHex(const std::string& privKeyHex, unsigned char* privKey, unsigned char* pubKey);
|
||||
|
||||
+19
-11
@@ -74,7 +74,7 @@
|
||||
#undef HAVE_SOCKETPAIR
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
#define HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H
|
||||
@@ -179,25 +179,25 @@
|
||||
#define SIZEOF_INT 4
|
||||
|
||||
/* The size of a `int16_t', as computed by sizeof. */
|
||||
#undef SIZEOF_INT16_T
|
||||
#define SIZEOF_INT16_T 2
|
||||
|
||||
/* The size of a `int32_t', as computed by sizeof. */
|
||||
#undef SIZEOF_INT32_T
|
||||
#define SIZEOF_INT32_T 4
|
||||
|
||||
/* The size of a `int64_t', as computed by sizeof. */
|
||||
#undef SIZEOF_INT64_T
|
||||
#define SIZEOF_INT64_T 8
|
||||
|
||||
/* The size of a `int8_t', as computed by sizeof. */
|
||||
#undef SIZEOF_INT8_T
|
||||
#define SIZEOF_INT8_T 1
|
||||
|
||||
/* The size of a `long', as computed by sizeof. */
|
||||
#define SIZEOF_LONG 4
|
||||
|
||||
/* The size of a `long long', as computed by sizeof. */
|
||||
#undef SIZEOF_LONG_LONG
|
||||
#define SIZEOF_LONG_LONG 8
|
||||
|
||||
/* The size of `pid_t', as computed by sizeof. */
|
||||
#define SIZEOF_PID_T 0
|
||||
#define SIZEOF_PID_T 4
|
||||
|
||||
/* The size of a `short', as computed by sizeof. */
|
||||
#define SIZEOF_SHORT 2
|
||||
@@ -206,25 +206,33 @@
|
||||
#define SIZEOF_TIME_T 4
|
||||
|
||||
/* The size of a `uint16_t', as computed by sizeof. */
|
||||
#undef SIZEOF_UINT16_T
|
||||
#define SIZEOF_UINT16_T 2
|
||||
|
||||
/* The size of a `uint32_t', as computed by sizeof. */
|
||||
#undef SIZEOF_UINT32_T
|
||||
#define SIZEOF_UINT32_T 4
|
||||
|
||||
/* The size of a `uint64_t', as computed by sizeof. */
|
||||
#undef SIZEOF_UINT64_T
|
||||
#define SIZEOF_UINT64_T 8
|
||||
|
||||
/* The size of a `uint8_t', as computed by sizeof. */
|
||||
#undef SIZEOF_UINT8_T
|
||||
#define SIZEOF_UINT8_T 1
|
||||
|
||||
/* The size of a `void *', as computed by sizeof. */
|
||||
#ifdef _WIN64
|
||||
#define SIZEOF_VOID_P 8
|
||||
#else
|
||||
#define SIZEOF_VOID_P 4
|
||||
#endif
|
||||
|
||||
/* The size of a `__int64', as computed by sizeof. */
|
||||
#define SIZEOF___INT64 8
|
||||
|
||||
/* The sizeof a size_t, as computed by sizeof. */
|
||||
#ifdef _WIN64
|
||||
#define SIZEOF_SIZE_T 8
|
||||
#else
|
||||
#define SIZEOF_SIZE_T 4
|
||||
#endif
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS
|
||||
|
||||
@@ -326,10 +326,8 @@ static inline const void* RAND_get_rand_method_compat(void) {
|
||||
|
||||
#endif // USING_LIBRESSL || USING_LIBRESSL_3X
|
||||
|
||||
// SHA compatibility for Tor v3 operations
|
||||
#if defined(USING_LIBRESSL) || defined(USING_LIBRESSL_3X)
|
||||
// SHA3-256 compatibility for Tor v3 operations (needed for all OpenSSL versions)
|
||||
|
||||
// Ensure SHA3 functions are available for v3 onion address generation
|
||||
#include <openssl/sha.h>
|
||||
|
||||
// SHA3-256 wrapper for onion address checksum calculation
|
||||
@@ -337,34 +335,34 @@ static inline int SHA3_256_compat(const unsigned char *data, size_t len, unsigne
|
||||
if (!data || !md) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
|
||||
if (!ctx) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
const EVP_MD *sha3_256 = EVP_sha3_256();
|
||||
if (!sha3_256) {
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (EVP_DigestInit_ex(ctx, sha3_256, NULL) != 1) {
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (EVP_DigestUpdate(ctx, data, len) != 1) {
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned int md_len;
|
||||
if (EVP_DigestFinal_ex(ctx, md, &md_len) != 1) {
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return (md_len == 32) ? 1 : 0; // SHA3-256 should produce 32 bytes
|
||||
}
|
||||
@@ -373,8 +371,6 @@ static inline int SHA3_256_compat(const unsigned char *data, size_t len, unsigne
|
||||
#define SHA3_256(data, len, md) SHA3_256_compat(data, len, md)
|
||||
#endif
|
||||
|
||||
#endif // USING_LIBRESSL || USING_LIBRESSL_3X
|
||||
|
||||
// Ed25519 compatibility for Tor v3 key generation
|
||||
#if defined(USING_LIBRESSL) || defined(USING_LIBRESSL_3X)
|
||||
|
||||
|
||||
+26
-26
@@ -32,6 +32,7 @@ using namespace std;
|
||||
using namespace boost;
|
||||
using namespace boost::asio;
|
||||
using namespace json_spirit;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
void ThreadRPCServer2(void* parg);
|
||||
|
||||
@@ -566,15 +567,14 @@ bool ClientAllowed(const boost::asio::ip::address& address)
|
||||
{
|
||||
// Make sure that IPv4-compatible and IPv4-mapped IPv6 addresses are treated as IPv4 addresses
|
||||
if (address.is_v6()
|
||||
&& (address.to_v6().is_v4_compatible()
|
||||
|| address.to_v6().is_v4_mapped()))
|
||||
return ClientAllowed(address.to_v6().to_v4());
|
||||
&& address.to_v6().is_v4_mapped())
|
||||
return ClientAllowed(make_address_v4(boost::asio::ip::v4_mapped, address.to_v6()));
|
||||
|
||||
if (address == asio::ip::address_v4::loopback()
|
||||
|| address == asio::ip::address_v6::loopback()
|
||||
|| (address.is_v4()
|
||||
// Check whether IPv4 addresses match 127.0.0.0/8 (loopback subnet)
|
||||
&& (address.to_v4().to_ulong() & 0xff000000) == 0x7f000000))
|
||||
&& (address.to_v4().to_uint() & 0xff000000) == 0x7f000000))
|
||||
return true;
|
||||
|
||||
const string strAddress = address.to_string();
|
||||
@@ -617,15 +617,15 @@ public:
|
||||
}
|
||||
bool connect(const std::string& server, const std::string& port)
|
||||
{
|
||||
ip::tcp::resolver resolver(stream.get_io_service());
|
||||
ip::tcp::resolver::query query(server.c_str(), port.c_str());
|
||||
ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
|
||||
ip::tcp::resolver::iterator end;
|
||||
ip::tcp::resolver resolver(stream.get_executor());
|
||||
auto results = resolver.resolve(server, port);
|
||||
boost::system::error_code error = asio::error::host_not_found;
|
||||
while (error && endpoint_iterator != end)
|
||||
for (const auto& ep : results)
|
||||
{
|
||||
stream.lowest_layer().close();
|
||||
stream.lowest_layer().connect(*endpoint_iterator++, error);
|
||||
stream.lowest_layer().connect(ep.endpoint(), error);
|
||||
if (!error)
|
||||
break;
|
||||
}
|
||||
if (error)
|
||||
return false;
|
||||
@@ -653,10 +653,10 @@ class AcceptedConnectionImpl : public AcceptedConnection
|
||||
{
|
||||
public:
|
||||
AcceptedConnectionImpl(
|
||||
asio::io_service& io_service,
|
||||
const boost::asio::any_io_executor& executor,
|
||||
ssl::context &context,
|
||||
bool fUseSSL) :
|
||||
sslStream(io_service, context),
|
||||
sslStream(executor, context),
|
||||
_d(sslStream, fUseSSL),
|
||||
_stream(_d)
|
||||
{
|
||||
@@ -723,7 +723,7 @@ static void RPCListen(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketA
|
||||
const bool fUseSSL)
|
||||
{
|
||||
// Accept connection
|
||||
AcceptedConnectionImpl<Protocol>* conn = new AcceptedConnectionImpl<Protocol>(acceptor->get_io_service(), context, fUseSSL);
|
||||
AcceptedConnectionImpl<Protocol>* conn = new AcceptedConnectionImpl<Protocol>(acceptor->get_executor(), context, fUseSSL);
|
||||
|
||||
acceptor->async_accept(
|
||||
conn->sslStream.lowest_layer(),
|
||||
@@ -817,25 +817,25 @@ void ThreadRPCServer2(void* parg)
|
||||
|
||||
const bool fUseSSL = GetBoolArg("-rpcssl");
|
||||
|
||||
asio::io_service io_service;
|
||||
asio::io_context io_service;
|
||||
|
||||
ssl::context context(io_service, ssl::context::sslv23);
|
||||
ssl::context context(ssl::context::sslv23);
|
||||
if (fUseSSL)
|
||||
{
|
||||
context.set_options(ssl::context::no_sslv2);
|
||||
|
||||
filesystem::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
||||
if (!pathCertFile.is_complete()) pathCertFile = filesystem::path(GetDataDir()) / pathCertFile;
|
||||
if (filesystem::exists(pathCertFile)) context.use_certificate_chain_file(pathCertFile.string());
|
||||
fs::path pathCertFile(GetArg("-rpcsslcertificatechainfile", "server.cert"));
|
||||
if (!pathCertFile.is_absolute()) pathCertFile = fs::path(GetDataDir()) / pathCertFile;
|
||||
if (fs::exists(pathCertFile)) context.use_certificate_chain_file(pathCertFile.string());
|
||||
else printf("ThreadRPCServer ERROR: missing server certificate file %s\n", pathCertFile.string().c_str());
|
||||
|
||||
filesystem::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
||||
if (!pathPKFile.is_complete()) pathPKFile = filesystem::path(GetDataDir()) / pathPKFile;
|
||||
if (filesystem::exists(pathPKFile)) context.use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
||||
fs::path pathPKFile(GetArg("-rpcsslprivatekeyfile", "server.pem"));
|
||||
if (!pathPKFile.is_absolute()) pathPKFile = fs::path(GetDataDir()) / pathPKFile;
|
||||
if (fs::exists(pathPKFile)) context.use_private_key_file(pathPKFile.string(), ssl::context::pem);
|
||||
else printf("ThreadRPCServer ERROR: missing server private key file %s\n", pathPKFile.string().c_str());
|
||||
|
||||
string strCiphers = GetArg("-rpcsslciphers", "TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH");
|
||||
SSL_CTX_set_cipher_list(context.impl(), strCiphers.c_str());
|
||||
SSL_CTX_set_cipher_list(context.native_handle(), strCiphers.c_str());
|
||||
}
|
||||
|
||||
// Try a dual IPv6/IPv4 socket, falling back to separate IPv4 and IPv6 sockets
|
||||
@@ -858,7 +858,7 @@ void ThreadRPCServer2(void* parg)
|
||||
acceptor->set_option(boost::asio::ip::v6_only(loopback), v6_only_error);
|
||||
|
||||
acceptor->bind(endpoint);
|
||||
acceptor->listen(socket_base::max_connections);
|
||||
acceptor->listen(socket_base::max_listen_connections);
|
||||
|
||||
RPCListen(acceptor, context, fUseSSL);
|
||||
// Cancel outstanding listen-requests for this acceptor when shutting down
|
||||
@@ -884,7 +884,7 @@ void ThreadRPCServer2(void* parg)
|
||||
acceptor->open(endpoint.protocol());
|
||||
acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
|
||||
acceptor->bind(endpoint);
|
||||
acceptor->listen(socket_base::max_connections);
|
||||
acceptor->listen(socket_base::max_listen_connections);
|
||||
|
||||
RPCListen(acceptor, context, fUseSSL);
|
||||
// Cancel outstanding listen-requests for this acceptor when shutting down
|
||||
@@ -1129,8 +1129,8 @@ Object CallRPC(const string& strMethod, const Array& params)
|
||||
|
||||
// Connect to localhost
|
||||
bool fUseSSL = GetBoolArg("-rpcssl");
|
||||
asio::io_service io_service;
|
||||
ssl::context context(io_service, ssl::context::sslv23);
|
||||
asio::io_context io_service;
|
||||
ssl::context context(ssl::context::sslv23);
|
||||
context.set_options(ssl::context::no_sslv2);
|
||||
asio::ssl::stream<asio::ip::tcp::socket> sslStream(io_service, context);
|
||||
SSLIOStreamDevice<asio::ip::tcp> d(sslStream, fUseSSL);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
leveldb::DB *txdb; // global pointer for LevelDB object instance
|
||||
|
||||
@@ -35,27 +36,27 @@ static leveldb::Options GetOptions() {
|
||||
|
||||
void init_blockindex(leveldb::Options& options, bool fRemoveOld = false) {
|
||||
// First time init.
|
||||
filesystem::path directory = GetDataDir() / "txleveldb";
|
||||
fs::path directory = GetDataDir() / "txleveldb";
|
||||
|
||||
if (fRemoveOld) {
|
||||
filesystem::remove_all(directory); // remove directory
|
||||
fs::remove_all(directory); // remove directory
|
||||
unsigned int nFile = 1;
|
||||
|
||||
while (true)
|
||||
{
|
||||
filesystem::path strBlockFile = GetDataDir() / strprintf("blk%04u.dat", nFile);
|
||||
fs::path strBlockFile = GetDataDir() / strprintf("blk%04u.dat", nFile);
|
||||
|
||||
// Break if no such file
|
||||
if( !filesystem::exists( strBlockFile ) )
|
||||
if( !fs::exists( strBlockFile ) )
|
||||
break;
|
||||
|
||||
filesystem::remove(strBlockFile);
|
||||
fs::remove(strBlockFile);
|
||||
|
||||
nFile++;
|
||||
}
|
||||
}
|
||||
|
||||
filesystem::create_directory(directory);
|
||||
fs::create_directory(directory);
|
||||
printf("Opening LevelDB in %s\n", directory.string().c_str());
|
||||
leveldb::Status status = leveldb::DB::Open(options, directory.string(), &txdb);
|
||||
if (!status.ok()) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
|
||||
#include <boost/signals2/last_value.hpp>
|
||||
#include <boost/signals2/signal.hpp>
|
||||
#include <boost/bind/bind.hpp>
|
||||
using namespace boost::placeholders;
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
+2
-2
@@ -1075,7 +1075,7 @@ const boost::filesystem::path &GetDataDir(bool fNetSpecific)
|
||||
boost::filesystem::path GetConfigFile()
|
||||
{
|
||||
boost::filesystem::path pathConfigFile(GetArg("-conf", "triangles.conf"));
|
||||
if (!pathConfigFile.is_complete()) pathConfigFile = GetDataDir(false) / pathConfigFile;
|
||||
if (!pathConfigFile.is_absolute()) pathConfigFile = GetDataDir(false) / pathConfigFile;
|
||||
return pathConfigFile;
|
||||
}
|
||||
|
||||
@@ -1106,7 +1106,7 @@ void ReadConfigFile(map<string, string>& mapSettingsRet,
|
||||
boost::filesystem::path GetPidFile()
|
||||
{
|
||||
boost::filesystem::path pathPidFile(GetArg("-pid", "trianglesd.pid"));
|
||||
if (!pathPidFile.is_complete()) pathPidFile = GetDataDir() / pathPidFile;
|
||||
if (!pathPidFile.is_absolute()) pathPidFile = GetDataDir() / pathPidFile;
|
||||
return pathPidFile;
|
||||
}
|
||||
|
||||
|
||||
+7
-6
@@ -10,6 +10,7 @@
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
|
||||
static uint64_t nAccountingEntryNumber = 0;
|
||||
@@ -608,20 +609,20 @@ bool BackupWallet(const CWallet& wallet, const string& strDest)
|
||||
bitdb.mapFileUseCount.erase(wallet.strWalletFile);
|
||||
|
||||
// Copy wallet.dat
|
||||
filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
||||
filesystem::path pathDest(strDest);
|
||||
if (filesystem::is_directory(pathDest))
|
||||
fs::path pathSrc = GetDataDir() / wallet.strWalletFile;
|
||||
fs::path pathDest(strDest);
|
||||
if (fs::is_directory(pathDest))
|
||||
pathDest /= wallet.strWalletFile;
|
||||
|
||||
try {
|
||||
#if BOOST_VERSION >= 104000
|
||||
filesystem::copy_file(pathSrc, pathDest, filesystem::copy_option::overwrite_if_exists);
|
||||
fs::copy_file(pathSrc, pathDest, fs::copy_options::overwrite_existing);
|
||||
#else
|
||||
filesystem::copy_file(pathSrc, pathDest);
|
||||
fs::copy_file(pathSrc, pathDest);
|
||||
#endif
|
||||
printf("copied wallet.dat to %s\n", pathDest.string().c_str());
|
||||
return true;
|
||||
} catch(const filesystem::filesystem_error &e) {
|
||||
} catch(const fs::filesystem_error &e) {
|
||||
printf("error copying wallet.dat to %s - %s\n", pathDest.string().c_str(), e.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
+7
-81
@@ -3,7 +3,7 @@ TARGET = triangles-qt
|
||||
|
||||
VERSION = 5.0.0.0
|
||||
INCLUDEPATH += src src/json src/qt src/qt/plugins/mrichtexteditor
|
||||
DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN __NO_SYSTEM_INCLUDES
|
||||
DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN BOOST_BIND_GLOBAL_PLACEHOLDERS __NO_SYSTEM_INCLUDES
|
||||
CONFIG += no_include_pwd
|
||||
CONFIG += thread
|
||||
|
||||
@@ -64,7 +64,7 @@ QMAKE_LFLAGS *= -fstack-protector-all --param ssp-buffer-size=1
|
||||
# This can be enabled for Windows, when we switch to MinGW >= 4.4.x.
|
||||
}
|
||||
# for extra security on Windows: enable ASLR and DEP via GCC linker flags
|
||||
win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static
|
||||
win32:QMAKE_LFLAGS *= -static
|
||||
win32:QMAKE_LFLAGS += -static-libgcc -static-libstdc++
|
||||
lessThan(QT_MAJOR_VERSION, 5): win32: QMAKE_LFLAGS *= -static
|
||||
|
||||
@@ -89,7 +89,7 @@ contains(USE_UPNP, -) {
|
||||
count(USE_UPNP, 0) {
|
||||
USE_UPNP=1
|
||||
}
|
||||
DEFINES += USE_UPNP=$$USE_UPNP STATICLIB
|
||||
DEFINES += USE_UPNP=$$USE_UPNP STATICLIB MINIUPNP_STATICLIB
|
||||
INCLUDEPATH += $$MINIUPNPC_INCLUDE_PATH
|
||||
LIBS += $$join(MINIUPNPC_LIB_PATH,,-L,) -lminiupnpc
|
||||
win32:LIBS += -liphlpapi
|
||||
@@ -312,83 +312,9 @@ SOURCES += src/qt/triangles.cpp src/qt/trianglesgui.cpp \
|
||||
src/qt/aboutdialog.cpp \
|
||||
src/qt/editaddressdialog.cpp \
|
||||
src/qt/trianglesaddressvalidator.cpp \
|
||||
src/tor/address.c \
|
||||
src/tor/addressmap.c \
|
||||
src/tor/aes.c \
|
||||
src/tor/backtrace.c \
|
||||
src/tor/buffers.c \
|
||||
src/tor/channel.c \
|
||||
src/tor/channeltls.c \
|
||||
src/tor/circpathbias.c \
|
||||
src/tor/circuitbuild.c \
|
||||
src/tor/circuitlist.c \
|
||||
src/tor/circuitmux.c \
|
||||
src/tor/circuitmux_ewma.c \
|
||||
src/tor/circuitstats.c \
|
||||
src/tor/circuituse.c \
|
||||
src/tor/command.c \
|
||||
src/tor/compat.c \
|
||||
src/tor/compat_libevent.c \
|
||||
src/tor/config.c \
|
||||
src/tor/config_codedigest.c \
|
||||
src/tor/confparse.c \
|
||||
src/tor/connection.c \
|
||||
src/tor/connection_edge.c \
|
||||
src/tor/connection_or.c \
|
||||
src/tor/container.c \
|
||||
src/tor/control.c \
|
||||
src/tor/cpuworker.c \
|
||||
src/tor/crypto.c \
|
||||
src/tor/crypto_curve25519.c \
|
||||
src/tor/crypto_format.c \
|
||||
src/tor/curve25519-donna.c \
|
||||
src/tor/di_ops.c \
|
||||
src/tor/directory.c \
|
||||
src/tor/dirserv.c \
|
||||
src/tor/dirvote.c \
|
||||
src/tor/dns.c \
|
||||
src/tor/dnsserv.c \
|
||||
src/tor/entrynodes.c \
|
||||
src/tor/ext_orport.c \
|
||||
src/tor/fp_pair.c \
|
||||
src/tor/geoip.c \
|
||||
src/tor/hibernate.c \
|
||||
src/tor/log.c \
|
||||
src/tor/memarea.c \
|
||||
src/tor/mempool.c \
|
||||
src/tor/microdesc.c \
|
||||
src/tor/networkstatus.c \
|
||||
src/tor/nodelist.c \
|
||||
src/tor/onion.c \
|
||||
src/tor/onion_fast.c \
|
||||
src/tor/onion_main.c \
|
||||
src/tor/onion_ntor.c \
|
||||
src/tor/onion_tap.c \
|
||||
src/tor/policies.c \
|
||||
# Old embedded Tor v2 client removed - incompatible with OpenSSL 3.x
|
||||
# Tor v3 onion services handled by onion_v3.cpp via external Tor/SOCKS5
|
||||
src/tor/anonymize.cpp \
|
||||
src/tor/procmon.c \
|
||||
src/tor/reasons.c \
|
||||
src/tor/relay.c \
|
||||
src/tor/rendclient.c \
|
||||
src/tor/rendcommon.c \
|
||||
src/tor/rendmid.c \
|
||||
src/tor/rendservice.c \
|
||||
src/tor/rephist.c \
|
||||
src/tor/replaycache.c \
|
||||
src/tor/router.c \
|
||||
src/tor/routerlist.c \
|
||||
src/tor/routerparse.c \
|
||||
src/tor/routerset.c \
|
||||
src/tor/sandbox.c \
|
||||
src/tor/statefile.c \
|
||||
src/tor/status.c \
|
||||
src/tor/strlcat.c \
|
||||
src/tor/strlcpy.c \
|
||||
src/tor/tor_util.c \
|
||||
src/tor/torgzip.c \
|
||||
src/tor/tortls.c \
|
||||
src/tor/transports.c \
|
||||
src/tor/util_codedigest.c \
|
||||
src/alert.cpp \
|
||||
src/version.cpp \
|
||||
src/sync.cpp \
|
||||
@@ -593,9 +519,9 @@ LIBS += $$join(BOOST_LIB_PATH,,-L,) \
|
||||
LIBS += -lssl -lcrypto -ldb_cxx$$BDB_LIB_SUFFIX
|
||||
LIBS += -levent -lz
|
||||
# -lgdi32 has to happen after -lcrypto (see #681)
|
||||
windows:LIBS += -lws2_32 -lshlwapi -lmswsock -lole32 -loleaut32 -luuid -lgdi32
|
||||
windows:LIBS += -lws2_32 -lshlwapi -lmswsock -lole32 -loleaut32 -luuid -lgdi32 -lcrypt32
|
||||
|
||||
LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
|
||||
LIBS += -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX
|
||||
windows:LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX
|
||||
|
||||
contains(RELEASE, 1) {
|
||||
|
||||
Reference in New Issue
Block a user