移植圖書館 - FreeRTOS

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

移植圖書館

公開金鑰加密標準 #11 定義了一個獨立於平台的 API 來管理和使用密碼編譯權杖。包裝套件 11指的是標準及其定義的 API。PKCS #11 密碼編譯 API 會抽象化金鑰儲存、取得/設定密碼編譯物件的屬性,以及工作階段語意。它被廣泛用於操作常見的加密對象。它的功能允許應用程序軟件使用,創建,修改和刪除加密對象,而不會將這些對象暴露在應用程序的內存中。

FreeRTOS 程式庫和參考整合使用 PCKS #11 介面標準的子集,重點放在涉及非對稱金鑰、隨機數產生和雜湊的作業上。下表列出了要支援的使用案例和必要的 PKCS #11 API。

使用案例
使用案例 必要的 PKCS #11 應用程式介面系列
全部 初始化、完成、開啟/關閉工作階段、 GetSlotList, 登入
佈建 GenerateKeyPair, CreateObject, DestroyObject, InitToken, GetTokenInfo
TLS 隨機、簽署、 FindObject, GetAttributeValue
FreeRTOS+TCP 隨機、摘要
OTA 驗證、摘要、 FindObject, GetAttributeValue

何時實作完整 PKCS #11 模組

在評估和快速原型設計案例中,將私有金鑰存放在一般用途快閃記憶體中可能很方便。我們建議您使用專用的加密硬體,以減少在生產環境中遭到資料竊取和裝置複製的威脅。密碼編譯硬體包含的元件有功能可防止匯出密碼編譯私密金鑰。若要支援此功能,您必須實作 PKCS #11 的子集,才能使用上表所定義的 FreeRTOS 程式庫。

何時使用 FreeRTOS 網路服務 11

CorepkCS11 程式庫包含以軟體為基礎的 PKCS #11 介面 (API) 實作,該介面使用由提供的密碼編譯功能姆貝德 TLS。這是針對硬體沒有專用加密硬體的快速原型製作和評估案例所提供的。在這種情況下,您只需要實作 CorepkCS11 PAL,即可讓 CorepkCS11 軟體式實作與您的硬體平台搭配使用。

移植公司 11

您必須實作才能將加密物件讀取和寫入非揮發性記憶體 (NVM),例如板載快閃記憶體。加密對象必須存儲在 NVM 的一個部分,該部分未初始化,並且在設備重新編程時不會擦除。CorepkCS11 程式庫的使用者將使用認證佈建裝置,然後使用可透過 CorepkCS11 介面存取這些認證的新應用程式來重新編程裝置。CorepkCS11 PAL 連接埠必須提供儲存位置:

  • 裝置用戶端憑證

  • 裝置用戶端私密金鑰

  • 裝置用戶端公開金鑰

  • 受信任的根 CA

  • 安全開機載入程式的程式碼驗證公開金鑰 (或包含程式碼驗證公開金鑰的憑證) over-the-air (太田)更新

  • 即時佈建憑證

包括頭文件並實現定義的 PAL API。

菲航 API
函數 描述
初始化

初始化 PAL 層。由 CorepkCS11 程式庫在其初始化序列開始時呼叫。

帕爾 _SaveObject

將資料寫入非揮發性儲存。

帕爾 _FindObject

使用 PKCS #11 CKA_LABEL 在非揮發性儲存中搜尋對應的 PKCS #11 物件,並傳回該物件的控制代碼 (如果存在)。

帕爾 _GetObjectValue

根據控制代碼擷取物件的值。

帕爾 _GetObjectValueCleanup

清除 PKCS11_PAL_GetObjectValue 呼叫。可用於釋放 PKCS11_PAL_GetObjectValue 呼叫中配置的記憶體。

測試

如果您使用 FreeRTOS 體庫或實作 PKCS11 API 的必要子集,您必須通過 PKCS11 測試。這些測試 FreeRTOS 程式庫所需的功能是否如預期般執行。

本節也說明如何在本節中使用資格測試這個節也說明如何在本節中執行 FreeRTOS PKCS11 測試。

先決條件

若要設定 FreeRTOS PKCS11 測試,必須執行下列動作。

  • PKCS11 API 的支援連接埠。

  • FreeRTOS 資格測試平台功能的實作,其中包括:

    • FRTest_ThreadCreate

    • FRTest_ThreadTimedJoin

    • FRTest_MemoryAlloc

    • FRTest_MemoryFree

(請參閱雷德美. MDPKCS #11 上的 FreeRTOS 程式庫整合測試檔案 GitHub。)

移植測試

  • 新增自由圖書館集成測試作為一個子模塊到你的項目。子模塊可以放置在項目的任何目錄中,只要它可以被構建。

  • 複製config_template/test_execution_config_template.hconfig_template/test_param_config_template.h到構建路徑中的項目位置,並將其重命名為test_execution_config.htest_param_config.h

  • 在建置系統中包含相關檔案。如果使用CMake,qualification_test.cmakesrc/pkcs11_tests.cmake可用於包括相關文件。

  • 實施UNITY_OUTPUT_CHAR這樣測試輸出日誌和設備日誌就不會交錯。

  • 整合 MBedTLS,以驗證加密操作結果。

  • 呼叫RunQualificationTest()從應用程式中。

配置測試

PKCS11 測試套件必須根據 PKCS11 實作進行配置。下表列出在中所提供的 PKCS11 測試所需的配置test_param_config.h頭文件。

PKSC11 測試配置
組態 描述
支援金鑰支援

移植支援 RSA 關鍵功能。

支援鍵盤測試

該移植支持 EC 鍵功能。

支持私人密鑰支持

移植支援匯入私密金鑰。如果啟用了支援的關鍵功能,則會在測試中驗證 RSA 和 EC 金鑰匯入。

生成鍵盤支持

移植支持密鑰對生成。如果啟用了支持的關鍵功能,則會在測試中驗證 EC 密鑰對生成。

預先佈建支援

移植具有預先佈建的認證。PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS,PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS,是認證的範例。

PKCS11 測試 _ 標籤設備 _ 私有密鑰形式

測試中使用的私密金鑰標籤。

PKCS11 測試標籤裝置公開密鑰

測試中使用的公開金鑰標籤。

PKCS11 測試標籤設備證書

測試中使用的憑證標籤。

支援的程式碼驗證碼

移植支援 JITP 的儲存裝置。將這個項目設定為 1 以啟用 JITPcodeverify測試。

驗證碼密鑰

JITP 中使用的代碼驗證密鑰的標籤codeverify測試。

測試標籤設定證書

JITP 中使用的 JITP 憑證標籤codeverify測試。

測試標籤根證書

JITP 中使用的根憑證標籤codeverify測試。

FreeRTOS 程式庫和參考整合必須支援至少一個關鍵功能組態,例如 RSA 或橢圓形曲線索引鍵,以及 PKCS11 API 支援的一個金鑰佈建機制。測試必須啟用以下配置:

  • 下列其中一個按鍵功能組態:

    • 支援金鑰支援

    • 支援鍵盤測試

  • 下列其中一個金鑰佈建組態:

    • 支持私人密鑰支持

    • 生成鍵盤支持

    • 預先佈建支援

預先佈建的裝置認證測試必須在下列情況下執行:

  • PKCS11_TEST_PREPROVISIONED_SUPPORT必須啟用且停用其他佈建機制。

  • 只有一個按鍵功能PKCS11_TEST_RSA_KEY_SUPPORT或者PKCS11_TEST_EC_KEY_SUPPORT,已啟用。

  • 根據您的按鍵功能設定預先佈建的金鑰標籤,包括PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS,PKCS11_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_TLSPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS如果在測試期間被銷毀PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT或者PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT已啟用。

執行測試

本節說明如何透過資格測試在本機測試 PKCS11 介面。或者,也可以使用 IDT 來自動執行。請參閱AWS IoT Device Tester對於 FreeRTOSFreeRTOS 使用指南如需詳細資訊。

下列指示說明如何運行測試:

  • 打開test_execution_config.h並定義核心 _ 測試已啟用到 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。按照中所提供的說明使用AWS IoT Device Tester對於 FreeRTOS在《FreeRTOS 使用者指南》中進行設定AWS IoT Device Tester用於連接埠驗證。若要測試特定程式庫的連接埠,必須在device.json檔案中的AWS IoT Device Tester configs資料夾中。