From 4b2d221c05739755cb81c210ca886a2fe0fd4a71 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 27 Feb 2014 23:35:24 -0500 Subject: [PATCH] fix ecc point seralization --- include/fc/crypto/base58.hpp | 1 + include/fc/crypto/elliptic.hpp | 1 + src/crypto/elliptic.cpp | 24 +++++++++++++++--------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/fc/crypto/base58.hpp b/include/fc/crypto/base58.hpp index 63974d7..bfb77dc 100644 --- a/include/fc/crypto/base58.hpp +++ b/include/fc/crypto/base58.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include namespace fc { std::string to_base58( const char* d, size_t s ); diff --git a/include/fc/crypto/elliptic.hpp b/include/fc/crypto/elliptic.hpp index 6730a19..d507051 100644 --- a/include/fc/crypto/elliptic.hpp +++ b/include/fc/crypto/elliptic.hpp @@ -38,6 +38,7 @@ namespace fc { public_key( const public_key_data& v ); + public_key( const public_key_point_data& v ); public_key( const compact_signature& c, const fc::sha256& digest ); bool valid()const; diff --git a/src/crypto/elliptic.cpp b/src/crypto/elliptic.cpp index 1e85200..9654096 100644 --- a/src/crypto/elliptic.cpp +++ b/src/crypto/elliptic.cpp @@ -384,17 +384,10 @@ namespace fc { namespace ecc { { public_key_point_data dat; if( !my->_key ) return dat; - // EC_KEY_set_conv_form( my->_key, POINT_CONVERSION_COMPRESSED ); - // size_t nbytes = i2o_ECPublicKey( my->_key, nullptr ); - // assert( nbytes == 65 ) + EC_KEY_set_conv_form( my->_key, POINT_CONVERSION_UNCOMPRESSED ); char* front = &dat.data[0]; i2o_ECPublicKey( my->_key, (unsigned char**)&front ); return dat; - /* - EC_POINT* pub = EC_KEY_get0_public_key( my->_key ); - EC_GROUP* group = EC_KEY_get0_group( my->_key ); - EC_POINT_get_affine_coordinates_GFp( group, pub, self.my->_pub_x.get(), self.my->_pub_y.get(), nullptr ); - */ } public_key::public_key() @@ -403,6 +396,20 @@ namespace fc { namespace ecc { public_key::~public_key() { } + public_key::public_key( const public_key_point_data& dat ) + { + const char* front = &dat.data[0]; + if( *front == 0 ){} + else + { + /*my->_key = EC_KEY_new_by_curve_name( NID_secp256k1 ); */ + my->_key = o2i_ECPublicKey( &my->_key, (const unsigned char**)&front, sizeof(dat) ); + if( !my->_key ) + { + FC_THROW_EXCEPTION( exception, "error decoding public key", ("s", ERR_error_string( ERR_get_error(), nullptr) ) ); + } + } + } public_key::public_key( const public_key_data& dat ) { const char* front = &dat.data[0]; @@ -425,7 +432,6 @@ namespace fc { namespace ecc { public_key private_key::get_public_key()const { - public_key pub; pub.my->_key = EC_KEY_new_by_curve_name( NID_secp256k1 ); EC_KEY_set_public_key( pub.my->_key, EC_KEY_get0_public_key( my->_key ) );