«Хакер» немало писал об уязвимостях самых разных гаджетов, а вот о том, как создать защищенное устройство самому, мы до сих пор не говорили. Настало время посмотреть на эту проблему с другой стороны: в этой статье мы сделаем свой девайс, запустив шифрованное соединение TLS на микроконтроллере STM32.
 

Железо

Нам понадобятся официальная оценочная плата Discovery компании STMicroelectronics и модуль Wi-Fi на ESP8266. Последних существует огромное количество, подойдет практически любой. Главное, чтобы там были выводы RX/TX UART и стандартная прошивка для работы с АТ-командами. Я использую отечественный Troyka (модуль компании «Амперка») просто потому, что он у меня уже есть.

Главные герои статьи
Главные герои статьи

F746G Discovery — это практически Ferrari в мире хобби-электроники. Мощный микроконтроллер (Cortex-M7, 216 МГц) тут сочетается с микросхемой SDRAM внушительных объемов (целых 8 Мбайт) и полезной периферией: экран 480 × 272 с 24-битным цветом, интерфейс SDIO для карт памяти, разъемы аудио и Ethernet.

Я не буду перечислять все доступные возможности этой платы — ты можешь найти подробности на сайте производителя STMicroelectronics. Все то, что раньше приходилось добавлять к Arduino с помощью дочерних плат расширения или модулей, тут доступно «из коробки». Да, цена соответствующая — порядка 6500 рублей. Но когда это спортивные автомобили были для простого народа?

INFO

F746G Discovery — не единственный вариант демоплаты для этого проекта. Ты можешь с таким же успехом использовать, например, отладочную плату из серии Nucleo: F767ZI Nucleo. Для нее тоже есть поддержка в пакете STM32duino, и она гораздо дешевле — около 3000 рублей. Такого разнообразия периферии у нее, правда, нет.

Полноценно нагрузить все компоненты и использовать возможности F746 Discovery на сто процентов в одном проекте непросто. Сегодня с помощью библиотеки bearSSL мы протестируем только вычислительную мощь ядра Cortex-M7 в прикладных задачах криптографии.

WWW

Программирование под STM32 предполагает внимательное изучение сопроводительной документации. Сегодня я постараюсь осветить все подробности и интересности, которые встретятся нам на пути, но в дальнейшем все же настоятельно рекомендую обратиться к следующим материалам (все ссылки — на PDF):

  • UM1907 — самая полная информация о плате Discovery: компоненты, схемы, назначение разъемов и прочее.
  • DS10916 — даташит на микроконтроллер. Полезен распиновкой микросхемы F746NG в различных корпусах.
  • RM0385 — говорят, на тех, кто осилит полностью все 1700+ страниц мануала, снисходит божественное просветление.

 

Настраиваем IDE

В качестве среды разработки я выбрал Arduino IDE. Проект открытый, и вокруг него успело сложиться большое сообщество, так что это хороший выбор как для новичка, так и для продвинутого пользователя. Кроме того, этот выбор позволит нам воспользоваться уже готовой кодовой базой. Таким образом, мы пропустим тривиальную настройку периферии и быстро перейдем к вещам более интересным.

Изначально в Arduino IDE доступны только платы на AVR-микроконтроллерах, ни о каком ARM она и не слышала. Чтобы включить поддержку плат STM32duino, нужно перейти в раздел Arduino → Preferences и добавить дополнительную ссылку. После этого в «Менеджере плат» ты сможешь скачать все необходимые файлы пакета.

INFO

Во время установки опция с STM32duino может и не появиться в списке доступных для установки расширений. В этом случае проверь разрешения для Arduino IDE на работу по сети или добавь в список исключений для антивируса.

 

Ищем пропавший Serial

Если ты еще не проверил корректность работы компилятора и самой платы на парочке простых примеров из числа встроенных, то сейчас самое время. Потому что мы переходим к правке исходных файлов по адресу «Библиотеки → Arduino15 → packages → STM32 → hardware → stm32» (советую сделать копию папки, ты знаешь, как оно бывает). Все дело в том, что проект STM32duino поддерживается энтузиастами (хотя сейчас им заинтересовалась сама STMicroelectronics) и, как следствие, часть функций Arduino реализована, а часть почему-то оказалась забыта.

Например, по умолчанию отсутствует последовательный порт (Serial) на выводах D0 и D1 разъема Arduino. Если ты знаком с оригинальными итальянскими платами (и их многочисленными китайскими клонами), то знаешь, что этот порт связан с разъемом USB через UART — USB-преобразователь в основном используется для общения с компьютером и при перепрошивке флеш-памяти. На Discovery все несколько по-другому.

Микроконтроллер F746NGH6 прошивается с помощью встроенного программатора ST-Link/V2-1 (небольшая микросхема возле miniUSB-порта). Он же выступает в качестве преобразователя интерфейсов при отправке данных на ПК. Но все это делается по другому UART — вовсе не тому, который выведен на плате на разъем Arduino (да, у контроллеров ST богатая периферия, об этом следовало сказать заранее).

Если в прошлом ты использовал плату Arduino Leonardo, то можешь предположить, что для этого интерфейса используется объект Serial1. Но нет! В проекте STM32duino нумерация программных портов Serial соответствует номеру аппаратного периферийного блока UART, и поэтому в любом коде для нашей Discovery Serial и Serial1 — это один и тот же объект (используется переопределение).

Как тогда обращаться к UART на разъеме Arduino? Изучив таблицу 4 на странице 23 документации демоплаты, ты узнаешь, что это RX/TX-выводы UART6.

Впрочем, одного лишь этого знания будет недостаточно: компилятор сообщит, что Serial6 не определен. Чтобы добавить порт UART для работы с ESP8266, нужно отредактировать конфигурационные файлы самой платы — они располагаются по адресу stm32 → 1.4.0 → variants → DISCO_746NG. В самих файлах нет ни намека на возможное решение проблемы, но тщательное изучение исходников проекта STM32duino (папка cores на уровне с variants) должно навести на определенные идеи. На самом деле нам достаточно добавить несколько строчек в файл variants.h:

#define ENABLE_HWSERIAL6        1
#define PIN_SERIAL6_RX          PC7
#define PIN_SERIAL6_TX          PC6

Почему их нельзя было оставить в файле закомментированными, чтобы пользователи не тратили время на знакомство с нюансами реализации Arduino-окружения на платах от ST, — это для меня загадка. Однако теперь объект Serial6 станет доступен в нашем коде, и мы наконец сможем наладить взаимодействие с модулем Wi-Fi.

INFO

Следующие шаги опциональные, однако, если ты хочешь получить максимум быстродействия от связки F746 и ESP8266, советую их не пропускать. Тем более что после них с настройкой окружения будет наконец покончено.

 

Дополнительно

Нам нужно настроить размеры внутренних буферов класса HardwareSerial на прием и передачу информации по интерфейсу UART. По умолчанию размеры подобраны для плат Arduino с микроконтроллерами AVR, и это может стать проблемой при передаче больших массивов данных (как раз наш случай). В папке cores → arduino открой файл HardwareSerial.h и найди в нем такие строчки:

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    9 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии