nstool/lib/libhac/source/GameCardHeader.cpp

481 lines
11 KiB
C++
Raw Permalink Normal View History

#include <nn/hac/GameCardHeader.h>
2018-04-21 09:37:30 +00:00
nn::hac::GameCardHeader::GameCardHeader()
2018-06-24 08:18:54 +00:00
{
clear();
}
nn::hac::GameCardHeader::GameCardHeader(const GameCardHeader& other)
2018-04-21 09:37:30 +00:00
{
2018-06-24 08:18:54 +00:00
*this = other;
2018-04-21 09:37:30 +00:00
}
void nn::hac::GameCardHeader::operator=(const GameCardHeader& other)
2018-04-21 09:37:30 +00:00
{
mRomAreaStartPage = other.mRomAreaStartPage;
mBackupAreaStartPage = other.mBackupAreaStartPage;
mKekIndex = other.mKekIndex;
mTitleKeyDecIndex = other.mTitleKeyDecIndex;
mRomSize = other.mRomSize;
mCardHeaderVersion = other.mCardHeaderVersion;
mFlags = other.mFlags;
mPackageId = other.mPackageId;
mValidDataEndPage = other.mValidDataEndPage;
mAesCbcIv = other.mAesCbcIv;
mPartitionFsHeaderAddress = other.mPartitionFsHeaderAddress;
mPartitionFsHeaderSize = other.mPartitionFsHeaderSize;
mPartitionFsHeaderHash = other.mPartitionFsHeaderHash;
mInitialDataHash = other.mInitialDataHash;
mSelSec = other.mSelSec;
mSelT1Key = other.mSelT1Key;
mSelKey = other.mSelKey;
mLimAreaPage = other.mLimAreaPage;
mFwVersion[0] = other.mFwVersion[0];
mFwVersion[1] = other.mFwVersion[1];
mAccCtrl1 = other.mAccCtrl1;
mWait1TimeRead = other.mWait1TimeRead;
mWait2TimeRead = other.mWait2TimeRead;
mWait1TimeWrite = other.mWait1TimeWrite;
mWait2TimeWrite = other.mWait2TimeWrite;
mFwMode = other.mFwMode;
mUppVersion = other.mUppVersion;
memcpy(mUppHash, other.mUppHash, gc::kUppHashLen);
2018-04-21 09:37:30 +00:00
mUppId = other.mUppId;
}
bool nn::hac::GameCardHeader::operator==(const GameCardHeader& other) const
2018-04-21 09:37:30 +00:00
{
return (mRomAreaStartPage == other.mRomAreaStartPage)
&& (mBackupAreaStartPage == other.mBackupAreaStartPage)
&& (mKekIndex == other.mKekIndex)
&& (mTitleKeyDecIndex == other.mTitleKeyDecIndex)
&& (mRomSize == other.mRomSize)
&& (mCardHeaderVersion == other.mCardHeaderVersion)
&& (mFlags == other.mFlags)
&& (mPackageId == other.mPackageId)
&& (mValidDataEndPage == other.mValidDataEndPage)
&& (mAesCbcIv == other.mAesCbcIv)
&& (mPartitionFsHeaderAddress == other.mPartitionFsHeaderAddress)
&& (mPartitionFsHeaderSize == other.mPartitionFsHeaderSize)
&& (mPartitionFsHeaderHash == other.mPartitionFsHeaderHash)
&& (mInitialDataHash == other.mInitialDataHash)
&& (mSelSec == other.mSelSec)
&& (mSelT1Key == other.mSelT1Key)
&& (mSelKey == other.mSelKey)
&& (mLimAreaPage == other.mLimAreaPage)
&& (mFwVersion[0] == other.mFwVersion[0])
&& (mFwVersion[1] == other.mFwVersion[1])
&& (mAccCtrl1 == other.mAccCtrl1)
&& (mWait1TimeRead == other.mWait1TimeRead)
&& (mWait2TimeRead == other.mWait2TimeRead)
&& (mWait1TimeWrite == other.mWait1TimeWrite)
&& (mWait2TimeWrite == other.mWait2TimeWrite)
&& (mFwMode == other.mFwMode)
&& (mUppVersion == other.mUppVersion)
&& (memcmp(mUppHash, other.mUppHash, gc::kUppHashLen) == 0)
&& (mUppId == other.mUppId);
2018-04-21 09:37:30 +00:00
}
bool nn::hac::GameCardHeader::operator!=(const GameCardHeader& other) const
2018-04-21 09:37:30 +00:00
{
2018-06-24 08:18:54 +00:00
return !(*this == other);
2018-04-21 09:37:30 +00:00
}
void nn::hac::GameCardHeader::toBytes()
2018-04-21 09:37:30 +00:00
{
fnd::Exception(kModuleName, "toBytes() not implemented");
2018-04-21 09:37:30 +00:00
}
void nn::hac::GameCardHeader::fromBytes(const byte_t* data, size_t len)
2018-04-21 09:37:30 +00:00
{
// check input data size
if (len < sizeof(sGcHeader))
2018-04-21 09:37:30 +00:00
{
throw fnd::Exception(kModuleName, "GameCardImage header size is too small");
2018-04-21 09:37:30 +00:00
}
// clear internal members
clear();
// allocate internal local binary copy
mRawBinary.alloc(sizeof(sGcHeader));
2018-06-24 08:18:54 +00:00
memcpy(mRawBinary.data(), data, mRawBinary.size());
2018-04-21 09:37:30 +00:00
// get sGcHeader ptr
const nn::hac::sGcHeader* hdr = (const nn::hac::sGcHeader*)mRawBinary.data();
2018-04-21 09:37:30 +00:00
// check GameCardImage signature
if (hdr->st_magic.get() != gc::kGcHeaderStructMagic)
2018-04-21 09:37:30 +00:00
{
throw fnd::Exception(kModuleName, "GameCardImage header corrupt");
2018-04-21 09:37:30 +00:00
}
mRomAreaStartPage = hdr->rom_area_start_page.get();
mBackupAreaStartPage = hdr->backup_area_start_page.get();
mKekIndex = hdr->key_flag & 7;
mTitleKeyDecIndex = (hdr->key_flag >> 4) & 7;
mRomSize = hdr->rom_size;
mCardHeaderVersion = hdr->card_header_version;
mFlags = hdr->flags;
mPackageId = hdr->package_id.get();
mValidDataEndPage = hdr->valid_data_end_page.get();
for (size_t i = 0; i < fnd::aes::kAesBlockSize; i++)
2018-04-21 09:37:30 +00:00
mAesCbcIv.iv[i] = hdr->aescbc_iv.iv[15-i];
mPartitionFsHeaderAddress = hdr->partition_fs_header_address.get();
mPartitionFsHeaderSize = hdr->partition_fs_header_size.get();
mPartitionFsHeaderHash = hdr->partition_fs_header_hash;
mInitialDataHash = hdr->initial_data_hash;
mSelSec = hdr->sel_sec.get();
mSelT1Key = hdr->sel_t1_key.get();
mSelKey = hdr->sel_key.get();
mLimAreaPage = hdr->lim_area.get();
// if decrypted
if (hdr->reserved_02[sizeof(hdr->reserved_02)-1] == 0x00 && hdr->reserved_02[sizeof(hdr->reserved_02)-2] == 0x00)
{
mFwVersion[gc::FWVER_MAJOR] = hdr->fw_version[gc::FWVER_MAJOR].get();
mFwVersion[gc::FWVER_MINOR] = hdr->fw_version[gc::FWVER_MINOR].get();
2018-04-21 09:37:30 +00:00
mAccCtrl1 = hdr->acc_ctrl_1.get();
mWait1TimeRead = hdr->wait_1_time_read.get();
mWait2TimeRead = hdr->wait_2_time_read.get();
mWait1TimeWrite = hdr->wait_1_time_write.get();
mWait2TimeWrite = hdr->wait_2_time_write.get();
mFwMode = hdr->fw_mode.get();
mUppVersion = hdr->upp_version.get();
memcpy(mUppHash, hdr->upp_hash, gc::kUppHashLen);
2018-04-21 09:37:30 +00:00
mUppId = hdr->upp_id.get();
}
}
const fnd::Vec<byte_t>& nn::hac::GameCardHeader::getBytes() const
2018-06-24 08:18:54 +00:00
{
return mRawBinary;
}
2018-04-21 09:37:30 +00:00
// variables
void nn::hac::GameCardHeader::clear()
2018-04-21 09:37:30 +00:00
{
mRomAreaStartPage = 0;
mBackupAreaStartPage = 0;
mKekIndex = 0;
mTitleKeyDecIndex = 0;
mRomSize = 0;
mCardHeaderVersion = 0;
mFlags = 0;
mPackageId = 0;
mValidDataEndPage = 0;
memset(mAesCbcIv.iv, 0, sizeof(mAesCbcIv));
mPartitionFsHeaderAddress = 0;
mPartitionFsHeaderSize = 0;
memset(mPartitionFsHeaderHash.bytes, 0, sizeof(mPartitionFsHeaderHash));
memset(mInitialDataHash.bytes, 0, sizeof(mInitialDataHash));
mSelSec = 0;
mSelT1Key = 0;
mSelKey = 0;
mLimAreaPage = 0;
mFwVersion[0] = 0;
mFwVersion[1] = 0;
mAccCtrl1 = 0;
mWait1TimeRead = 0;
mWait2TimeRead = 0;
mWait1TimeWrite = 0;
mWait2TimeWrite = 0;
mFwMode = 0;
mUppVersion = 0;
memset(mUppHash, 0, gc::kUppHashLen);
2018-04-21 09:37:30 +00:00
mUppId = 0;
}
uint32_t nn::hac::GameCardHeader::getRomAreaStartPage() const
2018-04-21 09:37:30 +00:00
{
return mRomAreaStartPage;
}
void nn::hac::GameCardHeader::setRomAreaStartPage(uint32_t startPage)
2018-04-21 09:37:30 +00:00
{
mRomAreaStartPage = startPage;
}
uint32_t nn::hac::GameCardHeader::getBackupAreaStartPage() const
2018-04-21 09:37:30 +00:00
{
return mBackupAreaStartPage;
}
void nn::hac::GameCardHeader::setBackupAreaStartPage(uint32_t startPage)
2018-04-21 09:37:30 +00:00
{
mBackupAreaStartPage = startPage;
}
byte_t nn::hac::GameCardHeader::getKekIndex() const
2018-04-21 09:37:30 +00:00
{
return mKekIndex;
}
void nn::hac::GameCardHeader::setKekIndex(byte_t kekIndex)
2018-04-21 09:37:30 +00:00
{
mKekIndex = kekIndex;
}
byte_t nn::hac::GameCardHeader::getTitleKeyDecIndex() const
2018-04-21 09:37:30 +00:00
{
return mTitleKeyDecIndex;
}
void nn::hac::GameCardHeader::setTitleKeyDecIndex(byte_t index)
2018-04-21 09:37:30 +00:00
{
mTitleKeyDecIndex = index;
}
byte_t nn::hac::GameCardHeader::getRomSizeType() const
2018-04-21 09:37:30 +00:00
{
return mRomSize;
}
void nn::hac::GameCardHeader::setRomSizeType(byte_t romSizeType)
2018-04-21 09:37:30 +00:00
{
mRomSize = romSizeType;
}
byte_t nn::hac::GameCardHeader::getCardHeaderVersion() const
2018-04-21 09:37:30 +00:00
{
return mCardHeaderVersion;
}
void nn::hac::GameCardHeader::setCardHeaderVersion(byte_t version)
2018-04-21 09:37:30 +00:00
{
mCardHeaderVersion = version;
}
byte_t nn::hac::GameCardHeader::getFlags() const
2018-04-21 09:37:30 +00:00
{
return mFlags;
}
void nn::hac::GameCardHeader::setFlags(byte_t flags)
2018-04-21 09:37:30 +00:00
{
mFlags = flags;
}
uint64_t nn::hac::GameCardHeader::getPackageId() const
2018-04-21 09:37:30 +00:00
{
return mPackageId;
}
void nn::hac::GameCardHeader::setPackageId(uint64_t id)
2018-04-21 09:37:30 +00:00
{
mPackageId = id;
}
uint32_t nn::hac::GameCardHeader::getValidDataEndPage() const
2018-04-21 09:37:30 +00:00
{
return mValidDataEndPage;
}
void nn::hac::GameCardHeader::setValidDataEndPage(uint32_t page)
2018-04-21 09:37:30 +00:00
{
mValidDataEndPage = page;
}
const fnd::aes::sAesIvCtr& nn::hac::GameCardHeader::getAesCbcIv() const
2018-04-21 09:37:30 +00:00
{
return mAesCbcIv;
}
void nn::hac::GameCardHeader::setAesCbcIv(const fnd::aes::sAesIvCtr& iv)
2018-04-21 09:37:30 +00:00
{
mAesCbcIv = iv;
}
uint64_t nn::hac::GameCardHeader::getPartitionFsAddress() const
2018-04-21 09:37:30 +00:00
{
return mPartitionFsHeaderAddress;
}
void nn::hac::GameCardHeader::setPartitionFsAddress(uint64_t address)
2018-04-21 09:37:30 +00:00
{
mPartitionFsHeaderAddress = address;
}
uint64_t nn::hac::GameCardHeader::getPartitionFsSize() const
2018-04-21 09:37:30 +00:00
{
return mPartitionFsHeaderSize;
}
void nn::hac::GameCardHeader::setPartitionFsSize(uint64_t size)
2018-04-21 09:37:30 +00:00
{
mPartitionFsHeaderSize = size;
}
const fnd::sha::sSha256Hash& nn::hac::GameCardHeader::getPartitionFsHash() const
2018-04-21 09:37:30 +00:00
{
return mPartitionFsHeaderHash;
}
void nn::hac::GameCardHeader::setPartitionFsHash(const fnd::sha::sSha256Hash& hash)
2018-04-21 09:37:30 +00:00
{
mPartitionFsHeaderHash = hash;
}
const fnd::sha::sSha256Hash& nn::hac::GameCardHeader::getInitialDataHash() const
2018-04-21 09:37:30 +00:00
{
return mInitialDataHash;
}
void nn::hac::GameCardHeader::setInitialDataHash(const fnd::sha::sSha256Hash& hash)
2018-04-21 09:37:30 +00:00
{
mInitialDataHash = hash;
}
uint32_t nn::hac::GameCardHeader::getSelSec() const
2018-04-21 09:37:30 +00:00
{
return mSelSec;
}
void nn::hac::GameCardHeader::setSelSec(uint32_t sel_sec)
2018-04-21 09:37:30 +00:00
{
mSelSec = sel_sec;
}
uint32_t nn::hac::GameCardHeader::getSelT1Key() const
2018-04-21 09:37:30 +00:00
{
return mSelT1Key;
}
void nn::hac::GameCardHeader::setSelT1Key(uint32_t sel_t1_key)
2018-04-21 09:37:30 +00:00
{
mSelT1Key = sel_t1_key;
}
uint32_t nn::hac::GameCardHeader::getSelKey() const
2018-04-21 09:37:30 +00:00
{
return mSelKey;
}
void nn::hac::GameCardHeader::setSelKey(uint32_t sel_key)
2018-04-21 09:37:30 +00:00
{
mSelKey = sel_key;
}
uint32_t nn::hac::GameCardHeader::getLimAreaPage() const
2018-04-21 09:37:30 +00:00
{
return mLimAreaPage;
}
void nn::hac::GameCardHeader::setLimAreaPage(uint32_t page)
2018-04-21 09:37:30 +00:00
{
mLimAreaPage = page;
}
uint32_t nn::hac::GameCardHeader::getFwVerMajor() const
2018-04-21 09:37:30 +00:00
{
return mFwVersion[gc::FWVER_MAJOR];
2018-04-21 09:37:30 +00:00
}
void nn::hac::GameCardHeader::setFwVerMajor(uint32_t ver)
2018-04-21 09:37:30 +00:00
{
mFwVersion[gc::FWVER_MAJOR] = ver;
2018-04-21 09:37:30 +00:00
}
uint32_t nn::hac::GameCardHeader::getFwVerMinor() const
2018-04-21 09:37:30 +00:00
{
return mFwVersion[gc::FWVER_MINOR];
2018-04-21 09:37:30 +00:00
}
void nn::hac::GameCardHeader::setFwVerMinor(uint32_t ver)
2018-04-21 09:37:30 +00:00
{
mFwVersion[gc::FWVER_MINOR] = ver;
2018-04-21 09:37:30 +00:00
}
uint32_t nn::hac::GameCardHeader::getAccCtrl1() const
2018-04-21 09:37:30 +00:00
{
return mAccCtrl1;
}
void nn::hac::GameCardHeader::setAccCtrl1(uint32_t acc_ctrl_1)
2018-04-21 09:37:30 +00:00
{
mAccCtrl1 = acc_ctrl_1;
}
uint32_t nn::hac::GameCardHeader::getWait1TimeRead() const
2018-04-21 09:37:30 +00:00
{
return mWait1TimeRead;
}
void nn::hac::GameCardHeader::setWait1TimeRead(uint32_t seconds)
2018-04-21 09:37:30 +00:00
{
mWait1TimeRead = seconds;
}
uint32_t nn::hac::GameCardHeader::getWait2TimeRead() const
2018-04-21 09:37:30 +00:00
{
return mWait2TimeRead;
}
void nn::hac::GameCardHeader::setWait2TimeRead(uint32_t seconds)
2018-04-21 09:37:30 +00:00
{
mWait2TimeRead = seconds;
}
uint32_t nn::hac::GameCardHeader::getWait1TimeWrite() const
2018-04-21 09:37:30 +00:00
{
return mWait1TimeWrite;
}
void nn::hac::GameCardHeader::setWait1TimeWrite(uint32_t seconds)
2018-04-21 09:37:30 +00:00
{
mWait1TimeWrite = seconds;
}
uint32_t nn::hac::GameCardHeader::getWait2TimeWrite() const
2018-04-21 09:37:30 +00:00
{
return mWait2TimeWrite;
}
void nn::hac::GameCardHeader::setWait2TimeWrite(uint32_t seconds)
2018-04-21 09:37:30 +00:00
{
mWait2TimeWrite = seconds;
}
uint32_t nn::hac::GameCardHeader::getFwMode() const
2018-04-21 09:37:30 +00:00
{
return mFwMode;
}
void nn::hac::GameCardHeader::setFwMode(uint32_t fw_mode)
2018-04-21 09:37:30 +00:00
{
mFwMode = fw_mode;
}
uint32_t nn::hac::GameCardHeader::getUppVersion() const
2018-04-21 09:37:30 +00:00
{
return mUppVersion;
}
void nn::hac::GameCardHeader::setUppVersion(uint32_t version)
2018-04-21 09:37:30 +00:00
{
mUppVersion = version;
}
const byte_t* nn::hac::GameCardHeader::getUppHash() const
2018-04-21 09:37:30 +00:00
{
return mUppHash;
}
void nn::hac::GameCardHeader::setUppHash(const byte_t* hash)
2018-04-21 09:37:30 +00:00
{
memcpy(mUppHash, hash, gc::kUppHashLen);
2018-04-21 09:37:30 +00:00
}
uint64_t nn::hac::GameCardHeader::getUppId() const
2018-04-21 09:37:30 +00:00
{
return mUppId;
}
void nn::hac::GameCardHeader::setUppId(uint64_t id)
2018-04-21 09:37:30 +00:00
{
mUppId = id;
}