[nstool] Add support for detecting and specifying ticket and cert files.

This commit is contained in:
jakcron 2018-06-30 00:14:19 +08:00
parent a079bec2bc
commit 3a1ef48b64
4 changed files with 61 additions and 2 deletions

View file

@ -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")

View file

@ -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;

View file

@ -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);
}; };

View file

@ -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,
}; };