logo
+7 (495) 997-37-74
Москва, ул.Международная, 15

ATSHA204A — Аутентификация. Датчик

В прошлой статье мы попытались обобщить знания об устройстве и функционировании микросхемы ATSHA204A и создать прототип системы аутентификации «база — датчик». Мы разобрали пример построения и код базового блока, в этой статье мы завершим построение системы аутентификации и создадим и разберём работу кода датчика.

Задача аутентификации

Как вы помните из предыдущей статьи, нам нужно разработать систему в которой «база» (базовый контроллер) при общении с «датчиком» сможет однозначно распознать, что ответ на запрос пришёл именно от «родного» датчика (принадлежащего нашей экосистеме, а не поддельного).

Базовый контроллер посылает запрос на датчик, а датчик формирует ответ по которому база может однозначно определить, что он пришёл от «легитимного» устройства нашей экосистемы. Вся криптографическая часть проекта обеспечивается микросхемой ATSHA204A.

Обратите внимание: пример, рассматриваемый в данной статье, может использоваться в реальных проектах, но только как одна из частей крипто-архитектуры системы. В реальных проектах, параллельно с задачей аутентификации устройств, нужно решать ещё множество других задач по обеспечению безопасного обмена информацией.

Крипто-архитектура

Напомним ещё раз крипто-архитектуру нашего проекта:

Базовый блок и датчик содержат в своём составе идентично запрограммированные микросхемы ATSHA204A (сам процесс работы с микросхемами ATSHA204A и их программирования подробно описаны в этом цикле статей).

Базовый блок и датчик имеют у себя на борту чипы ATSHA204A и в каждый чип заранее зашит одинаковый секретный ключ.

Микросхемы ATSHA204A имеют встроенный генератор случайных чисел. В нашем примере чип ATSHA204A базового блока генерирует случайное число и подаёт его на вход как своего блока вычисления хеш-функции SHA-256, так и передаёт контроллеру для отсылки удалённому датчику, который имеет такой же блок хеширования и такой же секретный ключ внутри своего чипа ATSHA204A.

В результате обе микросхемы ATSHA204A вычисляют хеш на основе случайного числа и секретного ключа (зашитого в микросхемы и недоступного для чтения извне) и датчик отсылает его (хеш) обратно базовому блоку для сравнения. Далее на базовом блоке происходит сравнение хешей и принимается решение о верификации («легитимности») или не верификации датчика.

Поскольку секретный ключ хранится в микросхемах ATSHA204A, недоступен злоумышленнику и не передаётся по сети, то злоумышленник не может подделать ответ датчика на произвольное случайное число, присылаемое базовым блоком. Таким образом происходит проверка на «легитимность» удалённого датчика.

Датчик нашей экосистемы

Теперь переходим с созданию и описанию работы скетча датчика (нашей экосистемы).

Мы имеем запрограммированную микросхему ATSHA204A (2 идентично запрограммированных экземпляра — один для базы и другой для датчика) в Data зоне которой содержатся секретные 32-байтовые ключи, 13 из которых недоступны для чтения извне.

Как и на базе, в датчике используется нулевой (0) слот зоны данных (Data Zone), который содержит 32 байта со значениями 0x00 (в вашем реальном проекте этот ключ будет содержать другую информацию). Нулевой слот в нашей конфигурации ATSHA204A недоступен для чтения извне и, даже украв ваш датчик, злоумышленник не сможет извлечь из ATSHA204A ваш секретный ключ и не сможет клонировать ваши датчики.

Алгоритм работы схемы аутентификации датчика несколько отличается от алгоритма работы базы. На базе мы генерировали секретный ключ и вычисляли его SHA хеш, используя секретный ключ из нулевого слота Data зоны нашей микросхемы ATSHA204A.

На датчике мы не генерируем случайное число, а получаем его от базы, используя любой вид и канал связи между контроллерами (в соответствии с вашим проектом). А затем уже вычисляем SHA хеш полученного случайного числа с использованием секретного ключа из нулевого слота Data зоны нашей идентично (с базой) запрограммированной микросхемы ATSHA204A.

Алгоритм работы нашей системы аутентификации на стороне датчика можно описать следующим образом:

  1. Датчик принимает от базы тестовое случайное число
  2. Вычисляет SHA хеш на основе полученного числа и ключа из своего экземпляра ATSHA204A
  3. Отсылает вычисленный хеш обратно на базу

На стороне базы:

  1. База сравнивает хеши и принимает решение о «легитимности» датчика

Теперь код датчика, который на основе полученного случайного числа вычисляет хеш (как уже было отмечено ранее, без функций реализации транспорта передачи и приёма информации, специфичного для вашего конкретного проекта).

/* 
  ATSHA204A Project (Sensor)
*/

#include <sha204_library.h>

const int sha204Pin = A3;

byte rnd[MAC_CHALLENGE_SIZE] = {
  0x23, 0x47, 0x3B, 0x1D, 0x89, 0xEA, 0x07, 0x80,
  0x07, 0x5A, 0xEE, 0xD9, 0xEC, 0x8D, 0xF5, 0x68,
  0x88, 0xAC, 0x3B, 0x36, 0x50, 0xF4, 0x03, 0xA4,
  0xDF, 0xB3, 0x38, 0xA7, 0x16, 0xBA, 0x4A, 0xF5
};

byte challenge[MAC_CHALLENGE_SIZE];
byte hash[MAC_CHALLENGE_SIZE];

byte retCode = 0;

atsha204Class sha204(sha204Pin);


void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Project (Sensor) start...");
  
  getRandom();
  
  Serial.println("Random:");
  printArray(challenge, 32);
  Serial.println();
  
  macChallenge();
  Serial.println("Hash:");
  printArray(hash, 32);
  Serial.println();
}

// Print

void printArray(byte arr[], byte len) {
  for (byte i = 0; i < len; i++) {
    if (arr[i] < 16) {Serial.print('0');}
    Serial.print(arr[i], HEX); Serial.print(' ');
  }
}

// Random

void getRandom() {
  for (byte i = 0; i < 32; i++) {
    challenge[i] = rnd[i];
  }
}

// MAC

void macChallenge() {
  uint8_t command[MAC_COUNT_LONG];
  uint8_t response[MAC_RSP_SIZE];

  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++) {
    hash[i] = response[i];
  }
}

void loop() {
  
}

Подробный разбор его работы: вначале мы объявляем массив rnd, в который вносим случайное 32-байтовое число, сгенерированное ATSHA204A микросхемой базы на прошлом уроке. В вашем реальном проекте это (в данном случае тестовое) число ваш датчик должен получить от базы.

byte rnd[MAC_CHALLENGE_SIZE] = {
  0x23, 0x47, 0x3B, 0x1D, 0x89, 0xEA, 0x07, 0x80,
  0x07, 0x5A, 0xEE, 0xD9, 0xEC, 0x8D, 0xF5, 0x68,
  0x88, 0xAC, 0x3B, 0x36, 0x50, 0xF4, 0x03, 0xA4,
  0xDF, 0xB3, 0x38, 0xA7, 0x16, 0xBA, 0x4A, 0xF5
};

Далее объявляем два массива для хранения случайного 32-байтового числа и SHA хеша.

byte challenge[MAC_CHALLENGE_SIZE];
byte hash[MAC_CHALLENGE_SIZE];

Затем при помощи функции getRandom() получаем 32-байтовое случайное число в массив challenge. В вашем реальном проекте это число будет браться не из массива rnd, а приходить по сети от базы. Как уже было отмечено ранее, проводных и беспроводных способов передачи данных существует великое множество и конкретная реализация процедуры обмена ими зависит от специфики вашего проекта.

void getRandom() {
  for (byte i = 0; i < 32; i++) {
    challenge[i] = rnd[i];
  }
}

Далее на основе полученного случайного числа (находящегося в массиве challenge) и секретного ключа из нулевого слота Data зоны нашей микросхемы ATSHA204A вычисляем SHA хеш.

void macChallenge() {
  uint8_t command[MAC_COUNT_LONG];
  uint8_t response[MAC_RSP_SIZE];

  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++) {
    hash[i] = response[i];
  }
}

И помещаем его в массив hash.

  for (byte i = 0; i < 32; i++) {
    hash[i] = response[i];
  }

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

  Serial.println("Random:");
  printArray(challenge, 32);
  Serial.println();
  
  macChallenge();
  Serial.println("Hash:");
  printArray(hash, 32);
  Serial.println();

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

Как вы видите, вычисленные SHA хеши на базе и датчике совпадают и база может сделать уверенный вывод о том, что датчик, приславший ответ, является «легитимным» контроллером нашей экосистемы. Уверенность этому решению придаёт то, что вычислить правильный хеш в ответ на случайное число можно только имея доступ к секретному ключу в Data зоне (запрограммированной нами) микросхемы ATSHA204A.

Заключение

Мы успешно построили прототип системы аутентификации «база — датчик» на основе специализированной крипто-микросхемы ATSHA204A. Как вы понимаете, это только один из простых (но чрезвычайно полезный) пример использования ATSHA204 и эта микросхема содержит ещё множество полезных функций, которые вы можете использовать в своих проектах.

 

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

Работа с 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