Программирование AVR Atmel AVR231: AES Bootloader Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Atmel AVR231: AES Bootloader Печать
Добавил(а) microsin   

Бутлоадеры предназначены для самостоятельного обновления пользователями программного обеспечения аппаратуры (firmware). Однако поставляемая в незащищённом виде прошивка может стать причиной взлома, нелегального копирования, кражи секретов компании-разработчика firmware. В этом случае может помочь шифрование кода прошивки. В даташите "Atmel AVR231: AES Bootloader" подробно описан пример такого решения, и его можно довольно просто адаптировать под свои нужды.

AVR231-AES-Bootloader

[Возможности защищенного бутлоадера AES Bootloader]

• Удовлетворяет системным возможностям микроконтроллеров Atmel® AVR®, у которых имеется как минимум 1 кбайт SRAM.
• Позволяет защищённо передавать код программы (firmware) и другие требующие защиты от копирования данные. Этот код и данные будут расшифрованы и записаны в память AVR как работающее приложение.
• Апноут AVR231 включает в себя простые для использования и конфигурирования примеры приложений:
   - шифрование двоичных файлов и данных
   - создание бутлоадеров для разрабатываемых устройств
   - загрузка зашифрованных файлов в разрабатываемые устройства
• Реализованы стандарты шифрования AES (Advanced Encryption Standard) для 128-, 192- и 256-битных ключей.
• Для размещения AES Bootloader достаточно 2 кБайта памяти программ (FLASH).
• Примеры времени обновления firmware размером 64 кБайта на скорости передачи 115200 baud, при тактовой частоте AVR 3.69 МГц:
   - AES128: 27 секунд
   - AES192: 30 секунд
   - AES256: 33 секунды

AES Bootloader: для чего это нужно. Апноут AVR231 описывает, как можно защищённо обновлять firmware для микроконтроллеров AVR с помощью бутлоадера. Метод использует открытый стандарт шифрования Advanced Encryption Standard (AES) для защиты кода firmware.

Рис. 1-1. Обзор архитектуры AES Bootloader

AVR231-overview-fig1-1

Пояснения к рисунку:

Plaintext открытый, нешифрованный двоичный код firmware (FLASH) и/или данных (EEPROM).
Encrypted зашифрованный код, содержащий firmware (FLASH) и/или данные (EEPROM).
Programming Algorithm алгоритм перепрошивки (обновления) firmware (FLASH) и/или данных (EEPROM).

Разработки электронной аппаратуры на основе микроконтроллеров всегда имеют встроенное программное обеспечение (firmware), будь то портативный музыкальный плеер, фен для волос или швейная машина. Часто электронные разработки делаются максимально сжатые сроки, чтобы как можно быстрее выпустить продукт на рынок. Поэтому наверняка впоследствии потребуется обновить готовые электронные изделия, которые были уже поставлены в магазины или даже проданы конечному потребителю. Когда продукт поступил на конечному потребителю, то уже невозможно внести изменения в аппаратуру устройства (чтобы исправить ошибки или добавить новые возможности). Однако можно предусмотреть несложное для потребителя обновление firmware готового продукта, основанное на перепрограммировании памяти FLASH микроконтроллеров, одним из которых и является AVR.

Многие микроконтроллеры AVR могут быть сконфигурированы так, что можно реализовать бутлоадер и передать ему обновление firmware, чтобы по запросу перепрошить память FLASH. При этом память программ (FLASH) делится на 2 секции: секция бутлоадера (Bootloader Section, BLS), и секция приложения (Application Section, AS). Обе секции имеют свои собственные биты защиты (lock bits) для организации защиты от чтения и записи, так что код бутлоадера может быть защищён в секции BLS. При этом сохраняется возможность обновить код в секции приложения AS. Следовательно, алгоритм обновления в BLS может быть довольно просто защищён от внешнего доступа.

Остается проблема с кодом firmware, который обычно не защищён перед тем, как он записан в память FLASH и еще не установлены биты защиты. Это означает, что в случае незашифрованного firmware будет возможен неавторизованный доступ к нему, если обновление будет происходить "в поле", т. е. у конечного пользователя. В этом случае производитель не может проконтролировать процесс обновления кода firmware.

В этом апноуте показано, как с помощью методов криптографии можно передать данные для памяти FLASH и EEPROM, чтобы они остались защищёнными всегда. Идея заключается в том, что данные шифруются перед тем, как они выйдут за пределы отдела программирования производителя, и будут расшифрованы только после того, как уже будут загружены в память AVR перепрограммируемого устройства. Эта процедура конечно не предотвратит от несанкционированного копирования firmware, однако зашифрованная информация firmware будет бесполезна без получения подходящих для расшифровки ключей. Ключи дешифрования сохраняются в недоступном для окружения перепрошивки месте: внутри микроконтроллера AVR. Ключи также не могут быть восстановлены из зашифрованных данных. Есть только один способ получить доступ к данным - применение подходящих ключей дешифровки.

На рис. 1-2 показан пример, как происходит весь процесс. Продукт изначально программируется на заводе некоторым первичным firmware, поступает в продажу, и затем обновляется новой ревизией firmware.

Рис. 1-2 Пример типичной процедуры производства и процедуры обновления.

AVR231-example-update-fig1-2

Примечания к рисунку:

1. Во время производства микроконтроллер сначала оборудуется бутлоадером, ключами дешифровки и рабочим приложением. Бутлоадер отвечает за прием обновляемого приложения и программирование его в память FLASH микроконтроллера, в то время как ключи нужны для дешифровки приходящих данных. Биты защиты устанавливаются, чтобы защитить незашифрованный код firmware, который записан внутри AVR.
2. Затем готовое запрограммированное изделие поставляется дистрибьютору или продается конечному потребителю. Биты защиты продолжают защищать незашифрованный код firmware, который записан внутри AVR.
3. Завершен новый релиз firmware, и в этот момент нужно обновить готовые изделия, которые уже были распространены. Поэтому новое firmware шифруется и поставляется дистрибьютору. Зашифрованное firmware бесполезно без ключей дешифровки, и поэтому каждая локальная копия программного обеспечения (например, на жестком диске компьютера дистрибьютора) не представляет никакой угрозы для безопасности.
4. Дистрибьютор обновляет все изделия в магазине, и все те изделия, которые были возвращены пользователями (например, для ремонта). Зашифрованное firmware загружается в AVR и дешифрируется уже внутри микроконтроллера. Биты защиты продолжают защищать незашифрованный код обновленного firmware, который записан внутри AVR.

Термин "cryptography" используется, когда информация закрыта от посторонних глаз и недоступна без использования ключей. Открытая информация может быть получена только с использованием подходящих ключей.

Алгоритмы, основанные на криптографических ключах, делятся на два класса: симметричные и асимметричные. Симметричные алгоритмы используют тот же самый ключ и для шифрования и для дешифрования, в то время как асимметричные алгоритмы используют разные ключи. AES является алгоритмом с симметричной системой ключей.

Шифрование. Шифрованим называют метод кодирования сообщения или данных таким образом, что его содержимое становится нечитаемым для посторонних глаз, т. е. воспользоваться этими данными просто так, без дешифровки, уже нельзя. Открытое, незашифрованное сообщение или данные в своей оригинальной форме могут содержать информацию, которую автор firmware или дистрибьютор хотели бы сохранить в секрете - именно это относится к программному обеспечению микроконтроллера. Например, когда микроконтроллер обновляется "в поле", то трудно защитить firmware от несанкционированного копирования и реверс-инжиниринга. Шифрование firmware сделает код бесполезным, пока он не будет расшифрован.

Расшифровка. Расшифровка (дешифровка) - метод получения оригинального сообщения или данных из зашифрованных данных. Обычно эти данные не могут быть получены без знания подходящих ключей. Ключи могут быть сохранены в бутлоадере микроконтроллера, так что готовое устройство может принять зашифрованные данные, расшифровать их и перепрограммировать выбранные части памяти FLASH и/или EEPROM. Ключи дешифровки не могут быть получены из зашифрованных данных, и также не могут быть прочитаны из микроконтроллеров AVR, если биты защиты запрограммированы соответствующим образом (однако из этого правила есть исключения, см. [1]).

[Практическая реализация алгоритма AES]

Эта секция не претендует на детальное описание алгоритма AES или его истории развития. Была поставлена цель описать специфичные для AVR реализации различных частей алгоритма. Так как память - дефицитный ресурс для встраиваемых (embedded) приложений (firmware), то был сделан акцент на экономии памяти программ (FLASH). Поскольку приложение бутлоадера никогда не будет работать одновременно с рабочим приложением firmware, то можно не уделять внимания экономии памяти данных (ОЗУ, RAM), пока требования по памяти RAM не превышают возможности используемого микроконтроллера.

Если Вас не интересует реализация AES сама по себе, то можете пропустить материал статьи до части "4 Реализация программного обеспечения и описание его применения" без потери целостности изложения.

В следующих подсекциях будут обсуждаться и описываться некоторые базовые математические операции их реализации применительно к специфике вычислительного ядра AVR. Имейте в виду, что будут сделаны некоторые ссылки на теорию конечного поля из математики [2]. Знание конечных полей не требуется для чтения этой статьи, однако заинтересованный читатель может проштудировать стандарт AES.

Byte addition (прибавление байта). В алгоритме AES прибавление (дополнение) байта определено как прибавление индивидуальных бит без учета возникновения и распространения бита переноса. Это идентично стандартной логической операции XOR. Операция XOR является инверсией самой себе; следовательно вычитание в алгоритме AES идентично дополнению. Операции XOR реализуются на AVR очень просто и тривиально.

Byte multiplication (умножение байта). В алгоритме AES умножение байта определено как умножение конечного поля с модулем 0x11B (в двоичном виде 1 0001 1011). Предложенная реализация - это повторяющееся умножение на первый множитель 2 (по модулю 0x11B) и суммирование промежуточных результатов для каждого бита, имеющего значение 1, на второй множитель. Например: если второй множитель равен 0x1A (в двоичном виде 0001 1010), первый, третий и четвертый промежуточные результаты должны быть просуммированы. Другой пример показан на рисунке 3-1. Такой метод использует мало памяти и хорошо подходит для 8-разрядного микроконтроллера.

Рис. 3-1. Умножение байта.

AVR231-byte-multiplication-fig3-1

Алгоритм умножения может быть также описан следующим псевдокодом:

bitmask = 1
tempresult = 0
tempfactor = firstfactor
while bitmask < 0x100
   if bitmask AND secondfactor <> 0
      add tempfactor to tempresult using XOR
   end if
   shift bitmask left once
   multiply tempfactor by 2 modulo 0x11B
end while
return tempresult

Multiplicative inverses (множительные инверсии). Чтобы можно было вычислить множительные инверсии мультипликативного поля, т. е. 1/x, в этой реализации применяется определенный трюк. Используя возведение в степень (exponentiation) и логарифм с общим основанием, может быть использовано следующее уравнение:

Уравнение 3-1. Использование возведения в степень и логарифма для вычисления 1/x.

AVR231-exponentiation-logarithms-eq3-1

В этом случае выбрано в качестве основания число 3, поскольку это самый примитивный корень. При использовании умножения конечного поля, когда вычисляются экспоненты и логарифмы, множительная инверсия может быть легко реализована. Вместо вычисления экспонент и логарифмов каждый раз используются две заранее вычисленные таблицы (lookup table). Поскольку мультипликативная инверсия применяется только для подготовки S-бокса, как описано в секции 3.4, то память двух для таблиц может также использоваться для других целей, когда S-бокс уже подготовлен. Вычисление таблицы (lookup table) может быть описано следующим псевдокодом:

tempexp = 0
tempnum = 1
do
   exponentiation_table[ tempexp ] = tempnum
   logarithm_table[ tempnum ] = tempexp
   increase tempexp
   multiply tempnum by 3 modulo 0x11B
loop while tempexp < 256

Что такое S-box. Алгоритм AES использует концепцию таблиц замены (substitution table), или коротко S-box. Один из шагов этого алгоритма - получение инвертируемой трансформации (т. е. возможно байт обратно восстановить) байта. S-box является предварительно вычисленным результатом этих трансформаций для каждой возможной величины байта. Трансформация состоит из 2 шагов:

(1) мультипликативная инверсия, как она была описана в секции 3.3, и
(2) линейное преобразование в соответствии со следующим уравнением 3-2, где ai - биты результата, а bi - результаты шага 1.

Уравнение 3-2. Линейное преобразование, используемое в S-box.

AVR231-linear-transformation-in-S-box-eq3-2

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

Инверсный S-box, используемый для расшифровки, имеет такую же структуру и также реализован с использованием сложений XOR и сдвигов. Обратитесь к спецификации AES для подробностей по соответствующей матрице и также см. исходный код реализации.

"State" ("состояние"). Алгоритм AES относится к блочным шифрам. Это означает, что данные обрабатываются поблочно. Для шифратора AES размер блока равен 16 байтам. Блок AES часто организован как массив 4x4, который называется "State" или "State array". Крайняя левая колонка содержит первые 4 байта блока, от верха до низа, и так далее. Читатель должен также знать, что в спецификации AES 4 последовательных байта называются словом (word).

Шифрование AES. Перед обсуждением шагов процесса шифрования должна быть представлена концепция цикла шифрования (encryption round). Большинство блочных шифров состоят из нескольких операций, которые выполняются в цикле некоторое количество раз. Каждый повтор цикла использует отличающийся ключ шифрования. Как минимум одна из операций в каждой итерации зависит от ключа. Циклы повторяющихся операций называются циклами шифрования, и серия ключей, используемых в циклах называется ключевой последовательностью, или списком ключей (key schedule). Количество циклов зависит от размера ключа.

На рисунке 3-2 показан алгоритм процесса шифрования. В последующих подсекциях будут рассмотрены отдельные шаги этого процесса. Каждый шаг для удобства реализован как подпрограмма. Использование оптимизирующего компилятора удаляет ненужные вызовы функций и экономит память программ.

Рис. 3-2. Алгоритм шифрования AES.

AVR231-Encryption-flowchart-fig3-2

Add round key (добавление ключа цикла). Этот шаг использует дополнение XOR для добавления текущего ключа цикла к текущему массиву состояния State. Ключ цикла имеет тот же размер, как и State: 16 байт или 4 слова. Эта операция реализована как цикл из 16 повторов.

Рис. 3-3. Добавление ключа цикла к текущему состоянию (State).

AVR231-adding-round-key-to-current-state-fig3-3

Substitute bytes (замена байт). Этот шаг использует предварительно вычисленную таблицу (lookup table) S-box для замены байт в State. Как и секция 3.6.1, этот шаг реализован как цикл из 16 повторов.

Рис. 3-4. Замена байт текущего состояния (State).

AVR231-substituting-bytes-of-current-state-fig3-4

Shift rows (сдвиг строк). Этот шаг работает со строками текущего состояния (State). Первая строка остается нетронутой, в то время как остальные три сдвигаются циклически влево один, два и три раза соответственно. Для однократного сдвига влево крайний левый байт перемещается в крайний правый столбец, и остальные три байта сдвигаются на один столбец влево. Процесс показан на рисунке 3-5.

Рис. 3-5. Циклический сдвиг строк текущего состояния (State).

AVR231-cycling-rows-of-current-state-fig3-5

Самая простая реализация этого шага - написать подпрограмму, которая сдвигает строку влево на одну позицию, и затем вызывать эту подпрограмму нужное количество раз. Однако тесты показывают, что при прямой перетасовке байт, без всяких циклов и подпрограмм, получается тройной выигрыш по скорости (в 3 раза) при небольшом увеличении затрат на место под код. Поэтому была выбрана реализация с прямой перестановкой байт. Для подробностей см. в исходном коде функцию ShiftRows().

Mix columns (перемешивание столбцов). Этот шаг работает с каждым из столбцов State. Каждый столбец рассматривается как вектор из байт, который умножается на фиксированную матрицу, чтобы получить новый столбец модифицированного State.

Рис. 3-6. Перемешивание столбцов текущего состояния (State).

AVR231-mixing-columns-of-current-state-fig3-6

Операция может быть рассмотрена как уравнение 3-3, где ai это байты перемешанного столбца и bi байты оригинального столбца. Имейте в виду, что дополнение XOR и умножение конечного поля реализовано так, как показано в секциях 3.1 и 3.2.

Уравнение 3-3. Матричное умножение, когда перемешивается один столбец.

AVR231-matrix-multiplication-when-mixing-one-column-eq3-3

Этот шаг реализован напрямую, без вторичных вызовов функций. Из матричного уравнения можно увидеть, что каждый байт ai смешанного столбца является комбинацией оригинальных байтов bi и их удвоенных значений 2bi. Для получения подробностей обратитесь к исходному коду функции MixColumns().

Decryption (расшифровка) AES. На рисунке 3-7 показан алгоритм процесса дешифровки. Этот процесс очень похож на процесс шифровки, за исключением того, что изменен порядок шагов. Все шаги за исключением Add Round Key имеют свою соответствующую инверсию. "Инверсия Shift Rows" сдвигает строки вправо вместо сдвига влево при шифровании. "Инверсия Substitute Bytes" использует инверсные S-box.

"Инверсия Mix columns" также использует инверсное преобразование. Пожалуйста обратитесь к стандарту AES для получения соответствующей матрицы, и также см. исходный код для получения подробностей. Обратите внимание, что список ключей (ключевая последовательность, key schedule) для дешифровки тот же самый, что и для шифровки, однако имеет обратный порядок.

Рис. 3-7. Алгоритм расшифровки AES.

AVR231-Decryption-flowchart-fig3-7

[Key expansion (распространение ключей)]

Под термином "key expansion" подразумевается процесс генерации ключевой последовательности из оригинального 128, 196 или 256-битного ключа шифрования. Алгоритм key expansion показан на рисунке 3-8.

Рис. 3-8. Алгоритм key expansion.

AVR231-Key-expansion-flowchart-fig3-8

Алгоритм key expansion использует операции, которые были описаны ранее - дополнение XOR, умножение конечного поля, замена и циклический сдвиг слова. Пожалуйста обратитесь к исходному коду для получения подробностей. Обратите внимание, что key expansion идентичен для шифрования и дешифрования. Таким образом, используемый для шифрования S-box так же требуется и для дешифровки, даже если используется только дешифровка. В реализации на AVR обыкновенный S-box вычисляется перед key expansion, и затем его память используется заново, когда вычисляется инверсный S-box.

Cipher block chaining – CBC (выстраивание шифрованных блоков в цепочку). Как мы уже говорили, AES является блочным шифром, потому что алгоритм манипулирует блоками данных фиксированного размера. Ключ шифрования используется для шифрования данных в блоках по 16 байт. Для известного входного блока и постоянного ключа шифрования (хотя он и неизвестен) выходной блок будет всегда одним и тем же. Этим может воспользоваться какой-нибудь взломщик для проведения атаки на систему шифрования.

Есть несколько методов, которые обычно используются для того, чтобы блоки с одинаковым открытым текстом были зашифрованы в блоки, отличающиеся друг от друга по содержанию. Один из методов называется Cipher Block Chaining (CBC).

По методу CBC шифрованные блоки соединяются друг с другом так, что начальные блоки влияют на все последующие блоки. Это достигается путем первоначальной операции XOR текущего еще не зашифрованного блока и предыдущего зашифрованного блока. Результат XOR затем шифруется вместо открытых исходных данных.

[Реализация программного обеспечения и описание его применения]

В этой секции сначала обсуждаются некоторые важные темы, которые касаются повышения защищённости системы. Эти темы служат мотивом для принятии решений при последующей разработке программного обеспечения. Здесь представлены техники, которые можно использовать для защиты разрабатываемого устройства от несанкционированного внешнего доступа. Несмотря на то, что ни одна разработка не может быть выполнена полностью защищённой, можно сделать её так, что взлом защиты будет максимально сложным, насколько это возможно. Это коренное отличие незащищённого дизайна, с которым взломщик с минимальными техническими знаниями может скопировать разработку, от защищённого, который может взломать только человек с высокой квалификацией. В случае незащищённой разработки она может быть просто скопирована и даже подвергнута реверс-инжинирингу, нарушая интеллектуальную собственность производителя и создавая опасную для него ситуацию на рынке. В случае применения защиты усилия, которые потребуются для взлома, окажутся настолько высоки, что могут заставить потенциального взломщика разработать собственный вариант устройства.

Есть только одно правило для создания защищённой системы: она должна быть разработана так, чтобы максимально, как это только возможно, затруднить взлом. При этом нужно иметь в виду, что для взлома могут использоваться любые способы обойти защиту. Далее приведено несколько примеров таких способов (уязвимостей), которые стоит рассмотреть.

• Что произойдет, когда отключается питание во время процедуры обновления? Какое будет состояние у микроконтроллера, когда питание снова восстановится? Биты защиты и вектора сброса будут все время установлены правильно?
• Могут ли быть сделаны какие-либо предположения относительно исходного кода на основе незашифрованной информации? Т. е. сможет ли взломщик предположить, какие данные были в firmware до шифрования? Чтобы взломать AES, необходимо найти известный паттерн информации. Атакующее программное обеспечение будет сконфигурировано для поиска известного паттерна, например векторов прерывания, которые находятся в начале памяти программ, области памяти, заполненные нулями или единицами, и т. п.
• Можно ли получить какую-нибудь обратную связь от процесса дешифровки? Любая такая связь может помочь атакующему. Например, алгоритм дешифровки внутри бутлоадера может выдавать сигналы подтверждения OK / Not-OK для каждого обработанного блока, и эти сигналы могут быть использованы взломщиком как сигналы обратной связи.
• Должны ли защищённые фреймы быть отправленными в другом порядке? Если первый фрейм, отправленный бутлоадеру, всегда включает в себя первый блок зашифрованного файла, то атакующий на основе этого может сделать некоторые предположения об исходном (незашифрованном) содержании отправленного блока. Например, он может предположить, что первый фрейм содержит данные программы, начинающиеся с нулевого адреса, и там будет находиться таблица векторов прерываний. Эти данные помогут уточнить исходные данные для поиска/подбора ключа. Для увеличения защищённости системы нужно посылать фреймы в случайном порядке (во всяком случае декодированные фреймы все равно будут отображены на свой правильный исходный адрес).

Обзор применения защиты. Эта и последующие секции описывают, как использовать и конфигурировать приложения. Процесс проиллюстрирован рисунком 4-1.

Рис. 4-1. Обзор процесса применения защиты.

AVR231-overview-of-project-flow-fig4-1

Пояснения к рисунку:

Application note апноут, указания по применению (эта статья, AVR231).
Bootloader Source компилируемый исходный код бутлоадера AES, см. [5].
Header File файл заголовка, который подключается к компилируемому проекту бутлоадера.
Key File файл ключа AES для дешифровки.
IAR Embedded Workbench система разработки программ для микроконтроллера AVR, в среде которой компилируется AES бутлоадер.
Text editor любой текстовый редактор, в котором можно подготовить конфигурационный файл.
GenTemp специальная программа для создания шаблона конфигурационного файла, который может быть впоследствии отредактирован в текстовом редакторе.
Configuration File конфигурационный файл для системы создания шифрованного firmware, описанной в этом апноуте.
Miscellaneous Editor произвольный редактор данных, в которых подготавливается незашифрованный дамп для EEPROM. Это может быть и HEX-редактор типа WinHEX, или среда разработки AVR Studio вместе с WinAVR.
Application Builder система разработки приложения firmware, которое работает в секции приложения Application Section (AS). Именно это приложение защищённо обновляется с применением шифрования AES. Система разработки может быть любой (IAR Embedded Workbench, AVR Studio).
Create специальная программа, которая подготавливает шифрованное firmware и файлы заголовка (Header File) и ключа (Key File) для бутлоадера.
Encrypted Firmware шифрованный блок данных, в котором находится обновление - как само firmware так и возможно данные для EEPROM.
Bootloader двоичный код бутлоадера, который прошивается в секцию BLS микроконтроллера AVR (Target AVR) с помощью внешнего программатора (обычно ISP или JTAG).
Update специальная программа, которая передает шифрованный блок данных бутлоадера для обновления firmware.
Target AVR целевой микроконтроллер AVR, на котором работает бутлоадер, и программное обеспечение которого обновляется.

На рисунке 4-1 описаны следующие основные шаги:

• Создание приложения (firmware) для целевого микроконтроллера AVR (прошивка FLASH). Если это необходимо, также в отдельном файле создаются данные и для энергонезависимой памяти (прошивка EEPROM).
• Создается конфигурационный файл, содержащий информацию о проекте. Приложение, называемое gentemp, может использоваться для создания файла фрейма.
• Запуск приложения, которое называется create. Это создаст заголовочный файл, файл ключа и зашифрованный файл.
• Используя IAR Embedded Workbench®, сконфигурируйте (configure) и сделайте сборку (build) для бутлоадера (bootloader) целевого AVR.
• С помощью программатора загрузите бутлоадер в целевой микроконтроллер AVR, установите биты защиты (lock bits) и биты конфигурационных перемычек (фьюзы, fuse bits).
• Теперь в любое удобное время зашифрованное firmware может быть загружено в AVR (с помощью бутлоадера).

Кконфигурационный файл. Файл конфигурации содержит список параметров, которые могут быть использованы для конфигурирования проекта. Параметры описаны в таблице 4-1.

Таблица 4-1. Опции конфигурационного файла.

Параметр Описание Значение по умолчанию Параметр обязателен?
PAGE_SIZE Размер страницы памяти FLASH микроконтроллера AVR в байтах, десятичное число. Этот параметр зависит от модели (типа) применяемого AVR - за информацией обратитесь к даташиту. не применимо ДА
KEY1 Первая часть (128-бит) ключа шифрования в шестнадцатеричном представлении. Здесь должны быть указаны 16 случайных байт, вместе с нечетными битами четности (odd-parity bits), вставленными после каждого 8-го бита, так что всего должно быть 18 байт. нет: не зашифровано нет, однако очень рекомендуется
KEY2 Вторая часть (64-бит) ключа шифрования в шестнадцатеричном представлении. Должно быть 8 случайных байт, вместе с нечетными битами четности (odd-parity bits), вставленными после каждого 8-го бита, что в итоге даст 9 байт. Если эта опция не указана, то будет использоваться шифрование AES128. если нет, то будет использоваться AES128 нет, но рекомендуется
KEY3 Третья часть (64-бит) ключа шифрования в шестнадцатеричном представлении. Должно быть 8 случайных байт, вместе с нечетными битами четности (odd-parity bits), вставленными после каждого 8-го бита, что в итоге даст 9 байт. Если эта опция не указана, то будет использоваться шифрование AES128 или AES192. если нет, то будет использоваться AES128 или AES192 нет, но рекомендуется
INITIAL_VECTOR Используется для построения CBC. Здесь должны быть указаны 16 случайных байт в шестнадцатеричном виде. 0 нет, однако очень рекомендуется
SIGNATURE Данные проверки фрейма в шестнадцатеричном виде. Здесь могут быть любые 4 байта, однако рекомендуется выбирать их случайными. 0 нет
ENABLE_CRC Разрешить проверку CRC: YES или NO. Если разрешено (YES), то вся секция приложения будет перезаписана, и приложение обязательно должно пройти тест на CRC, прежде чем ему будет позволено запуститься. нет нет, но рекомендуется
MEM_SIZE Размер секции приложения программируемого AVR (десятичное значение в байтах). не применимо ДА, если используется проверка на CRC

Конфигурационному файлу можно дать любое допустимое имя. Это имя позже будет предоставлено как параметр для приложения, которое создает файлы проекта. Ниже приведен пример конфигурационного файла для микроконтроллера Atmel ATmega16. Параметр KEY1 дан для примера в виде простого 128-битного ключа (hex 0123456789ABCDEF0123456789ABCDEF) со вставленными битами четности.

PAGE_SIZE         = 128
KEY1              = 0111914CE8955B35DE0111914CE8955B35DE
INITIAL_VECTOR    = 00112233445566778899AABBCCDDEEFF
SIGNATURE         = 89ABCDEF
ENABLE_CRC        = YES
MEM_SIZE          = 14336

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

Таблица 4-2. Сводная таблица параметров AVR, которые используются для бутлоадера AES.

  ATmega8 ATmega16 ATmega162 ATmega169 ATmega32 ATmega64 ATmega128
Размер FLASH в байтах 8192 16384 16384 16384 32768 65536 131072
Размер страницы FLASH в байтах 64 128 128 128 128 256 256
Количество страниц FLASH 128 128 128 128 256 256 512
Максимальный размер BLS в байтах 2048 2048 2048 2048 4096 8192 8192
Количество страниц BLS 32 16 16 16 32 32 32
MEM_SIZE в байтах 6144 14336 14336 14336 28672 57344 122880
PAGE_SIZE в байтах 64 128 128 128 128 256 256

Программа для компьютера (PC application) – GenTemp. Эта программа генерирует шаблон для файла конфигурации. Она генерирует случайные ключи шифрования и начальные векторы, оставляя другие параметры для заполнения пользователем (как например размер страницы FLASH). Рекомендуется всегда начинать с создания шаблона, используя эту программу. Программа используется следующим образом:

gentemp FileName.Ext
   
В этом примере FileName.Ext имя генерируемого шаблона конфигурационного файла. После того, как шаблон FileName.Ext сгенерирован, он может быть отредактирован любым текстовым редактором.

Программа для компьютера (PC application) – create. Эта программа читает информацию из конфигурационного файла и генерирует файл ключа и заголовочный файл для бутлоадера. Эта программа также шифрует firmware. Обычно эту программу нужно запустить 2 раза: (1) чтобы сгенерировать файлы ключа и заголовка для AES-бутлоадера, и (2) для шифрования нового firmware.

Внимание: очень важно, чтобы использовалась одинаковая информация шифрования (из конфигурационного файла), когда генерируются файлы проекта AES-бутлоадера и когда шифруется firmware. Иначе бутлоадер может получить неправильные ключи шифрования и не сможет расшифровать данные. Нужно также принимать во внимание, что можно использовать конфигурационный файл для того, чтобы расшифровать зашифрованное firmware. Поэтому конфигурационный файл нужно хранить в защищённом, недоступном для потенциального взломщика месте, и он не должен модифицироваться после того, как был использован в первый раз для шифрования firmware.

В таблице 4-3 показаны допустимые аргументы для командной строки программы create.

Таблица 4-3. Обзор опций командной строки программы create.

Аргумент Описание
-c Путь до файла конфигурации.
-d Если эта опция указана, то содержимое каждой страницы памяти FLASH будет удалено перед записью. Иначе иначе ранее имеющиеся там данные будут сохранены, если они специально не перезаписываются.
-e < filename.ext > Путь до файла для содержимого EEPROM (данные, которые попадут в память EEPROM).
-f < filename.ext > Путь до файла содержимого памяти FLASH (код программы, который попадет в секцию приложения Application Section, AS).
-h < filename.ext > Имя для выходного файла заголовка. Этот файл позже будет подключен к проекту бутлоадера при его компиляции.
-k < filename.ext > Имя выходного файла ключа. Этот файл позже будет подключен к проекту бутлоадера при его компиляции.
-l [BLB12] [BLB11] [BLB02] [BLB01] Значения битов защиты (Lock bits) для их установки. Эти биты защиты будут установлены после того, как все данные буду переданы и перед тем, как управление (выполнение кода) будет передано обновленному приложению (в секцию AS).
-n Nonsense (бессмыслица). Добавляется случайное количество бессмысленных записей в зашифрованный файл. Все "бессмысленные" записи будут игнорированы бутлоадером, так что эта опция никак не повлияет на работу приложения. Она влияет только на предсказуемость содержимого шифрованного файла (затрудняет взлом AES).
-o < filename.ext > Имя выходного файла. Это защищённый (зашифрованный) файл, который может быть распространен и направлен в целевое перепрограммируемое устройство, когда его нужно обновить.

Первый запус утилиты create. При первом запуске обычно генерируются только файлы ключа и заголовка для бутлоадера. Генерация ключа и заголовка запрашивается через аргументы командной строки:

create –c Config.txt –h BootLdr.h –k AESKeys.inc

Файл ключа и файл заголовка должны быть скопированы в директорию проекта бутлоадера, и они будут подключены к коду бутлоадера при компиляции.

Внимание: файлы проекта бутлоадера сконфигурированы для использования вышеупомянутых файлов BootLdr.h and AESKeys.inc. Для простоты рекомендуется не менять эти имена.

Последующие запускиe утилиты create. В последующих запусках программа create используется для шифрования кода firmware. Перед шифрованием исходный файл должен быть скомпилирован, собран и слинкованы в один кодовый сегмент и/или один сегмент EEPROM. Полученные файлы должны быть в формате Intel® hex. Файловые имена (EEPROM.hex, Flash.hex) подставляются в командную строку, и зашифрованный файл (Update.enc) будет сгенерирован в соответствии с файлом конфигурации (Config.txt). Например:

create –c Config.txt –e EEPROM.hex –f Flash.hex –o Update.enc –l BLB11 BLB12

Код приложения микроконтроллера (firmware Flash.hex) и данные EEPROM (EEPROM.hex) будут скомбинированы в один шифрованный файл.

Алгоритм работы программы create

AVR231-Flowchart-create-application-fig4-2

Шифрованный файл. Как уже было упомянуто, файлы FLASH и EEPROM шифруются и сохраняются в один целевой файл. Однако перед шифрованием данные организуются в записи. Имеется 7 типов записей, как показано на рисунке 4-3.

Рис. 4-3. Типы записей выходного зашифрованного файла.

AVR231-record-types-for-encrypted-file-fig4-3

Тип записи определяется по первому байту в записи. Данные приложения разбиваются на записи типов 1, 2, 3 и 4 - это erase (очистка), prepare (подготовка), load (загрузка) и write (запись страницы буфера во FLASH). Данные секции EEPROM форматируются в запись типа 5. Биты защиты передаются через запись типа 6. Записи с типами 0 и 7 относятся к окончанию фрейма и окончанию передачи соответственно.

Все другие записи, которые имеют идентификаторы выше 7, являются бессмысленными, и они нужны только для запутывания взломщика. Когда опция -n активирована (см. опции командной строки утилиты create), то случайное количество бессмысленных записей будет помещено в случайные места выходного файла. Выходной файл создается, как показано на рисунке 4-4.

Рис. 4-4. Создание шифрованного файла.

AVR231-creating-encrypted-file-fig4-4

Шаги, которые показаны на рисунке 4-4, выполняют следующие действия:

Шаг 1. Данные форматируются в записи, которые выстроены друг за другом после фрейма сигнатуры (SIG). Нуль (Z) добавляется как метка окончания, и фрейм дополняется случайными данными (F) для создания размера фрейма, который кратен 16 байтам.
Шаг 2. Начальный вектор присоединяется к фрейму. В первом фрейме вектор равен указанному в конфигурационном файле. Во всех последующих фреймах начальный вектор равен последнему шифрованному блоку от предыдущего фрейма.
Шаг 3. Начальный вектор и шифрованные блоки выстраиваются в цепочку и шифруются. Начальный вектор удаляется из фрейма.
Шаг 4. Контрольная сумма (C) вычисляется по алгоритму CRC-16 и добавляется к фрейму.
Шаг 5. Длина фрейма (L), исключая информацию о длине, вычисляется и сохраняется в начале фрейма.

Фрейм записывается в выходной файл и процедура повторяется, пока не будут обработаны все данные.

[AVR bootloader AES]

Бутлоадер должен находится в целевом AVR перед тем, как устройство будет обновляться шифрованным firmware. Бутлоадер обменивается данными с компьютером PC, и может программировать EEPROM и область кода обновляемой программы (секция приложения AS) FLASH. Бутлоадер, который поставляется с этим апноутом, создается с использованием IAR™ Embedded Workbench, version 3.20c, и может быть портирован на другие компиляторы C. Алгоритм работы бутлоадера иллюстрируется на рисунке ниже.

Рис. 4-5. Блок-схема алгоритма работы AES bootloader.

AVR231-Flowchart-AVR-AES-bootloader-fig4-5

Файлы ключа и заголовка. Перед тем, как бутлоадер может быть скомпилирован, нужно настроить несколько параметров. Для этого в папку бутлоадера нужно скопировать файлы ключа шифрования и заголовка (сгенерированные программой create). Эти файлы будут подключены при компиляции (директивой #include) к исходному коду бутлоадера.

Файлы проекта. Этот апноут поставляется со специальными файлами проекта, предназначенными для использования со следующими микроконтроллерами:

• Atmel ATmega8
• Atmel ATmega16
• Atmel ATmega162
• Atmel ATmega169
• Atmel ATmega32
• Atmel ATmega64
• Atmel ATmega128

Используйте файлы проекта, которые соответствуют Вашему используемому AVR. Для микроконтроллеров AVR, которых нет в списке, используйте файл проекта, который максимально подходит к нужному AVR, и подправьте его, как описано в секциях 4.6.3 и 4.6.4.

Linker file (файл настройки линкера). Компилятор IAR требует модифицированного файла линкера, потому что код бутлоадера должен размещаться в верхней области памяти, в специальной секции бутлоадера (Boot Loader Section, BLS). Файлы линкера имеют расширение .xcl и распространяются с компилятором IAR отдельно для каждого микроконтроллера AVR. Этот апноут поставляется с модифицированным файлом линкера bootldr.xcl.

Файл для линкера настраивается в свойствах проекта через меню Project –> Options, категория XLINK, закладка Include, поле "XCL file name".

Внимание: в поставляемых с этим проектом файлах проекта (относящихся к специфичному микроконтроллеру) уже настроен файл линкера.

Другие настройки компилятора. Следующие настройки нужно задать в окне диалога, который открывается также через меню Project –> Options. Имейте в виду, что все установки уже заданы в файлах проекта, относящихся к специфичному микроконтроллеру.

Таблица 4-4. Необходимые настройки компилятора.

Категория Закладка Установить в значение Пример
General Target В поле "Processor configuration" установите тип используемого Вами целевого AVR. -cpu=m8, AT90mega8
Установите "Memory model" в значение Small.  
Снимите галочку "Configure system using dialogs (not in .XCL file)".  
Library configuration Поставьте галочку "Enable bit definitions in I/O-include files"  
AAVR Preprocessor Задайте символ "INCLUDE_FILE", соответствующий используемому Вами целевому AVR. INCLUDE_FILE="iom8.h"
Задайте символ SPMREG, соответствующий цели. SPMREG=SPMCR
Задайте символ __RAMPZ__ для микроконтроллеров AVR, у которых размер памяти FLASH больше 64 килобайт.  
Задайте символ __MEMSPM__ для микроконтроллеров AVR, у которых SPM control register размещен выше адреса 0x3F.  
XLINK Output Задайте такой тип выходного файла, который Вы можете запрограммировать в целевой AVR с помощью внешнего программатора (обычно ISP или JTAG). Чаще всего можно установить формат Intel-Extended.  
#define Задайте символ BOOT_SIZE, который соответствует размеру секции бутлоадера (BLS) целевого AVR. Значение указывается в hex-виде, в байтах. BOOT_SIZE=800
Задайте символ FLASH_SIZE, который соответствует размеру памяти FLASH целевого AVR. Значение указывается в hex-виде, в байтах. FLASH_SIZE=2000
Задайте символ IVT_SIZE, который соответствует размеру таблицы векторов прерываний (interrupt vector table) целевого AVR. Значение указывается в hex-виде, в байтах. IVT_SIZE=26
Задайте символ RAM_SIZE, который соответствует размеру памяти RAM целевого AVR. Значение указывается в hex-виде, в байтах. RAM_SIZE=400
Задайте символ RAM_BASE, который соответствует началу SRAM (сразу за областью ввода/вывода I/O). Значение указывается в hex-виде, в байтах.

RAM_BASE=60

Задайте символ APP_SRAM_USED, который соответствует размеру общего использованного SRAM, о котором сообщает процесс компиляции. Значение указывается в hex-виде, в байтах. APP_SRAM_USAGE=30A
Includes Под секцией "XCL file name" поставьте галочку "Override default".  
Под секцией "XCL file name", введите имя в текстовое поле. $PROJ_DIR$\bootldr.xcl

В таблице 4-5 приведены некоторые опции компилятора для поддерживаемых в настоящее время микроконтроллеров AVR. Имейте в виду, что адрес начала бутлоадера зависит от установок фьюзов (fuse), как будет показано далее (см. таблицу 4-6).

Таблица 4-5. Настройки компилятора для различных поддерживаемых микроконтроллеров AVR.

  ATmega8 ATmega16 ATmega162 ATmega169 ATmega32 ATmega64 ATmega128
Имя конфигурационного файла для линкера (Linker file name) bootldr.xcl
BOOT_SIZE 800 800 800 800 800 800 1000
FLASH_SIZE 2000 4000 4000 4000 8000 10000 20000
IVT_SIZE 26 54 70 58
RAM_SIZE 400 400 400 400 800 1000 1000
RAM_BASE 60 60 100 100 60 100 100
APP_SRAM_USAGE 30A 31E 31E 31E 31E 41E 41E
SPMREG SPMCR SPMCR SPMCR SPMCSR SPMCR SPMCR SPMCSR
__RAMPZ__             X
__MEMSPM__           X X

Примечание: символы __RAMPZ__ и __MEMSPM__ не установлены в какое-либо значение. При необходимости они должны просто быть включены в определенный список символов.

Установка бутлоадера. Скомпилируйте бутлоадер и загрузите его в Ваш микроконтроллер AVR с использованием утилиты программирования Atmel AVR Studio® (или другой утилиты для программатора [4]). Перед тем, как запустить бутлоадер, должны быть сконфигурированы следующие биты фьюзов (fuse bits):

• Размер секции бутлоадера (Boot Loader Section). Установите фьюзы так, чтобы размер секции соответствовал установке BOOT_SIZE, как было описано ранее. Имейте в виду, что BLS обычно указывается в словах (в единицах по 2 байта), но параметр BOOT_SIZE указывается в байтах.
• Вектор сброса бутлоадера (Boot reset vector). Должен быть разрешен boot reset vector (включена поддержка бутлоадера).
• Опции генератора тактовой частоты. Фьюзы, настраивающие параметры генератора, зависят от конкретного типа микроконтроллера AVR. Они могут потребовать конфигурирования (влияют на USART).

Внимание: пожалуйста уделите особое внимание правильной установке опций тактового генератора. Даже самая незначительная ошибка может привести к тому, что бутлоадер не сможет связаться с программой загрузки на компьютере PC.

В таблице 4-6 показаны рекомендуемые установки для фьюзов. См. даташит на микроконтроллер для подробного описания бит фьюзов.

Таблица 4-6. Рекомендованные настройки fuse bits.

  M8, M8515, M8535, M16,
M162, M169, M32, M64
M128
BOOTSZ1:0 0:0 0:1
BOOTRST 0 0

Примечание: 0 означает, что бит запрограммирован, 1 означает, что бит не запрограммирован.

Рекомендуется запрограммировать биты защиты, чтобы защитить код как приложения, так и код бутлоадера (они оба находятся памяти FLASH), однако только после того, как будут установлены биты фьюзов. Биты защиты могут быть запрограммированы с помощью утилиты AVR Studio и подходящего ISP программатора. Биты защиты BLS будут также установлены во время обновления firmware в значение, которое было предоставлено в качестве аргументов командной строки, когда шифровалось firmware. Рекомендуемые установки бит защиты:

• Memory lock bits (биты защиты памяти): они должны быть установлены для предотвращения доступа к памяти. Имейте в виду, что после того, как память будет заблокирована, к ней нельзя будет получить доступ через системы программирования (это обычно ISP и JTAG). Для получения доступа придется полностью стереть содержимое памяти микроконтроллера.
• Защищённый режим для секции бутлоадера (Boot Loader Section, BLS): SPM и LPM не должны быть разрешены для записи в BLS или чтения из BLS. Это предотвратит случайную порчу кода бутлоадера из firmware приложения, а также предотвратит компрометацию ключей дешифровки.
• Защищённый режим для секции приложения (AS): не должно быть установлено ограничений по доступу к AS через команды SPM или LPM; в противном случае бутлоадер не сможет обновить код firmware приложения (AS).

Внимание: важно понимать, что если неправильно закрыть доступ к памяти, то к её содержимому может быть получен доступ через интерфейс программирования ISP (или JTAG, или через параллельный высоковольтный интерфейс), и вся описываемая в этом апноуте защита с применением шифрования окажется бесполезной.

В таблице 4-7 приведены рекомендованные установки бит защиты (lock bit) для имеющихся на сегодняшний день микроконтроллеров AVR. Для получения подробностей см. детальное описание бит защиты в даташите на микроконтроллер.

Таблица 4-7. Рекомендуемые значения бит защиты.

  M8, M8515, M8535, M16,
M162, M169, M32, M64, M128
BLB12 : BLB11 0 0
BLB02 : BLB01 1 1
LB2 : LB1 0 0

[Программа для компьютера PC – update (для обновления firmware)]

Это приложение используется для отправки шифрованного файла в обновляемое целевое устройство. Данные могут быть отправлены через последовательный порт PC напрямую в USART микроконтроллера AVR, установленного в целевом устройстве. Алгоритм работы программы показан на рисунке 4-6.

Программа Update читает файлы, сгенерированные программой Create. Файл состоит из одного или большего количества соединенных друг с другом фреймов зашифрованных данных. Приложение передает данные фрейм за фреймом, делая паузы при ожидании ответа от бутлоадера. Следующий фрейм будет передан только после приема подтверждения; иначе приложение update будет либо отправлять фрейм заново, либо завершит обмен данными.

Приложение update запускается из командной строки. Опции командной строки перечислены в таблице 4-8.

Таблица 4-8. Аргументы командной строки программы update.

Аргумент Описание
  Путь до передаваемого зашифрованного файла.
-COMn Последовательный порт, где n номер последовательного COM-порта, к которому подключено обновляемое устройство с микроконтроллером AVR.
-baudrate Скорость передачи данных, где baudrate указывает реально используемую скорость обмена.

Пример использования update:

update blinky.ext -COM1 -115200

Нужно иметь в виду, что программа update будет обновлять только те части FLASH и EEPROM, которые указаны в файлах приложения firmware и EEPROM. Если в утилите create была разрешена проверка CRC в секции приложения, или выбрана опция очистки (erase), то перед программированием вся память секции приложения (AS) будет очищена.

Рис. 4-6. Алгоритм работы программы update.

AVR231-Flowchart-update-application-fig4-6

[Hardware setup (настройка аппаратуры)]

Перед тем, как зашифрованное firmware может быть отправлена бутлоадеру, необходимо правильно настроить аппаратуру целевого устройства. В этом апноуте предполагается, что в качестве целевой платформы используется Atmel STK®500, и используется кварцевый резонатор на частоту 3.69 МГц. STK500 должен быть сконфигурирован следующим образом:

• Подключите STK500 (через коннектор, помеченный как "RS232 CTRL") к компьютеру PC, используя кабель для последовательной передачи данных (serial cable). Подайте питание на STK500.
• С помощью Atmel AVR Studio загрузите bootloader и установите биты фьюзов и биты защиты, как было описано ранее. Отключите питание от STK500.
• Переключите serial cable на коннектор, помеченный как "RS232 SPARE".
• Подключите ножки USART устройства (RXD и TXD) к соответствующим выводам коннектора, помеченного как "RS232 SPARE".
• Соедините PD7 (ножка 8 порта PORTD) с SW7 (вывод 8 блока SWITCHES).
• Нажмите и удерживайте кнопку SW7 в момент подачи питания на STK500. Это запустит код бутлоадера и переведет его в режим ожидания загрузки обновления (update mode).
• Отпустите кнопку SW7.
• Теперь Вы можете использовать программу update на компьютере PC для отправки зашифрованных данных на целевое устройство (в нашем примере это микроконтроллер AVR, установленный на STK500).

[Производительность]

Ниже рассматривается скорость работы системы и её эффективность (system performance) по критериям времени выполнения и размеру кода.

Execution Time (время выполнения). Время, которое нужно потратить целевому обновляемому устройству для приема, декодирования и программирования данных, зависит от следующих факторов:

• Размер шифрованного входного файла. Чем больше данных, тем дольше длится процесс обновления.
• Скорость обмена данными (baudrate). Чем будет выше скорость передачи, тем будет короче время передачи.
• Скорость целевого AVR. Чем выше тактовая частота AVR, тем короче время декодирования.
• Время программирования страницы FLASH. Это константа, определяемая используемым микроконтроллером AVR, и изменить её никак нельзя.
• Размер ключа. AES128 быстрее для дешифровки, чем AES256. AES192 обычно также медленнее, чем AES256. Это имеет некоторое отношение к тому, что число 192 не может быть получено возведением в степень числа 2.
• Различные другие установки. Например, проверка CRC секции приложения занимает дополнительное время, хотя и небольшое.

Code size (размер кода). При использовании самой высокой оптимизации в настройках компилятора бутлоадер может уместиться в 2 килобайта памяти FLASH. Нужно также иметь в виду, что если не предоставлены ключи шифрования (encryption keys), то бутлоадер будет собран без поддержки AES. Тогда этот апноут может рассматриваться как стандартная система бутлоадера, и она может использоваться на любых микроконтроллерах AVR, в которых аппаратно встроена поддержка технологии бутлоадера (boot loader support, имеется секция BLS).

[Заключение]

Апноут AVR231 представляет метод защищённой передачи данных в микроконтроллер Atmel AVR, у которого есть поддержка технологии бутлоадера (boot loader support, имеется секция BLS). Этот документ также выделил методы, которые должны быть реализованы при создании защищённой (от взлома) системы. Для увеличения защиты разработки на AVR должны быть рассмотрены следующие проблемы.

Реализуйте bootloader, который поддерживает загрузку данных в зашифрованном виде. Когда бутлоадер устанавливается в систему первый раз (во время производства), он должен быть оснащен ключами дешифровки, которые потребуются для последующих обновлений firmware. В этом случае firmware может быть распространено открыто, так как оно зашифровано, и его реальное содержимое недоступно для посторонних глаз.

Используйте биты защиты AVR (lock bits), чтобы скрыть содержимое секции приложения (AS) и секции бутлоадера (BLS). Когда биты защиты установлены для запрета чтения из устройства, то содержимое памяти не может быть получено. Если же биты защиты не установлены, то использование шифрования для обновления firmware бессмысленно, как как содержимое памяти можно свободно прочитать.

Шифруйте firmware перед тем, как его распространять. Зашифрованное программное обеспечение не представляет никакой ценности для посторонних, если у них нет подходящего ключа расшифровки.

Храните ключи шифрования в надежном, недоступном месте. Ключи шифрования должны находиться только в двух местах: в теле булоадера, которое защищено битами защиты, и в лаборатории разработки производителя.

Применяйте цепочечное построение шифрованных данных (Chain encrypt data, CBC). когда шифруемые данные соединены в цепочку, то каждый содержимое каждого зашифрованного блока зависит от результатов шифрования предыдущего блока. Как следствие из этого - одинаковые нешифрованные блоки данных в разных местах будут зашифрованы по-разному. Это значительно затрудняет взлом шифрованных данных, так как очень трудно найти закономерность, которая позволит разгадать ключи шифрования.

По возможности избегайте стандартных, предсказуемых частей кода в firmware. У большинства программ есть общая платформа разработки, и есть любые предсказуемые куски кода. Так, например, таблица векторов прерываний (interrupt vector table) начинается с перехода на малый адрес, что может только помочь взломщику. Также избегайте заполнения неиспользуемых областей памяти одинаковым значением (например, пустые, незаполненные области памяти часто заполняют байтом 0xFF, что делать не рекомендуется).

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

Бутлоадер также может быть использован для очистки секции приложения (AS), если это необходимо. Множество попыток атаки включают извлечение микроконтроллера из рабочего окружения, и включение его в лаборатории взлома. Это можно использовать в бутлоадере для увеличения защищённости - если было детектировано, что LCD не подключен или есть ошибки CRC в памяти, то бутлоадер может начать полное стирание всей памяти (включая секцию бутлоадера и ключи дешифровки).

В приложениях, где нельзя или невозможно использовать внешние коммуникации для обновления, то firmware может быть сохранено в чипах памяти Atmel CryptoMemory®. Память может упакована в виде извлекаемой смарт-карты, которую можно просто вставить в слот устройства, когда нужно провести обновление. Микроконтроллер при старте может проверить наличие CryptoMemory, и получить обновление, если это необходимо.

Используйте защищённую аппаратуру. Протокол устойчивого шифрования бесполезен, если аппаратные средства имеют структурные дефекты. В настоящее время нет никаких проблем безопасности с микроконтроллерами AVR, о которых было сообщено. Прим. переводчика: однако существуют компании, которые предоставляют услуги по считыванию памяти защищённого чипа AVR (у которого установлены биты защиты), см. [1]. Чип при этом становится неработоспособным, но это часто не важно, так как программа считана.

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

• Menezes, Oorschot & Vanstone, Handbook of Applied Cryptography (Настольная книга по прикладной криптографии).
AES Specification site:csrc.nist.gov.
AVR230 DES Bootloader site:atmel.com.
Brian Gladman, AES Implementation Example site:gladman.plushost.co.uk (пример реализации AES на C/C++ и ассемблере).

[Ссылки]

1. Снятие битов защиты кода с памяти микроконтроллеров - ARM, AVR и других, а также чтение кода программы firmware, дизассемблирование site:russiansemiresearch.com.
2. Конечное поле, или поле Галуа site:ru.wikipedia.org.
3. Загрузчики (bootloader) для микроконтроллеров AVR.
4. Программаторы для AVR.
5. Исходный код программ AVR231: AES Bootloader, исходный код crypto boot (бутлоадер AES, который использует USB), документация.
6. Бутлоадер USBasp с XOR-шифрованием.
7. Atmel AVR230: DES Bootloader.

 

Добавить комментарий


Защитный код
Обновить

Top of Page