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