mirror of
https://github.com/jakcron/nstool
synced 2024-12-29 16:41:11 +00:00
[nstool] Add support for detecting and specifying ticket and cert files.
This commit is contained in:
parent
a079bec2bc
commit
3a1ef48b64
4 changed files with 61 additions and 2 deletions
|
@ -3,7 +3,7 @@ SRC_DIR = source
|
||||||
OBJS = $(foreach dir,$(SRC_DIR),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(SRC_DIR),$(subst .c,.o,$(wildcard $(dir)/*.c)))
|
OBJS = $(foreach dir,$(SRC_DIR),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(SRC_DIR),$(subst .c,.o,$(wildcard $(dir)/*.c)))
|
||||||
|
|
||||||
# External dependencies
|
# External dependencies
|
||||||
DEPENDS = nx-hb nx crypto compress fnd
|
DEPENDS = nx-hb nx es crypto compress fnd
|
||||||
LIB_DIR = ../../lib
|
LIB_DIR = ../../lib
|
||||||
LIBS = $(foreach dep,$(DEPENDS), -L"$(LIB_DIR)/lib$(dep)" -l$(dep))
|
LIBS = $(foreach dep,$(DEPENDS), -L"$(LIB_DIR)/lib$(dep)" -l$(dep))
|
||||||
INCS = $(foreach dep,$(DEPENDS), -I"$(LIB_DIR)/lib$(dep)/include")
|
INCS = $(foreach dep,$(DEPENDS), -I"$(LIB_DIR)/lib$(dep)/include")
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <nx/nso.h>
|
#include <nx/nso.h>
|
||||||
#include <nx/nro.h>
|
#include <nx/nro.h>
|
||||||
#include <nx/aset.h>
|
#include <nx/aset.h>
|
||||||
|
#include <es/SignatureBlock.h>
|
||||||
|
|
||||||
UserSettings::UserSettings()
|
UserSettings::UserSettings()
|
||||||
{}
|
{}
|
||||||
|
@ -43,7 +44,7 @@ void UserSettings::showHelp()
|
||||||
printf("\n General Options:\n");
|
printf("\n General Options:\n");
|
||||||
printf(" -d, --dev Use devkit keyset\n");
|
printf(" -d, --dev Use devkit keyset\n");
|
||||||
printf(" -k, --keyset Specify keyset file\n");
|
printf(" -k, --keyset Specify keyset file\n");
|
||||||
printf(" -t, --type Specify input file type [xci, pfs, romfs, nca, npdm, cnmt, nso, nro, nacp, aset]\n");
|
printf(" -t, --type Specify input file type [xci, pfs, romfs, nca, npdm, cnmt, nso, nro, nacp, aset, cert, tik]\n");
|
||||||
printf(" -y, --verify Verify file\n");
|
printf(" -y, --verify Verify file\n");
|
||||||
printf("\n Output Options:\n");
|
printf("\n Output Options:\n");
|
||||||
printf(" --showkeys Show keys generated\n");
|
printf(" --showkeys Show keys generated\n");
|
||||||
|
@ -695,6 +696,10 @@ FileType UserSettings::getFileTypeFromString(const std::string& type_str)
|
||||||
type = FILE_NRO;
|
type = FILE_NRO;
|
||||||
else if (str == "nacp")
|
else if (str == "nacp")
|
||||||
type = FILE_NACP;
|
type = FILE_NACP;
|
||||||
|
else if (str == "cert")
|
||||||
|
type = FILE_ES_CERT;
|
||||||
|
else if (str == "tik")
|
||||||
|
type = FILE_ES_TIK;
|
||||||
else if (str == "aset" || str == "asset")
|
else if (str == "aset" || str == "asset")
|
||||||
type = FILE_HB_ASSET;
|
type = FILE_HB_ASSET;
|
||||||
else
|
else
|
||||||
|
@ -753,6 +758,12 @@ FileType UserSettings::determineFileTypeFromFile(const std::string& path)
|
||||||
// test nso
|
// test nso
|
||||||
else if (_ASSERT_SIZE(sizeof(nx::sNroHeader)) && _TYPE_PTR(nx::sNroHeader)->st_magic.get() == nx::nro::kNroStructMagic)
|
else if (_ASSERT_SIZE(sizeof(nx::sNroHeader)) && _TYPE_PTR(nx::sNroHeader)->st_magic.get() == nx::nro::kNroStructMagic)
|
||||||
file_type = FILE_NRO;
|
file_type = FILE_NRO;
|
||||||
|
// test es certificate
|
||||||
|
else if (determineValidEsCertFromSample(scratch))
|
||||||
|
file_type = FILE_ES_CERT;
|
||||||
|
// test es ticket
|
||||||
|
else if (determineValidEsTikFromSample(scratch))
|
||||||
|
file_type = FILE_ES_TIK;
|
||||||
// test hb asset
|
// test hb asset
|
||||||
else if (_ASSERT_SIZE(sizeof(nx::sAssetHeader)) && _TYPE_PTR(nx::sAssetHeader)->st_magic.get() == nx::aset::kAssetStructMagic)
|
else if (_ASSERT_SIZE(sizeof(nx::sAssetHeader)) && _TYPE_PTR(nx::sAssetHeader)->st_magic.get() == nx::aset::kAssetStructMagic)
|
||||||
file_type = FILE_HB_ASSET;
|
file_type = FILE_HB_ASSET;
|
||||||
|
@ -855,6 +866,50 @@ bool UserSettings::determineValidNacpFromSample(const fnd::Vec<byte_t>& sample)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UserSettings::determineValidEsCertFromSample(const fnd::Vec<byte_t>& sample) const
|
||||||
|
{
|
||||||
|
es::SignatureBlock sign;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sign.fromBytes(sample.data(), sample.size());
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sign.isLittleEndian() == true)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (sign.getSignType() != es::sign::SIGN_RSA4096_SHA256 && sign.getSignType() != es::sign::SIGN_RSA2048_SHA256 && sign.getSignType() != es::sign::SIGN_ECDSA240_SHA256)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserSettings::determineValidEsTikFromSample(const fnd::Vec<byte_t>& sample) const
|
||||||
|
{
|
||||||
|
es::SignatureBlock sign;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
sign.fromBytes(sample.data(), sample.size());
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sign.isLittleEndian() == false)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (sign.getSignType() != es::sign::SIGN_RSA2048_SHA256)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
nx::npdm::InstructionType UserSettings::getInstructionTypeFromString(const std::string & type_str)
|
nx::npdm::InstructionType UserSettings::getInstructionTypeFromString(const std::string & type_str)
|
||||||
{
|
{
|
||||||
std::string str = type_str;
|
std::string str = type_str;
|
||||||
|
|
|
@ -106,5 +106,7 @@ private:
|
||||||
bool determineValidNcaFromSample(const fnd::Vec<byte_t>& sample) const;
|
bool determineValidNcaFromSample(const fnd::Vec<byte_t>& sample) const;
|
||||||
bool determineValidCnmtFromSample(const fnd::Vec<byte_t>& sample) const;
|
bool determineValidCnmtFromSample(const fnd::Vec<byte_t>& sample) const;
|
||||||
bool determineValidNacpFromSample(const fnd::Vec<byte_t>& sample) const;
|
bool determineValidNacpFromSample(const fnd::Vec<byte_t>& sample) const;
|
||||||
|
bool determineValidEsCertFromSample(const fnd::Vec<byte_t>& sample) const;
|
||||||
|
bool determineValidEsTikFromSample(const fnd::Vec<byte_t>& sample) const;
|
||||||
nx::npdm::InstructionType getInstructionTypeFromString(const std::string& type_str);
|
nx::npdm::InstructionType getInstructionTypeFromString(const std::string& type_str);
|
||||||
};
|
};
|
|
@ -27,6 +27,8 @@ enum FileType
|
||||||
FILE_NSO,
|
FILE_NSO,
|
||||||
FILE_NRO,
|
FILE_NRO,
|
||||||
FILE_NACP,
|
FILE_NACP,
|
||||||
|
FILE_ES_CERT,
|
||||||
|
FILE_ES_TIK,
|
||||||
FILE_HB_ASSET,
|
FILE_HB_ASSET,
|
||||||
FILE_INVALID = -1,
|
FILE_INVALID = -1,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue