В этой статье мы разберём работу команды Nonce криптомикросхемы ATSHA204A. Википедия определяет понятие nonce как «однократно используемое число» (от англ. «number that can only be used once» — число, которое может быть использовано один раз).
В криптографии подобные числа применяются для различных целей, например в чипе ATSHA204A они используются функциями GenDig, MAC, HMAC, Read и Write.
Команда Nonce
Читаем даташит ATSHA204A в разделе «Nonce Command»:
The Nonce command generates a nonce for use by a subsequent GenDig, MAC, HMAC, Read, or Write command by combining an internally generated random number with an input value from the system. The resulting nonce is stored internally in TempKey and the generated random number is returned to the system.
Перевод:
Команда Nonce генерирует т. н. число «nonce» для последующего использования командами GenDig, MAC, HMAC, Read и Write путем объединения внутреннего сгенерированного случайного числа с входным значением из системы. Результирующий nonce хранится внутри TempKey и сгенерированное случайное число возвращается в систему.
Далее:
The input value is designed to prevent replay attacks against the Host, and it must be externally generated by the system and passed into the device using this command. It may be any value that changes consistently, such as a nonvolatile counter, current real time of day, and so forth; or it can be an externally generated random number.
Перевод:
Входное значение предназначено для предотвращения атак на хост и должно быть сгенерировано извне системы и передано в устройство с помощью этой команды. Это может быть любое значение, которое меняется последовательно, такое, как счетчик, текущее реальное время суток и т. д.; или это может быть сгенерированное извне случайное число.
В даташите дано подробное описание режимов работы команды Nonce (с которым вы можете ознакомиться самостоятельно), для нас же сейчас важно понять принцип работы nonce — мы подаём на вход команды Nonce некие данные (число) и система комбинирует их со случайным числом, сгенерированным встроенным качественным RNG (генератором случайных чисел).
И важное дополнение:
Prior to the configuration section being locked, the RNG produces a value of 0xFF FF 00 00 FF FF 00 00 to facilitate testing. This test value is combined with the input value in the manner described above.
Перевод:
До блокировки конфигурационной зоны RNG генератор выдает значения 0xFF 00 00 FF FF 00 00 для облегчения тестирования. Это тестовое значение комбинируется с входным значением способом, описанным выше.
То есть до блокировки конфигурационной зоны RNG генератор не работает, а выдаёт тестовую последовательность 0xFF 00 00 FF FF 00 00 (которую можно использовать только для тестирования, но не для полноценной работы системы). Но в данном случае мы проводим эксперименты с экземпляром ATSHA204A у которого конфигурационная зона заблокирована (см. предыдущие статьи этого цикла).
Параметры команды Nonce
Команда Nonce имеет несколько входных параметров, вот таблица с описанием этих параметров из даташита.
OpCode (1 байт) — код операции Nonce, равный 0x16.
Param1 (1 байт) — режим (Mode) работы команды Nonce. Подробнее о назначении битов Mode:
Bits 2-7 — должны быть равны нулю.
Bits 0-1 — Если 0, то объединяется новое случайное число с NumIn и сохраняется в TempKey. Автоматически обновляется «seed» в EEPROM только при необходимости перед генерацией случайных чисел. Рекомендуется для обеспечения максимальной безопасности.
Если 1, то объединяется новое случайное число с NumIn и сохраняется в TempKey. Генерируется случайное число, используя существующий «seed» в EEPROM.
Если 2, то это недействительное значение.
Если 3, то происходит работа в режиме передачи и запись NumIn в TempKey.
Param2 (2 байта) — должны быть равны нулю (0x0000).
Data (20 или 32 байта) — NumIn. Входные данные от системы.
Выходными данными команды Nonce является сгенерированное 32-байтовое число или 0, если Mode[0:1] равно трём.
Если Mode[0:1] равен нулю или единице, то входной параметр NumIn должен иметь длину 20 байт, а текст сообщения SHA-256 используется для создания nonce, сохраненного внутри TempKey, состоит из следующих элементов:
Регистр TempKey
Поскольку результат работы команды Nonce помещается в регистр TempKey, то нам нужно хорошо понимать что это такое. Перевод определения TempKey из даташита:
TempKey — это регистр хранения в массиве SRAM, который может использоваться для хранения временного значения результата выполнения команд Nonce, GenDig, StartMac или SHA. Содержимое этого регистра никогда не может быть прочитано извне устройства (хотя сама микросхема ATSHA204A может считывать и использовать его содержимое).
Другими словами, команда Nonce возвращает 32-байтовый случайный номер, сгенерированный RNG генератором в процессе её работы, а nonce, помещённый в регистр TempKey, недоступен нам для непосредственного чтения, а может только использоваться другими командами (GenDig, MAC, HMAC, Read и Write).
Итак, на этом мы закончим с теоретической частью и перейдём к созданию скетча ATSHA204A Nonce.
Скетч ATSHA204A Nonce
Задачей нашего скетча будет формирование корректных параметров вызова команды Nonce, генерация nonce на основе входного массива байтов и помещение полученного значения в регистр TempKey.
Текст скетча ATSHA204A Nonce:
/* ATSHA204A Nonce */ #include <sha204_library.h> const int sha204Pin = A3; atsha204Class sha204(sha204Pin); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Nonce start..."); nonce(); } void nonce() { uint8_t command[SHA204_CMD_SIZE_MAX]; uint8_t response[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_MODE_SEED_UPDATE //NONCE_MODE_NO_SEED_UPDATE //NONCE_MODE_PASSTHROUGH 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]); Serial.print(F("RetCode: ")); Serial.println(retCode); Serial.print(F("Result: ")); 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() { }
Объявляем массивы для команды и выходных данных, размеры этих массивов задаются заранее определёнными константами в библиотеке.
uint8_t command[SHA204_CMD_SIZE_MAX]; uint8_t response[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 с предопределённой константой
NONCE_MODE_NO_SEED_UPDATE
здесь же мы указали другие возможные варианты байта Mode вы можете использовать их в своих проектах, согласно крипто-логики вашей задачи.
//NONCE_MODE_SEED_UPDATE //NONCE_MODE_NO_SEED_UPDATE //NONCE_MODE_PASSTHROUGH
Поскольку результат выполнения команды Nonce помещается в TempKey и недоступен нам непосредственно, то об успешности выполнения команды мы можем судить только по коду возврата функции sha204.sha204m_execute(). В случае успеха он должен быть равен нулю.
Serial.print(F("RetCode: ")); Serial.println(retCode);
И в завершение выводим случайное RNG число, сгенерированное в процессе выполнения команды Nonce.
Serial.print(F("Result: ")); for (byte i = 1; i < 33; i++) { if (response[i] < 16) {Serial.print('0');} Serial.print(response[i], HEX); Serial.print(' '); } Serial.println();
Вот результат работы нашего скетча:
Контроллер рапортует об успешном выполнении команды Nonce и выводит на печать 32-байтовое случайное число. Сам nonce помещён в регистр TempKey и может использоваться функциями GenDig, MAC, HMAC, Read и Write.
Заключение
Команда Nonce имеет ещё множество вариантов использования, подробно описанных в даташите ATSHA204A, вы можете ознакомиться с ними и провести собственные эксперименты по генерации nonce для своих проектов.
Ссылки по теме
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 - Команда Nonce
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик