logo
+7 (951) 999-89-94
428003, г. Чебоксары, ул. Федора Гладкова, д.9, оф.319

ATSHA204A — Команда HMAC

В этой статье из цикла о работе и программировании микросхемы ATSHA204A, мы подробно разберём команду HMAC. Это довольно продвинутый материал и для понимания этой статьи мы рекомендуем вам ознакомиться с предыдущими статьями цикла, если в этого ещё не сделали.

Читаем даташит

Приводим описание команды HMAC из даташита ATSHA204A и перевод этого описания на русский язык. Итак:

The HMAC command computes an HMAC/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 output of the HMAC algorithm computed over this key and message. If the message includes the serial number of the device, the response is said to be “diversified”.

Команда HMAC вычисляет HMAC/SHA-256 дайджест ключа, хранящегося в устройстве (ATSHA204A), «challenge» и другой информации (на устройстве). Выходные данные этой команды являются выходными данными алгоритма HMAC, вычисленными для этого ключа и сообщения. Если сообщение включает в себя серийный номер устройства, ответ называется «диверсифицированным».

The normal command flow to use this command is as follows:

Обычная последовательность действий для использования этой команды:

1. Run the Nonce command to load input challenge and optionally combine it with a generated random number. The result of this operation is a nonce stored internally on the device.

1. Выполните команду Nonce, чтобы загрузить входной вызов (challenge) и дополнительно объединить его с сгенерированным случайным числом. Результатом этой операции является nonce, хранящийся внутри устройства.

2. Optionally run GenDig command to combine one or more stored EEPROM locations in the device with the nonce. The result is stored internally in the device.

2. При необходимости выполните команду GenDig, чтобы объединить один или несколько наборов данных (ключей), хранящихся в EEPROM с nonce. Результат сохраняется внутри устройства.

3. Run this HMAC command to combine the output of step one (and Step 2 if desired) with an EEPROM key to generate an output response.

3. Выполните команду HMAC для объединения выходных данных первого шага (и, при необходимости, второго шага) с ключом из EEPROM для формирования выходных данных.

Простыми словами о команде HMAC

В общем-то из описания команды HMAC в даташите всё понятно. Говоря простыми словами, команда HMAC вычисляет HMAC/SHA-256 дайджест содержимого TempKey, сформированного командой Nonce (опционально, в зависимости от криптоархитектуры вашего проекта, ещё и командой GenDig) и содержимого слотов Data зоны микросхемы ATSHA204A и (тоже опционально) прочей информации, хранящейся на устройстве (серийного номера и т. п.).

Теперь, когда мы имеем представление о назначении и принце работы команды HMAC, перейдём к практическим вещам и познакомимся с параметрами команды HMAC.

Параметры команды HMAC

Команда HMAC имеет несколько входных параметров, вот таблица с описанием этих параметров из даташита.

OpCode (1 байт) — код операции HMAC, равный 0x11.

Param1 (1 байт) — Mode (режим работы), см. описание ниже.

Param2 (2 байта) — SlotID. Номер 32-байтового слота в Data зоне микросхемы ATSHA204A. Для адресации используются биты 0-3, а для создания дайджеста — все 16 бит.

В качестве выходных данных команда HMAC возвращает 32-байтовый HMAC дайджест.

В вычислении HMAC дайджеста участвуют следующие входные данные, они могут варьироваться в зависимости от настроек:

Таблица с расшифровкой значения битов байта Mode:

Бит 7 — должен быть равен нулю.

Бит 6 — если установлен, то в сообщение включаются 48 бит уникального серийного номера микросхемы SN [2:3] и SN [4:7]; в противном случае соответствующие биты сообщения равны нулю.

Бит 5 — включает первые 64 бита OTP зоны (OTP [0-7]) в сообщение; в противном случае соответствующие биты сообщения равны нулю. Если установлен Mode[4], значение этого бита игнорируется.

Бит 4 — включает первые 88 бит OTP (OTP [0-10]) в сообщение; в противном случае соответствующие биты сообщения равны нулю.

Бит 3 — должен быть равен нулю.

Бит 2 — Значение этого бита должно совпадать со значением в TempKey.SourceFlag, иначе команда вернет ошибку.

Биты 0-1 — должны быть равны нулю.

Регистр TempKey

TempKey — это регистр хранения в массиве SRAM, который может использоваться для хранения временного значения результата выполнения команд Nonce, GenDig, StartMac или SHA. Содержимое этого регистра никогда не может быть прочитано извне устройства (хотя сама микросхема ATSHA204A может считывать и использовать его содержимое).

Скетч ATSHA204A HMAC

Теперь мы можем создать скетч, который показывает пример использования команды HMAC.

План работы скетча:

1. Выполняем команду Nonce для заполнения регистра TempKey (подробности о работе команды Nonce см. в соответствующей статье цикла).

2. Чтобы не загромождать повествование и не усложнять понимание работы команды HMAC, пропускаем и не используем опциональную команду GenDig. Если крипто-архитектура ваших реальных проектов потребует использовать эту команду, то вы всегда сможете это сделать.

3. Выполняем команду HMAC, используя содержимое регистра TempKey (с результатом работы команды Nonce) и нулевого слота Data зоны нашей микросхемы ATSHA204A (см. предыдущие статьи цикла).

4. Получаем результат в виде 32-байтового HMAC/SHA-256 дайджеста.

Полный текст скетча ATSHA204A HMAC:

/* 
  ATSHA204A HMAC
*/

#include <sha204_library.h>

const int sha204Pin = A3;

atsha204Class sha204(sha204Pin);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 HMAC start...");
  hmac();
}

void hmac() {
  uint8_t command[SHA204_CMD_SIZE_MAX];
  uint8_t nresponse[NONCE_RSP_SIZE_LONG];
  uint8_t response[HMAC_RSP_SIZE];
  

  uint8_t num_in[NONCE_NUMIN_SIZE] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
    0x00, 0x11, 0x22, 0x33
  };

  // Nonce

  byte nRetCode = sha204.sha204m_execute(SHA204_NONCE,
                                        NONCE_MODE_NO_SEED_UPDATE, 0,
                                        NONCE_NUMIN_SIZE, (uint8_t *) num_in,
                                        0, NULL,
                                        0, NULL,
                                        sizeof(command),   &command[0],
                                        sizeof(nresponse), &nresponse[0]);
                                        
  Serial.print(F("Nonce: ")); Serial.println(nRetCode, HEX);
  
  // HMAC
 
  byte retCode = sha204.sha204m_execute(SHA204_HMAC,
                                        0, 0,
                                        0, NULL,
                                        0, NULL,
                                        0, NULL,
                                        sizeof(command),   &command[0],
                                        sizeof(response), &response[0]);

  Serial.print(F("HMAC: ")); Serial.println(retCode, HEX);

  for (byte i = 1; i < 33; i++) {
    if (response[i] < 16) {Serial.print('0');}
    Serial.print(response[i], HEX);
    Serial.print(' ');
  }
  Serial.println();
}

void loop() {
  
}

Теперь подробное описание скетча.

Объявляем массивы для команды (команд) и выходных данных Nonce и HMAC, размеры этих массивов задаются заранее определёнными в библиотеке константами.

  uint8_t command[SHA204_CMD_SIZE_MAX];
  uint8_t nresponse[NONCE_RSP_SIZE_LONG];
  uint8_t response[HMAC_RSP_SIZE];

Задаём тестовый 20-байтовый массив num_in с входными данными для команды Nonce. В ваших реальных проектах этот массив, естественно, будет иметь другие значения.

  uint8_t num_in[NONCE_NUMIN_SIZE] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
    0x00, 0x11, 0x22, 0x33
  };

Выполняем команду Nonce с соответствующими параметрами функции sha204.sha204m_execute().

  byte retCode = sha204.sha204m_execute(SHA204_NONCE,
                                        NONCE_MODE_NO_SEED_UPDATE, 0,
                                        NONCE_NUMIN_SIZE, (uint8_t *) num_in,
                                        0, NULL,
                                        0, NULL,
                                        sizeof(command),   &command[0],
                                        sizeof(response), &response[0]);

И выводим код возврата (результат выполнения) команды Nonce. В случае успеха он должен быть равен нулю.

  Serial.print(F("Nonce: ")); Serial.println(nRetCode, HEX);

Далее выполняем команду HMAC (TempKey уже заполнен командой Nonce), используя ключ из нулевого слота Data зоны.

  byte retCode = sha204.sha204m_execute(SHA204_HMAC,
                                        0, 0,
                                        0, NULL,
                                        0, NULL,
                                        0, NULL,
                                        sizeof(command),   &command[0],
                                        sizeof(response), &response[0]);

И снова выводим код возврата (результат выполнения), но уже команды HMAC. Он тоже должен быть равен нулю.

  Serial.print(F("HMAC: ")); Serial.println(retCode, HEX);

И далее выводим 32-байтовый HMAC/SHA-256 дайджест.

  for (byte i = 1; i < 33; i++) {
    if (response[i] < 16) {Serial.print('0');}
    Serial.print(response[i], HEX);
    Serial.print(' ');
  }
  Serial.println();

Вот результат работы нашего скетча:

Контроллер рапортует об успешном выполнении команды Nonce и последующем успешном выполнении команды HMAC. Дайджест помещён в регистр TempKey и может использоваться функциями MAC, Read и Write и т. д. микросхемы ATSHA204A.

Заключение

На примере команды HMAC можно увидеть чрезвычайно богатый арсенал возможностей чипа ATSHA204A — при его помощи можно решить любую криптографическую задачу в вашем IoT или микроконтроллерном проекте.

 

Ссылки по теме

Работа с SHA-256

ATSHA204 - Обзор

ATSHA204 - Спецификации

ATSHA204 - Библиотека и примеры

ATSHA204A - Чтение зоны конфигурации 1

ATSHA204A - Чтение зоны конфигурации 2

ATSHA204A - Чтение зоны конфигурации 3

ATSHA204A - Запись конфигурации 1

ATSHA204A - Запись конфигурации 2

ATSHA204A - Запись конфигурации 3

ATSHA204A - Запись конфигурации 4

ATSHA204A - Config Lock

ATSHA204A - Работа в режиме Config Lock

ATSHA204A - Работа с зонами памяти

ATSHA204A - Запись зоны OTP

ATSHA204A - Data Lock

ATSHA204A - Чтение Data и OTP зон памяти

ATSHA204A - Команда MAC

ATSHA204A - Аутентификация. Базовый блок

ATSHA204A - Криптография и команды

ATSHA204A - Команда CheckMac

ATSHA204A - Команда Nonce

ATSHA204A - Команда GenDig

ATSHA204A - Команда HMAC

ATSHA204A - Команда DeriveKey

ATSHA204A - Команда DeriveKey

ATSHA204A - nRF24 аутентификация. База

ATSHA204A - nRF24 аутентификация. Датчик

ATSHA204A - LoRa аутентификация. База

ATSHA204A - LoRa аутентификация. Датчик