Защищенная ячейка определяется структурой в памяти электронного ключа, называемой дескриптором. Дескриптор состоит из полей, описывающих тип данных, которые хранятся в защищенной ячейке, ее свойства, состояние, пароли активации/деактивации и на выполнение операций с данными.
Обращение к защищенной ячейке / аппаратному алгоритму производится по числовому имени. Числовое имя – это идентификатор длиной 2 байта, который хранится в специальной таблице числовых имен ячеек и алгоритмов (Algorithm Root Table, ART). Числовое имя позволяет идентифицировать ячейку вне зависимости от того, какую область памяти она занимает, поскольку «физически» ячейки могут располагаться в памяти в произвольном порядке.
Смещение от начала дескриптора | Длинаполя в байтах | Обозначение поля | Описание поля |
---|---|---|---|
00h | 1 | rs_LoFlags | Младший байт флагов, см. Определения nsafl_xxx |
01h | 1 | rs_algo | Код типа алгоритма (см. определения rs_algo_XXXX) |
02h | 2 | ReservedForEven | Зарезервировано для выравнивания |
04h | 4 | rs_HiFlags | Дополнительные флаги, см. определения nsafh_xxx |
08h | 4 | rs_klen | Длина данных ячейки или определителя алгоритма в байтах (rs_K[]). Нужно учитывать необходимость оставить 16 свободных байт в конце доступной памяти. Для алгоритмов SHA256 равно 0. Для алгоритмов с загружаемым кодом соответствует размеру структуры TgrdLoadableCodeData |
0C | 4 | rs_blen | Размер блока данных для аппаратного алгоритма. Для алгоритма SHA256 равно 0. Для защищенных ячеек и алгоритмов с загружаемым кодом содержимое поля игнорируется |
10 | 8 | rs_hash | Зарезервировано. Поле должно быть заполнено нулями |
18 | 4 | rs_ActivatePwd | Пароль активации (если установлен флаг nsafl_ActivationSrv) |
1C | 4 | rs_DeactivatePwd | Пароль деактивации (если установлен флаг nsafl_DeactivationSrv) |
20 | 4 | rs_ReadPwd | Пароль для чтения полей rs_GP, rs_ErrorCounter, rs_K[] с помощью функции GrdPI_Read (если установлен флаг nsafh_ReadPwd) |
24 | 4 | rs_UpdatePwd | Пароль для изменения полей rs_GP, rs_ErrorCounter, rs_K[] с помощью функции GrdPI_Update (если установлен флаг nsafh_UpdateSrv) |
28 | 6 | rs_BirthTime | Дата и время автоматической активации ячейки (если установлен флаг nsafh_BirthTime). |
2E | 6 | rs_DeadTime | Дата и время автоматической деактивации ячейки (если установлен флаг nsafh_DeadTime). |
34 | 8 | rs_Lifetime | Время, в течение которого ячейка будет оставаться активной после 1-го обращения к ней или вызова алгоритма (если установлен флаг nsafh_Lifetime) |
3C | 8 | rs_FlipTime | Если указан флаг nsafh_FlipTime - алгоритм меняется каждые rs_DaysGap дней, начиная с даты rs_ChangeFlipTimeStart |
44 | 4 | rs_GP | Обратный счетчик. Если установлен флаг nsafl_GP_dec, счетчик уменьшается на 1 при каждом вызове алгоритма через функцию GrdTransform(). При использовании других функций (например, GrdHash() или GrdCrypt() на больших объемах данных) счетчик может уменьшаться быстрее, согласно количеству вызовов GrdTransform() внутри вызывающей функции. По достижении счетчиком нулевого значения, алгоритм переходит в деактивированное состояние и перестает преобразовывать данные. При дальнейших обращениях возвращается код ошибки GrdE_GPis0. Значение счетчика можно увеличить, только записав весь дескриптор заново |
48 | 4 | rs_ErrorCounter | Допустимое количество ошибок ввода паролей (если установлен хотя бы один из флагов: nsafl_ActivationSrv, nsafl_DeactivationSrv, nsafl_UpdateSrv). Используется только 1 байт этого поля. По достижении счетчиком нуля защищенная ячейка переходит в состояние с неизменяемым статусом. При вводе правильного пароля значение счетчика не восстанавливается |
4C | rs_klen | rs_K[] | Данные защищенной ячейки или определитель алгоритма длиной rs_klen. Для алгоритмов с загружаемым кодом в этом поле хранится структура TgrdLoadableCodeData |
Поле rs_LoFlags содержит младший байт флагов, определяющих свойства защищенной ячейки. Возможна установка следующих флагов (приведенные ниже названия флагов используются в Guardant API):
Имя флага | Значение | Комментарий |
---|---|---|
nsafl_ID | 1 | Уникальность алгоритма по ID ключа. При одинаковых определителях алгоритмы в разных ключах кодируют данные по-разному. Флаг работает только для симметричных алгоритмов (AES128 и GSII64), остальными типами алгоритмов не используется |
nsafl_GP_dec | 2 | Уменьшать счетчик GP при каждой обращении к алгоритму. По достижении счетчиком GP 0, алгоритм/ ячейка автоматически деактивируется и при дальнейших обращениях возвращается код ошибки GrdE_GPis0. Для алгоритмов SHA256 флаг игнорируется |
nsafl_GP | 4 | Зависимость преобразования данных от значения счетчика GP. В современных ключах не используется |
nsafl_ST_III | 8 | В современных ключах флаг установлен |
nsafl_ActivationSrv | 16 | Сервис активации доступен |
nsafl_DeactivationSrv | 32 | Сервис деактивации доступен |
nsafl_UpdateSrv | 64 | Сервис изменения данных ячеек rs_K[] по паролю доступен (функция GrdPI_Update поддерживается) |
nsafl_InactiveFlag | 128 | Признак, что в данный момент алгоритм/ячейка деактивирован. Операции GrdTransform, GrdPI_Read, GrdPI_Update недоступны. |
Возможность применения флагов свойств в алгоритмах и защищенных ячейках:
Имя флага | AES128, GSII64 | ECC160 | SHA256 | Загружаемыйкод | Ячейка с данными |
nsafl_ID | + | - | - | - | - |
nsafl_GP_dec | + | + | + | + | - |
nsafl_GP | - | - | - | - | - |
nsafl_ST_III | + | + | + | + | - |
nsafl_ActivationSrv | + | + | + | + | + |
nsafl_DeactivationSrv | + | + | + | + | + |
nsafl_UpdateSrv | + | + | + | + | + |
nsafl_InactiveFlag | + | + | + | + | + |
nsafh_ReadSrv | + | + | + | + | + |
nsafh_ReadPwd | + | + | + | + | + |
nsafh_BirthTime | + | + | + | + | - |
nsafh_DeadTime | + | + | + | + | - |
nsafh_LifeTime | + | + | + | + | - |
nsafh_FlipTime | + | - | - | - | - |
Поле rs_algo содержит код типа защищенной ячейки.
а) Для Guardant Sign/Time/Net доступны следующие коды типов данных защищенных ячеек:
Имя кода | Значение | Комментарий |
---|---|---|
| 0-4 | Зарезервировано |
rs_algo_GSII64 | 5 | Симметричный алгоритм кодирования данных.Секретный ключ размером 128 или 256 бит |
rs_algo_HASH64 | 6 | Вычисление 64-битного хэша.Секретный ключ размером 128 или 256 бит |
rs_algo_RND64 | 7 | Генерация 64-битного случайного числа |
rs_algo_PI | 8 | Защищенная ячейка данных |
rs_algo_GSII64_ENCRYPT | 10 | Аналогичен rs_algo_GSII64, но возможно только зашифрование |
rs_algo_GSII64_DECRYPT | 11 | Аналогичен rs_algo_GSII64, но возможно только расшифрование |
rs_algo_ECC160 | 12 | Цифровая подпись по алгоритму ECC 160 бит.Размер определителя при этом 20 байт |
rs_algo_AES128 | 13 | AES-128 (режимы шифрования поддерживаются) |
rs_algo_SHA256 | 15 | Алгоритм хэширования SHA256. Определитель не содержит данных в поле rs_K[] |
б) Для Guardant Code/Code Time допустимы следующие значения:
Имя кода | Значение | Комментарий |
rs_algo_PI | 8 | Защищенная ячейка, содержащая данные |
rs_algo_ECC160 | 12 | Цифровая подпись по алгоритму ECC 160 бит. Размер определителя при этом 20 байт |
rs_algo_AES128 | 13 | Симметричное шифрование по AES с длиной ключа 128 бит (режимы шифрования поддерживаются) |
rs_algo_LoadableCode | 14 | Алгоритм, содержащий загружаемый код |
rs_algo_SHA256 | 15 | Алгоритм хэширования SHA256. Определительне содержит данных в поле rs_K[] |
rs_algo_AES128Encode | 16 | Симметричное шифрование по AES с длиной ключа 128 бит. Данные могут только зашифровываться. Возможны режимы шифрования только ECB и CBC |
rs_algo_AES128Decode | 17 | Симметричное шифрование по AES с длиной ключа 128 бит. Данные могут только расшифровываться. Возможны режимы шифрования только ECB и CBC |
Поле rs_HiFlags содержит 4 байта флагов, определяющих свойства защищенной ячейки. Возможна установка следующих флагов (приведенные названия флагов используются в Guardant API):
Имя флага | Значение | Комментарий |
---|---|---|
nsafh_ReadSrv | 1 | Сервис чтения данных ячеек rs_K[] доступен (функция GrdPI_Read поддерживается) |
nsafh_ReadPwd | 2 | Чтение осуществляется по паролю rs_ReadPwd |
nsafh_BirthTime | 4 | Включен режим активации в указанное время (хранится в поле rs_BirthTime) |
nsafh_DeadTime | 8 | Включен режим деактивации в указанное время (хранится в поле rs_DeadTime) |
nsafh_LifeTime | 16 | Включен режим деактивации через указанное время после первого обращения к ячейке (оставшееся до деактивации время хранится в ячейке rs_LifeTime) |
nsafh_FlipTime | 32 | Включен режим автоматического изменения определителя каждые rs_DaysGap дней, начиная с даты rs_ChangeFlipTimeStart. |
Поле rs_klen содержит размер данных rs_K[], хранящихся в защищенной ячейке (секретного ключа алгоритма) в байтах.
Поле rs_blen содержит минимальный размер блока данных для аппаратного алгоритма. Допустимые значения:
Тип аппаратного алгоритма | rs_klen - длина секретного ключа, байт | rs_blen - минимальная длина блока данных, байт |
GSII64 | GrdADS_GSII64=16/32 | GrdARS_GSII64=8 |
HASH64 | GrdADS_HASH64=16/32 | GrdARS_HASH64=8 |
RND64 | GrdADS_RAND64=16/32 | GrdARS_RAND64=8 |
AES128 | GrdADS_AES128=16 | GrdARS_AES128=16 |
ECC160 | GrdADS_ECC160=20 | GrdARS_ECC160=20 |
SHA256 | - | GrdARS_HASH_SHA256=0 |
Загружаемый код | sizeof(TGrdLoadableCodeData) | Не используется |
Для алгоритмов GSII64, HASH64 и RND64 при ошибочном значении длины ключа, его длина устанавливается равной 16 байт.
Поле rs_hash зарезервировано для будущего использования.
Поле rs_ActivatePwd содержит 4-байтовый пароль активации защищенной ячейки, в том случае, если разрешен сервис активации установкой флага nsafl_ActivationSrv.
Поле rs_DeactivatePwd содержит 4-байтовый пароль деактивации защищенной ячейки, в том случае, если разрешен сервис деактивации установкой флага nsafl_DeactivationSrv.
Поле rs_ReadPwd содержит 4-байтовый пароль чтения данных защищенной ячейки, в том случае, если разрешен сервис чтения данных по паролю установкой флага nsafh_ReadPwd.
Поле rs_UpdatePwd содержит 4-байтовый пароль на обновление данных защищенной ячейки в том случае, если разрешен сервис обновления данных по паролю установкой флага nsafh_UpdateSrv.
Поле rs_BirthTime содержит дату и время автоматической активации алгоритма. Если не установлен флаг nsafh_BirthTime, значение поля игнорируется. Дата и время хранятся в структуре TGrdTime:
Смещение | Длина | Название | Комментарий |
---|---|---|---|
0 | BYTE | BSeconds | Секунды от 0 до 59 |
1 | BYTE | BMinute | Минуты от 0 до 59 |
2 | BYTE | BHour | Часы от 0 до 23 |
3 | BYTE | BDay | Дни от 1 до 31 |
4 | BYTE | BMonth | Месяцы от 1 до 12 |
5 | BYTE | BYear | Годы от 0 до 99, начиная с 2000 года |
Поле rs_DeadTime содержит дату и время автоматической деактивации алгоритма. Если не установлен nsafh_DeadTime, значение поля игнорируется. Дата и время хранятся в структуре TgrdTime (см. выше).
Поле rs_LifeTime содержит время, в течение которого алгоритм будет оставаться в активном состоянии после первого обращения к нему. Если не установлен флаг nsafh_LifeTime, значение поля игнорируется. Дата и время хранятся в структуре TGrdLifeTime:
Смещение | Длина | Название | Комментарий |
0 | TGrdTime | LifeTime | Срок жизни аппаратного алгоритма после первого обращения (в виде разницы дат) |
6 | BYTE | State | 0 – обращений к алгоритму еще не было, это исходное значение. При предпродажном программировании ключа в поле rs_DeadTime рекомендуется помещать текущее время на момент программирования. |
7 | BYTE | ReservedForEven | Зарезервировано для выравнивания |
Поле rs_FlipTime содержит время rs_ChangeFlipTimeStart, когда должна начаться автоматическая модификация определителя алгоритма и количество дней rs_DaysGap, составляющих период смены.
Если не установлен флаг nsafh_FlipTime, значение поля игнорируется. Дата и время хранятся в структуре TGrdFlipTime:
Смещение | Длина | Название | Комментарий |
0 | TGrdTime | rs_ChangeFlipTimeStart | Дата и время, с которого начинается отсчет |
6 | BYTE | rs_DaysGap | Алгоритм меняется каждые rs_DaysGap дней, начиная с даты rs_ChangeFlipTimeStart. Должно быть значение от 1 до 255 |
7 | BYTE | ReservedForEven | Зарезервировано для выравнивания |
Поле rs_GP содержит счетчик алгоритма. Если указан флаг nsaf_GP_dec, то это поле задает то количество раз, которое алгоритм может быть выполнен. По достижении счетчиком нулевого значения, такой алгоритм переходит в деактивированное состояние и перестает преобразовывать данные. При дальнейших обращениях возвращается код ошибки GrdE_InactiveItem. Значение счетчика можно увеличить, только записав весь дескриптор заново.
Поле rs_ErrorCounter содержит счетчик неудачных попыток подбора паролей на доступ к защищенной ячейке. При каждой неудачной попытке счетчик уменьшается на 1. По достижении счетчиком нуля защищенная ячейка переходит в состояние с неизменяемым статусом.
Поле rs_K[] содержит данные защищенной ячейки. В зависимости от типа ячейки здесь может храниться секретный ключ алгоритма, либо какие-нибудь иные данные. Длина данных обязательно должна соответствовать значению поля rs_klen. Данные защищенной ячейки можно считывать или изменять только с помощью специальных функций. Главное отличие защищенной ячейки от простых данных заключается в том, что ее данные можно менять, только указав специальный пароль. Этот пароль программируется разработчиком и хранится в дескрипторе защищенной ячейки. Такой механизм позволяет производить более безопасное изменение части памяти ключа, не затрагивающее остальную память.
В дескрипторах алгоритмов с загружаемым кодом в поле rs_K[] должна содержаться структура TGrdLoadableCodeData, описывающая свойства модуля загружаемого кода. Эта структура разделена на публичную часть, данные которой можно прочитать, если сервис чтения разрешен, и приватную часть, данные которой закрыты от чтения.
Длина, байт | Имя поля | Комментарий |
---|---|---|
Публичная часть (структура TGrdCodePublicData), данные доступны для чтения |
|
|
1 | bLoadableCodeVersion | Версия загружаемого кода |
1 | bReserved0 | Зарезервировано |
1 | bState | Состояние загружаемого кода (GrdCodeState_XXXXX) |
1 | bReserved | Зарезервировано |
4 | dwLoadingDate | Дата загрузки кода. Заполняется автоматически функцией GrdCodeLoad |
Закрытая часть структуры, данные не доступны для чтения |
|
|
40 | abLoadableCodePublicKey4VerifySign | Открытый ключ для проверки подписи кода |
20 | abLoadableCodePrivateKey4DecryptKey | Закрытый ключ для расшифрования ключа AES, на котором зашифрован загружаемый код |
4 | dwBegFlashAddr | Начальный адрес Flash-памяти, зарезервированной для загружаемого кода |
4 | dwEndFlashAddr | Конечный адрес Flash-памяти, зарезервированной для загружаемого кода |
4 | dwBegMemAddr | Начальный адрес RAM ключа, зарезервированной для загружаемого кода |
4 | dwEndMemAddr | Конечный адрес RAM ключа, зарезервированной для загружаемого кода |