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

ATSHA204A — Config Lock

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

В этой статье мы подробно разберём технологию блокировки (Lock) конфигурационной зоны микросхемы ATSHA204A, а также все подробности и нюансы этого процесса.

Таблица зоны конфигурации

Для справки ещё раз приводим таблицу конфигурационной зоны микросхемы ATSHA204A.

Процесс блокировки (Lock)

Процесс блокировки конфигурационной зоны микросхемы ATSHA204A состоит из нескольких этапов:

Этап 0 — Планирование. На этом этапе вы планируете криптоархитектуру вашего проекта и должны чётко представлять себе все его части и протоколы, а также иметь список ключей, паролей, хешей и мест их хранения в памяти ATSHA204A.

Этап 1 — Чтение. На первом этапе вы осуществляете чтение конфигурационной зоны микросхемы ATSHA204A и проверяете на соответствие вашим требованиям все настройки, сохранённые в вашем конкретном экземпляре  ATSHA204A.

Этап 2 — Запись. На втором этапе вы изменяете нужные настройки микросхемы ATSHA204A в соответствии с планом и криптоархитектурой вашего проекта.

Этап 3 — Проверка. Ещё раз читаете данные из конфигурационной зоны ATSHA204A и ещё раз проверяете правильность установки каждого байта.

Этап 4 — Блокировка. Осуществляете процедуру блокировки конфигурационной зоны микросхемы ATSHA204A и проверяете изменение соответствующего байта конфигурационной зоны (#87) со значения 0x55 на 0x00.

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

Далее мы подробно рассмотрим весь этот процесс.

Планирование

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

Планирование криптоархитектуры вам нужно будет осуществлять в ваших реальных проектах.

Чтение

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

Как вы видите, байт #87 «Lock Config» имеет значение по умолчанию 0x55 и это означает, что микросхема не заблокирована.

Запись

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

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

Блокировка

Теперь переходим к описанию процесса и скетча блокировки конфигурационной зоны микросхемы ATSHA204A. Начнём мы с библиотеки sha204_library.

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

Это библиотека sha204_library, входящая в состав дистрибутива популярного проекта mySensors. Эта библиотека находится в папке

MySensors\examples\SecurityPersonalizer

дистрибутива и состоит из трёх файлов. Вам достаточно поместить эти файлы в папку со скетчем, который мы будем разбирать далее.

Теперь код скетча блокировки конфигурационной зоны микросхемы ATSHA204A.

Обратите внимание: скетч не имеет предохранителей и если вы запустите его, то ваш экземпляр микросхемы ATSHA204A будет заблокирован! Используйте скетч только тогда, когда вы всё проверили и полностью уверены в своих действиях.

/* 
  ATSHA204 Write Lock Conf
*/

#include "sha204_library.h"
#include "sha204_lib_return_codes.h"

#define ATSHA204_PIN A3

byte bufTx[SHA204_CMD_SIZE_MAX];
byte bufRx[SHA204_RSP_SIZE_MAX];

byte lockConf = 0;

byte slot = 0;
byte retCode = 0;

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Write Lock Conf start...");

  lockConfig();
  
  Serial.print(F("Lock Conf: 0x"));
  readConf();
  Serial.print(lockConf, HEX);
}

// Read

byte addr(byte slot) {
  return slot * 4;
}

void readConf() {
  slot = 21;
  retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  
  lockConf = bufRx[SHA204_BUFFER_POS_DATA + 3];
}

// Write

uint16_t calcConfigCrc() {
  uint16_t crc = 0;
  uint8_t bufSlot[4];

  for (byte i = 0; i < 88; i += 4) {
    retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, i);
    if (retCode != SHA204_SUCCESS) {
      Serial.println(F("Err read"));
    }
    
    bufSlot[0] = bufRx[SHA204_BUFFER_POS_DATA + 0];
    bufSlot[1] = bufRx[SHA204_BUFFER_POS_DATA + 1];
    bufSlot[2] = bufRx[SHA204_BUFFER_POS_DATA + 2];
    bufSlot[3] = bufRx[SHA204_BUFFER_POS_DATA + 3];

    crc = sha204.calculateAndUpdateCrc(4, bufSlot, crc);
  }
  return crc;
}


void lockConfig() {
  uint16_t crc = calcConfigCrc();

  retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx);
  if (retCode != SHA204_SUCCESS &&
      retCode != SHA204_RESYNC_WITH_WAKEUP) {
    Serial.println(F("Resync failed"));
    return;
  }

  retCode = sha204.sha204m_execute(SHA204_LOCK,
                                    SHA204_ZONE_CONFIG, crc,
                                    0, NULL,
                                    0, NULL,
                                    0, NULL,
                                    LOCK_COUNT,    bufTx,
                                    LOCK_RSP_SIZE, bufRx);
  if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));}
                             else {Serial.println(F("Lock failed"));}
}

// Loop

void loop() {

}

И подробный разбор его работы. Мы здесь не будем останавливаться на деталях, которые были подробно объяснены в предыдущих статьях.

Работу по блокировке конфигурационной зоны выполняет функция lockConfig()

void lockConfig() {
  uint16_t crc = calcConfigCrc();

  retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx);
  if (retCode != SHA204_SUCCESS &&
      retCode != SHA204_RESYNC_WITH_WAKEUP) {
    Serial.println(F("Resync failed"));
    return;
  }

  retCode = sha204.sha204m_execute(SHA204_LOCK,
                                    SHA204_ZONE_CONFIG, crc,
                                    0, NULL,
                                    0, NULL,
                                    0, NULL,
                                    LOCK_COUNT,    bufTx,
                                    LOCK_RSP_SIZE, bufRx);
  if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));}
                             else {Serial.println(F("Lock failed"));}
}

где сначала вычисляется контрольная сумма конфигурационной зоны

  uint16_t crc = calcConfigCrc();

затем проверяется связь с чипом ATSHA204A

  retCode = sha204.sha204c_resync(SHA204_RSP_SIZE_MAX, bufRx);
  if (retCode != SHA204_SUCCESS &&
      retCode != SHA204_RESYNC_WITH_WAKEUP) {
    Serial.println(F("Resync failed"));
    return;
  }

и непосредственно осуществляется блокировка конфигурационной зоны

  retCode = sha204.sha204m_execute(SHA204_LOCK,
                                    SHA204_ZONE_CONFIG, crc,
                                    0, NULL,
                                    0, NULL,
                                    0, NULL,
                                    LOCK_COUNT,    bufTx,
                                    LOCK_RSP_SIZE, bufRx);

Контрольная сумма вычисляется функцией calcConfigCrc()

uint16_t calcConfigCrc() {
  uint16_t crc = 0;
  uint8_t bufSlot[4];

  for (byte i = 0; i < 88; i += 4) {
    retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, i);
    if (retCode != SHA204_SUCCESS) {
      Serial.println(F("Err read"));
    }
    
    bufSlot[0] = bufRx[SHA204_BUFFER_POS_DATA + 0];
    bufSlot[1] = bufRx[SHA204_BUFFER_POS_DATA + 1];
    bufSlot[2] = bufRx[SHA204_BUFFER_POS_DATA + 2];
    bufSlot[3] = bufRx[SHA204_BUFFER_POS_DATA + 3];

    crc = sha204.calculateAndUpdateCrc(4, bufSlot, crc);
  }
  return crc;
}

где в цикле перебираются 22 слота по 4 байта

for (byte i = 0; i < 88; i += 4) {
  ...
}

и подсчитывается контрольная сумма

    crc = sha204.calculateAndUpdateCrc(4, bufSlot, crc);

Если вы всё сделали правильно, то в результате увидите сообщение об удачной блокировке конфигурационной зоны:

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

Проверка

Теперь выполним финальную проверку блокировки нашей микросхемы и её настроек. Для этого воспользуемся скетчем чтения конфигурационной зоны из нашей предыдущей статьи.

Всё правильно, все настройки на месте, байт #87 (Lock Config) изменился на 0x00 — наша микросхема успешно заблокирована.

Заключение

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

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

Работа с SHA-256

ATSHA204 - Обзор

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

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

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

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

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

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

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

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

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

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

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

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

ATSHA204A - Data Lock

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

ATSHA204A - Команда MAC

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

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