Arduino_CAN
|
Mini-MAC 프로토콜 구현용 헤더 파일 더 자세히 ...
#include <Arduino.h>
#include <EEPROM.h>
#include <MD5.h>
데이터 구조 | |
struct | MiniMacHist |
과거 페이로드를 저장하기 위한 구조체 더 자세히 ... | |
매크로 | |
#define | MINIMAC_KEY_LEN 16 |
Mini-MAC HMAC 키 길이 (16바이트, 128비트) | |
#define | MINIMAC_TAG_LEN 4 |
Mini-MAC 다이제스트에서 사용할 태그 길이 (4바이트, 32비트) | |
#define | MINIMAC_HIST_LEN 5 |
메시지 히스토리 최대 개수 (λ = 5) | |
#define | MINIMAC_MAX_DATA 8 |
CAN 데이터 필드 최대 길이 (8바이트) | |
함수 | |
void | minimac_init (uint16_t can_id, const uint8_t *key) |
Mini-MAC 프로토콜 초기화 | |
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 태그 검증 및 내부 상태 갱신 | |
Mini-MAC 프로토콜 구현용 헤더 파일
Mini-MAC은 CAN 버스 환경에서 경량화된 메시지 인증과 재생 공격 방어를 제공하는 HMAC 기반 프로토콜입니다. 본 헤더에는 키/태그 길이, 메시지 히스토리 정의와 초기화·서명·검증 함수의 인터페이스가 포함되어 있습니다.
minimac.h 파일에서 정의되었습니다.
#define MINIMAC_KEY_LEN 16 |
void minimac_init | ( | uint16_t | can_id, |
const uint8_t * | key ) |
Mini-MAC 프로토콜 초기화
can_id | 보호할 CAN 메시지 식별자 (16비트) |
key | 그룹 키 (128비트, 16바이트) |
EEPROM에서 이전 상태를 불러오고, 유효하지 않으면 내부 카운터와 히스토리를 초기화하여 fresh 상태로 설정합니다.
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 파일의 241 번째 라인에서 정의되었습니다.
uint8_t minimac_sign | ( | uint8_t * | data, |
uint8_t | payload_len ) |
송신 전 페이로드에 Mini-MAC 태그 생성 및 붙이기
data | 서명할 페이로드 버퍼 |
payload_len | 페이로드 길이(바이트) |
data[0..payload_len-1] 구간을 포함해 HMAC-MD5를 수행하고, 상위 4바이트를 태그로 data[payload_len..]에 덧붙입니다. 내부 카운터와 히스토리를 갱신한 후 EEPROM에 저장합니다.
송신 전 페이로드에 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 파일의 282 번째 라인에서 정의되었습니다.
bool minimac_verify | ( | const uint8_t * | data, |
uint8_t | payload_len, | ||
const uint8_t * | tag ) |
수신 후 Mini-MAC 태그 검증 및 내부 상태 갱신
data | 검증할 페이로드 버퍼 |
payload_len | 페이로드 길이(바이트) |
tag | 수신된 태그 버퍼 (MINIMAC_TAG_LEN 바이트) |
data와 tag를 이용해 HMAC-MD5 다이제스트를 재계산하고, 다이제스트 상위 4바이트와 비교합니다. 성공 시 내부 카운터와 히스토리를 업데이트합니다.
수신 후 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 파일의 338 번째 라인에서 정의되었습니다.