diff options
author | John Wiegley <johnw@newartisans.com> | 2023-11-22 16:47:21 -0800 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2024-08-05 08:35:56 -0700 |
commit | db0661dbb51e9082e47926c31e93bdc97b491bf9 (patch) | |
tree | e60f7dc32ebe9c24cb26eeb8c8438de7e891fe6b /src/post.cc | |
parent | e6dae78c033ea970a459b1a0ccc2f1310d1bff96 (diff) | |
download | fork-ledger-db0661dbb51e9082e47926c31e93bdc97b491bf9.tar.gz fork-ledger-db0661dbb51e9082e47926c31e93bdc97b491bf9.tar.bz2 fork-ledger-db0661dbb51e9082e47926c31e93bdc97b491bf9.zip |
Add support for hash chaining to detect modifications in postings
The following details of a posting contribute to its hash:
fullname of account
string representation of amount
Each posting hashes contributes to the transaction hash, which is compromised
of:
previous transaction’s hash (as encountered in parsing order)
actual date
optional auxiliary date
optional code
payee
hashes of all postings
Note that this means that changes in the “code” or any of the comments
Diffstat (limited to 'src/post.cc')
-rw-r--r-- | src/post.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/post.cc b/src/post.cc index e2063a36..9d799a9e 100644 --- a/src/post.cc +++ b/src/post.cc @@ -671,6 +671,30 @@ void post_t::set_reported_account(account_t * acct) acct->xdata().reported_posts.push_back(this); } +extern "C" unsigned char *SHA512( + void *data, unsigned int data_len, unsigned char *digest); + +namespace { + std::string bufferToHex(const unsigned char* buffer, std::size_t size) { + std::ostringstream oss; + oss << std::hex << std::setfill('0'); + for(std::size_t i = 0; i < size; ++i) + oss << std::setw(2) << static_cast<int>(buffer[i]); + return oss.str(); + } +} + +string post_t::hash(string nonce) const { + unsigned char data[128]; + std::ostringstream repr; + repr << nonce; + repr << account->fullname(); + repr << amount.to_string(); + string repr_str(repr.str()); + SHA512((void *)repr_str.c_str(), repr_str.length(), data); + return bufferToHex(data, 64 /*SHA512_DIGEST_LENGTH*/); +} + void extend_post(post_t& post, journal_t& journal) { commodity_t& comm(post.amount.commodity()); |