Skip to content

Commit

Permalink
Merge pull request #4164 from kittywhiskers/auxprs
Browse files Browse the repository at this point in the history
  • Loading branch information
PastaPastaPasta committed May 21, 2021
2 parents 2f555f8 + 170551b commit b76e7fe
Show file tree
Hide file tree
Showing 47 changed files with 892 additions and 416 deletions.
2 changes: 2 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,8 @@ crypto_libdash_crypto_base_a_SOURCES = \
crypto/sha1.h \
crypto/sha256.cpp \
crypto/sha256.h \
crypto/sha3.cpp \
crypto/sha3.h \
crypto/sha512.cpp \
crypto/sha512.h

Expand Down
2 changes: 1 addition & 1 deletion src/bench/chacha_poly_aead.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ static void HASH(benchmark::State& state, size_t buffersize)
uint8_t hash[CHash256::OUTPUT_SIZE];
std::vector<uint8_t> in(buffersize,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(hash);
CHash256().Write(in).Finalize(hash);
}

static void HASH_64BYTES(benchmark::State& state)
Expand Down
26 changes: 18 additions & 8 deletions src/bench/crypto_hash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <crypto/ripemd160.h>
#include <crypto/sha1.h>
#include <crypto/sha256.h>
#include <crypto/sha3.h>
#include <crypto/sha512.h>

/* Number of bytes to hash per iteration */
Expand Down Expand Up @@ -43,6 +44,14 @@ static void HASH_SHA256(benchmark::State& state)
CSHA256().Write(in.data(), in.size()).Finalize(hash);
}

static void HASH_SHA3_256_1M(benchmark::State& state)
{
uint8_t hash[SHA3_256::OUTPUT_SIZE];
std::vector<uint8_t> in(BUFFER_SIZE,0);
while (state.KeepRunning())
SHA3_256().Write(in).Finalize(hash);
}

static void HASH_SHA256_0032b(benchmark::State& state)
{
std::vector<uint8_t> in(32,0);
Expand All @@ -58,14 +67,14 @@ static void HASH_DSHA256(benchmark::State& state)
uint8_t hash[CSHA256::OUTPUT_SIZE];
std::vector<uint8_t> in(BUFFER_SIZE,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(hash);
CHash256().Write(in).Finalize(hash);
}

static void HASH_DSHA256_0032b(benchmark::State& state)
{
std::vector<uint8_t> in(32,0);
while (state.KeepRunning()) {
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}
}

Expand Down Expand Up @@ -116,42 +125,42 @@ static void HASH_DSHA256_0032b_single(benchmark::State& state)
{
std::vector<uint8_t> in(32,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_DSHA256_0080b_single(benchmark::State& state)
{
std::vector<uint8_t> in(80,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_DSHA256_0128b_single(benchmark::State& state)
{
std::vector<uint8_t> in(128,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_DSHA256_0512b_single(benchmark::State& state)
{
std::vector<uint8_t> in(512,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_DSHA256_1024b_single(benchmark::State& state)
{
std::vector<uint8_t> in(1024,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_DSHA256_2048b_single(benchmark::State& state)
{
std::vector<uint8_t> in(2048,0);
while (state.KeepRunning())
CHash256().Write(in.data(), in.size()).Finalize(in.data());
CHash256().Write(in).Finalize(in);
}

static void HASH_X11(benchmark::State& state)
Expand Down Expand Up @@ -216,6 +225,7 @@ BENCHMARK(HASH_SHA256, 340);
BENCHMARK(HASH_DSHA256, 340);
BENCHMARK(HASH_SHA512, 330);
BENCHMARK(HASH_X11, 500);
BENCHMARK(HASH_SHA3_256_1M, 250);

BENCHMARK(HASH_SHA256_0032b, 4 * 1000 * 1000);
BENCHMARK(HASH_DSHA256_0032b, 2 * 1000 * 1000);
Expand Down
8 changes: 4 additions & 4 deletions src/blockfilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ uint256 BlockFilter::GetHash() const
const std::vector<unsigned char>& data = GetEncodedFilter();

uint256 result;
CHash256().Write(data.data(), data.size()).Finalize(result.begin());
CHash256().Write(data).Finalize(result);
return result;
}

Expand All @@ -254,8 +254,8 @@ uint256 BlockFilter::ComputeHeader(const uint256& prev_header) const

uint256 result;
CHash256()
.Write(filter_hash.begin(), filter_hash.size())
.Write(prev_header.begin(), prev_header.size())
.Finalize(result.begin());
.Write(filter_hash)
.Write(prev_header)
.Finalize(result);
return result;
}
2 changes: 1 addition & 1 deletion src/bls/bls.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ class CBLSWrapper
inline std::string ToString() const
{
std::vector<uint8_t> buf = ToByteVector();
return HexStr(buf.begin(), buf.end());
return HexStr(buf);
}
};

Expand Down
15 changes: 8 additions & 7 deletions src/core_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,14 @@ std::string FormatScript(const CScript& script)
}
}
if (vch.size() > 0) {
ret += strprintf("0x%x 0x%x ", HexStr(it2, it - vch.size()), HexStr(it - vch.size(), it));
ret += strprintf("0x%x 0x%x ", HexStr(std::vector<uint8_t>(it2, it - vch.size())),
HexStr(std::vector<uint8_t>(it - vch.size(), it)));
} else {
ret += strprintf("0x%x ", HexStr(it2, it));
ret += strprintf("0x%x ", HexStr(std::vector<uint8_t>(it2, it)));
}
continue;
}
ret += strprintf("0x%x ", HexStr(it2, script.end()));
ret += strprintf("0x%x ", HexStr(std::vector<uint8_t>(it2, script.end())));
break;
}
return ret.substr(0, ret.size() - 1);
Expand Down Expand Up @@ -133,7 +134,7 @@ std::string EncodeHexTx(const CTransaction& tx)
{
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << tx;
return HexStr(ssTx.begin(), ssTx.end());
return HexStr(ssTx);
}

void ScriptPubKeyToUniv(const CScript& scriptPubKey,
Expand All @@ -145,7 +146,7 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey,

out.pushKV("asm", ScriptToAsmStr(scriptPubKey));
if (fIncludeHex)
out.pushKV("hex", HexStr(scriptPubKey.begin(), scriptPubKey.end()));
out.pushKV("hex", HexStr(scriptPubKey));

if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
out.pushKV("type", GetTxnOutputType(type));
Expand Down Expand Up @@ -175,13 +176,13 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
for (const CTxIn& txin : tx.vin) {
UniValue in(UniValue::VOBJ);
if (tx.IsCoinBase())
in.pushKV("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
in.pushKV("coinbase", HexStr(txin.scriptSig));
else {
in.pushKV("txid", txin.prevout.hash.GetHex());
in.pushKV("vout", (int64_t)txin.prevout.n);
UniValue o(UniValue::VOBJ);
o.pushKV("asm", ScriptToAsmStr(txin.scriptSig, true));
o.pushKV("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end()));
o.pushKV("hex", HexStr(txin.scriptSig));
in.pushKV("scriptSig", o);

// Add address and value info if spentindex enabled
Expand Down
161 changes: 161 additions & 0 deletions src/crypto/sha3.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
// Copyright (c) 2020 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

// Based on https://github.com/mjosaarinen/tiny_sha3/blob/master/sha3.c
// by Markku-Juhani O. Saarinen <mjos@iki.fi>

#include <crypto/sha3.h>
#include <crypto/common.h>
#include <span.h>

#include <algorithm>
#include <array> // For std::begin and std::end.

#include <stdint.h>

// Internal implementation code.
namespace
{
uint64_t Rotl(uint64_t x, int n) { return (x << n) | (x >> (64 - n)); }
} // namespace

void KeccakF(uint64_t (&st)[25])
{
static constexpr uint64_t RNDC[24] = {
0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
};
static constexpr int ROUNDS = 24;

for (int round = 0; round < ROUNDS; ++round) {
uint64_t bc0, bc1, bc2, bc3, bc4, t;

// Theta
bc0 = st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20];
bc1 = st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21];
bc2 = st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22];
bc3 = st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23];
bc4 = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24];
t = bc4 ^ Rotl(bc1, 1); st[0] ^= t; st[5] ^= t; st[10] ^= t; st[15] ^= t; st[20] ^= t;
t = bc0 ^ Rotl(bc2, 1); st[1] ^= t; st[6] ^= t; st[11] ^= t; st[16] ^= t; st[21] ^= t;
t = bc1 ^ Rotl(bc3, 1); st[2] ^= t; st[7] ^= t; st[12] ^= t; st[17] ^= t; st[22] ^= t;
t = bc2 ^ Rotl(bc4, 1); st[3] ^= t; st[8] ^= t; st[13] ^= t; st[18] ^= t; st[23] ^= t;
t = bc3 ^ Rotl(bc0, 1); st[4] ^= t; st[9] ^= t; st[14] ^= t; st[19] ^= t; st[24] ^= t;

// Rho Pi
t = st[1];
bc0 = st[10]; st[10] = Rotl(t, 1); t = bc0;
bc0 = st[7]; st[7] = Rotl(t, 3); t = bc0;
bc0 = st[11]; st[11] = Rotl(t, 6); t = bc0;
bc0 = st[17]; st[17] = Rotl(t, 10); t = bc0;
bc0 = st[18]; st[18] = Rotl(t, 15); t = bc0;
bc0 = st[3]; st[3] = Rotl(t, 21); t = bc0;
bc0 = st[5]; st[5] = Rotl(t, 28); t = bc0;
bc0 = st[16]; st[16] = Rotl(t, 36); t = bc0;
bc0 = st[8]; st[8] = Rotl(t, 45); t = bc0;
bc0 = st[21]; st[21] = Rotl(t, 55); t = bc0;
bc0 = st[24]; st[24] = Rotl(t, 2); t = bc0;
bc0 = st[4]; st[4] = Rotl(t, 14); t = bc0;
bc0 = st[15]; st[15] = Rotl(t, 27); t = bc0;
bc0 = st[23]; st[23] = Rotl(t, 41); t = bc0;
bc0 = st[19]; st[19] = Rotl(t, 56); t = bc0;
bc0 = st[13]; st[13] = Rotl(t, 8); t = bc0;
bc0 = st[12]; st[12] = Rotl(t, 25); t = bc0;
bc0 = st[2]; st[2] = Rotl(t, 43); t = bc0;
bc0 = st[20]; st[20] = Rotl(t, 62); t = bc0;
bc0 = st[14]; st[14] = Rotl(t, 18); t = bc0;
bc0 = st[22]; st[22] = Rotl(t, 39); t = bc0;
bc0 = st[9]; st[9] = Rotl(t, 61); t = bc0;
bc0 = st[6]; st[6] = Rotl(t, 20); t = bc0;
st[1] = Rotl(t, 44);

// Chi Iota
bc0 = st[0]; bc1 = st[1]; bc2 = st[2]; bc3 = st[3]; bc4 = st[4];
st[0] = bc0 ^ (~bc1 & bc2) ^ RNDC[round];
st[1] = bc1 ^ (~bc2 & bc3);
st[2] = bc2 ^ (~bc3 & bc4);
st[3] = bc3 ^ (~bc4 & bc0);
st[4] = bc4 ^ (~bc0 & bc1);
bc0 = st[5]; bc1 = st[6]; bc2 = st[7]; bc3 = st[8]; bc4 = st[9];
st[5] = bc0 ^ (~bc1 & bc2);
st[6] = bc1 ^ (~bc2 & bc3);
st[7] = bc2 ^ (~bc3 & bc4);
st[8] = bc3 ^ (~bc4 & bc0);
st[9] = bc4 ^ (~bc0 & bc1);
bc0 = st[10]; bc1 = st[11]; bc2 = st[12]; bc3 = st[13]; bc4 = st[14];
st[10] = bc0 ^ (~bc1 & bc2);
st[11] = bc1 ^ (~bc2 & bc3);
st[12] = bc2 ^ (~bc3 & bc4);
st[13] = bc3 ^ (~bc4 & bc0);
st[14] = bc4 ^ (~bc0 & bc1);
bc0 = st[15]; bc1 = st[16]; bc2 = st[17]; bc3 = st[18]; bc4 = st[19];
st[15] = bc0 ^ (~bc1 & bc2);
st[16] = bc1 ^ (~bc2 & bc3);
st[17] = bc2 ^ (~bc3 & bc4);
st[18] = bc3 ^ (~bc4 & bc0);
st[19] = bc4 ^ (~bc0 & bc1);
bc0 = st[20]; bc1 = st[21]; bc2 = st[22]; bc3 = st[23]; bc4 = st[24];
st[20] = bc0 ^ (~bc1 & bc2);
st[21] = bc1 ^ (~bc2 & bc3);
st[22] = bc2 ^ (~bc3 & bc4);
st[23] = bc3 ^ (~bc4 & bc0);
st[24] = bc4 ^ (~bc0 & bc1);
}
}

SHA3_256& SHA3_256::Write(Span<const unsigned char> data)
{
if (m_bufsize && m_bufsize + data.size() >= sizeof(m_buffer)) {
// Fill the buffer and process it.
std::copy(data.begin(), data.begin() + sizeof(m_buffer) - m_bufsize, m_buffer + m_bufsize);
data = data.subspan(sizeof(m_buffer) - m_bufsize);
m_state[m_pos++] ^= ReadLE64(m_buffer);
m_bufsize = 0;
if (m_pos == RATE_BUFFERS) {
KeccakF(m_state);
m_pos = 0;
}
}
while (data.size() >= sizeof(m_buffer)) {
// Process chunks directly from the buffer.
m_state[m_pos++] ^= ReadLE64(data.data());
data = data.subspan(8);
if (m_pos == RATE_BUFFERS) {
KeccakF(m_state);
m_pos = 0;
}
}
if (data.size()) {
// Keep the remainder in the buffer.
std::copy(data.begin(), data.end(), m_buffer + m_bufsize);
m_bufsize += data.size();
}
return *this;
}

SHA3_256& SHA3_256::Finalize(Span<unsigned char> output)
{
assert(output.size() == OUTPUT_SIZE);
std::fill(m_buffer + m_bufsize, m_buffer + sizeof(m_buffer), 0);
m_buffer[m_bufsize] ^= 0x06;
m_state[m_pos] ^= ReadLE64(m_buffer);
m_state[RATE_BUFFERS - 1] ^= 0x8000000000000000;
KeccakF(m_state);
for (unsigned i = 0; i < 4; ++i) {
WriteLE64(output.data() + 8 * i, m_state[i]);
}
return *this;
}

SHA3_256& SHA3_256::Reset()
{
m_bufsize = 0;
m_pos = 0;
std::fill(std::begin(m_state), std::end(m_state), 0);
return *this;
}
Loading

0 comments on commit b76e7fe

Please sign in to comment.