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