mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@159 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
ad42a7ae64
commit
196a2f720a
@ -32,13 +32,13 @@ TARGET_PROGRAM = CtrSaveDataMover_imp
|
||||
|
||||
TITLE = CSM_imp
|
||||
|
||||
#LIBS += libnn_am
|
||||
LIBS += libnn_ps
|
||||
|
||||
IMPORTEE_CIA = importee.cia
|
||||
|
||||
#SRC_IMPORTEE_PATH = ../body/images/$(BUILD_TARGET_DIR)/$(BUILD_TYPE_DIR)/CtrSaveDataMover.cia
|
||||
SRC_IMPORTEE_PATH = ../body/images/$(BUILD_TARGET_DIR)/$(BUILD_TYPE_DIR)/CtrSaveDataMover.cia
|
||||
#とりあえず、マスタリング時は直おき、配置時に改名
|
||||
SRC_IMPORTEE_PATH = CtrSaveDataMover_master.cia
|
||||
#SRC_IMPORTEE_PATH = CtrSaveDataMover_master.cia
|
||||
|
||||
# ビルドタイプ別に romfs を作る
|
||||
#ROMFS_ROOT = $`(TARGET.getObjectDirectory)/romfsroot
|
||||
|
||||
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der
Normal file
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der
Normal file
Binary file not shown.
27
trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem
Normal file
27
trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem
Normal file
@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA9winzmkEtyZ4CX7BRii3kSocdlUi4FY+NCQ+wg9koKiW4dS5
|
||||
83LUDTt7+J76JabUPaFsuEZkxHYTwFcM7/pEELihi1hGq7KEoLocESZrACJitGtD
|
||||
oQEf9+M+o+EVtjnGOBPCPzOa+oiT2TSH+H1tgUgLF7dIWnLQPGbOc6JkEug3oWvh
|
||||
0Jqrk5ET1g9Gymbx/TlcI4MtCPiPZUym62eSBESrpg4jPI6P/6FQ6b8RQdbdSnzi
|
||||
lyvw4pRT80Xhw10Q0DmO38D/tCRfVcQWLJEXst7pgZaLgBpC1GnMdR30Ff14csuq
|
||||
xTe4PagLdVcWrZEH5yKrjkwGVetCJOBUl9RP4QIDAQABAoIBAQCGmcu9NxGfrbFI
|
||||
Ey3CSZtD2HsrqtXXAIbiKEGdwX9l3pZftGYhlRafoyK4Y/8OlukcL6GqgoiTV3cJ
|
||||
nSTqeSWvKrqyz0Wqdhm37dAvNAynRRUdEzkFODSv/7z41ELdSHuNwI5dm4O9ML/G
|
||||
YM4ZglYxVAzfPjmJNvfpgWbKMNhwR89BduYv6RmAZo9mScSj/T+abDWWwR1D6N9A
|
||||
6bJeIu1ES2xroELgdEym8kHKSA2NXS5E/xy7NMzFgTPN/KkmNCq6Go0Grt7DTzpV
|
||||
B4lndBLEuV/cO/joieqsPu1jFMOe0RtuVs9H47V7UUljjUX/MXGdKICx1R87xQrU
|
||||
EjGmzazxAoGBAP2MfigN+SYaDrI0HORaDzL1s02CWcj6piuS/GPmquh/hmKZHmtj
|
||||
5fbTWFlpA3BKoIGbki7fX83V9qoGW8QC+fD0H5xG6VuAHV0/VFcfCXEQNiAcy4kV
|
||||
PW6fNxY0TgUiWHvI+eXeqIAhQPwVu0CKJLI4iocHP0WhVF3TzzbGnwNlAoGBAPls
|
||||
CeyN77Cbd/zYB20dhPbiym2rh7/4ZdpOX93oQmQVp1xZaxC+peFoHIrCOTIxiq7q
|
||||
MBfjkzb4TId/jegilF6FyKvLMQAlKKe2bewYnB3zlv7+D8J8vICLL8oiBvcbIF80
|
||||
wQvkDOPhp15e2eqnIx5TS6SHWivE2qKchWS59rjNAoGBAK7qaW4Alc1vVIwj33q5
|
||||
lpq1Xkkuj/pS0Khm8q+Ixoc20uLad13mwRMSonSsOa8SDMDdLnAfsdwyq8SINm53
|
||||
Dy7ne5c4ZGy3aYqW0fx4cO8LHAvzUYb0nDjgpgQveVOZaimbcKrgfKZISqid5VyU
|
||||
8NPypb6ZhVDoB2fjY6SKSdDxAoGANoegQ89kL8BNo0G3netuPmumxgNSUm4EFo47
|
||||
90/n8+moBVCnT6neqkEQvGVqC8c5ArTAfviKHuJ6GMWSSMYGmgO1s5lgxR9anBAO
|
||||
SCe5OfMfd/AjkemjbJcBg7ecvjl4AliOPANHriqPZNpn2h1gWCjtyLKuzBLlmdeO
|
||||
ck8V2aECgYEA8oNBag53JnFNamWKpXEnrV5BjSkigWx5zN7G7UAc9In0fnAg1ksH
|
||||
Y5G0dFLTbNF8aNO4kw9qPNojCCd/S93MKRGwCibbMnavBcjrbQtLocal895z+miX
|
||||
jS3tj6PQrD2a5VWOilM5I/kYwl+LSs0kRH7bEOJp0E7GVITjEUOMa0I=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der
Normal file
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der
Normal file
Binary file not shown.
2
trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt
Normal file
2
trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt
Normal file
@ -0,0 +1,2 @@
|
||||
000000000000000
|
||||
EJF100002379
|
||||
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat
Normal file
BIN
trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat
Normal file
Binary file not shown.
4
trunk/CardSaveDataMover/Imp/imp_list/makekey.bat
Normal file
4
trunk/CardSaveDataMover/Imp/imp_list/makekey.bat
Normal file
@ -0,0 +1,4 @@
|
||||
openssl genrsa -out csm_key_private.pem 2048
|
||||
openssl enc -d -base64 -in csm_key_private.pem -out csm_key_private.der
|
||||
openssl rsa -pubout -inform DER -outform DER -in csm_key_private.der -out csm_key_public.der
|
||||
|
||||
7
trunk/CardSaveDataMover/Imp/imp_list/makesign.bat
Normal file
7
trunk/CardSaveDataMover/Imp/imp_list/makesign.bat
Normal file
@ -0,0 +1,7 @@
|
||||
@echo off
|
||||
if "%1"=="" goto 1
|
||||
openssl dgst -sha256 -binary -keyform DER -sign csm_key_private.der -out csm_sign.dat %1
|
||||
goto end
|
||||
:1
|
||||
openssl dgst -sha256 -binary -keyform DER -sign csm_key_private.der -out csm_sign.dat csm_list.txt
|
||||
:end
|
||||
15
trunk/CardSaveDataMover/Imp/imp_list/運用案.txt
Normal file
15
trunk/CardSaveDataMover/Imp/imp_list/運用案.txt
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
<運用イメージ>
|
||||
|
||||
目的:許可した本体のみインポート
|
||||
|
||||
RED) インポート用カードと公開鍵(csm_key_public)を渡しておく
|
||||
SC) ツール用本体のシリアルをメールなどでREDへ連絡
|
||||
RED) リスト(csm_list)と署名(csm_sign)を作成し送る
|
||||
|
||||
|
||||
インポート手順
|
||||
・ 公開鍵、リスト、署名を書き込んだSDをCTRに差す
|
||||
・ インポート用アプリをカード起動
|
||||
・ 有効な本体ならインポートメニューが表示される
|
||||
|
||||
@ -14,15 +14,17 @@
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <nn.h>
|
||||
//#include <nn/srv.h>
|
||||
#include <nn/fs.h>
|
||||
//#include <nn/ns/CTR/ns_ApiShell.h>
|
||||
//#include <nn/ns/CTR/ns_Shell.h>
|
||||
#include <nn/cfg/CTR/cfg_ApiSys.h>
|
||||
#include <nn/cfg/CTR/cfg_ApiInit.h>
|
||||
#include <nn/am/am_ApiLocalImporter.h>
|
||||
#include <nn/am/am_ApiSystemMenu.h>
|
||||
#include <nn/applet.h>
|
||||
#include <nn/ndm.h>
|
||||
#include <nn/crypto/crypto_RsaKey.h>
|
||||
#include <nn/ps/ctr/ps_Api.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "demo.h"
|
||||
#include "../common/ver.h"
|
||||
#include "../common/sleep.h"
|
||||
@ -30,10 +32,20 @@
|
||||
#include "../common/shfnt.h"
|
||||
#include "test_data.h"
|
||||
|
||||
#define INF_FILE "sdmc:/csm_inf.txt"
|
||||
|
||||
#define KEY_LENGTH 2048
|
||||
#define LIST_FILE "sdmc:/csm_list.txt"
|
||||
#define SIGN_FILE "sdmc:/csm_sign.dat"
|
||||
#define PUBK_FILE "sdmc:/csm_key_public.der"
|
||||
#define PRVK_FILE "sdmc:/csm_key_private.der"
|
||||
|
||||
|
||||
demo::RenderSystemDrawing s_RenderSystem;
|
||||
nn::fnd::ExpHeap appHeap;
|
||||
uptr heapForGx;
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
bit8 readBuf[64 * 1024];
|
||||
@ -60,10 +72,29 @@ bool ImportFile(nn::fs::MediaType mediaType, wchar_t* filename)
|
||||
}
|
||||
|
||||
|
||||
u8 s_list[200][nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN+1] NN_ATTRIBUTE_ALIGN(32);//シリアルリスト
|
||||
u8 sign[1024*10] NN_ATTRIBUTE_ALIGN(32);//署名
|
||||
u8 key[1024*10] NN_ATTRIBUTE_ALIGN(32);//署名
|
||||
u8 serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN+1];
|
||||
|
||||
bool GetSerial(){
|
||||
nn::cfg::CTR::init::Initialize();
|
||||
nn::cfg::CTR::system::Initialize();
|
||||
nn::Result result = nn::cfg::CTR::system::GetSerialNo(serialNo);
|
||||
serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN] = 0;
|
||||
nn::cfg::CTR::system::Finalize();
|
||||
nn::cfg::CTR::init::Finalize();
|
||||
return result.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//#define setColor(r,g,b,a) s_RenderSystem.SetColor(r,g,b,a)
|
||||
void setColor(f32 r,f32 g,f32 b,f32 a){ shf_SetColor(r,g,b,a);}
|
||||
//#define setText(x,y,s) s_RenderSystem.DrawText(x,y,s)
|
||||
void drawText(u16 x,u16 y,char *s){ shf_DrawText_0( x,y,s);}
|
||||
//上はASCIIのみ対応したTextWriterへのラッパ
|
||||
//日本語表示の場合、WideTextWriterを使う(要sft_側の関数追加)
|
||||
|
||||
|
||||
nn::hid::PadReader *hpr;
|
||||
@ -88,17 +119,88 @@ void endfunc()
|
||||
s_RenderSystem.Finalize();
|
||||
}
|
||||
|
||||
//署名検証
|
||||
bool VeriRsa(u8* src,size_t sz,u8* sig,u8* pub)
|
||||
{
|
||||
nn::crypto::RsaKey key;
|
||||
//nn::crypto::Initialize();
|
||||
nn::ps::CTR::Initialize();
|
||||
nn::Result res = key.InitializePublicKey(pub,KEY_LENGTH);
|
||||
NN_LOG("inipubkey desc= %d\n",res.GetDescription());
|
||||
if (res.IsSuccess())
|
||||
{
|
||||
res = nn::ps::CTR::VerifyRsaSha256(src,sz,sig,key);
|
||||
NN_LOG("verisig desc= %d\n",res.GetDescription());
|
||||
}
|
||||
//nn::crypto::Finalize();
|
||||
nn::ps::CTR::Finalize();
|
||||
return res.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
//署名作成
|
||||
bool SigRsa(u8* src,size_t sz,u8* sig,u8* priv)
|
||||
{
|
||||
nn::crypto::RsaKey key;
|
||||
//nn::crypto::Initialize();
|
||||
nn::ps::CTR::Initialize();
|
||||
nn::Result res = key.InitializePrivateKey(priv,KEY_LENGTH);
|
||||
NN_LOG("iniprvkey desc= %d\n",res.GetDescription());
|
||||
if (res.IsSuccess())
|
||||
{
|
||||
res = nn::ps::CTR::SignRsaSha256(src,sz,sig,key);
|
||||
NN_LOG("sig desc= %d\n",res.GetDescription());
|
||||
}
|
||||
//nn::crypto::Finalize();
|
||||
nn::ps::CTR::Finalize();
|
||||
return res.IsSuccess();
|
||||
}
|
||||
|
||||
void ErrorStop(char *s)
|
||||
{
|
||||
shf_SetScale(0.7,0.7);
|
||||
setColor(1.0, 0.0, 0.0,1.0);
|
||||
drawText(10,100,s);
|
||||
drawText(10,140,"Push Power Button & Power Off");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
WaitKey(0);
|
||||
}
|
||||
|
||||
|
||||
nn::fs::FileInputStream fi;
|
||||
//ファイルリード
|
||||
s32 FileRead(char* fname)
|
||||
{
|
||||
s32 size;
|
||||
nn::Result result = fi.TryInitialize(fname);
|
||||
if (result.IsFailure()){//open error
|
||||
//NN_LOG("desc= %d\n",result.GetDescription());
|
||||
return 0;
|
||||
}
|
||||
result = fi.TryRead(&size,readBuf,sizeof(readBuf));
|
||||
fi.Finalize();
|
||||
if (result.IsFailure()){
|
||||
//NN_LOG("desc= %d\n",result.GetDescription());
|
||||
return 0;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
char ver[16];
|
||||
char seri[32];
|
||||
void nnMain( void )
|
||||
{
|
||||
nn::Result result;
|
||||
bool flg_applove=false;
|
||||
bool flg_test=false;
|
||||
|
||||
nn::os::Initialize();
|
||||
nn::fs::Initialize();
|
||||
|
||||
//DEA-SUPにて推奨のフリーズ暫定対策:無線デーモンを停止 (2011.3.1 現在)
|
||||
//ただし、スリープ時の"いつのまに通信"は止まらない
|
||||
//無線は使わないが念の為、本体スイッチで切っとくのが確実
|
||||
//無線は使わないので本体横スイッチ切っとくのが確実
|
||||
nn::ndm::SuspendScheduler();
|
||||
|
||||
//中断処理の準備
|
||||
@ -128,6 +230,9 @@ void nnMain( void )
|
||||
s_RenderSystem.Initialize(heapForGx, s_GxHeapSize);
|
||||
SharedFontInit();
|
||||
|
||||
// 共有フォントの種類を取得
|
||||
//nn::pl::SharedFontType sftype = nn::pl::GetSharedFontType();
|
||||
|
||||
// スリープ要求に対する返答を有効にする
|
||||
// また、蓋の状態チェックを行い蓋が閉じられているならスリープ要求が発生する
|
||||
// nn::applet::EnableSleep(true);
|
||||
@ -145,27 +250,121 @@ void nnMain( void )
|
||||
drawText(250,40,ver);
|
||||
|
||||
shf_SetScale(0.7,0.7);
|
||||
if (result.IsFailure()){//初期化に失敗
|
||||
setColor(1.0, 0.0, 0.0,1.0);
|
||||
drawText(10,70,"Initialize Error");
|
||||
drawText(10,90,"check *.desc file");
|
||||
drawText(10,110,"Push B : Quit");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
while(1){
|
||||
padReader.ReadLatest(&padStatus);
|
||||
if(padStatus.trigger & nn::hid::BUTTON_B)break;
|
||||
}
|
||||
finish();
|
||||
}
|
||||
if (result.IsFailure())ErrorStop("Initialize Error");//am 初期化に失敗
|
||||
|
||||
//シリアルチェック
|
||||
if( GetSerial() )
|
||||
{//シリアル取得成功
|
||||
result = nn::fs::MountSdmc();
|
||||
if (result.IsSuccess())
|
||||
{
|
||||
int i,j,n;
|
||||
s32 fsize = FileRead(INF_FILE);
|
||||
if(fsize > 0)//設定ファイルがある
|
||||
{
|
||||
n = 0;
|
||||
while(n < fsize)
|
||||
{
|
||||
if (readBuf[n++] == '-'){
|
||||
switch (readBuf[n++]){
|
||||
case 'p':// -p .. 本体シリアル表示
|
||||
strcpy(seri,"s/n: ");
|
||||
strcat(seri,(char *)serialNo);
|
||||
shf_SetScale(0.5,0.5);
|
||||
drawText(10,40,(char*)seri);
|
||||
shf_SetScale(0.7,0.7);
|
||||
break;
|
||||
case 't':// -t .. テストメニュー有効
|
||||
flg_test = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fsize = FileRead(SIGN_FILE);
|
||||
if(fsize > 0)//署名リード成功
|
||||
{
|
||||
if (fsize>sizeof(sign))fsize = sizeof(sign);
|
||||
memcpy(sign,readBuf,fsize);
|
||||
|
||||
fsize = FileRead(PUBK_FILE);
|
||||
if(fsize > 0)//公開鍵リード成功
|
||||
{
|
||||
if (fsize>sizeof(key))fsize = sizeof(key);
|
||||
memcpy(key,readBuf,fsize);
|
||||
|
||||
fsize = FileRead(LIST_FILE);
|
||||
if(fsize > 0)//リストリード成功
|
||||
{
|
||||
if (VeriRsa(readBuf,fsize,sign,key))
|
||||
{//署名検証OK
|
||||
int list_ct = 0;
|
||||
n=0;
|
||||
u8 d;
|
||||
while(n < fsize)//リスト作成
|
||||
{
|
||||
if ((fsize-n) > nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN)j = nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN;
|
||||
else j = fsize-n;
|
||||
for (i=0;i<j;i++)
|
||||
{
|
||||
d = readBuf[n++];
|
||||
if ((d==0x0d)||(d==0x0a))
|
||||
{
|
||||
if (readBuf[n]==0x0a)n++;
|
||||
break;
|
||||
}
|
||||
s_list[list_ct][i] = d;
|
||||
}
|
||||
if (i>0){
|
||||
s_list[list_ct][i] = 0;//終端
|
||||
list_ct++;
|
||||
}
|
||||
}
|
||||
//本体シリアルがリストにあるかチェック
|
||||
n =0;
|
||||
int len = strlen((char*)serialNo);
|
||||
if (len > nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN)len = nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN;
|
||||
while(n<list_ct){
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
if (serialNo[i] != s_list[n][i])break;
|
||||
}
|
||||
if (i == len)
|
||||
{
|
||||
flg_applove = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}//Verify
|
||||
}//LIST_FILE
|
||||
}//PUBK_FILE
|
||||
}//SIGN_FILE
|
||||
nn::fs::Unmount("sdmc:");
|
||||
}//MountSdmc
|
||||
}//GetSerial
|
||||
|
||||
nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE);
|
||||
|
||||
u32 mask = 0;
|
||||
|
||||
drawText(80,100,"Push X : Import");
|
||||
drawText(80,140,"Push Y : Delete");
|
||||
drawText(80,160,"Push R : Test Data");
|
||||
if (flg_applove)//インポート許可本体
|
||||
{
|
||||
drawText(80,100,"Push X : Import");
|
||||
drawText(80,140,"Push Y : Delete");
|
||||
mask |= nn::hid::BUTTON_X | nn::hid::BUTTON_Y;
|
||||
}
|
||||
|
||||
if (flg_test)//テストメニュー
|
||||
{
|
||||
drawText(80,160,"Push R : Test Data");
|
||||
mask |= nn::hid::BUTTON_R;
|
||||
}
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
u32 trg = WaitKey(nn::hid::BUTTON_X | nn::hid::BUTTON_Y | nn::hid::BUTTON_R);
|
||||
if (mask == 0)ErrorStop("Serial number Check Failed");
|
||||
|
||||
u32 trg = WaitKey(mask);
|
||||
if (trg & nn::hid::BUTTON_R){
|
||||
shf_SetScale(0.6,0.6);
|
||||
TestMain();//テストデータへ
|
||||
@ -178,13 +377,6 @@ void nnMain( void )
|
||||
s_RenderSystem.Clear();
|
||||
setColor(1.0, 0.0, 0.0,1.0);
|
||||
drawText(10,50,"cia infomation Error");
|
||||
drawText(10,120,"Push B : Quit");
|
||||
s_RenderSystem.SwapBuffers();
|
||||
|
||||
while(1){
|
||||
padReader.ReadLatest(&padStatus);
|
||||
if(padStatus.trigger & nn::hid::BUTTON_B)break;
|
||||
}
|
||||
|
||||
} else
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user