はじめに
これまで、Microchip,NXP,Infineonなどのセキュアエレメントを調査したが、STMicro社製STSAFE-A110を触ってみたのでまとめてみる。
セキュアエレメントについて:
IoT製品の秘密鍵秘匿のための製品としてセキュアエレメントが存在する。
I2Cバスを介して、ホスト側のミドルウェアを使い、操作を行うことができる。
製品について
入手できたのはSTSAFE-A110のSPL02というプロファイルのもの。
メーカー公式ドキュメントとしては、SPL03というものもあるが、Digi-keyなどで一般購入できるかは不明だった。
導入事例
Starlink User Terminal
https://i.blackhat.com/USA-22/Wednesday/US-22-Wouters-Glitched-On-Earth.pdf
基本スペック抜粋
楕円曲線暗号(ECC):NIST or Brainpool 256-bit and 384-bit curves
デジタル署名アルゴリズム(ECDSA):SHA-256 and SHA-384
鍵共有(ECDH)
ハードウェア機能:6KBの設定可能な不揮発性メモリ、30年データ保持(25°C)、500,000回の消去・プログラム耐久性(25°C)
メーカー認証局で署名された証明書がプロビジョニングされている。(NIST P-256)
秘密鍵の格納は静的なものが2つ(うち1つは上記の証明書に対応する秘密鍵)
一時利用できる鍵が1つ
証明書などを置けるデータゾーンが7個。
そのうち1つは上記証明書が格納されている。
ホストのデータを暗号化するローカルエンベロープキースロットが2つ、
またホストとペアリングしてメッセージ認証や、暗号化を行うHost MAC keyとHost cipher keyが存在する。
Host MAC keyとHost cipher keyは一度書き込むと変更できない。
基本的な操作方法
秘密鍵のインポートはできない
以下の関数が使用可能:
秘密鍵の生成:StSafeA_GenerateKeyPair()
公開鍵の読み出し:ST_RetrieveCert()で証明書を抜き出してそこから抽出する
メーカー署名済みの証明書の読み出し:ST_RetrieveCert()
内部の秘密鍵を使った署名:StSafeA_GenerateSignature()
内部の秘密鍵を使ったECDH計算:StSafeA_EstablishKey()
特徴的な機能
ローカルエンベロープ機能があり、ホストに置かれたデータをローカルエンベロープキーを使って暗号で保護したり解除したりできる機能のようだ。
実装
手元にあったESP32-WROOM-32Eを利用してテストを行った。
RSTピンの上げ下げが必要とのことで、以下の通りのピン接続を行った。
RSTピンの操作は、1マイクロ秒以上でLレベル維持し、Hにして20~50ミリ秒後にコマンド受付可能となる。
ESP32 STSAFE-A110
SCL 21 7
SDA 22 5
RST 23 1
HAL (Hardware Abstraction Layer) の作成
ESP32向けのHALがなかったため作成
CRC16 (x25)の演算ルーチンも提供する必要があり、ESP32の組み込み機能を使用
テストコードによる動作:
乱数生成、証明書抜き出し、鍵生成、ECDH計算、署名を実施してみた。
テストコードはGithubへ公開した。
I (336) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
StSafeA_Init Success
StSafeA_Echo Success
Random data:
73 2b c9 83 12 ca cc 67 ec 82 e7 03 94 e2 cb 9c
fe 94 96 e8 9c c1 fb d7 e7 71 8a 8f 81 b6 72 94
StSafeA_GenerateRandom Success
ST_RetrieveCert Success
-----BEGIN CERTIFICATE-----
MIIBjjCCATSgAwIBAgILAgkAiyIK3GlYATkwCgYIKoZIzj0EAwIwTzELMAkGA1UEBhMCTkwx
... ...
esHDj5rCD/KHwUMhWbNQoQTOjnkHKs5d
-----END CERTIFICATE-----
Querying the STSAFE A110 slots for local envelope keys presence
Summary of the 2 found Envelope Key Slots:
| Slot | Key Presence | Key Length |
| 0 | 1 | 16 |
| 1 | 1 | 32 |
check_local_envelope_key Success
Querying the STSAFE A110 host MAC and cipher keys presence
Summary of the Host Key Slot:
| Key Presence | Key Length | CMAC Sequence Counter |
| 1 | 32 | 89 |
check_host_keys Success
status code:0x0
StSafeA_GenerateKeyPair Test. Generate Ephemeral key pair...
PubCX data:
a1 7c 63 43 08 73 c2 30 42 ac 66 18 38 93 3f b9
19 39 d1 65 36 03 c8 bf 70 52 73 73 20 e2 c6 8f
PubCY data:
21 c3 01 a7 51 3a f7 70 05 ef e4 11 8d be 15 0f
a3 89 49 47 f5 61 31 c2 b9 72 3a e2 85 7a 5d 8f
StSafeA_GenerateKeyPair Success
StSafeA_EstablishKey Test. ECDH calculation host & Secure element...
pms data:
d1 65 9c 4e 2f 2a d4 b4 c0 cb 76 03 bf 29 6b 3f
99 df b3 e3 b7 8e 22 f0 1c 4c 34 4d 13 b6 ba 1d
pms_se data:
d1 65 9c 4e 2f 2a d4 b4 c0 cb 76 03 bf 29 6b 3f
99 df b3 e3 b7 8e 22 f0 1c 4c 34 4d 13 b6 ba 1d
StSafeA_EstablishKey Success
both of keys match as expected.
Sign hashed message -example- test with pre-provisioned key pair...
hashed data:
5e 89 e9 d8 54 4a f1 5b 20 4b cd ff 94 f0 47 b0
c1 b6 0a b8 e9 c7 0e db bd d4 2b 3c 83 b4 ad 83
OutR data:
4e e7 04 3a ab 8e 38 f6 fc d7 15 86 5c 07 3d 86
6c 04 d0 92 c2 aa 2d c1 7a 6d 50 89 b2 aa d9 47
OutS data:
88 fb 2d 93 51 3c 0f 84 f2 f8 1d 6c 7c dc ea 58
d1 68 d8 11 33 be dc 4f 44 05 eb 59 a3 09 97 ac
StSafeA_GenerateSignature Success
まとめ
秘密鍵の秘匿とECDSAの利用は把握できた。現状SPL02だと、ホストとデバイス間の暗号化ができないコマンドがあるようだ。
特にECDHの結果は暗号化されていないとプロービングで簡単にプリマスターシークレットが窃取されてしまうので、
SPL03が入手できれば、その用途の可能性も考えられる。
ローカルエンベロープ機能のユースケースは今後考えてみたい。
AWSへのMulti Account Registrationも実行できた。
サンプルのコードをGithubに配置した。
参考文献
STSAFE-A110 generic sample profile description
STSAFE-A110 SPL03 generic sample profile description