1
0
Fork 0
mirror of https://github.com/eosswedenorg/libantelope synced 2026-06-16 03:34:56 +02:00

include/libeosio/checksum.hpp: Use plain c-array instead of std::array

This commit is contained in:
Henrik Hautakoski 2023-03-27 15:20:10 +02:00
parent abecabba99
commit 33d3440f53
3 changed files with 36 additions and 27 deletions

View file

@ -26,7 +26,6 @@
#include <cstdint>
#include <cstring>
#include <array>
#include <libeosio/hash.hpp>
namespace libeosio {
@ -39,7 +38,7 @@ namespace libeosio {
/**
* Checksum datatype
*/
typedef std::array<unsigned char, CHECKSUM_SIZE> checksum_t;
typedef unsigned char checksum_t[CHECKSUM_SIZE];
/**
* Checksum template function.
@ -48,19 +47,18 @@ typedef std::array<unsigned char, CHECKSUM_SIZE> checksum_t;
* - F: Hash calculation function, should have the signature `T* F(const unsigned char *, std::size_t, T*)`
*/
template <typename T, T* (*F)(const unsigned char *, std::size_t, T*)>
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 <checksum_t (*F)(const unsigned char *, std::size_t)>
template <void (*F)(const unsigned char *, std::size_t, checksum_t)>
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);
}
/**

View file

@ -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<unsigned char> 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<unsigned char>& 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<unsigned char>& 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<unsigned char>& 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<unsigned char>& 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<unsigned char>& buf, ec_signature_t& sig) {
@ -103,10 +112,10 @@ bool sig_decoder_k1(const std::vector<unsigned char>& 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;
}

View file

@ -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<unsigned char>& 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;
}