fix uninitialized variables in ecc::compact_signature (fc::array) and a few other places
This commit is contained in:
parent
61f84777c4
commit
fbadc5bdfa
5 changed files with 79 additions and 7 deletions
|
|
@ -29,6 +29,56 @@ namespace fc {
|
||||||
T data[N];
|
T data[N];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** provided for default 0 init */
|
||||||
|
template<size_t N>
|
||||||
|
class array<unsigned char,N>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef unsigned char T;
|
||||||
|
array(){ memset( data, 0, sizeof(data) ); }
|
||||||
|
/**
|
||||||
|
* Checked indexing (when in debug build) that also simplifies dereferencing
|
||||||
|
* when you have an array<T,N>*.
|
||||||
|
*/
|
||||||
|
///@{
|
||||||
|
T& at( size_t pos ) { assert( pos < N); return data[pos]; }
|
||||||
|
const T& at( size_t pos )const { assert( pos < N); return data[pos]; }
|
||||||
|
///@}
|
||||||
|
|
||||||
|
T* begin() { return &data[0]; }
|
||||||
|
const T* begin()const { return &data[0]; }
|
||||||
|
const T* end()const { return &data[N]; }
|
||||||
|
|
||||||
|
size_t size()const { return N; }
|
||||||
|
|
||||||
|
T data[N];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** provided for default 0 init */
|
||||||
|
template<size_t N>
|
||||||
|
class array<char,N>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef char T;
|
||||||
|
array(){ memset( data, 0, sizeof(data) ); }
|
||||||
|
/**
|
||||||
|
* Checked indexing (when in debug build) that also simplifies dereferencing
|
||||||
|
* when you have an array<T,N>*.
|
||||||
|
*/
|
||||||
|
///@{
|
||||||
|
T& at( size_t pos ) { assert( pos < N); return data[pos]; }
|
||||||
|
const T& at( size_t pos )const { assert( pos < N); return data[pos]; }
|
||||||
|
///@}
|
||||||
|
|
||||||
|
T* begin() { return &data[0]; }
|
||||||
|
const T* begin()const { return &data[0]; }
|
||||||
|
const T* end()const { return &data[N]; }
|
||||||
|
|
||||||
|
size_t size()const { return N; }
|
||||||
|
|
||||||
|
T data[N];
|
||||||
|
};
|
||||||
|
|
||||||
template<typename T, size_t N>
|
template<typename T, size_t N>
|
||||||
bool operator == ( const array<T,N>& a, const array<T,N>& b )
|
bool operator == ( const array<T,N>& a, const array<T,N>& b )
|
||||||
{ return 0 == memcmp( a.data, b.data, N*sizeof(T) ); }
|
{ return 0 == memcmp( a.data, b.data, N*sizeof(T) ); }
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,7 @@ namespace fc {
|
||||||
{
|
{
|
||||||
fc::raw::pack( s, pk.get_secret() );
|
fc::raw::pack( s, pk.get_secret() );
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace raw
|
} // namespace raw
|
||||||
|
|
||||||
} // namespace fc
|
} // namespace fc
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ struct ssl_wrapper
|
||||||
{
|
{
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
ssl_type* operator->() { return obj; }
|
||||||
|
|
||||||
ssl_type* obj;
|
ssl_type* obj;
|
||||||
};
|
};
|
||||||
|
|
@ -54,6 +55,7 @@ struct ssl_bignum
|
||||||
|
|
||||||
SSL_TYPE(ec_group, EC_GROUP, EC_GROUP_free)
|
SSL_TYPE(ec_group, EC_GROUP, EC_GROUP_free)
|
||||||
SSL_TYPE(ec_point, EC_POINT, EC_POINT_free)
|
SSL_TYPE(ec_point, EC_POINT, EC_POINT_free)
|
||||||
|
SSL_TYPE(ecdsa_sig, ECDSA_SIG, ECDSA_SIG_free)
|
||||||
SSL_TYPE(bn_ctx, BN_CTX, BN_CTX_free)
|
SSL_TYPE(bn_ctx, BN_CTX, BN_CTX_free)
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
|
|
@ -456,20 +458,23 @@ struct ssl_bignum
|
||||||
|
|
||||||
compact_signature private_key::sign_compact( const fc::sha256& digest )const
|
compact_signature private_key::sign_compact( const fc::sha256& digest )const
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
FC_ASSERT( my->_key != nullptr );
|
FC_ASSERT( my->_key != nullptr );
|
||||||
ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&digest, sizeof(digest), my->_key);
|
auto my_pub_key = get_public_key().serialize(); // just for good measure
|
||||||
|
//ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&digest, sizeof(digest), my->_key);
|
||||||
|
ecdsa_sig sig = ECDSA_do_sign((unsigned char*)&digest, sizeof(digest), my->_key);
|
||||||
|
|
||||||
if (sig==NULL)
|
if (sig==nullptr)
|
||||||
FC_THROW_EXCEPTION( exception, "Unable to sign" );
|
FC_THROW_EXCEPTION( exception, "Unable to sign" );
|
||||||
|
|
||||||
compact_signature csig;
|
compact_signature csig;
|
||||||
|
// memset( csig.data, 0, sizeof(csig) );
|
||||||
|
|
||||||
int nBitsR = BN_num_bits(sig->r);
|
int nBitsR = BN_num_bits(sig->r);
|
||||||
int nBitsS = BN_num_bits(sig->s);
|
int nBitsS = BN_num_bits(sig->s);
|
||||||
if (nBitsR <= 256 && nBitsS <= 256)
|
if (nBitsR <= 256 && nBitsS <= 256)
|
||||||
{
|
{
|
||||||
int nRecId = -1;
|
int nRecId = -1;
|
||||||
auto my_pub_key = get_public_key().serialize();
|
|
||||||
for (int i=0; i<4; i++)
|
for (int i=0; i<4; i++)
|
||||||
{
|
{
|
||||||
public_key keyRec;
|
public_key keyRec;
|
||||||
|
|
@ -487,14 +492,30 @@ struct ssl_bignum
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nRecId == -1)
|
if (nRecId == -1)
|
||||||
FC_THROW_EXCEPTION( exception, "unable to construct recoverable key");
|
{
|
||||||
|
FC_THROW_EXCEPTION( exception, "unable to construct recoverable key");
|
||||||
|
}
|
||||||
|
|
||||||
csig.data[0] = nRecId+27+4;//(fCompressedPubKey ? 4 : 0);
|
csig.data[0] = nRecId+27+4;//(fCompressedPubKey ? 4 : 0);
|
||||||
BN_bn2bin(sig->r,&csig.data[33-(nBitsR+7)/8]);
|
BN_bn2bin(sig->r,&csig.data[33-(nBitsR+7)/8]);
|
||||||
BN_bn2bin(sig->s,&csig.data[65-(nBitsS+7)/8]);
|
BN_bn2bin(sig->s,&csig.data[65-(nBitsS+7)/8]);
|
||||||
|
|
||||||
|
/*try {
|
||||||
|
auto pubk = public_key( csig, digest ).serialize();
|
||||||
|
FC_ASSERT( pubk == my_pub_key, "", ("pubk",pubk)("my_pub_key",my_pub_key)("private_key", *this) );
|
||||||
|
} catch ( fc::exception& e)
|
||||||
|
{
|
||||||
|
wlog( "${e}", ("e", e.to_detail_string() ) );
|
||||||
|
csig = sign_compact( digest );
|
||||||
|
elog( "it worked the second time!" );
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
ECDSA_SIG_free(sig);
|
// TODO: memory leak if exception thrown!
|
||||||
|
//ECDSA_SIG_free(sig);
|
||||||
return csig;
|
return csig;
|
||||||
|
} FC_RETHROW_EXCEPTIONS( warn, "sign ${digest}", ("digest", digest)("private_key",*this) );
|
||||||
}
|
}
|
||||||
|
|
||||||
private_key& private_key::operator=( private_key&& pk )
|
private_key& private_key::operator=( private_key&& pk )
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ namespace fc {
|
||||||
class logger::impl : public fc::retainable {
|
class logger::impl : public fc::retainable {
|
||||||
public:
|
public:
|
||||||
impl()
|
impl()
|
||||||
:_parent(nullptr),_enabled(true),_level(log_level::warn){}
|
:_parent(nullptr),_enabled(true),_additivity(false),_level(log_level::warn){}
|
||||||
fc::string _name;
|
fc::string _name;
|
||||||
logger _parent;
|
logger _parent;
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ namespace fc
|
||||||
}
|
}
|
||||||
|
|
||||||
while(i != sz.end()) {
|
while(i != sz.end()) {
|
||||||
unsigned int n;
|
unsigned int n = 0;
|
||||||
const char ch = *i;
|
const char ch = *i;
|
||||||
|
|
||||||
if(ch >= 'A' && ch <= 'Z') {
|
if(ch >= 'A' && ch <= 'Z') {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue