reTerminalのハードウェアセキュリティ - 概要&プロビジョニング -

Seeed K.K.の松岡です。
週末に、初めてタケノコ掘りに行きました。スコップを持って竹林をウロウロ、タケノコと格闘しました。1時間程度しか動いていないにもかかわらず、身体中が痛いです。明らかに運動不足ですね。

今回は、reTerminalに内蔵しているハードウェアセキュリティとセットアップの方法を紹介します。

reTerminalのハードウェアセキュリティ

reTerminalには、標準でMicrochip社のATECC608Aというハードウェアセキュリティモジュール(HSM)というチップを内蔵しています。このチップを使用すると、(対称暗号の)暗号鍵や(非対称暗号の)秘密鍵をチップ内部に隠蔽することができます。鍵の漏洩を防いで、セキュリティをより高めることができます。

ざっくりとした仕掛けはこんな感じです。
公開鍵や秘密鍵、暗号鍵はチップ内部のEEPROMに保管されています。暗号化や復号化といった、秘密鍵や暗号鍵を使わなければいけない処理は、チップ内部の暗号アクセラレータにデータを渡して処理してもらいます。こうすることで、秘密鍵や暗号鍵はチップ外部に持ち出さなくても済みます。また、秘密鍵や暗号鍵の生成も暗号アクセラレータが実施することで、これらの鍵をチップ内部だけに完全に隠蔽することができます。

ATECC608Aの種類

ATECC608Aは、購入後、その利用方法に応じてセットアップしなければ使うことができません。これをプロビジョニングといいます。プロビジョニングは1回しか実行できません。後からセットアップを変更することはできないので、慎重に行う必要があります。プロビジョニングは少し面倒で、かつ、正確にセットアップするにはNDA(秘密保持契約)が必要な資料が必須です。

これは不憫だろうと思ったかどうか分かりませんが、Microchipがプロビジョニングを実行したチップも販売しています。

Trust Platform for the CryptoAuthentication™ Family

  • 無印
    • 未プロビジョニング品。購入後、プロビジョニング必要。自由に設定可能。
  • TRUST & GO
    • Microchipが決めた設定でプロビジョニング済み。購入は10個から。
  • TRUST FLEX
    • Microchipが決めた設定でプロビジョニング済み。クレデンシャルは指定のものにしてくれる。購入は2000個から。
  • TRUST CUSTOM
    • 指定した設定でプロビジョニング済み。4000個から。

では、reTerminalはどれを内蔵しているのかというと、、、無印の未プロビジョニング品です。
自由度が高い反面、プロビジョニングしなければいけません。

プロビジョニングしてみよう

それでは、ATECC608Aをプロビジョニングしましょう。
以降の手順を実施すると、以下のようにセットアップされます。(分かりやすさを重視して、いくつか省略&意訳して書いています。 )

スロット 用途 用途(英語) 書き込み 読出し
0 デバイス秘密鍵 Device Private Key × ×
1
2 フリー秘密鍵 Free Private Key 〇(ReGen) ×
3 フリー秘密鍵 Free Private Key 〇(ReGen) ×
4 フリー秘密鍵 Free Private Key 〇(ReGen) ×
5
6 IO保護鍵 IO Protection Key ×
7
8
9 AES秘密鍵 AES Secret Key ×
10
11
12
13
14
15

ツールをインストールする

deb-srcを有効化

/etc/apt/sources.listの、deb-src~の行頭にある#を削除して、dev-srcへの参照を有効にしてください。

/etc/apt/sources.list:

$ sudo vi /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi

libp11をコンパイル&インストール

下記コマンドで、libp11をコンパイル、インストールしてください。

$ sudo apt update
$ sudo apt build-dep libengine-pkcs11-openssl1.1
$ cd ~
$ git clone https://github.com/OpenSC/libp11.git
$ cd libp11
$ ./bootstrap
$ ./configure
$ make
$ sudo make install

cryptoauthlibをコンパイル&インストール

下記コマンドで、cryptoauthlibをコンパイル、インストールしてください。

$ sudo apt install cmake libudev-dev
$ cd ~
$ git clone https://github.com/MicrochipTech/cryptoauthlib -b v3.3.3
$ cd cryptoauthlib
$ mkdir build;cd build
$ cmake -DATCA_HAL_I2C=ON -DATCA_PKCS11=ON -DATCA_TNGTLS_SUPPORT=ON -DATCA_ATECC608A_SUPPORT=ON -DATCA_OPENSSL=ON ../
$ cmake --build .
$ sudo make install

cryptoauthlibを設定

/var/lib/cryptoauthlib/0.confを作成してください。

/var/lib/cryptoauthlib/0.conf:

$ vi /var/lib/cryptoauthlib/0.conf
label = MCHP
interface = i2c,0xC0,3
freeslots = 2,3,4
object = private,device,0

p11-kit-proxyをインストール

下記コマンドで、p11-kit-proxyをインストールしてください。

$ sudo apt install p11-kit

p11-kit-proxyを設定

/etc/pkcs11/pkcs11.conf/usr/share/p11-kit/modules/cryptoauthlib.moduleを作成してください。

/etc/pkcs11/pkcs11.conf:

$ sudo mkdir /etc/pkcs11
$ sudo vi /etc/pkcs11/pkcs11.conf
user-config: merge

/usr/share/p11-kit/modules/cryptoauthlib.module:

$ sudo vi /usr/share/p11-kit/modules/cryptoauthlib.module
module: /usr/lib/libcryptoauth.so
critical: yes
trust-policy: yes
managed: yes
log-calls: no

p11toolをインストール

下記コマンドで、p11toolをインストールしてください。

$ sudo apt install gnutls-bin

プロビジョニングする

cryptoauthtoolsをインストール

下記コマンドで、 cryptoauthtoolsをインストールしてください。

$ cd ~
$ git clone https://github.com/SeeedJP/cryptoauthtools
$ cd cryptoauthtools/python/examples
$ sudo pip3 install -r requirements.txt
$ sudo pip3 uninstall cryptoauthlib
$ sudo pip3 install cryptoauthlib==20221018

2022/11/8追記:
pip3 uninstall/installで、cryptoauthlib v3.3.3に対応したPythonパッケージのバージョンに戻します。

ロック状態を確認

チップがプロビジョニング前であることを確認します。
下記コマンドを実行して、Check Device LocksのConfig ZoneとData Zoneがunlockedと表示されればプロビジョニング前です。

$ python3 ~/cryptoauthtools/python/examples/info.py -i i2c -p bus=3
...
Check Device Locks
    Config Zone is unlocked
    Data Zone is unlocked
...

プロビジョニングを実行

さあ、いよいよプロビジョニングの実行です。
プロビジョニングを実行すると、チップの設定を変更することが出来なくなります。ご了承ください。
(どうしても変更しなければいけない事態になったときは、新品のチップを入手して取り換えるしかないです。)

下記コマンドを実行して、プロビジョニングしてください。

$ python3 ~/cryptoauthtools/python/examples/config.py -i i2c --i2c c0 -p bus=3

実行すると、Would you like to continue executing this script?と表示されて、このまま継続実行するか聞かれます。
落ち着いて、"Y"と入力してください。

--- WARNING - THIS IS FOR DEMONSTRATION NOT FOR ACTUAL CONFIGURATION ---
The configuration this script will program is for demonstration purposes only

You should use the Trust Platform Development Suite for device configuration

  https://www.microchip.com/en-us/products/security-ics/trust-platform#Getting%20Started

Would you like to continue executing this script?
  Continue (Y/n): Y

すると、あっという間にプロビジョニングされます。
最後にDevice Successfully Configuredと表示されれば成功です。

ロック状態を確認(2回目)

再度、ロック状態を確認すると、Check Device LocksのConfig ZoneとData Zoneがlockedと表示されます。

$ python3 ~/cryptoauthtools/python/examples/info.py -i i2c -p bus=3
...
Check Device Locks
    Config Zone is locked
    Data Zone is locked
...

デバイス秘密鍵とデバイス公開鍵を確認する

いやー、なかなか大変でしたね。プロビジョニング作業。
それでは、デバイスの秘密鍵と公開鍵が参照できるか見てみましょう。

p11tool --list-allコマンドを実行すると、Object 0にPrivate key、Object 1にPublic keyが割り当てられているのが確認できます。

$ p11tool --list-all "pkcs11:token=MCHP"
Object 0:
        URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=23BB88A662A58AEE;token=MCHP;object=device;type=private
        Type: Private key (EC/ECDSA-SECP256R1)
        Label: device
        Flags: CKA_PRIVATE; CKA_SENSITIVE;
        ID:

Object 1:
        URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=23BB88A662A58AEE;token=MCHP;object=device;type=public
        Type: Public key (EC/ECDSA-SECP256R1)
        Label: device
        ID:

では、p11tool --exportコマンドで鍵を表示しましょう。

デバイス公開鍵は、、、

$ p11tool --export "pkcs11:token=MCHP;object=device;type=public"
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzQ/W+AczyMKPZssApqDe5Q+CPpPQ
0GzyQBqw52OyiHCYLs6yWDwdSRBpWV05Zie17HpKD1Vu1dcEeRAnnTN4GQ==
-----END PUBLIC KEY-----

表示されました!

では、デバイス秘密鍵は、、、

$ p11tool --export "pkcs11:token=MCHP;object=device;type=private"
Error in pkcs11_export:557: The requested data were not available.

表示されません。(←正常です)

最後に

いかがでしたか?reTerminalのハードウェアセキュリティ、雰囲気は感じてもらえたのではないでしょうか。
ツールのインストールとプロビジョニングが完了したので、MicrochipのCryptoAuthentication Library(CryptoAuthLib)や、OpenSSL with PKCS#11でATECC608Aが利用できるようになりました。
アプリケーションをどのように書けばいいのか?については、別記事を投稿したいと思います。お楽しみに。

参考リンク

変更履歴

日付 変更者 変更内容
2022/4/12 松岡 作成
2022/11/7 松岡 "sudo apt update"を追記
2022/11/8 松岡 "cryptoauthlib==20221018"をインストールする手順に変更
2022/11/14 松岡 "info.py, config.pyのI2Cバス指定オプションを変更