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:
mizu 2011-03-25 03:24:44 +00:00
parent ad42a7ae64
commit 196a2f720a
10 changed files with 277 additions and 30 deletions

View File

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

View 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-----

View File

@ -0,0 +1,2 @@
000000000000000
EJF100002379

Binary file not shown.

View 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

View 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

View File

@ -0,0 +1,15 @@
<運用イメージ>
目的:許可した本体のみインポート
RED) インポート用カードと公開鍵(csm_key_public)を渡しておく
SC ツール用本体のシリアルをメールなどでREDへ連絡
RED) リスト(csm_list)と署名(csm_sign)を作成し送る
インポート手順
 公開鍵、リスト、署名を書き込んだSDをCTRに差す
・ インポート用アプリをカード起動
・ 有効な本体ならインポートメニューが表示される

View File

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