

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

# FreeRTOS 라이브러리 이식
<a name="afr-porting"></a>

이식을 시작하기 전에 [이식을 위한 작업 영역 및 프로젝트 설정](porting-set-up-project.md)의 지침을 따르세요.

[FreeRTOS 이식 순서도](porting-chart.md)에서는 이식에 필요한 라이브러리에 대해 설명합니다.

FreeRTOS를 디바이스에 이식하려면 아래 주제의 지침을 따릅니다.

1. [FreeRTOS 커널 포트 구성](afr-porting-kernel.md)

1. [라이브러리 로깅 매크로 구현](afr-library-logging-macros.md)

1. [TCP/IP 스택 이식](afr-porting-tcp.md)

1. [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md)

1. [corePKCS11 라이브러리 이식](afr-porting-pkcs.md)

1. [coreMQTT 라이브러리 구성](afr-porting-mqtt.md)

1. [coreHTTP 라이브러리 구성](afr-porting-corehttp.md)

1. [AWS IoT over-the-air(OTA) 업데이트 라이브러리 이식](afr-porting-ota.md)

1. [셀룰러 인터페이스 라이브러리 이식](freertos-porting-cellular.md)

# FreeRTOS 이식 순서도
<a name="porting-chart"></a>

FreeRTOS를 보드로 이식할 때 아래 이식 순서도를 시각적 보조 자료로 사용합니다.

![\[TLS 연결 및 MQTT를 사용하여 FreeRTOS를 구성하기 위한 순서도입니다.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/portingguide/images/afr-porting.png)


# FreeRTOS 커널 포트 구성
<a name="afr-porting-kernel"></a>

이 섹션에서는 FreeRTOS 커널의 포트를 FreeRTOS 포트 테스트 프로젝트에 통합하는 방법을 설명합니다. 사용 가능한 커널 포트 목록은 [FreeRTOS 커널 포트](https://freertos.org/RTOS_ports.html)를 참조하십시오.

FreeRTOS는 멀티태스킹 및 태스크 간 통신에 FreeRTOS 커널을 사용합니다. 자세한 내용은 *FreeRTOS 사용자 안내서*의 [FreeRTOS 커널 기본 사항](https://docs.aws.amazon.com/freertos/latest/userguide/dev-guide-freertos-kernel.html) 및 [FreeRTOS.org](https://freertos.org/index.html)를 참조하세요.

**참고**  
FreeRTOS 커널을 새로운 아키텍처로 이식하는 방법은 이 설명서에서 다루지 않습니다. 관심이 있으시면 [FreeRTOS 엔지니어링 팀에 문의](https://freertos.org/RTOS-contact-and-support.html)하세요.  
FreeRTOS 검증 프로그램의 경우 기존 FreeRTOS 커널만 지원됩니다. 이러한 포트에 대한 수정은 검증 프로그램 내에서 허용되지 않습니다. 자세한 내용은 [FreeRTOS kernel port policy](https://freertos.org/differences-between-officially-supported-and-contributed-FreeRTOS-code.html)를 참조하세요.

## 사전 조건
<a name="porting-prereqs-kernel"></a>

이식을 위해 FreeRTOS 커널을 설정하려면 다음이 필요합니다.
+ 공식 FreeRTOS 커널 포트, 또는 대상 플랫폼에서 지원되는 FreeRTOS.
+ 대상 플랫폼 및 컴파일러에 대한 올바른 FreeRTOS 커널 포트 파일을 포함하는 IDE 프로젝트. 테스트 프로젝트 설정에 대한 자세한 내용은 [이식을 위한 작업 영역 및 프로젝트 설정](porting-set-up-project.md) 단원을 참조하십시오.

## FreeRTOS 커널 구성
<a name="porting-steps-kernel"></a>

FreeRTOS 커널은 `FreeRTOSConfig.h`라는 구성 파일을 사용하여 사용자 지정됩니다. 이 파일은 커널에 대한 애플리케이션별 구성 설정을 지정합니다. 각 구성 옵션에 대한 설명은 FreeRTOS.org의 [Customisation](https://freertos.org/a00110.html)을 참조하세요.

FreeRTOS 커널을 디바이스에서 작동하도록 구성하려면 `FreeRTOSConfig.h`를 포함하고 추가로 FreeRTOS 구성을 수정합니다.

각 구성 옵션에 대한 설명은 FreeRTOS.org의 [Customisation](https://freertos.org/a00110.html)을 참조하세요.

## 테스트
<a name="porting-testing-kernel"></a>
+ 간단한 FreeRTOS 태스크를 실행하여 메시지를 직렬 출력 콘솔에 로깅합니다.
+ 메시지가 예상대로 콘솔에 출력되는지 확인합니다.

# 라이브러리 로깅 매크로 구현
<a name="afr-library-logging-macros"></a>

FreeRTOS 라이브러리는 다음과 같은 로깅 매크로를 사용합니다(세부 수준 오름차순으로 나열됨).
+ `LogError`
+ `LogWarn`
+ `LogInfo`
+ `LogDebug`

모든 매크로에 대한 정의를 제공해야 합니다. 권장 사항은 다음과 같습니다.
+ 매크로는 `C89` 스타일 로깅을 지원해야 합니다.
+ 로깅은 스레드 안전이어야 합니다. 여러 태스크의 로그 줄이 인터리브되지 않아야 합니다.
+ 로깅 API는 I/O에서 차단되지 않아야 하고 애플리케이션 태스크가 I/O에서 차단되지 않도록 해야 합니다.

구현 세부 사항은 FreeRTOS.org의 [Logging Functionality](https://www.freertos.org/logging.html)를 참조하세요. 이 [예제](https://github.com/FreeRTOS/lab-iot-reference-nxp-rt1060/tree/main/examples/common/logging)에서 구현을 확인할 수 있습니다.

## 테스트
<a name="testing-logging"></a>
+ 여러 태스크가 포함된 테스트를 실행하여 로그가 인터리브되지 않는지 확인합니다.
+ 테스트를 실행하여 로깅 API가 I/O에서 차단되지 않는지 확인합니다.
+ `C89,C99` 스타일 로깅과 같은 다양한 표준으로 로깅 매크로를 테스트합니다.
+ `Debug`, `Info`, `Error`, `Warning` 등 다양한 로그 수준을 설정하여 로깅 매크로를 테스트합니다.

# TCP/IP 스택 이식
<a name="afr-porting-tcp"></a>

이 섹션에서는 온보드 TCP/IP 스택을 이식하고 테스트하기 위한 지침을 제공합니다. 플랫폼이 TCP/IP 및 TLS 기능을 별도의 네트워크 프로세서 또는 모듈로 오프로드하는 경우 이 이식 섹션을 건너뛰고 [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md) 섹션으로 이동하세요.

[FreeRTOS\$1TCP](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html)는 FreeRTOS 커널의 네이티브 TCP/IP 스택입니다. FreeRTOS\$1TCP는 FreeRTOS 엔지니어링 팀에서 개발 및 유지 관리하며 FreeRTOS와 함께 사용하도록 권장되는 TCP/IP 스택입니다. 자세한 내용은 [FreeRTOS\$1TCP 이식](#porting-freertos-tcp) 섹션을 참조하세요. 타사 TCP/IP 스택 [lwIP](https://savannah.nongnu.org/projects/lwip/)를 사용할 수도 있습니다. 이 섹션에 제공된 테스트 지침은 TCP 일반 텍스트용 전송 인터페이스 테스트를 사용하며 구현된 특정 TCP/IP 스택에 종속되지 않습니다.

## FreeRTOS\$1TCP 이식
<a name="porting-freertos-tcp"></a>

FreeRTOS\$1TCP는 FreeRTOS 커널의 네이티브 TCP/IP 스택입니다. 자세한 내용은 [FreeRTOS.org](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/)를 참조하십시오.

### 사전 조건
<a name="porting-prereqs-freertos-tcp"></a>

FreeRTOS\$1TCP 라이브러리를 이식하려면 다음이 필요합니다.
+ 공급업체에서 제공하는 이더넷 또는 Wi-Fi 드라이버가 포함된 IDE 프로젝트.

  테스트 프로젝트 설정에 대한 자세한 내용은 [이식을 위한 작업 영역 및 프로젝트 설정](porting-set-up-project.md) 단원을 참조하십시오.
+ FreeRTOS 커널의 검증된 구성.

  플랫폼에 맞는 FreeRTOS 커널 구성에 대한 정보는 [FreeRTOS 커널 포트 구성](afr-porting-kernel.md) 단원을 참조하십시오.

### 이식
<a name="porting-steps-freertos-tcp"></a>

FreeRTOS-TCP 라이브러리 이식을 시작하기 전에 [GitHub](https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/tree/main/source/portable/NetworkInterface) 디렉터리를 확인하여 보드에 대한 포트가 이미 존재하는지 확인합니다.

포트가 존재하지 않으면 다음을 수행하십시오.

1. FreeRTOS\$1TCP를 디바이스에 이식하는 방법은 FreeRTOS.org의 [Porting FreeRTOS\$1TCP to a Different Microcontroller](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Ethernet_Porting.html)를 참조하십시오.

1. 필요한 경우 FreeRTOS\$1TCP를 새 컴파일러에 이식하는 방법은 FreeRTOS.org의 [Porting FreeRTOS\$1TCP to a New Embedded C Compiler](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Compiler_Porting.html)를 참조하십시오.

1. 공급업체가 제공한 이더넷 또는 Wi-Fi 드라이버를 사용하는 새 포트를 `NetworkInterface.c`라는 파일에 구현합니다. 템플릿을 보려면 [GitHub](https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/tree/main/source/portable/NetworkInterface/board_family) 리포지토리를 방문하세요.

포트를 생성한 후 또는 포트가 이미 있는 경우 `FreeRTOSIPConfig.h`를 생성하고 사용 중인 플랫폼에 맞게 구성 옵션을 편집합니다. 구성 옵션에 대한 자세한 내용은 FreeRTOS.org의 [FreeRTOS\$1TCP Configuration](https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_IP_Configuration.html)을 참조하십시오.

## 테스트
<a name="testing-tcp"></a>

FreeRTOS\$1TCP 라이브러리를 사용하든 타사 라이브러리를 사용하든 아래 단계에 따라 테스트합니다.
+ 전송 인터페이스 테스트에서 API에 대한 `connect/disconnect/send/receive` 구현을 제공합니다.
+ 에코 서버를 일반 텍스트 TCP 연결 모드로 설정하고 전송 인터페이스 테스트를 실행합니다.

**참고**  
FreeRTOS용 디바이스를 공식적으로 인증하려면 아키텍처가 TCP/IP 소프트웨어 스택을 이식해야 하는 경우 AWS IoT Device Tester를 사용하여 디바이스의 포팅된 소스 코드를 일반 텍스트 TCP 연결 모드에서 전송 인터페이스 테스트에 대해 검증해야 합니다. *FreeRTOS 사용 설명서*의 [FreeRTOS용 AWS IoT Device Tester 사용](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)에 나와 있는 지침에 따라 포트 검증을 위해 AWS IoT Device Tester를 설정합니다. 특정 라이브러리의 포트를 테스트하려면 Device Tester `device.json` 폴더의 `configs` 파일에서 올바른 테스트 그룹을 활성화해야 합니다.

# corePKCS11 라이브러리 이식
<a name="afr-porting-pkcs"></a>

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

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


**사용 사례**  

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

## 전체 PKCS \$111 모듈을 구현해야 하는 시기
<a name="implemeting-pkcs"></a>

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

## FreeRTOS corePKCS11을 사용해야 하는 시기
<a name="using-pkcs"></a>

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

## corePKCS11 이식
<a name="porting-core-pkcs"></a>

온보드 플래시 메모리와 같은 비휘발성 메모리(NVM)에 암호화 객체를 읽고 쓸 수 있는 구현이 있어야 합니다. 암호화 객체는 초기화되지 않고 디바이스 재프로그래밍 시에도 지워지지 않는 NVM 섹션에 저장해야 합니다. corePKCS11 라이브러리 사용자는 디바이스에 보안 인증 정보를 제공한 다음, corePKCS11 인터페이스를 통해 이러한 보안 인증 정보에 액세스하는 새 애플리케이션으로 디바이스를 다시 프로그래밍합니다. corePKCS11 PAL 포트는 다음 항목의 저장 위치를 제공해야 합니다.
+ 디바이스 클라이언트 인증서
+ 디바이스 클라이언트 프라이빗 키
+ 디바이스 클라이언트 퍼블릭 키
+ 신뢰할 수 있는 루트 CA
+ 보안 부트 로더 및 무선 업데이트(OTA)를 위한 코드 확인 퍼블릭 키(또는 코드 확인 퍼블릭 키를 포함하는 인증서)
+ JIT 프로비저닝 인증서

[헤더 파일](https://github.com/FreeRTOS/corePKCS11/blob/main/source/include/core_pkcs11_pal.h)을 포함하고 정의된 PAL API를 구현합니다.


**PAL API**  

| 함수 | 설명 | 
| --- | --- | 
| PKCS11\$1PAL\$1Initialize |  PAL 계층을 초기화합니다. 초기화 시퀀스의 시작 부분에서 corePKCS11 라이브러리에 의해 호출됩니다.  | 
| PKCS11\$1PAL\$1SaveObject |  비휘발성 스토리지에 데이터를 씁니다.  | 
| PKCS11\$1PAL\$1FindObject |  PKCS \$111 `CKA_LABEL`을 사용하여 비휘발성 스토리지에서 해당 PKCS \$111 객체를 검색하고 해당 객체의 핸들이 있으면 반환합니다.  | 
| PKCS11\$1PAL\$1GetObjectValue |  핸들이 지정된 객체의 값을 가져옵니다.  | 
| PKCS11\$1PAL\$1GetObjectValueCleanup |  `PKCS11_PAL_GetObjectValue` 호출을 위해 정리합니다. `PKCS11_PAL_GetObjectValue` 호출에 할당된 여유 메모리를 해제하는 데 사용할 수 있습니다.  | 

## 테스트
<a name="porting-testing-pkcs"></a>

FreeRTOS corePKCS11 라이브러리를 사용하거나 PKCS11 API 중 필요한 하위 집합을 구현하는 경우 FreeRTOS PKCS11 테스트를 통과해야 합니다. 이를 통해 FreeRTOS 라이브러리의 필수 함수가 예상대로 작동하는지 테스트됩니다.

또한 이 섹션에서는 검증 테스트를 사용하여 로컬에서 FreeRTOS PKCS11 테스트를 실행하는 방법을 설명합니다.

### 사전 조건
<a name="porting-testing-prereqs"></a>

FreeRTOS PKCS11 테스트를 설정하려면 다음을 구현해야 합니다.
+ 지원되는 PKCS11 API 포트.
+ 다음을 포함하는 FreeRTOS 검증 테스트 플랫폼 함수의 구현:
  + `FRTest_ThreadCreate`
  + `FRTest_ThreadTimedJoin`
  + `FRTest_MemoryAlloc`
  + `FRTest_MemoryFree`

(GitHub에서 PKCS \$111 FreeRTOS 라이브러리 통합 테스트에 대한 [README.md](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11) 파일을 참조하세요.)

### 이식 테스트
<a name="porting-tests-pkcs11"></a>
+ [ FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11)를 하위 모델로 프로젝트에 추가합니다. 하위 모듈은 빌드가 가능하다면 프로젝트의 어느 디렉터리에든 배치할 수 있습니다.
+ `config_template/test_execution_config_template.h` 및 `config_template/test_param_config_template.h`를 빌드 경로의 프로젝트 위치에 복사하고 이름을 `test_execution_config.h` 및 `test_param_config.h`로 바꿉니다.
+ 관련 파일을 빌드 시스템에 포함합니다. `CMake`를 사용하는 경우 관련 파일을 포함하는 데 `src/pkcs11_tests.cmake` 및 `qualification_test.cmake`를 사용할 수 있습니다.
+ 테스트 출력 로그와 디바이스 로그가 인터리브되지 않도록 `UNITY_OUTPUT_CHAR`을 구현합니다.
+ cryptoki 작업 결과를 검증하는 MbedTLS를 통합합니다.
+ 애플리케이션에서 `RunQualificationTest()`를 직접 호출합니다.

### 테스트 구성
<a name="configure-pkcs11-tests"></a>

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


**PKSC11 테스트 구성**  

| 구성 | 설명 | 
| --- | --- | 
| PKCS11\$1TEST\$1RSA\$1KEY\$1SUPPORT |  이식이 RSA 키 기능을 지원합니다.  | 
| PKCS11\$1TEST\$1EC\$1KEY\$1SUPPORT |  이식이 EC 키 기능을 지원합니다.  | 
| PKCS11\$1TEST\$1IMPORT\$1PRIVATE\$1KEY\$1SUPPORT |  이식이 프라이빗 키 가져오기를 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 RSA 및 EC 키 가져오기가 검증됩니다.  | 
| PKCS11\$1TEST\$1GENERATE\$1KEYPAIR\$1SUPPORT |  이식이 키 페어 생성을 지원합니다. 지원되는 키 기능이 활성화된 경우 테스트에서 EC 키 페어 생성이 검증됩니다.  | 
| PKCS11\$1TEST\$1PREPROVISIONED\$1SUPPORT |  이식에 보안 인증 정보가 사전 프로비저닝되어 있습니다. `PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`, `PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` 및 `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS`는 보안 인증 정보의 예입니다.  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1PRIVATE\$1KEY\$1FOR\$1TLS |  테스트에 사용되는 프라이빗 키의 레이블입니다.  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1PUBLIC\$1KEY\$1FOR\$1TLS |  테스트에 사용되는 퍼블릭 키의 레이블입니다.  | 
| PKCS11\$1TEST\$1LABEL\$1DEVICE\$1CERTIFICATE\$1FOR\$1TLS |  테스트에 사용되는 인증서의 레이블입니다.  | 
| PKCS11\$1TEST\$1JITP\$1CODEVERIFY\$1ROOT\$1CERT\$1SUPPORTED |  이식이 JITP용 스토리지를 지원합니다. JITP `codeverify` 테스트를 활성화하려면 이 값을 1로 설정합니다.  | 
| PKCS11\$1TEST\$1LABEL\$1CODE\$1VERIFICATION\$1KEY |  JITP `codeverify` 테스트에 사용되는 코드 확인 키의 레이블입니다.  | 
| PKCS11\$1TEST\$1LABEL\$1JITP\$1CERTIFICATE |  JITP `codeverify` 테스트에 사용되는 JITP 인증서의 레이블입니다.  | 
| PKCS11\$1TEST\$1LABEL\$1ROOT\$1CERTIFICATE |  JITP `codeverify` 테스트에 사용되는 루트 인증서의 레이블입니다.  | 

FreeRTOS 라이브러리 및 참조 통합은 RSA 또는 타원 곡선 키와 같은 최소 하나의 키 기능 구성과 PKCS11 API에서 지원하는 하나의 키 프로비저닝 메커니즘을 지원해야 합니다. 테스트는 다음과 같은 구성을 활성화해야 합니다.
+ 다음 키 기능 구성 중 하나 이상:
  + PKCS11\$1TEST\$1RSA\$1KEY\$1SUPPORT
  + PKCS11\$1TEST\$1EC\$1KEY\$1SUPPORT
+ 다음 키 프로비저닝 구성 중 하나 이상:
  + PKCS11\$1TEST\$1IMPORT\$1PRIVATE\$1KEY\$1SUPPORT
  + PKCS11\$1TEST\$1GENERATE\$1KEYPAIR\$1SUPPORT
  + PKCS11\$1TEST\$1PREPROVISIONED\$1SUPPORT 

사전 프로비저닝된 디바이스 보안 인증 정보 테스트는 다음 조건에서 실행되어야 합니다.
+ `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_TLS` 및 `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS` 레이블을 가진 객체가 삭제됩니다.

### 테스트 실행
<a name="running-tests"></a>

이 섹션에서는 검증 테스트를 사용하여 로컬에서 PKCS11 인터페이스를 테스트하는 방법을 설명합니다. 또는 IDT를 사용하여 실행을 자동화할 수도 있습니다. 자세한 내용은 *FreeRTOS 사용 설명서*의 [FreeRTOS용 AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)를 참조하세요.

다음 지침에서는 테스트 실행 방법을 설명합니다.
+ `test_execution_config.h`를 열고 **CORE\$1PKCS11\$1TEST\$1ENABLED**를 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 사용](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)에 나와 있는 지침에 따라 포트 검증을 위해 AWS IoT Device Tester를 설정합니다. 특정 라이브러리의 포트를 테스트하려면 AWS IoT Device Tester `configs` 폴더의 `device.json` 파일에서 올바른 테스트 그룹을 활성화해야 합니다.

# 네트워크 전송 인터페이스 이식
<a name="afr-porting-network-transport-interface"></a>

## TLS 라이브러리 통합
<a name="afr-porting-tls"></a>

전송 계층 보안(TLS) 인증의 경우 선호하는 TLS 스택을 사용합니다. FreeRTOS 라이브러리로 테스트되었으므로 [Mbed TLS](https://tls.mbed.org/)를 사용하는 것이 좋습니다. 이 [GitHub](https://github.com/FreeRTOS/FreeRTOS) 리포지토리에서 예제를 찾을 수 있습니다.

디바이스에서 사용하는 TLS 구현에 관계없이 TCP/IP 스택을 사용하여 TLS 스택의 기본 전송 후크를 구현해야 합니다. [AWS IoT에서 지원하는 TLS 암호 제품군](https://docs.aws.amazon.com/iot/latest/developerguide/transport-security.html#tls-cipher-suite-support)을 지원해야 합니다.

## 네트워크 전송 인터페이스 라이브러리 이식
<a name="network-intro"></a>

[coreMQTT](https://www.freertos.org/mqtt/index.html) 및 [CoreHTTP](https://www.freertos.org/http/index.html)를 사용하려면 네트워크 전송 인터페이스를 구현해야 합니다. 네트워크 전송 인터페이스에는 단일 네트워크 연결에서 데이터를 보내고 받는 데 필요한 함수 포인터와 컨텍스트 데이터가 포함되어 있습니다. 자세한 내용은 [전송 인터페이스](https://www.freertos.org/network-interface.html)를 참조하세요. FreeRTOS는 이러한 구현을 검증하기 위한 일련의 네트워크 전송 인터페이스 테스트를 기본 제공합니다. 다음 섹션에서는 이러한 테스트를 실행하도록 프로젝트를 설정하는 방법을 안내합니다.

## 사전 조건
<a name="prereqs"></a>

이 테스트를 이식하려면 다음이 필요합니다.
+ 검증된 FreeRTOS 커널 포트로 FreeRTOS를 빌드할 수 있는 빌드 시스템이 포함된 프로젝트.
+ 정상 작동하는 네트워크 드라이버 구현.

## 이식
<a name="porting-network-transport-interface"></a>
+ [ FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests)를 하위 모델로 프로젝트에 추가합니다. 하위 모듈은 빌드가 가능하다면 프로젝트 내 어디에 배치하든 상관이 없습니다.
+ `config_template/test_execution_config_template.h` 및 `config_template/test_param_config_template.h`를 빌드 경로의 프로젝트 위치에 복사하고 이름을 `test_execution_config.h` 및 `test_param_config.h`로 바꿉니다.
+ 관련 파일을 빌드 시스템에 포함합니다. `CMake`를 사용하는 경우 `src/transport_interface_tests.cmake` 및 `qualification_test.cmake`가 관련 파일을 포함하는 데 사용됩니다.
+ 적절한 프로젝트 위치에서 다음 함수를 구현합니다.
+ 
  + `network connect function`: 서명은 `src/common/network_connection.h`에서 `NetworkConnectFunc`에 의해 정의됩니다. 이 함수는 네트워크 컨텍스트에 대한 포인터, 호스트 정보에 대한 포인터, 네트워크 보안 인증 정보에 대한 포인터를 받습니다. 제공된 네트워크 보안 인증 정보를 사용하여 호스트 정보에 지정된 서버와의 연결을 설정합니다.
  + `network disconnect function`: 서명은 `src/common/network_connection.h`에서 `NetworkDisconnectFunc`에 의해 정의됩니다. 이 함수는 네트워크 컨텍스트에 대한 포인터를 받습니다. 네트워크 컨텍스트에 저장된 이전에 설정된 연결을 해제합니다.
  + `setupTransportInterfaceTestParam()`: 이 함수는 `src/transport_interface/transport_interface_tests.h`에 정의되어 있습니다. 구현은 `transport_interface_tests.h`에 정의된 것과 정확히 같은 이름 및 서명을 가져야 합니다. 이 함수는 *TransportInterfaceTestParam* 구조에 대한 포인터를 받습니다. 전송 인터페이스 테스트에서 사용되는 *TransportInterfaceTestParam* 구조의 필드를 채웁니다.
+ 테스트 출력 로그가 디바이스 로그와 인터리브되지 않도록 **UNITY\$1OUTPUT\$1CHAR**을 구현합니다.
+ 애플리케이션에서 `runQualificationTest()`를 직접 호출합니다. 직접 호출 전에 디바이스 하드웨어를 제대로 초기화하고 네트워크를 연결해야 합니다.

### 보안 인증 정보 관리(디바이스 내 생성 키)
<a name="cred-management-key"></a>

`test_param_config.h`에서 **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR**을 1로 설정한 경우 디바이스 애플리케이션은 새 디바이스 내 키 페어를 생성하고 퍼블릭 키를 출력합니다. 디바이스 애플리케이션은 에코 서버와 TLS 연결을 설정할 때 **ECHO\$1SERVER\$1ROOT\$1CA** 및 **TRANSPORT\$1CLIENT\$1CERTIFICATE**를 에코 서버 루트 CA 및 클라이언트 인증서로 사용합니다. IDT는 검증 실행 중에 이러한 파라미터를 설정합니다.

### 보안 인증 정보 관리(키 가져오기)
<a name="cred-management-importing-key"></a>

디바이스 애플리케이션은 에코 서버와 TLS 연결을 설정할 때 `test_param_config.h`의 **ECHO\$1SERVER\$1ROOT\$1CA**, **TRANSPORT\$1CLIENT\$1CERTIFICATE** 및 **TRANSPORT\$1CLIENT\$1PRIVATE\$1KEY**를 에코 서버 루트 CA, 클라이언트 인증서 및 클라이언트 프라이빗 키로 사용합니다. IDT는 검증 실행 중에 이러한 파라미터를 설정합니다.

## 테스트
<a name="testing-transport-interface"></a>

이 섹션에서는 검증 테스트를 사용하여 로컬에서 전송 인터페이스를 테스트하는 방법을 설명합니다. 추가 세부 정보는 GitHub에서 FreeRTOS-Libraries-Integration-Tests의 [transport\$1interface](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/transport_interface) 섹션에 제공된 README.md 파일을 통해 확인할 수 있습니다.

또는 IDT를 사용하여 실행을 자동화할 수도 있습니다. 자세한 내용은 *FreeRTOS 사용 설명서*의 [FreeRTOS용AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)를 참조하세요.

### 테스트 활성화
<a name="enabling-test"></a>

`test_execution_config.h`를 열고 **TRANSPORT\$1INTERFACE\$1TEST\$1ENABLED**를 1로 정의합니다.

### 테스트를 위해 에코 서버를 설정합니다.
<a name="configuring-echo-server-test"></a>

로컬 테스트에는 테스트를 실행하는 디바이스에서 액세스할 수 있는 에코 서버가 필요합니다. 전송 인터페이스 구현이 TLS를 지원하는 경우 에코 서버는 TLS를 지원해야 합니다. 아직 이 구현이 없다면 [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/tools/echo_server) GitHub 리포지토리에 에코 서버 구현이 있습니다.

### 테스트를 위한 프로젝트 구성
<a name="configure-project"></a>

`test_param_config.h`에서 **ECHO\$1SERVER\$1ENDPOINT** 및 **ECHO\$1SERVER\$1PORT**를 이전 단계의 엔드포인트 및 서버 설정으로 업데이트합니다.

### 보안 인증 정보 설정(디바이스 내 생성 키)
<a name="setup-credentials-device-key"></a>
+ **ECHO\$1SERVER\$1ROOT\$1CA**를 에코 서버의 서버 인증서로 설정합니다.
+ **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR**를 1로 설정하여 키 페어를 생성하고 퍼블릭 키를 가져옵니다.
+ 키 생성 후 **FORCE\$1GENERATE\$1NEW\$1KEY\$1PAIR**를 다시 0으로 설정합니다.
+ 퍼블릭 키 및 서버 키와 인증서를 사용하여 클라이언트 인증서를 생성합니다.
+ **TRANSPORT\$1CLIENT\$1CERTIFICATE**를 생성된 클라이언트 인증서로 설정합니다.

### 보안 인증 정보 설정(키 가져오기)
<a name="setup-credentials-import-key"></a>
+ **ECHO\$1SERVER\$1ROOT\$1CA**를 에코 서버의 서버 인증서로 설정합니다.
+ **TRANSPORT\$1CLIENT\$1CERTIFICATE**를 사전 생성된 클라이언트 인증서로 설정합니다.
+ **TRANSPORT\$1CLIENT\$1PRIVATE\$1KEY**를 사전 생성된 클라이언트 프라이빗 키로 설정합니다.

### 애플리케이션 빌드 및 플래시
<a name="build-flash"></a>

원하는 도구 체인을 사용하여 애플리케이션을 빌드하고 플래시합니다. `runQualificationTest()`가 간접 호출되면 전송 인터페이스 테스트가 실행됩니다. 테스트 결과가 직렬 포트로 출력됩니다.

**참고**  
FreeRTOS용 디바이스를 공식적으로 검증하려면 디바이스의 이식된 소스 코드를 OTA PAL 및 OTA E2E 테스트 그룹과 비교하여 검증해야 합니다 AWS IoT Device Tester. [FreeRTOS 사용 설명서의 FreeRTOS AWS IoT Device Tester 용 사용](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)의 지침에 따라 포트 검증 AWS IoT Device Tester 을 설정합니다. *FreeRTOS * 특정 라이브러리의 포트를 테스트하려면 폴더의 `device.json` 파일 AWS IoT Device Tester `configs`에서 올바른 테스트 그룹을 활성화해야 합니다.

# coreMQTT 라이브러리 구성
<a name="afr-porting-mqtt"></a>

엣지에 있는 디바이스는 MQTT 프로토콜을 사용하여 AWS 클라우드와 통신할 수 있습니다. AWS IoT는 엣지에 있는 연결된 디바이스와 메시지를 주고 받는 MQTT 브로커를 호스팅합니다.

coreMQTT 라이브러리는 FreeRTOS를 실행하는 디바이스에 대해 MQTT 프로토콜을 구현합니다. coreMQTT 라이브러리를 이식할 필요는 없지만, 검증을 위해서는 디바이스의 테스트 프로젝트가 모든 MQTT 테스트를 통과해야 합니다. 자세한 내용은 *FreeRTOS 사용 설명서*의 [coreMQTT 라이브러리](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)를 참조하세요.

## 사전 조건
<a name="testing-prereqs-mqtt"></a>

coreMQTT 라이브러리 테스트를 설정하려면 네트워크 전송 인터페이스 포트가 필요합니다. 자세한 내용은 [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md) 섹션을 참조하세요.

## 테스트
<a name="testing-mqtt"></a>

coreMQTT 통합 테스트 실행:
+ MQTT 브로커에 클라이언트 인증서를 등록합니다.
+ `config`에서 브로커 엔드포인트를 설정하고 통합 테스트를 실행합니다.

## 참조 MQTT 데모 생성
<a name="reference-mqtt"></a>

coreMQTT 에이전트를 사용하여 모든 MQTT 작업에 대한 스레드 안전성을 처리하는 것이 좋습니다. 또한 사용자는 게시 및 구독 태스크와 애플리케이션이 TLS, MQTT 및 기타 FreeRTOS 라이브러리를 효과적으로 통합하는지 검증하기 위한 Device Advisor 테스트가 필요합니다.

FreeRTOS용 디바이스를 공식적으로 인증하려면 AWS IoT Device Tester MQTT 테스트 사례로 통합 프로젝트를 검증하세요. 설정 및 테스트 지침은 [AWS IoT Device Advisor 워크플로](https://docs.aws.amazon.com/iot/latest/developerguide/device-advisor-console-tutorial.html)를 참조하세요. TLS 및 MQTT에 대한 필수 테스트 사례는 다음과 같습니다.


**TLS 테스트 사례**  

| 테스트 사례 | 테스트 사례 | 필수 테스트 | 
| --- | --- | --- | 
| TLS | TLS 연결 | 예 | 
| TLS | TLS 지원 AWS IoT 암호 제품군 | 권장 [암호 제품군](https://docs.aws.amazon.com/iot/latest/developerguide/transport-security.html#tls-cipher-suite-support)  | 
| TLS | TLS 비보안 서버 인증서 | 예 | 
| TLS | TLS Incorrect Subject Name Servr Cert | 예 | 


**MQTT 테스트 사례**  

| 테스트 사례 | 테스트 사례 | 필수 테스트 | 
| --- | --- | --- | 
| MQTT | MQTT Connect | 예 | 
| MQTT | MQTT Connect Jitter Retries | 예, 경고 없음 | 
| MQTT | MQTT Subscribe | 예 | 
| MQTT | MQTT Publish | 예 | 
| MQTT | MQTT ClientPuback QoS1 | 예 | 
| MQTT | MQTT No Ack PingResp | 예 | 

# coreHTTP 라이브러리 구성
<a name="afr-porting-corehttp"></a>

엣지에 있는 디바이스는 HTTP 프로토콜을 사용하여 AWS 클라우드와 통신할 수 있습니다. AWS IoT 서비스는 엣지에 있는 연결된 디바이스와 메시지를 주고 받는 HTTP 서버를 호스팅합니다.

## 테스트
<a name="testing-corehttp"></a>

테스트는 아래 단계를 따릅니다.
+ AWS 또는 HTTP 서버와의 TLS 상호 인증을 위해 PKI를 설정합니다.
+ CoreHTTP 통합 테스트를 실행합니다.

# AWS IoT over-the-air(OTA) 업데이트 라이브러리 이식
<a name="afr-porting-ota"></a>

FreeRTOS 무선 업데이트(OTA)를 통해 다음을 수행할 수 있습니다.
+ 새 펌웨어 이미지를 단일 디바이스, 디바이스 그룹 또는 전체 플릿에 배포합니다.
+ 그룹에 추가되거나, 재설정되거나, 다시 프로비저닝되는 디바이스에 펌웨어를 배포합니다.
+ 디바이스에 배포된 이후에 새 펌웨어의 신뢰성과 무결성을 확인합니다.
+ 배포 진행 상황을 모니터링합니다.
+ 실패한 배포를 디버깅합니다.
+ 코드 서명을 사용하여 펌웨어에 디지털 서명합니다 AWS IoT.

자세한 내용은 [AWS IoT Over-the-air Update Documentation](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/index.html)과 함께 *FreeRTOS 사용 설명서*의 [FreeRTOS 무선(OTA) 업데이트](https://docs.aws.amazon.com/freertos/latest/userguide/freertos-ota-dev.html)를 참조하세요.

OTA 에이전트 라이브러리를 사용하여 OTA 기능을 FreeRTOS 애플리케이션에 통합할 수 있습니다. 자세한 내용은 *FreeRTOS 사용 설명서*의 [FreeRTOS OTA 업데이트 라이브러리](https://docs.aws.amazon.com/freertos/latest/userguide/ota-update-library.html)를 참조하세요.

FreeRTOS 디바이스는 수신한 OTA 펌웨어 이미지에 대해 암호화 코드 서명 확인을 수행해야 합니다. 다음 알고리즘이 권장됩니다.
+ ECDSA(Elliptic-Curve Digital Signature Algorithm)
+ NIST P256 곡선
+ SHA-256 해시

## 사전 조건
<a name="porting-prereqs-ota"></a>
+ [이식을 위한 작업 영역 및 프로젝트 설정](porting-set-up-project.md)의 지침을 완료합니다.
+ 네트워크 전송 인터페이스 포트를 생성합니다.

  자세한 내용은 [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md) 단원을 참조하세요.
+ coreMQTT 라이브러리를 통합합니다. FreeRTOS 사용 설명서에서 [coreMQTT 라이브러리](https://docs.aws.amazon.com/freertos/latest/userguide/coremqtt.html)를 참조하세요.
+ OTA 업데이트를 지원할 수 있는 부트 로더를 생성합니다.

## 플랫폼 이식
<a name="porting-steps-ota"></a>

OTA 라이브러리를 새 디바이스로 이식하려면 OTA 이식 가능 추상화 계층(PAL) 구현을 제공해야 합니다. PAL API는 [ota\$1platform\$1interface.h](https://github.com/aws/ota-for-aws-iot-embedded-sdk/blob/main/source/include/ota_platform_interface.h) 파일에 정의되어 있으며, 이 파일에 대한 구현별 세부 정보를 제공해야 합니다.


| 함수 이름 | 설명 | 
| --- | --- | 
| `otaPal_Abort` | OTA 업데이트를 중지합니다. | 
| `otaPal_CreateFileForRx` | 수신한 데이터 청크를 저장할 파일을 생성합니다. | 
| `otaPal_CloseFile` | 지정된 파일을 닫습니다. 암호화 보호를 구현하는 스토리지를 사용 중인 경우 파일을 인증할 수 있습니다. | 
| `otaPal_WriteBlock` | 지정된 파일의 지정된 오프셋에 데이터 블록을 씁니다. 성공 시, 함수가 기록된 바이트 수를 반환합니다. 그렇지 않으면 함수는 음수 오류 코드를 반환합니다. 블록 크기는 항상 2의 거듭제곱이며 정렬됩니다. 자세한 내용은 [OTA 라이브러리 구성](https://freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_config.html)을 참조하세요. | 
| `otaPal_ActivateNewImage` | 새 펌웨어 이미지를 활성화하거나 실행합니다. 일부 포트의 경우 디바이스가 프로그래밍 방식으로 동기적으로 재설정되면 이 함수가 반환되지 않습니다. | 
| `otaPal_SetPlatformImageState` | 플랫폼이 최신 OTA 펌웨어 이미지(또는 번들)를 수락하거나 거부하는 데 필요한 작업을 수행합니다. 이 함수를 구현하려면 보드(플랫폼) 세부 정보 및 아키텍처 설명서를 참조하세요. | 
| `otaPal_GetPlatformImageState` | OTA 업데이트 이미지의 상태를 가져옵니다. | 

디바이스에 내장된 지원 기능이 있는 경우 이 표에 있는 함수를 구현하십시오.


| 함수 이름 | 설명 | 
| --- | --- | 
| `otaPal_CheckFileSignature` | 지정된 파일의 서명을 검증합니다. | 
| `otaPal_ReadAndAssumeCertificate` | 파일 시스템에서 지정된 서명자 인증서를 읽고 호출자에게 반환합니다. | 
| `otaPal_ResetDevice` | 디바이스를 재설정합니다. | 

**참고**  
OTA 업데이트를 지원할 수 있는 부트로더가 있는지 확인합니다. AWS IoT 디바이스 부트 로더를 생성하기 위한 지침은 [IoT 디바이스 부트로더](#afr-bootloader) 섹션을 참조하세요.

## E2E 및 PAL 테스트
<a name="porting-steps-testing"></a>

 OTA PAL 및 E2E 테스트를 실행합니다.

### E2E 테스트
<a name="porting-ota-e2e"></a>

OTA 엔드투엔드(E2E) 테스트는 디바이스의 OTA 기능을 확인하고 실제 시나리오를 시뮬레이션하는 데 사용됩니다. 이 테스트에는 오류 처리가 포함됩니다.

#### 사전 조건
<a name="e2e-prereqs"></a>

이 테스트를 이식하려면 다음이 필요합니다.
+  AWS OTA 라이브러리가 통합된 프로젝트입니다. 자세한 내용을 알아보려면 [OTA Library Porting Guide](https://www.freertos.org/Documentation/api-ref/ota-for-aws-iot-embedded-sdk/docs/doxygen/output/html/ota_porting.html)를 참조하세요.
+ OTA 라이브러리를 사용하여 데모 애플리케이션을 이식하고 AWS IoT Core 와 상호 작용하여 OTA 업데이트를 수행합니다. [OTA 데모 애플리케이션 이식](#e2e-porting-demo-application)을(를) 참조하세요.
+ IDT 도구를 설정합니다. 그러면 OTA E2E 호스트 애플리케이션이 실행되어 다양한 구성으로 디바이스를 빌드, 플래시 및 모니터링하고 OTA 라이브러리 통합을 검증합니다.

#### OTA 데모 애플리케이션 이식
<a name="e2e-porting-demo-application"></a>

OTA E2E 테스트에는 OTA 라이브러리 통합을 검증하기 위한 OTA 데모 애플리케이션이 있어야 합니다. 데모 애플리케이션에는 OTA 펌웨어 업데이트를 수행할 수 있는 기능이 있어야 합니다. FreeRTOS OTA 데모 애플리케이션은 [FreeRTOS GitHub](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator) 리포지토리에서 찾을 수 있습니다. 데모 애플리케이션을 참조로 사용하고 사양에 따라 수정하는 것이 좋습니다.

##### 이식 단계
<a name="e2e-port-demo"></a>

1. OTA 에이전트를 초기화합니다.

1. OTA 애플리케이션 콜백 함수를 구현합니다.

1. OTA 에이전트 이벤트 처리 태스크를 생성합니다.

1. OTA 에이전트를 시작합니다.

1. OTA 에이전트 통계를 모니터링합니다.

1. OTA 에이전트를 종료합니다.

자세한 지침을 알아보려면 [FreeRTOS OTA over MQTT - Entry point of the demo](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OtaMqttAgentEntryPoint)를 방문하세요.

##### 구성
<a name="e2e-port-config"></a>

와 상호 작용하려면 다음 구성이 필요합니다. AWS IoT Core
+ AWS IoT Core 클라이언트 자격 증명
  + Amazon Trust Services 엔드포인트를 사용하여 `Ota_Over_Mqtt_Demo/demo_config.h`에 **democonfigROOT\$1CA\$1PEM**을 설정합니다. 자세한 내용은 [AWS 서버 인증](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html)을 참조하세요.
  +  AWS IoT 클라이언트 자격 증명을 `Ota_Over_Mqtt_Demo/demo_config.h` 사용하여에서 **democonfigCLIENT\$1CERTIFICATE\$1PEM** 및 **democonfigCLIENT\$1PRIVATE\$1KEY\$1PEM**을 설정합니다. 클라이언트 인증서 및 프라이빗 키에 대해 알아보려면 [AWS 클라이언트 인증 세부 정보](https://docs.aws.amazon.com/iot/latest/developerguide/client-authentication.html)를 참조하세요.
+ 애플리케이션 버전
+ OTA 제어 프로토콜
+ OTA 데이터 프로토콜
+ 코드 서명 보안 인증 정보
+ 기타 OTA 라이브러리 구성

위의 정보는 FreeRTOS OTA 데모 애플리케이션의 `demo_config.h` 및 `ota_config.h`에서 찾을 수 있습니다. 자세한 내용을 알아보려면 [FreeRTOS OTA over MQTT - Setting up the device](https://www.freertos.org/ota/ota-mqtt-agent-demo.html#OTABasicDemoClient)를 방문하세요.

##### 빌드 확인
<a name="e2e-port-validation"></a>

데모 애플리케이션을 실행하여 OTA 작업을 실행합니다. 성공적으로 완료되면 OTA E2E 테스트를 계속 실행할 수 있습니다.

FreeRTOS [OTA 데모](https://www.freertos.org/ota/ota-mqtt-agent-demo.html)에서는 FreeRTOS Windows 시뮬레이터에서 OTA 클라이언트 및 AWS IoT Core OTA 작업을 설정하는 방법에 대한 자세한 정보를 제공합니다. AWS OTA는 MQTT 및 HTTP 프로토콜을 모두 지원합니다. 자세한 내용은 다음 예제를 참조하세요.
+ [OTA over MQTT Demo on Windows Simulator](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Mqtt_Demo)
+ [OTA over HTTP Demo on Windows Simulator](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS-Plus/Demo/AWS/Ota_Windows_Simulator/Ota_Over_Http_Demo)

#### IDT 도구를 사용한 테스트 실행
<a name="e2e-idt"></a>

OTA E2E 테스트를 실행하려면 AWS IoT Device Tester (IDT)를 사용하여 실행을 자동화해야 합니다. 자세한 내용은 *FreeRTOS 사용 설명서*의 [FreeRTOS용AWS IoT Device Tester](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)를 참조하세요.

##### E2E 테스트 사례
<a name="e2e-test-cases"></a>


| 테스트 사례 | 설명 | 
| --- | --- | 
| `OTAE2EGreaterVersion` | 정기 OTA 업데이트를 위한 해피 패스 테스트입니다. 새 버전으로 업데이트를 생성하여 디바이스가 성공적으로 업데이트합니다. | 
| `OTAE2EBackToBackDownloads` | 이 테스트는 3개의 연속 OTA 업데이트를 생성합니다. 디바이스가 3회 연속 업데이트될 것으로 예상됩니다. | 
| `OTAE2ERollbackIfUnableToConnectAfterUpdate` | 이 테스트에서는 새 펌웨어로 네트워크에 연결할 수 없는 경우 디바이스가 이전 펌웨어로 롤백되는지 확인합니다. | 
| `OTAE2ESameVersion` | 이 테스트를 통해 버전이 동일하게 유지되는 경우 디바이스가 들어오는 펌웨어를 거부하는지 확인할 수 있습니다. | 
| `OTAE2EUnsignedImage` | 이 테스트는 이미지가 서명되지 않은 경우 디바이스가 업데이트를 거부하는지 확인합니다. | 
| `OTAE2EUntrustedCertificate` | 이 테스트는 펌웨어가 신뢰할 수 없는 인증서로 서명된 경우 디바이스가 업데이트를 거부하는지 확인합니다. | 
| `OTAE2EPreviousVersion` | 이 테스트는 디바이스가 이전 업데이트 버전을 거부하는지 확인합니다. | 
| `OTAE2EIncorrectSigningAlgorithm` | 디바이스마다 다른 서명 및 해싱 알고리즘을 지원합니다. 이 테스트는 OTA 업데이트가 지원되지 않는 알고리즘으로 생성된 경우 디바이스가 업데이트에 실패하는지 확인합니다. | 
| `OTAE2EDisconnectResume` | 일시 중지 및 재개 기능에 대한 해피 패스 테스트입니다. 이 테스트는 OTA 업데이트를 생성하고 업데이트를 시작합니다. 그런 다음 동일한 클라이언트 ID(사물 이름)와 자격 증명을 AWS IoT Core 사용하여에 연결합니다. AWS IoT Core 그런 다음 디바이스의 연결을 해제합니다. 디바이스는 연결이 끊어졌음을 감지 AWS IoT Core하고 일정 기간이 지나면 일시 중지 상태로 전환한 후에 다시 연결하고 다운로드를 AWS IoT Core 재개합니다. | 
| `OTAE2EDisconnectCancelUpdate` | 이 테스트는 OTA 작업이 일시 중지 상태에서 취소될 경우 디바이스가 스스로 복구될 수 있는지 확인합니다. 디바이스 연결을 AWS IoT Core끊은 후 OTA 업데이트를 취소한다는 점을 제외하고 `OTAE2EDisconnectResume` 테스트와 동일한 작업을 수행합니다. 새 업데이트가 생성됩니다. 디바이스는에 다시 연결하고 AWS IoT Core, 현재 업데이트를 중단하고, 대기 상태로 돌아가고, 다음 업데이트를 수락하고 완료해야 합니다. | 
| `OTAE2EPresignedUrlExpired` | OTA 업데이트가 생성되면 S3 사전 서명된 URL의 수명을 구성할 수 있습니다. 이 테스트는 URL이 만료되어 다운로드를 완료할 수 없더라도 디바이스가 OTA를 수행할 수 있는지 확인합니다. 디바이스는 다운로드를 재개하기 위한 새 URL이 포함된 새 작업 문서를 요청해야 합니다. | 
| `OTAE2E2UpdatesCancel1st` | 이 테스트에서는 두 개의 OTA 업데이트가 연속으로 생성됩니다. 디바이스가 첫 번째 업데이트를 다운로드 중이라고 보고하면 테스트는 첫 번째 업데이트를 강제 취소합니다. 디바이스는 현재 업데이트를 중단하고 두 번째 업데이트를 다운로드하여 완료해야 합니다. | 
| `OTAE2ECancelThenUpdate` | 이 테스트에서는 두 개의 OTA 업데이트가 연속으로 생성됩니다. 디바이스가 첫 번째 업데이트를 다운로드 중이라고 보고하면 테스트는 첫 번째 업데이트를 강제 취소합니다. 디바이스는 현재 업데이트를 중단하고 두 번째 업데이트를 다운로드하여 완료해야 합니다. | 
| `OTAE2EImageCrashed` | 이 테스트에서는 이미지가 충돌할 때 디바이스가 업데이트를 거부할 수 있는지 확인합니다. | 

### PAL 테스트
<a name="porting-ota-pal"></a>

#### 사전 조건
<a name="pal-prereqs"></a>

네트워크 전송 인터페이스 테스트를 이식하려면 다음이 필요합니다.
+ 유효한 FreeRTOS 커널 포트로 FreeRTOS를 빌드할 수 있는 프로젝트.
+ 정상 작동하는 OTA PAL 구현.

#### 이식
<a name="pal-porting"></a>
+ [FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests)를 하위 모델로 프로젝트에 추가합니다. 프로젝트에서 하위 모듈의 위치는 빌드가 가능한 위치여야 합니다.
+ `config_template/test_execution_config_template.h` 및 `config_template/test_param_config_template.h`를 빌드 경로 내의 위치에 복사하고 이름을 `test_execution_config.h` 및 `test_param_config.h`로 바꿉니다.
+ 관련 파일을 빌드 시스템에 포함합니다. `CMake`를 사용하는 경우 관련 파일을 포함하는 데 `src/ota_pal_tests.cmake` 및 `qualification_test.cmake`를 사용할 수 있습니다.
+ 다음 함수를 구현하여 테스트를 구성합니다.
  + `SetupOtaPalTestParam()`: `src/ota/ota_pal_test.h`에 정의되어 있습니다. 구현은 `ota_pal_test.h`에 정의된 것과 동일한 이름 및 서명을 가져야 합니다. 현재는 이 함수를 구성할 필요가 없습니다.
+ 테스트 출력 로그가 디바이스 로그와 인터리브되지 않도록 **UNITY\$1OUTPUT\$1CHAR**을 구현합니다.
+ 애플리케이션에서 `RunQualificationTest()`를 직접 호출합니다. 직접 호출 전에 디바이스 하드웨어를 제대로 초기화하고 네트워크를 연결해야 합니다.

#### 테스트
<a name="ota-testing"></a>

이 섹션에서는 OTA PAL 검증 테스트의 로컬 테스트에 대해 설명합니다.

##### 테스트 활성화
<a name="ota-testing-enabling"></a>

`test_execution_config.h`를 열고 **OTA\$1PAL\$1TEST\$1ENABLED**를 1로 정의합니다.

`test_param_config.h`에서 다음 옵션을 업데이트합니다.
+ **OTA\$1PAL\$1TEST\$1CERT\$1TYPE**: 사용할 인증서 유형을 선택합니다.
+ **OTA\$1PAL\$1CERTIFICATE\$1FILE**: 해당하는 경우 디바이스 인증서의 경로입니다.
+ **OTA\$1PAL\$1FIRMWARE\$1FILE**: 해당하는 경우 펌웨어 파일의 이름입니다.
+ **OTA\$1PAL\$1USE\$1FILE\$1SYSTEM**: OTA PAL이 파일 시스템 추상화를 사용하는 경우 1로 설정합니다.

원하는 도구 체인을 사용하여 애플리케이션을 빌드하고 플래시합니다. `RunQualificationTest()`가 호출되면 OTA PAL 테스트가 실행됩니다. 테스트 결과가 직렬 포트로 출력됩니다.

### OTA 태스크 통합
<a name="integrating-ota"></a>
+ OTA 에이전트를 현재 MQTT 데모에 추가합니다.
+ 를 사용하여 OTA E2E(End to End) 테스트를 실행합니다 AWS IoT. 이렇게 하면 통합이 예상대로 작동하는지 확인할 수 있습니다.

**참고**  
FreeRTOS용 디바이스를 공식적으로 검증하려면 디바이스의 이식된 소스 코드를 OTA PAL 및 OTA E2E 테스트 그룹과 비교하여 검증해야 합니다 AWS IoT Device Tester. [FreeRTOS 사용 설명서의 FreeRTOS AWS IoT Device Tester 용 사용](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html)의 지침에 따라 포트 검증 AWS IoT Device Tester 을 설정합니다. *FreeRTOS * 특정 라이브러리의 포트를 테스트하려면 폴더의 `device.json` 파일 AWS IoT Device Tester `configs`에서 올바른 테스트 그룹을 활성화해야 합니다.

## IoT 디바이스 부트로더
<a name="afr-bootloader"></a>

자체 보안 부트 로더 애플리케이션을 제공해야 합니다. 설계 및 구현을 통해 보안 위협을 적절히 완화할 수 있는지 확인하십시오. 다음은 참조용 위협 모델링입니다.

### IoT 디바이스 부트로더에 대한 위협 모델링
<a name="afr-threat-model-for-bootloader"></a>

#### 배경
<a name="afr-threat-model-for-bootloader-background"></a>

이 위협 모델에서 참조하는 임베디드 AWS IoT 디바이스는 클라우드 서비스와 상호 작용하는 마이크로컨트롤러 기반 제품입니다. 소비자, 상업용 또는 산업용 환경에서 이러한 디바이스를 배포할 수 있습니다. IoT 디바이스는 사용자, 환자, 기계 또는 환경에 대한 데이터를 수집할 수 있으며 공장 기계의 조명 전구 및 도어 잠금 기능을 제어할 수 있습니다.

위협 모델링은 가상 악의적 사용자의 시점에서 보안에 대한 접근 방식입니다. 악의적 사용자의 목표와 방법을 고려하여 위협 목록이 생성됩니다. 위협은 악의적 사용자가 수행하는 리소스 또는 자산에 대한 공격입니다. 이 목록을 우선 순위 지정하고 사용하여 완화 솔루션을 식별하거나 생성합니다. 완화 솔루션을 선택할 때 해당 솔루션을 구현 및 유지 관리하는 비용은 해당 솔루션이 제공하는 보안 가치와 균형을 이루어야 합니다. 여러 가지 [위협 모델 방법론](https://en.wikipedia.org/wiki/Threat_model)이 있습니다. 각는 안전하고 성공적인 AWS IoT 제품 개발을 지원할 수 있습니다.

FreeRTOS는 AWS IoT 디바이스에 OTA(over-the-air) 소프트웨어 업데이트를 제공합니다. 시설 업데이트는 클라우드 서비스를 온디바이스 소프트웨어 라이브러리 및 파트너가 제공하는 부트로더와 결합합니다. 이 위협 모델은 특히 부트로더에 대한 위협에 중점을 둡니다.

**부트로더 사용 사례**
+ 배포하기 전에 펌웨어를 디지털 방식으로 서명하고 암호화합니다.
+ 새 펌웨어 이미지를 단일 디바이스, 디바이스 그룹 또는 전체 플릿에 배포합니다.
+ 디바이스에 배포된 이후에 새 펌웨어의 신뢰성과 무결성을 확인합니다.
+ 디바이스는 신뢰할 수 있는 소스의 수정되지 않은 소프트웨어만 실행합니다.
+ 디바이스는 OTA를 통해 수신된 오류 소프트웨어에 대해 복원력이 있습니다.

**데이터 흐름 다이어그램**

![\[물리적 액세스, 임베디드 디바이스, 인터넷 경계 및 기타 구성 요소가 포함된 임베디드 디바이스 보안에 대한 데이터 흐름도입니다.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/portingguide/images/bootloader-dataflow-diagram.png)


#### Threats
<a name="afr-threat-model-for-bootloader-threats"></a>

일부 공격에는 여러 가지 완화 모델이 있습니다. 예를 들어, 악성 펌웨어 이미지를 전달하는 네트워크 중간자 공격은 TLS 서버가 제공하는 인증서와 새 펌웨어 이미지의 코드 서명자 인증서 모두에 대한 신뢰를 검증하여 완화됩니다. 부트 로더 보안을 최대화하기 위해 부트 로더가 아닌 모든 완화 솔루션은 신뢰할 수 없는 것으로 간주됩니다. 부트 로더에는 각 공격에 대한 내장 완화 솔루션이 있어야 합니다. 계층적 완화 솔루션을 갖추는 것은 심층적 방어라고 알려져 있습니다.

**위협:**
+ 공격자는 서버에 대한 디바이스의 연결을 하이재킹하여 악성 펌웨어 이미지를 전달합니다.

**완화 예**
  + 부팅 시 부트로더가 알려진 인증서를 사용하여 이미지의 암호화 서명을 검증합니다. 검증이 실패하면 부트로더가 이전의 이미지로 롤백됩니다.
+ 공격자는 버퍼 오버플로를 이용하여 플래시에 저장된 기존 펌웨어 이미지에 악성 동작을 도입합니다.

**완화 예**
  + 앞의 설명과 같이, 부팅 시 부트로더가 검증합니다. 사용 가능한 이전 이미지가 없는 상태에서 검증이 실패하면 부트로더가 중지됩니다.
  + 앞의 설명과 같이, 부팅 시 부트로더가 검증합니다. 사용 가능한 이전 이미지가 없는 상태에서 검증이 실패하면 부트 로더가 페일세이프 OTA 전용 모드로 전환됩니다.
+ 공격자는 이전에 저장된 악용 가능한 이미지로 디바이스를 부팅합니다.

**완화 예**
  + 새 이미지를 성공적으로 설치하고 테스트하면 마지막 이미지를 저장하는 플래시 섹터가 지워집니다.
  + 성공적으로 업그레이드할 때마다 퓨즈가 버닝되고, 정확한 수의 퓨즈가 버닝되지 않으면 각 이미지가 실행을 거부합니다.
+ OTA 업데이트가 디바이스를 구성하는 잘못된 이미지 또는 악성 이미지를 전달합니다.

**완화 예**
  + 부트로더가 이전 이미지로 롤백을 트리거하는 하드웨어 watchdog 타이머를 시작합니다.
+ 공격자는 디바이스가 서명되지 않은 이미지를 수락하도록 부트로더를 패치하여 이미지 검증을 우회합니다.

**완화 예**
  + 부트로더가 ROM(읽기 전용 메모리)에 있으며 부트로더를 수정할 수 없습니다.
  + 부트로더가 OTP(일회성 프로그래밍 가능한 메모리)에 있으며 부트로더를 수정할 수 없습니다.
  + 부트로더가 ARM TrustZone의 보안 영역에 있으며 부트로더를 수정할 수 업습니다.
+ 공격자는 디바이스가 악성 이미지를 수락하도록 검증 인증서를 교체합니다.

**완화 예**
  + 인증서가 암호화 보조 프로세서에 있으며 인증서를 수정할 수 없습니다.
  + 인증서가 ROM(또는 OTP 또는 보안 영역)에 있으며 인증서를 수정할 수 없습니다.

#### 추가 위협 모델링
<a name="afr-threat-model-for-bootloader-further"></a>

이 위협 모델은 부트로더만 고려합니다. 추가 위협 모델링을 통해 전체 보안을 개선할 수 있습니다. 권장 방법은 악의적 사용자의 목표, 이러한 목표가 대상으로 하는 자산, 자산에 대한 진입점을 나열하는 것입니다. 자산을 제어하기 위해 진입점에 있는 공격자를 고려하여 위협 목록을 만들 수 있습니다. 다음은 IoT 디바이스에 대한 목표, 자산 및 진입점의 사례 목록입니다. 이러한 목록은 완전하지 않으며 더 많은 생각을 유도하기 위한 것입니다.

**악의적 사용자의 목표**
+ 현금 갈취 
+ 평판 손상 
+ 데이터 위조 
+ 리소스 전용 
+ 대상에 대한 원격 염탐 
+ 사이트에 대한 물리적 액세스 획득 
+ 막대한 피해 초래
+ 공포심 주입 

**핵심 자산**
+ 프라이빗 키 
+ 클라이언트 인증서 
+ CA 루트 인증서 
+ 보안 자격 증명 및 토큰 
+ 고객의 개인 식별 정보 
+ 기업 비밀 구현 
+ 센서 데이터 
+ 클라우드 분석 데이터 스토어 
+ 클라우드 인프라 

**진입점**
+ DHCP 응답 
+ DNS 응답 
+ MQTT over TLS 
+ HTTPS 응답 
+ OTA 소프트웨어 이미지 
+ 애플리케이션에 따라 결정되는 기타 항목(예: USB) 
+ 버스에 대한 물리적 액세스 
+ 캡슐화 해제된 IC 

# 셀룰러 인터페이스 라이브러리 이식
<a name="freertos-porting-cellular"></a>

FreeRTOS는 TCP 오프로드 셀룰러 추상화 계층의 AT 명령을 지원합니다. 자세한 내용은 freertos.org의 [Cellular Interface Library](https://freertos.org/cellular/index.html) 및 [Porting the Cellular Interface Library](https://freertos.org/cellular-porting-guide.html)를 참조하세요.

## 사전 조건
<a name="freertos-porting-cellular-prereqs"></a>

셀룰러 인터페이스 라이브러리에는 직접 종속성이 없습니다. 그러나 FreeRTOS 네트워크 스택에서는 이더넷, Wi-Fi 및 셀룰러가 공존할 수 없으므로 개발자는 둘 중 하나를 선택하여 [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md)와 통합해야 합니다.

**참고**  
셀룰러 모듈이 TLS 오프로드를 지원할 수 있거나 AT 명령을 지원하지 않는 경우 개발자는 자체 셀룰러 추상화를 구현하여 [네트워크 전송 인터페이스 이식](afr-porting-network-transport-interface.md)와 통합할 수 있습니다.