/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: HashCash.cpp Date: 2022-9-18 Author: Reece ***/ #include #include "HashCash.hpp" namespace Aurora::Crypto::HashCash { AUKN_SYM bool CheckSalt(AuUInt64 token, AuUInt8 power, const HashCashAnswer &answer) { AuUInt8 count {}; AuArray hashBuffer; struct Hash { AuUInt64 token; AuUInt64 y; } hash; static_assert(sizeof(Hash) == 16); hash.token = token; hash.y = answer.y; AuHashing::RMD128(AuMemoryViewRead(&hash, 16), hashBuffer); AuBitScanForward(count, AuReadU64LE(hashBuffer.data(), 0)); return count == power; } AUKN_SYM HashCashAnswer FindAnswer(AuUInt64 token, AuUInt8 power) { HashCashAnswer answer; AuArray hashBuffer; struct Hash { AuUInt64 token; AuUInt64 y; } hash; static_assert(sizeof(Hash) == 16); hash.token = token; hash.y = AuRng::RngU64(); AuUInt8 count {}; do { hash.y++; AuHashing::RMD128(AuMemoryViewRead(&hash, 16), hashBuffer); } while (AuBitScanForward(count, AuReadU64LE(hashBuffer.data(), 0)), count != power); answer.y = hash.y; return answer; } }