2409927_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2409927_ja-JP

2409927_ja-JP

Linux上でOP-TEE経由でSE051でキー生成、エンコン/デック、署名/検証を行う方法は?

こんにちは、NXPコミュニティの皆さん、

現在、この投稿「Plug and Trust MWをOP-TEEに統合する方法」で説明されている環境に基づいて、Plug and Trust MiddlewareをOP-TEEに統合する作業を行っています。

私の目標は、SE051のセキュア要素を活用し、Linux上で動作するユーザー空間アプリケーションから以下の操作を実現することです。

  1. AESキーを生成し、SE051に保存します。

  2. RSA鍵ペアを生成し、SE051に保存します。

  3. SE051に保存されたAESキーを使ってファイルを暗号化します。

  4. SE051に保存されているAESキーを使ってファイルを復号します。

  5. SE051でRSA秘密鍵を使用してデータに署名します。

  6. SE051にあるRSA公開鍵を使用して署名を検証します。

  7. SE051でRSA公開鍵を使用してデータを暗号化します。

  8. SE051でRSA秘密鍵を使用してデータを復号します。

これらの手術を達成するための最適な方法について、どなたかアドバイスをいただけませんか?このOP-TEE環境でサポートされている限り、以下のコマンドラインツール(またはそれらの組み合わせ)のいずれかを使用することに抵抗はありません。

  • openSSLコマンド(OpenSSLプロバイダー経由)

  • ssscliツール

  • pkcs11-tool(PKCS#11インターフェース経由)

この特定のOP-TEE環境に関する例、ドキュメントリンク、コマンドの使用例があれば大変ありがたいです。

SE050Re: How to perform Key Gen, Enc/Dec, and Sign/Verify with SE051 via OP-TEE on Linux?

こんにちは、 @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にルーティングするためです。


操作1:AESキーを生成し、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ビットのオブジェクト識別子です。


操作2:RSA鍵ペアを生成し、SE051に保存する

オプションA — 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"

オプションB — 使用 ssscli

ssscli generate rsa 0x10101010 2048

AN13030 セクション 3.3.8.3 注記: RSA キー ペアを外部から注入する場合は、PKCS#8 または従来の OpenSSL フォーマットを使用して DER エンコードする必要があります。sss_key_store_get_key()を介して取得した場合、公開鍵のみが返されます。


操作3:SE051のAESキーを使ってファイルを暗号化する

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_ECBkAlgorithm_SSS_AES_CBCkAlgorithm_SSS_AES_CTRkAlgorithm_SSS_AES_GCMkAlgorithm_SSS_AES_CCM (AN13030の第3.3.9.1節より)。


操作4:SE051のAESキーを使ってファイルを復号する

./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()シーケンスを使用します。


操作5:SE051のRSA秘密鍵を使用してデータに署名する

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-PKCSSHA384-RSA-PKCSSHA512-RSA-PKCS
  • RSA-PKCS-PSS (PSSパディング)

OpenSSL プロバイダー(v3.x)の使用

# 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

 

操作6:SE051のRSA公開鍵を使用して署名を検証する

ステップ1 — SE051から公開鍵をエクスポートする

# 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

ステップ2 — 検証(ホスト側、SE051は不要)

openssl dgst   -keyform PEM   -verify pubkey.pem   -sha256   -signature signature.der   in.txt
# Expected output: Verified OK

操作7:SE051のRSA公開鍵を使用してデータを暗号化する

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.txt

AN13030 セクション 3.3.5.6 には、kAlgorithm_SSS_RSAES_PKCS1_OAEP_SHA256 および kAlgorithm_SSS_RSAES_PKCS1_V1_5 を含むサポートされているアルゴリズムがリストされています。


操作8:SE051のRSA秘密鍵を使用してデータを復号化する

RSA秘密鍵の復号化は、SE051内部で完全に実行されます。秘密鍵はセキュアエレメントから決して外に出ることはありません

使用 pkcs11-tool

pkcs11-tool --module $PKCS11_MODULE   --decrypt   --label sss:10101010   --slot 1   -i crypt.txt   -o decrypt.txt

cat decrypt.txt

OpenSSL プロバイダー(v3.x)の使用

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に含まれます)を確認しています。


キーIDラベルの慣例

NXP PKCS#11ライブラリで pkcs11-tool を使用する場合、Key IDラベル形式は以下の通りです。

sss:

例えば、キーID 0x10101010 →ラベル sss:10101010

バージョン04.07.00 (PKCS#11 v4.7) における互換性のない変更点:バイトスワップを回避するため、CKA_ID属性(--id)はバイト配列として扱われるようになりました。エンディアンを変更せずにIDを渡します。


PKCS#11トークンの初期化(初回設定)

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

OpenSSL 3.x プロバイダー構成

/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


ソースコード例(simw-top内)

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

OP-TEEにおける既知の制限事項

  • OP-TEEカーネル側からSE051へのAESオフロードは、 CFG_NXP_SE05X_CTR_DRV 有効化されている必要があります。PKCS#11を経由したユーザー空間AESはアクセス**マネージャ**を経由し、OP-TEEの暗号**ドライバ**オフロードとは別に行われます。
  • SE051のRSA鍵生成は、バージョン04.07.01でデフォルトでCRT形式となっています(PKCS11 v4.8でサポートが追加されRSA_CRT )。cmakeオプション PKCS11_ENABLE_RSA_KEY_GEN_CRT を使ってCRTと普通のRSAを切り替えてください。
  • SE051 NVMには制限があります。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を参照してください。
-------------------------------------------------------------------------------

Re: How to perform Key Gen, Enc/Dec, and Sign/Verify with SE051 via OP-TEE on Linux?

こんにちは、 @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つの異なるビルドシナリオに適用されます。


シナリオ1:MWビルドがOP-TEE(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通信スタックを完全にバイパスします。


シナリオ2:Linuxユーザースペースツール(ssscli / Access Manager / デモ)

ここで、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で新しいオプションが追加されました。

LinuxユーザースペースツールのOP-TEEセットアップにおける推奨cmakeコマンド

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に接続しますが、重要な注意点を参照してください。


重要な注意点:アクセスマネージャーとのI2C対立

アクセスマネージャー(hostlib/hostLib/accessManager)は、複数のLinuxプロセスからの同時I2Cアクセスをシリアライズするよう設計されています。しかし:

OP-TEEがLinux DTSでI2Cインターフェースを完全に無効にした場合( CFG_NXP_SE05X=yで求められます)、アクセスマネージャー自体もI2Cを起動できません。

つまり、有効なデプロイメントオプションは2つあります。

選択肢A:OP-TEE限定(生産向け推奨)

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使用に関する経路です。

選択肢B:共存(テスト/プロビジョニング)

LinuxからI2Cを無効化 しない LinuxのDTSを使いましょう(つまり、 lf-6.12.y-i2c-disabled-se050 DTSパッチを適用しないでください)。この構成では:

  • OP-TEEは暗号化オフロード(RSA/ECC)にSE051を使用します。
  • Linuxのユーザースペースは、元のフラグを使ってSSSCLIやアクセスマネージャーを T1oI2C 実行できます。
  • リスク:OP-TEEとLinuxの両方からの同時I2Cアクセスには慎重な仲裁が必要です

この選択肢では、 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 / openssllibckteec.so

追加参考資料

  • AN13030 Rev. 2.4 — セクション4.4(i.MX Linux ビルド)、セクション8.9(PKCS#11 スタンドアロンライブラリ)、Access Managerドキュメント
  • UG10163 i.MX Linuxユーザーガイド — libckteec.so を用いたOP-TEE PKCS#11コマンド例(セクション10.4.7および10.4.8、110–114ページ); 注: これらの例はOP-TEE内部セキュアストレージをキーバックエンドとして使用しており、SE05xを直接使うわけではありません。SE051がOP-TEE暗号バックエンドとしてCFG_NXP_SE05X=yを介して設定されている場合もコマンド構文は同じです

すてきな一日を、
カン


-------------------------------------------------------------------------------
注記:
この投稿があなたの質問への回答になっている場合は、「正解としてマーク」ボタンをクリックしてください。ありがとうございます!
- 前回の投稿から7週間Threadをフォローしており、その後の返信は無視しています
もし後で関連する質問があれば、新しいThreadを開き、閉じたThreadを参照してください。
-------------------------------------------------------------------------------

Re: How to perform Key Gen, Enc/Dec, and Sign/Verify with SE051 via OP-TEE on Linux?

@Kan_Li

丁寧かつ詳細なご回答をいただき、誠にありがとうございました。
サポートされている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経由でリクエストを適切にルーティングするために更新すべきでしょうか?

私の環境情報は以下のとおりです。

  • 基板:MCIMX8M-WEVKおよびOM-SE051ARD
  • Plug and Trust MW バージョン: v04.07.01
  • OP-TEE OSバージョン:3.19.0
  • Linuxカーネル:6.1.151
Re: How to perform Key Gen, Enc/Dec, and Sign/Verify with SE051 via OP-TEE on Linux?この非常に詳細かつ明快な説明をいただき、誠にありがとうございました。
フラッグごとの説明、ビルドコマンドの例、特にI2Cの競合と選択肢A(OP-TEE独占、libckteec.so 経由)の選択に関する重要な注意点そして選択肢B(共存)によって、設定オプションが明確になりました。
この情報は、今後のアーキテクチャを決定する上でまさに必要なものでした。
Tags (1)
No ratings
Version history
Last update:
Saturday
Updated by: