|
SH2SC-EDT
Self-Healing Hardware and Software Complex for Encrypted Data Transmission
|
Самовідновлюваний апаратно-програмний комплекс для зашифрованої передачі даних
SH2SC-EDT — це відмовостійкий, криптографічно захищений комплекс передачі даних, побудований на двох мікроконтролерах Arduino Nano (ATmega328P). Він реалізує спеціалізований протокол транспортного/сесійного рівня — C2P-ARQ (ChaCha20-Poly1305 Automatic Repeat reQuest) — який забезпечує автентифіковане шифрування (ChaCha20-Poly1305 AEAD), гарантовану доставку пакетів через ARQ «Зупинись і чекай» і повний трифазний цикл сесії (SYN / DAT / FIN).
Визначальна властивість комплексу — самовідновлення: при розриві зв'язку вузол-передавач зберігає свою позицію в потоці даних і автономно відновлює сесію з точної точки збою без втручання оператора і без втрати даних. Вся логіка на обох вузлах реалізована у вигляді неблокуючих кінцевих автоматів, що працюють на 100% у реальному часі в SimulIDE. Динамічне виділення пам'яті архітектурно заборонено; вся прошивка функціонує в межах бюджету 2 КБ SRAM мікроконтролера ATmega328P.
memcmp.FLAG_SYN (доставка nonce), передача даних FLAG_DAT (ARQ «Зупинись і чекай»), завершення FLAG_FIN (автентифіковане закриття сесії).[10..11]. IV ніколи не передається по каналу.DataPacket вимагає явного ACK_BYTE (0x06). При NACK_BYTE (0x15) або тайм-ауті передавач повторно надсилає ідентичний шифротекст із тим самим seqNum. Ліміт спроб: MAX_RETRIES = 50, вікно тайм-ауту: ACK_TIMEOUT_MS = 50 мс.suspendSession() стирає сесійний nonce з RAM, зберігає melodyIndex і переходить у TxState::RECONNECTING. Новий HelloPacket транслюється кожні RECONNECT_INTERVAL_MS = 2000 мс до відновлення зв'язку. Передача відновлюється зі збереженого індексу без втрати жодного пакету.current_timeout_limit = durationMs + NETWORK_GRACE_PERIOD_MS (3000 мс). Поглинає найгіршу бурю повторних передач (50 × 50 мс = 2500 мс) без помилкового завершення сесії.enum class. Жодних блокуючих викликів delay() у головному циклі. Всі таймери використовують дельти millis().Перед кожним кадром іде двобайтова преамбула синхронізації (0xAA 0x55). Байт flags використовує бітову маску (&), що забезпечує стійкість до одиничних бітових помилок.
| Поле | Розмір | Значення | Опис |
|---|---|---|---|
| SYNC1 | 1 байт | 0xAA | Байт преамбули 1 |
| SYNC2 | 1 байт | 0x55 | Байт преамбули 2 |
flags | 1 байт | FLAG_SYN = 0x01 | Ідентифікатор відкриття сесії |
nonce[12] | 12 байт | ГПВП | 96-бітний сесійний nonce ChaCha20 IETF |
| Поле | Розмір | Значення | Опис |
|---|---|---|---|
| SYNC1 | 1 байт | 0xAA | Байт преамбули 1 |
| SYNC2 | 1 байт | 0x55 | Байт преамбули 2 |
flags | 1 байт | 0x02 / 0x04 | FLAG_DAT або FLAG_FIN — AAD, не шифрується |
seq_num | 2 байти | uint16_t LE | Порядковий номер пакету — AAD, не шифрується |
payload[4] | 4 байти | Шифротекст ChaCha20 | Зашифровані uint16_t note_index + uint16_t duration_ms |
mac[8] | 8 байт | Скорочений Poly1305 | Перші 8 байт повного 16-байтного тегу Poly1305 |
3-байтні AAD (flags + seq_lo + seq_hi) автентифікуються, але не шифруються. Будь-яка зміна цих полів призводить до відмови MAC-верифікації.
Для пакетів FLAG_FIN корисне навантаження — зашифровані нулі. Конвеєр RX зобов'язаний викликати decrypt() у discardBuf перед computeTag() для правильного просування акумулятора Poly1305; пропуск decrypt() дає хибний очікуваний тег і призводить до помилкового NACK.
| Константа | Значення | Опис |
|---|---|---|
ACK_TIMEOUT_MS | 50 мс | Максимальний час очікування ACK до повторної передачі |
MAX_RETRIES | 50 | Послідовних повторних передач до suspendSession() |
RECONNECT_INTERVAL_MS | 2000 мс | Інтервал трансляції HelloPacket у стані RECONNECTING |
NETWORK_GRACE_PERIOD_MS | 3000 мс | Додається до тривалості ноти для тайм-ауту сторожового таймера |
BAUD_RATE | 9600 | Швидкість UART (8N1) |
drainRxFifo() викликається на TX перед кожним sendHelloPacket(), sendPacket() та sendFinPacket(). Функція скидає всі байти в 64-байтному апаратному RX FIFO UART, запобігаючи потраплянню застарілих NACK від попереднього пакету до обробника наступного.
На RX функція resetParser() виконує симетричну операцію після кожного MAC-збою або тайм-ауту парсера: скидає FIFO та переводить байтовий кінцевий автомат у стан WAIT_AA.
Обидва вузли використовують бібліотеку ChaChaPoly (Rhys Weatherley, Arduino Crypto). Конвеєр на TX та RX ідентичний:
Передаються лише перші 8 байт з 16-байтного тегу Poly1305 (TRUNCATED_MAC_SIZE = 8).
IV для пакету виводиться без передачі по каналу:
Всі 65 536 значень seqNum дають унікальний IV у межах сесії. Новий s_sessionNonce генерується ГПВП при кожному натисканні кнопки або спробі RECONNECTING, що унеможливлює міжсесійні атаки повторного відтворення.
MASTER_PSK скомпільовано в обидва вузли і ніколи не передається. s_sessionNonce — єдиний секрет часу виконання — стирається при кожній межі сесії:
Виклик виконується безумовно у чотирьох місцях:
| Місце | Подія-тригер |
|---|---|
TX suspendSession() | Вичерпано MAX_RETRIES у будь-якому стані WAITING_* |
TX успіх WAITING_FIN_ACK | FLAG_FIN підтверджено RX |
RX processFinPacket() MAC OK | Автентифіковане закриття сесії |
| Тайм-аут сторожового таймера RX | TX зник без надсилання FLAG_FIN |
Ключовий матеріал ніколи не виводиться до Serial, LCD або будь-якого іншого каналу.
| Компонент | Специфікація |
|---|---|
| Мікроконтролери | 2× Arduino Nano (ATmega328P, 16 МГц, 2 КБ SRAM, 32 КБ Flash) |
| Дисплеї | 2× Aip31068 I2C LCD 16×2, адреса 0x3E, виводи A4/A5 |
| Зумер | 1× П'єзодинамік на ШІМ-виводі 9 (лише вузол B) |
| Джерело ентропії | Апаратний кільцевий осцилятор на INT0 (вивід 2, обидва вузли) |
| Генератор шуму | XOR-вентиль + Генератор імпульсів (1 кГц, 15%) + AND + Перемикач |
| Моніторинг | Багатоканальний осцилограф, Час/Поділ ≈200 мкс |
| Бібліотека | Призначення | Джерело |
|---|---|---|
Arduino Cryptography Library (Crypto) | ChaCha20-Poly1305 AEAD | Rhys Weatherley |
LiquidCrystal_AIP31068 | I2C LCD-драйвер для контролера Aip31068 | Andriy Golovnya |
avr-g++ зі стандартом C++11 (-std=gnu++11).| Константа | Значення | Визначено в | Опис |
|---|---|---|---|
FLAG_SYN | 0x01 | protocol.h | Прапор кадру відкриття сесії |
FLAG_DAT | 0x02 | protocol.h | Прапор кадру даних |
FLAG_FIN | 0x04 | protocol.h | Прапор кадру закриття сесії |
ACK_BYTE | 0x06 | protocol.h | Позитивне підтвердження |
NACK_BYTE | 0x15 | protocol.h | Негативне підтвердження |
SYNC_BYTE_1 | 0xAA | protocol.h | Байт преамбули 1 |
SYNC_BYTE_2 | 0x55 | protocol.h | Байт преамбули 2 |
HELLO_NONCE_SIZE | 12 | protocol.h | Довжина nonce ChaCha20 IETF (байти) |
TRUNCATED_MAC_SIZE | 8 | protocol.h | Довжина переданого тегу Poly1305 |
DATA_PAYLOAD_SIZE | 4 | protocol.h | Довжина зашифрованого корисного навантаження |
REST_INDEX | 255 | protocol.h | Сторожовий індекс для тиші/паузи |
NOTE_DICT_SIZE | 21 | receiver.h | Розмір таблиці частот |
MAX_RETRIES | 50 | protocol.h | Ліміт повторних передач ARQ |
ACK_TIMEOUT_MS | 50 | protocol.h | Вікно очікування ACK (мс) |
RECONNECT_INTERVAL_MS | 2000 | transmitter.h | Інтервал трансляції HelloPacket |
NETWORK_GRACE_PERIOD_MS | 3000 | receiver.h | Додатковий час сторожового таймера |
Розроблено як проєкт з дисципліни «Архітектура комп'ютерних систем». Система демонструє, що ресурсно-обмежений 8-бітний мікроконтролер AVR здатен реалізувати промислову криптографічну автентифікацію (AEAD), протокол зі збереженням стану сесії та відновлення після збоїв на рівні застосунку в межах бюджету SRAM 2 КБ. Генератор шуму SimulIDE (XOR-вентиль + генератор імпульсів 1 кГц) забезпечує відтворювані пошкодження каналу для валідації всіх п'яти сценаріїв відмовостійкості: одиничне пошкодження пакету, тривале глушіння (доказ самовідновлення), отруєння буфера FIFO, спрацювання динамічного сторожового таймера та пошкодження FLAG_FIN під шумом.