Реальная история.
Как кодировать Protobuf сообщение в поток?Закодированные Protobuf сообщение содержит только само сообщение полезной нагрузки. Там нет заголовка или терминатора; По этой причине мы должны определить поток кодер / декодер для Protobuf сообщений.
Каждое сообщение Protobuf будет кодироваться в поток следующим образом:
а) Первые два символа является магическим идентификатором "##" (0x23, 0x23).
б) 2В идентификатор сообщения (кодируется как большой обратный порядок байт без знака краткости).
с) 4В длины сообщения (кодируется как большой обратный порядок байт без знака Int).
г) полезной нагрузки в двоичной кодировке РВ сообщение.
Там должны быть стандартизированы отображение между ID сообщения и Protobuf определения сообщения. Сейчас я использую следующее отображение:
https://github.com/slush0/bitkeylib-python/blob/master/bitkeylib/mapping.py но я открыт для обсуждения этой темы.
Демонстрационный кодер / декодер в питоне реализован здесь:
https://github.com/slush0/bitkeylib-python/blob/master/bitkeylib/transport.pyКак кодировать Protobuf потока в HID сообщений:1. Поток сообщений Сотроза РВА, как описано выше
2. Разделить строку 63 байт полезной нагрузки длиной чушек
3. Для каждой порции создать HID сообщение в формате: размер 1B = куска (0x01-0x3f), 0-63B PB полезную нагрузку
Почему закодировать размер куска в сообщение? Некоторые контроллеры USB HID использовать более высокие значения первого символа (>0x3f) для пользовательских команд, как изменение перепрограммирования идентификатора поставщика и т.д. Хранение размера порции в 0-й символе сообщения будет делать протокол совместит с широким спектром существующих контроллеров.
Обратите внимание, что я начну играть с некоторыми контроллерами HID на следующей неделе (я жду образцов), так что, возможно, это будет предметом изменений.
Стандартный поток сообщений:Все коммуникации всегда инициируется компьютером. Прибор пассивен и отвечает с заранее определенными наборами ответов для каждого запроса.
1. Компьютер должен начать общение с "инициализировать" сообщение. Это говорит устройство, чтобы перезапустить его текущее состояние и реагировать с "Особенности" сообщение.
2. Компьютер может запросить UUID устройства. Это MCU уникального двоичной строки отождествления устройства (серийный номер), контроллер USB не устройство. Хотя контроллеры USB могут сообщить идентификатор поставщика, идентификатор продукта и так далее, очень вероятно, что DYI хакеры не смогут модифицировать контроллеры USB самостоятельно (это требует дополнительных усилий), так Bitcoin клиент должен использовать UUID в отличие от две лексемы.
3. Хотя некоторые ответы отправляются на устройство немедленно (как GetUUID), большинство из них являются блокирующими, потому что требует ручного подтверждения (нажатие кнопки) пользователем. Биткойн клиент должен знать об этом и осуществлять связь с устройством в отдельном потоке, чтобы не блокировать пользовательский интерфейс клиента или другие функциональные возможности.
Дополнительная защита:Все важные меры должны быть подтверждены нажатием кнопки на устройстве пользователя. Некоторые пользователи по-прежнему хотят использовать дополнительную защиту:
1. One Time Password - при включении устройства печатает несколько символов на его внутренний дисплей и отправить "OtpRequest" Ответ на компьютер. Пользователь должен перепечатывать OTP от дисплея к компьютеру. затем Компьютер посылает "OtpAck" сообщение. Если правильно, устройство посылает ответ первоначального запроса на компьютер. OTP предотвращает пользователю нажать на кнопку случайно. Введя четыре символа на клавиатуре, пользователь подтверждает, что он действительно хочет, чтобы выполнить это действие.
2. PIN (пароль) защита - Несмотря на то, кражу Bitcoins из взломанных машины невозможно, злоумышленник все еще есть физический доступ к маркеру. По этой причине, устройство может быть защищен паролем. В этом случае устройство отвечает "PinRequest" к компьютеру и пользователю необходимо ввести правильный пароль к клавиатуре устройства. затем Компьютер посылает "PinAck" сообщение, содержащий пароль. Когда Corect, устройство отправить ответ первоначального запроса на компьютер. Хотя PIN не идеальная защита (особенно потому, что вы вводите ПИН-код на клавиатуру компьютера), с PIN-защищенным устройством, злоумышленник должен получить физический доступ к маркеру и иметь доступ к взломанному компьютеру, на котором пользователь ранее ввел пароль ,
Устройство может сочетать защиту OTP + PIN-код. Поток сообщений будет следующее:
С: GetEntropy ()
D: OtpRequest ()
С: OtpAck (OTP)
D: PinRequest ()
С: PinAck (контактный)
D: энтропия (энтропия)
Наиболее параноидальна установка потребует нажатия кнопки физической, чтобы подтвердить действие, то переписывание OTP и записывать ПИН-код. Насколько я могу сказать, это все еще довольно комфортно. Переписывание четыре или пять алфавитно-цифровых символов супер просто и пароль сам по себе не нужно быть супер-долго, как это только дополнительная функция безопасности.