diff --git a/trunk/CardSaveDataMover/Imp/OMakefile b/trunk/CardSaveDataMover/Imp/OMakefile index b794b2d..6cf0dd9 100644 --- a/trunk/CardSaveDataMover/Imp/OMakefile +++ b/trunk/CardSaveDataMover/Imp/OMakefile @@ -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 diff --git a/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der new file mode 100644 index 0000000..1e91d10 Binary files /dev/null and b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der differ diff --git a/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem new file mode 100644 index 0000000..0018b43 --- /dev/null +++ b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem @@ -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----- diff --git a/trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der new file mode 100644 index 0000000..c810a50 Binary files /dev/null and b/trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der differ diff --git a/trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt b/trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt new file mode 100644 index 0000000..325d7e2 --- /dev/null +++ b/trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt @@ -0,0 +1,2 @@ +000000000000000 +EJF100002379 diff --git a/trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat b/trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat new file mode 100644 index 0000000..3056250 Binary files /dev/null and b/trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat differ diff --git a/trunk/CardSaveDataMover/Imp/imp_list/makekey.bat b/trunk/CardSaveDataMover/Imp/imp_list/makekey.bat new file mode 100644 index 0000000..a87511e --- /dev/null +++ b/trunk/CardSaveDataMover/Imp/imp_list/makekey.bat @@ -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 + diff --git a/trunk/CardSaveDataMover/Imp/imp_list/makesign.bat b/trunk/CardSaveDataMover/Imp/imp_list/makesign.bat new file mode 100644 index 0000000..27aa71a --- /dev/null +++ b/trunk/CardSaveDataMover/Imp/imp_list/makesign.bat @@ -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 diff --git a/trunk/CardSaveDataMover/Imp/imp_list/運用案.txt b/trunk/CardSaveDataMover/Imp/imp_list/運用案.txt new file mode 100644 index 0000000..f9f9e8f --- /dev/null +++ b/trunk/CardSaveDataMover/Imp/imp_list/運用案.txt @@ -0,0 +1,15 @@ + +^pC[W + +ړIF‚{̂̂݃C|[g + +RED)@C|[gpJ[hƌJ(csm_key_public)nĂ +SCj@c[p{̂̃VA[ȂǂRED֘A +RED)@Xg(csm_list)Ə(csm_sign)쐬 + + +C|[g菇 +E@JAXgASDCTRɍ +E@C|[gpAvJ[hN +E@LȖ{̂ȂC|[gj[\ + diff --git a/trunk/CardSaveDataMover/Imp/source/main.cpp b/trunk/CardSaveDataMover/Imp/source/main.cpp index b2e3e68..8ca59a3 100644 --- a/trunk/CardSaveDataMover/Imp/source/main.cpp +++ b/trunk/CardSaveDataMover/Imp/source/main.cpp @@ -14,15 +14,17 @@ *---------------------------------------------------------------------------*/ #include -//#include #include -//#include -//#include +#include +#include #include #include #include #include +#include +#include #include +#include #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;i0){ + 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