null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
보안 부트와 HSM
#secure-boot
#hsm
#cryptography
#key-management
#tc37x
@devpc
|
2026-04-03 23:46:47
|
GET /api/v1/nodes/240?nv=1
History:
v1 (2026-04-03) (Latest)
0
Views
2
Calls
# 보안 부트와 HSM ## 보안 부트가 필요한 이유 ``` 보안 부트 없는 시스템: 공격자 → 악성 펌웨어를 플래시에 기록 → MCU가 그냥 실행 → 차량/장비 제어권 탈취 보안 부트 있는 시스템: 공격자 → 악성 펌웨어를 플래시에 기록 → 서명 검증 실패 → 실행 거부, 안전 상태 진입 ``` 보안 부트의 핵심: **실행 전 펌웨어의 신뢰성(출처)과 무결성(변조 여부)을 검증**한다. --- ## 신뢰의 체인 (Chain of Trust) ``` ROM (변경 불가) └── 공개 키 해시 내장 (루트 신뢰) │ ▼ 서명 검증 부트로더 (PFLASH) │ ▼ 서명 검증 애플리케이션 (PFLASH) │ ▼ 서명 검증 애플리케이션 데이터 / 설정 ``` 각 단계가 다음 단계를 검증하므로, 한 단계라도 변조되면 체인이 끊어진다. --- ## TC37x HSM (Hardware Security Module) TC37x HSM은 **별도의 보안 코어**와 **전용 메모리**를 가진 하드웨어 모듈이다. ``` TC37x ┌─────────────────────────────────────────────────┐ │ │ │ CPU0 / CPU1 / CPU2 (메인 코어) │ │ ├── 일반 펌웨어 실행 │ │ └── HSM에 암호화 서비스 요청 │ │ ↕ (메시지 인터페이스) │ │ HSM 코어 │ │ ├── 전용 RAM (CPU가 직접 접근 불가) │ │ ├── 키 저장소 (하드웨어 보호) │ │ ├── 암호화 가속기 (AES, SHA, TRNG) │ │ └── 보안 부트 검증 │ └─────────────────────────────────────────────────┘ ``` 메인 CPU는 HSM의 키와 내부 메모리에 **직접 접근할 수 없다**. HSM에 서비스를 요청하면 HSM이 처리하고 결과만 반환한다. --- ## 보안 부트 흐름 (TC37x HSE 기반) ``` 리셋 │ ▼ HSM 펌웨어 실행 (iROM 또는 PFLASH 고정 영역) │ ├── 1. 부트로더 이미지 해시 계산 (SHA-256) ├── 2. 저장된 서명을 HSM 내부 공개 키로 검증 (RSA/ECC) │ ├── 검증 성공 → 메인 CPU에 실행 허가 신호 │ └── 검증 실패 → ERROR 핀 구동, 리셋 또는 부트 중단 (이 경우 복구 모드로만 진입 가능) │ ▼ 부트로더 실행 (메인 CPU) │ └── 앱 서명 검증 → HSM에 요청 → 결과 수신 ``` --- ## 키 관리 기초 ### 키 계층 구조 ``` 루트 키 (Root Key / Master Key) └── 파생 키 (Derived Key) ├── 코드 서명 키 (Firmware Signing Key) ├── 통신 암호화 키 (Session Key) └── NVM 암호화 키 (Storage Key) ``` 루트 키는 절대 외부에 노출되지 않는다. HSM 내부에서만 존재하며, 파생 키 생성에만 사용된다. ### 키 프로비저닝 공장 생산 단계에서 각 MCU에 고유한 키를 주입하는 과정: ``` 제조 환경 (신뢰할 수 있는 HSM 서버) │ ├── 각 MCU의 고유 ID 읽기 ├── 마스터 키 + UID → 파생 키 생성 └── 파생 키를 TCU37x HSM에 안전하게 주입 │ ▼ HSM 키 저장소 (이후 CPU가 직접 읽기 불가) ``` --- ## 암호화 서비스 요청 예제 ```c /* HSM에 AES-128 암호화 요청 (의사 코드 — 실제 API는 HSM 펌웨어 의존) */ typedef struct { uint8_t key_id; /* HSM 내부 키 인덱스 */ uint8_t plaintext[16]; /* 입력 데이터 */ uint8_t ciphertext[16];/* 출력 데이터 */ uint32_t status; /* 처리 결과 */ } HsmRequest_t; __attribute__((section(".shared"))) volatile HsmRequest_t hsm_req; void request_aes_encrypt(uint8_t key_id, uint8_t *data) { hsm_req.key_id = key_id; memcpy((void*)hsm_req.plaintext, data, 16); hsm_req.status = HSM_STATUS_PENDING; /* HSM에 요청 트리거 (메시지 레지스터를 통해) */ HSM_MSG_REG.B.CMD = HSM_CMD_AES_ENCRYPT; HSM_MSG_REG.B.REQ = 1U; /* 완료 대기 */ while (hsm_req.status == HSM_STATUS_PENDING) {} if (hsm_req.status == HSM_STATUS_OK) { memcpy(data, (void*)hsm_req.ciphertext, 16); } } ``` > **다른 MCU와의 차이** > STM32H5/STM32U5는 TrustZone(ARM Cortex-M33)을 활용한 보안 영역 분리를 사용한다. > TC37x의 HSM은 아예 **별도 코어**로 분리되어 있어 물리적 격리 수준이 높다. > NXP S32K3은 SHE(Secure Hardware Extension) 또는 별도 HSE 코어 구성을 선택한다.
// COMMENTS
Newest First
ON THIS PAGE