Arduino_CAN
|
Mini-MAC 프로토콜 구현 (EEPROM 상태 관리, HMAC-MD5 기반 MAC 생성/검증) 더 자세히 ...
#include "minimac.h"
함수 | |
static void | debug_print_hex (const uint8_t *buf, uint16_t len) |
디버깅용: 바이트 배열을 16진수로 출력 | |
static void | print_u64 (uint64_t v) |
디버깅용: 64비트 부호 없는 정수를 10진수 문자열로 변환해 출력 | |
static void | compute_digest (const uint8_t *data, uint8_t len, unsigned char digest[16]) |
Mini-MAC용 HMAC-MD5 다이제스트 계산 | |
static bool | load_state (void) |
EEPROM에서 Mini-MAC 상태 불러오기 | |
static void | save_state (void) |
Mini-MAC 상태를 EEPROM에 저장 | |
void | minimac_init (uint16_t can_id, const uint8_t *key) |
Mini-MAC 초기화 및 EEPROM 동기화 | |
uint8_t | minimac_sign (uint8_t *data, uint8_t payload_len) |
송신할 메시지에 Mini-MAC 태그 생성 및 내부 상태 갱신 | |
bool | minimac_verify (const uint8_t *data, uint8_t payload_len, const uint8_t *tag) |
수신된 메시지의 Mini-MAC 태그 검증 및 상태 동기화 | |
변수 | |
static const int | SIG_ADDR = 0 |
EEPROM 레이아웃: 시그니처 및 데이터 저장 시작 주소 | |
static const uint32_t | SIGVAL = 0xAA55AA55 |
static const int | DATA_ADDR = SIG_ADDR + sizeof(SIGVAL) |
static uint16_t | mm_id |
보호할 CAN ID, 그룹 키, 카운터, 메시지 히스토리 | |
static uint8_t | mm_key [16] |
공유 그룹 키 | |
static uint64_t | mm_counter |
64비트 메시지 카운터 | |
static MiniMacHist | mm_hist [5] |
최근 λ개 메시지 히스토리 | |
static uint8_t | mm_hist_cnt |
히스토리 항목 수 (≤ λ) | |
Mini-MAC 프로토콜 구현 (EEPROM 상태 관리, HMAC-MD5 기반 MAC 생성/검증)
minimac.cpp 파일에서 정의되었습니다.
|
static |
Mini-MAC용 HMAC-MD5 다이제스트 계산
data | 서명할 페이로드 데이터 버퍼 |
len | 페이로드 길이(Byte) |
digest | 결과 다이제스트 저장 버퍼(16바이트) |
메시지 카운터(mm_counter), CAN ID(mm_id), 최근 메시지 히스토리(mm_hist), 그리고 현재 페이로드(data)를 하나의 연속 버퍼에 결합한 후, HMAC-MD5를 수행하여 16바이트 다이제스트를 생성한다. 각 단계별 내부 상태는 Serial 디버그 출력으로 확인 가능하다.
minimac.cpp 파일의 66 번째 라인에서 정의되었습니다.
|
static |
디버깅용: 바이트 배열을 16진수로 출력
buf | 출력할 바이트 배열 |
len | 배열 길이(Byte) |
minimac.cpp 파일의 25 번째 라인에서 정의되었습니다.
|
static |
EEPROM에서 Mini-MAC 상태 불러오기
EEPROM에 저장된 시그니처(SIGVAL)를 확인한 뒤, 유효하면 mm_counter, mm_hist_cnt 및 메시지 히스토리 배열을 복원한다.
minimac.cpp 파일의 160 번째 라인에서 정의되었습니다.
void minimac_init | ( | uint16_t | can_id, |
const uint8_t * | key ) |
Mini-MAC 초기화 및 EEPROM 동기화
Mini-MAC 프로토콜 초기화
can_id | 보호할 CAN 메시지 식별자 (16비트) |
key | Mini-MAC HMAC 키 (128비트, 16바이트) |
Serial 포트를 115200bps로 초기화하고, mm_id와 mm_key 전역 변수에 인자를 설정한다. EEPROM에서 이전에 저장된 mm_counter와 메시지 히스토리를 불러오되(load_state()), 저장된 시그니처가 없으면 fresh 상태로 간주하여 mm_counter와 mm_hist_cnt를 0으로 초기화한 뒤(save_state()), EEPROM에 초기 상태를 기록한다. 디버그용으로 Serial.print를 통해 초기화 과정을 출력한다.
minimac.cpp 파일의 246 번째 라인에서 정의되었습니다.
uint8_t minimac_sign | ( | uint8_t * | data, |
uint8_t | payload_len ) |
송신할 메시지에 Mini-MAC 태그 생성 및 내부 상태 갱신
송신 전 페이로드에 Mini-MAC 태그 생성 및 붙이기
data | 서명할 페이로드 버퍼, 호출 후 buf[payload_len..] 위치에 태그가 덧붙여짐 |
payload_len | 페이로드 길이(Byte) |
전달받은 페이로드(data, payload_len)를 바탕으로 HMAC-MD5 다이제스트를 계산하여 상위 4바이트(tag)를 data 뒤에 덧붙인다. 이후 메시지 히스토리(mm_hist)와 메시지 카운터(mm_counter)를 갱신하고 EEPROM에 저장(save_state)한다.
minimac.cpp 파일의 286 번째 라인에서 정의되었습니다.
bool minimac_verify | ( | const uint8_t * | data, |
uint8_t | payload_len, | ||
const uint8_t * | tag ) |
수신된 메시지의 Mini-MAC 태그 검증 및 상태 동기화
수신 후 Mini-MAC 태그 검증 및 내부 상태 갱신
data | 검증할 페이로드 버퍼 |
payload_len | 페이로드 길이(Byte) |
tag | 수신된 태그 버퍼 (MINIMAC_TAG_LEN 바이트) |
data와 tag를 기반으로 HMAC-MD5 다이제스트를 재계산하여 수신된 tag와 비교한다. 검증 성공 시 메시지 히스토리(mm_hist)와 카운터(mm_counter)를 갱신하고 EEPROM에 저장(save_state)한 뒤 true를 반환한다. 실패 시 false 반환하며 상태는 갱신되지 않음.
minimac.cpp 파일의 343 번째 라인에서 정의되었습니다.
|
static |
디버깅용: 64비트 부호 없는 정수를 10진수 문자열로 변환해 출력
v | 변환할 64비트 값 |
minimac.cpp 파일의 39 번째 라인에서 정의되었습니다.
|
static |
Mini-MAC 상태를 EEPROM에 저장
현재 mm_counter, mm_hist_cnt 및 메시지 히스토리 배열을 EEPROM에 시그니처와 함께 순차 기록하여 재부팅 시에도 상태 유지.
minimac.cpp 파일의 203 번째 라인에서 정의되었습니다.
minimac.cpp 파일의 11 번째 라인에서 정의되었습니다.
|
static |
64비트 메시지 카운터
minimac.cpp 파일의 16 번째 라인에서 정의되었습니다.
|
static |
최근 λ개 메시지 히스토리
minimac.cpp 파일의 17 번째 라인에서 정의되었습니다.
|
static |
히스토리 항목 수 (≤ λ)
minimac.cpp 파일의 18 번째 라인에서 정의되었습니다.
|
static |
|
static |
공유 그룹 키
minimac.cpp 파일의 15 번째 라인에서 정의되었습니다.
|
static |
EEPROM 레이아웃: 시그니처 및 데이터 저장 시작 주소
minimac.cpp 파일의 9 번째 라인에서 정의되었습니다.
|
static |
minimac.cpp 파일의 10 번째 라인에서 정의되었습니다.