corePKCS11 라이브러리 이식 - FreeRTOS

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

corePKCS11 라이브러리 이식

퍼블릭 키 암호화 표준 #11은 암호화 토큰을 관리하고 사용하기 위한 플랫폼 독립적 API를 정의합니다. PKCS 11은 표준 자체 및 표준에서 정의한 API를 의미합니다. PKCS #11 암호화 API는 키 스토리지, 암호화 객체에 대한 get/set 속성 및 세션 의미 체계를 추상화합니다. 일반적인 암호화 객체를 조작하는 데 널리 사용됩니다. 해당 함수를 통해 애플리케이션 소프트웨어는 암호화 객체를 애플리케이션 메모리에 노출하지 않고도 암호화 객체를 사용, 생성, 수정 및 삭제할 수 있습니다.

FreeRTOS 라이브러리 및 참조 통합은 비대칭 키, 난수 생성 및 해싱 관련 작업 중심으로 PCKS #11 인터페이스 표준의 일부만 사용합니다. 아래 표에는 사용 사례 및 지원해야 하는 필수 PKCS #11 API가 나와 있습니다.

사용 사례
사용 사례 필수 PKCS #11 API 제품군
모두 Initialize, Finalize, Open/Close Session, GetSlotList, Login
프로비저닝 GenerateKeyPair, CreateObject, DestroyObject, InitToken, GetTokenInfo
TLS Random, Sign, FindObject, GetAttributeValue
FreeRTOS+TCP Random, Digest
OTA Verify, Digest, FindObject, GetAttributeValue

전체 PKCS #11 모듈을 구현해야 하는 시기

범용 플래시 메모리에 프라이빗 키를 저장하면 평가 및 신속한 프로토타입 생성 시나리오에서 편리할 수 있습니다. 프로덕션 시나리오에서는 데이터 도용 및 디바이스 복제의 위협을 줄이기 위해 전용 암호화 하드웨어를 사용하는 것이 좋습니다. 암호화 하드웨어에는 암호화 비밀 키의 내보내기를 방지하는 기능이 있는 구성 요소가 포함됩니다. 이를 지원하려면 위 표에 정의된 대로 FreeRTOS 라이브러리와 함께 작동하는 데 필요한 PKCS #11의 하위 집합을 구현해야 합니다.

FreeRTOS corePKCS11을 사용해야 하는 시기

corePKCS11 라이브러리에는 Mbed TLS에서 제공하는 암호화 기능을 사용하는 PKCS #11 인터페이스(API)의 소프트웨어 기반 구현이 포함되어 있습니다. 이 구현은 하드웨어에 전용 암호화 하드웨어가 없는 경우 신속한 프로토타입 생성 및 평가 시나리오를 위해 제공됩니다. 이 경우, corePKCS11 소프트웨어 기반 구현이 하드웨어 플랫폼에서 작동하도록 하려면 corePKCS11 PAL만 구현하면 됩니다.

corePKCS11 이식

온보드 플래시 메모리와 같은 비휘발성 메모리(NVM)에 암호화 객체를 읽고 쓸 수 있는 구현이 있어야 합니다. 암호화 객체는 초기화되지 않고 디바이스 재프로그래밍 시에도 지워지지 않는 NVM 섹션에 저장해야 합니다. corePKCS11 라이브러리 사용자는 디바이스에 보안 인증 정보를 제공한 다음, corePKCS11 인터페이스를 통해 이러한 보안 인증 정보에 액세스하는 새 애플리케이션으로 디바이스를 다시 프로그래밍합니다. corePKCS11 PAL 포트는 다음 항목의 저장 위치를 제공해야 합니다.

  • 디바이스 클라이언트 인증서

  • 디바이스 클라이언트 프라이빗 키

  • 디바이스 클라이언트 퍼블릭 키

  • 신뢰할 수 있는 루트 CA

  • 보안 부트 로더 및 무선 업데이트(OTA)를 위한 코드 확인 퍼블릭 키(또는 코드 확인 퍼블릭 키를 포함하는 인증서)

  • JIT 프로비저닝 인증서

헤더 파일을 포함하고 정의된 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 테스트를 설정하려면 다음을 구현해야 합니다.

  • 지원되는 PKCS11 API 포트.

  • 다음을 포함하는 FreeRTOS 검증 테스트 플랫폼 함수의 구현:

    • FRTest_ThreadCreate

    • FRTest_ThreadTimedJoin

    • FRTest_MemoryAlloc

    • FRTest_MemoryFree

(GitHub에서 PKCS #11 FreeRTOS 라이브러리 통합 테스트에 대한 README.md 파일을 참조하세요.)

이식 테스트

  • FreeRTOS-Libraries-Integration-Tests를 하위 모델로 프로젝트에 추가합니다. 하위 모듈은 빌드가 가능하다면 프로젝트의 어느 디렉터리에든 배치할 수 있습니다.

  • config_template/test_execution_config_template.hconfig_template/test_param_config_template.h를 빌드 경로의 프로젝트 위치에 복사하고 이름을 test_execution_config.htest_param_config.h로 바꿉니다.

  • 관련 파일을 빌드 시스템에 포함합니다. CMake를 사용하는 경우 관련 파일을 포함하는 데 src/pkcs11_tests.cmakequalification_test.cmake를 사용할 수 있습니다.

  • 테스트 출력 로그와 디바이스 로그가 인터리브되지 않도록 UNITY_OUTPUT_CHAR을 구현합니다.

  • cryptoki 작업 결과를 검증하는 MbedTLS를 통합합니다.

  • 애플리케이션에서 RunQualificationTest()를 직접 호출합니다.

테스트 구성

PKCS11 테스트 제품군은 PKCS11 구현에 따라 구성되어야 합니다. 다음 표에는 test_param_config.h 헤더 파일에 있는 PKCS11 테스트에 필요한 구성이 나와 있습니다.

PKSC11 테스트 구성
구성 설명
PKCS11_TEST_RSA_KEY_SUPPORT

이식이 RSA 키 기능을 지원합니다.

PKCS11_TEST_EC_KEY_SUPPORT

이식이 EC 키 기능을 지원합니다.

PKCS11_TEST_IMPORT_PRIVATE_KEY_SUPPORT

이식이 프라이빗 키 가져오기를 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 RSA 및 EC 키 가져오기가 검증됩니다.

PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT

이식이 키 페어 생성을 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 EC 키 페어 생성이 검증됩니다.

PKCS11_TEST_PREPROVISIONED_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_TLS

테스트에 사용되는 퍼블릭 키의 레이블입니다.

PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS

테스트에 사용되는 인증서의 레이블입니다.

PKCS11_TEST_JITP_CODEVERIFY_ROOT_CERT_SUPPORTED

이식이 JITP용 스토리지를 지원합니다. JITP codeverify 테스트를 활성화하려면 이 값을 1로 설정합니다.

PKCS11_TEST_LABEL_CODE_VERIFICATION_KEY

JITP codeverify 테스트에 사용되는 코드 확인 키의 레이블입니다.

PKCS11_TEST_LABEL_JITP_CERTIFICATE

JITP codeverify 테스트에 사용되는 JITP 인증서의 레이블입니다.

PKCS11_TEST_LABEL_ROOT_CERTIFICATE

JITP codeverify 테스트에 사용되는 루트 인증서의 레이블입니다.

FreeRTOS 라이브러리 및 참조 통합은 RSA 또는 타원 곡선 키와 같은 최소 하나의 키 기능 구성과 PKCS11 API에서 지원하는 하나의 키 프로비저닝 메커니즘을 지원해야 합니다. 테스트는 다음과 같은 구성을 활성화해야 합니다.

  • 다음 키 기능 구성 중 하나 이상:

    • PKCS11_TEST_RSA_KEY_SUPPORT

    • PKCS11_TEST_EC_KEY_SUPPORT

  • 다음 키 프로비저닝 구성 중 하나 이상:

    • PKCS11_TEST_IMPORT_PRIVATE_KEY_SUPPORT

    • PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT

    • PKCS11_TEST_PREPROVISIONED_SUPPORT

사전 프로비저닝된 디바이스 보안 인증 정보 테스트는 다음 조건에서 실행되어야 합니다.

  • 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_TLS, PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS를 포함하여 키 기능에 따라 사전 프로비저닝된 키 레이블을 설정합니다. 테스트를 실행하기 전에 이러한 보안 인증 정보가 있어야 합니다.

구현이 사전 프로비저닝된 보안 인증 정보 및 기타 프로비저닝 메커니즘을 지원하는 경우 테스트를 다른 구성으로 여러 번 실행해야 할 수 있습니다.

참고

PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT 또는 PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT가 활성화되면 테스트 중에 PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS, PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLSPKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS 레이블을 가진 객체가 삭제됩니다.

테스트 실행

이 섹션에서는 검증 테스트를 사용하여 로컬에서 PKCS11 인터페이스를 테스트하는 방법을 설명합니다. 또는 IDT를 사용하여 실행을 자동화할 수도 있습니다. 자세한 내용은 FreeRTOS 사용 설명서FreeRTOS용 AWS IoT Device Tester를 참조하세요.

다음 지침에서는 테스트 실행 방법을 설명합니다.

  • test_execution_config.h를 열고 CORE_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 사용 설명서의 FreeRTOS용 AWS IoT Device Tester 사용에 나와 있는 지침에 따라 포트 검증을 위해 AWS IoT Device Tester를 설정합니다. 특정 라이브러리의 포트를 테스트하려면 AWS IoT Device Tester configs 폴더의 device.json 파일에서 올바른 테스트 그룹을 활성화해야 합니다.