std::vector<std::pair<arith_uint256, CDeterministicMNCPtr>> CDeterministicMNList::CalculateScores(const uint256& modifier) const { std::vector<std::pair<arith_uint256, CDeterministicMNCPtr>> scores; scores.reserve(GetAllMNsCount()); ForEachMN(true, [&](const CDeterministicMNCPtr& dmn) { if (dmn->pdmnState->confirmedHash.IsNull()) { // we only take confirmed MNs into account to avoid hash grinding on the ProRegTxHash to sneak MNs into a // future quorums return; } // calculate sha256(sha256(proTxHash, confirmedHash), modifier) per MN // Please note that this is not a double-sha256 but a single-sha256 // The first part is already precalculated (confirmedHashWithProRegTxHash) // TODO When https://github.com/bitcoin/bitcoin/pull/13191 gets backported, implement something that is similar but for single-sha256 uint256 h; CSHA256 sha256; sha256.Write(dmn->pdmnState->confirmedHashWithProRegTxHash.begin(), dmn->pdmnState->confirmedHashWithProRegTxHash.size()); sha256.Write(modifier.begin(), modifier.size()); sha256.Finalize(h.begin()); scores.emplace_back(UintToArith256(h), dmn); }); return scores; }
void RippleAddress::sign(uint256 const& message, Blob& retSignature) const { assert(vchData.size() == 64); const unsigned char *key = vchData.data(); retSignature.resize(crypto_sign_BYTES); crypto_sign_detached(&retSignature[0], NULL, (unsigned char*)message.begin(), message.size(), key); }
void PaysharesPrivateKey::sign(uint256 const& message, Blob& retSignature) const { unsigned char out[crypto_sign_BYTES + message.bytes]; unsigned long long len; const unsigned char *key = mPair.mPrivateKey.data(); // contrary to the docs it puts the signature in front crypto_sign(out, &len, (unsigned char*)message.begin(), message.size(), key); retSignature.resize(crypto_sign_BYTES); memcpy(&retSignature[0], out, crypto_sign_BYTES); }
ec_key ECDSAPrivateKey (uint256 const& serialized) { BIGNUM* bn = BN_bin2bn (serialized.begin(), serialized.size(), nullptr); if (bn == nullptr) { throw std::runtime_error ("ec_key::ec_key: BN_bin2bn failed"); } EC_KEY* key = new_initialized_EC_KEY(); const bool ok = EC_KEY_set_private_key (key, bn); BN_clear_free (bn); if (! ok) { EC_KEY_free (key); } return ec_key::acquire ((ec_key::pointer_t) key); }