corePKCS11 ライブラリの移植 - FreeRTOS

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

corePKCS11 ライブラリの移植

公開鍵暗号標準 #11 では、暗号化トークンを管理および使用するためのプラットフォームに依存しない API が定義されています。PKCS 11は標準とそれによって定義されているAPIを指します。PKCS #11 暗号化 API は、キーストレージ、暗号化オブジェクトプロパティの取得/設定、およびセッションセマンティクスを抽象化します。一般的な暗号オブジェクトの操作に広く使用されています。アプリケーションソフトウェアは暗号化オブジェクトの使用、作成、変更、削除を、アプリケーションのメモリに公開することなく実行できるからです。

FreeRTOS ライブラリとリファレンス統合は、非対称キー、乱数生成、ハッシュなどの操作に重点を置いて、PCKS #11 インターフェイス標準のサブセットを使用します。以下の表は、ユースケースとサポートする必要がある PKCS #11 API の一覧です。

ユースケース
ユースケース 必要な PKCS #11 API ファミリ
すべて 初期化、ファイナライズ、セッションを開く/閉じる GetSlotList、ログイン
プロビジョニング GenerateKeyPair, CreateObject, DestroyObject, InitToken, GetTokenInfo
TLS ランダム、サイン FindObject、 GetAttributeValue
FreeRTOS+TCP ランダム、ダイジェスト
OTA 検証、ダイジェスト、 FindObject、 GetAttributeValue

完全な PKCS #11 モジュールを実装するタイミング

汎用のフラッシュメモリにプライベートキーを格納すると、評価やラピッドプロトタイピングのシナリオで便利になります。本番環境でのデータ盗難やデバイス重複の脅威を軽減するために、専用の暗号化ハードウェアを使用することをお勧めします。暗号化ハードウェアには、暗号化シークレットキーのエクスポートを妨げる機能を備えたコンポーネントが含まれています。これをサポートするには、上の表で定義されている FreeRTOS ライブラリの操作に必要な PKCS #11 のサブセットを実装する必要があります。

FreeRTOS コアPKCS11を使用するタイミング

corePKCS11 ライブラリには、Mbed TLS が提供する暗号化機能を使用する PKCS #11 インターフェイス (API) のソフトウェアベースの実装が含まれています。これは、ハードウェアに専用の暗号化ハードウェアがない場合のラピッドプロトタイピングおよび評価シナリオ向けに提供されています。この場合、CorePKCS11 PAL を実装するだけで、CorePKCS11 ソフトウェアベースの実装がハードウェアプラットフォームで動作するようになります。

コアPKCS11のポーティング

オンボードフラッシュメモリなどの不揮発性メモリ (NVM) への暗号化オブジェクトの読み書きには、実装が必要です。暗号化オブジェクトは、デバイスの再プログラミング時に初期化も消去もされないNVMのセクションに保存する必要があります。corePKCS11 ライブラリのユーザーは、認証情報を使用してデバイスをプロビジョニングしてから、こうした認証情報にアクセスする際に corePKCS11 インターフェイスを介する新しいアプリケーションを使用して、デバイスを再プログラムします。corePKCS11 PAL 移植は、以下を保存する場所を提供する必要があります。

  • デバイスクライアント証明書

  • デバイスクライアントのプライベートキー

  • デバイスクライアント公開鍵

  • 信頼できるルート CA

  • セキュアブートローダーと (OTA) 更新用のコード検証公開鍵 over-the-air (またはコード検証公開鍵を含む証明書)

  • ジャストインタイムプロビジョニング証明書

ヘッダーファイルを含め、定義された PAL API を実装します。

PAL API
関数 説明
PKCS11_PAL_Initialize

PAL レイヤーを初期化します。初期化シーケンスの開始時に corePKCS11 ライブラリによって呼び出されます。

PKCS11_PAL_SaveObject

データを不揮発性ストレージに書き込みます。

PKCS11_PAL_FindObject

PKCS #11 CKA_LABEL を使用して、不揮発性ストレージ内の対応する PKCS #11 オブジェクトを検索し、存在する場合はそのオブジェクトのハンドルを返します。

PKCS11_PAL_GetObjectValue

ハンドルを指定して、オブジェクトの値を取得します。

PKCS11_PAL_GetObjectValueCleanup

PKCS11_PAL_GetObjectValue 呼び出しのクリーンアップ。PKCS11_PAL_GetObjectValue 呼び出しで割り当てられたメモリを解放するために使用できます。

テスト

FreeRTOS CorePKCS11 ライブラリを使用するか、PKCS11 API の必要なサブセットを実装する場合は、FreeRTOS PKCS11 テストに合格する必要があります。これらは、FreeRTOS ライブラリに必要な機能が期待どおりに動作するかどうかをテストします。

また、認定テストを使用して FreeRTOS PKCS11 テストをローカルで実行する方法も説明します。

前提条件

FreeRTOS PKCS11 テストをセットアップするには、以下を実装する必要があります。

移植テスト

  • FreeRTOS-ライブラリ-統合テストをサブモジュールとしてプロジェクトに追加します。サブモジュールは、ビルドできる限り、プロジェクトのどのディレクトリにも配置できます。

  • config_template/test_execution_config_template.hconfig_template/test_param_config_template.hとをビルドパス内のプロジェクトの場所にコピーし、test_execution_config.htest_param_config.h名前をとに変更します。

  • 関連するファイルをビルドシステムに追加します。を使用する場合CMakequalification_test.cmakesrc/pkcs11_tests.cmakeおよびを使用して関連ファイルを含めることができます。

  • UNITY_OUTPUT_CHARテスト出力ログとデバイスログがインターリーブしないように実装します。

  • 暗号化操作の結果を検証する MBEtls を統合します。

  • RunQualificationTest()アプリケーションから呼び出します。

テストの設定

PKCS11 テストスイートは、PKCS11 の実装に従って設定する必要があります。次の表は、test_param_config.hヘッダーファイルの PKCS11 テストに必要な構成を示しています。

PKSC11 テストコンフィギュレーション
構成 説明
PKCS11_TEST_RSA_KEY_SUPPORT

移植は RSA キー機能をサポートします。

PKCS11_TEST_EC_KEY_SUPPORT

移植は EC キー機能をサポートします。

PKCS11_テスト_インポート_プライベートキー_サポート

移植は秘密鍵のインポートをサポートします。RSA キーと EC キーのインポートは、サポートキー機能が有効になっている場合にテストで検証されます。

PKCS11_テスト_生成_キーペア_サポート

移植はキーペアの生成をサポートします。ECキーペアの生成は、サポートキー機能が有効になっている場合にテストで検証されます。

PKCS11_テスト_事前プロビジョニング_サポート

移植には認証情報が事前にプロビジョニングされています。 PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS、は認証情報の例です。

PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS

テストで使用した秘密鍵のラベル。

PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS

テストで使用された公開鍵のラベル。

PKCS11_テスト_ラベル_デバイス_証明書_FOR_TLS

テストで使用した証明書のラベル。

PKCS11_TEST_JITP_CODEVERIFY_ROOT_CERT_SUPPORTED

移植は JITP のストレージをサポートします。これを1に設定すると、codeverify JITPテストが有効になります。

PKCS11_テスト_ラベル_コード_検証_キー

codeverifyJITPテストで使用されるコード検証キーのラベル。

PKCS11_テスト_ラベル_JITP_証明書

codeverifyJITPテストで使用されるJITP証明書のラベル。

PKCS11_テスト_ラベル_ルート_証明書

JITPcodeverify テストで使用されるルート証明書のラベル。

FreeRTOS ライブラリとリファレンスインテグレーションは、RSA キーや楕円曲線キーなどのキー関数設定と、PKCS11 API でサポートされるキープロビジョニングメカニズムを少なくとも 1 つサポートする必要があります。テストでは以下の構成を有効にする必要があります。

  • 次の主要な機能構成の少なくとも 1 つが必要です。

    • PKCS11_TEST_RSA_KEY_SUPPORT

    • PKCS11_TEST_EC_KEY_SUPPORT

  • 次の主要なプロビジョニング構成の少なくとも 1 つが必要です。

    • PKCS11_テスト_インポート_プライベートキー_サポート

    • PKCS11_テスト_生成_キーペア_サポート

    • PKCS11_テスト_事前プロビジョニング_サポート

事前にプロビジョニングされたデバイスクレデンシャルテストは、次の条件で実行する必要があります。

  • PKCS11_TEST_PREPROVISIONED_SUPPORTを有効にし、他のプロビジョニングメカニズムを無効にする必要があります。

  • PKCS11_TEST_RSA_KEY_SUPPORTPKCS11_TEST_EC_KEY_SUPPORTまたはのいずれかのキー機能のみが有効になっています。

  • PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLSやなどのキー機能に応じて、事前にプロビジョニングされたキーラベルを設定しますPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS。これらの認証情報は、テストを実行する前に存在している必要があります。

実装が事前にプロビジョニングされた認証情報やその他のプロビジョニングメカニズムをサポートしている場合、テストは異なる構成で数回実行する必要がある場合があります。

注記

ラベルの付いたオブジェクトPKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLSおよびは、PKCS11_TEST_GENERATE_KEYPAIR_SUPPORTPKCS11_TEST_GENERATE_KEYPAIR_SUPPORTのいずれかが有効な場合、テスト中に破棄されます。

テストを実行する

このセクションでは、認定テストを使用して PKCS11 インターフェイスをローカルでテストする方法について説明します。または、IDTを使用して実行を自動化することもできます。AWS IoT Device Tester詳細については、『FreeRTOS ユーザーガイド』の「FreeRTOS」を参照してください。

次の手順では、テストの実行方法について説明します。

  • test_execution_config.hコア_PKCS11_TEST_ENABLEDを開いて 1 に定義します。

  • アプリケーションをビルドして、デバイスにフラッシュして実行します。テスト結果はシリアルポートに出力されます。

以下に、出力テスト結果の例を示します。

TEST(Full_PKCS11_StartFinish, PKCS11_StartFinish_FirstTest) PASS TEST(Full_PKCS11_StartFinish, PKCS11_GetFunctionList) PASS TEST(Full_PKCS11_StartFinish, PKCS11_InitializeFinalize) PASS TEST(Full_PKCS11_StartFinish, PKCS11_GetSlotList) PASS TEST(Full_PKCS11_StartFinish, PKCS11_OpenSessionCloseSession) PASS TEST(Full_PKCS11_Capabilities, PKCS11_Capabilities) PASS TEST(Full_PKCS11_NoObject, PKCS11_Digest) PASS TEST(Full_PKCS11_NoObject, PKCS11_Digest_ErrorConditions) PASS TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandom) PASS TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandomMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_CreateObject) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObject) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValue) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_Sign) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObjectMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValueMultiThread) PASS TEST(Full_PKCS11_RSA, PKCS11_RSA_DestroyObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GenerateKeyPair) PASS TEST(Full_PKCS11_EC, PKCS11_EC_CreateObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_FindObject) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValue) PASS TEST(Full_PKCS11_EC, PKCS11_EC_Sign) PASS TEST(Full_PKCS11_EC, PKCS11_EC_Verify) PASS TEST(Full_PKCS11_EC, PKCS11_EC_FindObjectMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValueMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_SignVerifyMultiThread) PASS TEST(Full_PKCS11_EC, PKCS11_EC_DestroyObject) PASS ----------------------- 27 Tests 0 Failures 0 Ignored OK

すべてのテストに合格したら、テストは完了です。

注記

デバイスを正式に FreeRTOS 向けに資格認定するには、でデバイスの移植されたソースコードを検証する必要がありますAWS IoT Device Tester。FreeRTOS ユーザーガイドの使用方法に記載されている手順に従って、AWS IoT Device Tester移植の検証に使う FreeRTOS の使用方法に記載されている手順に従って、移植の検証に使う FreeRTOS ユーザーガイドの使用方法に記載されている手順に従ってAWS IoT Device Tester 特定のライブラリのポートをテストするには、device.jsonAWS IoT Device Testerconfigsフォルダー内のファイルで正しいテストグループを有効にする必要があります。