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

ATSHA204A — Data Lock

ATSHA204A — Lock Data

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

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

Состояние Extra байтов конфигурационной зоны

Конфигурационная зона микросхемы ATSHA204A содержит т. н. «Extra» байты, которые определяют состояние (Lock) как самой конфигурационной зоны (байт #87), так и её Data и OTP зон (байт #86). В изначальном состоянии оба эти байта имеют значение 0x55 и это значит, что эти зоны не заблокированы.

При блокировке зон соответствующий байт меняет своё значение с 0x55 на 0x00 и мы уже проводили подобную операцию с конфигурационной зоной (см. наши предыдущие статьи). Теперь нам предстоит изменить значение байта #86 конфигурационной зоны на 0x00.

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

Красным цветом выделен интересующий нас байт (#86), с которым мы и будем сегодня проводить манипуляции.

Порядок блокировки зон

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

Условно последовательность работы с ATSHA204A можно представить следующим образом:

  1. Запись Config зоны
  2. Блокировка Config зоны
  3. Запись Data зоны
  4. Запись OTP зоны
  5. Блокировка Data Lock
  6. Чтение Data/OTP

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

Первая строка таблицы — это начальное состояние ATSHA204A, когда конфигурационная зона не заблокирована и доступна для чтения и записи, а Data/OTP зоны недоступны ни для чтения, ни для записи.

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

Третья строка — это состояние после Data Lock, когда становится возможным чтение из Data/OTP зон и частичная, в соответствии с установленными ранее правилами, запись в эти зоны.

Библиотека sha204_library

Как и в случае блокировки конфигурационной зоны (Lock Config), мы будем пользоваться библиотекой sha204_library, входящей в состав дистрибутива популярного проекта mySensors. Эта библиотека находится в папке

MySensors\examples\SecurityPersonalizer

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

Скетч ATSHA204 Lock Data

Теперь приведём код скетча блокировки Data и OTP зон (Lock Data) микросхемы ATSHA204A, а затем подробнее рассмотрим его работу.

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

/* 
  ATSHA204 Lock Data
*/

#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 lockData = 0;
byte retCode = 0;

atsha204Class sha204(ATSHA204_PIN);


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

  lock();
  
  Serial.print(F("Lock Data: 0x"));
  readConf();
  Serial.print(lockData, HEX);
}

// Read

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

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

// Write

void lock() {
  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_OTP | LOCK_ZONE_NO_CRC, 0,
                                    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() {

}

Вначале мы объявляем переменную lockData для чтения текущего состояния байта Lock Data (#86).

byte lockData = 0;

Логика работы скетча определяется в функции setup()

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

  lock();
  
  Serial.print(F("Lock Data: 0x"));
  readConf();
  Serial.print(lockData, HEX);
}

Сначала мы проводим операцию изменения байта Lock Data.

  lock();

А затем читаем состояние этого байта из памяти ATSHA204A и выводим его в Serial для контроля.

  Serial.print(F("Lock Data: 0x"));
  readConf();
  Serial.print(lockData, HEX);

Саму операцию по блокировке Data и OTP зон памяти производит функция lock()

void lock() {
  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_OTP | LOCK_ZONE_NO_CRC, 0,
                                    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"));}
}

где вначале производится проверка связи с чипом 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;
  }

и затем функцией sha204.sha204m_execute(), с соответствующими параметрами, производится операция блокировки.

  retCode = sha204.sha204m_execute(SHA204_LOCK,
                                    SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0,
                                    0, NULL,
                                    0, NULL,
                                    0, NULL,
                                    LOCK_COUNT,    bufTx,
                                    LOCK_RSP_SIZE, bufRx);

После чего проверяется и выводится в Serial результат проведённой операции.

  if (retCode == SHA204_SUCCESS) {Serial.println(F("Lock done"));}
                            else {Serial.println(F("Lock failed"));}

И в завершение функцией readConf() производится, ставшая уже стандартной для нас, операция чтения данных из конфигурационной зоны ATSHA204A.

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

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

Обратите внимание, в отличие от процедуры блокировки конфигурационной зоны из наших прошлых статей, в этом скетче мы вызывали функцию sha204.sha204m_execute() с флагом блокировки зоны без проверки CRC контрольной суммы данных.

                                    SHA204_ZONE_OTP | LOCK_ZONE_NO_CRC, 0,

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

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

Вот скриншот финального состояния конфигурационной зоны:

Красным отмечен байт #86 Lock Data, который теперь равен 0x00 (как и байт #87 Lock Config). Наша микросхема полностью сконфигурирована и заблокирована и может приступать к основному режиму работы.

Заключение

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

 

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

Работа с 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 и OTP зон памяти

ATSHA204A - Команда MAC

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

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

ATSHA204A - Криптография и команды

ATSHA204A - Команда CheckMac

ATSHA204A - Команда Nonce

ATSHA204A - Команда GenDig

ATSHA204A - Команда HMAC

ATSHA204A - Команда DeriveKey