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:
parent
abecabba99
commit
33d3440f53
3 changed files with 36 additions and 27 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue