STM32

STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용

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

STM32F429 암호화 모듈 사용법 - OTP(One-Time Programmable) 메모리 활용

이번 포스팅에서는 STM32F429 마이크로컨트롤러의 보안 기능 중 하나인 OTP(One-Time Programmable) 메모리 활용 방법에 대해 설명드립니다. OTP 메모리는 단 한 번만 데이터를 기록할 수 있으며, 기록된 후에는 수정이 불가능하여 키 관리와 시스템 보안을 강화하는 데 효과적입니다. 특히, 펌웨어 무결성을 검증하거나 중요한 암호화 키를 안전하게 저장하는 용도로 사용됩니다.

1. OTP 메모리란 무엇인가?

OTP(One-Time Programmable) 메모리는 반도체 메모리의 일종으로, 데이터를 한 번 기록하면 변경할 수 없는 특성을 갖습니다. STM32F429에서는 메모리의 특정 영역이 OTP로 구성되어 있으며, 이 영역은 보안 키, 제품 시리얼 번호, 사용자 정의 데이터 등을 안전하게 보관하는 역할을 합니다.

OTP 메모리는 다음과 같은 특징을 갖습니다.

  • 한 번만 기록 가능: 데이터를 기록하면 수정이나 삭제가 불가능합니다.
  • 읽기 보호: 보안 설정을 통해 외부 접근을 제한할 수 있습니다.
  • 보안 강화: 중요한 정보를 펌웨어와 분리된 영역에 저장하여 시스템의 보안을 높입니다.

2. STM32F429에서 OTP 메모리 구성

STM32F429에서는 플래시 메모리의 시스템 메모리 영역에 OTP 블록이 할당되어 있습니다. 이 메모리는 일반적인 플래시 메모리와는 다르게 구성되어 있으며, 별도의 접근 방법을 통해 관리됩니다.

OTP 메모리의 구성은 다음과 같이 이루어집니다.

  • 사용자 데이터 영역: 사용자 정의 데이터를 저장하는 영역입니다.
  • 보안 키 영역: 암호화 키와 같은 민감한 정보를 저장하는 영역입니다.
  • 읽기 보호 플래그: 메모리 접근을 제한하는 보안 플래그입니다.

3. OTP 메모리 활용 시 고려사항

OTP 메모리를 사용할 때는 다음과 같은 사항을 염두에 두어야 합니다.

  • 단일 기록: 기록된 데이터는 변경할 수 없으므로, 기록 전에 충분한 검토가 필요합니다.
  • 보안 설정: 읽기 보호와 같은 보안 기능을 활성화하여 외부 접근을 차단해야 합니다.
  • 정확한 주소 관리: OTP 메모리는 특정 주소에 할당되므로, 잘못된 주소 접근을 피해야 합니다.

4. STM32CubeIDE를 이용한 OTP 메모리 설정 및 데이터 기록

STM32CubeIDE와 HAL 라이브러리를 사용하여 OTP 메모리를 설정하고 데이터를 기록하는 방법을 단계별로 설명드립니다.

4.1. 프로젝트 생성 및 환경 설정

  1. STM32CubeIDE를 실행하고 새로운 프로젝트를 생성합니다.
  2. 보드를 STM32F429로 선택하고 기본 클럭 및 환경을 설정합니다.
  3. 프로젝트 생성 후, stm32f4xx_hal_flash.hstm32f4xx_hal_flash_ex.h 헤더 파일을 포함합니다.

4.2. OTP 메모리 데이터 기록

아래는 HAL 라이브러리를 이용하여 OTP 메모리에 데이터를 기록하는 예제 코드입니다.

#include "stm32f4xx_hal.h"

#define OTP_ADDRESS 0x1FFF7800 // 예제 주소, 데이터시트 참고

void Write_OTP(uint32_t address, uint32_t data) {
    HAL_FLASH_Unlock();

    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data) == HAL_OK) {
        printf("OTP 메모리에 데이터 기록 완료: 0x%08X\n", data);
    } else {
        printf("OTP 메모리 기록 실패\n");
    }

    HAL_FLASH_Lock();
}

int main(void) {
    HAL_Init();
    SystemClock_Config();

    uint32_t data = 0x12345678;
    Write_OTP(OTP_ADDRESS, data);

    while (1) {}
}

4.3. OTP 메모리 데이터 읽기

기록된 데이터를 읽는 방법은 다음과 같습니다.

uint32_t Read_OTP(uint32_t address) {
    return *(volatile uint32_t *)address;
}

int main(void) {
    HAL_Init();
    SystemClock_Config();

    uint32_t read_data = Read_OTP(OTP_ADDRESS);
    printf("OTP 메모리에서 읽은 데이터: 0x%08X\n", read_data);

    while (1) {}
}

5. 보안 강화 방법

OTP 메모리를 사용할 때는 다음과 같은 보안 강화를 위한 방법을 적용하는 것이 중요합니다.

  1. 읽기 보호 활성화: 데이터 기록 후, 읽기 보호 플래그를 설정하여 외부 접근을 차단합니다.
  2. 시리얼 번호 및 제품 ID 저장: 제품의 고유 식별 정보를 OTP에 저장하여 무단 복제를 방지합니다.
  3. 암호화 키 관리: 펌웨어와 분리된 영역에 키를 저장하여 시스템의 무결성을 유지합니다.

예를 들어, 읽기 보호를 활성화하는 코드는 다음과 같습니다.

void Enable_Read_Protection(void) {
    FLASH_OBProgramInitTypeDef obInit;
    HAL_FLASHEx_OBGetConfig(&obInit);

    obInit.OptionType = OPTIONBYTE_RDP;
    obInit.RDPLevel = OB_RDP_LEVEL_1;

    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&obInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
}

6. 결론

STM32F429의 OTP 메모리는 시스템의 보안을 강화하고, 중요한 데이터를 안전하게 관리하는 데 필수적인 기능입니다. 특히, 암호화 키와 시리얼 번호와 같은 민감한 정보를 저장하고, 무단 접근을 차단하는 역할을 수행합니다.

다만, 한 번 기록된 데이터는 수정이 불가능하므로, 사전 검토와 정확한 계획이 필요합니다. 이번 포스팅에서 소개한 방법을 통해 OTP 메모리를 효과적으로 활용하시고, 보다 안전한 시스템을 구현하시기를 바랍니다.

반응형