mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-06-18 14:25:43 -04:00

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@165 4ee2a332-4b2b-5046-8439-1ba90f034370
116 lines
3.1 KiB
Plaintext
116 lines
3.1 KiB
Plaintext
=======================
|
||
AESに関するポリシー(仮)
|
||
=======================
|
||
|
||
AESのパラメータの一つである鍵について、その取り扱い方の
|
||
ポリシーを決める必要がある。
|
||
|
||
(余談)
|
||
AES-CTRでは、鍵以外にIV (128bit)により暗号化結果が変化する。
|
||
AES-CCMでは、鍵以外にNONCE (96bit)および各長さ(各16bit)に
|
||
より暗号化結果が変化する。
|
||
これらは、鍵とは異なり、AESを有効にする度に再設定する
|
||
必要がある。
|
||
|
||
|
||
○(予習)鍵レジスタの種類
|
||
|
||
次の4組の鍵レジスタの組み合わせが存在する。
|
||
AESコアで使用される鍵はこれらとは別に存在する点に注意!
|
||
|
||
KEY[0] ID[0] SEED[0]
|
||
KEY[1] ID[1] SEED[1]
|
||
KEY[2] ID[2] SEED[2]
|
||
KEY[3] ID[3] SEED[3]
|
||
|
||
○(予習)鍵レジスタの基本事項
|
||
|
||
それぞれが独立したレジスタであるが、SEED[x][3]を設定したときに、
|
||
|
||
SEED[x] + ID[x] => KEY[x]
|
||
|
||
という計算処理(KEYへの書き込み)がおこなれる(計算式は秘密)。
|
||
|
||
また、任意のタイミングでKEYのひとつをAESコアに送ることができる。
|
||
このAESコアに送る作業を行わない限りAESコアで使用される鍵は
|
||
変更されない。
|
||
|
||
○(予習)種別ごとの意味合い
|
||
|
||
KEYは一般的なAES回路として他のシステムとやり取りするような
|
||
データを取り扱うときにのみ直接書き込む。
|
||
|
||
IDとSEEDは任天堂依存のやりとりで使うことになるが、
|
||
基本的にIDの方はシステム側であらかじめ設定しておき、
|
||
アプリケーションには操作させない。
|
||
|
||
|
||
●IDによるそれぞれの鍵の方針
|
||
|
||
デバイス依存 アプリケーション依存
|
||
(ユニークID) (イニシャルコード)
|
||
0: × ○
|
||
1: ○ ○
|
||
2: × ×
|
||
3: ○ ×
|
||
|
||
ここで、デバイス依存とは、eFuseの内容を反映するということ。
|
||
また、アプリケーション依存とは、ROMヘッダ辺りを反映するということ。
|
||
|
||
上記の内容を反映するように、IDを設定することになる。
|
||
具体的には、イニシャルコードに依存するID[0][y]とID[1][z]については
|
||
アプリケーションローダーで初期化し、それら以外の部分については、
|
||
IPL ROMで設定した値から二度と変更しない。
|
||
|
||
ただし、KEYを直接設定する場合は、上記の意味合いは関係ない。
|
||
|
||
|
||
●アプリケーションが触ることのできる部分
|
||
|
||
アプリケーションには、KEY[2]、SEED[0]~SEED[3]を使えるようにする。
|
||
ただし、とりあえずはSEED[2]は解放しない。
|
||
|
||
|
||
●ARM7側初期化コード
|
||
|
||
ROMコードで全レジスタの初期値を設定している。
|
||
大半はダミーだが、IDの固定値はここでのみの設定となる。
|
||
|
||
アプリケーションローダー用に、TwlFirm内にIDのgame_code依存
|
||
部分のみを再設定するコードを用意している。
|
||
|
||
アプリケーション起動後はIDを触ることは無い。
|
||
|
||
|
||
●ARM9側API
|
||
|
||
次のような個別のAPIを用意してみた。
|
||
|
||
AES_SetGeneralKey() KEY[2]に鍵を設定する
|
||
AES_SetSystemKey() SEED[3]に鍵を設定する
|
||
AES_SetGameKey() SEED[0]に鍵を設定する
|
||
AES_SetSpecialKey() SEED[1]に鍵を設定する
|
||
//AESi_SetAlternativeKey() SEED[2]に鍵を設定する (非公開)
|
||
|
||
それぞれ引数をすぐに有効にするもので、「以前の鍵」という使い方は
|
||
(とりあえず)できないようにしている。
|
||
|
||
|
||
●ARM7側API
|
||
|
||
個別に指定することも上記APIを使用することもできる。
|
||
個別設定用に、次のenumを用意している。
|
||
|
||
typedef enum
|
||
{
|
||
AES_KEYSEL_GAME = 0,
|
||
AES_KEYSEL_SPECIAL = 1,
|
||
AES_KEYSEL_ALTERNATIVE = 2,
|
||
AES_KEYSEL_SYSTEM = 3,
|
||
|
||
AES_KEYSEL_IPL = AES_KEYSEL_ALTERNATIVE,
|
||
|
||
AES_KEYSEL_GENERAL = 2 // for key register
|
||
}
|
||
AESKeySel;
|