Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
177bb90
Split ChaCha20 into aligned/unaligned variants
sipa Sep 21, 2022
c1a112c
Rename ChaCha20::Seek -> Seek64 to clarify multiple of 64
sipa Sep 21, 2022
4df2e75
Make unrestricted ChaCha20 cipher not waste keystream bytes
sipa Sep 21, 2022
68b4ceb
Add xoroshiro128++ PRNG
martinus Jun 10, 2022
0aaa05b
Add fuzz test for testing that ChaCha20 works as a stream
sipa Jun 13, 2022
adf9a38
Use ChaCha20 caching in FastRandomContext
sipa Sep 21, 2022
7380a6f
Use ChaCha20Aligned in MuHash3072 code
sipa Sep 21, 2022
6c249fc
Only support 32-byte keys in ChaCha20{,Aligned}
sipa Sep 21, 2022
14013ac
Inline ChaCha20 32-byte specific constants
sipa Sep 21, 2022
4d85d84
Improve test vectors for ChaCha20
sipa Sep 21, 2022
b809a95
Merge remote-tracking branch 'sipa/202209_chacha20' into bip324-ciphe…
dhruv Jan 11, 2023
8f0e926
RFC8439 nonce and counter for ChaCha20
dhruv May 10, 2022
efad5d7
RFC8439 implementation and tests
dhruv Jun 9, 2022
afe58e4
Adding forward secure FSChaCha20
dhruv Jun 9, 2022
372131a
BIP324 Cipher Suite
dhruv Jan 6, 2021
2112bed
Allow for RFC8439 AD in cipher suite interface
dhruv Aug 11, 2022
863cf15
Squashed 'src/secp256k1/' changes from 21ffe4b22a..19262492ef
dhruv Jan 13, 2023
3e3f47f
Merge commit '863cf15b37a9626a0a54f5ff5bbad0070d746ab8' into bip324-h…
dhruv Jan 13, 2023
19eb759
Merge branch 'bip324-cipher-suite' into bip324-handshake
dhruv Jan 13, 2023
581ba8f
Enable ECDH computation on secp256k1 keys
dhruv Jul 22, 2022
0014ae7
Bench test for ECDH
dhruv Jul 22, 2022
644f82e
Fuzz test for ECDH
dhruv Jul 22, 2022
3d06906
HKDF key derivation from ECDH secret for BIP324
dhruv Nov 16, 2021
8b9d5c6
Fuzz test for BIP324 key derivation
dhruv Nov 18, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2012,7 +2012,7 @@ LIBS_TEMP="$LIBS"
unset LIBS
LIBS="$LIBS_TEMP"

ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh"
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh --enable-experimental --enable-module-ellswift"
AC_CONFIG_SUBDIRS([src/secp256k1])

AC_OUTPUT
Expand Down
6 changes: 4 additions & 2 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -517,8 +517,8 @@ crypto_libbitcoin_crypto_base_la_LDFLAGS = $(AM_LDFLAGS) -static
crypto_libbitcoin_crypto_base_la_SOURCES = \
crypto/aes.cpp \
crypto/aes.h \
crypto/chacha_poly_aead.h \
crypto/chacha_poly_aead.cpp \
crypto/bip324_suite.h \
crypto/bip324_suite.cpp \
crypto/chacha20.h \
crypto/chacha20.cpp \
crypto/common.h \
Expand All @@ -532,6 +532,8 @@ crypto_libbitcoin_crypto_base_la_SOURCES = \
crypto/poly1305.cpp \
crypto/muhash.h \
crypto/muhash.cpp \
crypto/rfc8439.h \
crypto/rfc8439.cpp \
crypto/ripemd160.cpp \
crypto/ripemd160.h \
crypto/sha1.cpp \
Expand Down
4 changes: 3 additions & 1 deletion src/Makefile.bench.include
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@ bench_bench_bitcoin_SOURCES = \
bench/bench.cpp \
bench/bench.h \
bench/bench_bitcoin.cpp \
bench/bip324_ecdh.cpp \
bench/bip324_suite.cpp \
bench/block_assemble.cpp \
bench/ccoins_caching.cpp \
bench/chacha20.cpp \
bench/chacha_poly_aead.cpp \
bench/checkblock.cpp \
bench/checkqueue.cpp \
bench/crypto_hash.cpp \
Expand All @@ -43,6 +44,7 @@ bench_bench_bitcoin_SOURCES = \
bench/peer_eviction.cpp \
bench/poly1305.cpp \
bench/prevector.cpp \
bench/rfc8439.cpp \
bench/rollingbloom.cpp \
bench/rpc_blockchain.cpp \
bench/rpc_mempool.cpp \
Expand Down
6 changes: 4 additions & 2 deletions src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,8 @@ BITCOIN_TESTS =\
test/validation_flush_tests.cpp \
test/validation_tests.cpp \
test/validationinterface_tests.cpp \
test/versionbits_tests.cpp
test/versionbits_tests.cpp \
test/xoroshiro128plusplus_tests.cpp

if ENABLE_WALLET
BITCOIN_TESTS += \
Expand Down Expand Up @@ -252,12 +253,13 @@ test_fuzz_fuzz_SOURCES = \
test/fuzz/crypto.cpp \
test/fuzz/crypto_aes256.cpp \
test/fuzz/crypto_aes256cbc.cpp \
test/fuzz/crypto_bip324_suite.cpp \
test/fuzz/crypto_chacha20.cpp \
test/fuzz/crypto_chacha20_poly1305_aead.cpp \
test/fuzz/crypto_common.cpp \
test/fuzz/crypto_diff_fuzz_chacha20.cpp \
test/fuzz/crypto_hkdf_hmac_sha256_l32.cpp \
test/fuzz/crypto_poly1305.cpp \
test/fuzz/crypto_rfc8439.cpp \
test/fuzz/cuckoocache.cpp \
test/fuzz/decode_tx.cpp \
test/fuzz/descriptor_parse.cpp \
Expand Down
3 changes: 2 additions & 1 deletion src/Makefile.test_util.include
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ TEST_UTIL_H = \
test/util/str.h \
test/util/transaction_utils.h \
test/util/txmempool.h \
test/util/validation.h
test/util/validation.h \
test/util/xoroshiro128plusplus.h

if ENABLE_WALLET
TEST_UTIL_H += wallet/test/util.h
Expand Down
52 changes: 52 additions & 0 deletions src/bench/bip324_ecdh.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright (c) 2022 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <bench/bench.h>

#include <key.h>
#include <pubkey.h>
#include <random.h>
#include <secp256k1_ellswift.h>

#include <cstddef>

CKey GetRandomKey()
{
CKey key;
key.MakeNewKey(true);
return key;
}

int GetEll64(const CKey& key, unsigned char* ell64)
{
std::array<unsigned char, 32> rnd32;
GetRandBytes(rnd32);
return secp256k1_ellswift_create(secp256k1_context_static, ell64, reinterpret_cast<const unsigned char*>(key.data()), rnd32.data());
}

static void BIP324_ECDH(benchmark::Bench& bench)
{
ECC_Start();
auto our_key = GetRandomKey();
auto their_key = GetRandomKey();

unsigned char our_ell64[64], their_ell64[64];
if (!GetEll64(our_key, our_ell64)) {
assert(false);
}

if (!GetEll64(their_key, their_ell64)) {
assert(false);
}

bench.batch(1).unit("ecdh").run([&] {
assert(our_key.ComputeBIP324ECDHSecret({reinterpret_cast<std::byte*>(their_ell64), 64},
{reinterpret_cast<std::byte*>(our_ell64), 64},
true)
.has_value());
});
ECC_Stop();
}

BENCHMARK(BIP324_ECDH, benchmark::PriorityLevel::HIGH);
117 changes: 117 additions & 0 deletions src/bench/bip324_suite.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
// Copyright (c) 2019-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.


#include <assert.h>
#include <bench/bench.h>
#include <crypto/bip324_suite.h>
#include <crypto/rfc8439.h> // for the RFC8439_EXPANSION constant
#include <hash.h>

#include <array>
#include <cstddef>
#include <vector>

/* Number of bytes to process per iteration */
static constexpr uint64_t BUFFER_SIZE_TINY = 64;
static constexpr uint64_t BUFFER_SIZE_SMALL = 256;
static constexpr uint64_t BUFFER_SIZE_LARGE = 1024 * 1024;

static const std::vector<std::byte> zero_vec(BIP324_KEY_LEN, std::byte{0x00});

static void BIP324_CIPHER_SUITE(benchmark::Bench& bench, size_t contents_len, bool include_decryption)
{
BIP324Key zero_arr;
memcpy(zero_arr.data(), zero_vec.data(), BIP324_KEY_LEN);
BIP324CipherSuite enc{zero_arr, zero_arr};
BIP324CipherSuite dec{zero_arr, zero_arr};

auto packet_len = BIP324_LENGTH_FIELD_LEN + BIP324_HEADER_LEN + contents_len + RFC8439_EXPANSION;

std::vector<std::byte> in(contents_len, std::byte{0x00});
std::vector<std::byte> out(packet_len, std::byte{0x00});

BIP324HeaderFlags flags{BIP324_NONE};

bench.batch(contents_len).unit("byte").run([&] {
// encrypt or decrypt the buffer with a static key
const bool crypt_ok_1 = enc.Crypt({}, in, out, flags, true);
assert(crypt_ok_1);

if (include_decryption) {
// if we decrypt, we need to decrypt the length first
std::array<std::byte, BIP324_LENGTH_FIELD_LEN> encrypted_pkt_len;
memcpy(encrypted_pkt_len.data(), out.data(), BIP324_LENGTH_FIELD_LEN);
(void)dec.DecryptLength(encrypted_pkt_len);
const bool crypt_ok_2 = dec.Crypt({}, {out.data() + BIP324_LENGTH_FIELD_LEN, out.size() - BIP324_LENGTH_FIELD_LEN}, in, flags, false);
assert(crypt_ok_2);
}
});
}

static void BIP324_CIPHER_SUITE_64BYTES_ONLY_ENCRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_TINY, false);
}

static void BIP324_CIPHER_SUITE_256BYTES_ONLY_ENCRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_SMALL, false);
}

static void BIP324_CIPHER_SUITE_1MB_ONLY_ENCRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_LARGE, false);
}

static void BIP324_CIPHER_SUITE_64BYTES_ENCRYPT_DECRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_TINY, true);
}

static void BIP324_CIPHER_SUITE_256BYTES_ENCRYPT_DECRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_SMALL, true);
}

static void BIP324_CIPHER_SUITE_1MB_ENCRYPT_DECRYPT(benchmark::Bench& bench)
{
BIP324_CIPHER_SUITE(bench, BUFFER_SIZE_LARGE, true);
}

// Add Hash() (dbl-sha256) bench for comparison

static void HASH(benchmark::Bench& bench, size_t buffersize)
{
uint8_t hash[CHash256::OUTPUT_SIZE];
std::vector<uint8_t> in(buffersize, 0);
bench.batch(in.size()).unit("byte").run([&] {
CHash256().Write(in).Finalize(hash);
});
}

static void HASH_64BYTES(benchmark::Bench& bench)
{
HASH(bench, BUFFER_SIZE_TINY);
}

static void HASH_256BYTES(benchmark::Bench& bench)
{
HASH(bench, BUFFER_SIZE_SMALL);
}

static void HASH_1MB(benchmark::Bench& bench)
{
HASH(bench, BUFFER_SIZE_LARGE);
}

BENCHMARK(BIP324_CIPHER_SUITE_64BYTES_ONLY_ENCRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(BIP324_CIPHER_SUITE_256BYTES_ONLY_ENCRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(BIP324_CIPHER_SUITE_1MB_ONLY_ENCRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(BIP324_CIPHER_SUITE_64BYTES_ENCRYPT_DECRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(BIP324_CIPHER_SUITE_256BYTES_ENCRYPT_DECRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(BIP324_CIPHER_SUITE_1MB_ENCRYPT_DECRYPT, benchmark::PriorityLevel::HIGH);
BENCHMARK(HASH_64BYTES, benchmark::PriorityLevel::HIGH);
BENCHMARK(HASH_256BYTES, benchmark::PriorityLevel::HIGH);
BENCHMARK(HASH_1MB, benchmark::PriorityLevel::HIGH);
4 changes: 2 additions & 2 deletions src/bench/chacha20.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ static const uint64_t BUFFER_SIZE_LARGE = 1024*1024;
static void CHACHA20(benchmark::Bench& bench, size_t buffersize)
{
std::vector<uint8_t> key(32,0);
ChaCha20 ctx(key.data(), key.size());
ChaCha20 ctx(key.data());
ctx.SetIV(0);
ctx.Seek(0);
ctx.Seek64(0);
std::vector<uint8_t> in(buffersize,0);
std::vector<uint8_t> out(buffersize,0);
bench.batch(in.size()).unit("byte").run([&] {
Expand Down
126 changes: 0 additions & 126 deletions src/bench/chacha_poly_aead.cpp

This file was deleted.

Loading