Howto

EdgeLock SE050 ミドルウェア (Plug&Trust MW) のビルドと X.509 証明書の取得

Howto で出来ること

EdgeLock SE050 にアクセスするためのミドルウェアをビルドして Alpine Linux のコンテナにインストールする。その後で X.509 証明書 とリファレンスキーを取得する。

Howto の概要

  • Armadillo に搭載される EdgeLock SE050 にアクセスするために NXP Semiconductors 製 Plug & Trust middleware をビルドする
  • ターゲットボード上の Alpine Linux のコンテナでビルド作業を行ってライブラリをターゲットボードにインストールする
  • Plug & Trust middleware に含まれるサンプルアプリケーション se05x_GetInfo を利用してミドルウェアの動作を確認する
  • EdgeLock SE050 の CLI 管理ツール (ssscli) を Alpine Linux にインストールする
  • EdgeLock SE050 にプリインストールされている X.509 証明書とその対となるリファレンスキーを ssscli を用いて取得する

EdgeLock SE050

NXP Semiconductors 製 EdgeLock SE050 (以下「SE050」という) は IoT アプリケーション向けのセキュアエレメントです。様々なアルゴリズムに対応した暗号エンジン、セキュアストレージを搭載します。内部処理は秘密鍵を露出させることなくセキュアに暗号処理を行うことができます。外部インターフェースは I2C を採用して GlobalPlatform が規定する Secure Channel Protocol 03 に準拠し、バスレベル暗号化 (AES)、ホストとカードの相互認証 (CMAC ベース) を行うことも可能です。また、SE050 はターンキーソリューションとして利用を開始してすぐにクラウドサービスなど PKI を基にしたサービスに接続することができます。チップ固有の X.509証明書などが事前にプロビジョニングされた状態で出荷されます。

SE050 を有効にする

以下を参考に SE050 の Deep Power-down を解除してください。

Plug & Trust Middleware をビルドする

ビルド環境を構築する

Plug and trust ミドルウェアをダウンロードします。

以下のサイトからダウンロードします。ここではユーザーが NXP Semiconductors のサイトで最新版を検索してダウンロードすることを想定しています。

取得したファイルはコンテナから参照できる位置に配置しておいてください。

- ダウンロードには NXP Semiconductors サイトへのユーザー登録が必要になります
- 本 Howto 作成時点では 04.00.00 を利用しました

コンテナを立ち上げる

NXP Semiconductors のビルド環境はターゲットボード上のコンテナになります。ここでは alpine を利用します。

コンテナを立ち上げる前に Fash メモリに書き込むために、保存先をディスクに変更します。 一次的に利用するだけであれば以下の作業は不要です。

[armadillo ~]# podman_switch_storage --disk

Alpine Linux コンテナを立ち上げます。

[armadillo ~]# podman run -it --name=dev_se050 --device=/dev/i2c-2 \
        -v "$(pwd)":/mnt docker.io/alpine /bin/sh

ビルド環境を構築する

plug and trust をビルドするために必要なパッケージをインストールします。

[container ~]# apk add musl-dev gcc make g++ file \
        linux-headers openssl openssl-dev cmake python3

Plug and trust ミドルウェアを展開します。

[container /mnt]# unzip SE-PLUG-TRUST-MW.zip

ビルドスクリプトを変更する

コンテナ上でビルドスクリプトを実行すると正しくプラットフォームを認識できないために、異なるプラットフォーム向けのバイナリを作ってしまいます。imx_native_se050_t1oi2c_openssl_el2go 向けを強制的に True になるように変更する必要があります。以下が変更箇所です。i.MX6UL/ULL, i.MX8M Mini 向けの条件文が真になるように変更します。

[container /mnt]# cd simw-top
[container /mnt/simw-top]# vi scripts/create_cmake_projects.py
: (省略)
    # i.MX6UL/ULL and i.MX8M Mini EVK
    if True: #gc.imx_native_compilation() and gc.is_with_el2go(): 1
        e = gc.generate_native("imx_native_se050_t1oi2c_openssl_el2go", {
            "PTMW_Applet": "SE05X_C",
            "PTMW_SE05X_Auth": "None",
: (省略)

if 文を強制的に True にする。元の行はコメントアウトした

ビルドする

プロジェクトをつくるスクリプトを実行する。

[container /mnt]# cd simw-top
[container /mnt/simw-top]# python3 scripts/create_cmake_projects.py
### Native compilation on iMX Linux for SE05X using T=1 Over I2C for EdgeLock 2GO
#cmake -DPTMW_Applet=SE05X_C -DPTMW_SE05X_Auth=None (省略)...
-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 10.3.1
: (省略)
-- Generating done
 Build files have been written to: /simw-top_build/(省略)...

simw-top_build に移動してビルドする。

[container /mnt]# cd simw-top_build/imx_native_se050_t1oi2c_openssl_el2go
[container /mnt/simw-top_build/imx_native_(省略)...]# cmake --build .
: (省略)
[  1%] Linking C shared library libmwlog.so
[  1%] Built target mwlog
[100%] Linking C executable ../../../bin/nxp_iot_agent_demo
[100%] Built target nxp_iot_agent_demo

インストールする

ビルド結果をインストールします。

[container /mnt/simw-top_build/imx_native_(省略)...]# make install
[container /mnt/simw-top_build/imx_native_(省略)...]# ldconfig /usr/local/lib

ビルド結果の確認

以下の2つのディレクトリができる。

[container /mnt/simw-top_build]# ls
imx_native_se050_t1oi2c_openssl_el2go  simw-top-eclipse_jrcpv1

以下のデモアプリケーションがビルドされる。

[container /mnt/simw-top_build/imx_native_se050_t1oi2c_openssl_el2go]# ls bin
MQTTVersion                      se05x_ConcurrentEcc
accessManager                    se05x_ConcurrentSymm
apdu_player_demo                 se05x_Delete_and_test_provision
claimcode_inject                 se05x_GetInfo
ex_attest_ecc                    se05x_I2cMaster
ex_attest_mont                   se05x_I2cMasterWithAttestation
ex_ecc                           se05x_InjectCertificate
ex_ecdaa                         se05x_InvokeGarbageCollection
ex_ecdh                          se05x_MandatePlatformSCP
ex_hkdf                          se05x_Minimal
ex_hmac                          se05x_MultiThread
ex_md                            se05x_MultipleDigestCryptoObj
ex_policy                        se05x_PCR
ex_rsa                           se05x_ReadWithAttestation
ex_se05x_WiFiKDF_derive          se05x_TimeStamp
ex_se05x_WiFiKDF_inject          se05x_TransportLock
ex_symmetric                     se05x_TransportUnLock
generate_certificate             se05x_ex_export_se_to_host
generate_certificate_key         se05x_ex_import_host_to_se
jrcpv1_server                    seTool
nxp_iot_agent_demo               test_Crypto
remote_provisioning_client

サンプルアプリケーションで動作を確認する

se05x_GetInfo を実行する。SE050 にアクセスできると以下のようなログが出力される。

[container /mnt/simw-top_build/imx_native_(省略)/bin]# ./se05x_GetInfo \
 /dev/i2c-2:0x48
App   :INFO :PlugAndTrust_v03.03.00_20210528
App   :INFO :Running ./se05x_GetInfo
App   :INFO :Using PortName='/dev/i2c-2:0x48' (CLI)
: (省略)
App   :WARN :#####################################################
App   :INFO :Applet Major = 3
App   :INFO :Applet Minor = 1
App   :INFO :Applet patch = 1
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
: (省略)

X.509 証明書とリファレンスキーの取得

ssscli のインストール

SE050 ミドルウェア をビルドしてからこの作業を行ってください。

ssscli は SE050 にアクセスすることができる NXP 製のアプリケーションです。 Plug & Trust MW のリリースされたソースファイルに含まれているので、 ここでは Plug & Trust MW のビルドで使用した環境のコンテナとソースファイルを再度、利用していきます。

必要なパッケージをインストールします。

[container ~/simw-top]# apk add py3-pip gcc libffi-dev python3-dev musl-dev

pip を新しくしないとインストールに失敗するケースがあるので回避策です。

[container ~/simw-top]# pip install --upgrade pip

必要なパッケージをインストールします。

[container ~/simw-top]# cd pycli
[container ~/simw-top/pycli]# pip3 install -r requirements.txt

コンソール出力

Collecting click
  Downloading click-8.0.3-py3-none-any.whl (97 kB)
  (省略)...
Collecting cryptography
  Downloading cryptography-36.0.1-cp36-abi3-musllinux_1_1_aarch64.whl (3.7 MB)
  (省略)...
Successfully installed cffi-1.15.0 click-8.0.3 cryptography-36.0.1 func-timeout-4.3.5 pycparser-2.21

ssscli をインストールします。

[container ~/simw-top/pycli]# pip3 install --editable src

コンソール出力

Preparing metadata (setup.py) ... done
Requirement already satisfied: cffi in /usr/lib/python3.9/site-packages (from ssscli==4.0.0) (1.15.0)
 : (省略)
Successfully installed ssscli-4.0.0

証明書とリファレンスキーを取得する

本 Howto では例として以下の証明書とリファレンスキーを取得します。別の鍵を選択することもできます。その場合は適宜、読み替えてください。

key name ID
Cloud connection key 0,
RSA2048, Die Indivisual
0xF0000110 (refkey)
0xF0000111 (cert)

接続します。

[container ~/]# mkdir cert
[container ~/]# cd cert
[container ~/cert]# ssscli connect se050 t1oi2c /dev/i2c-2:0x48

X.509 証明書を取得します。

[container ~/cert]# ssscli get bin 0xF0000111 ./device_cert.der

コンソール出力

Getting Binary data from KeyID = 0xF0000111
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 
sss   :WARN :Communication channel is Plain.
sss   :WARN :!!!Not recommended for production use.!!!
Retrieved Binary from KeyID = 0xF0000111

証明書を Azure IoT Hub DPS に登録する際に PEM 形式で登録するので PEM 形式に変換する。

openssl x509 -in device_cert.der -inform der -out device_cert.pem -outform pem

リファンレンスキーを取得する

[container ~/cert]# ssscli refpem rsa pair 0xF0000110 key.pem

コンソール出力

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 
sss   :WARN :Communication channel is Plain.
sss   :WARN :!!!Not recommended for production use.!!!
Created reference key for RSA Pair from KeyID = 0xF0000110

取得作業は以上なので切断します。

[container ~/cert]# ssscli disconnect