こんにちは、NXPコミュニティの皆さん、
現在、この投稿「Plug and Trust MWをOP-TEEに統合する方法」で説明されている環境に基づいて、Plug and Trust MiddlewareをOP-TEEに統合する作業を行っています。
私の目標は、SE051のセキュア要素を活用し、Linux上で動作するユーザー空間アプリケーションから以下の操作を実現することです。
AESキーを生成し、SE051に保存します。
RSA鍵ペアを生成し、SE051に保存します。
SE051に保存されたAESキーを使ってファイルを暗号化します。
SE051に保存されているAESキーを使ってファイルを復号します。
SE051でRSA秘密鍵を使用してデータに署名します。
SE051にあるRSA公開鍵を使用して署名を検証します。
SE051でRSA公開鍵を使用してデータを暗号化します。
SE051でRSA秘密鍵を使用してデータを復号します。
これらの手術を達成するための最適な方法について、どなたかアドバイスをいただけませんか?このOP-TEE環境でサポートされている限り、以下のコマンドラインツール(またはそれらの組み合わせ)のいずれかを使用することに抵抗はありません。
openSSLコマンド(OpenSSLプロバイダー経由)
ssscliツール
pkcs11-tool(PKCS#11インターフェース経由)
この特定のOP-TEE環境に関する例、ドキュメントリンク、コマンドの使用例があれば大変ありがたいです。
こんにちは、 @Uc_S さん。
Linuxユーザー空間からSE051への サポートされた経路は3 つあります。これら3つはすべてPlug & Trust MW v04.07.01で利用可能です。
| パス | 図書館 | 最適な用途 |
|---|---|---|
| PKCS#11 | libsss_pkcs11.so |
AES、RSAキーの生成/署名/検証/エンク/デック pkcs11-tool |
| OpenSSL プロバイダー(3.x) | libsss_provider.so |
RSA署名/検証/エンコード/デコード openssl pkeyutl |
| ssscli | Python CLI | キーの注入/プロビジョニングのみ |
OP-TEE環境に関する重要な注意点: OP-TEEセットアップ(
CFG_NXP_SE05X=y)では、SE051はOP-TEEコアがネイティブI2Cドライバを通じて直接アクセスします。Linuxユーザー空間アプリケーションはI2Cバスを所有 していません 。上記の3つのパスはすべて正しく動作します。なぜなら、Plug & Trust MWアクセスマネージャー(accessManager)またはT1oI2CソケットインターフェースがOP-TEEの信頼されたワールドを通じてコマンドをSE051にルーティングするためです。
ssscliを使って特定のキーID(SE051のオブジェクトID)でAES-256キーを生成します:
# Generate AES-256 key at Key ID 0x20000001
ssscli generate aes 0x20000001 256
キーが存在することを確認するには:
ssscli get aes 0x20000001 aes_key_info.txt
注意: AESキーは対称的であり、SE051からエクスポートすることはできません。キーID
0x20000001は、SE051 NVMに永続的に保存される32ビットのオブジェクト識別子です。
pkcs11-toolを使用する(推奨)RSAキーラベルは以下の形式を使用します sss::
# Generate RSA-2048 key pair at Key ID 0x10101010
pkcs11-tool --module $PKCS11_MODULE --keypairgen --key-type rsa:2048 --label "sss:10101010"
sssclissscli generate rsa 0x10101010 2048
AN13030 セクション 3.3.8.3 注記: RSA キー ペアを外部から注入する場合は、PKCS#8 または従来の OpenSSL フォーマットを使用して DER エンコードする必要があります。
sss_key_store_get_key()を介して取得した場合、公開鍵のみが返されます。
AES対称暗号化はSSS API(sss_cipher_one_go)またはコマンドライン使用の場合は小型ラッパーアプリケーションを介して行われます。MWには、以下の場所に組み込みの対称例が用意されています。
simw-top/sss/ex/symmetric/ex_sss_symmetric.c
コマンドラインから直接使用するには、以下のサンプルをビルドして実行してください。
# After building the MW examples:
./se05x_symmetric_aes_cbc_encrypt --keyid 0x20000001 --input plaintext.bin --output ciphertext.bin --iv 00000000000000000000000000000000
MWは以下をサポートしています:
kAlgorithm_SSS_AES_ECB、kAlgorithm_SSS_AES_CBC、kAlgorithm_SSS_AES_CTR、kAlgorithm_SSS_AES_GCM、kAlgorithm_SSS_AES_CCM(AN13030の第3.3.9.1節より)。
./se05x_symmetric_aes_cbc_decrypt --keyid 0x20000001 --input ciphertext.bin --output decrypted.bin --iv 00000000000000000000000000000000
SSS APIは、ワンショット復号には
sss_cipher_one_go()を使用したkMode_SSS_Decryptモード、ストリーミングには複数ステップのsss_cipher_init()/sss_cipher_update()/sss_cipher_finish()シーケンスを使用します。
pkcs11-toolを使用します(キーはSE051に保持されます)# Sign with RSA private key (key never leaves SE051)
pkcs11-tool --module $PKCS11_MODULE --sign --label sss:10101010 -m SHA256-RSA-PKCS --slot 1 -i in.der -o signature.der
PKCS#11でサポートされている手話メカニズム:
SHA256-RSA-PKCS (RSASSA-PKCS1-v1_5、SHA-256)SHA1-RSA-PKCS、SHA384-RSA-PKCS、 SHA512-RSA-PKCSRSA-PKCS-PSS (PSSパディング)# OpenSSLをNXPプロバイダーを使用するように設定してください(/etc/ssl/openssl.cnf参照)
openssl pkeyutl -provider nxp -sign -inkey "pkcs11:token=sss;object=sss:10101010;type=private" -in in.txt -out signature.der
# Method A: via ssscli
ssscli get rsa pub 0x10101010 rsa_pub.der
# Method B: via pkcs11-tool
pkcs11-tool --module $PKCS11_MODULE --read-object --type pubkey --slot 1 --label sss:10101010 -o pubkey.der
# Convert DER to PEM for OpenSSL
openssl rsa -in pubkey.der -inform der -out pubkey.pem -outform pem -pubin
openssl dgst -keyform PEM -verify pubkey.pem -sha256 -signature signature.der in.txt
# Expected output: Verified OK
RSA暗号化は公開鍵を使用します(暗号化にセキュアエレメントは不要です)。
# Encrypt with public key (host side)
openssl rsautl -encrypt -inkey pubkey.pem -in in.txt -pubin -out crypt.txt
OAEPパディング(推奨)には以下を使用してください。
openssl pkeyutl -encrypt -inkey pubkey.pem -pubin > -pkeyopt rsa_padding_mode:oaep > -pkeyopt rsa_oaep_md:sha256 > -in in.txt -out crypt.txtAN13030 セクション 3.3.5.6 には、
kAlgorithm_SSS_RSAES_PKCS1_OAEP_SHA256およびkAlgorithm_SSS_RSAES_PKCS1_V1_5を含むサポートされているアルゴリズムがリストされています。
RSA秘密鍵の復号化は、SE051内部で完全に実行されます。秘密鍵はセキュアエレメントから決して外に出ることはありません。
pkcs11-toolpkcs11-tool --module $PKCS11_MODULE --decrypt --label sss:10101010 --slot 1 -i crypt.txt -o decrypt.txt
cat decrypt.txt
openssl pkeyutl -provider nxp -decrypt -inkey "pkcs11:token=sss;object=sss:10101010;type=private" -in crypt.txt -out decrypt.txt
AN13030 セクション2.3.4は「RSAの暗号化および復号機能がプロバイダーに追加された」(v04.05.03以降、v04.07.01に含まれます)を確認しています。
NXP PKCS#11ライブラリで pkcs11-tool を使用する場合、Key IDラベル形式は以下の通りです。
sss:
例えば、キーID 0x10101010 →ラベル sss:10101010
バージョン04.07.00 (PKCS#11 v4.7) における互換性のない変更点:バイトスワップを回避するため、
CKA_ID属性(--id)はバイト配列として扱われるようになりました。エンディアンを変更せずにIDを渡します。
pkcs11-toolを使用する前に、トークンスロットを初期化する必要がある場合があります。
# Initialize slot 0
pkcs11-tool --module $PKCS11_MODULE --init-token --slot 0 --label "SE051_Token" --so-pin 12345678
# Set user PIN
pkcs11-tool --module $PKCS11_MODULE --init-pin --slot 0 --login --so-pin 12345678 --pin 87654321
/etc/ssl/openssl.cnf(またはカスタム設定ファイル)に追加します。
[openssl_init]
providers = provider_sect
[provider_sect]
default = default_sect
nxp = nxp_sect
[default_sect]
activate = 1
[nxp_sect]
module = /usr/local/lib/libsss_provider.so
activate = 1
OpenSSLプロバイダーのソースは以下の場所でも利用可能です: https://github.com/NXPPlugNTrust/se05x-openssl-provider
MWパッケージに内蔵された以下の例は、これらの操作を直接示しています:
| 動作 | パス例 |
|---|---|
| AESの暗号化/復号 | simw-top/sss/ex/symmetric/ex_sss_symmetric.c |
| RSA署名/検証 | simw-top/sss/ex/rsa/ (AN13030のセクション5.2.1.2) |
| ECC署名/検証 | simw-top/sss/ex/ecc/ (AN13030のセクション5.2.1.1) |
| PKCS#11 スクリプト | simw-top/sss/plugin/pkcs11/scripts/ |
| OpenSSL プロバイダ RSA enc | simw-top/sss/plugin/openssl_provider/scripts/openssl_RsaEnc.py |
CFG_NXP_SE05X_CTR_DRV 有効化されている必要があります。PKCS#11を経由したユーザー空間AESはアクセス**マネージャ**を経由し、OP-TEEの暗号**ドライバ**オフロードとは別に行われます。RSA_CRT )。cmakeオプション PKCS11_ENABLE_RSA_KEY_GEN_CRT を使ってCRTと普通のRSAを切り替えてください。ssscli delete で削除してください。simw-top/hostlib/hostlib/accessManagerのアクセスマネージャを使用します。-DSMCOM:STRING=JRCP_V1_AMで構築します。| ドキュメント | 説明 |
|---|---|
| AN13030 | プラグ&トラストMWドキュメント(主要参照) |
| AN12660 | SE05xによるIEC 62443準拠 ― SSS APIの例へのポインタを含む |
simw-top/doc/ (ローカルHTML) |
インストール済みバージョンv04.08.01の完全なドキュメント |
simw-top/doc/plugins/pkcs11.html |
PKCS#11 スタンドアロンライブラリのドキュメント |
simw-top/doc/demos.html |
利用可能なデモ例の完全なリスト |
お役に立てば幸いです。
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------
こんにちは、 @Uc_S さん。
CFG_NXP_SE05X=yが設定されると、OP-TEEはSE051のI2Cバスの独占所有権を取得します。Linux DTSはそのI2Cコントローラを無効にしなければなりません(統合ガイドに記載されています)。これは、Plug & Trust MW の使用方法を根本的に変えるものです。
| レイヤ | 誰が運営しているのか | SE051への到達方法 |
|---|---|---|
| OP-TEE セキュアワールド | OP-TEEコア | ネイティブI2Cドライバー(CFG_IMX_I2C=y)— ダイレクト、排他 |
| Linuxユーザースペース | あなたのアプリケーション、ssscli、アクセス マネージャ | T1oI2Cは使えません — Linux DTSではI2Cが無効化されています |
つまり、既存のcmake設定はLinuxが直接I2Cを所有している場合にのみ適用される -DPTMW_SMCOM=T1oI2C です。OP-TEEの設定では、以下に説明する2つの異なるビルドシナリオに適用されます。
CFG_NXP_SE05X_PLUG_AND_TRUST=)に供給されるこれが最も重要な事件です。MWはOP-TEE内部で静的ライブラリとしてコンパイルされるため、 cmake手動で実行する必要はありません。OP-TEEのMakefileは、CFG_NXP_SE05X_PLUG_AND_TRUSTで抽出したMWディレクトリを指定すると、自動的に統合処理を行います。
CFG_NXP_SE05X_PLUG_AND_TRUST=$HOME/linux-factory/plug-and-trust
あなたが挙げたSMCOM、Host、およびAuthフラグは、ここでは適用されません。OP-TEEは独自のネイティブI2C抽象化層(CFG_IMX_I2C=y)を介してSE051を駆動し、Linux MW通信スタックを完全にバイパスします。
ここで、CMakeのフラグが適用されます。OP-TEEがI2Cを所有する場合、変更が必要な箇所をフラグごとに分析した結果は以下のとおりです。
| フラグ | 現在の価値 | OP-TEEセットアップの推奨値 | 理由 |
|---|---|---|---|
-DPTMW_SMCOM |
T1oI2C |
JRCP_V1_AM (アクセス マネージャを使う場合) |
Linuxは直接I2Cを使用できません。アクセス マネージャはソケットプロキシを提供します |
-DPTMW_SE05X_Auth |
PlatfSCP03 |
None |
SCP03チャネルはLinuxユーザースペースではなくOP-TEEによって確立されています |
-DPTMW_SCP |
SCP03_SSS |
None |
同じ理由です。SCP03はOP-TEEセキュアワールドが所有しています。 |
| フラグ | バリュー | 理由 |
|---|---|---|
-DPTMW_Applet |
SE05X_C |
お使いのSE051C2バリアント(OEF ID A8FA)に適合しています。 |
-DPTMW_SE05X_Ver |
07_02 |
OP-TEEのブートログに見られるアプレットバージョン7.2に一致します。 |
-DPTMW_Host |
iMXLinux |
まだLinux i.MX 動いています |
-DPTMW_HostCrypto |
OPENSSL |
変更なし |
-DPTMW_RTOS |
Default |
変更なし |
-DPTMW_OpenSSL |
3_0 |
OpenSSL 3.x では変更なし |
-DPTMW_FIPS |
None |
変更なし |
-DPTMW_SBL |
None |
変更なし |
-DPTMW_mbedTLS_ALT |
None |
変更なし |
-DPTMW_Log |
Silent |
変更なし |
-DPTMW_SE_RESET_LOGIC |
1 |
変更なし。v04.07.00で新しいオプションが追加されました。 |
cd simw-top && mkdir build_optee_linux
cmake -S . -B ./build_optee_linux/ -DPTMW_Applet=SE05X_C -DPTMW_SE05X_Ver=07_02 -DPTMW_Host=iMXLinux -DPTMW_SMCOM=JRCP_V1_AM -DPTMW_HostCrypto=OPENSSL -DPTMW_RTOS=Default -DPTMW_mbedTLS_ALT=None -DPTMW_SCP=None -DPTMW_FIPS=None -DPTMW_SBL=None -DPTMW_SE05X_Auth=None -DPTMW_Log=Silent -DCMAKE_BUILD_TYPE=Release -DPTMW_OpenSSL=3_0 -DPTMW_SE_RESET_LOGIC=1
cd build_optee_linux && make -j8
注:
JRCP_V1_AMアクセスマネージャーがターゲット上でデーモンとして動作している必要があります。アクセスマネージャー自体はSE051に接続しますが、重要な注意点を参照してください。
アクセスマネージャー(hostlib/hostLib/accessManager)は、複数のLinuxプロセスからの同時I2Cアクセスをシリアライズするよう設計されています。しかし:
OP-TEEがLinux DTSでI2Cインターフェースを完全に無効にした場合(
CFG_NXP_SE05X=yで求められます)、アクセスマネージャー自体もI2Cを起動できません。
つまり、有効なデプロイメントオプションは2つあります。
OP-TEEはI2Cを完全に所有しています。Linuxユーザースペースでは、暗号操作にはOP-TEE PKCS#11 TA(libckteec.so)のみを使用しています。このモードでは、Plug and Trust MWのSSSCLIやデモはLinuxからは実行されません。
Linux App → libckteec.so → OP-TEE PKCS#11 TA → SE051
これは i.MX Linux ユーザーガイド(UG10163)で説明されているOP-TEEベースのSE05x使用に関する経路です。
LinuxからI2Cを無効化 しない LinuxのDTSを使いましょう(つまり、 lf-6.12.y-i2c-disabled-se050 DTSパッチを適用しないでください)。この構成では:
T1oI2C 実行できます。この選択肢では、 SMCOM、SCP、およびAuthフラグを元の値に戻し、元のI2C DTSを維持してください(無効にしないでください)。
| ユース・ケース | SMCOM | SCP | 認証 | 備考 |
|---|---|---|---|---|
| OP-TEE内部MW(OP-TEEビルド用の静的ライブラリ) | N/A | N/A | N/A | cmakeは不要です。 CFG_NXP_SE05X_PLUG_AND_TRUST= |
| Linuxユーザースペース、OP-TEE独占I2C | JRCP_V1_AM |
None |
None |
Access Managerが必要ですが、I2Cを無効にするとAM自体がSE051にアクセスできません |
| Linuxユーザースペース、共存(I2C共有) | T1oI2C |
SCP03_SSS |
PlatfSCP03 |
あなたの元のフラグは、Linux DTSがまだI2Cを有効にしている場合に有効です |
| Linuxユーザースペース(PKCS#11 TA経由、OP-TEE限定) | 該当なし(MWビルドなし) | N/A | N/A | pkcs11-tool / openssl を libckteec.so |
すてきな一日を、
カン
-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------
丁寧かつ詳細なご回答をいただき、誠にありがとうございました。
サポートされている3つのパスの詳細な説明とコマンド例は非常に役立ちます。
OP-TEE環境に関して、Linuxのrootfs上のPlug & TrustミドルウェアのCMakeビルド構成について追加の質問があります。
以前は、OP-TEEルーティングなしでLinux上でミドルウェアを直接実行していた際、以下のCMake設定フラグを使用していました:
-DPTMW_Applet=SE05X_C
-DPTMW_SE05X_Ver=07_02
-DPTMW_Host=iMXLinux
-DPTMW_SMCOM=T1oI2C
-DPTMW_HostCrypto=OPENSSL
-DPTMW_RTOS=Default
-DPTMW_mbedTLS_ALT=None
-DPTMW_SCP=SCP03_SSS
-DPTMW_FIPS=None
-DPTMW_SBL=None
-DPTMW_SE05X_Auth=PlatfSCP03
-DPTMW_Log=Silent
-DCMAKE_BUILD_TYPE=Release
-DPTMW_OpenSSL=3_0
-DPTMW_SE_RESET_LOGIC=1上記の設定のうちどれを変えるべきか、またこのOP-TEEセットアップで推奨される新しい値は何であるべきか教えていただけますか?
詳細:
OP-TEEがSE051への直接I2Cアクセス(CFG_NXP_SE05X=y経由)を所有している今、Linuxのユーザー空間ミドルウェアやツール(SSSCLIやアクセス マネージャなど)を構築する際に、これらのCMakeフラグのいずれかを変更する必要があるのか教えていただけますか?
具体的には、-DPTMW_SMCOM(例:T1oI2CからJRCP_V1_AMやソケットインターフェースへの変更)や-DPTMW_Hostのようなオプションは、Linuxユーザー空間向けにOP-TEE経由でリクエストを適切にルーティングするために更新すべきでしょうか?
私の環境情報は以下のとおりです。