From 2251d0f2417cf716c6e0bea8e0a98909dbea2d59 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Mon, 2 Jun 2014 13:32:16 -0400 Subject: [PATCH 1/3] Fix bigint on conversions to and from 64-bit integers on 32-bit platforms Fixes BitShares/bitshares_toolkit#150 --- include/fc/crypto/bigint.hpp | 2 +- src/crypto/bigint.cpp | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/include/fc/crypto/bigint.hpp b/include/fc/crypto/bigint.hpp index e4fdd8b..debc869 100644 --- a/include/fc/crypto/bigint.hpp +++ b/include/fc/crypto/bigint.hpp @@ -11,7 +11,7 @@ namespace fc { public: bigint( const std::vector& bige ); bigint( const char* bige, uint32_t l ); - bigint( unsigned long i ); + bigint(uint64_t value); bigint( ); bigint( const bigint& c ); bigint( bigint&& c ); diff --git a/src/crypto/bigint.cpp b/src/crypto/bigint.cpp index 0682992..e26b2c9 100644 --- a/src/crypto/bigint.cpp +++ b/src/crypto/bigint.cpp @@ -6,6 +6,16 @@ #include +#ifdef _MSC_VER +# include +# define bswap_64(x) _byteswap_uint64(x) +#elif defined(__APPLE__) +# include +# define bswap_64(x) OSSwapInt64(x) +#else +# include +#endif + namespace fc { bigint::bigint( const char* bige, uint32_t l ) { n = BN_bin2bn( (const unsigned char*)bige, l, NULL ); @@ -28,9 +38,10 @@ namespace fc { return BN_dup( n ); } - bigint::bigint( unsigned long i ) - :n(BN_new()) { - BN_set_word( n, i ); + bigint::bigint(uint64_t value) + { + uint64_t big_endian_value = bswap_64(value); + n = BN_bin2bn((const unsigned char*)&big_endian_value, sizeof(big_endian_value), NULL); } bigint::bigint( const bigint& c ) { @@ -47,7 +58,15 @@ namespace fc { } bool bigint::is_negative()const { return BN_is_negative(n); } - int64_t bigint::to_int64()const { return BN_get_word(n); } + + int64_t bigint::to_int64() const + { + FC_ASSERT(BN_num_bits(n) <= 63); + size_t size = BN_num_bytes(n); + uint64_t abs_value = 0; + BN_bn2bin(n, (unsigned char*)&abs_value + (sizeof(uint64_t) - size)); + return BN_is_negative(n) ? -bswap_64(abs_value) : bswap_64(abs_value); + } int64_t bigint::log2()const { return BN_num_bits(n); } bool bigint::operator < ( const bigint& c )const { From 222092012681f1dd4e3290360afe41be30c427f1 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Mon, 2 Jun 2014 17:19:36 -0400 Subject: [PATCH 2/3] Fix signed bigint conversion (probably never used) --- src/crypto/bigint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/bigint.cpp b/src/crypto/bigint.cpp index e26b2c9..b76ba92 100644 --- a/src/crypto/bigint.cpp +++ b/src/crypto/bigint.cpp @@ -65,7 +65,7 @@ namespace fc { size_t size = BN_num_bytes(n); uint64_t abs_value = 0; BN_bn2bin(n, (unsigned char*)&abs_value + (sizeof(uint64_t) - size)); - return BN_is_negative(n) ? -bswap_64(abs_value) : bswap_64(abs_value); + return BN_is_negative(n) ? -(int64_t)bswap_64(abs_value) : bswap_64(abs_value); } int64_t bigint::log2()const { return BN_num_bits(n); } From 285913bce0c97d6036d7f2975836b3e209053f18 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Mon, 2 Jun 2014 21:05:04 -0400 Subject: [PATCH 3/3] some compilers need more space --- include/fc/network/tcp_socket.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/fc/network/tcp_socket.hpp b/include/fc/network/tcp_socket.hpp index 2fd235e..f9dbce0 100644 --- a/include/fc/network/tcp_socket.hpp +++ b/include/fc/network/tcp_socket.hpp @@ -49,7 +49,7 @@ namespace fc { friend class tcp_server; class impl; #ifdef _WIN64 - fc::fwd my; + fc::fwd my; #else fc::fwd my; #endif