bool verify_data( const char* key, uint32_t key_size, uint32_t pe, const sha1& digest, const char* sig ) { RSA* pub = get_pub( key,key_size,pe); auto v = RSA_verify( NID_sha1, (const uint8_t*)digest.data(), 20, (uint8_t*)sig, key_size, pub ); RSA_free(pub); return 0 != v; }
signature private_key::sign( const sha1& digest )const { if( !my ) FC_THROW_EXCEPTION( assert_exception, "!null" ); signature sig; sig.resize( RSA_size(my->rsa) ); uint32_t slen = 0; if( 1 != RSA_sign( NID_sha1, (uint8_t*)digest.data(), 20, (unsigned char*)sig.data(), &slen, my->rsa ) ) { FC_THROW_EXCEPTION( exception, "rsa sign failed with ${message}", ("message",fc::string(ERR_error_string( ERR_get_error(),NULL))) ); } return sig; }
bool sign_data( const fc::vector<char>& key, uint32_t key_size, uint32_t pe, const sha1& digest, char* sig ) { RSA* priv = get_priv( key,key_size,pe); if( !priv ) { generic_exception g(fc::generic_exception("Error loading private key: " + fc::string(ERR_error_string( ERR_get_error(),NULL))) ); FC_THROW(g); } uint32_t slen = 0; if( 1 != RSA_sign( NID_sha1, (uint8_t*)digest.data(), sizeof(digest), (unsigned char*)sig, &slen, priv ) ) { RSA_free(priv); generic_exception g(fc::generic_exception("Error signing data: " + fc::string(ERR_error_string( ERR_get_error(),NULL))) ); FC_THROW(g); } RSA_free(priv); return true; }
sha1 operator << ( const sha1& h1, uint32_t i ) { sha1 result; fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); return result; }