btok.h - Man Page
Криптографическая архитектура СТБ 34.101.79 (btok)
Synopsis
#include 'bee2/defs.h'
#include 'bee2/core/apdu.h'
#include 'bee2/crypto/bake.h'
Классы
struct btok_pwd_state
Состояние парольного автомата
struct btok_cvc_t
Информационное содержание CV-сертификата
Перечисления
enum btok_pin_state
Состояние PIN парольного автомата
enum btok_auth_state
Статус аутентификации парольного автомата
enum btok_pwd_event
События парольного автомата
Функции
bool_t btokPwdTransition (btok_pwd_state *state, btok_pwd_event event)
Обработка события парольным автоматом
err_t btokCVCCheck (const btok_cvc_t *cvc)
Проверка содержания CV-сертификата
err_t btokCVCCheck2 (const btok_cvc_t *cvc, const btok_cvc_t *cvca)
Проверка содержания CV-сертификата с учетом данных издателя
err_t btokCVCWrap (octet cert[], size_t *cert_len, btok_cvc_t *cvc, const octet privkey[], size_t privkey_len)
Создание CV-сертификата
err_t btokCVCUnwrap (btok_cvc_t *cvc, const octet cert[], size_t cert_len, const octet pubkey[], size_t pubkey_len)
Разбор CV-сертификата
err_t btokCVCIss (octet cert[], size_t *cert_len, btok_cvc_t *cvc, const octet certa[], size_t certa_len, const octet privkeya[], size_t privkeya_len)
Выпуск CV-сертификата
size_t btokCVCLen (const octet der[], size_t count)
Точная длина CV-сертификата
err_t btokCVCVal (const octet cert[], size_t cert_len, const octet certa[], size_t certa_len, const octet *date)
Проверка CV-сертификата
err_t btokCVCVal2 (btok_cvc_t *cvc, const octet cert[], size_t cert_len, const btok_cvc_t *cvca, const octet *date)
Проверка CV-сертификата в цепочке
err_t btokCVCMatch (const octet cert[], size_t cert_len, const octet privkey[], size_t privkey_len)
Проверка соответствия CV-сертификата
size_t btokSM_keep ()
Длина состояния SM.
void btokSMStart (void *state, const octet key[32])
Инициализация функций SM.
void btokSMCtrInc (void *state)
Увеличение счетчика SM.
err_t btokSMCmdWrap (octet apdu[], size_t *count, const apdu_cmd_t *cmd, void *state)
Кодирование и установка защиты команды с помощью SM.
err_t btokSMCmdUnwrap (apdu_cmd_t *cmd, size_t *size, const octet apdu[], size_t count, void *state)
Декодирование и снятие защиты команды с помощью SM.
err_t btokSMRespWrap (octet apdu[], size_t *count, const apdu_resp_t *resp, void *state)
Кодирование и установка защиты ответа с помощью SM.
err_t btokSMRespUnwrap (apdu_resp_t *resp, size_t *size, const octet apdu[], size_t count, void *state)
Декодирование и снятие защиты ответа с помощью SM.
size_t btokBAuthT_keep (size_t l)
Длина состояния функций BAUTH на стороне Т
err_t btokBAuthTStart (void *state, const bign_params *params, const bake_settings *settings, const octet privkey[], const bake_cert *cert)
Инициализация протокола BAUTH на стороне Т
size_t btokBAuthCT_keep (size_t l)
Длина состояния функций BAUTH на стороне КТ
err_t btokBAuthCTStart (void *state, const bign_params *params, const bake_settings *settings, const octet privkey[], const bake_cert *cert)
Инициализация протокола BAUTH на стороне КТ
err_t btokBAuthCTStep2 (octet out[], const bake_cert *certt, void *state)
Шаг 2 протокола BAUTH.
err_t btokBAuthTStep3 (octet out[], const octet in[], void *state)
Шаг 3 протокола BAUTH.
err_t btokBAuthCTStep4 (octet out[], const octet in[], void *state)
Шаг 4 протокола BAUTH.
err_t btokBAuthTStep5 (const octet in[], size_t in_len, bake_certval_i val_ct, void *state)
Шаг 5 протокола BAUTH.
err_t btokBAuthCTStepG (octet key[32], void *state)
Извлечение ключа протокола BAUTH на стороне КТ
err_t btokBAuthTStepG (octet key[32], void *state)
Извлечение ключа протокола BAUTH на стороне T.
Подробное описание
Реализованы отдельные механизмы СТБ 34.101.79 (btok):
- управление облегченными (Card Verifiable, CV) сертификатами.
Ожидается [ERR_BAD_INPUT]
Все входные указатели действительны. Исключение составляют оговоренные случаи. К ним относится запрос на определение объема памяти, которую требуется зарезервировать при повторном вызове (конструкция [len?]ptr).
CV-сертификаты
Управление CV-сертификатами реализовано в соответствии с профилем, заданным в СТБ 34.101.79. Профиль назначает:
- использование стандартных долговременных параметров bign-curve256v1, bign-curve384v1 и bign-curve512v1;
- использование алгоритмов bign-sign для выработки и проверки подписи;
- использование алгоритмов belt-hash, bash384, bash512 для хэширования подписываемых данных;
- использование (опциональное) 5-октетного слова прав доступа к прикладной программе eId;
- использование (опциональное) 2-октетного слова прав доступа к прикладной программе eSign;
- использование специфических объектных идентификаторов, в частности, bign-pubkey.
В реализации профиль СТБ 34.101.79 расширен: в сертификатах могут использоваться ключи и алгоритмы bign96 (см. bign96.h). В частности, открытые ключи могут лежать как на стандартных кривых bign-curve256v1, bign-curve384v1 и bign-curve512v1, так и на кривой bign-curve192v1.
Информационные поля CV-сертификата перечислены в структуре btok_cvc_t. Сертификат представляет собой DER-код данных полей.
Отсутствие в сертификате слова прав доступа означает, что оно является нулевым, т.е. что права доступа отстутствуют. По кодировании сертификата нулевое слово прав доступа опускается. При этом наличие в декодируемом сертификате нулевого слова не считается ошибкой.
Дата в сертификате задается 6 октетами по схеме YYMMDD (см. tm.h).
Защищенное соединение
Защищенное соединение (Secure Messaging) -- это правила защиты APDU-команд и APDU-ответов. Общие правила огранизации защищенного соединения определены в ISO/IEC 7816-4, конкретные правила, которые собственно и реализованы, --- в СТБ 34.101.79.
Состояние SM содержит три объекта:
- ключ имитозащиты (belt-mac);
- ключ шифрования (belt-cfb);
- счетчик.
Защита организована по схеме encrypt-then-mac: сначала тело команды/ответа зашифровывается, а затем к шифртексту присоединяется имитовставка, которая покрывает шифртекст и открытые данные команды/ответа.
Счетчик используется в качестве синхропосылки при шифровании. Перед установкой защиты или ее снятием счетчик инкрементируется. Первоначально счетчик равняется нулю.
Контролируется следующая логика:
- установка/снятие защиты команды выполняется с нечетными значениями счетчика;
- установка/снятие защиты команды выполняется с четными значениями счетчика.
Ожидается
Состояние функций SM не изменяется вне этих функций.
Предусловие
Указатели функций SM корректны, если не оговорено противное.
Входные и выходные буферы функций SM не пересекаются друг с другом.
Прим.
Признаком защиты команды является бит 0x04 в поле CLA.
Протокол BAUTH
Протокол выполняется между терминалом (T) и криптографическим токеном (КТ, cryptographic token = CT).
Для настройки протокола используется структура bake_settings (см. bake.h). В терминах протоколов Bake в роли стороны A выступает терминал, в роли стороны B -- криптографический токен.
Терминал всегда подтверждает сформированный ключ, т.е. проходит аутентификацию перед КТ. Поэтому в структуре bake_settings флаг kca должен равняться TRUE.
КТ проходит аутентификацию перед КТ опционально: в структуре bake_settings флаг kcb может принимать как значение TRUE, так и значение FALSE.
Ожидается [ERR_BAD_INPUT]
Все входные указатели, за исключением оговоренных случаев, корректны.
Ожидается
При пошаговом выполнении протокола данные, переданные при инициализации через указатели, остаются корректными и постоянными на протяжении всего выполнения протокола.
Функции
size_t btokBAuthCT_keep (size_t l)
Определяется длина состояния (в октетах) функций протокола BAUTH на стороне КТ.
Возвращает
Длина состояния.
- Аргументы
l уровень стойкости
err_t btokBAuthCTStart (void * state, const bign_params * params, const bake_settings * settings, const octet privkey[], const bake_cert * cert)
По параметрам params, настройкам settings, личному ключу [l / 4]privkey и сертификату cert соответствующего открытого ключа в state формируются структуры данных, необходимые для выполнения протокола BAUTH на стороне КТ.
Предусловие
По адресу state зарезервировано btokBAuthCT_keep() октетов.
Ожидается [ERR_BAD_PARAMS]
Параметры params корректны.
Ожидается [ERR_BAD_INPUT]
settings->kca == TRUE.
Ожидается [ERR_BAD_INPUT]
Указатель settings->helloa нулевой, либо буфер [settings->helloa_len]settings->helloa корректен. Аналогичное требование касается полей settings->hellob, settings->hellob_len.
Ожидается [ERR_BAD_RNG]
Генератор settings->rng (с состоянием settings->rng_state) корректен.
Ожидается
Генератор settings->rng является криптографически стойким.
Ожидается [ERR_BAD_CERT]
Сертификат cert корректен.
Ожидается
Ключ privkey и сертификат cert согласованы. Если согласование нарушено, то протокол будет завершен с ошибкой.
- Возвращает
ERR_OK, если инициализация успешно выполнена, и код ошибки в противном случае.
- Аргументы
state состояние
params долговременные параметры
settings настройки
privkey личный ключ
cert сертификат
err_t btokBAuthCTStep2 (octet out[], const bake_cert * certt, void * state)
КТ выполняет шаг 2 протокола BAUTH, обрабатывая сертификат терминала certt и используя состоянием state. При успешном выполнении шага формируется сообщение M1 = [5 l / 8 + 16]out.
- Ожидается
btokBAuthCTStart() < btokBAuthCTStep2().
- Возвращает
ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
Прим.
Приветственное сообщение КТ в M1 не передаются.
- Аргументы
out выходное сообщение M1
certt сертификат терминала
state [in,out] состояние
err_t btokBAuthCTStep4 (octet out[], const octet in[], void * state)
КТ выполняет шаг 4 протокола BAUTH, обрабатывая сообщение M2 = [8]in, если не требуется аутентификация перед Т, или M2 = [8 + 16]in, если не требуется, и используя состояние state. Если аутентификация перед КТ требуется, то при успешном выполнении шага формируется сообщение M3 = [l / 4 + cert->len + 8]out.
- Ожидается
btokBAuthCTStep2() < btokBAuthCTStep4().
- Ожидается
btokBAuthTStep3() << btokBAuthCTStep4().
- Возвращает
ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
- Аргументы
out выходное сообщение M3
in входное сообщение M2
state [in,out] состояние
err_t btokBAuthCTStepG (octet key[32], void * state)
КТ определяет общий секретный ключ key, полученный с помощью протокола BAUTH с состоянием state.
- Ожидается
btokBAuthCTStep4() < btokBAuthCTStepG().
- Возвращает
ERR_OK, если ключ успешно извлечен, и код ошибки в противном случае.
- Аргументы
key общий ключ
state [in,out] состояние
size_t btokBAuthT_keep (size_t l)
Определяется длина состояния (в октетах) функций протокола BAUTH на стороне Т.
Возвращает
Длина состояния.
- Аргументы
l уровень стойкости
err_t btokBAuthTStart (void * state, const bign_params * params, const bake_settings * settings, const octet privkey[], const bake_cert * cert)
По параметрам params, настройкам settings, личному ключу [l / 4]privkey и сертификату cert соответствующего открытого ключа в state формируются структуры данных, необходимые для выполнения протокола BAUTH на стороне T.
Предусловие
По адресу state зарезервировано btokBAuthT_keep() октетов.
Ожидается [ERR_BAD_PARAMS]
Параметры params корректны.
Ожидается [ERR_BAD_INPUT]
settings->kca == TRUE.
Ожидается [ERR_BAD_INPUT]
Указатель settings->helloa нулевой, либо буфер [settings->helloa_len]settings->helloa корректен. Аналогичное требование касается полей settings->hellob, settings->hellob_len.
Ожидается [ERR_BAD_RNG]
Генератор settings->rng (с состоянием settings->rng_state) корректен.
Ожидается
Генератор settings->rng является криптографически стойким.
Ожидается [ERR_BAD_CERT]
Сертификат cert корректен.
Ожидается
Ключ privkey и сертификат cert согласованы. Если согласование нарушено, то протокол будет завершен с ошибкой.
- Возвращает
ERR_OK, если инициализация успешно выполнена, и код ошибки в противном случае.
- Аргументы
state состояние
params долговременные параметры
settings настройки
privkey личный ключ
cert сертификат
err_t btokBAuthTStep3 (octet out[], const octet in[], void * state)
Т выполняет шаг 3 протокола BAUTH, обрабатывая сообщение M1 = [5 l / 8 + 16]in и используя состояние state. При успешном выполнении шага формируется сообщение M2 = [8]out, если не требуется аутентификация перед Т, или M2 = [8 + 16]out, если требуется.
- Ожидается
btokBAuthTStart() < btokBAuthTStep3().
- Ожидается
btokBAuthCTStep2() << btokBAuthTStep3().
- Возвращает
ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
- Аргументы
out выходное сообщение M2
in входное сообщение M1
state [in,out] состояние
err_t btokBAuthTStep5 (const octet in[], size_t in_len, bake_certval_i val_ct, void * state)
Т выполняет шаг 5 протокола BAUTH, обрабатывая сообщение M3 = [in_len]in и используя состояние state. Т проверяет присланный в M3 сертификат КТ с помощью функции val_ct.
- Ожидается [ERR_BAD_LOGIC]
settings->kcb == TRUE, т.е. требуется аутентификация КТ перед Т.
- Ожидается
btokBAuthTStep3() < btokBAuthTStep5().
- Ожидается
btokBAuthCTStep4() << btokBAuthTStep5().
- Возвращает
ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
- Аргументы
in входное сообщение M3
in_len длина in
val_ct функция проверки сертификата КТ
state [in,out] состояние
err_t btokBAuthTStepG (octet key[32], void * state)
Т определяет общий секретный ключ key, полученный с помощью протокола BAUTH с состоянием state.
Ожидается
Если КТ аутентифицируется перед терминалом, то btokBAuthTStep5() < btokBAuthTStepG(), иначе btokBAuthTStep3() < btokBAuthTStepG().
- Возвращает
ERR_OK, если ключ успешно извлечен, и код ошибки в противном случае.
- Аргументы
key общий ключ
state [in,out] состояние
err_t btokCVCCheck (const btok_cvc_t * cvc)
Проверяется корректность содержания cvc CV-сертификата. Проверка завершается успешно, если:
- cтроки cvc->authority и cvc->holder состоят из печатаемых символов;
- длины строк cvc->authority и cvc->holder лежат в диапазоне от 8 до 12;
- даты cvc->from и cvc->until корректны;
- cvc->from <= cvc->until;
- открытый ключ [cvc->pubkey_len]cvc->pubkey корректен (лежит на одной из кривых bign-curveXXXv1).
- Возвращает
ERR_OK, если проверка прошла успешно, и код ошибки в противном случае.
Прим.
Подпись cvc->sig не проверяется.
- Аргументы
cvc содержание сертификата
err_t btokCVCCheck2 (const btok_cvc_t * cvc, const btok_cvc_t * cvca)
Проверяется корректность содержания cvc CV-сертификата с учетом содержания cvca сертификата (потенциального) издателя. Проверка завершается успешно, если:
- btokCVCCheck(cvc) == ERR_OK;
- cvc->authority == cvca->holder;
- даты cvca->from и cvca->until корректны;
- cvca->from <= cvc->from && cvc->from <= cvca->until.
- Возвращает
ERR_OK, если проверка прошла успешно, и код ошибки в противном случае.
Прим.
Подпись cvc->sig не проверяется.
- Аргументы
cvc содержание сертификата
cvca содержание сертификата издателя
err_t btokCVCIss (octet cert[], size_t * cert_len, btok_cvc_t * cvc, const octet certa[], size_t certa_len, const octet privkeya[], size_t privkeya_len)
Выпускается CV-сертификат [cert_len?]cert с содержанием cvc. При выпуске используются личный ключ [privkeya_len]privkeya и сертификат [certa_len]certa издателя. Подпись сертификата сохраняется в [cvc->sig_len]cvc->sig. Перед выпуском проверяются следующие условия:
- certa имеет корректный формат;
- btokCVCCheck2(cvc, cvca) == ERR_OK, где cvca -- содержание certa;
- открытый ключ в certa соответствует личному ключу privkeya.
- Возвращает
ERR_OK, если сертификат успешно выпущен, и код ошибки в противном случае.
Прим.
Используется детерминированный режим выработки подписи. Если инициализирован штатный ГСЧ, то дополнительно используются данные от него.
- Аргументы
cert сертификат
cert_len длина cert в октетах
cvc [in,out] содержание сертификата
certa сертификат издателя
certa_len длина certa в октетах
privkeya личный ключ издателя
privkeya_len длина privkeya в октетах
size_t btokCVCLen (const octet der[], size_t count)
Определяется точная длина CV-сертификата, размещенного в префиксе DER-кода [count]der.
Возвращает
Длина сертификата или SIZE_MAX в случае ошибки.
Прим.
Корректность CV-сертификата не проверяется.
- Аргументы
der DER-код
count длина der в октетах
err_t btokCVCMatch (const octet cert[], size_t cert_len, const octet privkey[], size_t privkey_len)
Проверяется соответствие между CV-сертификатом [cert_len]cert и личным ключом [privkey_len]privkey. Проверка завершается успешно, если:
- cert имеет корректный формат;
- открытый ключ cert соответствует privkey.
- Возвращает
ERR_OK, если соответствие подтверждено, и код ошибки в противном случае.
- Аргументы
cert сертификат
cert_len длина cert в октетах
privkey личный ключ
privkey_len длина privkey в октетах
err_t btokCVCUnwrap (btok_cvc_t * cvc, const octet cert[], size_t cert_len, const octet pubkey[], size_t pubkey_len)
Определяется и проверяется содержание cvc CV-сертификата [cert_len]cert. При проверке используется открытый ключ [pubkey_len]pubkey. Проверка завершается успешно, если:
- btokCVCCheck(cvc) == ERR_OK;
- подпись cert признается корректной на открытом ключе pubkey. Может передаваться нулевая длина pubkey_len, и тогда:
- подпись не проверяется, если pubkey == 0;
- подпись проверяется на открытом ключе сертификата, если pubkey == cvc->pubkey;
- индуцируется ошибка, если pubkey != 0 && pubkey != cvc->pubkey.
- Возвращает
ERR_OK, если сертификат успешно разобран, и код ошибки в противном случае.
Прим.
Даже если подпись не проверяется, ее длина все равно контролируется. Неверная длина расценивается как ошибка формата.
Длина cert должна в точности равняться cert_len. Противное считается ошибкой формата.
- Аргументы
cvc содержание сертификата
cert сертификат
cert_len длина cert в октетах
pubkey открытый ключ
pubkey_len длина pubkey в октетах
err_t btokCVCVal (const octet cert[], size_t cert_len, const octet certa[], size_t certa_len, const octet * date)
Проверяется корректность CV-сертификата [cert_len]cert на дату date, для чего используется сертификат издателя [certa_len]certa. Проверка завершается успешно, если:
- certa имеет корректный формат;
- cert разбирается без ошибок на открытом ключе из certa;
- btokCVCCheck2(cvc, cvca) == ERR_OK, где cvc и cvca -- содержание cert и certa соответственно;
- date попадает в срок действия cert. Указатель date может быть нулевым, и тогда последняя проверка не выполняется.
- Возвращает
ERR_OK, если сертификат признан корректным, и код ошибки в противном случае.
Прим.
Текущую дату можно определить с помощью функции tmDate2().
- Аргументы
cert сертификат
cert_len длина cert в октетах
certa сертификат издателя
certa_len длина certa в октетах
date дата проверки
err_t btokCVCVal2 (btok_cvc_t * cvc, const octet cert[], size_t cert_len, const btok_cvc_t * cvca, const octet * date)
Проверяется корректность CV-сертификата [cert_len]cert на дату date, для чего используется содержание cvca сертификата издателя. В случае успеха определяется содержание cvc проверяемого сертификата. Проверка завершается успешно, если:
- cert имеет корректный формат;
- имя издателя в cert совпадает с именем владельца в cvca;
- подпись cert признается корректной на открытом ключе из cvca;
- срок действия, заданный в cvca, корректен;
- начало действия cert не выходит за пределы срока действия cvca;
- date попадает в срок действия cert. Указатель date может быть нулевым, и тогда последняя проверка не выполняется. Указатель cvc может быть нулевым, и тогда содержание проверяемого сертификата не возвращается.
- Возвращает
ERR_OK, если сертификат признан корректным, и код ошибки в противном случае.
Прим.
Текущую дату можно определить с помощью функции tmDate2().
Интерфейс ориентирован на проверку цепочки сертификатов. Цепочка certa, certb, certc,... проверяется следующим образом:
- btokCVCUnwrap(cvca, certa, certa_len, 0, 0);
- btokCVCVal2(cvcb, certb, certb_len, cvca, 0);
- btokCVCVal2(cvcc, certc, certc_len, cvcb, date);
- ...
Прим.
Если certa является самоподписанным и требуется проверить его подпись, то первая строчка в предыдущем коде должна выглядеть следующим образом:
- btokCVCUnwrap(cvca, certa, certa_len, cvca->pubkey, 0);
- Аргументы
cvc содержание сертификата
cert сертификат
cert_len длина cert в октетах
cvca содержание сертификата издателя
date дата проверки
err_t btokCVCWrap (octet cert[], size_t * cert_len, btok_cvc_t * cvc, const octet privkey[], size_t privkey_len)
Создается CV-сертификат [cert_len?]cert с содержанием cvc. Сертификат подписывается на личном ключе [privkey_len]privkey. Подпись сохраняется в [cvc->sig_len]cvc->sig. Если cvc->pubkey_len == 0, то открытый ключ [cvc->pubkey_len]cvc->pubkey строится по privkey и выходной сертификат выступает в роли доказательства владения личным ключом. Непосредственно перед созданием сертификата проверяется содержание cvc. Проверка завершается успешно, если:
- btokCVCCheck(cvc) == ERR_OK.
- Возвращает
ERR_OK, если сертификат успешно создан, и код ошибки в противном случае.
Прим.
Используется детерминированный режим выработки подписи. Если инициализирован штатный ГСЧ, то дополнительно используются данные от него.
Устанавливая cvc->pubkey_len == 0 && cvc->authority == cvc->holder, можно создать самоподписанный сертификат.
Устанавливая cvc->pubkey_len == 0 && cvc->authority != cvc->holder, можно создать предварительный сертификат, подпись которого будет изменена в дальнейшем стороной cvc->authority. Предварительный сертификат доказывает владение стороной cvc->holder личным ключом, которому соответствует открытый ключ cvc->pubkey. Предварительный сертификат выступает в роли запроса на выпуск сертификата.
- Аргументы
cert сертификат
cert_len длина cert в октетах
cvc [in,out] содержание сертификата
privkey личный ключ
privkey_len длина privkey в октетах
bool_t btokPwdTransition (btok_pwd_state * state, btok_pwd_event event)
Парольный автомат с состоянием state обрабатывает событие event. Состояние может изменяться при обработке.
Предусловие
Указатель state корректен.
- Возвращает
TRUE, если событие event является допустимым и поэтому обработано, и FALSE в противном случае.
- Аргументы
state [in,out] состояние
event событие
size_t btokSM_keep ()
Возвращается длина состояния (в октетах) функций SM.
Возвращает
Длина состояния.
err_t btokSMCmdUnwrap (apdu_cmd_t * cmd, size_t * size, const octet apdu[], size_t count, void * state)
Код команды [count]apdu декодируется и одновременно с него снимается защита с помощью объектов SM, размещенных в state. Результат возвращается в буфере [size?]cmd. Указатель state может быть нулевым, и тогда выполняется только декодирование, без снятия защиты. Указатель cmd может быть нулевым, и тогда выполняется только проверка формата кода, без контроля целостности.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
- Ожидается
btokSMStart() < btokSMCmdUnwrap()*.
Ожидается [ERR_BAD_APDU]
Если state != 0, то в cmd->cla установлен бит 0x04 (признак защиты). Если state == 0, то бит снят.
Ожидается [ERR_BAD_LOGIC]
Непосредственно а момент снятия защиты (cmd != 0 && state != 0) счетчик SM принимает нечетное значение.
- Возвращает
ERR_OK в случае успеха и код ошибки в противном случае.
- Аргументы
cmd команда
size размер буфера для команды
apdu код команды
count длина кода команды
state [in,out] состояние SM
err_t btokSMCmdWrap (octet apdu[], size_t * count, const apdu_cmd_t * cmd, void * state)
Команда cmd кодируется и защищается с помощью объектов SM, размещенных в state. Результат возвращается в буфере [count?]apdu. Указатель state может быть нулевым, и тогда выполняется только кодирование, без защиты.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
- Ожидается
btokSMStart() < btokSMCmdWrap()*.
Ожидается [ERR_BAD_APDU]
В cmd->cla снят бит 0x04 (признак защиты).
Ожидается [ERR_BAD_LOGIC]
Непосредственно а момент установки защиты (apdu != 0 && state != 0) счетчик SM принимает нечетное значение.
- Возвращает
ERR_OK в случае успеха и код ошибки в противном случае.
- Аргументы
apdu код команды
count длина кода команды
cmd команда
state [in,out] состояние SM
void btokSMCtrInc (void * state)
Счетчик, размещенный в состоянии state, увеличивается на 1.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
- Ожидается
btokSMStart() < btokSMCtrInc()*.
Прим.
Отправитель команд и ответов должен увеличивать счетчик всякий раз перед установкой их защиты. Соответственно получатель должен увеличивать счетчик всякий раз перед снятием защиты.
Установка и снятие защиты команд должны выполняться с нечетными значениями счетчика. Установка и снятие защиты ответов -- с четными.
- Аргументы
state [in,out] состояние SM
err_t btokSMRespUnwrap (apdu_resp_t * resp, size_t * size, const octet apdu[], size_t count, void * state)
Код ответа [count]apdu декодируется и одновременно с него снимается защита с помощью объектов SM, размещенных в state. Результат возвращается в буфере [size?]resp. Указатель state может быть нулевым, и тогда выполняется только декодирование, без снятия защиты. Указатель resp может быть нулевым, и тогда выполняется только проверка формата кода, без контроля целостности.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
- Ожидается
btokSMStart() < btokSMRespUnwrap()*.
Ожидается [ERR_BAD_LOGIC]
Непосредственно а момент снятия защиты (resp != 0 && state != 0) счетчик SM принимает четное значение.
- Возвращает
ERR_OK в случае успеха и код ошибки в противном случае.
- Аргументы
resp ответ
size размер буфера для ответа
apdu код ответа
count длина кода ответа
state [in,out] состояние SM
err_t btokSMRespWrap (octet apdu[], size_t * count, const apdu_resp_t * resp, void * state)
Ответ resp кодируется и защищается с помощью объектов SM, размещенных в state. Результат возвращается в буфере [count?]apdu. Указатель state может быть нулевым, и тогда выполняется только кодирование, без защиты.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
- Ожидается
btokSMStart() < btokSMRespWrap()*.
Ожидается [ERR_BAD_LOGIC]
Непосредственно а момент установки защиты (apdu != 0 && state != 0) счетчик SM принимает четное значение.
- Возвращает
ERR_OK в случае успеха и код ошибки в противном случае.
- Аргументы
apdu код ответа
count длина кода ответа
resp ответ
state [in,out] состояние SM
void btokSMStart (void * state, const octet key[32])
По ключу key в state формируются объекты, необходимые для управления защищенным соединением.
Предусловие
По адресу state зарезервировано btokSM_keep() октетов.
Прим.
В перечень объектов входит счетчик, первоначально равный нулю.
- Аргументы
state состояние SM
key ключ
Автор
Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.