
И вот наконец, после всех предыдущих статей цикла, мы подошли к первому промежуточному финишу в процессе работы с микросхемой 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).
Ссылки по теме
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 - Криптография и команды
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик



