Существует один очень удобный аппаратный менеджер паролей, называемый Пастильда. Подробнее про него можно почитать тут: Пастильда — открытый аппаратный менеджер паролей.
Устройство весьма остроумное. Большинство людей с ходу даже не понимают, что это такое. Я и сам таким был. Мне понадобилось 25 минут, чтобы понять что это и зачем, причем объяснял нам это сам автор проекта на специальном мероприятии в Питере.
Выглядит как KeyLoger, но на самом деле это хранитель паролей (записная книжка). Подключается последовательно между USB-клавиатурой и LapTop/NetTop/DeskTop/PalmTop(ом). По команде Ctrl+~ появляется консоль >>>. Вводится мастер пароль. Далее можно стрелками вверх-вниз выбрать token пароля конкретной учетной записи и нажать enter. После чего устройство само автоматически допечатает логин и пароль для этого token(а).
У вас наверняка есть пароли от wifi роутера, gmail, госуслуги, coursera, stepick, hh, linkedin, skype, lamoda, booking, github, avito, habr, citilink, dropbox. Многие сайты сейчас просто не допускают учётки с простыми паролями. Требуют цифры, спецсимволы, заглавные буквы. Вот тут-то вам и понадобится Пастильда. Она всё запомнит на SD-карточку аппаратно и выдаст по запросу с клавиатуры.
О неудобствах оригинальной прошивки было писано в отчете Betta-тестирования тут: Pastilda: Независимое Beta-Тестирование (16+)
Так как Пастильда это Open Source(ное) устройство, то я составил еще одну прошивку для Пастильды (Плата Pas~ r 1.1), главным образом, с учетом своих специальных пожеланий.
Вот блок-схема гаджета Pas~ r1.1. Всё максимально просто: MCU, USB 2x, SD card, RGB LED и SWD.
Тем более, что компания-разработчик Третий Пин отказались выпускать новые релизы для своей Пастильды
https://habr.com/ru/post/694970/#comment_25323090
Тем не менее, так как я с 2011 года занимаюсь программированием STM32, то к 2019 году у меня уже была кодовая база в которой было порядка 70% функционала для прошивки Пастильды. Я решил попробовать скомпоновать свою версию *.bin(аря).
В качестве основного стека технологий пришлось выбрать Win10, GCC, C, CMSIS, HAL, FatFs, Make, Eclipse, ST-LINK_gdbserver, arm-none-eabi-gdb.exe, FreeRTOS.
Вы спросите, а что тут, собственно, сложного-то? Написать прошивку для STM32 это же классическая заурядная задача. Но как говорят
Ровно было на бумаге, да забыли про овраги.
С какими трудностями пришлось столкнуться мне?
Трудность №0 (снобский шаг между пинами SWD 2мм)
Оказалось что первое препятствие это изготовить harness для подключения программатора ST-Link V2 ISOL. Как видите, шаг вилки очень экзотический это 2мм. Это самый хипстерский шаг между пинами, который только можно было придумать. Пришлось насаживать на PCB вилку и спаивать шлейф из рассыпухи компонентов из митинского радиорынка.
Трудность №1. (на Pas~ r 1.1 отсутствует UART для Debug CLI Terminal)
На оригинальном устройстве Pas~ r 1.1 отсутствует отладочный UART. Как по мне, дак это очень печально, так как UART нужен для отладки в RunTime. Для интерфейса командной строки (Debug CLI Terminal). Поэтому пришлось искать отладочные платы с STM32, USB-Host, USB-Device, HW AES256, SDIO, RGB-LED и UART. В интернет магазинах такой платы c полным набором, естественно, не нашлось. Пришлось отлаживать функционал Пастильды по частям, подобно тому как в математике интегрируют функции по частям, аж на четырех разных платах: Olimex-STM32-H407, STM32 MINI-M4 и nRF5340-ADK. А программно-независимый код (KeePass Decrypter) я отлаживал и вовсе на x86-64 LapTop(е).
HW атрибут | Pas~ r 1.1 | Olimex-STM32-H407 | STM32 MINI-M4 | nRF5340-ADK |
USB-Host | OTG_HS | OTG_FS | +/- | +/- |
USB-Device | OTG_FS | OTG_HS | +/- | +/- |
HW AES256 | + | - | + | + |
SDIO | + | + | - | - |
UART | - | + | + | + |
SD-micro | + | + | - | + |
SPI | - | + | + | + |
RGB Led | + | - | - | + |
MCU | STM32F415RGT6 | STM32F407ZGT6 | STM32F415RGT6 | nrf5340 |
Price, RUR | 5000 | 1626 | 9780 | 16292 |
Трудность №2. (Аппаратная несовместимость Olimex-STM32-H407 и Pas~ r 1.1 )
В Pas~ r 1.1 USB FS и HS порты не соответствуют отладочной плате Olimex-STM32-H407. Видимо разработчики из Пина не догадывались о существовании классической платы Olimex-STM32-H407. Пришлось писать код с полностью программно-конфигурируемой USB Host и USB Device периферией.
USB-port | Pas~ r 1.1 | Olimex-STM32-H407 |
USB-Host | OTG_HS | OTG_FS |
USB-Device | OTG_FS | OTG_HS |
Вот, кстати, блок-схема архитектуры культовой платы Olimex-STM32-H407. Всё в ней супер, вот только MCU без крипто периферии.
а это внешний вид Olimex-STM32-H407, тоже красная PCB как и Пастильда
Вы наверное удивитесь, но вам даже не обязательно покупать именно оригинальную Пастильду за 5k RUR. Можно взять плату Olimex-STM32-H407 (19.95 EUR=1626 RUR), затем накатить на неё мою прошивку и пользоваться менеджером паролей. Купить Olimex-STM32-H407 можно тут https://www.olimex.com/Products/ARM/ST/STM32-H407/open-source-hardware
Трудность №3. (*.kdbx файл не помещается в RAM память)
В реальной жизни обычно боевой файл *.kdbx не помещается в RAM память микроконтроллера STM32. То, что KeePass расшифровывается в консольном приложении на PC еще не значит, что этот же С-код выполнит эту работу на MCU. У микроконтроллера STM32F415RG напомню, всего-навсего 128 KByte непрерывной RAM памяти, а мой типичный *.kdbx файл с 80-ю записями занимал 154 KByte памяти.
Поэтому пришлось реализовывать алгоритм потокового расшифровывания AES256_CBC и потокового синтаксического разбора расшифрованного XML файла кусочками по N(1...1k) byte. Но это тоже можно было отладить на LapTop(е) в консольном приложении.
Трудность №4 (53 секунды ожидания расшифровки)
На микроконтроллере STM32F407ZG на предельной частоте CPU 168 MHz программное AES256 расшифрование KeePass 153kByte файла длится 53 сек! Это тоже, что если вы подойдете к водяному кулеру, нажмете на кнопку, а холодная вода польется только через 53 секунды.
Поэтому пришлось искать отладочную плату с STM32 и с аппаратным модулем AES256 ECB и AES256 CBC (HW CRYP). Желательно с тем же MCU STM32F415RGT6. Такой платой оказалась сербская плата STM32 MINI-M4. Удалось очень удачно купить её на Avito всего-навсего за 800 RUR (в 11 раз дешевле чем на ЧипДип).
Трудность №5 (на отладке с CRYP модулем нет SDIO)
На отладочной плате STM32 MINI-M4 отсутствует SDIO, только SPI. Не развели сербы один самый важный провод PD2. Ну бывает. Пришлось писать и покрывать тестами драйвер SD-карты по SPI.
Трудность #7 (17 секунд ожидания расшифровки)
Даже при аппаратном расшифровании получилось так, что база данных расшифровывается 17 секунд. Это тоже, что если вы подойдете к домофону, приложите ключ, а дверь откроется только через 17 секунд. Поэтому пришлось перенести прошивку на RTOS. Я добавил отдельный поток для пробрасывания нажатий кнопок (Keys Forwarding) и отдельный поток для расшифровки KeePass (*.kdbx) файла. Идея проста. Как только на Пастильду подается питания она сразу берет из NVRAM мастер пароль и начинает в отдельном потоке расшифровывать KeePass файл. Тем времени эта же прошивка в отдельном потоке пробрасывает нажатия кнопок и пользователь ничего не замечает. К тому времени как понадобится ввести пароль, когда пользователь откроет нужный Web сайт расшифрованные данные уже будут лежать в SRAM памяти. Классический способ разрешения противоречий во времени. Получается что с RTOS нет нужды в микроконтроллере с крипто периферией. Всё делается чисто софтверно.
Трудность 8 (нехватка памяти)
В финальной версии на плате Pas~r1.1 SWD пошаговая отладка показывала, что постоянно возникала, то нехватка стека, то нехватка кучи, то нехватка ROM(особенно для первичного загрузчика 16kByte). Однако удалось настроить скрипты сборки и константы прошивки так, что модульные тесты стали проходить.
Программные зависимости в моей прошивке для Pas~r1.1 выстроились примерно в такой граф
Что я добавил в новую прошивку для Pas~ r1.1?
1--Возможность вставлять только пароль (Right Enter) не только логин + пароль (Left Enter). Очень многие сайты требуют только пароль.
2--Возможность прокручивать пароли в циклическом массиве. Можно быстро получить доступ к старому паролю в конце KeePass файла.
3--Переключение состояние LED при нажатии кнопки, чтобы была связь, что устройство работает.
4--Добавил диагностическую консоль. Если навести курсор в текстовый файл и нажать оба Crtl (Left Crtl + Right Crtl), то появляется курсор ~~> и можно прямо с клавиатуры послать прошивке доступные команды в Run-Time. А ответ прошивка выдаст в этот же открытый текстовый файл, просто автоматически допечатав свой output.
Можно до программировать устройство в Run-Time(ме), прогнать модульные тесты, посмотреть версию софта и железа. Подробнее про удобство CLI(шки) можно почитать тут https://habr.com/ru/post/694408/
Можно, например, завести таймер обратного счета и когда прошивка досчитает до нуля, то програмно перерубить клавиатуру и начать мигать красным RGB, давая понять, что надо что-то запланированное выполнить.
5-- Добавил энергонезависимое запоминание последнего введенного индекса токена. То есть Пастильда вам сама предложит ввести тот логин/пароль, который вы чаще всего используете. Это своего рода кэш память.
6-- Добавил возможность быстрого поиска нужной записи в базе данных по имени token(а). Это своего рода авто дополнение.
Пастильда это не просто одна прошивка. Это целая экосистема. Загрузчики, приложения, тестовые сборки, симуляторы и прочее.
Новый конечный автомат Пастильды теперь такой
Вывод
Если у вас есть Пастильда Pas~ r 1.1 или отладочная плата Olimex-STM32-H407 или вообще любая другая плата с двумя USB+SD-Card и STM32 и вы хотите протестировать прошивку аппаратного менеджера паролей на своем target(е), то обращайтесь в личку и я пришлю вам артефакты *.hex, *.bin, *.elf, *.map.
Если вы не доверяете *.hex, *.bin, то глядя на *.elf и *.map вы уж точно поймете какие функции есть в прошивке и насколько прошивка опасна. Я специально соберу артефакты с опцией -g. Можно также прислать исходники некоторых программных компонентов от Pas~.
Могу даже сварить Вам прошивку для Пастильды на заказ, добавив Ваши custom(ные) пожелания.
Лично мне Пастильда помогает высвободить 2-3 часа в неделю на набирания всяческих паролей. Также Pas~ может выступать как отладочная плата. Иногда я отлаживаю и тестирую кодовою базу на Pas~.
О том как пере прошить Пастильду r1.1 можно прочитать инструкцию тут https://habr.com/ru/post/698964/
Я написал не только Generic прошивку, но и первичный MBR загрузчик и вторичный загрузчик по UART, key loger на Пастильде. Их тоже могу прислать.
Links
https://habr.com/ru/post/698964/
https://habr.com/ru/post/694970/
https://habr.com/ru/post/346820/
https://habr.com/ru/post/305594/
https://habr.com/ru/company/thirdpin/blog/407633/
https://habr.com/ru/company/thirdpin/blog/466533/
https://habr.com/ru/post/305602/
https://habr.com/ru/post/694408/
https://thirdpin.io/portfolio/razrabotka-apparatnogo-menedzhera-parolej
https://www.olimex.com/Products/ARM/ST/STM32-H407/open-source-hardware