From 196a2f720ad525c28b2e14a5865a2c2efd560d0b Mon Sep 17 00:00:00 2001 From: mizu Date: Fri, 25 Mar 2011 03:24:44 +0000 Subject: [PATCH] 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 --- trunk/CardSaveDataMover/Imp/OMakefile | 6 +- .../Imp/imp_list/csm_key_private.der | Bin 0 -> 1193 bytes .../Imp/imp_list/csm_key_private.pem | 27 ++ .../Imp/imp_list/csm_key_public.der | Bin 0 -> 294 bytes .../Imp/imp_list/csm_list.txt | 2 + .../Imp/imp_list/csm_sign.dat | Bin 0 -> 256 bytes .../Imp/imp_list/makekey.bat | 4 + .../Imp/imp_list/makesign.bat | 7 + .../CardSaveDataMover/Imp/imp_list/運用案.txt | 15 ++ trunk/CardSaveDataMover/Imp/source/main.cpp | 246 ++++++++++++++++-- 10 files changed, 277 insertions(+), 30 deletions(-) create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.der create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/csm_key_private.pem create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/csm_key_public.der create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/csm_list.txt create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/csm_sign.dat create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/makekey.bat create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/makesign.bat create mode 100644 trunk/CardSaveDataMover/Imp/imp_list/運用案.txt 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 0000000000000000000000000000000000000000..1e91d10a6831323980f565420e42c1d791537622 GIT binary patch literal 1193 zcmV;a1XlYnf&`@k0RRGm0RaH_2&c|z1h*!534XywD7TR+9ClSA;8s2~BtF6qWT2>) z;ncbFa?}kwd-$IEC8pFpp=`KDWW;t8z*h|K`a}@8p^I2XtFnZkx*QQEYXBl*v};45 z0U!6{KBM6kwmHT)6T&|;n)-;7*))gveQkkA3m3OYT5`}lX3le>WD@8%p=;sLnyZtM z6V?w#%4YHXIb0)yEeQCJWlW~)XOaX&tELVkJdTh5p-}0+5kc17N_^s%EAZl!Q}adP z!(9;2Iga1J|Fk4uRm2u7kr%Sw>4BDufEq&7Y0PyU^cDSha?7g4H@H2h3w2i(t&s=k zBCC!}236}qB;Zt+)KB380|5X50)hbn0EU^%y*Ck`t+7ZGEy78gL)d#Os@2y3hTa0HPV-&-l(Hm}7&qw36dr?Va zjYa=4ah)iDvDF_t#R}9CF{aI|@dAN?0R4=9C=K~08V<5F9OPOLGWD}ff?3G=rYn;C zW9F*pe}-b29&2Oe_S0BdX#;Rdpn;o`F5h3x)%L0eTf_qS@bn*?M(JCC9bG?ES04#+ z5H=tj%ZU{|Zl5<6G)@H~SbNC%<=&`(Awc{UyFiL0vN(!|2R}ujR9(~0HpZU=WdebL z0QqbQ?2YfRn|J)!2W=gM_TtKItB1e%W!g?(-RMGO6{lQTYY@Jr;b=>LK^OpYp55j!BfQv86A_n&xAYU}W3*-#r z;iq0++3Kew9#c!ChgvJd+M=9=WV!aZ%>sde0Iuq3ZUB|dZ&ZvU-+H;0nzdd@E|24$< z@dAN>Hiw`?&txyaO`}1#o$GEsYo^8nQc`XN7LGgjPv`ULs0C1`PpRIjK@hxUY756X z0<^$>_=+CldKkr$NX7=51GTf6V8tI=oDdF3C%HNEA9wI0k?EssmjQ#foW41D0$7eb z14phZk7U|s+8tn6DDB9yuFMkUnb(eTPZimr0)c@5@`FKY4tFMTO=@L|rEw>%UO|m1 zB7tmq%-+WBKpgam^nP$4)=LLtk+gJD(`?avXw$fp4{AKxBM2vdOWn*V5wHp-+cI{q z1<31d3rnHKrSsl%`e>JpE$xq^(5yY00ondAf&n5h4F(A+hDe6@4FLfG1potr0S^E$f&mHwf&l>l_XwxXX#}?>cnN;N zMku$DDjarIBH&g&G$cO44`iUImf_U7^K#S;JA3$^`X#2+J)vy4Mr6cx6Tnvt@A^a# zxS@+!Mys-fpt>9pCTjp9Vzg^Rp#dNF<36L|6}CCXI1|D@Gn)E{li4(f_wqGS^2H=%3c(3-20krUPrM#^UK{W)ACgDnX7k7Z1z>t~V#M60F_BRr0e z|DjOnzY#&!-Aa7omn-n%lvDFX;lo`J&^eCZ!2h%)Usc2wERh$o-sypsi+~zJ)M?Ch s9rP9bcyi0C#W%P;s0(#h7Ojy7=OU|)Oa@i!LL}f+m()+;0s{d60V{HX=Kufz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..30562505785a5891b105a5e0db8da3e592ad8084 GIT binary patch literal 256 zcmV+b0ssC=5${6$gm?&lce%<%wJd@tof|Z21S_zkK#niTTky<`X;ABET6bv2-$D}1 za{4Hluq(+HAjSYeb?P#lqN(U+GGSS|c%syhHuJLS<@rj3z0KV%1dFwypyn zu4e76!(p5|OFuDJQXrJD9#a}AX>nkqDgmb6lIkZ|ko|C*# ze+}K56c!r`*q)%}(Z3p59n4NX6Tze{SR(ZB5HG<20mQ3u-pLct$;$16CK&1|XV6nw G)}*06#)4@8 literal 0 HcmV?d00001 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