«Хакер» немало писал об уязвимостях самых разных гаджетов, а вот о том, как создать защищенное устройство самому, мы до сих пор не говорили. Настало время посмотреть на эту проблему с другой стороны: в этой статье мы сделаем свой девайс, запустив шифрованное соединение 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», чтобы читать все материалы на сайте

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

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

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


Check Also

В королевстве PWN. Препарируем классику переполнения буфера в современных условиях

Сколько раз и в каких только контекстах не писали об уязвимости переполнения буфера! Однак…

8 комментариев

  1. Аватар

    isdubkov

    15.02.2019 at 16:28

    Очень интересно, спасибо за статью! Правильно ли я понял, что ESP8266 вообще никак не прошивается и работает просто как мост UART-Wi-Fi, а всякие инициализации сетевых сессий происходят с STM32 через обертку над AT командами?

    • Аватар

      faberge

      15.02.2019 at 22:00

      Да, именно так. Там только стандартная прошивка для работы с АТ-командами. Все-таки сам микроконтроллер F746NG гораздо мощнее ESP8266 и лучше подходит для обработки криптографии. Любопытная деталь, общение по интерфейсу UART в таком случае тоже получается защищенным.

  2. Аватар

    helter

    03.03.2019 at 10:36

    а что остановило от использования mbedtls (tls.mbed.org) ? в свое время столкнувшись с выбором, посчитал её документаци и примеры более полными.

    • Аватар

      faberge

      06.03.2019 at 09:49

      Я честно пытался разобраться с проектом mbed какое-то время назад, но в итоге у меня так и не сложилось понимание, для кого в первую очередь предназначен этот ресурс: для любителей или для разработчиков. Некоторые их решения, продиктованные стремлением усидеть на двух стульях сразу, для меня выглядят сомнительными. Впрочем, если это вопросов не вызывает, то да, tls.mbed тоже может быть хорошим решением.

      • Аватар

        helter

        07.04.2019 at 12:02

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

Оставить мнение