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

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

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

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

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

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

Чтение Use Flag (0 – 7)

Байты Use Flag определяют количество раз, когда «одноразовые» слоты 0 – 7 могут используется перед отключением. Создадим скетч для чтения этих байтов:

/* 
  ATSHA204 Read Config Use Flag
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

byte useFlag = 0;

byte  slots[8] = {13, 13, 14, 14, 15, 15, 16, 16};
byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1};

#define SLOT_NUM 0

byte slot  =  slots[SLOT_NUM];
byte shift = shifts[SLOT_NUM];

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Read Config Use Flag start...");

  for (byte i = 0; i < 8; i++) {
    slot  =  slots[i];
    shift = shifts[i];

    Serial.print(F("Use Flag"));
    Serial.print(i);
    Serial.print(F(": 0x"));
    readConf();
    Serial.println(useFlag, HEX);
  }
}

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

void readConf() {
  byte bufTx[SHA204_CMD_SIZE_MAX];
  byte bufRx[SHA204_RSP_SIZE_MAX];

  byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  useFlag = bufRx[SHA204_BUFFER_POS_DATA + 0 + shift*2];
}

void loop() {

}

И разберём его работу. Примечание: разбор типичных особенностей устройства скетчей чтения данных из конфигурационной зоны микросхемы ATSHA204A был дан в предыдущих статьях — если вы с ними ещё не знакомы, то рекомендуем  ознакомиться с этими статьями. А тут мы подробно остановимся только на особенностях текущего скетча чтения байтов Use Flag.

Итак, объявляем байтовые массивы, определяющие нужное положение байтов по слотам конфигурационной зоны и соответствующим смещениям, согласно даташита на ATSHA204A.

byte  slots[8] = {13, 13, 14, 14, 15, 15, 16, 16};
byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1};

Функция чтения байта Use Flag из заданного слота.

void readConf() {
  byte bufTx[SHA204_CMD_SIZE_MAX];
  byte bufRx[SHA204_RSP_SIZE_MAX];

  byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  useFlag = bufRx[SHA204_BUFFER_POS_DATA + 0 + shift*2];
}

И код вывода байтов Use Flag всех 8-и слотов в serial.

  for (byte i = 0; i < 8; i++) {
    slot  =  slots[i];
    shift = shifts[i];

    Serial.print(F("Use Flag"));
    Serial.print(i);
    Serial.print(F(": 0x"));
    readConf();
    Serial.println(useFlag, HEX);
  }

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

Выведены все байты Use Flag и все они имеют максимальное значение 0xFF.

Чтение Update Count (0 – 7)

Байты Update Count показывают, сколько раз слоты 0 – 7 были обновлены с помощью DeriveKey. Полный код скетча чтения байтов Update Count:

/* 
  ATSHA204 Read Config Update Count
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

byte updateCount = 0;

byte  slots[8] = {13, 13, 14, 14, 15, 15, 16, 16};
byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1};

#define SLOT_NUM 0

byte slot  =  slots[SLOT_NUM];
byte shift = shifts[SLOT_NUM];

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Read Config Update Count start...");

  for (byte i = 0; i < 8; i++) {
    slot  =  slots[i];
    shift = shifts[i];

    Serial.print(F("Update Count"));
    Serial.print(i);
    Serial.print(F(": 0x"));
    readConf();
    Serial.println(updateCount, HEX);
  }
}

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

void readConf() {
  byte bufTx[SHA204_CMD_SIZE_MAX];
  byte bufRx[SHA204_RSP_SIZE_MAX];

  byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  updateCount = bufRx[SHA204_BUFFER_POS_DATA + 1 + shift*2];
}

void loop() {

}

Получаем данные по выбранному слоту, используя смещение, согласно даташита на ATSHA204A.

void readConf() {
  byte bufTx[SHA204_CMD_SIZE_MAX];
  byte bufRx[SHA204_RSP_SIZE_MAX];

  byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  updateCount = bufRx[SHA204_BUFFER_POS_DATA + 1 + shift*2];
}

И выводим на печать данные сразу по всем 8-и слотам.

  for (byte i = 0; i < 8; i++) {
    slot  =  slots[i];
    shift = shifts[i];

    Serial.print(F("Update Count"));
    Serial.print(i);
    Serial.print(F(": 0x"));
    readConf();
    Serial.println(updateCount, HEX);
  }

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

Чтение Last Key Use (0 – 15)

Байты Last Key Use используются для ограничения использования слотов, каждый единичный бит представляет оставшееся их использование. Применяется только в том случае, если 5-й бит SlotConfig (Single Use) установлен в единицу.

Полный код скетча чтения байтов Last Key Use:

/* 
  ATSHA204 Read Config Last Key Use
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

byte lastKeyUse = 0;

byte  slots[] = {17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20};
byte shifts[] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};

#define SLOT_NUM 0

byte slot  =  slots[SLOT_NUM];
byte shift = shifts[SLOT_NUM];

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Read Config Last Key Use start...");

  for (byte i = 0; i < 16; i++) {
    slot  =  slots[i];
    shift = shifts[i];
  
    Serial.print(F("Last Key Use"));
    Serial.print(i);
    Serial.print(F(": 0x"));
    readConf();
    Serial.println(lastKeyUse, HEX);
  }
}

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

void readConf() {
  byte bufTx[SHA204_CMD_SIZE_MAX];
  byte bufRx[SHA204_RSP_SIZE_MAX];

  byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
  lastKeyUse = bufRx[SHA204_BUFFER_POS_DATA + shift];
}

void loop() {

}

И результат его работы — вывод данных (байтов Last Key Use ) по всем 16-и слотам:

Чтение UserExtra

Байт UserExtra используется для работы с системой и устанавливается с помощью команды CreateExtra. Код скетча для чтения байта UserExtra.

/* 
  ATSHA204 Read Config User Extra
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

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

byte userExtra = 0;

byte slot = 0;
byte retCode = 0;

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Read Config User Extra start...");

  Serial.print(F("User Extra: 0x"));
  readConf();
  Serial.print(userExtra, HEX);
}

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

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

void loop() {

}

Чтением данных о состоянии байта UserExtra занимается функция readConf().

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

Присваиваем переменной slot значение слота, содержащего байт UserExtra, согласно даташита.

  slot = 21;

Осуществляем чтение слота в массив bufRx.

  retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));

И получаем байт userExtra по смещению 0 (+ 0).

  userExtra = bufRx[SHA204_BUFFER_POS_DATA + 0];

Далее выводим данные в Serial.

  Serial.print(F("User Extra: 0x"));
  readConf();
  Serial.print(userExtra, HEX);

Результат работы скетча, байт userExtra равен нулю:

Чтение Selector

Selector — это байт выбора устройства, которое останется в активном режиме после выполнения команды Pause. Код чтения байта Selector из конфигурационной зоны микросхемы ATSHA204A.

/* 
  ATSHA204 Read Config Selector
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

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

byte selector = 0;

byte slot = 0;
byte retCode = 0;

atsha204Class sha204(ATSHA204_PIN);

void setup() {
  Serial.begin(115200);
  Serial.println("ATSHA204 Read Config Selector start...");

  Serial.print(F("Selector: 0x"));
  readConf();
  Serial.print(selector, HEX);
}

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

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

void loop() {

}

И результат его работы:

Чтение Lock Data

Байт Lock Data управляет блокировкой Data и OTP зон микросхемы ATSHA204A. В разблокированном состоянии эти зоны могут быть записаны, но недоступны для чтения. Возможные значения байта:

0x55 — Зоны Data и OTP разблокированы и имеют доступ на запись.

0x00 — Зоны данных и OTP заблокированы. Слоты в Data зоне могут быть изменены только на основе соответствующих полей WriteConfig. Зона OTP может быть изменена только в соответствии с правилами режима OTP.

Полный код скетча чтения байта Lock Data:

/* 
  ATSHA204 Read Config Lock Data
*/

#include <sha204_library.h>

#define ATSHA204_PIN A3

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

byte lockData = 0;

byte slot = 0;
byte retCode = 0;

atsha204Class sha204(ATSHA204_PIN);

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

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

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

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

void loop() {

}

И результат его работы:

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

Чтение Lock Config

Lock Config — это байт блокировки конфигурационной зоны микросхемы ATSHA204A. Его возможные значения:

0x55 — Зона конфигурации разблокирована (есть доступ на запись, по умолчанию)

0x00 — Зона конфигурации заблокирована (нет доступа на запись)

Код скетча чтения байта Lock Config:

/* 
  ATSHA204 Read Config Lock Conf
*/

#include <sha204_library.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 Read Config Lock Conf start...");

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

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];
}

void loop() {

}

Результат работы скетча:

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

Заключение

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

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

Работа с SHA-256

ATSHA204 - Обзор

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

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

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

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

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