bool bp_key_secret_set(struct bp_key *key, const void *privkey_, size_t pk_len) { bp_key_free(key); if (!privkey_ || pk_len != 32) return false; const unsigned char *privkey = privkey_; BIGNUM *bn = BN_bin2bn(privkey, 32, BN_new()); if (!bn) return false; key->k = EC_KEY_new_by_curve_name(NID_secp256k1); if (!key->k) goto err_out; if (!EC_KEY_regenerate_key(key->k, bn)) goto err_out; if (!EC_KEY_check_key(key->k)) return false; EC_KEY_set_conv_form(key->k, POINT_CONVERSION_COMPRESSED); BN_clear_free(bn); return true; err_out: bp_key_free(key); BN_clear_free(bn); return false; }
void CECKey::SetSecretBytes(const unsigned char vch[32]) { BIGNUM bn; BN_init(&bn); assert(BN_bin2bn(vch, 32, &bn)); assert(EC_KEY_regenerate_key(pkey, &bn)); BN_clear_free(&bn); }
// BCPKI CKey CKey::GetDerivedKey(std::vector<unsigned char> ticket) const { BIGNUM *bn = BN_bin2bn(&ticket[0],ticket.size(),BN_new()); BN_CTX *ctx = NULL; if ((ctx = BN_CTX_new()) == NULL) throw key_error("CKey::DeriveKey() : BN_CTX_new failed"); CKey key; if (HasPrivKey()) { // privkey = privkey + ticket // snippet from ECDSA_SIG_recover_key_GFp // TODO check this again BIGNUM *order = NULL; if ((order = BN_new()) == NULL) throw key_error("CKey::DeriveKey() : BN_new failed"); // BN_CTX_start(ctx); //order = BN_CTX_get(ctx); if (!EC_GROUP_get_order(EC_KEY_get0_group(pkey), order, ctx)) throw key_error("CKey::DeriveKey() : EC_GROUP_get_order failed"); if (!BN_mod_add(bn, bn, EC_KEY_get0_private_key(pkey), order, ctx)) throw key_error("CKey::DeriveKey() : BN_mod_add failed"); if (!EC_KEY_regenerate_key(key.pkey,bn)) // sets private AND public key throw key_error("CKey::DeriveKey() : EC_KEY_regenerate_key failed"); // if (!EC_KEY_set_private_key(key.pkey, bn)) // throw key_error("CKey::DeriveKey() : EC_KEY_set_private_key failed"); if (!EC_KEY_check_key(key.pkey)) throw key_error("CKey::DeriveKey() : EC_KEY_check_key failed"); } else { // add to pub key // begin snippet from EC_KEY_regenerate_key EC_POINT *pub_key = NULL; const EC_GROUP *group = EC_KEY_get0_group(pkey); pub_key = EC_POINT_new(group); if (pub_key == NULL) throw key_error("CKey::DeriveKey() : EC_POINT_new failed"); if (!EC_POINT_mul(group, pub_key, bn, NULL, NULL, ctx)) throw key_error("CKey::DeriveKey() : EC_POINT_mul failed"); // end snippet from EC_KEY_regenerate_key // now pub_key = ticket * basepoint //const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *); //int EC_POINT_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *); if (!EC_POINT_add(group, pub_key, pub_key, EC_KEY_get0_public_key(pkey), ctx)) throw key_error("CKey::DeriveKey() : EC_POINT_add failed"); //int EC_KEY_set_public_key(EC_KEY *, const EC_POINT *); if (!EC_KEY_set_public_key(key.pkey, pub_key)) throw key_error("CKey::DeriveKey() : EC_KEY_set_public_key failed"); }; key.fSet = true; key.SetCompressedPubKey(); return key; };
void CECKey::SetSecretBytes(const unsigned char vch[32]) { bool ret; BIGNUM bn; BN_init(&bn); ret = BN_bin2bn(vch, 32, &bn) != NULL; assert(ret); ret = EC_KEY_regenerate_key(pkey, &bn) != 0; assert(ret); BN_clear_free(&bn); }
CSignerECDSA::CSignerECDSA(const uint8_t PrivData[32], unsigned char Signature[65]) { order.setuint256(g_Order); EC_KEY* pkey = EC_KEY_new_by_curve_name(NID_secp256k1); const EC_GROUP *group = EC_KEY_get0_group(pkey); CBigNum privkey; BN_bin2bn(PrivData, 32, &privkey); EC_KEY_regenerate_key(pkey, &privkey); EC_POINT *tmp_point = EC_POINT_new(group); EC_POINT *test_point = EC_POINT_new(group); CBigNum r, X, Y; bool which = false; do { // get random k do BN_rand_range(&kinv, &order); while (!kinv); /* We do not want timing information to leak the length of k, * so we compute G*k using an equivalent scalar of fixed * bit-length. */ kinv += order; if (BN_num_bits(&kinv) <= 256) kinv += order; // compute r the x-coordinate of generator * k EC_POINT_mul(group, tmp_point, &kinv, NULL, NULL, ctx); EC_POINT_get_affine_coordinates_GFp(group, tmp_point, &X, &Y, ctx); EC_POINT_set_compressed_coordinates_GFp(group, test_point, &X, 0, ctx); which = !!EC_POINT_cmp(group, tmp_point, test_point, ctx); BN_nnmod(&r, &X, &order, ctx); } while (!r); // compute the inverse of k BN_mod_inverse(&kinv, &kinv, &order, ctx); BN_mod_mul(&pmr, &privkey, &r, &order, ctx); BN_mod_mul(&prk, &pmr, &kinv, &order, ctx); memset(Signature, 0, 65); int nBitsR = BN_num_bits(&r); BN_bn2bin(&r, &Signature[33-(nBitsR+7)/8]); Signature[0] = 27 + which; EC_POINT_free(tmp_point); EC_POINT_free(test_point); EC_KEY_free(pkey); }
private_key private_key::regenerate( const fc::sha256& secret ) { private_key self; self.my->_key = EC_KEY_new_by_curve_name( NID_X9_62_prime256v1 ); if( !self.my->_key ) FC_THROW_EXCEPTION( exception, "Unable to generate EC key" ); ssl_bignum bn; BN_bin2bn( (const unsigned char*)&secret, 32, bn ); if( !EC_KEY_regenerate_key(self.my->_key,bn) ) { FC_THROW_EXCEPTION( exception, "unable to regenerate key" ); } return self; }
bool elliptic_curve_key::set_secret(const secret_parameter& secret, bool compressed) { key_ = EC_KEY_new_by_curve_name(NID_secp256k1); if (!key_) return false; BIGNUM *bignum = BN_bin2bn(secret.data(), secret.size(), BN_new()); if (!bignum) return false; if (!EC_KEY_regenerate_key(key_, bignum)) { BN_clear_free(bignum); return false; } BN_clear_free(bignum); if (compressed) use_compressed(); return true; }
bool CKey::SetSecret(const std::vector<unsigned char>& vch) { EC_KEY_free(pkey); pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (pkey == NULL) throw key_error("CKey::SetSecret() : EC_KEY_new_by_curve_name failed"); BIGNUM *bn = BN_bin2bn(&vch[0],vch.size(),BN_new()); if (bn == NULL) throw key_error("CKey::SetSecret() : BN_bin2bn failed"); if (!EC_KEY_regenerate_key(pkey,bn)) { BN_clear_free(bn); throw key_error("CKey::SetSecret() : EC_KEY_regenerate_key failed"); } BN_clear_free(bn); fSet = true; SetCompressedPubKey(); return true; }
bool CKey::SetSecret(const CSecret &vchSecret, bool fCompressed) { EC_KEY_free(pkey); pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (pkey == NULL) throw key_error("CKey::SetSecret() : EC_KEY_new_by_curve_name failed"); if (vchSecret.size() != 32) throw key_error("CKey::SetSecret() : secret must be 32 bytes"); BIGNUM *bn = BN_bin2bn(&vchSecret[0], 32, BN_new()); if (bn == NULL) throw key_error("CKey::SetSecret() : BN_bin2bn failed"); if (!EC_KEY_regenerate_key(pkey, bn)) { BN_clear_free(bn); throw key_error("CKey::SetSecret() : EC_KEY_regenerate_key failed"); } BN_clear_free(bn); fSet = true; if (fCompressed || fCompressedPubKey) SetCompressedPubKey(); return true; }