diff --git a/include/libeosio/checksum.hpp b/include/libeosio/checksum.hpp index 6bedac9..376ca25 100644 --- a/include/libeosio/checksum.hpp +++ b/include/libeosio/checksum.hpp @@ -26,7 +26,6 @@ #include #include -#include #include namespace libeosio { @@ -39,7 +38,7 @@ namespace libeosio { /** * Checksum datatype */ -typedef std::array checksum_t; +typedef unsigned char checksum_t[CHECKSUM_SIZE]; /** * Checksum template function. @@ -48,19 +47,18 @@ typedef std::array checksum_t; * - F: Hash calculation function, should have the signature `T* F(const unsigned char *, std::size_t, T*)` */ template -inline checksum_t checksum(const unsigned char* data, std::size_t len) { - checksum_t crc; +inline void checksum(const unsigned char* data, std::size_t len, checksum_t crc) { T hash; F(data, len, &hash); - std::memcpy(crc.data(), &hash, crc.size()); - return crc; + std::memcpy(crc, &hash, CHECKSUM_SIZE); } -template +template inline bool checksum_validate(const unsigned char* data, std::size_t len) { - checksum_t check = F(data, len - CHECKSUM_SIZE); - return !memcmp(check.data(), data + (len - CHECKSUM_SIZE), CHECKSUM_SIZE); + checksum_t crc; + F(data, len - CHECKSUM_SIZE, crc); + return !memcmp(crc, data + (len - CHECKSUM_SIZE), CHECKSUM_SIZE); } /** diff --git a/src/wif/k1.cpp b/src/wif/k1.cpp index cb32283..fcabac5 100644 --- a/src/wif/k1.cpp +++ b/src/wif/k1.cpp @@ -33,28 +33,32 @@ namespace libeosio { namespace internal { // So this function is a quick hack to calculate it. // // Should implement and use Init/Update/Finalize hash functions to do it inplace. -checksum_t _checksum_suffix(const unsigned char *in, size_t size, const char *suffix) { +void _checksum_suffix(const unsigned char *in, size_t size, const char *suffix, checksum_t check) { std::vector buf(size + 2); memcpy(buf.data(), in, size); memcpy(buf.data() + size, suffix, 2); - return checksum_ripemd160(buf.data(), buf.size()); + return checksum_ripemd160(buf.data(), buf.size(), (unsigned char*) check); } void pub_encoder_k1(const ec_pubkey_t& key, unsigned char *buf) { - checksum_t check = _checksum_suffix(key.data(), EC_PUBKEY_SIZE, "K1"); + checksum_t check; + + _checksum_suffix(key.data(), EC_PUBKEY_SIZE, "K1", check); memcpy(buf, key.data(), EC_PUBKEY_SIZE); - memcpy(buf + EC_PUBKEY_SIZE, check.data(), check.size()); + memcpy(buf + EC_PUBKEY_SIZE, check, CHECKSUM_SIZE); } bool pub_decoder_k1(const std::vector& buf, ec_pubkey_t& key) { - checksum_t check = _checksum_suffix(buf.data(), EC_PUBKEY_SIZE, "K1"); + checksum_t check; - if (memcmp(buf.data() + EC_PUBKEY_SIZE, check.data(), CHECKSUM_SIZE)) { + _checksum_suffix(buf.data(), EC_PUBKEY_SIZE, "K1", check); + + if (memcmp(buf.data() + EC_PUBKEY_SIZE, check, CHECKSUM_SIZE)) { return false; } @@ -63,10 +67,12 @@ bool pub_decoder_k1(const std::vector& buf, ec_pubkey_t& key) { } size_t priv_encoder_k1(const ec_privkey_t& priv, unsigned char *buf) { - checksum_t check = _checksum_suffix(priv.data(), EC_PRIVKEY_SIZE, "K1"); + checksum_t check; + + _checksum_suffix(priv.data(), EC_PRIVKEY_SIZE, "K1", check); memcpy(buf, priv.data(), priv.size()); - memcpy(buf + EC_PRIVKEY_SIZE, check.data(), check.size()); + memcpy(buf + EC_PRIVKEY_SIZE, check, CHECKSUM_SIZE); return EC_PRIVKEY_SIZE + CHECKSUM_SIZE; } @@ -77,8 +83,9 @@ bool priv_decoder_k1(const std::vector& buf, ec_privkey_t& priv) return false; } - checksum_t check = _checksum_suffix(buf.data(), EC_PRIVKEY_SIZE, "K1"); - if (memcmp(buf.data() + EC_PRIVKEY_SIZE, check.data(), CHECKSUM_SIZE)) { + checksum_t check; + _checksum_suffix(buf.data(), EC_PRIVKEY_SIZE, "K1", check); + if (memcmp(buf.data() + EC_PRIVKEY_SIZE, check, CHECKSUM_SIZE)) { return false; } @@ -88,10 +95,12 @@ bool priv_decoder_k1(const std::vector& buf, ec_privkey_t& priv) void sig_encoder_k1(const ec_signature_t& sig, unsigned char *buf) { - checksum_t check = _checksum_suffix(sig.data(), EC_SIGNATURE_SIZE, "K1"); + checksum_t check; + + _checksum_suffix(sig.data(), EC_SIGNATURE_SIZE, "K1", check); memcpy(buf, sig.data(), sig.size()); - memcpy(buf + EC_SIGNATURE_SIZE, check.data(), check.size()); + memcpy(buf + EC_SIGNATURE_SIZE, check, CHECKSUM_SIZE); } bool sig_decoder_k1(const std::vector& buf, ec_signature_t& sig) { @@ -103,10 +112,10 @@ bool sig_decoder_k1(const std::vector& buf, ec_signature_t& sig) } // Calculate checksum - check = _checksum_suffix(buf.data(), EC_SIGNATURE_SIZE, "K1"); + _checksum_suffix(buf.data(), EC_SIGNATURE_SIZE, "K1", check); // And validate - if (memcmp(buf.data() + EC_SIGNATURE_SIZE, check.data(), CHECKSUM_SIZE)) { + if (memcmp(buf.data() + EC_SIGNATURE_SIZE, check, CHECKSUM_SIZE)) { return false; } diff --git a/src/wif/legacy.cpp b/src/wif/legacy.cpp index 96578e6..aca47a7 100644 --- a/src/wif/legacy.cpp +++ b/src/wif/legacy.cpp @@ -31,10 +31,12 @@ namespace libeosio { namespace internal { void pub_encoder_legacy(const ec_pubkey_t& key, unsigned char *buf) { - checksum_t check = checksum_ripemd160(key.data(), EC_PUBKEY_SIZE); + checksum_t check; + + checksum_ripemd160(key.data(), EC_PUBKEY_SIZE, check); memcpy(buf, key.data(), EC_PUBKEY_SIZE); - memcpy(buf + EC_PUBKEY_SIZE, check.data(), check.size()); + memcpy(buf + EC_PUBKEY_SIZE, check, CHECKSUM_SIZE); } bool pub_decoder_legacy(const std::vector& buf, ec_pubkey_t& key) { @@ -52,8 +54,8 @@ size_t priv_encoder_legacy(const ec_privkey_t& priv, unsigned char *buf) { buf[0] = PRIV_KEY_PREFIX; memcpy(buf + 1, priv.data(), EC_PRIVKEY_SIZE); - check = checksum_sha256d(buf, 1 + EC_PRIVKEY_SIZE); - memcpy(buf + 1 + EC_PRIVKEY_SIZE, check.data(), check.size()); + checksum_sha256d(buf, 1 + EC_PRIVKEY_SIZE, check); + memcpy(buf + 1 + EC_PRIVKEY_SIZE, check, CHECKSUM_SIZE); return 1 + EC_PRIVKEY_SIZE + CHECKSUM_SIZE; }