Разработка защищенных приложений с устройствами CryptoAuthentication от Microchip

31 августа 2018

интернет вещейMicrochipстатьяинтегральные микросхемысредства разработки и материалы

Компания Microchip представляет методическое руководство-практикум по разработке защищенных приложений передачи данных на базе производимых Microchip устройств серии CryptoAuthentication®. С его помощью вы научитесь работе с соответствующими аппаратными модулями и программными продуктами Microchip. Руководство оформлено как методические указания к лабораторным работам и включает программные листинги, скриншоты и проверочные вопросы.

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

Примеры использования процесса аутентификации:

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

Аппаратные преимущества устройств серии CryptoAuthentication®:

  • уникальный 72-битный серийный номер;
  • калькулятор хэша SHA-256;
  • формирование и проверка MAC-сообщений;
  • хранилище ключей;
  • генератор случайных чисел Crypto Quality;
  • защищенная область для процесса аутентификации между Хостом и Клиентом;
  • монотонные счетчики.

ЗАКАЗАТЬ ОБРАЗЦЫ

Данное практическое руководство описывает использование аппаратных модулей устройств CryptoAuthentication для процесса аутентификации.

Руководство состоит из следующих частей:

  • LAB 1 – «Симметричная аутентификация удаленного устройства»;
  • LAB 2 – «Симметричная аутентификация между двумя устройствами»;
  • LAB 3 – «Асимметричная аутентификация удаленного устройства»;
  • LAB 4 – «Асимметричный обмен ключами с использованием алгоритма шифрования на эллиптических кривых Диффи-Хеллмана».

Аппаратные и программные требования

Аппаратные требования:

  • отладочная плата SAMD21 XplainedPro (ATSAMD21-XPRO) – 2 шт;
  • отладочная плата CryptoAuth Xplained Pro (ATCRYPTOAUTH-XPRO) – 3 шт;
  • кабель USB (Type A-Micro B) – 2 шт;
  • макетные перемычки типа «мама-мама» – 2 шт.

Программные требования:

  • Windows 7 или выше;
  • Atmel® Studio 7 Integrated Development Platform (версия 0.1417 или выше);
  • файлы проекта Crypto Authorization Basics.

1. Аппаратные требования

1.1. Отладочный набор SAM D21 Xplained Pro (ATSAMD21-XPRO)

Требуемое количество: 2.

Отладочный набор SAM D21 Xplained Pro содержит микроконтроллер SAM D21 ARM® Cortex®-M0+ (ATSAMD21G18A-AU, ATSAMD21J18A-AU), который вы будете программировать во время выполнения практической работы. Модуль программирования и отладки уже установлен на плате. Необходимо только подключить плату к персональному компьютеру c запущенной средой разработки Atmel Studio 7 с помощью порта DEBUG USB (рисунок 1).

Рис. 1. Внешний вид отладочной платы SAM D21 Xplained Pro

Рис. 1. Внешний вид отладочной платы SAM D21 Xplained Pro

1.1.1. Обновление программного обеспечения

Проверьте используемые платы SAM D21 Xplained Pro на предмет актуальности ПО встроенного отладчика (EDBG):

Шаг 1. Запустите Atmel Studio 7.

Шаг 2. Подключите плату SAMD21 Xplained Pro к компьютеру, используя порт DEBUG USB.

Шаг 3. Откройте меню “Tools” в Atmel Studio 7 и выберите “Device Programming” (рисунок 2).

Рис. 2. Меню “Tools” в Atmel Studio 7

Рис. 2. Меню “Tools” в Atmel Studio 7

Шаг 4. В выпадающем меню “Tool” выберите “EDBG MSD ATMLxxxxx”. В поле “Device” должно появиться “ATSAMD21xxxx”, а в поле “Interface” – “SWD” (рисунок 3).

Рис. 3. Выпадающее меню “Tool”

Рис. 3. Выпадающее меню “Tool”

Шаг 5. Кликните “Apply”. Если ПО отладчика требуется обновить – появится окно, приведенное на рисунке 4.

Рис. 4. Окно обновления ПО отладчика

Рис. 4. Окно обновления ПО отладчика

Если требуется обновление – нажмите “Upgrade”. Если обновление не требуется – в поле “Device Signature” появится уникальный серийный номер платы, и окно “Device Programming” можно закрыть, нажав “Close” в правом нижнем углу окна.

1.2. Отладочная плата CryptoAuth Xplained Pro Evaluation Board (ATCRYPTOAUTH-XPRO)

Требуемое количество – 3 (две платы с пометкой “HOST” и одна – с пометкой “REMOTE”). Инструкция о том, как из обычной платы ATCRYPTOAUTH-XPRO сделать HOST и REMOTE, находится в приложении С.

CryptoAuth Xplained Pro (рисунок 5) является платой расширения для отладочных плат серий Xplained и Xplained Pro и предназначена для работы с устройствами ATSHA204A, ATAES132A, и ATECC508A.

Рис. 5. Отладочная плата ATCRYPTOAUTH-XPRO

1.3. USB-кабель (тип А-microB)

Требуемое количество – 2.

1.4. Проводник-перемычка

Требуемое количество – 2 (рисунок 6).

Рис. 6. Проводник-перемычка

Рис. 6. Проводник-перемычка

2. Программные требования

2.1. Интегрированная среда разработки программ Atmel® Studio 7

Версия 7.0.1417 или выше.

Web-установщик https://www.microchip.com/development-tools/atmel-studio-7 (рекомендуется).

2.2. Обзор библиотеки Crypto Authentication (CryptoAuthLib)

Компания Microchip предоставляет программную библиотеку на языке Си для реализации интерфейса микроконтроллера с устройствами семейства CryptoAuthentication. Данная библиотека носит название “CryptoAuthLib”, что является акронимом от «Crypto Authentication Library» (“библиотека криптоаутентификации“). Данная библиотека соответствует стандарту ANSI C99. Она содержит слой аппаратной абстракции (HAL), что позволяет с легкостью портировать ее на любой микроконтроллер Microchip. Библиотека http://www.microchip.com/swlibraryweb/product.aspx?product=cryptoauthlib позволяет абстрагироваться от регистров управления модулей I²C и SWI, использующихся для общения с криптомикросхемами.

Основные команды интерфейса библиотеки CryptoAuthLib разделены на три группы и начинаются с основных публичных префиксов:

  • “atcab_” (Atmel Crypto Authentication Basic);
  • “atcah_” (Atmel Crypto Authentication Host);
  • “atcac_” (Atmel Crypto Authentication Crypto).

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

Команды с префиксом atcah реализуют программную симуляцию взаимодействия с криптоустройством. Эти команды предоставляют дополнительный механизм отладки приложений и позволяют симулировать процесс аутентификации в случае отсутствия криптоустройства.

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

2.3. Настройка проекта Crypto Authentication

2.3.1. Распаковка файла проекта

Программный проект предоставляется в архиве SEC.zip  доступном по ссылке. Разархивируйте его содержимое в папку C:/ вашего компьютера. При этом должна появиться папка с именем “SEC” (рисунок 7).

Рис. 7. Первый шаг распаковки файла проекта

Рис. 7. Первый шаг распаковки файла проекта

Чтобы открыть проект, кликните два раза по файлу CryptoAuthentication_Basics.atsln в директории SEC\CryptoAuthentication_Basics (рисунок 8). На некоторых системах открытие проекта может занимать до 30 секунд.

Рис. 8. Второй шаг распаковки файла проекта

Рис. 8. Второй шаг распаковки файла проекта

2.3.2. Atmel Studio 7

После запуска Atmel Studio 7 выглядит следующим образом (рисунок 9):

Рис. 9. Вид экрана Studio 7 после запуска

Рис. 9. Вид экрана Studio 7 после запуска

Перейдите в правое верхнее окно и кликните по вкладке “Solution Explorer”, если она пока неактивна. В ней отображаются все файлы проекта.

Раскройте папку “src” и двойным кликом откройте главный файл проекта main_symmetric.c. Файл будет открыт в виде вкладки с именем “main_symmetric.c” в главном окне (рисунок 10).

Рис. 10. Главный файл проекта main_symmetric.c.

Рис. 10. Главный файл проекта main_symmetric.c.

2.3.3. Открытие модуля Data Visualizer

Модуль Data Visualizer позволяет обмениваться данными с микроконтроллером SAMD21 через последовательный порт во встроенном отладчике. Сначала необходимо подключить плату SAM D21 Xplained Pro к компьютеру с помощью USB-кабеля, используя USB-порт DEBUG. Затем необходимо открыть окно Data Visualizer.

Шаг 1. Подключите плату SAM D21 Xplained Pro через порт DEBUG USB к компьютеру. После этого на плате SAM D21 Xplained Pro будет инициализировано устройство USB serial port.

Шаг 2. Проверьте создание виртуального COM-порта в диспетчере устройств системы. Порт должен называться “EDBGVirtualCOMPort (COMx)”. Запомните номер “x” данного порта (рисунок 11).

Рис. 11. Номер виртуального COM-порта

Рис. 11. Номер виртуального COM-порта

Шаг 3. В главном меню Atmel Studio 7 выберите пункт “Tools”, а затем из выпадающего меню – “Data Visualizer”. В окне “Data Visualizer” должно быть отображено подключенное устройство SAM D21 Xplained Pro.

Шаг 4. Для закрытия окна нажмите “x” в правом верхнем углу панели DGI Control.

Шаг 5. С левой стороны нажмите на галочку с подписью “Configuration” (рисунок 12).

Рис. 12. Конфигурирование модуля Data Visualiser

Рис. 12. Конфигурирование модуля Data Visualiser

Шаг 6. Кликните на “External Connection”, затем двойным кликом откройте панель “Serial Port”. Панель управления “Serial Port Control Panel” откроется справа.

Шаг 7. Убедитесь, что номер порта COM совпадает с номером порта в диспетчере устройств системы. Если номер не совпадает – нажмите на стрелку справа от надписи “Serial Port Control Panel” и выберите корректный номер для порта COM (рисунок 13).

Рис. 13. Выбор корректного номера COM-порта

Рис. 13. Выбор корректного номера COM-порта

Шаг 8. Убедитесь, что настройки порта (скорость, бит четности и стоповый бит) совпадают со значениями на рисунке 13. Убедитесь также, что включены чекбоксы DTR и Open Terminal.

Шаг 9. Кликните на “Connect”. Появится новое окно с названием “Terminal” (рисунок 14).

Рис. 14. Подключение модуля

Рис. 14. Подключение модуля

2.3.4. Проверка подключения модуля Data Visualizer

Следующим этапом добавим тестовые функции вывода информации printf в приложение для проверки правильности работы последовательного интерфейса между терминальным окном Data Visualizer и платой SAM D21 Xplained Pro.

Шаг 1. Кликните по вкладке “main_symmetric.c”.

Шаг 2. Используйте комбинацию клавиш Ctrl + F, чтобы найти комментарий: //Step 1.1.

Шаг 3. Добавьте после комментария приведенный ниже код:

//Step 1.1

printf("CryptoAuthLib Basics Disposable Symmetric Auth\n\r");

Шаг 4. В главном меню “Atmel Studio 7” кликните “Build”, затем выберите “Build CryptoAuthentication_Basics” (рисунок 15).

Рис. 15. Добавление тестовых функций вывода информации

Рис. 15. Добавление тестовых функций вывода информации

Шаг 5. Изучите окно “Output” и убедитесь, что компиляция программы прошла успешно (рисунок 16).

Рис. 16. Проверка успешности компиляции

Рис. 16. Проверка успешности компиляции

Шаг 6. В главном меню “Atmel Studio 7” кликните на символ “Start without debugging”  – запустить программу на выполнение без режима отладки (рисунок 17).

Рис. 17. Запуск выполнения программы

Рис. 17. Запуск выполнения программы

Шаг 7. Кликните на вкладку терминала Data Visualizer.

Шаг 8. На плате SAM D21 Xplained нажмите клавишу RESET.

Шаг 9. Убедитесь, что в терминальном окне появилось сообщение (рисунок 18).

Рис. 18. Завершение проверки подключения модуля

Рис. 18. Завершение проверки подключения модуля

3. LAB 1. Симметричная аутентификация удаленного устройства

3.1. Обзор

Симметричная аутентификация – это процесс типа «задание-ответ». Во время этого процесса хост проверяет удаленное устройство – аксессуар или расходный материал – на предмет его оригинальности и возможности доверять этому устройству (например, батарее питания или картриджу для принтера). Содержимое ответа от тестируемого устройства должно совпадать со значением, которое ожидает получить хост.

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

Главный вопрос, с которым сталкивается разработчик такого типа устройств – это как загрузить и безопасно хранить секретные данные и в удаленном устройстве, и в устройстве-хосте.

Решением в этом случае выступает использование отдельного безопасного хранилища ключей – устройства, которое хранит общий ключ и уникальный серийный номер. В этой работе в качестве такого хранилища используется криптомикросхема ECC508A.

В данном практикуме эмулируется работа системы, которая содержит:

  • хост-устройство, состоящее из микроконтроллера и защитного крипто-устройства для авторизации ECC508A;
  • удаленное устройство, состоящее только из крипто-устройства ECC508A (без микроконтроллера).

Микросхемы ECC508A для обоих устройств – хоста и удаленного устройства – были предварительно запрограммированы  и содержат общий секретный ключ и уникальный серийный номер (рисунок 19).

Рис. 19. Структурная схема эмулируемой системы

Рис. 19. Структурная схема эмулируемой системы

3.2. Процесс аутентификации

Аутентификация начинается с того, что хост запрашивает серийный номер у удаленного устройства. Затем он отправляет случайное число, которое должно пройти процесс хеширования с секретным ключом на стороне удаленного устройства. Данный процесс называется заданием (challenge), так как хост тестирует удаленное устройство на правильность ответа (рисунок 20).

Рис. 20. Хост тестирует удаленное устройство на правильность ответа

Рис. 20. Хост тестирует удаленное устройство на правильность ответа

Удаленное устройство хэширует случайное число, принятое от хоста с общим секретным ключом и со своим уникальным серийным номером, и отправляет результат данной операции обратно хосту. Данное обратное сообщение называется кодом аутентификации сообщения или MAC-сообщением (Message Authentication Code, MAC).

Хост выполняет аналогичную операцию: хэширует на своей стороне общий секретный ключ, серийный номер, полученный от удаленного устройства, и случайное число, которое было отправлено удаленному устройству. Хост сравнивает результат операции хэширования с принятым от удаленного устройства MAC-сообщением. Если значения совпадают – задание успешно решено и хост может доверять внешнему устройству.

3.3. Настройка проекта

3.3.1. Проект Cryptograph Authentication

Если Вы еще не выполнили действия, описанные в пункте 2.3, то сейчас – самое время.

3.3.2. Аппаратные требования

Для выполнения данной работы понадобятся:

  1. отладочная плата SAM D21 Xplained Pro – 1 шт;
  2. отладочная плата CryptoAuth Xplained Pro – 2 шт;
  3. кабель USB (Type A – Micro B) – 1 шт.
3.3.3 Подключение плат CryptoAuth Xplained Pro

Шаг 1. Отключите от платы SAMD21Xplained Pro сначала USB-кабель, а затем – платы CryptoAuth Xplained Pro.

Шаг 2. Подключите плату CryptoAuth Xplained Pro с отметкой “HOST” к порту EXT1 платы SAM D21 Xplained Pro.

Шаг 3. Подключите плату CryptoAuth Xplained Pro с отметкой “REMOTE” к порту EXT2 платы SAM D21 Xplained Pro.

Шаг 4. Подключите USB-кабель к порту DEBUG USB и компьютеру (рисунок 21).

Рис. 21. Подключение плат CryptoAuth Xplained Pro

Рис. 21. Подключение плат CryptoAuth Xplained Pro

3.4. Написание программного кода

Теперь перейдем к реализации программного кода.

Шаблон приложения содержится в заготовленном проекте. Из данного шаблона вы создадите сегменты кода для выполнения работы. Полученный в результате код может быть использован для разработки ваших собственных проектов.

Вы познакомитесь с несколькими API-командами, которые являются частью библиотеки CryptoAuthLib. Библиотека делает процесс разработки кода для криптоустройств намного проще, предоставляя удобный программный интерфейс для работы с регистрами настройки криптоустройств.

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

  • настройка интерфейса коммуникации I²C с хостом ECC508A;
  • инициализация интерфейса коммуникации I²C с хостом ECC508A;
  • чтение уникального серийного номера хоста ECC508A;
  • настройка интерфейса коммуникации I²C с удаленным устройством ECC508A;
  • инициализация интерфейса коммуникации I²C с удаленным устройством;
  • чтение уникального серийного номера удаленного устройства ECC508A.

Допускается и рекомендуется добавлять в исходный код собственные комментарии, которые будут способствовать успешному освоению криптоустройств.

3.4.1. Настройка интерфейса коммуникации Хоста ECC508A

На этом этапе будет написан код, настраивающий интерфейс I²C для коммуникации с хостом ECC508A на плате CryptoAuth Xplained Pro. I²C-адрес микросхемы ECC508A на данной плате был предварительно установлен в значение 0xC2.

Программный код библиотеки CryptoAuthLib для микроконтроллера хоста должен быть инициализирован с определенной информацией о хосте ECC508A, чтобы обеспечить возможность корректного обмена данными.

Функция atcab_init() выполняет данную операцию и может использоваться повторно для смены адреса I²C при использовании API для работы с несколькими I²C-устройствами.

В качестве аргументов функция atcab_init() принимает структуру с конфигурационными параметрами.

Приведенный ниже код инициализирует структуру в файле main_symmetric.c, которая позже передается в функцию atcab_init().

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. Пользуясь поиском (Ctrl + F), найдите комментарий: //Step 1.2.

Шаг 3. Ниже комментария добавьте следующий код:

//Step 1.2

ATCAIfaceCfg cfg_ateccx08a_i2c_host = {

.iface_type = ATCA_I2C_IFACE,

.devtype = ATECC508A,

.atcai2c.slave_address = 0xC2,

.atcai2c.bus = 2,

.atcai2c.baud = 100000,

.wake_delay = 1500,

.rx_retries = 20

};
3.4.2. Ожидание нажатия кнопки SW0

Теперь необходимо написать сегмент кода, в котором будет реализовано ожидание нажатия кнопки SW0, расположенной рядом с кнопкой RESET возле USB-портов. Данное действие будет использоваться для инициализации микросхемы ECC508A и запуска процесса аутентификации. Обратите внимание, что функция atcab_init() использует конфигурационную структуру, добавленную на предыдущем шаге. Для обращения к ECC508A все библиотечные вызовы будут использовать установленный в функции atcab_init() адрес I²C.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. Пользуясь поиском (Ctrl + F), найдите комментарий: //Step 1.3;

Шаг 3. Ниже комментария добавьте следующий код:

//Step 1.3

printf("Press SW0 button to authenticate\n\r");

while(port_pin_get_input_level(BUTTON_0_PIN) == SW0_INACTIVE);

printf("Authentication in progress\n\r");

volatile ATCA_STATUS status;

status = atcab_init( &cfg_ateccx08a_i2c_host );

CHECK_STATUS(status);

printf("Device init complete\n\r");
3.4.3. Тестовая компиляция 1

Шаг 1. На панели инструментов Atmel Studio 7 кликните кнопку  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0 и убедитесь, что в терминальном окне появилось сообщение (рисунок 22).

Рис. 22. Сообщение о тестовой компиляции 1 в терминальном окне

Рис. 22. Сообщение о тестовой компиляции 1 в терминальном окне

3.4.4. Чтение уникального серийного номера хоста

Давайте ознакомимся с API-командами библиотеки CryptoAuthLib. Среди общего перечня найдите API-команду для чтения серийного номера (read device serial number). Искать следует в файле atca_basic.h. Этот файл можно найти внутри проекта с помощью окна Solution Explorer в директории “src/atcal/basic”. Найдите функцию, наиболее подходящую для чтения серийного номера.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 1.4.

Шаг 3. Добавьте следующий код:

//Step 1.4

uint8_t serial_number[ATCA_SERIAL_NUM_SIZE];

status = atcab_read_?????????????((uint8_t*)&serial_number);

CHECK_STATUS(status);

printf("Serial Number of host\r\n");

print_bytes((uint8_t*)&serial_number, 9);

printf("\r\n");

Шаг 4. Замените “atcab_read_?????????????” полным именем функции для чтения серийного номера, найденным ранее.

Подсказка: Для помощи можно использовать приложение A.1.

3.4.5. Тестовая компиляция 2

Шаг 1. На панели инструментов Atmel Studio 7 кликните по кнопке  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0 и убедитесь, что в терминальном окне появилось сообщение (рисунок 23).

Рис. 23. Сообщение о тестовой компиляции 2 в терминальном окне

Рис. 23. Сообщение о тестовой компиляции 2 в терминальном окне

Серийный номер устройства представлен в следующем формате (таблица 1).

Таблица 1. Серийный номер устройства

Байт 0 Байт 1 Байт 2 Байт 3 Байт 4 Байт 5 Байт 6 Байт 7 Байт 8
0x01 0x23 xx xx xx xx xx xx 0xEE

Байты 0, 1 и 8 записываются при производстве на фабрике Microchip. Эти байты будут одинаковыми для всех стандартных устройств. При заказе дополнительной услуги массового программирования устройств на фабрике Microchip данные байты могут быть изменены по требованию. Байты 2…7 – уникальны для каждого устройства серии Crypto Authentication.

3.4.6. Настройка интерфейса коммуникации удаленного устройства ECC508A

Напишите конфигурационную структуру для настройки интерфейса удаленного устройства ECC508A. Этот сегмент кода очень похож на написанный ранее для хоста ECC508A. I²C-адрес микросхемы ECC508A на плате CryptoAuth Xplained Pro с пометкой REMOTE был предварительно установлен в значение 0xC0.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. Воспользуйтесь поиском и найдите комментарий: //Step 1.5.

Шаг 3. Добавьте после комментария приведенный ниже код:

//Step 1.5

ATCAIfaceCfg cfg_ateccx08a_i2c_remote = {

.iface_type = ATCA_I2C_IFACE,

.devtype = ATECC508A,

.atcai2c.slave_address = 0xC0,

.atcai2c.bus = 2,

.atcai2c.baud = 100000,

.wake_delay = 1500,

.rx_retries = 20

};
3.4.7. Чтение уникального серийного номера удаленного устройства

Добавьте сегмент кода, который инициализирует чтение уникального серийного номера удаленного устройства ECC508A.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В коде найдите комментарий: //Step 1.6.

Шаг 3. Добавьте следующий код после комментария:

//Step 1.6

status = atcab_init( &cfg_ateccx08a_i2c_remote );

CHECK_STATUS(status);

status = atcab_read_serial_number((uint8_t*)&serial_number);

CHECK_STATUS(status);

printf("Serial Number of remote\r\n");

print_bytes((uint8_t*)&serial_number, 9);

printf("\r\n");
3.4.8. Тестовая компиляция 3

Шаг 1. На панели инструментов Atmel Studio 7 кликните по кнопке  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0 и убедитесь, что в терминальном окне появилось приведенное ниже сообщение (рисунок 24). Проверьте, что серийные номера устройств REMOTE и HOST отличаются.

Рис. 24. Серийные номера устройств REMOTE и HOST должны отличаться

Рис. 24. Серийные номера устройств REMOTE и HOST должны отличаться

3.4.9. Заключение

В данной работе вы настроили микроконтроллер для коммуникации с двумя криптоустройствами – локальным (HOST) и удаленным (REMOTE), а также написали код для чтения уникального серийного номера обоих устройств.

В следующей секции вы добавите код для аутентификации удаленного устройства.

3.5. Аутентификация удаленного устройства

После окончания передачи данных по I²C-интерфейсу устройствам HOST и REMOTE можно переходить к процессу аутентификации.

В этой секции работы вы осуществите:

  • формирование устройством HOST случайного числа NONCE;
  • формирование устройством REMOTE-сообщения с кодом аутентификации;
  • проверку устройством HOST принятого от REMOTE кода аутентификации.
3.5.1. Генерация случайного числа NONCE

Задачей данного этапа работы является формирование сообщения, которое позволит хост-устройству аутентифицировать удаленное устройство. В первую очередь хост-устройство должно сгенерировать случайное число – NONCE. Термин “NONCE, Number Used Once, переводится как “однократно используемое число”. Для этой цели мы будем использовать очень большое случайное число. Главным свойством большого случайного числа является то, что оно никогда и ни при каких условиях не может быть воспроизведено снова. Число NONCE будет использовано в качестве одноразового задания для аутентификации удаленного устройства.

Заметьте, что если задание для аутентификации удаленного устройства будет использовано повторно (будет использовано не NONCE) – тогда правильный код аутентификации (MAC-сообщение) от удаленного устройства может быть скопирован хакером, следящим за шиной. Хакер может использовать этот код в качестве ответа в будущем, когда хост снова отправит это же задание для аутентификации.

Откройте файл atca_basic.h внутри библиотеки CryptoAuthLib и найдите функцию для генерации случайного числа. Файл atca_basic.h может быть найден с помощью окна Solution Explorer в директории “src/atcal/basic”.

Подсказка: это не функция, начинающаяся с «atcab_nonce..()». Команды «NONCE» являются командами ввода и предназначены для загрузки значений в ECC508A. В нашем же случае необходимо прочитать случайное число из ECC508A для использования в нашей программе.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В коде найдите комментарий: //Step 1.7.

Шаг 3. Добавьте после комментария следующий код:

//Step 1.7

uint8_t nonce[32];

status = atcab_??????((uint8_t*)&nonce);

CHECK_STATUS(status);

printf("Random from host\r\n");

print_bytes((uint8_t*)&nonce, 32);

Шаг 4. Замените “atcab_??????” на найденную ранее функцию генерации случайного числа.

Подсказка: Если Вам необходима помощь в определении корректного названия функции, воспользуйтесь приложением A.2.

Примечание: Обратите внимание, что случайное число сохраняется в переменной с именем “nonce”.

3.5.2. Тестовая компиляция 4

Шаг 1. На панели инструментов Atmel Studio 7 кликните по кнопке  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0 и убедитесь, что в терминальном окне появилось приведенное ниже сообщение. Убедитесь, что каждый раз при нажатии кнопки SW0 на экран выводится новое случайное число (рисунок 25).

Рис. 25. Каждый раз при нажатии кнопки SW0 на экран выводится новое случайное число

Рис. 25. Каждый раз при нажатии кнопки SW0 на экран выводится новое случайное число

3.5.3. Генерация кода аутентификации удаленного устройства

Теперь сгенерированное случайное число может быть отправлено на удаленное устройство ECC508A в качестве задания. Серийный номер, случайное число (задание) и секретный ключ (внутри ECC508A) будут использоваться в качестве входных аргументов для хеширования по алгоритму SHA256. Процесс хеширования запускается MAC-командой в ECC508A. Каждое новое число, добавляемое к сообщению для хеширования, меняет результирующее MAC-сообщение. Добавление уникального серийного номера к хешированию в результате даст MAC-сообщение, которое может быть сгенерировано только одним уникальным устройством. Случайное число делает каждое новое MAC-сообщение от одного устройства отличным от предыдущего, благодаря этому хост может определить актуальность ответа от удаленного устройства. Включение секретного ключа позволяет хосту определить, верный ли ключ содержит удаленное устройство (рисунок 26).

Рис. 26. Алгоритм процесса хеширования

Рис. 26. Алгоритм процесса хеширования

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В коде найдите комментарий: //Step 1.8.

Шаг 3. Добавьте после комментария следующий код:

//Step 1.8

uint8_t mac[32];

uint8_t slot = 0;

uint8_t mode = (1<<6); // include serial number

status = atcab_???(mode, slot, (const uint8_t*)&nonce, (uint8_t*)&mac);

CHECK_STATUS(status);

printf("MAC from remote\r\n");print_bytes((uint8_t*)&mac, 32);

Подсказка: Если Вам необходима помощь в определении корректного имени функции, смотрите приложение A.3.

Примечание: Результат выполнения команды заносится в переменную с именем “mac”.

Рассмотрим подробнее команду, приведенную в файле atca_basic.h и используемую для генерации MAC-сообщения:

ATCA_STATUS atcab_???( uint8_t mode,

uint16_t key_id,

const uint8_t* challenge,

uint8_t* digest );
  • Первый аргумент — mode — это входной параметр, который определяет, какие именно поля внутри устройства используются в сообщении для хеширования. Обратимся к таблице 9-34 из документации на ECC508A (таблица 2).

Таблица 2. Таблица 9-34 из документации на ECC508A

Bits Meaning
7 Must be zero.
6 0 = 48 Message bits corresponding to SN and SN are set to zero.
1 = Include the 48 bits SN and SN in the message.
5-3 Must be zero.
2 If either Mode or Mode are set, Mode must match the value in TempKey.SourceFlag or the command will return an error.
1 0 = The first 32 bytes of the SHA message are loaded from one of the data slots.
1 = The first 32 bytes are filled with TempKey.
0 0 = The second 32 bytes of the SHA message are taken from the input challenge parameter.
1 = The second 32 bytes are filled with the value in TempKey. This mode is recommended for all use.

Из таблицы 9-34 выбираем режим “mode” 0x40. В данном режиме серийный номер удаленного устройства будет включен в сообщение. Он дает возможность идентифицировать каждое удаленное устройство. Например, если в роли удаленных устройств выступают электронные лотерейные билеты, то серийный номер совместно с секретным ключом будут и доказательством подлинности билета, и подтверждением его выигрыша или проигрыша.

  • Второй аргумент – key_id – также входной параметр. Здесь мы указываем удаленному ECC508A использовать защищенный общий ключ, хранящийся в области памяти slot0. Ключ был предварительно загружен в устройство для выполнения этой работы ранее.
  • Третий аргумент – challenge – входной параметр. Он может быть статичным, выбираться из определенного набора или быть уникальным для каждого вызова. Использование случайного значения challenge обеспечивает наилучший уровень защиты. Мы будем использовать массив nonce[]. Этот массив содержит случайное число, сгенерированное хостом ECC508A.
  • Четвертый аргумент – digest – выходной параметр. Содержит код аутентификации, или, по-другому, MAC-сообщение (Message Authentication Code). Мы используем указатель на 32-байтный массив с именем mac[] для хранения этой переменной.
3.5.4. Тестовая компиляция 5

Шаг 1. На панели инструментов Atmel Studio 7 кликните по кнопке  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0 и убедитесь, что в терминальном окне появилось приведенное, сообщение, изображенное на рисунке 27.

Рис. 27. Сообщение тестовой компиляции 5 в терминальном окне

Рис. 27. Сообщение тестовой компиляции 5 в терминальном окне

Убедитесь, что при нажатии кнопки SW0 на экран выводится MAC-сообщение. Нажмите SW0 несколько раз и убедитесь, что MAC-сообщение изменяется каждый раз. Подумайте, почему? Вспомните о входных данных для формирования MAC-сообщения.

3.5.5. Проверка кода аутентификации удаленного устройства

Теперь, после получения хостом MAC-ответа от удаленного устройства на отправленную ранее задачу, пришло время аутентифицировать MAC-ответ.

Хосту необходимо проверить, что полученное MAC-сообщение было рассчитано корректно.

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

Поэтому для проверки мы будем использовать специальную команду CheckMac, которая проверяет MAC-сообщение от другого устройства, но не раскрывает значение MAC хосту.

Если бы MAC-сообщение раскрывалось, тогда любое устройство ECC508A могло бы «притвориться» любым другим, так как серийный номер устройства является входным аргументом для расчета MAC-сообщения (вспомните пример электронного лотерейного билета).

Команда CheckMac проверяет MAC-ответ, принятый от другого устройства, на соответствие рассчитанному MAC-сообщению. Функция CheckMac возвращает только информацию о статусе операции сравнения – успешно или нет.

Мы будем использовать функцию atcab_checkmac(). Из файла atca_basic.h видно, что эта функция содержит несколько аргументов:

ATCA_STATUS atcab_checkmac(uint8_t mode,

uint16_t key_id,

const uint8_t *challenge,

const uint8_t *response,

const uint8_t *other_data);

Функция CheckMac заполняет буфер сообщения внутри ECC508A. Буфер сообщения является входом для вычислительного узла SHA-256. Если вам известно содержимое буфера сообщения, вы можете рассчитать результат применения алгоритма SHA-256 любым внешним средством, например, программным калькулятором SHA-256, и получить такой же результат, какой вычисляется внутри ECC508A (рисунок 28).

Рис. 28. Результат применения алгоритма SHA-256

Рис. 28. Входные данные для расчета хэша SHA-256

  • Первый аргумент функции – это режим (mode). Этот входной аргумент определяет, какие именно битовые поля будут использованы в сообщении. Рассмотрим таблицу 9-10 из документации на ECC508A (таблица 3).

Таблица 3. Таблица 9-10 из документации на ECC508A

  Name Size Notes
Param1 Mode 1 Bits 7-3: Must be zero.
Bit 2: If Mode <0> or Mode <1> are set, then the value of this bit must match the value in TempKey. SourceFlag or the command will return an error.
Bit 1: 0 = Use Slot <KeyID> in first SHA block.
1 = Use TempKey.
Bit 0: 0 = The second 32 bytes of the SHA message are taken from the input ClientChal parameter.
1 = The second 32 bytes of the message are taken from TempKey.

Для функции atcab_checkmac() мы установим режим 0x00. Рассматривая таблицу 3, обратите внимание на то, каким образом входной параметр ClientChal включен в буфер сообщения.

  • Второй аргумент – это идентификатор ключа (key_id). Это также входной параметр. Он указывает хосту ECC508A использовать общий ключ, расположенный в слоте 0 памяти устройства, который был предварительно записан в устройство для выполнения этой работы.
  • Третий аргумент – это задание (challenge), которое также является входным параметром. Оно соответствует значению ClientChal (рисунок 28) и представляет собой случайное число, которое было сгенерировано и отправлено удаленному устройству в качестве задачи в теле массива nonce[].
  • Четвертый аргумент – это ответ, он также является входным параметром. Это значение MAC-ответа, полученного от удаленного устройства, представляющее собой результат хеширования SHA-256, выполненного на стороне удаленного устройства.
  • Пятый аргумент – это дополнительные данные (other_data) (входной параметр). Рассмотрим его подробнее.

Согласно документации на ECC508A, размер поля other_data составляет 13 байт.

Наша задача – чтобы хост ECC508A воспроизвел тот же результат хеширования SHA-256, что был получен на стороне удаленного ECC508A. Для этого необходимо, чтобы буфер сообщения CheckMac на стороне хоста совпадал со значением аналогичного буфера на стороне удаленного устройства. Представим буферы каждого из устройств в виде массива байтов. Необходимо, чтобы сообщение byte[n] на стороне клиента совпадало с сообщением byte[n] на стороне хоста для всех n байтов сообщения. Для этого обратимся к документации ECC508A и проверим порядок переменных, которые были хешированы на стороне удаленного устройства с использованием функции atcab_mac() (рисунок 29).

Рис. 29. Проверка порядка переменных

Рис. 29. Порядок переменных для хэширования на стороне удаленного устройства

Теперь сравним данный порядок переменных с тем порядком, который будет использован при хешировании на стороне хоста в функции atcab_checkmac() (рисунок 30).

Рис. 30. Сравнение порядков переменных

Рис. 30. Порядок переменных для хэширования на стороне хоста

В таблице 4 представлено соответствие байтовых полей и байтов команд MAC и CheckMac

Одним и значений, которое необходимо дополнительно добавить в сообщение CheckMac, является серийный номер удаленного устройства. Вернитесь к предыдущим сообщениям терминального окна Data Visualizer, где выводился серийный номер удаленного устройства. Обратите внимание на порядок байтов в выведенном на экран серийном номере удаленного устройства. В таблице 4 показано, что SN соответствует переменной serial_number в нашем исходном коде, выведенном в терминал. В последней строке таблицы приведен пример того, как выровнять данные массива otherdata[].

Как видите, для соответствия двух сообщений SN[2] должно быть загружено в Otherdata[11], а SN[3] – в Otherdata[12]. В следующем упражнении необходимо корректно установить все байты массива otherdata[].

Таблица 4. Соответствие байтовых полей команд MAC и CheckMac

bytes MAC CheckMac Value
32 key[KeyID] key[KeyID]
32 Nonce Nonce
1 Opcode Otherdata[0] 0x08
1 Mode Otherdata[1] 0x40
2 Param2 Otherdata[2:3] 0x00, 0x00
8 Zeros Zeros
3 Zeros Otherdata[4:6] 0x00, 0x00, 0x00
1 SN[8] SN[8]
4 SN[4:7] Otherdata[7:10] 0xd6, 0x2c, 0xa5, 0x71
2 SN[0:1] SN[0:1]
2 SN[2:3] Otherdata[11:12] 0x55, 0x64

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В коде найдите комментарий: //Step 1.9.

Шаг 3. Добавьте после комментария следующий код:

//Step 1.9

status = atcab_init( &cfg_ateccx08a_i2c_host );

uint8_t otherdata[CHECKMAC_OTHER_DATA_SIZE];

memset(otherdata, 0x00, CHECKMAC_OTHER_DATA_SIZE);

otherdata[0] = 0x08;

otherdata[1] = ?????

otherdata[7] = ?????

otherdata[8] = ?????

otherdata[9] = ?????

otherdata[10] = ?????

otherdata[11] = serial_number[2];

otherdata[12] = serial_number[3];

mode = 0;

status = atcab_checkmac(mode,

slot,

(const uint8_t*)&nonce,

(const uint8_t*)&mac,

(const uint8_t*)&otherdata);

if(status == ATCA_SUCCESS) {

printf("Authenticated by host\r\n\r\n");

}

else {

printf("Failed to authenticate\r\n\r\n");

}

Шаг 4. Используя таблицу соответствия байтовых полей (таблица 4), определите, каким образом должны быть помещены байты переменных serial_number[] и mode в массив otherdata, чтобы соответствовать сообщению “MAC”. Обратите внимание на переменные otherdata[11] и [12] в исходном коде – они помогут вам правильно переместить остальные области.

Подсказка: Для помощи в выполнении данного пункта обратитесь к приложению A.4.

3.5.6. Тестовая компиляция 6

Шаг 1. На панели инструментов Atmel Studio 7 кликните по кнопке  «Запустить без отладки» (“Start without debugging”).

Шаг 2. Кликните по терминальному окну Data Visualizer.

Шаг 3. Нажмите кнопку SW0. В терминальном окне появится сообщение (рисунок 31). Убедитесь, что MAC-сообщение от клиента было аутентифицировано хостом.

Рис. 31. Аутентификация MAC-сообщения хостом

Рис. 31. Аутентификация MAC-сообщения хостом

3.5.7. Заключение

Поздравляем! Вы успешно провели авторизацию клиента.

Напомним основные этапы этой работы:

  • инициализация I²C-интерфейса ECC508A на стороне хоста;
  • инициализация I²C-интерфейса ECC508A на стороне клиента;
  • запрос хостом уникального серийного номера клиента;

генерация с помощью ECC508A на стороне хоста случайного числа, которое было использовано как задание для клиента;

  • использование случайного числа на стороне клиента для формирования MAC-сообщения при выполнении функции atcab_mac() на ECC508A;
  • верификация MAC-сообщения на стороне хоста выполнением функции atcab_checkmac() на ECC508A.

4. LAB 2. Симметричная аутентификация между двумя устройствами

4.1. Обзор

Здесь будет эмулирована работа системы, в которую входят:

  • устройство “A”, состоящее из микроконтроллера и защищенного криптоустройства ECC508A;
  • устройство “B”, состоящее из микроконтроллера и защищенного криптоустройства ECC508A.

Оба криптоустройства ECC508A были предварительно настроены и содержат одинаковый секретный ключ для выполнения данной работы (смотреть приложение C) (рисунок 32).

Рис. 32. Структурная схема системы для изучения симметричной аутентификации

Рис. 32. Структурная схема системы для изучения симметричной аутентификации

В данной работе микроконтроллеры будут обмениваться данными по UART-интерфейсу, однако в реальном приложении это может быть абсолютно любой проводной или беспроводной интерфейс передачи данных.

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

Один и тот же код будет использоваться для программирования каждого микроконтроллера.

4.2. Процесс аутентификации

Аутентификация между двумя микроконтроллерами (МК) будет проходить почти так же, как в системе с одним МК и двумя ECC508А. Однако теперь серийный номер, задание и MAC-сообщение должны будут передаваться от платы к плате с помощью физического интерфейса (рисунок 33).

Рис. 33. Схема процесса симметричной аутентификации

Рис. 33. Схема процесса симметричной аутентификации

Как указывалось выше, для каждой из отладочных плат будет использован один и тот же код .

Каждый раз при написании и компиляции нового сегмента кода необходимо обновлять программу в обеих платах для корректного обмена данными между ними.

4.3. Настройка проекта

4.3.1. Проект Cryptograph Authentication

Следуйте указаниям, приведенным в пункте 2.3 для настройки проекта Crypto Authentication Project. Если вы уже выполнили разделы 2 и 3, то можете продолжить подготовку проекта с любого пункта, на котором остановились.

4.3.2. Аппаратные требования

Для выполнения данной работы понадобятся:

  • отладочная плата SAM D21 Xplained Pro – 2 шт;
  • отладочная плата CryptoAuth Xplained Pro – 2 шт;
  • кабель USB (Type A – Micro B) – 2 шт;
  • макетные перемычки типа «мама-мама» – 2 шт.
4.3.3. Подключение плат CryptoAuth Xplained Pro

Шаг 1. Отключите от обеих плат SAMD21Xplained Pro сначала USB-кабели, а затем – платы CryptoAuth Xplained Pro.

Шаг 2. Подключите плату CryptoAuth Xplained Pro с маркировкой “HOST” к первой плате SAM D21 Xplained Pro в порт EXT1.

Шаг 3. Подключите плату CryptoAuth Xplained Pro с маркировкой “HOST” ко второй плате SAM D21 Xplained Pro в порт EXT1.

Шаг 4. Подключите макетные перемычки, как показано на рисунке 34.

Рис. 34. Подключение плат CryptoAuth Xplained Pro

Рис. 34. Подключение плат CryptoAuth Xplained Pro

Вывод PB13 на каждой плате SAM D21 Xplained Pro подключается к выводу PA10 на соседней плате. Таким образом, вывод передатчика UART TX подключается к входу приемника UART RX соседней платы.

Шаг 5. Подключите каждую плату к компьютеру с помощью USB-кабеля через порт DEBUG USB.

4.4. Написание программного кода

Для дальнейшего выполнения работы необходимо закончить выполнение работы «LAB 1». Симметричная аутентификация удаленного устройства».

4.4.1. Подготовка проекта

Добавим код для запроса NONCE-числа от соседней платы при нажатии кнопки “SW0” (в соответствии с последовательностью обмена данными, приведенной в разделе 4.2.).

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В коде найдите комментарий: //Step 2.1.

Шаг 3. Добавьте после комментария следующий код:

//Step 2.1

#define ENABLE_MODULE_2

Шаг 4. Найдите в коде комментарий: //Step 2.2.

Шаг 5. Добавьте после комментария следующий код:

//Step 2.2

symmetric_auth_comm();

Шаг 6. Закомментируйте вызов функции symmetric_auth(), как показано ниже:

//symmetric_auth();

Шаг 7. В главном меню Atmel Studio 7 кликните на символ  “Start without debugging” – «Запустить программу на выполнение без режима отладки».

Шаг 8. Убедитесь, что в окне “Output выведено сообщение об успешной компиляции проекта.

Наблюдение: Запишите серийный номер, расположенный рядом с символом  в главном меню Studio7.

 4.4.2. Программирование двух плат SAM D21 Xplained Pro

В этой работе задействованы две платы SAM D21 Xplained Pro, которые подключены к одному компьютеру с одной средой разработки Atmel Studio 7. Каждый раз при написании и компиляции нового участка кода необходимо загружать новую программу в головной МК на каждой плате.

Перечень шагов для выбора платы SAM D21 Xplained Pro board, которая будет запрограммирована:

Шаг 1. В главном меню Atmel Studio 7 кликните на кнопку с изображением молотка для открытия страницы со свойствами платы SAM D21 Xplained Pro (рисунок 35).

Рис. 35. Выбор платы для программирования

Рис. 35. Выбор платы для программирования

Шаг 2. Кликните по пункту “Tool” в меню слева.

Шаг 3. Кликните по выпадающему списку под пунктом активного отладчика “Selected debugger/programmer”.

В выпадающем меню будут отражены серийные номера подключенных плат SAM D21 Xplained Pro. Серийные номера плат также приведены на специальном стикере на тыльной стороне каждой платы (рисунок 36).

Рис. 36. Выбор платы для программирования

Рис. 36. Стикер с серийным номером платы

Плата, серийный номер которой приведен в самом начале выпадающего списка, является активной и будет запрограммирована при нажатии символа  – “Start without debugging” («Запустить программу на выполнение без режима отладки»). Серийный номер активной отладки также отображается рядом с символом  в главном меню Atmel Studio7 (рисунок 37).

Рис. 37. Запуск выполнения программы без отладки

Рис. 37. Запуск выполнения программы без отладки

При нажатии клавиши  “Start without debugging” будет запрограммирована именно та плата, номер которой выводится рядом с символом  .

4.4.3. Программирование устройства «B»

Шаг 1. Выберите другую плату SAM D21 Xplained Pro, используя последовательность действий, описанную выше в разделе 4.4.2.

Шаг 2. В главном меню Atmel Studio 7 кликните на символ  – «Запустить программу на выполнение без режима отладки».

Наблюдение. Устройство «В» теперь запрограммировано. Запишите серийный номер платы.

4.4.4. Открытие второго терминального окна Data Visualization

Шаг 1. Кликните по вкладке «Data Visualizer» (рисунок 38).

Рис. 38. Открытие второго терминального окна Data Visualization

Рис. 38. Открытие второго терминального окна Data Visualization

Шаг 2. Откройте второй последовательный порт.

Шаг 3. Выберите только что обнаруженный системой COM-порт второй платы (рисунок 39).

Рис. 39. Выбор СОМ-порта второй платы

Рис. 39. Выбор СОМ-порта второй платы

Шаг 4. Используйте кнопки со стрелками  и  в правом верхнем углу каждого окна для сворачивания, разворачивания и лучшего обзора информации.

Шаг 5. Нажмите кнопку «RESET» на каждой плате по очереди и отметьте соответствие каждого терминального окна своей плате (рисунок 40).

Рис. 40. Терминальные окна для первой и второй плат

Рис. 40. Терминальные окна для первой и второй плат

Шаг 6. Убедитесь, что обе платы запрограммированы.

4.4.5. Настройка коммуникации с локальной микросхемой ECC508A

На этом шаге будет написан код для настройки I²C-интерфейса с локальной платой ECC508A CryptoAuth Xplained Pro. Адрес I²C этой платы был заранее установлен в 0xC2 специально для этой работы. Также здесь будет добавлен код для чтения серийного номера ECC508A, установленной на локальной плате.

Результирующий код очень похож на код, написанный в прошлой работе.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. Найдите в коде комментарий: //Step 2.3.

Шаг 3. После комментария добавьте следующий код:

//Step 2.3

volatile ATCA_STATUS status;

//init for ECC508

status = atcab_init(&?);

CHECK_STATUS(status);

uint8_t * serial_number = (uint8_t *)&tx_packet->auth.serial_number;

//read local chip’s serial number

status = atcab_read_serial_number(?);

CHECK_STATUS(status);

printf("My Serial Number\r\n");

print_bytes(serial_number, 9);printf("\r\n");

Шаг 4. Добавьте корректную конфигурационную структуру в вызов функции atcab_init() вместо знаков “?”.

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

Шаг 5. Добавьте наиболее подходящий параметр в функцию atcab_read_serial_number() вместо символов “?”. Просмотрите исходный код и найдите наиболее подходящую переменную для сохранения в нее серийного номера.

Подсказка: Обратитесь к приложению A.5, если вам потребуется помощь.

Шаг 6. В главном меню Atmel Studio 7 кликните по символу  – “Start without debugging” («Запустить программу на выполнение без режима отладки»).

Шаг 7. Убедитесь, что серийный номер корректно выводится в терминальное окно (рисунок 41).

Рис. 41. Вывод серийного номера в терминальное окно

Рис. 41. Вывод серийного номера в терминальное окно

4.4.6. Расчет MAC-сообщения на локальном ECC508A

На данном этапе мы добавим код, который запускает генерацию MAC-сообщения на криптоустройства ECC508A. Этот код сформирует аутентификационный ответ по приходу NONCE-числа от хоста (см. последовательность обмена данными, приведенную в разделе 4.2.). Аутентификационный ответ состоит из MAC-сообщения и серийного номера.

Шаг 1. Кликните по вкладке main_symmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 2.4.

Шаг 3. Добавьте после комментария следующий код:

//Step 2.4

//mac function including mode slot nonce and output to mac variable

status = atcab_mac(?, ?, ?, ?);

CHECK_STATUS(status);

printf("Calculated MAC\r\n");

print_bytes(mac, 32);

printf("Sending message, serial number and MAC\n\r");

tx_packet->type = MSG_PACKET_TYPE_AUTH;

usart_write_buffer_job(module, (uint8_t*)tx_packet, sizeof(msg_packet_t));

Шаг 4. Добавьте корректные параметры в вызов функции atcab_mac() вместо символов “?”. Используйте переменные “slot”, “mode”, “mac” и “nonce” в вызове функции.

Подсказка: Посмотрите на функцию symmetric_auth() из предыдущей секции. Обратите внимание, что типы переменных отличаются.

Подсказка: Если вам нужна дополнительная помощь – см. приложение A.6.

Шаг 5. В главном меню Atmel Studio 7 запустите приложение на выполнение без функции отладки клавишей  .

Шаг 6. Убедитесь, что MAC-сообщение выводится в терминальное окно (рисунок 42).

Рис. 42. Вывод MAC-сообщения в терминальное окно

Рис. 42. Вывод MAC-сообщения в терминальное окно

4.4.7. Генерация случайного числа

Несколько раз нажмите кнопку “SW0”. Обратите внимание, что MAC-сообщение не изменяется. Причина заключается в том, что мы еще не добавили код для обновления числа NONCE, используемого при вычислении MAC-сообщения. Это значит, что сейчас MAC-сообщение вычисляется с фиксированными входными параметрами и поэтому дает фиксированный выходной результат.

Следующим этапом мы добавим код, который будет генерировать новое NONCE-число на каждый NONCE-запрос, запускаемый нажатием “SW0” (рисунок 43).

Рис. 43. Схема генерирования NONCE-числа по запросам

Рис. 43. Схема генерирования NONCE-числа по запросам

Шаг 1. Кликните по вкладке “main_symmetric.c”.

Шаг 2. Найдите в коде комментарий: //Step 2.5.

Шаг 3. Добавьте следующий код:

//Step 2.5

volatile ATCA_STATUS status;

status = atcab_init( &cfg_ateccx08a_i2c_host );

CHECK_STATUS(status);

uint8_t * nonce = &tx_packet->nonce.value;

//code to generate random number to be use as a nonce

status = atcab_random(?);

CHECK_STATUS(status);

memcpy(msg_my_nonce, tx_packet->nonce.value, 32);
/*update the local nonce after random and comm_server has been called. Allows for loopback operation*/

tx_packet->type = MSG_PACKET_TYPE_NONCE_RESPONSE;

usart_write_buffer_job(module, (uint8_t*)tx_packet, sizeof(msg_packet_t));

printf("Generated nonce\r\n");print_bytes(&msg_my_nonce, 32);printf("\r\n");

return 0;

Шаг 4. В вызов функции “atcab_random()“ вместо знака “?” добавьте корректный параметр, определяющий хранилище.

Подсказка: Посмотрите на функцию “symmetric_auth()” из предыдущей секции. Обратите внимание, что тип переменной этого параметра не требует символа “&”.

Подсказка: Для дополнительной помощи см. приложение A.7.

Шаг 5. В меню “Atmel Studio 7” запустите выполнение программы без функций отладки с помощью кнопки  .

Примечание. Теперь необходимо запрограммировать вторую плату, чтобы формировался ответ на запрос NONCE-числа.

Шаг 6. В меню “Atmel Studio 7” кликните по кнопке  для открытия страницы настроек платы SAM D21 Xplained Pro.

Шаг 7. Кликните по пункту “Tool” в меню слева.

Шаг 8. Раскройте выпадающее меню в поле “Selected debugger/programmer” и выберите вторую плату.

Шаг 9. В меню “Atmel Studio 7” запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 10. Убедитесь, что значение MAC-сообщения, выводимое в терминал, изменяется при каждом нажатии кнопки “SW0” (в этом примере сообщение выводится в окно “Terminal 3”). Также убедитесь, что другая плата выводит в терминал значение отправляемого NONCE-числа (окно Terminal 2 в этом примере, рисунок 44).

Рис. 44. Вывод значений MAC-сообщения и NONCE-числа в терминальные окна

Рис. 44. Вывод значений MAC-сообщения и NONCE-числа в терминальные окна

4.4.8. Проверка MAC-сообщения на стороне хоста

В этой секции мы добавим сегмент кода для проверки MAC-сообщения от удаленного устройства на стороне хоста.

Шаг 1. Кликните по вкладке “main_symmetric.c”.

Шаг 2. В исходном коде найдите комментарий: //Step 2.6.

Шаг 3. После комментария добавьте следующий код:

//Step 2.6

volatile ATCA_STATUS status;

status = atcab_init( &cfg_ateccx08a_i2c_host );

uint8_t slot = 0;

uint8_t mode = (1<<6); // include serial number

uint8_t otherdata[CHECKMAC_OTHER_DATA_SIZE];

memset(otherdata, 0x00, CHECKMAC_OTHER_DATA_SIZE);

otherdata[0] = 0x08; //match to mac command byte opp code

otherdata[1] = mode; // match to mac mode

otherdata[7] = rx_packet->auth.serial_number[4];

otherdata[8] = rx_packet->auth.serial_number[5];

otherdata[9] = rx_packet->auth.serial_number[6];

otherdata[10] = rx_packet->auth.serial_number[7];

otherdata[11] = rx_packet->auth.serial_number[2];

otherdata[12] = rx_packet->auth.serial_number[3];

//code to check the supplied mac value

status = atcab_checkmac(?,

?,

?,

?,

(const uint8_t*)&?);

if(status == ATCA_SUCCESS) {

printf("Authenticated\r\n\r\n");

} else {

printf("Failed to authenticate\r\n\r\n");

}

Шаг 4. Вместо символов “?” добавьте корректные параметры в вызов функции “atcab_checkmac()”.

Подсказка: Посмотрите на функцию “symmetric_auth()” из предыдущей секции. Также посмотрите на прототип функции в файле “atca_basic.h”.

Подсказка: Для дополнительной помощи см. приложение A.8.

Шаг 5. В меню “Atmel Studio 7” запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 6. Запрограммируйте вторую плату.

Шаг 7. Нажмите “SW0” на каждой из плат и оцените результаты в окне “Data Visualizer”. Каждая плата будет выступать в роли либо локального, либо удаленного узла в зависимости от того, на какой плате была нажата кнопка. Плата, на которой нажимается кнопка – это локальный узел. Плата, чей терминал выводит сообщения “Authenticated” или “Failed” – удаленный узел (рисунок 45).

Рис. 45. Терминальные окна локального и удаленного узлов

Рис. 45. Терминальные окна локального и удаленного узлов

4.4.9. Заключение

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

Что было сделано:

  • инициализация интерфейса I²C функцией “atcab_init()” и чтение серийного номера функцией “atcab_read_serial_number()”;
  • генерация NONCE-запроса по нажатию кнопки;
  • генерация ответа на NONCE-запрос функцией “atcab_random()”;
  • генерация MAC-сообщения функцией “atcab_mac()”;
  • проверка MAC-сообщения функцией “atcab_checkmac()”.

5. LAB 3. Асимметричная аутентификация удаленного устройства

5.1. Обзор

Асимметричная аутентификация – это процесс, при котором верификатор проверяет подлинность удаленной системы путем проверки подписи. Асимметричная аутентификация основана на использовании двух ключей. Один из ключей должен находиться в секрете. Этот ключ носит название приватный (закрытый, секретный) ключ. Второй ключ получается путем математических преобразований приватного ключа и называется публичным (открытым) ключом. Публичный ключ не содержится в секрете. Любой, кто хочет аутентифицировать владельца ключа, будет использовать для этого открытый ключ.

В данной работе будет исследована система, которая содержит:

  • Хост-устройство, содержащее микроконтроллер и защищенное криптоустройство для авторизации ECC508A.
  • Удаленное устройство, содержащее только защищенное криптоустройство для авторизации ECC508A (без микроконтроллера).

Хост и удаленное устройство были предварительно сконфигурированы и содержат приватные и соответствующие им публичные ключи.

5.2. Процесс аутентификации

В целом процесс асимметричной аутентификации похож на симметричный. На рисунке 46 ниже верификатор Алиса проверяет Боба. Боб отвечает на задачу Алисы цифровой подписью. Однако для проверки подписи Алисе достаточно знать только публичный ключ Боба (не приватный).

Рис. 46. Схема процесса асимметричной аутентификации

Рис. 46. Схема процесса асимметричной аутентификации

5.3. Настройка проекта

5.3.1. Проект Cryptograph Authentication

Если это первая работа, которую вы решили выполнить, тогда вам необходимо повторить шаги, описанные в разделе 2.3. для настройки проекта.

5.3.2. Аппаратные требования

Для выполнения данной работы понадобятся:

1. Отладочная плата SAM D21 Xplained Pro – 1 шт.
2. Отладочная плата CryptoAuth Xplained Pro – 2 шт. (рисунок 47).

Рис. 47. Отладочные платы для проекта Cryptograph Authentication

Рис. 47. Отладочные платы для проекта Cryptograph Authentication

3. Кабель USB (Type A – Micro B) – 1 шт.

5.3.3. Подключение плат CryptoAuth Xplained Pro

Шаг 1. Отключите все платы и кабели после выполнения предыдущей работы (сначала USB-кабели, затем платы расширения).

Шаг 2. Подключите плату CryptoAuth Xplained Pro с отметкой “HOST” к порту EXT1 платы SAM D21 Xplained Pro.

Шаг 3. Подключите плату CryptoAuth Xplained Pro с отметкой “REMOTE” к порту EXT2 платы SAM D21 Xplained Pro.

Шаг 4. Подключите USB-кабель к порту DEBUG USB и к компьютеру.

5.3.4. Подготовка проекта

В этой секции сделаем активным файл проекта main_asymmetric.

Шаг 1. Откройте Atmel Studio, а затем откройте проект CryptoAuthentication_Basics.

Шаг 2. Кликните правой кнопкой мыши на файле main_symmetric.c в окне Solution Explorer.

Шаг 3. Выберите “Properties” (свойства) и переключитесь на панель “Properties” (рисунок 48).

Рис. 48. Переключение на панель Properties

Рис. 48. Переключение на панель Properties

Шаг 4. В выпадающем меню возле параметра “Compile” выберите “None” (рисунок 49).

Рис. 49. Убираем файл main_symmetric.c из списка файлов для компиляции

Рис. 49. Убираем файл main_symmetric.c из списка файлов для компиляции

Этим действием мы убираем файл main_symmetric.c из списка файлов для компиляции.

Шаг 5. После правого клика на файле main_asymmetric.c выберите пункт выпадающего меню “Compile” (рисунок 50).

Рис. 50. Выбор пункта выпадающего меню Compile

Рис. 50. Выбор пункта выпадающего меню Compile

В результате этих операций иконки файлов main_symmetric.c и main_asymmetric.c в окне Solution Explorer должны выглядеть следующим образом (рисунок 51).

Рис. 51. Вид окна Solution Explorer

Рис. 51. Вид окна Solution Explorer

5.3.5. Тестовая компиляция 1

Шаг 1. Кликните на вкладке  main_asymmetric.c. Если эта вкладка не открыта, откройте одноименный файл в окне Solution Explorer.

Шаг 2. В исходном коде найдите комментарий: //Step 3.1.

Шаг 3. После комментария добавьте следующий код:

//Step 3.1

printf("CryptoAuthLib Basics Disposable Asymmetric Auth\n\r");

Шаг 4. На главной панели Atmel Studio 7 кликните на клавишу компиляции “Build Solution”  .

Шаг 5. Убедитесь в окне “Output”, что компиляция программы прошла успешно.

Шаг 6. Откройте/переключитесь на терминальное окно Data Visualizer.

Шаг 7. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 8. Убедитесь, что в терминальное окно выводится текст, приведенный ниже (рисунок 52).

Рис. 52. Тестовая компиляция 1

Рис. 52. Тестовая компиляция 1

5.3.6. Ожидание нажатия кнопки SW0

Добавим сегмент кода, который будет запускать процесс аутентификации по нажатию кнопки SW0. Также данный код будет инициализировать интерфейс I2C.

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 3.2.

Шаг 3. После комментария добавьте следующий код:

//Step 3.2

printf("Press SW0 button to authenticate\n\r");

while(port_pin_get_input_level(BUTTON_0_PIN) == SW0_INACTIVE);

printf("Authentication in progress\n\r");

volatile ATCA_STATUS status;

status = atcab_init( &cfg_ateccx08a_i2c_host );

CHECK_STATUS(status);

printf("Device init complete\n\r");

Шаг 4. На главной панели Atmel Studio 7 кликните на клавишу компиляции “Build Solution”  .

Шаг 5. Убедитесь в окне “Output”, что компиляция программы прошла успешно.

5.3.7. Генерация случайного числа

Добавим сегмент кода, генерирующий случайное число (NONCE), которое будет использовано в процессе аутентификации. Случайное число будет использовано как аргумент функции atcab_sign(). У криптоустройства ECC508A есть два режима подписи. Оно может подписывать либо данные, полученные снаружи – внешний режим, либо данные, сгенерированные внутри микросхемы – внутренний режим. В примере мы будет использовать внешний режим.

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 3.3.

Шаг 3. После комментария добавьте следующий код:

//Step 3.3

uint8_t nonce[32];

uint8_t signature[64];

status = atcab_random((uint8_t*)&nonce);

CHECK_STATUS(status);

printf("Random from host\r\n");

print_bytes((uint8_t*)&nonce, 32);

status = atcab_init( &cfg_ateccx08a_i2c_remote );

uint8_t slot = 4;

status = atcab_sign(slot, (const uint8_t*)&nonce, (uint8_t*)&signature);

CHECK_STATUS(status);

printf("Signature from remote\r\n");

print_bytes((uint8_t*)&signature, 64);

Шаг 4. На главной панели Atmel Studio 7 кликните на клавишу компиляции “Build Solution”  .

Шаг 5. Убедитесь в окне “Output”, что компиляция программы прошла успешно.

Шаг 6. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 7. Нажмите кнопку SW0.

Шаг 8. Убедитесь, что приведенный ниже текст  (рисунок 53) выведен в терминал.

Рис. 53. Генерация случайного числа

Рис. 53. Генерация случайного числа и подпись от удаленного устройства

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

5.3.8. Чтение открытого ключа удаленного устройства

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 3.4.

Шаг 3. После комментария добавьте следующий код:

//Step 3.4

uint8_t temp_pubk[64];

status = atcab_get_pubkey(slot, &temp_pubk);

CHECK_STATUS(status);

printf("Remote disposable public key\r\n");

print_bytes((uint8_t*)&temp_pubk, 64);

Шаг 4. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 5. Нажмите кнопку SW0.

Шаг 6. Убедитесь, что приведенный ниже текст выведен в терминал (рисунок 54).

Рис. 54. Чтение открытого ключа удаленного устройства

Рис. 54. Чтение открытого ключа удаленного устройства

В терминале мы видим публичный ключ удаленного устройства. Хост должен знать этот публичный ключ до того момента, как удаленное устройство будет подключено к системе. Хост может авторизовать только те удаленные устройства, публичные ключи которых ему известны.

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

5.3.9. Копирование открытого ключа удаленного устройства и проверка его Хостом

Шаг 1. Используя мышь, выделите и скопируйте из терминального окна публичный ключ удаленного устройства “Remote disposable public key” (рисунок 55).

Рис. 55. Копирование открытого ключа

Рис. 55. Копирование открытого ключа

Шаг 2. Кликните на вкладке main_asymmetric.c.

Шаг 3. В исходном коде найдите комментарий: //Step 3.5.

Шаг 4. Вставьте скопированный ключ после комментария //Step 3.5 в массив key_store[]. Результат должен выглядеть следующим образом:

//Step  3.5
asymm_public_key_t key_store[4] = {

0x6c, 0x27, 0x16, 0x53, 0xd5, 0xe8, 0x95, 0x35,

0x77, 0x6d, 0xeb, 0x0b, 0x70, 0xc1, 0xbc, 0xd0,

0x8c, 0xfe, 0x06, 0x5e, 0xb0, 0xe6, 0x45, 0x73,

0x81, 0xf4, 0x85, 0x0a, 0x15, 0xe6, 0xfa, 0xc9,

0xbe, 0xf1, 0x00, 0xf4, 0x18, 0xeb, 0xfc, 0x3f,

0x17, 0xa6, 0xb3, 0x27, 0x9b, 0x3f, 0x22, 0x6c,

0xad, 0x85, 0x83, 0xae, 0xd1, 0x7c, 0x74, 0xb8,

0x06, 0x65, 0x6f, 0x1a, 0xc0, 0xc2, 0xee, 0x34,

 

5.3.10. Поиск хранилища закрытого ключа

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

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 3.6.

Шаг 3. После комментария добавьте следующий код:

//Step 3.6

status = atcab_init( &cfg_ateccx08a_i2c_host );

CHECK_STATUS(status);

bool verify = false;

bool key_found = false;

uint8_t i = 0;

for(;i < sizeof(key_store)/sizeof(asymm_public_key_t); i++) {

if(memcmp(&key_store[i], &temp_pubk, 64) == 0) {

key_found = true;

break;

}

}

if(key_found) {

status = atcab_verify_extern((const uint8_t*)&nonce,

(const uint8_t*)&signature,

(const uint8_t*)key_store[i].pub_key, &verify);

}

if(verify) {

printf("Authenticated by host\r\n");

} else {

printf("Failed to authenticate\r\n");

}

Шаг 4. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 5. Нажмите кнопку SW0.

Шаг 6. Убедитесь, что приведенный ниже текст выведен в терминал (рисунок 56).

Рис. 56. Поиск хранилища закрытого ключа

Рис. 56. Результат проверки ключа хостом

5.3.11. Добавление дополнительных ключей в хранилище

Используйте несколько дополнительных плат CryptoAuth Xplained Pro с маркировкой REMOTE.

Подключите их вместо используемых плат REMOTE и повторите описанные в пункте 5.3.9. действия для добавления публичных ключей каждой из плат в хранилище доверенных ключей.

Заметьте, что при первом включении и нажатии кнопки SW0 в терминал будет выводиться сообщение “Failed to authenticate”. Причина этого в том, что пока публичный ключ устройства не добавлен в хранилище хоста, это устройство не может быть авторизовано.

5.3.12. Заключение

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

6. LAB 4 – Асимметричный обмен ключами с шифрованием на эллиптических кривых Диффи-Хеллмана

6.1. Обзор

Как мы видели в предыдущей работе, асимметричная криптография позволяет аутентифицировать устройства, используя публичные ключи. Однако еще одной важной функцией криптографии является возможность обмениваться закрытой информацией с другой стороной. Шифрование информации обычно выполняется с помощью симметричного ключа. Хотя некоторые асимметричные алгоритмы (например, RSA) поддерживают прямое шифрование данных, но выполняются они в 1000 раз медленнее, чем симметричные. Поэтому, наиболее эффективно использовать асимметричную криптографию для аутентификации, а затем симметричную криптографию для шифрования данных.

6.2. Процесс создания общего секрета ECDH

Согласование ключей в этой работе происходит по алгоритму эллиптических кривых Диффи-Хеллмана — ECDH (Elliptic Curve Diffie Hellman). Алгоритм ECDH позволяет создать общий секретный ключ для обеих сторон. Общий секрет может быть использован каждой стороной для обмена шифрованной информацией с применением симметричных алгоритмов шифрования, например AES. Для создания общего секретного ключа каждой стороне необходимо перемножить закрытый ключ с публичным ключом второй стороны (рисунок 57).

Рис. 57. Процесс создания общего секрета ECDH

Рис. 57. Процесс создания общего секрета ECDH

ECC508A содержит встроенный ускоритель для ECDH-вычислений и безопасное хранилище для защиты закрытого ключа.

6.3. Настройка проекта

6.3.1. Проект Cryptograph Authentication

Следуйте указаниям, приведенным в пункте 2.3. для настройки проекта Crypto Authentication Project. Если Вы уже выполнили предыдущие разделы, то можете продолжить подготовку проекта с любого места, где остановились.

6.3.2. Аппаратные требования

Для выполнения данной работы понадобятся:

  1. отладочная плата SAM D21 Xplained Pro – 2 шт.
  2. отладочная плата CryptoAuth Xplained Pro – 2 шт.
  3. Кабель USB (Type A – Micro B) – 2 шт.
  4. Макетные перемычки типа «мама-мама» – 2 шт.
6.3.3. Подключение плат CryptoAuth Xplained Pro

Шаг 1. Отключите от обеих плат SAMD21Xplained Pro сначала USB-кабели, а затем платы CryptoAuth Xplained Pro.

Шаг 2. Подключите плату CryptoAuth Xplained Pro с маркировкой “HOST” к первой плате SAM D21 Xplained Pro в порт EXT1.

Шаг 3. Подключите плату CryptoAuth Xplained Pro с маркировкой “HOST” ко второй плате SAM D21 Xplained Pro в порт EXT1.

Шаг 4. Подключите макетные перемычки как показано на рисунке 58. Вывод PB13 на каждой плате SAM D21 Xplained Pro подключается к выводу PA10 на соседней плате. Таким образом, вывод передатчика UART TX подключается к входу приемника UART RX соседней платы.

Рис. 58. Подключение плат CryptoAuth Xplained Pro

Рис. 58. Подключение плат CryptoAuth Xplained Pro

Шаг 5. Подключите каждую плату к компьютеру с помощью USB-кабеля через порт DEBUG USB.

6.4. Написание программного кода

6.4.1. Подготовка проекта

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 5.1.

Шаг 3. Раскомментируйте следующую строку кода. Результат должен выглядеть следующим образом:

//Step 5.1

#define ENABLE_MODULE_2

Шаг 4. В исходном коде найдите комментарий: //Step 5.2.

Шаг 5. После комментария добавьте следующий код:

//Step 5.2

asymmetric_ecdh_comm();

Шаг 6. В исходном коде найдите комментарий: //Step 5.3.

Шаг 7. После комментария добавьте следующий код:

//Step 5.3

printf("CryptoAuthLib Basics Disposable Asymmetric ECDH\n\r");

com_init();

volatile ATCA_STATUS status;

status = atcab_init( &cfg_ateccx08a_i2c_host );

CHECK_STATUS(status);

printf("Device init complete\n\r");

Шаг 8. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 9. Нажмите кнопку SW0.

Шаг 10. Убедитесь, что приведенный ниже текст выведен в терминал (рисунок 59).

Рис. 59. Подготовка проекта Cryptograph Authentication

Рис. 59. Подготовка проекта Cryptograph Authentication

6.4.2. Программирование двух плат SAM D21 Xplained Pro

В этой работе задействованы две платы SAM D21 Xplained Pro, которые подключены к одному компьютеру с одной средой разработки Atmel Studio 7. Каждый раз при написании и компиляции нового участка кода необходимо загружать новую программу в головной МК на каждой плате.

Перечень шагов для выбора платы SAM D21 Xplained Pro board, которая будет запрограммирована:

Шаг 1. В главном меню Atmel Studio 7 кликните на символ  для открытия страницы со свойствами платы SAM D21 Xplained Pro.

Шаг 2. Кликните на пункт “Tool” в меню слева.

Шаг 3. Кликните на выпадающем списке под пунктом активного отладчика “Selected debugger/programmer” (рисунок 60).

Рис. 60. Выбор активного отладчика

Рис. 60. Выбор активного отладчика

В выпадающем меню будут отражены серийные номера подключенных плат SAM D21 Xplained Pro. Серийные номера плат также приведены на специальном стикере на тыльной стороне каждой платы (рисунок 61).

Рис. 61. Серийный номер платы

Рис. 61. Серийный номер платы

Плата, серийный номер которой приведен в самом начале выпадающего списка, является активной и будет запрограммирована при нажатии символа  – “Start without debugging” – запустить программу на выполнение без режима отладки. Серийный номер активной отладки также отображается рядом с символом  в главном меню Studio7 (рисунок 62).

Рис. 62. Отображение серийного номера активной отладки

Рис. 62. Отображение серийного номера активной отладки

При нажатии клавиши “Start without debugging”  будет запрограммирована именно та плата, номер которой выводится рядом с символом «молоток».

6.4.3. Программирование устройства «B»

Шаг 1. Выберите другую плату SAM D21 Xplained Pro, используя последовательность действий, описанную выше в разделе 4.4.2.

Шаг 2. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Устройство «В» теперь запрограммировано. Запишите серийный номер платы:

___________________________________________________________________________.

6.4.4. Открытие второго терминального окна Data Visualizer

Шаг 1. Кликните на вкладке Data Visualizer (рисунок 63).

Рис. 63. Вкладка Data Visualiser

Рис. 63. Вкладка Data Visualiser

Шаг 2. Откройте второй последовательный порт, кликнув два раза на пункте Serial Port.

Шаг 3. Выберите только что обнаруженный системой COM-порт второй платы (рисунок 64).

Рис. 64. Выбор СОМ-порта

Рис. 64. Выбор СОМ-порта

Шаг 4. Используйте кнопки со стрелками  и  в правом верхнем углу каждого окна для сворачивания, разворачивания и лучшего обзора информации.

Шаг 5. Нажмите кнопку RESET на каждой плате по очереди и отметьте соответствие каждого терминального окна своей плате (рисунок 65).

Рис. 65. Соответствие каждого терминального окна своей плате

Рис. 65. Соответствие каждого терминального окна своей плате

Шаг 6. Убедитесь, что обе платы запрограммированы.

6.4.5. Команда чтения публичного ключа

Добавим участок кода, в котором используем ECC508A для получения открытого ключа из секретного ключа. Секретный ключ был создан внутри ECC508A в процессе подготовки устройства к выполнению работы (смотреть приложение С.). Команда чтения публичного ключа запускает операцию умножения точки эллиптической кривой генератора и секретного ключа. В результате этой операции получается публичный ключ. Публичный ключ может быть сохранен во Flash-памяти микроконтроллера или в памяти ECC508A, если в приложении не требуется вычисление нового публичного ключа при каждом новом сеансе передачи данных. В приведенном ниже коде полученный публичный ключ сохраняется в глобальной переменной host_pubk. Эта переменная отправляется по UART при получении запроса публичного ключа от удаленного устройства.

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 5.4.

Шаг 3. После комментария добавьте следующий код:

//Step 5.4

status = atcab_get_pubkey(4, (uint8_t*)&host_pubk);

CHECK_STATUS(status);
6.4.6. Проверка и отправка пакетов по UART

Добавим участок кода, который будет проверять принятые сервером по UART сообщения и отправлять запрос публичного ключа удаленному устройству.

Шаг 1. В исходном коде найдите комментарий: //Step 5.5.

Шаг 2. После комментария добавьте следующий код:

//Step 5.5

printf("Press SW0 button to request the remote board's public key\n\r");

volatile uint32_t i = 0;

while(port_pin_get_input_level(BUTTON_0_PIN) == SW0_INACTIVE) {

//check for incoming data

_asymmetric_ecdh_comm_server();

i++;

if(i >= 1000000) {

com_restart();

i = 0;

}

};

printf("Button pressed\n\r");

printf("Requesting public key\n\r");

msg_packet_t *tx_packet = (msg_packet_t *)com_get_tx_buffer(); /*get tx buffer

send and request public key*/

tx_packet->type = MSG_PACKET_TYPE_PUBKEY_SEND;

struct usart_module * module = com_get_uart(COM_UART_TYPE_TX);

usart_write_buffer_wait(module, (uint8_t*)tx_packet, sizeof(msg_packet_t));

delay_ms(100);//wait for remote pubkey

while(_asymmetric_ecdh_comm_server());

bool verify = false;

bool key_found = false;

//search key store for remote key

uint8_t index = 0;

for(;index < sizeof(key_store)/sizeof(asymm_public_key_t); index++) {

if(memcmp(&key_store[index], &remote_pubk, 64) == 0) {

key_found = true;

break;

}

}

Шаг 3. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  для обеих плат SAM D21 Xplained Pro.

Шаг 4. Нажмите кнопку SW0 на любой из плат SAM D21 Xplained Pro.

Шаг 5. Убедитесь, что приведенный ниже текст выведен в терминал (рисунок 66).

Рис. 66. Проверка принятых по UART пакетов

Рис. 66. Запрос и отправка публичного ключа

6.4.7. Установка подключения и расчет значения ECDH

Добавим участок кода, который проверяет, является ли полученный от удаленного устройства публичный ключ доверенным и вычисляет секретное значение ECDH. Значение ECDH должно быть защищено, поэтому будет использована функция шифрованного чтения ECC508. Для этого функция atcab_ecdh_enc() принимает в качестве параметра ключ транспортного шифрования. Этот ключ также был предварительно запрограммирован в ECC508A. В результате передаваемые по I2C данные будут зашифрованы этим ключом для защиты секретного значения ECDH, возвращаемого обратно в микроконтроллер.

Шаг 1. Кликните на вкладке main_asymmetric.c.

Шаг 2. В исходном коде найдите комментарий: //Step 5.6.

Шаг 3. После комментария добавьте следующий код:

//Step 5.6

if(key_found) {

//Step 5.7

const uint8_t transport_key[] = {

0xf2, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x11,

0x11, 0x11, 0x11, 0x2f,

};

uint8_t private_key_slot = 4;

uint8_t transport_key_slot = 2;

//calculate ECDH value

uint8_t ecdh_value[32]; //pre-master secret (pms)

status = atcab_ecdh_enc(private_key_slot, (const uint8_t*)&key_store[index], (uint8_t*)&ecdh_value,

(uint8_t*)&transport_key, transport_key_slot);

CHECK_STATUS(status);

printf("ECDH Value\r\n");

printf("Remote Pubic Key * Host Private Key = \r\n");

print_bytes((uint8_t*)&ecdh_value, 32);printf("\r\n");

} else {

printf("Remote Pubic Key not trusted\r\n");print_bytes((uint8_t*)&remote_pubk, 64);

}

Шаг 4. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

6.4.8. Программирование второй платы SAM D21 Xplained Pro

Шаг 1. Выберите вторую плату SAM D21 Xplained, следуя инструкции, приведенной в секции 6.4.2.

Шаг 2. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 3. Нажмите кнопку SW0.

Обратите внимание, что в терминал выведено сообщение о том, что ключ не является доверенным (рисунок 67).

Рис. 67. Завершение программирования второй платы SAM D21 Xplained Pro

Рис. 67. Проверка публичного ключа

Это связано с тем, что ассиметричные алгоритмы требуют, чтобы публичный ключ был заранее известен обеим сторонам, чего мы еще не сделали. Процесс передачи публичного ключа обеим сторонам аналогичен процессу передачи симметричных ключей, который был описан ранее. Симметричные ключи должны быть помещены в оба устройства и должны храниться в секрете. Однако публичные ключи могут не храниться в секрете. Поэтому, если необходимо, их можно хранить во FLASH-памяти контроллера.

Но их безопасная передача по-прежнему необходима.

6.4.9. Использование публичных ключей для безопасного подключения к устройству A

Для добавления публичного ключа этого устройства в список доверенных ключей нам необходимо скопировать все байты ключа в переменную хранения ключа в коде.

Шаг 1. Используйте мышь для выделения байтов публичного ключа в терминальном окне (рисунок 68). Нажмите Ctrl+C.

Рис. 68. Выделение байтов публичного ключа

Рис. 68. Выделение байтов публичного ключа

Шаг 2. Кликните на вкладке main_asymmetric.c.

Шаг 3. В исходном коде найдите комментарий: //Step 5.7.

//Step 5.7.

//remote host device 2 public key

0x32, 0x2c, 0xba, 0x60, 0x66, 0x64, 0x68, 0xe5,
0xab, 0x37, 0x25, 0x12, 0x30, 0x9a, 0x86, 0x66,
0x14, 0x4a, 0x2f, 0x19, 0xc8, 0xf5, 0x15, 0x1e,
0x5f, 0x16, 0x15, 0x09, 0xe4, 0x7f, 0x9a, 0xe8,
0x20, 0xdc, 0xfc, 0x4f, 0xf2, 0xa8, 0xe2, 0x51,
0x60, 0xc4, 0xc8, 0x28, 0xa9, 0xe2, 0x4f, 0x88,
0xdd, 0x5e, 0xa2, 0xa0, 0xd2, 0x82, 0x55, 0xe5,
0x72, 0x46, 0xd5, 0xcd, 0x75, 0x13, 0x52, 0x4c,

//remote host device 2 public key
0x6c, 0x27, 0x16, 0x53, 0xd5, 0xe8, 0x95, 0x35,
0x77, 0x6d, 0xeb, 0x0b, 0x70, 0xc1, 0xbc, 040,
0x8c, 0xfe, 0x66, 0x5e, 0xb0, 0xe6, 0x45, 0x73,
0x81, 0xf4, 0x85, 0x0a, 0x15, 0xe6, 0xfa, 0xc9,
0xbe, 0xf1, 0x09, 0xf4, 0x18, 0xeb, 0xfc, 0x3f,
0x17, 0xa6, 0xb3, 0x27, 0x9b, 0x3f, 0x22, 0x6c
0xad, 0x85, 0x83, 0xae, 0xd1, 0x7c, 0x74, 0xb8
0x06, 0x65, 0x6f, 0x1a, 0xc0, 0xc2, 0xee, 0x34,

Шаг 4. Вставьте скопированный ключ в переменную key_store[].

6.4.10. Использование публичных ключей для безопасного подключения к устройству B

Шаг 1. Нажмите кнопку SW0 на второй плате.

Шаг 2. Снова скопируйте ключ этого удаленного устройства из соответствующего терминального окна в массив  key_store[] после комментария //Step 5.7. Результат должен выглядеть как на рисунке 69 с различными значениями ключей.

Рис. 69. Ключ, скопированный в массив key_store[]

Рис. 69. Ключ, скопированный в массив key_store[]

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

Шаг 3. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

6.4.11. Программирование устройства B

Шаг 1. Выберите другую плату SAM D21 Xplained Pro, используя шаги, описанные в секции 6.4.2.

Шаг 2. В меню Atmel Studio 7 запустите выполнение программы без функций отладки с помощью кнопки  .

Шаг 3. Нажмите кнопку SW0.

Шаг 4. Исследуйте содержимое терминального окна.

В терминальном окне платы, на которой была нажата кнопка, должно появиться сообщение, аналогичное сообщению в окне terminal 3, приведенному ниже на рисунке 70. Обратите внимание, что значение ECDH выводится в терминал. Это значение было рассчитано в ECC508A с использованием публичного ключа удаленного устройства, который был передан в качестве параметра в команду ECDH. Команда ECDH выполняет умножение точки эллиптической кривой и защищенного приватного ключа, содержащемся в слоте 4 (и являющегося уникальным для каждой микросхемы ECC508A) для получения результирующего общего секрета ECDH.

Рис. 70. Сообщение в терминальном окне платы

Рис. 70. Результирующее ECDH-значение платы 1

Шаг 5. Нажмите кнопку SW0 на другой плате и наблюдайте за терминальным окном (рисунок 71).

Рис. 71. Сообщение в терминальном окне другой платы

Рис. 71. Результирующее ECDH-значение платы 2

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

6.4.12. Создание дополнительных ключей

Если Вы выполняете работу в групповом классе, найдите коллегу, который дошел до этого же шага.

Подключите одну из своих плат с помощью макетных перемычек к одной из плат соседа (предварительно отключив ее от вашей второй платы). Следуя приведенным выше инструкциям, добавьте открытый ключ платы соседа в хранилище ключей вашей платы. По очереди нажмите на кнопки SW0. Обратите внимание, что рассчитанные каждой платой значения ECDH равны. В конечном приложении значение ECDH может использоваться как симметричный ключ для шифрования и обмена информацией.

Приложение A.

A.1

Код для шага «//Step 1.4»:

status = atcab_read_serial_number(&serial_number);

A.2

Код для шага «//Step 1.7»:

atcab_random(&nonce);

A.3

Код для шага «//Step 1.8»:

atcab_mac(mode, slot, (const uint8_t*)&nonce, (uint8_t*)&mac);

A.4

otherdata[0] = 0x08; //match to mac command byte opp code
otherdata[1] = mode; // match to mac mode
otherdata[7] = serial_number[4];
otherdata[8] = serial_number[5];
otherdata[9] = serial_number[6];
otherdata[10] = serial_number[7];
otherdata[11] = serial_number[2];
otherdata[12] = serial_number[3];

A.5

volatile ATCA_STATUS status;

//add init here for ECC508

status = atcab_init( &cfg_ateccx08a_i2c_host ); //enable communication with remote 508

CHECK_STATUS(status);

uint8_t * serial_number = (uint8_t *)&tx_packet->auth.serial_number;

//add read local chip’s serial number here

status = atcab_read_serial_number(serial_number);

CHECK_STATUS(status);

printf("My Serial Number\r\n");

print_bytes(serial_number, 9); printf("\r\n");

A.6

status = atcab_mac(mode, slot, nonce, mac);

A.7

status = atcab_random(nonce); //generate new nonce for remote device

A.8

status = atcab_checkmac(mode,
slot,
nonce,
mac,
(const uint8_t*)&otherdata);

Приложение B. Определения

MAC-сообщение (Message Authentication Code) – значение, подтверждающее, что конкретное сообщение было отправлено конкретным устройством или группой устройств

Nonce (Number Used Once) – значение, которое используется только один раз в заданном контексте

Дайджест (Digest) – то же, что и хэш, но данный термин используется в более широком смысле, без указания свойств алгоритма.

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

Удаленное устройство или система (Remote) – Устройство или система устройств, которая подключается к хосту для доказательства своей  подлинности

Хост устройство или система (Host) – Устройство или система устройств, считающаяся по умолчанию доверенной и надежной системой

Хэширование (свертка) – алгоритм, приводящий любое количество входных данных к вероятностно уникальному* значению фиксированной длины. После применения алгоритма исходная информация теряется и не подлежит обратному восстановлению из полученного значения.

*Вероятностно уникальное – значение, которое является уникальным с очень высокой степенью вероятности в каком-либо определенном случае использования

Приложение C. Подготовка плат CryptoAuth-XPRO

1. Подключите плату ATSAMD21-XPRO к компьютеру согласно инструкции в пункте 1.1.1.
2. В Atmel Studio откройте проект HOST_REMOTE_Creation.cproj из директории SEC\Preparing согласно инструкции в пунктах 2.3.1.3.
3. Откройте терминальное окно Data Visualizer согласно инструкции в пункте 2.3.3.4.
4. На панели инструментов Atmel Studio 7, кликните кнопку  «Запустить без отладки» (“Start without debugging”).
5. Убедитесь в окне Output (рисунок 72), что компиляции программы прошла успешно.

Рис. 72. Окно Output

Рис. 72. Окно Output

6. Перейдите в открытое ранее терминальное окно Data Visualizer (рисунок 73). Оно должно содержать приветственное сообщение:

Рис. 73. Окно Data Visualiser

Рис. 73. Окно Data Visualiser

В приветственном сообщении пользователю предлагается выбрать тип платы, который необходимо запрограммировать: HOST или REMOTE.

7. Программирование платы HOST

Подключите одну плату CryptoAuth-XPRO к слоту расширения EXT1 и введите в строке ввода терминального окна символ «h» (рисунок 74), после чего нажмите Enter на клавиатуре.

Рис. 74. Строка ввода терминального окна

Рис. 74. Строка ввода терминального окна

Результатом успешного программирования платы HOST будет приведенное на рисунке 75 сообщение:

Рис. 75. Результат программирования платы Host

Рис. 75. Результат программирования платы Host

Отключите плату CryptoAuth-XPRO от слота расширения EXT1 и нанесите на нее пометку HOST любым удобным способом, чтобы отличать ее от аналогичных плат, запрограммированных как REMOTE.

8. Программирование платы REMOTE

Подключите следующую плату CryptoAuth-XPRO к слоту расширения EXT1 и введите в строке ввода терминального окна символ «r» (рисунок 76), после чего нажмите Enter на клавиатуре.

Рис. 76. Строка ввода терминального окна для платы REMOTE

Рис. 76. Строка ввода терминального окна для платы REMOTE

Результатом успешного программирования платы REMOTE будет приведенное на рисунке 77 сообщение:

Рис. 77. Результат программирования платы Remot

Рис. 77. Результат программирования платы Remote

Отключите плату CryptoAuth-XPRO от слота расширения EXT1 и нанесите на нее пометку REMOTE любым удобным способом, чтобы отличать ее от аналогичных плат, запрограммированных как HOST.
После создания необходимого количества плат HOST и REMOTE закройте среду разработки Atmel Studio.

•••

Наши информационные каналы

О компании Microchip

Microchip Technology Inc. - ведущий поставщик микроконтроллеров, схем смешанного сигнала, аналоговых полупроводников и решений на основе флэш-IP. Решения Microchip обеспечивают разработку с низким уровнем риска, снижают общую стоимость системы и сокращают время выхода на рынок для тысяч различных клиентских приложений по всему миру. Штаб-квартира в Чандлер, штат Аризона. Продукция Microchip обладает высокими качеством и уровнем технической поддержки. Продукция Microchip обладает высоким уровн ...читать далее

Товары
Наименование
ATSHA204A-MAHDA (MCRCH)
ATSHA204A-RBHCZ-T (MCRCH)
ATAES132A-SHER-B (MCRCH)
ATAES132A-MAHER-T (MCRCH)
ATECC508A-MAHCZ-S (MCRCH)
ATECC508A-MAHHL-S (MCRCH)
ATSAMD21-XPRO (MCRCH)
ATCRYPTOAUTH-XPRO (MCRCH)
ATCRYPTOAUTH-XPRO-B (MCRCH)
ATSAMD21G18A-AU (MCRCH)