bool decode_addr(std::string addr, uint64_t& tag, std::string& data) { std::string addr_data; bool r = decode(addr, addr_data); if (!r) return false; if (addr_data.size() <= addr_checksum_size) return false; std::string checksum(addr_checksum_size, '\0'); checksum = addr_data.substr(addr_data.size() - addr_checksum_size); addr_data.resize(addr_data.size() - addr_checksum_size); char hash[200]; keccak1600((const uint8_t*)addr_data.data(), addr_data.size(), (uint8_t*)hash); std::string expected_checksum(reinterpret_cast<const char*>(&hash), addr_checksum_size); if (expected_checksum != checksum) return false; int read = tools::read_varint(addr_data.begin(), addr_data.end(), tag); if (read <= 0) return false; data = addr_data.substr(read); return true; }
void hash_process(union hash_state *state, const uint8_t *buf, size_t count) { keccak1600(buf, count, (uint8_t*)state); }