NXP SE050検証(I2C経路暗号化)(NXP SE050 encrypting I2C transmission)

#はじめに#
2019/12/14に開かれた　IoTSecJPにてお時間をいただき
[セキュアエレメントとIoTデバイスセキュリティ](https://www.slideshare.net/KentaroMitsuyasu1/secure-element-for-iot-device)
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。

#I2C通信の暗号化#
ホストマイコンからI2Cで鍵情報を送る際、ロジアナで読み取られないようにI2C経路を暗号化したい。
ATECC608Aでは、IOProtectionKeyというもので暗号化、復号を行いI2C経路を守る仕組みを備えていた。

同じようなことがSE050 でできないか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/7e549286-f649-70ca-cdb6-28bfe9bb7bb4.png)

現状のNXP SE050を動作させるテストコード[NXP SE050検証(ESP32へのポーティング編)(Porting NXP SE050 to ESP32)](https://qiita.com/kmitsu76/items/37d0eb2b6c3bc2cb42ba)は実行すると、下記の警告が出る。

```
       sss:WARN :Communication channel is Plain.
       sss:WARN :!!!Not recommended for production use.!!!

```

まずはこれが出なくなるようにしたい。

#NXP SE050の暗号化の整理#

NXPのドキュメント[SE050 - User Guidelines](https://www.nxp.com/docs/en/user-guide/AN12514.pdf)によると、以下のようになるらしい。

5.1.2セッション
SE050では、次のいずれかのセキュアオブジェクトとのセッションを開くことができます。
•userID（UserIDセッションを開くため）
•AES128キー（SCP03セッションを開くため）
•ECKeyペアまたはEC公開キー（FastSCPセッションを開くため）
UserIDセッションはプレーンな通信を使用していますが、SCP03またはFastSCPセッションはSCP03の安全なメッセージに依存しているため、エンドツーエンドの保護を提供します（セキュリティの推奨事項を参照）。

ユーザーが上記を使用してセッションを開いた場合：

•バインドされていないユーザーのアクセス権は適用されなくなります
•ユーザーは、セッションを開くために使用された認証オブジェクトIDによって認識され、バインドされたユーザーになります。
デフォルトでは、SCP03またはFastSCPセッションが確立されると、アプレットレベルのSCPがこの特定のセッションにエンドツーエンドで適用されます。
アプレットレベルのSCPはSCP03secureメッセージングを使用しています。 SCP03とFastSCPセッションの違いは認証方法です。SCP03は対称暗号に基づいており、FastSCPは認証に非対称暗号を使用しています。認証されたユーザーセッションは、セッションを安全に使用するための推奨事項を提供します。
Platform SCPが使用される場合、アプレットレベルのSCPはPlatform SCPチャネル内にラップされることに注意してください。

絵にすると下記のようになるようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/547b9b99-7845-7478-eade-883d4083f185.png)
platformSCP03とSecureObjectの設定は重ね掛けができるようだ。
今回、PlatformSCP03の暗号化を試してみる。

#PlatformSCP03の設定ポイント#

まず、デフォルトで設定されているENC,MAC,DEKの鍵を見つける必要がある。
[SE050 Configurations](https://www.nxp.com/docs/en/application-note/AN12436.pdf)を見ると、
5ページに「default platform SCP Keys」という項目があり、デフォルトの3点セットの値がわかる。
それぞれの定義はNXPのPlug&Trust MW内、ex_sss_tp_scp03_keys.hにある。
これがデフォルトだと設定ファイルex_sss_auth.h上で”Development Board”用になっているので、今回手元にある“SE050C1”用に置き換える。

そうして、いくつかPlatformSCP03の定義を追加してビルドできた。
ソースコードは[NXP-SE050-Test-PlatformSCP03](https://github.com/kmwebnet/NXP-SE050-Test-PlatformSCP03)に置いた。

実行させたところ。

```
       App:INFO :PlugAndTrust_v02.12.04_20200228
       App:INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
       sss:INFO :atr (Len=35)
      00 A0 00 00    03 96 04 03    E8 00 FE 02    0B 03 E8 08
      01 00 00 00    00 64 00 00    0A 4A 43 4F    50 34 20 41
      54 50 4F
       App:WARN :#####################################################
       App:INFO :uid (Len=18)
      04 00 50 01    4A 66 D8 75    07 78 E6 04    7E 91 0A 94
      66 80
       App:WARN :#####################################################
       App:INFO :Applet Major = 3
       App:INFO :Applet Minor = 1
       App:INFO :Applet patch = 0
       App:INFO :AppletConfig = 6FFF
       App:INFO :With    ECDAA
       App:INFO :With    ECDSA_ECDH_ECDHE
       App:INFO :With    EDDSA
       App:INFO :With    DH_MONT
       App:INFO :With    HMAC
       App:INFO :With    RSA_PLAIN
       App:INFO :With    RSA_CRT
       App:INFO :With    AES
       App:INFO :With    DES
       App:INFO :With    PBKDF
       App:INFO :With    TLS
       App:INFO :With    MIFARE
       App:INFO :With    I2CM
       App:INFO :SecureBox = 010B
       App:INFO :ex_sss Finished

```

通信が平文である警告が消えたが、デフォルトのままだと3つの鍵が公開情報なので、適切に鍵を置き換えなくてはならない。
鍵置き換えのデモが、Plug&Trust MW内の「SE05X Rotate PlatformSCP Keys Demo」となる。