feat: Made sum hash calculation more useful
This commit is contained in:
parent
03beca1099
commit
ee3d6ec24b
@ -16,6 +16,8 @@
|
||||
"hex.hashes.hash.common.salt": "Salt",
|
||||
"hex.hashes.hash.common.security_level": "Sicherheitsstufe",
|
||||
"hex.hashes.hash.common.size": "Grösse",
|
||||
"hex.hashes.hash.common.input_size": "Input Grösse",
|
||||
"hex.hashes.hash.common.output_size": "Output Grösse",
|
||||
"hex.hashes.hash.common.standard": "Standart",
|
||||
"hex.hashes.hash.common.standard.custom": "Benutzerdefiniert",
|
||||
"hex.hashes.hash.common.xor_out": "XOR Out",
|
||||
@ -27,6 +29,8 @@
|
||||
"hex.hashes.view.hashes.remove": "Hash entfernen",
|
||||
"hex.hashes.view.hashes.table.name": "Name",
|
||||
"hex.hashes.view.hashes.table.result": "Resultat",
|
||||
"hex.hashes.view.hashes.table.type": "Typ"
|
||||
"hex.hashes.view.hashes.table.type": "Typ",
|
||||
"hex.hashes.hash.sum": "Summe",
|
||||
"hex.hashes.hash.sum.fold": "Resultat zusammenfalten"
|
||||
}
|
||||
}
|
@ -20,6 +20,8 @@
|
||||
"hex.hashes.hash.common.key": "Key",
|
||||
"hex.hashes.hash.common.security_level": "Security Level",
|
||||
"hex.hashes.hash.common.size": "Hash Size",
|
||||
"hex.hashes.hash.common.input_size": "Input Size",
|
||||
"hex.hashes.hash.common.output_size": "Output Size",
|
||||
"hex.hashes.hash.common.rounds": "Hash Rounds",
|
||||
"hex.hashes.hash.common.salt": "Salt",
|
||||
"hex.hashes.hash.common.standard": "Standard",
|
||||
@ -27,6 +29,8 @@
|
||||
"hex.hashes.hash.common.personalization": "Personalization",
|
||||
"hex.hashes.hash.common.refl_in": "Reflect In",
|
||||
"hex.hashes.hash.common.refl_out": "Reflect Out",
|
||||
"hex.hashes.hash.common.xor_out": "XOR Out"
|
||||
"hex.hashes.hash.common.xor_out": "XOR Out",
|
||||
"hex.hashes.hash.sum": "Sum",
|
||||
"hex.hashes.hash.sum.fold": "Fold result"
|
||||
}
|
||||
}
|
||||
|
@ -459,34 +459,54 @@ namespace hex::plugin::hashes {
|
||||
HashSum() : Hash("hex.hashes.hash.sum") {}
|
||||
|
||||
Function create(std::string name) override {
|
||||
return Hash::create(name, [this](const Region& region, prv::Provider *provider) -> std::vector<u8> {
|
||||
return Hash::create(name, [hash = *this](const Region& region, prv::Provider *provider) -> std::vector<u8> {
|
||||
std::array<u8, 8> result = { 0x00 };
|
||||
|
||||
auto reader = prv::ProviderReader(provider);
|
||||
reader.seek(region.getStartAddress());
|
||||
reader.setEndAddress(region.getEndAddress());
|
||||
|
||||
u64 sum = m_initialValue;
|
||||
u64 sum = hash.m_initialValue;
|
||||
|
||||
u8 progress = 0;
|
||||
for (u8 byte : reader) {
|
||||
sum += byte;
|
||||
sum += (byte << (8 * progress));
|
||||
progress += 1;
|
||||
|
||||
progress = progress % hash.m_inputSize;
|
||||
}
|
||||
|
||||
std::memcpy(result.data(), &sum, m_size);
|
||||
u64 foldedSum = sum;
|
||||
if (hash.m_foldOutput) {
|
||||
while (foldedSum >= (1LLU << (hash.m_outputSize * 8))) {
|
||||
u64 partialSum = 0;
|
||||
for (size_t i = 0; i < sizeof(u64); i += hash.m_inputSize) {
|
||||
u64 value = 0;
|
||||
std::memcpy(&value, reinterpret_cast<const u8*>(&foldedSum) + i, hash.m_inputSize);
|
||||
partialSum += value;
|
||||
}
|
||||
foldedSum = partialSum;
|
||||
}
|
||||
}
|
||||
|
||||
return { result.begin(), result.begin() + m_size };
|
||||
std::memcpy(result.data(), &foldedSum, hash.m_outputSize);
|
||||
|
||||
return { result.begin(), result.begin() + hash.m_outputSize };
|
||||
});
|
||||
}
|
||||
|
||||
void draw() override {
|
||||
ImGuiExt::InputHexadecimal("hex.hashes.hash.common.iv"_lang, &m_initialValue);
|
||||
ImGui::SliderInt("hex.hashes.hash.common.size"_lang, &m_size, 1, 8, "%d", ImGuiSliderFlags_AlwaysClamp);
|
||||
ImGui::SliderInt("hex.hashes.hash.common.input_size"_lang, &m_inputSize, 1, 8, "%d", ImGuiSliderFlags_AlwaysClamp);
|
||||
ImGui::SliderInt("hex.hashes.hash.common.output_size"_lang, &m_outputSize, 1, 8, "%d", ImGuiSliderFlags_AlwaysClamp);
|
||||
ImGui::Checkbox("hex.hashes.hash.sum.fold"_lang, &m_foldOutput);
|
||||
}
|
||||
|
||||
[[nodiscard]] nlohmann::json store() const override {
|
||||
nlohmann::json result;
|
||||
|
||||
result["iv"] = m_initialValue;
|
||||
result["size"] = m_size;
|
||||
result["size"] = m_outputSize;
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -494,13 +514,15 @@ namespace hex::plugin::hashes {
|
||||
void load(const nlohmann::json &data) override {
|
||||
try {
|
||||
m_initialValue = data.at("iv").get<int>();
|
||||
m_size = data.at("size").get<int>();
|
||||
m_outputSize = data.at("size").get<int>();
|
||||
} catch (std::exception&) { }
|
||||
}
|
||||
|
||||
private:
|
||||
u64 m_initialValue = 0x00;
|
||||
int m_size = 1;
|
||||
int m_inputSize = 1;
|
||||
int m_outputSize = 1;
|
||||
bool m_foldOutput = false;
|
||||
};
|
||||
|
||||
class HashSnefru : public ContentRegistry::Hashes::Hash {
|
||||
|
Loading…
Reference in New Issue
Block a user