long_hash hmac_sha512_hash(const data_chunk& chunk, const data_chunk& key) { long_hash hash; HMACSHA512(chunk.data(), chunk.size(), key.data(), key.size(), hash.data()); return hash; }
hash_digest sha256_hash(const data_chunk& first_chunk, const data_chunk& second_chunk) { hash_digest hash; SHA256CTX context; SHA256Init(&context); SHA256Update(&context, first_chunk.data(), first_chunk.size()); SHA256Update(&context, second_chunk.data(), second_chunk.size()); SHA256Final(&context, hash.data()); return hash; }
long_hash single_sha512_hash(const data_chunk& chunk) { long_hash digest; SHA512_CTX ctx; SHA512_Init(&ctx); SHA512_Update(&ctx, chunk.data(), chunk.size()); SHA512_Final(digest.data(), &ctx); return digest; }
short_hash bitcoin_short_hash(const data_chunk& chunk) { hash_digest sha_hash; SHA256__(chunk.data(), chunk.size(), sha_hash.data()); short_hash ripemd_hash; RMD160(sha_hash.data(), sha_hash.size(), ripemd_hash.data()); return ripemd_hash; }
bool elliptic_curve_key::verify(hash_digest hash, const data_chunk& signature) { BITCOIN_ASSERT(key_ != nullptr); // SSL likes a reversed hash std::reverse(hash.begin(), hash.end()); // -1 = error, 0 = bad sig, 1 = good if (ECDSA_verify(0, hash.data(), hash.size(), signature.data(), signature.size(), key_) == 1) return true; return false; }
bool elliptic_curve_key::set_public_key(const data_chunk& pubkey) { if (!initialize()) return false; const unsigned char* pubkey_bytes = pubkey.data(); if (!o2i_ECPublicKey(&key_, &pubkey_bytes, pubkey.size())) return false; if (pubkey.size() == 33) use_compressed(); return true; }
bool verify_signature(const ec_point& public_key, hash_digest hash, const data_chunk& signature) { std::reverse(hash.begin(), hash.end()); init.init(); return 1 == secp256k1_ecdsa_verify( hash.data(), hash.size(), signature.data(), signature.size(), public_key.data(), public_key.size() ); }
hash_digest bitcoin_hash(const data_chunk& chunk) { hash_digest first_hash; SHA256__(chunk.data(), chunk.size(), first_hash.data()); hash_digest second_hash; SHA256__(first_hash.data(), first_hash.size(), second_hash.data()); // The hash is in the reverse of the expected order. std::reverse(second_hash.begin(), second_hash.end()); return second_hash; }
long_hash sha512_hash(const data_chunk& chunk) { long_hash hash; SHA512__(chunk.data(), chunk.size(), hash.data()); return hash; }
hash_digest sha256_hash(const data_chunk& chunk) { hash_digest hash; SHA256__(chunk.data(), chunk.size(), hash.data()); return hash; }
short_hash sha1_hash(const data_chunk& chunk) { short_hash hash; SHA1(chunk.data(), chunk.size(), hash.data()); return hash; }
short_hash ripemd160_hash(const data_chunk& chunk) { short_hash hash; RMD160(chunk.data(), chunk.size(), hash.data()); return hash; }