Продолжаем знакомиться с командами микросхемы ATSHA204A и в этой статье мы подробно разберём команду GenDig.
Здесь мы уже вступаем в «криптографические дебри» и для того, чтобы понять смысл и назначение команды GenDig и научиться с ней работать, нам сначала придётся уделить время изучению теории. Далее мы посмотрим что пишет по этому поводу компания Microchip в даташите на свою микросхему ATSHA204A.
Приготовьтесь, это чтение не из лёгких, но зато потом, осилив это описание, вы по праву сможете считать себя квалифицированным криптографом.
Даташит о криптографии ATSHA204A
Далее мы представим то, что написано в даташите ATSHA204A по поводу криптографии, реализованной в этой микросхеме.
Итак, цитата:
The ATSHA204A supports a standard challenge-response protocol to simplify programming. In its most basic installation, the Host system sends a challenge (i.e. a number) to the device in the Client, which combines that challenge with a secret key by using the Message Authentication Code (MAC) command from the system, as described in Section 8.5.11, “MAC Command”, and sends that response back to the system. The device uses a cryptographic hash algorithm to make that combination (which is also known as a digest). The use of a hash algorithm prevents an observer on the bus from deriving the value of the secret key, while allowing the recipient to verify that the response is correct by performing the same calculation combining the challenge with the secret to create a digest using a stored copy of the secret.
Перевод:
Для упрощения программирования ATSHA204A поддерживает стандартный протокол «вызов-ответ». В базовом варианте использования хост-система посылает вызов (т.е. число) на устройство (микросхему ATSHA204A) в клиентской системе, которое объединяет вызов (challenge) c секретным ключом, используя команду MAC (Message Authentication Code) и отправляет ответ обратно в систему. Устройство использует криптографический хеш-алгоритм для создания этой комбинации (которая также известна как дайджест). Использование хеш-алгоритма не позволяет (злонамеренному) наблюдателю на шине получить значение секретного ключа, разрешая при этом (легитимному) получателю убедиться в правильности ответа путем выполнения одного и того же вычисления, объединяющего вызов с секретом для создания дайджеста (с использованием хранящейся в памяти ATSHA204A копии секрета).
Вроде бы всё понятно; далее по поводу команды GenDig:
This basic operation can be expanded in many ways because of the flexible command set of the ATSHA204A. By using the GenDig command (Section 8.5.8, “GenDig Command”), the values in other slots can be included in the response digest, which provides an effective way of proving that a data read really did come from the device, as opposed to being inserted by a man-in-the-middle attacker. This same command can be used to combine two keys with the challenge, which is useful when there are multiple layers of authentication to be performed.
Перевод:
Эта базовая операция (см. текст выше) может быть расширена многими способами благодаря гибкому набору команд ATSHA204A. С помощью команды GenDig можно включить значения (секретные ключи), хранящиеся в в памяти ATSHA204A (слотах) в ответный дайджест, который обеспечивает эффективный способ доказательства того, что считанные данные действительно пришли от (легитимного) устройства, а не вставлены «атакующим по середине». Эту же команду можно использовать для объединения двух ключей с вызовом, что полезно, когда существует несколько уровней аутентификации.
Тоже, вроде бы, всё понятно. Далее переходим непосредственно к описанию команды GenDig.
Описание команды GenDig
Приводим нативное описание команды GenDig компанией Microchip в своём даташите на микросхему ATSHA204A. Сначала будет дан английский оригинал, а затем русский перевод. Английский оригинал приведён для того, чтобы вы могли увидеть все тонкости, которые указала (имела в виду) компания Microchip. Итак:
The GenDig command uses SHA-256 to combine a stored value with the contents of TempKey, which must have been valid prior to the execution of this command. The stored value can come from one of the data slots, either of the OTP pages, either of the first two pages of the Configuration zone, or retrieved from the hardware transport key array. The resulting digest is retained in TempKey, and can be used in one of three ways as follows:
Команда GenDig использует SHA-256 для объединения сохраненного (в EEPROM) значения с содержимым регистра TempKey (которое должно быть действительным (valid) до выполнения этой команды). Сохраненное значение может поступать из одного из слотов Data зоны, страниц OTP зоны, первых двух страниц зоны конфигурации или из массива данных, полученного от оборудования (hardware). Полученный дайджест сохраняется в TempKey и может использоваться одним из трех способов:
1. It can be included as part of the message used by the MAC, CheckMac, or HMAC commands. Because the MAC response output incorporates both the data used in the GenDig calculation and the secret key from the MAC command, it serves to authenticate the data stored in the Data and/or OTP zones.
1. Он может быть включен как часть сообщения, используемого командами MAC, StartMac или HMAC. Поскольку выходные данные ответа MAC включают в себя как данные, используемые при вычислении GenDig, так и секретный ключ команды MAC, он служит для аутентификации данных, хранящихся в зонах Data и/или OTP.
2. A subsequent Read or Write command can use the digest to provide authentication and/or confidentiality for the data, in which case it is known as a data protection digest.
2. Последующие команды Read или Write могут использовать дайджест для обеспечения аутентификации и/или конфиденциальности данных (в этом случае он известен как дайджест защиты данных).
3. This command can be used for secure personalization by using a value from the transport key array. The resulting data protection digest would then be used by the Write Command.
3. Эта команда может использоваться для безопасной персонализации с использованием значения из передаваемого массива данных (ключа). Результирующий дайджест защиты данных будет затем использоваться командой Write.
If zone is two (Data) and SlotID is less than or equal to 15, the GenDig command sets TempKey.GenData to one and TempKey.SlotID to the input SlotID; otherwise, TempKey.GenData is set to zero.
Если зона равна 2 (Data), а SlotID меньше или равен 15, команда GenDig устанавливает TempKey.GenData в единицу и TempKey.SlotID равным SlotID; в противном случае значение TempKey.GenData будет равно нулю.
Regardless of how the resulting digest is computed, it can never be read from the device.
Независимо от того, как вычисляется результирующий дайджест, его невозможно прочитать с устройства.
If TempKey.Valid is invalid, this command returns an error. Upon command completion, the TempKey.Valid bit is set, indicating that a digest has been loaded and is ready for use. The TempKey.Valid bit is cleared when the next command is executed.
Если значение TempKey.Valid не валидно, эта команда возвращает ошибку. По завершении команды бит TempKey.Valid имеет значение, указывающее, что дайджест загружен и готов к использованию. Бит TempKey.Valid очищается, когда выполняется следующая команда.
For all SlotID values less than 0x8000, the device uses the least-significant four bits of SlotID to determine the slot number from which to retrieve the key value from the Data zone of the EEPROM. All 16 bits of SlotID as input to the device are used as Param2 in the SHA-256 calculation.
Для всех значений SlotID менее 0x8000 устройство использует четыре младших бита SlotID для определения номер слота, из которого извлекается значение ключа из зоны данных EEPROM. Все 16 битов SlotID используются для Param2 в качестве входных данных при расчете SHA-256.
If the zone parameter points to the Configuration zone, then this command returns an error if the Configuration zone is unlocked.
Если параметр zone указывает на зону Configuration, то эта команда возвращает ошибку, если конфигурационная зона разблокирована.
О команде GenDig простыми словами
В общем-то из описания команды GenDig тоже всё более-менее понятно. Говоря простыми словами, основное назначение команды GenDig — это взять данные (ключи, байты) из EEPROM памяти ATSHA204A (зон Configuration, Data или OTP) и «объединить» их (при помощи SHA-256) с содержимым регистра TempKey (которое должно быть предварительно заполнено какой-либо из команд ATSHA204A). Это основной смысл команды GenDig, всё остальное — это описание условий применения и настроек «внутренней кухни» микросхемы ATSHA204A.
Теперь, когда мы имеем представление о назначении и принципах работы команды GenDig, перейдём к более практическим вещам и познакомимся с параметрами команды GenDig.
Параметры команды GenDig
Команда GenDig имеет несколько входных параметров, вот таблица с описанием этих параметров из даташита.
OpCode (1 байт) — код операции GenDig, равный 0x15.
Param1 (1 байт) — Zone (зона EEPROM памяти):
Если 0x00 (Config), то SlotID используется для указания первого (SlotID = 0) или второй (SlotID = 1) 256-битного блока зоны конфигурации.
Если 0x01 (OTP), то SlotID используется для указания первого или второго 256-разрядного блока OTP зоны.
Если 0x02 (Data), то SlotID указывает слот в зоне данных или ключ в (hardware) массиве.
Все остальные значения зарезервированы и не должны использоваться.
Param2 (2 байта) — Идентификационный номер используемого ключа или выбор блока OTP.
Data (4 или 0 байт) — OtherData. Четыре байта данных для вычисления SHA при использовании ключа StartOnly; в противном случае игнорируется.
В случае успешного выполнения команды GenDig ATSHA204A возвращает нулевое значение.
If zone is Data and SlotConfig[SlotID].CheckOnly is one, the SHA-256 message body used to create the resulting new TempKey consists of the following bytes:
Если зона имеет значение Data и SlotConfig[SlotID] .CheckOnly равен единице, то SHA-256 дайджест, используемый для создания результирующего TempKey, основывается на следующих байтах:
Во всех остальных случаях для создания TempKey используется следующий набор данных:
Регистр TempKey
TempKey — это регистр хранения в массиве SRAM, который может использоваться для хранения временного значения результата выполнения команд Nonce, GenDig, StartMac или SHA. Содержимое этого регистра никогда не может быть прочитано извне устройства (хотя сама микросхема ATSHA204A может считывать и использовать его содержимое).
Скетч ATSHA204A GenDig
Если вы внимательно ознакомились со вступительной теоретической частью этой статьи, то теперь мы можем перейти к практике и создать скетч ATSHA204A GenDig.
Задача этого скетча — показать код примера практического использования команды GenDig. Некоторые замечания по поводу этого скетча:
1. Сама по себе команда GenDig не выполняется, перед её выполнением должен быть (корректно) заполнен регистр TempKey. Для помещения данных в регистр TempKey мы будем использовать команду Nonce (подробно рассмотренную ранее в одной из статей этого цикла).
2. Соответственно, скетч будет содержать код использования двух команд — сначала Nonce, а затем GenDig.
3. Поскольку результат работы команд Nonce и GenDig помещается в TempKey (и ни при каких обстоятельствах недоступен для чтения извне микросхемы ATSHA204A), то о результате проведённых действий мы будем судить по кодам возврата команд Nonce и GenDig (которые в случае успеха должны быть равны нулю).
Теперь полный текст скетча ATSHA204A GenDig. Генерируем Nonce (см. соответствующую статью цикла), затем выполняем команду GenDig, используя ключ из нулевого слота Data зоны нашей микросхемы ATSHA204A (см. предыдущие статьи этого цикла):
/* ATSHA204A GenDig */ #include <sha204_library.h> const int sha204Pin = A3; atsha204Class sha204(sha204Pin); void setup() { Serial.begin(115200); Serial.println("ATSHA204 GenDig start..."); GenDig(); } void GenDig() { uint8_t command[SHA204_CMD_SIZE_MAX]; uint8_t gresponse[GENDIG_RSP_SIZE]; uint8_t nresponse[NONCE_RSP_SIZE_LONG]; 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); // GenDig byte gRetCode = sha204.sha204m_execute(SHA204_GENDIG, GENDIG_ZONE_DATA, 0, 0, NULL, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(gresponse), &gresponse[0]); Serial.print(F("GenDig: ")); Serial.println(gRetCode, HEX); } void loop() { }
Объявляем массивы для команды (команд) и выходных данных Nonce и GenDig, размеры этих массивов задаются заранее определёнными в библиотеке константами.
uint8_t command[SHA204_CMD_SIZE_MAX]; uint8_t gresponse[GENDIG_RSP_SIZE]; uint8_t nresponse[NONCE_RSP_SIZE_LONG];
Задаём тестовый 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);
Далее выполняем команду GenDig (TempKey уже заполнен командой Nonce), используя ключ из нулевого слота Data зоны.
byte gRetCode = sha204.sha204m_execute(SHA204_GENDIG, GENDIG_ZONE_DATA, 0, 0, NULL, 0, NULL, 0, NULL, sizeof(command), &command[0], sizeof(gresponse), &gresponse[0]);
И снова выводим код возврата (результат выполнения), но уже команды GenDig. Он тоже должен быть равен нулю.
Serial.print(F("GenDig: ")); Serial.println(gRetCode, HEX);
Вот результат работы нашего скетча:
Контроллер рапортует об успешном выполнении команды Nonce и последующем успешном выполнении команды GenDig. Дайджест помещён в регистр TempKey и может использоваться функциями MAC, HMAC, Read и Write микросхемы ATSHA204A.
Заключение
Как вы заметили из описания криптографии ATSHA204A и свойств команды GenDig, приёмов и сценариев использования GenDig существует великое множество — всё зависит только от вашего конкретного проекта и его криптоархитектуры. Используя знания, полученные из этой статьи, вы сможете найти достойное применение многочисленным криптографическим возможностям микросхемы 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 - Команда GenDig
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик