こんにちは、
i.MX93-evkプラットフォームでのRSA-PSS署名認証に関してCSTで遭遇した問題を報告したいと思います。これはバグだと思います。以下に、私がこの発見に至るまでの手順を説明します。
現在、i.MX93-EVKプラットフォーム上でセキュアブート手順を実装しており、標準で文書化されたCST v4.0.1を使って動作させることに成功しました。
次に、CST の外で OpenSSL を直接使用して、さまざまなバイナリに署名したいと考えました (注: これは PKCS#11 の設定ではなく、OpenSSL CLI/API で独自の RSA キーを使用しているだけです)。私が実現したかったことをまさに説明している以下の手順書を見つけました: AHABデバイスでのコード署名のためのHSMモードの使用.pdf
これは、コード署名ツール(CST)が提供するahab_pki_treeツールを使用して生成されたキーと、以下のパラメータでうまく機能します。
しかし、私がCST以外でバイナリに署名したい理由は、すでに他の様々な成果物の署名に使用しているRSA鍵を持っているからです。このキーを使用してさまざまなバイナリファイルに署名し、リンク先のプロセスで説明されているように署名済みハッシュを再統合しようとすると、次のエラーが発生します(CST v4.0.1)。
[ERROR] CST: The signature file spl_data.sig is not valid
全てが正しいことを再確認した後、OpenSSLを使用して署名を検証するテストも以下のように行いました。
$ openssl dgst -sha384 -verify pubkey.pem -signature spl_data.sig -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:digest spl_data.bin Verified OK
予想と実際: OpenSSLが署名が有効なPSS署名であることを確認したので、CSTも再統合時にそれを受け入れると予想していました。しかし、CSTはそれを無効として拒否します。
CSTのソースコードを詳しく調べ始めたところ、OpenSSLによる検証は成功しているにもかかわらず、署名が無効であると誤って報告されていた理由が分かりました。
CSTが署名を確認する際、以下の処理を行います。
NXPのドキュメントで「RSA-PSS」キーと呼ばれているものを生成・使用する場合、「公開鍵アルゴリズム」フィールドは rsassaPssと等しく、上記のチェックは正しく動作します。
しかし、汎用RSA鍵を使用する場合、「公開鍵アルゴリズム」フィールドはrsaEncryptionとなり、CSTはこれをPKCS#1 v1.5と誤って解釈しますが、実際にはPKCS#1 v2.1(PSS)形式で署名することも可能です。
私は、自分の署名がPSS署名であることをCSTのソースコードにハードコーディングすることで、この誤った仮定を検証しました。その結果、CSTによって署名が正常に検証され、最終バイナリに再挿入されることができました。その後、閉じた状態のデバイスでは期待どおりに動作しました。
必要であれば、特に関連するOpenSSLの各種関数呼び出しに関して、さらに詳しい情報を提供いたします。
これがCSTの既知の制限なのか、それとも汎用RSAキーで署名を生成・使用している点に何か見落としているのか確認してもらえますか?
余談ですが、HSDKも試しました。これはNXPがAHABベースのプラットフォーム向けに推奨している新しいツールのようですが、署名したいバイナリをエクスポートして手動で署名し、CSTの手順に似た方法で再挿入する方法が見つかりませんでした。これは実現可能かどうかご存知ですか?
よろしくお願いいたします。
こんにちは、
実際、あなたが使っている文書は正しいです。これは、まだCSTを利用しているお客様に推奨されるアプローチです。AHABおよび特に新しいi.MX9ファミリーのお客様には、セキュリティのイネーブルメントのためにSPSDKへの移行を推奨しています。
SO、あなたが踏んだ手順やツールの変更点をCAN共有してください。必要ならSO内部チームと確認・共有CAN。
また、SPSDKについては、以下も参考にしてください。
https://docs.nxp.com/bundle/AN14785/page/topics/signing_with_offline_hsm.html
お役に立てば幸いです。
よろしくお願いいたします。
アルド。