fix uninitialized variables in ecc::compact_signature (fc::array) and a few other places

This commit is contained in:
Daniel Larimer 2013-08-02 14:32:59 -04:00
parent 61f84777c4
commit fbadc5bdfa
5 changed files with 79 additions and 7 deletions

View file

@ -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) ); }

View file

@ -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

View file

@ -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 )

View file

@ -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;

View file

@ -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') {