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