В предыдущих статьях этого цикла мы познакомились с назначением и характеристиками микросхемы ATSHA204A, а также научились её конфигурировать и работать с её зонами EEPROM памяти. В этой статье мы продолжим изучение этого чипа и разберём работу с одной из её многочисленных команд — MAC.
Команда MAC
Вот цитата из даташита о назначении команды MAC:
The MAC command computes a SHA-256 digest of a key stored in the device, a challenge, and other information on the device. The output of this command is the digest of this message. If the message includes the serial number of the device, the response is said to be “diversified”.
Перевод:
Команда MAC вычисляет SHA-256 дайджест (хеш) ключа, сохраненного в устройстве, входных данных (challenge) и некоторой информации, хранящийся на устройстве (в памяти микросхемы ATSHA204A). Выходные данные этой команды являются дайджестом (хешем) этого объединённого сообщения (набора данных). Если входной набор данных включает серийный номер устройства, то ответ называется «диверсифицированным».
Другими словами, команда MAC может вычислить SHA-256 хеш набора данных, в который входят:
- 32-байтовый ключ, хранящийся в одном из 16-и слотов Data зоны памяти ATSHA204A
- Входной набор данных (массив байтов)
- Некоторая информация, хранящаяся в EEPROM памяти ATSHA204A, например, её уникальный серийный номер
Вот сводная таблица всех данных, участвующих в формировании входного сообщения для команды MAC, приведённая в даташите:
Теперь подробнее разберём входные и выходные параметры команды MAC.
Входные параметры
Таблица входных параметров команды MAC из даташита:
Код операции MAC. Равен 0x08.
Параметр 1. Режим работы команды MAC. Размер 1 байт. Определяет какие поля (наборы данных) из устройства (микросхемы ATSHA204A) будут использоваться во входном сообщении.
Параметр 2. SlotID, номер одного из 16-и слотов с ключами в Data зоне ATSHA204A. Размер 2 байта. Биты 0:3 используются для выбора слота, но все 16 бит используются в SHA-256 сообщении.
Data. Набор входных битов (Challenge). Размер 0 или 32 байта. Входная часть сообщения для хеширования, игнорируется если Mode:0 = 1.
Режим работы команды MAC, закодированный в байте «Параметр 1» описывается в даташите следующим образом:
Что в переводе означает:
Бит 7. Всегда равен нулю.
Бит 6. Если установлен в единицу (1), то во входной набор данных включаются 48 бит (6 байтов) уникального серийного номера микросхемы ATSHA204A (SN[2:3] и SN[4:7]), иначе все соответствующие биты устанавливаются в ноль (0).
Бит 5. Во входной набор данных включаются первые 64 OTP бит (с OTP[0] до OTP[7]), иначе все соответствующие биты устанавливаются в ноль (0). Если установлен бит Mode:4, то значение этого бита игнорируется.
Бит 4. Во входной набор данных включаются первые 88 OTP бит (с OTP[0] до OTP[10]), иначе все соответствующие биты устанавливаются в ноль (0).
Бит 3. Всегда равен нулю.
Бит 2. Если установлены биты Mode:0 или Mode:1, то бит Mode:2 должен соответствовать значению в TempKey.SourceFlag, иначе команда вернет ошибку.
Бит 1. Первые 32 байта входного сообщения. Если равен нулю (0), то SHA данные загружаются из одного из 16-и слотов Data зоны микросхемы ATSHA204A, если равен единице (1), то заполняются байтами из TempKey.
Бит 0. Вторые 32 байта входного сообщения. Если равен нулю (0), то SHA данные берутся из «Challenge» (набора битов), если равен единице (1), то заполняются байтами из TempKey (рекомендуется).
Выходные параметры
С выходными параметрами всё намного проще, даташит предельно краток и лаконичен в этом случае:
То есть выходными данными является 32-байтовый SHA-256 хеш всех входных данных, сформированных по правилам подробно разобранным выше.
В целом с командой MAC всё более или менее понятно, теперь давайте попробуем применить наши знания на практике и создать скетч, который вычисляет SHA-256 хеш при помощи команды MAC.
Скетч ATSHA204A MAC Challenge
Итак, создаём скетч, который вычисляет SHA-256 хеш на основе входного массива байтов и некоторой информации из нашей микросхемы ATSHA204A. Для экспериментов мы будем использовать тот экземпляр ATSHA204A, с которым мы работали на предыдущих уроках. Вот скриншот заполнения её Data зоны 16-ю тестовыми ключами:
В данном случае мы будем использовать ключ из нулевого слота, заполненный 32-я значениями 0x00. Вот полный код скетча ATSHA204A MAC Challenge:
/* ATSHA204A MAC Challenge */ #include <sha204_library.h> const int sha204Pin = A3; atsha204Class sha204(sha204Pin); void setup() { Serial.begin(115200); Serial.println("ATSHA204 MAC Challenge start..."); macChallenge(); } void macChallenge() { uint8_t command[MAC_COUNT_LONG]; uint8_t response[MAC_RSP_SIZE]; const uint8_t challenge[MAC_CHALLENGE_SIZE] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; byte retCode = sha204.sha204m_execute(SHA204_MAC, 0, 0, MAC_CHALLENGE_SIZE, (uint8_t *) challenge, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(response), &response[0]); for (byte i = 0; i < 32; i++) { if (response[i] < 16) {Serial.print('0');} Serial.print(response[i], HEX); Serial.print(' '); } Serial.println(); } void loop() { }
Теперь подробно разберём работу этого скетча. В качестве «Challenge», то есть в качестве входного набора байтов, мы будем использовать 32-х байтовый массив challenge, заполненный тестовыми значениями.
const uint8_t challenge[MAC_CHALLENGE_SIZE] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
Далее мы вызываем функцию sha204.sha204m_execute() с соответствующим заполнением её параметров.
byte retCode = sha204.sha204m_execute(SHA204_MAC, 0, 0, MAC_CHALLENGE_SIZE, (uint8_t *) challenge, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(response), &response[0]);
В данном случае для нас являются важными параметры
SHA204_MAC,
это константа, содержащая номер команды MAC (0x08),
0, 0,
это режим команды MAC (Параметр 1) и номер слота в Data зоне ATSHA204A (Параметр 2), и
MAC_CHALLENGE_SIZE, (uint8_t *) challenge,
это «challenge» массив и его размер в байтах.
Остановимся подробнее на режиме команды MAC (Параметр 1) и определении номера слота в Data зоне ATSHA204A (Параметр 2).
Режим MAC, равный нулю означает:
Бит 7. Равен нулю.
Бит 6. Равен нулю. Все соответствующие биты устанавливаются в ноль (0).
Бит 5. Равен нулю. Все соответствующие биты устанавливаются в ноль (0).
Бит 4. Равен нулю. Все соответствующие биты устанавливаются в ноль (0).
Бит 3. Равен нулю.
Бит 2. Равен нулю.
Бит 1. Равен нулю. Первые 32 байта входного сообщения загружаются из Data зоны микросхемы ATSHA204A.
Бит 0. Равен нулю. Вторые 32 байта входного сообщения берутся из «Challenge» (набора битов).
Второй параметр равный нулю означает, что ключ для входного сообщения берётся из нулевого слота Data зоны и в формировании хеша участвуют 16 нулевых значений битов на соответствующих местах.
И в завершение работы скетча в Serial выводится вычисленный хеш
for (byte i = 0; i < 32; i++) { if (response[i] < 16) {Serial.print('0');} Serial.print(response[i], HEX); Serial.print(' '); } Serial.println();
Вот результат работы нашего скетча, SHA-256 хеш вычислен на основе «Challenge» набора входных битов, 32-байтового ключа из нулевого слота Data зоны и нулевых значений битов на соответствующих местах во входном сообщении.
Таким же образом вы можете менять набор «Challenge» байтов или включать в набор для вычисления хеша любой из 16-и ключей, хранящихся в Data зоне нашей микросхемы, а также вы можете включать в работу байты уникального серийного номера вашего экземпляра микросхемы ATSHA204A и/или байты их OTP зоны вашей микросхемы ATSHA204A.
Что и как включать во входной набор данных для хеширования зависит от смысла и целей работы криптографической части вашего проекта, здесь мы только привели и разобрали тестовый пример работы команды MAC.
Заключение
В этой статье мы разобрали теоретическую часть работы с хешированием и работой команды MAC микросхемы ATSHA204A, в следующей статье мы разберём практический пример использования этой функции для обеспечения безопасного обмена данными между двумя контроллерами.
Ссылки по теме
ATSHA204 - Библиотека и примеры
ATSHA204A - Чтение зоны конфигурации 1
ATSHA204A - Чтение зоны конфигурации 2
ATSHA204A - Чтение зоны конфигурации 3
ATSHA204A - Запись конфигурации 1
ATSHA204A - Запись конфигурации 2
ATSHA204A - Запись конфигурации 3
ATSHA204A - Запись конфигурации 4
ATSHA204A - Работа в режиме Config Lock
ATSHA204A - Работа с зонами памяти
ATSHA204A - Чтение Data и OTP зон памяти
ATSHA204A - Аутентификация. Базовый блок
ATSHA204A - Аутентификация. Датчик
ATSHA204A - Криптография и команды
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик