Arduino_CAN
로딩중...
검색중...
일치하는것 없음
receive_check.ino
이 파일의 문서화 페이지로 가기
1
9
10#include "minimac.h"
11#include <EEPROM.h>
12#include <SPI.h>
13#include <mcp_can.h>
14
20#define PROTECTED_ID 0x123
21
27const uint8_t SECRET_KEY[MINIMAC_KEY_LEN] = {0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F,
28 0x70, 0x81, 0x92, 0xA3, 0xB4, 0xC5,
29 0xD6, 0xE7, 0xF8, 0x09};
30
37MCP_CAN CAN(10);
38
49void setup() {
50 Serial.begin(115200);
51 while (!Serial)
52 ;
53
54 // EEPROM 전체 초기화
55 for (int i = 0; i < EEPROM.length(); i++) {
56 EEPROM.write(i, 0xFF);
57 }
58
59 // CAN 초기화 (all IDs, 500kbps, 16MHz)
60 if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) != CAN_OK) {
61 Serial.println("[ERROR] CAN Init Failed!");
62 for (;;)
63 ;
64 }
65 CAN.setMode(MCP_NORMAL);
66
67 // Mini-MAC 초기화 (fresh 상태로 시작)
69
70 Serial.println("[INFO] Receiver Initialized");
71}
72
87void loop() {
88 // 메시지 도착 체크
89 if (CAN.checkReceive() != CAN_MSGAVAIL) {
90 delay(10);
91 return;
92 }
93
94 // 메시지 읽기
95 unsigned long rxId;
96 uint8_t len;
97 uint8_t buf[MINIMAC_MAX_DATA + MINIMAC_TAG_LEN];
98 CAN.readMsgBuf(&rxId, &len, buf);
99
100 Serial.print("[DBG] CAN received ID=0x");
101 Serial.print(rxId, HEX);
102 Serial.print(" len=");
103 Serial.println(len);
104
105 // ID 검증
106 if (rxId != PROTECTED_ID) {
107 Serial.println("[DBG] Ignored (unprotected ID)");
108 return;
109 }
110 if (len < MINIMAC_TAG_LEN) {
111 Serial.println("[ERROR] Frame too short");
112 return;
113 }
114
115 // 페이로드/태그 분리
116 uint8_t payloadLen = len - MINIMAC_TAG_LEN;
117 uint8_t payload[MINIMAC_MAX_DATA];
118 uint8_t tag[MINIMAC_TAG_LEN];
119 memcpy(payload, buf, payloadLen);
120 memcpy(tag, buf + payloadLen, MINIMAC_TAG_LEN);
121
122 // 디버그: payload
123 Serial.print("[DBG] payload = ");
124 for (uint8_t i = 0; i < payloadLen; i++) {
125 if (payload[i] < 0x10)
126 Serial.print('0');
127 Serial.print(payload[i], HEX);
128 Serial.print(' ');
129 }
130 Serial.println();
131
132 // 디버그: recv tag
133 Serial.print("[DBG] recv tag = ");
134 for (uint8_t i = 0; i < MINIMAC_TAG_LEN; i++) {
135 if (tag[i] < 0x10)
136 Serial.print('0');
137 Serial.print(tag[i], HEX);
138 Serial.print(' ');
139 }
140 Serial.println();
141
142 // 검증
143 Serial.println("[DBG] minimac_verify()");
144 if (minimac_verify(payload, payloadLen, tag)) {
145 Serial.println("[INFO] Auth OK");
146 } else {
147 Serial.println("[ERROR] Auth FAIL");
148 }
149}
bool minimac_verify(const uint8_t *data, uint8_t payload_len, const uint8_t *tag)
수신된 메시지의 Mini-MAC 태그 검증 및 상태 동기화
Definition minimac.cpp:338
void minimac_init(uint16_t can_id, const uint8_t *key)
Mini-MAC 초기화 및 EEPROM 동기화
Definition minimac.cpp:241
Mini-MAC 프로토콜 구현용 헤더 파일
#define MINIMAC_TAG_LEN
Mini-MAC 다이제스트에서 사용할 태그 길이 (4바이트, 32비트)
Definition minimac.h:25
#define MINIMAC_MAX_DATA
CAN 데이터 필드 최대 길이 (8바이트)
Definition minimac.h:35
#define MINIMAC_KEY_LEN
Mini-MAC HMAC 키 길이 (16바이트, 128비트)
Definition minimac.h:20
void setup()
수신기 시스템 초기화 함수로, 필요한 설정을 수행합니다.
MCP_CAN CAN(10)
CAN 버스 제어 객체.
#define PROTECTED_ID
Mini-MAC 인증이 적용되는 보호 대상 CAN 메시지 식별자.
const uint8_t SECRET_KEY[16]
Mini-MAC 프로토콜에 사용되는 16바이트 비밀 키.
void loop()
수신 루프 함수로, 도착한 CAN 메시지를 확인하고 Mini-MAC 태그를 검증합니다.