STM32

STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법

임베디드 친구 2025. 2. 26. 15:48
728x90
반응형

STM32F429 펌웨어 무결성 검증 - SHA-256을 이용한 검증 방법

1. 개요

펌웨어 무결성 검증은 임베디드 시스템에서 보안성을 강화하는 중요한 과정입니다. 특히, 외부에서 펌웨어를 다운로드하거나 업데이트할 때, 무결성을 검증하는 작업은 시스템의 신뢰성을 유지하는 데 필수적입니다. 이번 포스팅에서는 STM32F429 마이크로컨트롤러와 SHA-256 해시 알고리즘을 이용해 펌웨어의 무결성을 검증하는 방법을 단계별로 설명합니다.

2. SHA-256 개요

SHA-256(Secure Hash Algorithm 256)은 256비트의 고정된 길이의 해시 값을 생성하는 암호화 해시 함수입니다. 이 알고리즘은 입력 데이터가 변경되면 완전히 다른 해시 값을 생성하는 특성을 가지므로, 데이터 무결성을 검증하는 데 적합합니다.

SHA-256을 이용한 무결성 검증 절차는 다음과 같이 요약됩니다.

  1. 펌웨어 이미지의 SHA-256 해시 값을 생성합니다.
  2. 펌웨어를 STM32F429에 플래시한 후, 펌웨어가 동작할 때 내장된 해시 모듈로 해시 값을 다시 계산합니다.
  3. 최초 생성된 해시 값과 MCU에서 계산된 해시 값을 비교하여 무결성을 검증합니다.

이 과정을 통해 펌웨어가 전송 중 손상되거나 변조되지 않았음을 확인할 수 있습니다.

3. 개발 환경 준비

이 포스팅에서는 다음과 같은 환경에서 작업을 진행합니다.

  • 개발 환경: STM32CubeIDE 1.10.0 이상
  • 보드: STM32F429I-DISC1
  • 펌웨어 패키지: STM32CubeF4
  • 암호화 라이브러리: mbedTLS (STM32CubeMX에서 제공)

이미 STM32CubeIDE개발 환경 설정을 완료한 상태에서 진행한다고 가정합니다.

4. 프로젝트 생성 및 구성

4.1 STM32CubeMX에서 프로젝트 생성

  1. STM32CubeMX를 실행하고 새로운 프로젝트를 생성합니다.
  2. MCU 선택 창에서 STM32F429를 선택합니다.
  3. RCC, UART, GPIO 등의 기본 환경을 구성한 후, mbedTLS를 활성화합니다.

4.2 mbedTLS 활성화

  1. STM32CubeMX의 Middleware and Software Packages에서 mbedTLS를 선택합니다.
  2. Crypto 탭에서 SHA-256을 활성화합니다.
  3. 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. 빌드 및 실행

  1. STM32CubeIDE에서 프로젝트를 빌드합니다.
  2. STM32F429 보드에 펌웨어를 다운로드합니다.
  3. 터미널을 통해 시리얼 출력 로그를 확인합니다.

실행 결과는 다음과 같이 출력됩니다.

STM32F429 Firmware Integrity Check
Calculated SHA-256: 3a7bd3e2360f82aaf2e95f8b7f21e3e8d272a25e08e78b545f6f3a4a30f9e759
Firmware integrity check PASSED.

7. 오류 처리 및 디버깅

  • 해시 값 불일치: 펌웨어를 재빌드하거나 해시 값을 다시 생성해 확인합니다.
  • 메모리 접근 오류: 펌웨어 시작 주소와 크기를 정확히 설정했는지 확인합니다.
  • mbedTLS 설정 누락: STM32CubeMX에서 SHA-256을 활성화했는지 확인합니다.

8. 결론

이번 포스팅에서는 STM32F429 마이크로컨트롤러에서 SHA-256을 이용해 펌웨어 무결성을 검증하는 방법을 설명했습니다. 이를 통해 펌웨어 전송 및 업데이트 과정에서 발생할 수 있는 무결성 문제를 효과적으로 감지하고 시스템의 보안을 강화할 수 있습니다.

반응형