はじめに
TSIPにおいて、Encrypted Keyは暗号化されているもののMCUとの紐づけはありません。デバイスごとのHUKで暗号化され、デバイスとの紐づけが行われた形式のことをWrapped Keyと呼びます。
この記事は、RX65N上でKUKのWrapped Keyを計算するためのものです。
プロビジョニング時に行う操作(のはず)ですが、ここでは簡単にするため、Security Key Management ToolでKUKのラッピングを行い、Cソースで出力した状態を想定します。
準備
e2studio でプロジェクトを作成し、FITモジュール r_tsip_rx を組み込んでおきます。
Wrapped Key計算コード
以下のようにしてKUKのWrapped Keyを計算することができます。
#include "r_tsip_rx_if.h"
#include "w-kuk.h"
tsip_update_key_ring_t kuk_wrapped;
void generate_kuk_wrapped_key(void)
{
R_TSIP_Open(NULL, NULL);
R_TSIP_GenerateUpdateKeyRingKeyIndex(
g_encrypted_user_key_data.wufpk,
g_encrypted_user_key_data.initial_vector,
g_encrypted_user_key_data.encrypted_user_key,
&kuk_wrapped);
R_TSIP_Close();
}
w-kuk.h はSecurity Key Management ToolがKUKのラップされた鍵として出力したCソースファイルで、g_encrypted_user_key_data
を宣言・定義しています。
上記generate_kuk_wrapped_key
関数を実行することで、kuk_wrapped
にKUKのWrapped Keyが計算されます。
上記コードのようにCソースファイルとしてSecurity Key Management Toolの出力をファームウェアに取り込むと、この情報をコピーすることでKUKによる操作ができてしまいます。
実際は、Security Key Management Toolの出力をシリアル経由で与え、フラッシュには保存しないなど工夫が必要です。
作成されたKUKのWrapped Keyは、計算ごとに値が変わります。
また、KUKのWrapped Keyをフラッシュに保存しておくことが可能です。Wrapped Keyだけを保存することで、キーのコピーを防ぐことが可能です。
KUK のWrapped Key利用方法
R_TSIP_Open
の第二引数にKUK のWrapped Keyを指定することで、KUKで暗号化されたユーザ鍵(Encrypted Key)をMCUに注入で切るようになります。
#include "r_tsip_rx_if.h"
/* フラッシュに保存されている想定 */
tsip_update_key_ring_t kuk_wrapped = {...};
void test(void)
{
R_TSIP_Open(NULL, &kuk_wrapped);
/* 以後、KUKで暗号化されたユーザ鍵を注入できる */
}
ユーザ鍵について
ここまでの設定で、やっとユーザ鍵を安全に配送しMCUに注入できるようになります。
- KUKの平文鍵がPC上に存在する。
- KUKのWrapped KeyがMCU上に存在する。フラッシュがコピーされると利用不可。
次回以降、ユーザ鍵をKUKで暗号化してMCUに注入する方法を見たいと思います。