LoginSignup
1
0

Renesas TSIP⑤:RX65N上でKUKのWrapped Key計算

Posted at

はじめに

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に注入する方法を見たいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0