STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법
1. 개요
펌웨어 무결성 검증은 임베디드 시스템에서 보안성을 강화하는 중요한 과정입니다. 특히, 외부에서 펌웨어를 다운로드하거나 업데이트할 때, 무결성을 검증하는 작업은 시스템의 신뢰성을 유지하는 데 필수적입니다. 이번 포스팅에서는 STM32F429 마이크로컨트롤러와 SHA-256 해시 알고리즘을 이용해 펌웨어의 무결성을 검증하는 방법을 단계별로 설명합니다.
2. SHA-256 개요
SHA-256(Secure Hash Algorithm 256)은 256비트의 고정된 길이의 해시 값을 생성하는 암호화 해시 함수입니다. 이 알고리즘은 입력 데이터가 변경되면 완전히 다른 해시 값을 생성하는 특성을 가지므로, 데이터 무결성을 검증하는 데 적합합니다.
SHA-256을 이용한 무결성 검증 절차는 다음과 같이 요약됩니다.
- 펌웨어 이미지의 SHA-256 해시 값을 생성합니다.
- 펌웨어를 STM32F429에 플래시한 후, 펌웨어가 동작할 때 내장된 해시 모듈로 해시 값을 다시 계산합니다.
- 최초 생성된 해시 값과 MCU에서 계산된 해시 값을 비교하여 무결성을 검증합니다.
이 과정을 통해 펌웨어가 전송 중 손상되거나 변조되지 않았음을 확인할 수 있습니다.
3. 개발 환경 준비
이 포스팅에서는 다음과 같은 환경에서 작업을 진행합니다.
- 개발 환경: STM32CubeIDE 1.10.0 이상
- 보드: STM32F429I-DISC1
- 펌웨어 패키지: STM32CubeF4
- 암호화 라이브러리: mbedTLS (STM32CubeMX에서 제공)
이미 STM32CubeIDE 및 개발 환경 설정을 완료한 상태에서 진행한다고 가정합니다.
4. 프로젝트 생성 및 구성
4.1 STM32CubeMX에서 프로젝트 생성
- STM32CubeMX를 실행하고 새로운 프로젝트를 생성합니다.
- MCU 선택 창에서 STM32F429를 선택합니다.
- RCC, UART, GPIO 등의 기본 환경을 구성한 후, mbedTLS를 활성화합니다.
4.2 mbedTLS 활성화
- STM32CubeMX의 Middleware and Software Packages에서 mbedTLS를 선택합니다.
- Crypto 탭에서 SHA-256을 활성화합니다.
- Generate Code를 클릭하여 프로젝트를 생성합니다.
5. SHA-256 해시 계산 및 검증 코드 작성
5.1 펌웨어 해시 생성
펌웨어의 무결성을 검증하려면 먼저 펌웨어 바이너리에서 SHA-256 해시 값을 생성해야 합니다. 아래는 Linux 환경에서 sha256sum
명령어를 이용해 해시 값을 생성하는 방법입니다.
$ sha256sum firmware.bin
3a7bd3e2360f82aaf2e95f8b7f21e3e8d272a25e08e78b545f6f3a4a30f9e759 firmware.bin
이 값을 STM32 내에서 검증할 때 참조할 수 있도록 기록해둡니다.
5.2 STM32 펌웨어 코드 작성
아래는 STM32F429에서 SHA-256 해시를 계산하고, 미리 생성된 해시 값과 비교하는 예제 코드입니다.
sha256_verification.c
#include "mbedtls/sha256.h"
#include "string.h"
#include "stdio.h"
#define FIRMWARE_START_ADDR 0x08020000
#define FIRMWARE_SIZE 0x10000
// 참조 해시 값 (예제)
const uint8_t expected_hash[32] = {
0x3a, 0x7b, 0xd3, 0xe2, 0x36, 0x0f, 0x82, 0xaa,
0xf2, 0xe9, 0x5f, 0x8b, 0x7f, 0x21, 0xe3, 0xe8,
0xd2, 0x72, 0xa2, 0x5e, 0x08, 0xe7, 0x8b, 0x54,
0x5f, 0x6f, 0x3a, 0x4a, 0x30, 0xf9, 0xe7, 0x59
};
void Calculate_SHA256(void)
{
uint8_t hash_output[32];
uint8_t *firmware_ptr = (uint8_t *)FIRMWARE_START_ADDR;
mbedtls_sha256_context sha256_ctx;
mbedtls_sha256_init(&sha256_ctx);
mbedtls_sha256_starts(&sha256_ctx, 0);
mbedtls_sha256_update(&sha256_ctx, firmware_ptr, FIRMWARE_SIZE);
mbedtls_sha256_finish(&sha256_ctx, hash_output);
mbedtls_sha256_free(&sha256_ctx);
printf("Calculated SHA-256: \n");
for (int i = 0; i < 32; i++) {
printf("%02x", hash_output[i]);
}
printf("\n");
if (memcmp(hash_output, expected_hash, 32) == 0) {
printf("Firmware integrity check PASSED.\n");
} else {
printf("Firmware integrity check FAILED.\n");
}
}
5.3 main.c에 통합
main.c
에서 Calculate_SHA256()
함수를 호출하여 무결성을 검증하도록 구성합니다.
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
printf("STM32F429 Firmware Integrity Check\n");
Calculate_SHA256();
while (1)
{
HAL_Delay(1000);
}
}
6. 빌드 및 실행
- STM32CubeIDE에서 프로젝트를 빌드합니다.
- STM32F429 보드에 펌웨어를 다운로드합니다.
- 터미널을 통해 시리얼 출력 로그를 확인합니다.
실행 결과는 다음과 같이 출력됩니다.
STM32F429 Firmware Integrity Check
Calculated SHA-256: 3a7bd3e2360f82aaf2e95f8b7f21e3e8d272a25e08e78b545f6f3a4a30f9e759
Firmware integrity check PASSED.
7. 오류 처리 및 디버깅
- 해시 값 불일치: 펌웨어를 재빌드하거나 해시 값을 다시 생성해 확인합니다.
- 메모리 접근 오류: 펌웨어 시작 주소와 크기를 정확히 설정했는지 확인합니다.
- mbedTLS 설정 누락: STM32CubeMX에서 SHA-256을 활성화했는지 확인합니다.
8. 결론
이번 포스팅에서는 STM32F429 마이크로컨트롤러에서 SHA-256을 이용해 펌웨어 무결성을 검증하는 방법을 설명했습니다. 이를 통해 펌웨어 전송 및 업데이트 과정에서 발생할 수 있는 무결성 문제를 효과적으로 감지하고 시스템의 보안을 강화할 수 있습니다.
'STM32' 카테고리의 다른 글
ESP32 IDF에서 RSA 암호화 활용하기 (0) | 2025.02.27 |
---|---|
HMAC을 활용한 안전한 부팅 과정 구현 (0) | 2025.02.26 |
STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용 (0) | 2025.02.26 |
STM32F429 하드웨어 키 저장소 사용법 (0) | 2025.02.26 |
DMA를 이용한 STM32F429 암호화 비동기 처리 방법 (0) | 2025.02.26 |