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

ATSHA204A — Команда DeriveKey

С каждой новой статьёй цикла мы всё глубже и глубже погружаемся в глубины криптографии и вот, наконец, дело дошло до команды DeriveKey микросхемы ATSHA204A. Приготовьтесь, сейчас, для того, чтобы осмыслить работу этой команды, вам понадобятся все ваши знания, почерпнутые из статей этого цикла, и вся мощь вашего абстрактно-логического мышления.

Даташит о DeriveKey

По традиции приводим цитаты из первоисточника (даташита микросхемы ATSHA204A компании Microchip) и их перевод на русский язык. Затем дадим комментарии и попробуем простым языком объяснить для чего нужна и как работает команда DeriveKey.

Итак:

The DeriveKey command (Section 8.5.6, “DeriveKey Command”) implements a key rolling scheme. Depending upon the command mode parameter, the resulting operation can be similar to that implemented in a remote-controlled garage door opener, for example. Each time the key is used, the current value of the key is cryptographically combined with a value specific to that system, and that result then forms the key for the next cryptographic operation. Even if an attacker obtains the value of one key, that key will disappear forever with the next use.

Команда DeriveKey реализует схему «key rolling» использования ключей. В зависимости от настроек её режима работы, это может применяться, например, при открывании двери гаража с дистанционным управлением. Каждый раз, когда используется ключ, его текущее значение криптографически объединяется с данными, уникальным для системы, и этот результат затем формирует ключ для следующей криптографической операции. Даже если злоумышленник сможет перехватить ключ, то этот ключ будет уже бесполезен при следующей попытке использования.

DeriveKey can also be used to generate new random keys that might be valid only for a particular Host ID, for a particular time period, or for some other restricted condition. Each generated key is different from any other key ever generated on any device. By “activating” a Host-Client pair in the field in this manner, a clone of a single Client will not work on any other Host.

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

Теперь немного технических подробностей работы команды DeriveKey:

The device combines the current value of a key with the Nonce stored in TempKey using SHA-256, and places the result into the target key slot. SlotConfig[TargetKey].Bit 13 must be set or DeriveKey will return an error.

Устройство (ATSHA204A) объединяет текущее значение ключа с Nonce, сохраненным в TempKey с помощью SHA-256 и размещает результат в целевой слот. SlotConfig[TargetKey].Bit 13 должен быть установлен, иначе DeriveKey вернет ошибку.

If SlotConfig[TargetKey].Bit12 is zero, the source key that will be combined with TempKey is the target key specified in the command line (Roll-Key operation). If SlotConfig[TargetKey].Bit12 is one, the source key is the parent key of the target key, which is found in SlotConfig[TargetKey].WriteKey (Create Key operation).

Если SlotConfig [TargetKey] .Bit12 равен нулю, исходный ключ, который будет объединен с TempKey, является целевым ключом указанным в командной строке (Roll-Key операция). Если SlotConfig[TargetKey] .Bit12 равен единице, то исходным ключом является родительский ключ целевого ключа, который находится в SlotConfig [TargetKey] .WriteKey (операция Create Key).

Prior to execution of the DeriveKey command, the Nonce command must have been run to create a valid nonce in TempKey. Depending upon the state of bit two of the input mode, this nonce would have been created with the internal RNG, or it would have been fixed.

Перед выполнением команды DeriveKey необходимо выполнить команду Nonce для создания nonce в TempKey. В зависимости от состояния бита 2 режима ввода, этот nonce создан внутренним RNG или был фиксированным.

If SlotConfig[TargetKey].Bit15 is set, an input MAC must be present and had been computed as follows: SHA-256(ParentKey, Opcode, Param1, Param2, SN[8], SN[0:1]) where the ParentKey ID is always SlotConfig[TargetKey].WriteKey.

Если установлен параметр SlotConfig [TargetKey].Bit15, входной MAC должен присутствовать и быть вычисленным следующим образом: SHA-256 (ParentKey, Opcode, Param1, Param2, SN [8], SN [0:1]) где ParentKey ID всегда имеет значение SlotConfig [TargetKey] .WriteKey.

If SlotConfig[TargetKey].Bit12 or SlotConfig[TargetKey].Bit15 is set and SlotConfig[ParentKey].SingleUse is also set, DeriveKey returns an error if UseFlag[ParentKey] is 0x00. DeriveKey ignores SingleUse and UseFlag for the target key if SlotConfig[TargetKey].Bit12 and SlotConfig[TargetKey].Bit15 are both zero.

Если установлен SlotConfig [TargetKey] .Bit12 или SlotConfig [TargetKey] .Bit15 и SlotConfig [ParentKey] .SingleUse также установлен, DeriveKey возвращает ошибку, если UseFlag [ParentKey] равен 0x00. DeriveKey игнорирует SingleUse и UseFlag для целевого ключа, если SlotConfig [TargetKey] .Bit12 и SlotConfig [TargetKey] .Bit15 оба равны нулю.

For slots 0 thru 7 only, if input parsing and the optional MAC check succeed, UseFlag[TargetKey] gets set to 0xFF and UpdateCount[TargetKey] is incremented. If UpdateCount currently has a value of 255, then it wraps to zero. If the command fails for any reason, these bytes will not be updated. The value of UpdateCount may be corrupted if power is interrupted during the execution of DeriveKey.

Только для слотов с 0 по 7, если входной анализ и необязательная проверка MAC успешны, UseFlag [TargetKey] получает значение «0xFF» и UpdateCount[TargetKey] увеличивается. Если UpdateCount имеет значение 255, то оно обнуляется. Если команда не будет выполнена по какой-либо причине, эти байты не будут обновлены. Значение UpdateCount может быть повреждено, если питание прервётся во время выполнения DeriveKey.

Как вам ход мысли инженеров компании Microchip? Неплохо, но немного заморочено, попробуем простыми словами объяснить, что имели в виду инженеры компании Microchip когда составляли даташит на ATSHA204A.

Команда DeriveKey простыми словами

Команда DeriveKey может создавать цепочку ключей, где каждый последующий ключ является производным от предыдущего ключа. Для генерации ключей используется команда Nonce (см. предыдущие статьи этого цикла), промежуточные значения ключей хранятся в регистре TempKey (внутри микросхемы, в её оперативной памяти), а для хранения (и последующего извлечения) ключей используются слоты Data зоны микросхемы ATSHA204A.

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

Всё остальное — это чрезвычайно изощрённое и разветвлённое техническое обеспечение работы команды DeriveKey в различных режимах.

Неправда ли так значительно понятнее? Теперь переходим к практическим вещам и познакомимся с параметрами команды DeriveKey.

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

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

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

Param1 (1 байт) — Random:

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

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

Param2 (2 байта) — TargetKey. Слот (номер слота) в Data зоне ATSHA204A для записи ключа.

Data (0 или 32 байта) — MAC (опционально) для проверки операции.

В качестве выходных данных команда DeriveKey возвращает ноль (0) в случае успешного выполнения.

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

Биты 12, 13 и 15 SlotConfig, определяющие логику работы команды DeriveKey в разных режимах:

Исходный ключ для вычислений, выполняемых командой DeriveKey, может быть непосредственно указан в Param2 (сценарий «Target») или быть закодирован в SlotConfig[Param2] .WriteKey (сценарий «Parent»).

Блок-схема работы команды DeriveKey

Общая блок-схема работы команды DeriveKey. Здесь вы можете видеть как «Parent», так и «Target» сценарии использования DeriveKey, а также ветку с проверкой MAC авторизации.

«Parent» — это сценарий, когда генерируется новый ключ на основе «отдельного» исходного ключа.

«Target» — это сценарий, когда генерируется цепочка зависимых ключей, где результирующий ключ записывается на место исходного (и является его производным).

Регистр TempKey

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

Состав регистра TempKey. Красным обведены настройки SourceFlag, которые определяют тип (источник) генерации случайного числа для команды DeriveKey.

Теперь, когда мы познакомились с назначением и устройством команды DeriveKey, мы можем создать скетч, который на практике использует эту команду.

Скетч ATSHA204A DeriveKey

Итак, план работы скетча ATSHA204A DeriveKey:

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

2. Используем команду DeriveKey для генерации уникального ключа. Ключ будет создаваться на основе данных, находящихся в регистре TempKey (после использования команды Nonce) и в 10-м слоте Data зоны нашей микросхемы ATSHA204A. Сохраняться результирующий ключ будет так же 10-м слоте Data зоны (совпадение номеров исходного и результирующего слотов в данном примере — это случайность, это зависит от конфигурации байтов SlotConfig[TargetKey].WriteKey).

Будет использоваться сценарий работы команды DeriveKey в «Parent» варианте без проверки MAC:

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

Подробнее о сборке команды DeriveKey

Подробное описание шагов по настройке и выполнению команды DeriveKey для нашего сценария:

Шаг 1. Вызов команды DeriveKey с OpCode 0x1C (SHA204_DERIVE_KEY).

Шаг 2. Бит 2 параметра Param1 (Random) устанавливается в 0, что соответствует параметру TempKey.SourceFlag равному нулю (генерация ключа внутренним RNG).

Шаг 3. Param2 (TargetKey) устанавливается равным 10 (десятому слоту в Data зоне EEPROM памяти), то есть результирующий ключ будет записан в 10-й слот.

Шаг 4. Конфигурация битов 10-го слота (WriteConf):
SlotConfig[10].Bit12=1 (исходный ключ для операции находится в SlotConfig[10] .WriteKey)
SlotConfig[10].Bit13=1 (текущее значение ключа объединяется с Nonce, сохраненным в TempKey)
SlotConfig[10].Bit15=0 (процедура проверки MAC не производится)

Шаг 5. WriteKey 10-го слота (по умолчанию) имеет значение равное 10 (то есть исходный ключ будет браться также из 10-го слота).

Теперь разберём технические подробности реализации поставленной задачи.

Почему мы сохраняем ключ в 10-м слоте Data зоны?

Потому, что параметры SlotConfig (определяющие свойства и поведение слотов Data зоны) нашей микросхемы ATSHA204A (нашего экземпляра микросхемы) оставлены без изменений и «залочены» с такой конфигурацией, с какой они поставляются с завода-изготовителя компании Microchip (см. предыдущие статьи этого цикла).

Заводское состояние параметров SlotConfig допускает сохранение ключа командой DeriveKey только в 3-й и 10-й слоты (при текущей крипто-конфигурации и алгоритме работы нашего скетча), причём 3-й слот хоть и позволяет сохранить ключ, но по своим параметрам не подходит нам для решения поставленной задачи.

Теперь полный текст скетча ATSHA204A DeriveKey:

/* 
  ATSHA204A DeriveKey
*/

#include <sha204_library.h>

const int sha204Pin = A3;

atsha204Class sha204(sha204Pin);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 DeriveKey start...");
  deriveKey();
}

void deriveKey() {
  uint8_t command[SHA204_CMD_SIZE_MAX];
  uint8_t nresponse[NONCE_RSP_SIZE_LONG];
  uint8_t response[DERIVE_KEY_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);
  
  // DeriveKey
 
  byte retCode = sha204.sha204m_execute(SHA204_DERIVE_KEY,
                                        0, 10,
                                        0, NULL,
                                        0, NULL,
                                        0, NULL,
                                        sizeof(command),   &command[0],
                                        sizeof(response), &response[0]);

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

void loop() {
  
}

И подробное описание работы кода.

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

  uint8_t command[SHA204_CMD_SIZE_MAX];
  uint8_t nresponse[NONCE_RSP_SIZE_LONG];
  uint8_t response[DERIVE_KEY_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);

Далее выполняем команду DeriveKey (TempKey уже заполнен командой Nonce), используя конфигурацию и настройки, описанные выше в этой статье.

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

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

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

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

Контроллер рапортует об успешном выполнении команды Nonce и последующем успешном выполнении команды DeriveKey. Мы сгенерировали новый ключ (по описанному выше сценарию) и поместили его в 10-й слот Data зоны ATSHA204A.

Заключение

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

 

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

Работа с 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 аутентификация. Датчик