Atmel AVR231: AES Bootloader |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Бутлоадеры предназначены для самостоятельного обновления пользователями программного обеспечения аппаратуры (firmware). Однако поставляемая в незащищённом виде прошивка может стать причиной взлома, нелегального копирования, кражи секретов компании-разработчика firmware. В этом случае может помочь шифрование кода прошивки. В даташите "Atmel AVR231: AES Bootloader" подробно описан пример такого решения, и его можно довольно просто адаптировать под свои нужды. [Возможности защищенного бутлоадера AES Bootloader] • Удовлетворяет системным возможностям микроконтроллеров Atmel® AVR®, у которых имеется как минимум 1 кбайт SRAM. AES Bootloader: для чего это нужно. Апноут AVR231 описывает, как можно защищённо обновлять firmware для микроконтроллеров AVR с помощью бутлоадера. Метод использует открытый стандарт шифрования Advanced Encryption Standard (AES) для защиты кода firmware. Рис. 1-1. Обзор архитектуры AES Bootloader Пояснения к рисунку: Plaintext открытый, нешифрованный двоичный код 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 Пример типичной процедуры производства и процедуры обновления. Примечания к рисунку: 1. Во время производства микроконтроллер сначала оборудуется бутлоадером, ключами дешифровки и рабочим приложением. Бутлоадер отвечает за прием обновляемого приложения и программирование его в память FLASH микроконтроллера, в то время как ключи нужны для дешифровки приходящих данных. Биты защиты устанавливаются, чтобы защитить незашифрованный код 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. Умножение байта. Алгоритм умножения может быть также описан следующим псевдокодом: bitmask = 1 Multiplicative inverses (множительные инверсии). Чтобы можно было вычислить множительные инверсии мультипликативного поля, т. е. 1/x, в этой реализации применяется определенный трюк. Используя возведение в степень (exponentiation) и логарифм с общим основанием, может быть использовано следующее уравнение: Уравнение 3-1. Использование возведения в степень и логарифма для вычисления 1/x. В этом случае выбрано в качестве основания число 3, поскольку это самый примитивный корень. При использовании умножения конечного поля, когда вычисляются экспоненты и логарифмы, множительная инверсия может быть легко реализована. Вместо вычисления экспонент и логарифмов каждый раз используются две заранее вычисленные таблицы (lookup table). Поскольку мультипликативная инверсия применяется только для подготовки S-бокса, как описано в секции 3.4, то память двух для таблиц может также использоваться для других целей, когда S-бокс уже подготовлен. Вычисление таблицы (lookup table) может быть описано следующим псевдокодом: tempexp = 0 Что такое S-box. Алгоритм AES использует концепцию таблиц замены (substitution table), или коротко S-box. Один из шагов этого алгоритма - получение инвертируемой трансформации (т. е. возможно байт обратно восстановить) байта. S-box является предварительно вычисленным результатом этих трансформаций для каждой возможной величины байта. Трансформация состоит из 2 шагов: (1) мультипликативная инверсия, как она была описана в секции 3.3, и Уравнение 3-2. Линейное преобразование, используемое в S-box. Более близкий взгляд на матрицу показывает, что операция может быть осуществлена как сумма (использующая дополнение 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. Add round key (добавление ключа цикла). Этот шаг использует дополнение XOR для добавления текущего ключа цикла к текущему массиву состояния State. Ключ цикла имеет тот же размер, как и State: 16 байт или 4 слова. Эта операция реализована как цикл из 16 повторов. Рис. 3-3. Добавление ключа цикла к текущему состоянию (State). Substitute bytes (замена байт). Этот шаг использует предварительно вычисленную таблицу (lookup table) S-box для замены байт в State. Как и секция 3.6.1, этот шаг реализован как цикл из 16 повторов. Рис. 3-4. Замена байт текущего состояния (State). Shift rows (сдвиг строк). Этот шаг работает со строками текущего состояния (State). Первая строка остается нетронутой, в то время как остальные три сдвигаются циклически влево один, два и три раза соответственно. Для однократного сдвига влево крайний левый байт перемещается в крайний правый столбец, и остальные три байта сдвигаются на один столбец влево. Процесс показан на рисунке 3-5. Рис. 3-5. Циклический сдвиг строк текущего состояния (State). Самая простая реализация этого шага - написать подпрограмму, которая сдвигает строку влево на одну позицию, и затем вызывать эту подпрограмму нужное количество раз. Однако тесты показывают, что при прямой перетасовке байт, без всяких циклов и подпрограмм, получается тройной выигрыш по скорости (в 3 раза) при небольшом увеличении затрат на место под код. Поэтому была выбрана реализация с прямой перестановкой байт. Для подробностей см. в исходном коде функцию ShiftRows(). Mix columns (перемешивание столбцов). Этот шаг работает с каждым из столбцов State. Каждый столбец рассматривается как вектор из байт, который умножается на фиксированную матрицу, чтобы получить новый столбец модифицированного State. Рис. 3-6. Перемешивание столбцов текущего состояния (State). Операция может быть рассмотрена как уравнение 3-3, где ai это байты перемешанного столбца и bi байты оригинального столбца. Имейте в виду, что дополнение XOR и умножение конечного поля реализовано так, как показано в секциях 3.1 и 3.2. Уравнение 3-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. [Key expansion (распространение ключей)] Под термином "key expansion" подразумевается процесс генерации ключевой последовательности из оригинального 128, 196 или 256-битного ключа шифрования. Алгоритм key expansion показан на рисунке 3-8. Рис. 3-8. Алгоритм key expansion. Алгоритм 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 затем шифруется вместо открытых исходных данных. [Реализация программного обеспечения и описание его применения] В этой секции сначала обсуждаются некоторые важные темы, которые касаются повышения защищённости системы. Эти темы служат мотивом для принятии решений при последующей разработке программного обеспечения. Здесь представлены техники, которые можно использовать для защиты разрабатываемого устройства от несанкционированного внешнего доступа. Несмотря на то, что ни одна разработка не может быть выполнена полностью защищённой, можно сделать её так, что взлом защиты будет максимально сложным, насколько это возможно. Это коренное отличие незащищённого дизайна, с которым взломщик с минимальными техническими знаниями может скопировать разработку, от защищённого, который может взломать только человек с высокой квалификацией. В случае незащищённой разработки она может быть просто скопирована и даже подвергнута реверс-инжинирингу, нарушая интеллектуальную собственность производителя и создавая опасную для него ситуацию на рынке. В случае применения защиты усилия, которые потребуются для взлома, окажутся настолько высоки, что могут заставить потенциального взломщика разработать собственный вариант устройства. Есть только одно правило для создания защищённой системы: она должна быть разработана так, чтобы максимально, как это только возможно, затруднить взлом. При этом нужно иметь в виду, что для взлома могут использоваться любые способы обойти защиту. Далее приведено несколько примеров таких способов (уязвимостей), которые стоит рассмотреть. • Что произойдет, когда отключается питание во время процедуры обновления? Какое будет состояние у микроконтроллера, когда питание снова восстановится? Биты защиты и вектора сброса будут все время установлены правильно? Обзор применения защиты. Эта и последующие секции описывают, как использовать и конфигурировать приложения. Процесс проиллюстрирован рисунком 4-1. Рис. 4-1. Обзор процесса применения защиты. Пояснения к рисунку: Application note апноут, указания по применению (эта статья, AVR231). На рисунке 4-1 описаны следующие основные шаги: • Создание приложения (firmware) для целевого микроконтроллера AVR (прошивка FLASH). Если это необходимо, также в отдельном файле создаются данные и для энергонезависимой памяти (прошивка EEPROM). Кконфигурационный файл. Файл конфигурации содержит список параметров, которые могут быть использованы для конфигурирования проекта. Параметры описаны в таблице 4-1. Таблица 4-1. Опции конфигурационного файла.
Конфигурационному файлу можно дать любое допустимое имя. Это имя позже будет предоставлено как параметр для приложения, которое создает файлы проекта. Ниже приведен пример конфигурационного файла для микроконтроллера Atmel ATmega16. Параметр KEY1 дан для примера в виде простого 128-битного ключа (hex 0123456789ABCDEF0123456789ABCDEF) со вставленными битами четности. PAGE_SIZE = 128 Некоторые параметры не могут быть установлены без знания специфики целевого AVR. Таблица 4-2 суммирует опции конфигурации по применению бутлоадера AES с некоторыми имеющимися в настоящий момент микроконтроллерами AVR, в которых предусмотрена поддержка секции бутлоадера. Для чипов микроконтроллеров, не указанных в этой таблице, пожалуйста обратитесь к его даташиту. Таблица 4-2. Сводная таблица параметров AVR, которые используются для бутлоадера AES.
Программа для компьютера (PC application) – GenTemp. Эта программа генерирует шаблон для файла конфигурации. Она генерирует случайные ключи шифрования и начальные векторы, оставляя другие параметры для заполнения пользователем (как например размер страницы FLASH). Рекомендуется всегда начинать с создания шаблона, используя эту программу. Программа используется следующим образом: gentemp FileName.Ext Программа для компьютера (PC application) – create. Эта программа читает информацию из конфигурационного файла и генерирует файл ключа и заголовочный файл для бутлоадера. Эта программа также шифрует firmware. Обычно эту программу нужно запустить 2 раза: (1) чтобы сгенерировать файлы ключа и заголовка для AES-бутлоадера, и (2) для шифрования нового firmware. Внимание: очень важно, чтобы использовалась одинаковая информация шифрования (из конфигурационного файла), когда генерируются файлы проекта AES-бутлоадера и когда шифруется firmware. Иначе бутлоадер может получить неправильные ключи шифрования и не сможет расшифровать данные. Нужно также принимать во внимание, что можно использовать конфигурационный файл для того, чтобы расшифровать зашифрованное firmware. Поэтому конфигурационный файл нужно хранить в защищённом, недоступном для потенциального взломщика месте, и он не должен модифицироваться после того, как был использован в первый раз для шифрования firmware. В таблице 4-3 показаны допустимые аргументы для командной строки программы create. Таблица 4-3. Обзор опций командной строки программы create.
Первый запус утилиты 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 Шифрованный файл. Как уже было упомянуто, файлы FLASH и EEPROM шифруются и сохраняются в один целевой файл. Однако перед шифрованием данные организуются в записи. Имеется 7 типов записей, как показано на рисунке 4-3. Рис. 4-3. Типы записей выходного зашифрованного файла. Тип записи определяется по первому байту в записи. Данные приложения разбиваются на записи типов 1, 2, 3 и 4 - это erase (очистка), prepare (подготовка), load (загрузка) и write (запись страницы буфера во FLASH). Данные секции EEPROM форматируются в запись типа 5. Биты защиты передаются через запись типа 6. Записи с типами 0 и 7 относятся к окончанию фрейма и окончанию передачи соответственно. Все другие записи, которые имеют идентификаторы выше 7, являются бессмысленными, и они нужны только для запутывания взломщика. Когда опция -n активирована (см. опции командной строки утилиты create), то случайное количество бессмысленных записей будет помещено в случайные места выходного файла. Выходной файл создается, как показано на рисунке 4-4. Рис. 4-4. Создание шифрованного файла. Шаги, которые показаны на рисунке 4-4, выполняют следующие действия: Шаг 1. Данные форматируются в записи, которые выстроены друг за другом после фрейма сигнатуры (SIG). Нуль (Z) добавляется как метка окончания, и фрейм дополняется случайными данными (F) для создания размера фрейма, который кратен 16 байтам. Фрейм записывается в выходной файл и процедура повторяется, пока не будут обработаны все данные. [AVR bootloader AES] Бутлоадер должен находится в целевом AVR перед тем, как устройство будет обновляться шифрованным firmware. Бутлоадер обменивается данными с компьютером PC, и может программировать EEPROM и область кода обновляемой программы (секция приложения AS) FLASH. Бутлоадер, который поставляется с этим апноутом, создается с использованием IAR™ Embedded Workbench, version 3.20c, и может быть портирован на другие компиляторы C. Алгоритм работы бутлоадера иллюстрируется на рисунке ниже. Рис. 4-5. Блок-схема алгоритма работы AES bootloader. Файлы ключа и заголовка. Перед тем, как бутлоадер может быть скомпилирован, нужно настроить несколько параметров. Для этого в папку бутлоадера нужно скопировать файлы ключа шифрования и заголовка (сгенерированные программой create). Эти файлы будут подключены при компиляции (директивой #include) к исходному коду бутлоадера. Файлы проекта. Этот апноут поставляется со специальными файлами проекта, предназначенными для использования со следующими микроконтроллерами: • Atmel ATmega8 Используйте файлы проекта, которые соответствуют Вашему используемому 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. Необходимые настройки компилятора.
В таблице 4-5 приведены некоторые опции компилятора для поддерживаемых в настоящее время микроконтроллеров AVR. Имейте в виду, что адрес начала бутлоадера зависит от установок фьюзов (fuse), как будет показано далее (см. таблицу 4-6). Таблица 4-5. Настройки компилятора для различных поддерживаемых микроконтроллеров AVR.
Примечание: символы __RAMPZ__ и __MEMSPM__ не установлены в какое-либо значение. При необходимости они должны просто быть включены в определенный список символов. Установка бутлоадера. Скомпилируйте бутлоадер и загрузите его в Ваш микроконтроллер AVR с использованием утилиты программирования Atmel AVR Studio® (или другой утилиты для программатора [4]). Перед тем, как запустить бутлоадер, должны быть сконфигурированы следующие биты фьюзов (fuse bits): • Размер секции бутлоадера (Boot Loader Section). Установите фьюзы так, чтобы размер секции соответствовал установке BOOT_SIZE, как было описано ранее. Имейте в виду, что BLS обычно указывается в словах (в единицах по 2 байта), но параметр BOOT_SIZE указывается в байтах. Внимание: пожалуйста уделите особое внимание правильной установке опций тактового генератора. Даже самая незначительная ошибка может привести к тому, что бутлоадер не сможет связаться с программой загрузки на компьютере PC. В таблице 4-6 показаны рекомендуемые установки для фьюзов. См. даташит на микроконтроллер для подробного описания бит фьюзов. Таблица 4-6. Рекомендованные настройки fuse bits.
Примечание: 0 означает, что бит запрограммирован, 1 означает, что бит не запрограммирован. Рекомендуется запрограммировать биты защиты, чтобы защитить код как приложения, так и код бутлоадера (они оба находятся памяти FLASH), однако только после того, как будут установлены биты фьюзов. Биты защиты могут быть запрограммированы с помощью утилиты AVR Studio и подходящего ISP программатора. Биты защиты BLS будут также установлены во время обновления firmware в значение, которое было предоставлено в качестве аргументов командной строки, когда шифровалось firmware. Рекомендуемые установки бит защиты: • Memory lock bits (биты защиты памяти): они должны быть установлены для предотвращения доступа к памяти. Имейте в виду, что после того, как память будет заблокирована, к ней нельзя будет получить доступ через системы программирования (это обычно ISP и JTAG). Для получения доступа придется полностью стереть содержимое памяти микроконтроллера. Внимание: важно понимать, что если неправильно закрыть доступ к памяти, то к её содержимому может быть получен доступ через интерфейс программирования ISP (или JTAG, или через параллельный высоковольтный интерфейс), и вся описываемая в этом апноуте защита с применением шифрования окажется бесполезной. В таблице 4-7 приведены рекомендованные установки бит защиты (lock bit) для имеющихся на сегодняшний день микроконтроллеров AVR. Для получения подробностей см. детальное описание бит защиты в даташите на микроконтроллер. Таблица 4-7. Рекомендуемые значения бит защиты.
[Программа для компьютера PC – update (для обновления firmware)] Это приложение используется для отправки шифрованного файла в обновляемое целевое устройство. Данные могут быть отправлены через последовательный порт PC напрямую в USART микроконтроллера AVR, установленного в целевом устройстве. Алгоритм работы программы показан на рисунке 4-6. Программа Update читает файлы, сгенерированные программой Create. Файл состоит из одного или большего количества соединенных друг с другом фреймов зашифрованных данных. Приложение передает данные фрейм за фреймом, делая паузы при ожидании ответа от бутлоадера. Следующий фрейм будет передан только после приема подтверждения; иначе приложение update будет либо отправлять фрейм заново, либо завершит обмен данными. Приложение update запускается из командной строки. Опции командной строки перечислены в таблице 4-8. Таблица 4-8. Аргументы командной строки программы update.
Пример использования update: update blinky.ext -COM1 -115200 Нужно иметь в виду, что программа update будет обновлять только те части FLASH и EEPROM, которые указаны в файлах приложения firmware и EEPROM. Если в утилите create была разрешена проверка CRC в секции приложения, или выбрана опция очистки (erase), то перед программированием вся память секции приложения (AS) будет очищена. Рис. 4-6. Алгоритм работы программы update. [Hardware setup (настройка аппаратуры)] Перед тем, как зашифрованное firmware может быть отправлена бутлоадеру, необходимо правильно настроить аппаратуру целевого устройства. В этом апноуте предполагается, что в качестве целевой платформы используется Atmel STK®500, и используется кварцевый резонатор на частоту 3.69 МГц. STK500 должен быть сконфигурирован следующим образом: • Подключите STK500 (через коннектор, помеченный как "RS232 CTRL") к компьютеру PC, используя кабель для последовательной передачи данных (serial cable). Подайте питание на STK500. [Производительность] Ниже рассматривается скорость работы системы и её эффективность (system performance) по критериям времени выполнения и размеру кода. Execution Time (время выполнения). Время, которое нужно потратить целевому обновляемому устройству для приема, декодирования и программирования данных, зависит от следующих факторов: • Размер шифрованного входного файла. Чем больше данных, тем дольше длится процесс обновления. 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 (Настольная книга по прикладной криптографии). [Ссылки] 1. Снятие битов защиты кода с памяти микроконтроллеров - ARM, AVR и других, а также чтение кода программы firmware, дизассемблирование site:russiansemiresearch.com. |