twl_wrapsdk/readme-AES.txt
yutaka b2371f139e small fix
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@165 4ee2a332-4b2b-5046-8439-1ba90f034370
2007-07-03 10:55:12 +00:00

116 lines
3.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

=======================
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;