From 1f3865c9795c6b7f706fca18a174078f33ba4402 Mon Sep 17 00:00:00 2001 From: jakcron Date: Mon, 21 May 2018 20:49:46 +0800 Subject: [PATCH] [nstool] Add HashTreeMeta. --- programs/nstool/source/HashTreeMeta.cpp | 124 ++++++++++++++++++++++++ programs/nstool/source/HashTreeMeta.h | 60 ++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 programs/nstool/source/HashTreeMeta.cpp create mode 100644 programs/nstool/source/HashTreeMeta.h diff --git a/programs/nstool/source/HashTreeMeta.cpp b/programs/nstool/source/HashTreeMeta.cpp new file mode 100644 index 0000000..049bd3c --- /dev/null +++ b/programs/nstool/source/HashTreeMeta.cpp @@ -0,0 +1,124 @@ +#include "HashTreeMeta.h" + +HashTreeMeta::HashTreeMeta() : + mLayerInfo(), + mDataLayer(), + mMasterHashList() +{ + +} + +HashTreeMeta::HashTreeMeta(const nx::HierarchicalIntegrityHeader& hdr) : + mLayerInfo(), + mDataLayer(), + mMasterHashList() +{ + importHierarchicalIntergityHeader(hdr); +} + +HashTreeMeta::HashTreeMeta(const nx::HierarchicalSha256Header& hdr) : + mLayerInfo(), + mDataLayer(), + mMasterHashList() +{ + importHierarchicalSha256Header(hdr); +} + +bool HashTreeMeta::operator==(const HashTreeMeta& other) const +{ + return isEqual(other); +} + +bool HashTreeMeta::operator!=(const HashTreeMeta& other) const +{ + return !isEqual(other); +} + +void HashTreeMeta::operator=(const HashTreeMeta& other) +{ + copyFrom(other); +} + +void HashTreeMeta::importHierarchicalIntergityHeader(const nx::HierarchicalIntegrityHeader& hdr) +{ + for (size_t i = 0; i < hdr.getLayerInfo().getSize(); i++) + { + sLayer layer; + layer.offset = hdr.getLayerInfo()[i].offset; + layer.size = hdr.getLayerInfo()[i].size; + layer.block_size = _BIT(hdr.getLayerInfo()[i].block_size); + if (i+1 == hdr.getLayerInfo().getSize()) + { + mDataLayer = layer; + } + else + { + mLayerInfo.addElement(layer); + } + } + mMasterHashList = hdr.getMasterHashList(); +} + +void HashTreeMeta::importHierarchicalSha256Header(const nx::HierarchicalSha256Header& hdr) +{ + for (size_t i = 0; i < hdr.getLayerInfo().getSize(); i++) + { + sLayer layer; + layer.offset = hdr.getLayerInfo()[i].offset; + layer.size = hdr.getLayerInfo()[i].size; + layer.block_size = hdr.getHashBlockSize(); + if (i+1 == hdr.getLayerInfo().getSize()) + { + mDataLayer = layer; + } + else + { + mLayerInfo.addElement(layer); + } + } + mMasterHashList.addElement(hdr.getMasterHash()); +} + +const fnd::List& HashTreeMeta::getHashLayerInfo() const +{ + return mLayerInfo; +} + +void HashTreeMeta::setHashLayerInfo(const fnd::List& layer_info) +{ + mLayerInfo = layer_info; +} + +const HashTreeMeta::sLayer& HashTreeMeta::getDataLayer() const +{ + return mDataLayer; +} + +void HashTreeMeta::setDataLayer(const sLayer& data_info) +{ + mDataLayer = data_info; +} + +const fnd::List& HashTreeMeta::getMasterHashList() const +{ + return mMasterHashList; +} + +void HashTreeMeta::setMasterHashList(const fnd::List& master_hash_list) +{ + mMasterHashList = master_hash_list; +} + +bool HashTreeMeta::isEqual(const HashTreeMeta& other) const +{ + return (mLayerInfo == other.mLayerInfo) \ + && (mDataLayer == other.mDataLayer) \ + && (mMasterHashList == other.mMasterHashList); +} + +void HashTreeMeta::copyFrom(const HashTreeMeta& other) +{ + mLayerInfo = other.mLayerInfo; + mDataLayer = other.mDataLayer; + mMasterHashList = other.mMasterHashList; +} diff --git a/programs/nstool/source/HashTreeMeta.h b/programs/nstool/source/HashTreeMeta.h new file mode 100644 index 0000000..12d9e54 --- /dev/null +++ b/programs/nstool/source/HashTreeMeta.h @@ -0,0 +1,60 @@ +#pragma once +#include +#include + +class HashTreeMeta +{ +public: + struct sLayer + { + size_t offset; + size_t size; + size_t block_size; + + void operator=(const sLayer& other) + { + offset = other.offset; + size = other.size; + block_size = other.block_size; + } + + bool operator==(const sLayer& other) const + { + return (offset == other.offset && size == other.size && block_size == other.block_size); + } + + bool operator!=(const sLayer& other) const + { + return !(*this == other); + } + }; + + HashTreeMeta(); + HashTreeMeta(const nx::HierarchicalIntegrityHeader& hdr); + HashTreeMeta(const nx::HierarchicalSha256Header& hdr); + + bool operator==(const HashTreeMeta& other) const; + bool operator!=(const HashTreeMeta& other) const; + void operator=(const HashTreeMeta& other); + + void importHierarchicalIntergityHeader(const nx::HierarchicalIntegrityHeader& hdr); + void importHierarchicalSha256Header(const nx::HierarchicalSha256Header& hdr); + + const fnd::List& getHashLayerInfo() const; + void setHashLayerInfo(const fnd::List& layer_info); + + const sLayer& getDataLayer() const; + void setDataLayer(const sLayer& data_info); + + const fnd::List& getMasterHashList() const; + void setMasterHashList(const fnd::List& master_hash_list); +private: + + // data + fnd::List mLayerInfo; + sLayer mDataLayer; + fnd::List mMasterHashList; + + bool isEqual(const HashTreeMeta& other) const; + void copyFrom(const HashTreeMeta& other); +}; \ No newline at end of file