LoginSignup
1
0

Renesas TSIP⑦:RX65N上でユーザ鍵のWrapped Key計算

Posted at

はじめに

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();
}
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