はじめに
Renesas TSIPは、Renesas RXシリーズで利用できるMCU組み込みのセキュリティソリューションです。
秘密鍵管理のためにTSIPを使おうとすると、いろいろと準備が必要でした。
この記事は、Renesas TSIPを使えるようにするためのシリーズ記事の一つで、TSIPでの鍵管理についてのものです。
筆者はRenesas から個別提供されるTSIPのソースコード版を見ることができません。間違いがあるかもしれませんので、そのつもりでご覧いただければ(そして修正点を教えていただけると)嬉しいです。
TSIPでの鍵の種類
TSIPでは、3種類の鍵の種類があります。
平文鍵
Renesasのドキュメントでは平文鍵とは書かれていません。暗号化、署名・署名検証などに使える普通の鍵データです。
平文鍵には、ユーザ鍵、UFPK、KUKがあります。
ユーザ鍵
ユーザ鍵は、アプリケーションが使用する任意の鍵です。RSA/ECCの秘密鍵や公開鍵、AESの共通鍵などです。
MCUは平文の鍵を受け付けないため、ユーザ鍵は後述のUFPKまたはKUKにより暗号化して注入することが必須です。
UFPK
UFPKはユーザ鍵(および後述のKUK)をMCUに注入する際に利用する鍵で、ユーザがSecurity
Key Management Toolで作成します。ユーザ鍵(およびKUK)を注入する際にUFPKで暗号化することにより、ユーザ鍵(およびKUK)を平文でやり取りすることを避けることができます。
UFPK自体をMCUに注入するためにも暗号化が必須です。このために利用されるのがHRKと呼ばれるユーザには不可視の鍵で、HRKはRenesas DLM ServerとTSIP内部にのみ存在します。
ユーザは、生成したUFPKをMCUに注入するためRenesas DLM Serverに送ります。Renesas DLM Serverは暗号化したUFPKを返してくるので、これをMCUに注入します。
UFPKをRenesas DLM Serverに送信したり暗号化されたUFPKを受信したりするためには安全な通信路が必要です。インターネット上で安全な通信路を確保するために、PGPによる暗号化・復号化が利用されています。
KUK
KUKはユーザ鍵をMCUに注入する際に利用する鍵で、ユーザがSecurity
Key Management Toolで作成します。ユーザ鍵を注入する際にKUKで暗号化することにより、ユーザ鍵を平文でやり取りすることを避けることができます。
KUK自体をMCUに注入するためにも暗号化が必須です。このために利用されるのはUFPKです。
Encrypted Key
ユーザ鍵、UFPK、KUKをMCUにインストールする際、平文鍵をそのまま注入することはできません。必ず暗号化して注入する必要があり、暗号化された鍵のことをEncrypted Key と呼びます。
- ユーザ鍵:UFPKまたはKUKにより暗号化された状態でMCUに注入します。UFPKおよびKUKはPC上で生成するものなので、ユーザ鍵の暗号化はPC上で行うことができます。
- KUK:UFPKにより暗号化された状態でMCUに注入します。UFPKはPC上で生成するものなので、KUKの暗号化はPC上で行うことができます。
- UFPK:HRKにより暗号化された状態でMCUに注入します。HRKはRenesas DLM ServerおよびTSIP内部にのみ存在するものなので、UFPKの暗号化はPC上で行うことができず、必ずRenesas DLM Serverで行う必要があります(TSIPでUFPKの復号化は行われません)。
ユーザ鍵とKUKの平文鍵からEncrypted Keyを生成するためのソフトウェアとして、Renesas からSecurity Key Management Toolが提供されています。
UFPKの平文鍵からEncrypted Keyを生成することは、Renesas DLM Server でのみ行うことが可能です。
Encrypted KeyはMCUごとのキーではなく、全MCUで共通の情報です。
Encrypted Keyはデータフラッシュに保存することができますが、仮にデータフラッシュのデータをコピーされた場合、コピー先のMCUでも同じ鍵を利用することができてしまいます。
Wrapped Key
Encrypted KeyをMCUに注入し、TSIPで使用できる形式にしたものです。以下の関数で変換します。
-
R_TSIP_GenerateXXXKeyIndex
: UFPKによりユーザ鍵が暗号化されたEncrypted KeyをWrapped Keyに変換します。 -
R_TSIP_UpdateXXXKeyIndex
: KUKによりユーザ鍵が暗号化されたEncrypted KeyをWrapped Keyに変換します。 -
R_TSIP_GenerateUpdateKeyRingKeyIndex
: UFPKによりKUKが暗号化されたEncrypted KeyをWrapped Keyに変換します。
Wrapped Keyは、MCU内部で乱数生成することもできます。以下の関数を利用します。
R_TSIP_GenerateXXXRandomKeyIndex
Wrapped Keyは、HUKと呼ばれるデバイス固有の暗号鍵により暗号化されているため、各デバイス固有の情報です。
Wrapped Keyはデータフラッシュに保存することができますし、仮にデータフラッシュをコピーされてもデバイス固有の情報のため同じ鍵を利用することはできません。
どう使うか
以下のように利用したいと思います。
UFPKおよびKUKのEncrypted Keyをプロビジョニング時に注入し、R_TSIP_GenerateUpdateKeyRingKeyIndex
でKUKのWrapped Keyを生成します。その後、データフラッシュにはKUKのWrapped Keyを保存します。
これで、以下の状態ができます:
- PC上にはKUKの平文鍵が存在する。通信路上ではUFPKはHRKで、KUKはUFPKで暗号化されているため鍵は漏洩しない。
- デバイス上にはKUKのWrapped Keyが存在する。このデータはデバイス固有なのでコピーされて漏洩することはない。
ユーザ鍵は、KUKで暗号化してEncrypted Keyを生成します(Security Key Management Toolを使う)。
この情報をMCUに注入し、R_TSIP_UpdateXXXKeyIndex
によりユーザ鍵のWrapped Keyを生成します。その後、データフラッシュにはユーザ鍵のWrapped Keyを保存します。
これで、以下の状態ができます:
- PC上にはユーザ鍵の平文鍵が存在する。通信路上ではKUKで暗号化されているため鍵は漏洩しない。
- デバイス上にはユーザ鍵のWrapped Keyが存在数る。このデータはデバイス固有なのでコピーされて漏洩することはない。