BGSとの通信にチェックデジット無しのシリアルナンバーを使うように

プリインストールダウンロード部分を組み込む

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@601 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2012-01-24 06:24:14 +00:00
parent 8055ccf482
commit 322464beb9
7 changed files with 95 additions and 21 deletions

View File

@ -82,9 +82,16 @@ u32 s_FgNupRetryCount = 0;
// 時計同期モードかどうか // 時計同期モードかどうか
bool s_IsSyncClock = false; bool s_IsSyncClock = false;
// TWLタイトルのダウンロードを開始したかどうか // TWLタイトルのダウンロードを開始したかどうか
bool s_ExecuteTitleDownload = false; bool s_ExecuteTwlTitleDownload = false;
// TWLタイトルのダウンロードを何回リトライしたか // TWLタイトルのダウンロードを何回リトライしたか
u32 s_TitleDownloadRetryCount = 0; u32 s_TwlTitleDownloadRetryCount = 0;
// プリインストールタイトルのダウンロードを開始したかどうか
bool s_ExecutePreinstallTitleDownload = false;
// プリインストールタイトルのダウンロードを何回リトライしたか
u32 s_PreinstallTitleDownloadRetryCount = 0;
// プリインストールタイトルのダウンロードが成功したかどうか
bool s_PreinstallTitleDownloadSuccess = false;
// ショップ処理を開始したかどうか // ショップ処理を開始したかどうか
bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX]; bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX];
@ -1418,10 +1425,10 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
} }
else else
{ {
if (!s_ExecuteTitleDownload) if (!s_ExecuteTwlTitleDownload)
{ {
COMMON_LOGGER("Download Twl Title\n"); COMMON_LOGGER("Download Twl Title\n");
s_ExecuteTitleDownload = true; s_ExecuteTwlTitleDownload = true;
StartTwlTitleDownload(); StartTwlTitleDownload();
} }
@ -1440,13 +1447,13 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
} }
else else
{ {
if (s_TitleDownloadRetryCount++ < RETRY_MAX) if (s_TwlTitleDownloadRetryCount++ < RETRY_MAX)
{ {
// エラーのためやり直す // エラーのためやり直す
COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult()); COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult());
COMMON_LOGGER("Download Twl Title Failed. Retrying... %d\n", s_TitleDownloadRetryCount); COMMON_LOGGER("Download Twl Title Failed. Retrying... %d\n", s_TwlTitleDownloadRetryCount);
s_ExecuteTitleDownload = false; s_ExecuteTwlTitleDownload = false;
} }
else else
{ {
@ -1702,8 +1709,45 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
case PREINSTALL_DOWNLOAD_APP: case PREINSTALL_DOWNLOAD_APP:
{ {
COMMON_LOGGER("Download App Stub\n"); if (!s_ExecutePreinstallTitleDownload)
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT; {
COMMON_LOGGER("Download PreInstall Application\n");
s_ExecutePreinstallTitleDownload = true;
bit64 deviceId = manager.GetDeviceId() + 0x400000000;
u8 serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
manager.GetSerialNumberWithoutCD(serial);
StartPreinstallTitleDownload(deviceId, serial);
}
// 動いていることを表示
{
PutAliveMessage(operationMessage, "Download PreInstall Title");
}
if (IsDownloadTitleFinished())
{
FinalizeTitleDownload();
if (DownloadTitleSucceeded())
{
s_PreinstallTitleDownloadSuccess = true;
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
}
else
{
if (s_PreinstallTitleDownloadRetryCount++ < RETRY_MAX)
{
// エラーのためやり直す
COMMON_LOGGER_RESULT_IF_FAILED(GetShopOperationSingleResult());
COMMON_LOGGER("Download PreInstall Title Failed. Retrying... %d\n", s_PreinstallTitleDownloadRetryCount);
s_ExecutePreinstallTitleDownload = false;
}
else
{
s_RestoreState = PREINSTALL_WAIT_USER_SD_EJECT;
}
}
}
} }
break; break;
@ -1724,8 +1768,16 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
if (ExistsAPSetting()) if (ExistsAPSetting())
{ {
NN_LOG("AP Setting Exists. OK\n"); NN_LOG("AP Setting Exists. OK\n");
COMMON_LOGGER("Download Preinstall done\n"); if(s_PreinstallTitleDownloadSuccess)
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT); {
COMMON_LOGGER("Download Preinstall done\n");
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
}
else
{
COMMON_LOGGER("Download Preinstall failed\n");
ChangeState(saved, s_RestoreState, FAIL);
}
} }
else else
{ {

View File

@ -95,6 +95,11 @@ nn::Result PreinstallImporter::GetHtmlBodyAndParseXmlData(BgsCommunicator& comm,
return comm.GetLastResult(); return comm.GetLastResult();
} }
if(!comm.Finalize())
{
return comm.GetLastResult();
}
// XMLを解析してタイトルリストを設定する // XMLを解析してタイトルリストを設定する
NN_UTIL_RETURN_IF_FAILED(ParseXmlData(buf, list, num)); NN_UTIL_RETURN_IF_FAILED(ParseXmlData(buf, list, num));

View File

@ -68,6 +68,11 @@ void HardwareStateManager::GetSerialNumber(u8** serial, size_t* size)
return m_pUtil->GetSerialNumber(serial, size); return m_pUtil->GetSerialNumber(serial, size);
} }
void HardwareStateManager::GetSerialNumberWithoutCD(u8* serial)
{
return m_pUtil->GetSerialNumberWithoutCD(serial);
}
void HardwareStateManager::GetVersionData(common::VerDef* version) void HardwareStateManager::GetVersionData(common::VerDef* version)
{ {
return m_pUtil->GetVersionData(version); return m_pUtil->GetVersionData(version);

View File

@ -37,6 +37,7 @@ public:
void GetIvs(void** ivs, size_t* size); void GetIvs(void** ivs, size_t* size);
nn::Handle GetMcuHandle(); nn::Handle GetMcuHandle();
void GetSerialNumber(u8** serial, size_t* size); void GetSerialNumber(u8** serial, size_t* size);
void GetSerialNumberWithoutCD(u8* serial);
void GetVersionData(common::VerDef* version); void GetVersionData(common::VerDef* version);
private: private:

View File

@ -44,7 +44,7 @@ namespace common
{ {
Util::Util() : Util::Util() :
m_FriendCode(0), mp_Ivs(NULL), m_SizeofIvs(0), m_BatteryRemain(100), m_CanReadSerialNumber(false), m_CanReadIvs( m_FriendCode(0), mp_Ivs(NULL), m_SizeofIvs(0), m_SerialNoWithoutCGLen(0), m_BatteryRemain(100), m_CanReadSerialNumber(false), m_CanReadIvs(
false), m_HasReadFriendCode(false) false), m_HasReadFriendCode(false)
{ {
@ -191,11 +191,11 @@ void Util::ReadIvs(u8 cupMajorVersion)
// NULL終端された場所にチェックデジットを付加して新たにNULL終端する // NULL終端された場所にチェックデジットを付加して新たにNULL終端する
void Util::AddCheckDigit(char* serial) void Util::AddCheckDigit(char* serial)
{ {
size_t len = std::strlen(serial); m_SerialNoWithoutCGLen = std::strlen(serial);
u8 digit = 0; u8 digit = 0;
bool odd = true; bool odd = true;
for(u8 i = len - 1; i > 0 && std::isdigit(serial[i]); i--) for(u8 i = m_SerialNoWithoutCGLen - 1; i > 0 && std::isdigit(serial[i]); i--)
{ {
if(odd) if(odd)
{ {
@ -210,14 +210,14 @@ void Util::AddCheckDigit(char* serial)
if(digit % 10 != 0) if(digit % 10 != 0)
{ {
serial[len] = 10 - (digit % 10) + '0'; serial[m_SerialNoWithoutCGLen] = 10 - (digit % 10) + '0';
} }
else else
{ {
serial[len] = '0'; serial[m_SerialNoWithoutCGLen] = '0';
} }
serial[len + 1] = '\0'; serial[m_SerialNoWithoutCGLen + 1] = '\0';
} }
// /Nintendo 3DS/6ea6b9d6ab70493ea9edd8b947d5d819/853600b24760a87f534430320002544d // /Nintendo 3DS/6ea6b9d6ab70493ea9edd8b947d5d819/853600b24760a87f534430320002544d
@ -284,6 +284,11 @@ u8* Util::GetSerialNumber()
return m_SerialNo; return m_SerialNo;
} }
void Util::GetSerialNumberWithoutCD(u8* serial)
{
std::memcpy(serial, m_SerialNo, nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN);
serial[m_SerialNoWithoutCGLen] = '\0';
}
void Util::GetIvs(void** ivs, size_t* size) void Util::GetIvs(void** ivs, size_t* size)
{ {

View File

@ -40,7 +40,7 @@ public:
void FinalizeForRestore(); void FinalizeForRestore();
// シリアルナンバーにモジュラス10 ウェイト3・1M10W31でチェックデジットを付加する // シリアルナンバーにモジュラス10 ウェイト3・1M10W31でチェックデジットを付加する
static void AddCheckDigit(char* serial); void AddCheckDigit(char* serial);
// IVSから計算されるセーブデータディレクトリ名を取得する // IVSから計算されるセーブデータディレクトリ名を取得する
static void GetSaveDataDirectoryRoot(::std::string& sysSaveRoot); static void GetSaveDataDirectoryRoot(::std::string& sysSaveRoot);
@ -63,6 +63,9 @@ public:
// シリアルナンバーを返す // シリアルナンバーを返す
u8* GetSerialNumber(); u8* GetSerialNumber();
// チェックデジット無しのシリアルナンバーを取得する
void GetSerialNumberWithoutCD(u8* serial);
// IVSを取得する // IVSを取得する
void GetIvs(void** ivs, size_t* size); void GetIvs(void** ivs, size_t* size);
@ -131,7 +134,8 @@ private:
// IVSのサイズ // IVSのサイズ
size_t m_SizeofIvs; size_t m_SizeofIvs;
NN_PADDING4; // チェックデジット無しのシリアルナンバーの長さ
size_t m_SerialNoWithoutCGLen;
// MCUへのポインタ // MCUへのポインタ
nn::mcu::CTR::HwCheck* mp_Mcu; nn::mcu::CTR::HwCheck* mp_Mcu;

View File

@ -73,7 +73,8 @@ void UtilTest::AddCheckDigit()
const char serialWithCheckDigit[] = "EJF100004458"; const char serialWithCheckDigit[] = "EJF100004458";
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
std::memcpy(serial, serialBase, sizeof(serialBase)); std::memcpy(serial, serialBase, sizeof(serialBase));
common::Util::AddCheckDigit(serial); common::Util util;
util.AddCheckDigit(serial);
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0); NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
} }
@ -84,7 +85,8 @@ void UtilTest::AddCheckDigit()
const char serialWithCheckDigit[] = "CJF100046380"; const char serialWithCheckDigit[] = "CJF100046380";
char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; char serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN];
std::memcpy(serial, serialBase, sizeof(serialBase)); std::memcpy(serial, serialBase, sizeof(serialBase));
common::Util::AddCheckDigit(serial); common::Util util;
util.AddCheckDigit(serial);
NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0); NN_TEST_ASSERT_EQUAL(std::strcmp(serial, serialWithCheckDigit), 0);
} }