WebAuthN на отладочной плате ESP32

Протокол авторизации без пароля WebAuthN показался мне очень интересным, особенно в части Bluetooth Low Energy, и я продолжил его изучение, сделав прототип авторизующего устройства сначала на Android, а затем на отладочной плате ESP32.

Стандартная библиотека Android предоставляет массу высокоуровневых функций, позволяющих без особых затрат реализовать авторизатор (корявый, конечно, перевод английского authenticator, но за неимением лучшего…). В частности, в андроиде есть защищенное хранилище ключей и все необходимые криптографические алгоритмы, биометрическая авторизация и высокоуровневая база данных. Всего за пару недель по вечерам у меня появился вполне работоспособный прототип:

Приложение, безусловно, интересное, но бесперспективное — гугл анонсировал, что любой телефон с Android 7+ уже может работать как авторизатор. Гораздо более интересным проектом мне показалась реализация WebAuthN на микроконтроллере ESP32 с встроенной поддержкой BLE.

Первый вариант прошивки был написан на Arduino, благо там тоже есть высокоуровневая библиотека для работы с BLE. Однако, после пары недель разработки я посчитал что более перспективно запрограммировать устройство на C и специальном фреймворке ESP IDF — по сути, ардуиновская библиотека представляет собой всего лишь весьма тонкую обертку, а добавлять по сути бесполезный код в маленькую память микроконтроллера как-то не хочется. Уход от ардуино занял несколько недель, но, к счастью, написанное ранее андроидное приложение весьма сильно помогло мне с отладкой протокола.

В результате сейчас у меня есть вполне работоспособный прототип, проходящий обе процедуры — «Make Credential» и «Get Assertion» на сайте webauthn.bin.coffee.

Для простоты сейчас генерируется только один закрытый ключ и он хранится в оперативной памяти. Большая часть проверок и команд тоже заменена заглушками. Тем не менее, это хорошая отправная точка — можно уже развивать каждый блок независимо друг от друга — добавить нормальное хранилище ключей, биометрическую авторизацию и сделать авторизатор в форм-факторе независимого устройства.