From 9bff4d5a59792b196fed1228eef16496dae7c71b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Fri, 3 Jan 2025 19:19:57 +0100 Subject: [PATCH 1/2] Modernize `ByteType` usage and simplify read/write functions - Replaced `unsigned char` in `ByteType` concept with `uint8_t` for consistency. - Used a single `ByteType auto*` parameter to reduce template boilerplate, as suggested by Russ. - Replaced hardcoded `memcpy` lengths (2,4,8) with `sizeof(x)` and switched to `std::memcpy`. - Added `noexcept` to functions. - Used brace initialization instead of `=` for consistency. - Marked values in write methods as `const` to make explicit what is being written. Co-authored-by: Ryan Ofsky --- src/crypto/common.h | 74 +++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/src/crypto/common.h b/src/crypto/common.h index f151cbb625a..d2a42b8487e 100644 --- a/src/crypto/common.h +++ b/src/crypto/common.h @@ -13,96 +13,84 @@ #include template -concept ByteType = std::same_as || std::same_as; +concept ByteType = std::same_as || std::same_as; -template -inline uint16_t ReadLE16(const B* ptr) +uint16_t ReadLE16(const ByteType auto* ptr) noexcept { uint16_t x; - memcpy(&x, ptr, 2); + std::memcpy(&x, ptr, sizeof(x)); return le16toh_internal(x); } -template -inline uint32_t ReadLE32(const B* ptr) +uint32_t ReadLE32(const ByteType auto* ptr) noexcept { uint32_t x; - memcpy(&x, ptr, 4); + std::memcpy(&x, ptr, sizeof(x)); return le32toh_internal(x); } -template -inline uint64_t ReadLE64(const B* ptr) +uint64_t ReadLE64(const ByteType auto* ptr) noexcept { uint64_t x; - memcpy(&x, ptr, 8); + std::memcpy(&x, ptr, sizeof(x)); return le64toh_internal(x); } -template -inline void WriteLE16(B* ptr, uint16_t x) +void WriteLE16(ByteType auto* ptr, const uint16_t x) noexcept { - uint16_t v = htole16_internal(x); - memcpy(ptr, &v, 2); + const uint16_t v{htole16_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } -template -inline void WriteLE32(B* ptr, uint32_t x) +void WriteLE32(ByteType auto* ptr, const uint32_t x) noexcept { - uint32_t v = htole32_internal(x); - memcpy(ptr, &v, 4); + const uint32_t v{htole32_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } -template -inline void WriteLE64(B* ptr, uint64_t x) +void WriteLE64(ByteType auto* ptr, const uint64_t x) noexcept { - uint64_t v = htole64_internal(x); - memcpy(ptr, &v, 8); + const uint64_t v{htole64_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } -template -inline uint16_t ReadBE16(const B* ptr) +uint16_t ReadBE16(const ByteType auto* ptr) noexcept { uint16_t x; - memcpy(&x, ptr, 2); + std::memcpy(&x, ptr, sizeof(x)); return be16toh_internal(x); } -template -inline uint32_t ReadBE32(const B* ptr) +uint32_t ReadBE32(const ByteType auto* ptr) noexcept { uint32_t x; - memcpy(&x, ptr, 4); + std::memcpy(&x, ptr, sizeof(x)); return be32toh_internal(x); } -template -inline uint64_t ReadBE64(const B* ptr) +uint64_t ReadBE64(const ByteType auto* ptr) noexcept { uint64_t x; - memcpy(&x, ptr, 8); + std::memcpy(&x, ptr, sizeof(x)); return be64toh_internal(x); } -template -inline void WriteBE16(B* ptr, uint16_t x) +void WriteBE16(ByteType auto* ptr, const uint16_t x) noexcept { - uint16_t v = htobe16_internal(x); - memcpy(ptr, &v, 2); + const uint16_t v{htobe16_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } -template -inline void WriteBE32(B* ptr, uint32_t x) +void WriteBE32(ByteType auto* ptr, const uint32_t x) noexcept { - uint32_t v = htobe32_internal(x); - memcpy(ptr, &v, 4); + const uint32_t v{htobe32_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } -template -inline void WriteBE64(B* ptr, uint64_t x) +void WriteBE64(ByteType auto* ptr, const uint64_t x) noexcept { - uint64_t v = htobe64_internal(x); - memcpy(ptr, &v, 8); + const uint64_t v{htobe64_internal(x)}; + std::memcpy(ptr, &v, sizeof(v)); } #endif // BITCOIN_CRYPTO_COMMON_H From 9908ab0581ec7a873514a09edb27a7cbaba3611d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Fri, 3 Jan 2025 19:20:32 +0100 Subject: [PATCH 2/2] Use the new std::byte-enabled read/write methods --- src/crypto/chacha20.cpp | 6 +++--- src/crypto/chacha20poly1305.cpp | 4 ++-- src/random.h | 6 +++--- src/wallet/migrate.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/crypto/chacha20.cpp b/src/crypto/chacha20.cpp index e756e0431e2..b1bd3c54907 100644 --- a/src/crypto/chacha20.cpp +++ b/src/crypto/chacha20.cpp @@ -59,7 +59,7 @@ void ChaCha20Aligned::Seek(Nonce96 nonce, uint32_t block_counter) noexcept inline void ChaCha20Aligned::Keystream(Span output) noexcept { - unsigned char* c = UCharCast(output.data()); + std::byte* c = output.data(); size_t blocks = output.size() / BLOCKLEN; assert(blocks * BLOCKLEN == output.size()); @@ -161,8 +161,8 @@ inline void ChaCha20Aligned::Keystream(Span output) noexcept inline void ChaCha20Aligned::Crypt(Span in_bytes, Span out_bytes) noexcept { assert(in_bytes.size() == out_bytes.size()); - const unsigned char* m = UCharCast(in_bytes.data()); - unsigned char* c = UCharCast(out_bytes.data()); + const std::byte* m = in_bytes.data(); + std::byte* c = out_bytes.data(); size_t blocks = out_bytes.size() / BLOCKLEN; assert(blocks * BLOCKLEN == out_bytes.size()); diff --git a/src/crypto/chacha20poly1305.cpp b/src/crypto/chacha20poly1305.cpp index b969bb1a299..282f32a5e42 100644 --- a/src/crypto/chacha20poly1305.cpp +++ b/src/crypto/chacha20poly1305.cpp @@ -56,8 +56,8 @@ void ComputeTag(ChaCha20& chacha20, Span aad, Span= 8) { uint64_t gen = Impl().rand64(); - WriteLE64(UCharCast(span.data()), gen); + WriteLE64(span.data(), gen); span = span.subspan(8); } if (span.size() >= 4) { uint32_t gen = Impl().rand32(); - WriteLE32(UCharCast(span.data()), gen); + WriteLE32(span.data(), gen); span = span.subspan(4); } while (span.size()) { @@ -397,7 +397,7 @@ public: if (requires_seed) RandomSeed(); std::array buf; rng.Keystream(buf); - return ReadLE64(UCharCast(buf.data())); + return ReadLE64(buf.data()); } /** Fill a byte Span with random bytes. This overrides the RandomMixin version. */ diff --git a/src/wallet/migrate.cpp b/src/wallet/migrate.cpp index d7d85773743..d2c163027d2 100644 --- a/src/wallet/migrate.cpp +++ b/src/wallet/migrate.cpp @@ -603,7 +603,7 @@ void BerkeleyRODatabase::Open() // Read subdatabase page number // It is written as a big endian 32 bit number - uint32_t main_db_page = ReadBE32(UCharCast(std::get(page.records.at(1)).data.data())); + uint32_t main_db_page = ReadBE32(std::get(page.records.at(1)).data.data()); // The main database is in a page that doesn't exist if (main_db_page > outer_meta.last_page) {