HBus

akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Ср июл 10, 2019 5:33 am

Насколько я понимаю, MySensors использует AES. Судя по вот этому треду, AES отжирает от Atmega328 до 11% памяти программ и 15% памяти данных. Используемая мною комбинация XTEA+LFSR намного проще и требует на порядок меньше ресурсов. Она не такая криптоустойчивая как AES, но впоне достаточная, чтобы не быть взломанной хакерами. Если же требуется AES, при помощи которой разрешается шифровать государственные секреты США, то на мой взгляд разумнее не прожигать процессорное время программной реализацией, а поставить внешний чип для шифрования, благо он стОит копейки.
Aven
Сообщения: 528
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 151 раз

Re: HBus

Сообщение Aven » Ср июл 10, 2019 10:07 am

Atmega328 слишком древний чип. Может пора отказаться от его использования в новых проектах?
В новых чипах есть аппаратное шифрование.
Подписи кстати можно делать на atsha204A
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Ср июл 10, 2019 12:05 pm

Aven писал(а):
Ср июл 10, 2019 10:07 am
Atmega328 слишком древний чип. Может пора отказаться от его использования в новых проектах?
Ардуинки на нем самые дешевые. Все что надо, он делать умеет. Не вижу смысла от него отказываться.
Aven писал(а):
Ср июл 10, 2019 10:07 am
В новых чипах есть аппаратное шифрование.
В каких Ардуино есть аппаратное шифрование? Я не в курсе.
Aven писал(а):
Ср июл 10, 2019 10:07 am
Подписи кстати можно делать на atsha204A
Зачем в HBus подписи? Вы предлагаете каждое сообщение еще и подписывать, что ли? По-моему это перебор. Весь пар в гудок уйдет.
Aven
Сообщения: 528
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 151 раз

Re: HBus

Сообщение Aven » Ср июл 10, 2019 6:07 pm

я имел ввиду nRF51.
Подпись нужна, что бы никто левый не мог послать команды устройствам.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Чт июл 11, 2019 3:13 am

Aven писал(а):
Ср июл 10, 2019 6:07 pm
я имел ввиду nRF51.
Тоже вариант. Особенно когда кто-нибудь возьмется за труд интегрировать дешевые китайские модули типа HM-11/JDY-10 в Arduino IDE. Пока что в списке модулей Ардуино я вижу только снятые с производства Arduino Primo. Но никакой спешки с переходом на такой проц я не вижу.
Aven писал(а):
Ср июл 10, 2019 6:07 pm
Подпись нужна, что бы никто левый не мог послать команды устройствам.
То есть, вы предлагаете, чтобы каждый обмен сообщением начинался вот с такой с процедуры аутентификации? :D
Изображение

Не смешите, это годится только для очень маленького трафика, допускающего большие задержки. Например, для датчика температуры, посылающего одно измерение раз в час. Или для того, чтобы начать сеанс обмена.

Чтобы "никто левый" не мог посылать команды, необходимо и достаточно шифровать трафик, что я и делаю. Подпись при этом без надобности. После этого максимум, что может "левый" - это повторить ранее услышанную команду. С чем я тоже собираюсь бороться, для этого в заголовке есть номер сообщения.

Я предполагаю, что вы основываетесь на статье, откуда приведена картинка. Обратите внимание, как плавно автор "объехал" вопрос применения счетчика для предотвращение повторов. Вскользь сказал "это предсказуемо" - и сразу же перешел к подписям. Ну да, предсказуемо, а что в этом плохого? Значение счетчика ведь тоже зашифровано. Достаточно сделать этот счетчик не совсем регулярным, чтобы "левый" не смог догадаться, какое из ранее записанных сообщений валидно в данный момент времени.

Например, значение счетчика в очередном валидном сообщении может увеличиваться на 1 или на 13, случайным образом. После этого "левый" будет до конца своей жизни гадать, какое сообщение можно сейчас повторить. Не говоря уж о том, что ему неизвестно, что это сообщение значит.

Или еще проще: пусть счетчик (в моем случае 8-битный) считает не от 0 до 255, а от 0 до, скажем, 233. "Левому" будет трудно угадать, когда можно повторить сообщение.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вс июл 21, 2019 5:33 am

Выложил NodeTest rev 1.10, куда добавлено опциональное шифрование трафика и настройка ключей шифрования.

8-байтный заголовок сообщения шифруется блочным шифром XTEA, тело сообщения потоковым шифром LFSR.

Ключи шифрования состоят из нескольких частей:
- Начальный (постоянный) ключ XTEA, число раундов шифрования и полиномы LFSR зашиты в исходный текст узла, т.е. должны быть известны в момент компиляции скетча. Они хранятся в файле "cipher.h".
- Помимо это, дополнительные ключи XTEA хранятся в EEPROM узла и задаются при конфигурировании узла при помощи NodeTest

В момент включения питания узел считывает ключи из EEPROM и шифрует их своими постоянными ключами. Получившиеся в результате новые ключи используются для шифрования трафика. Таким образом, даже знание начальных (постоянных) ключей не дает возможности расшифровать трафик. Надо знать все ключи, и постоянные, и записанные в EEPROM.

NodeTest rev 1.10 позволяет задать начальные (постоянные) ключи и сгенерировать файл "cipher.h". Кроме того, он позволяет отредактировать EEPROM ключи, сохранять их в ini файлах и грузить из файлов. По идее это должно дать возможность легко изменять ключи шифрования для каждого проекта. Позже собираюсь добавить автоматическую генерацию ключей по "ключевой фразе", т.е. по паролю, чтобы не париться с шестнадцатиричными числами.

Протокол HBus немного модифицирован. Вместо раздельных команд RD_DESCR и WR_DESCR используется одна команда DESCR, которая позволяет читать и записывать описание узла. Освободившийся код использован для новой команды SECURITY, при помощи которой задаются настройки безопасности узла и записывается дополнительный ключ шифрования в EEPROM.

Для только что созданного узла настройки безопасности таковы, что узел воспринимает любые незашифрованные команды. После того, как узлу задан постоянный NodeID, в него можно записать дополнительный ключ шифрования и задать, на какие незашифрованные команды узел будет продолжать реагировать и далее. На корректно зашифрованные комадны узел реагирует всегда.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вт авг 06, 2019 3:11 pm

Наконец-то довел до работающего состояния шифрование. Выложил NodeTest rev 1.11, скетч шлюза WiFiGw.ino rev 1.8. и базовый Ардуино код rev 0.9.

От атаки путем тупого повторения зашифрованного сообщения пока что защиты нет. Более всего раздумываю над двумя из многих возможных вариантов:
- вставить в тело сообщения 4-байтную метку времени (с тиком 1 сек), тогда "просроченное" сообщение просто игнорируется, сколько его ни повторяй
- по приходу первых 8 байт, расшифровывать заголовок, и, буде он отправлен от некого узла, претендующего на то, что у него мой NodeId - портить сообщение, чтобы crc не совпало.

Чтобы проще реализовать более предпочтительный вариант с меткой времени, надо будет включить 4-байтный счетчик абсолютного времени в a_coos. Сейчас там считается только время в секундах с полуночи и время с момента включения. Впрочем, время с момента включения (uptime) очень редко когда нужно, а сам этот счетчик отлично подходит для счета абсолютного времени (т.е. секунд с момента 00:00:00 1/01/2001 UTC)

Включать метку времени в каждое HB сообщение как-то не хочется. Лучше, пожалуй, ввести новую HB команду "начать HB сессию", в которой указать текущее абсолютное время и тайм-аут в секундах. После этого все узлы должны воспринимать HB команды от узла, выдавшего эту команду, пока не истечет тайм-аут. В таком варианте повтор ранее записанных команд не даст никаких результатов.

А вот включать метку времени (timestamp) в каждое MQTT сообщение не напрягает.

PS: Попробовал по разному, не нравится, некрасиво как-то. Метка времени в JSON безобразно раздулась до 14 байт. Пожалуй, придется все-таки расширить заголовок с 8 до 12 байт, добавить ему 4-байтную метку времени (в секундах). Это будет простое и универсальное решение. Но протокол придется опять править.
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вс сен 01, 2019 2:56 pm

Добавил 4-байтную метку времени к заголовку каждого сообщения. Длина заголовка, соответственно, увеличилась с 8 до 12 байт. Новой версии протокола присвоен номер ревизии 1.0. Таким образом, теперь HBus защищен он повторных трансляций зашифрованных сообщений: если проверка на timestamp включена, то сообщения с меткой времени отличающейся более чем на 1 минуту, будут игнорированы.

С этой версией работает программа NodeTest rev 1.12, скетч WiFi шлюза rev 1.10 и базовый код для Ардуино rev 1.0.

При компиляции для Arduino Pro Mini (Atmega 328P) код HBus занимает 64% от 32К флэша и 73% от 2К ОЗУ. Это много, это уже на пределе возможностей микрика. Для простых устройств сойдет, но любая мало-мальски сложная программа займет еще немного ОЗУ и перевалит за 75%, что отрицательно скажется на стабильности. Вот это уже вполнее серьезное основание для перехода на более мощный проц. После гугления картинка обрисовалась такая:

1. ATmega с бОльшей памятью.
1.1. В линейке Ардуино эту нишу заполняет Arduino Mega 2560. Цена у него конская, как, впрочем, у всех "родных" Ардуино. Хуже то, что у китайцев нет дешевого клона. Да и чипа такого дешевого нет, сам проц стОит десяток с лишним баксов, что просто никуда не годится.
1.2. Дешевые (порядка доллара) ATmega-совместимые чипы - это ATmega644 (44 пина) и ATmega64 (64 пина). Память по сравнению с ATmega328 удвоена, что вполне достаточно на какое-то время. На Гитхабе есть замечательный проект MughtyCore, при помощи которого можно сделать Ардуину из ATmega644. Главное достоинство такого подхода - универсальное питание, чипы работают и от 3.3В, и от 5В. Но получится ли на 44-ногом чипе развести платку, совместимую по габаритам с Arduino Mini Pro - это пока неясно.

2. Переход на SAMD21
На этом чипе сделан Arduino Zero и новая линейка Arduino MKR. Чип весьма достойный и будущее у него есть. Нужные габариты получить несложно, тому порукой манюня Tau. Но работает он только от 3.3В, а от 5В не может. Это неприятно. Ну и цена у него раза в 2-3 больше, чем у варианта (1)

3. Переход на Инфенионовский XМС1100. Это АРМ-ы для промышленных применений, повышенная надежность, диапазон питаний до 5В. Все бы хорошо, но одна беда: на борту нет EEPROM. Есть флэш, с помощью которой можно было бы эмулировать EEPROM, но доведение такого подхода "до ума" потребует времени. Цена такая же как у варианта (2). По мне, так это самый заманчивый вариант.

4. Переход на STM32F103, а-ля "голубая пилюля". В сущности то же самое что вариант (2), но намного дешевле и с возможными граблями с библиотеками.

Насколько я понимаю, варианты (1) и (4) дешевы потому, что китайцы клепают клонов. То есть, там еще и на грабли в железе можно нарваться. Хотя пока что дешевые китайские Arduino Pro Mini показали себя хорошо.

PS: Как вариант, вместо того, чтобы переходить на другой чип, можно "по сусекам поскрести" и урезать буфера. Приемный буфер должен остаться как есть, а вот размер буфера Json и размер буферов для передаваемых сообщений можно урезать вдвое. После этого расход памяти данных снижается до 63%, что более-менее приемлемо. Выложил rev 1.1
akouz
Сообщения: 247
Зарегистрирован: Ср июл 09, 2014 3:48 pm
Благодарил (а): 6 раз
Поблагодарили: 40 раз

Re: HBus

Сообщение akouz » Вт сен 17, 2019 1:58 pm

Попробовал поставить новый HBus софт на Power Meter, результат совсем невеселый: после компиляции ОЗУ забито на 78%.

Решил для подобных задач сделать собственные модули в формате Arduino Pro Mini (т.е. 33х18 мм). Для начала сделаю на ATmega644A (всей памяти вдвое больше), на 5V 16MHz, в качестве "синички в руках".Корпус QFN-44 размерами 7х7 мм нормально вписывается в габариты.

Вслед за этим сделаю на XMC1100. Этот чип мне нравится больше, но вероятность наступить на какие-то грабли выше.
Aven
Сообщения: 528
Зарегистрирован: Сб мар 12, 2016 6:33 pm
Откуда: Ухта, Россия
Благодарил (а): 3 раза
Поблагодарили: 151 раз

Re: HBus

Сообщение Aven » Вт сен 17, 2019 6:53 pm

Как насчет перехода на esp32? WiFi можно не использовать или использовать для обновления прошивки/диагностики.
Не совсем понял почему вы считаете что проц 2560 стоит "десяток с лишним баксов" ? Вот лот 5 чипо за $16.52. Даже готовая ардуинка стоит $7.
Имхо 3.3 питания зря боитесь, почти все датчики с ним нормально работают.
Ответить