Sponsor:

Your company here, and a link to your site. Click to find out more.

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):

Ожидается [ERR_BAD_INPUT]

Все входные указатели действительны. Исключение составляют оговоренные случаи. К ним относится запрос на определение объема памяти, которую требуется зарезервировать при повторном вызове (конструкция [len?]ptr).

CV-сертификаты

Управление CV-сертификатами реализовано в соответствии с профилем, заданным в СТБ 34.101.79. Профиль назначает:

В реализации профиль СТБ 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 содержит три объекта:

Защита организована по схеме 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 состояние

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 состояние

err_t btokBAuthCTStepG (octet key[32], void * state)

КТ определяет общий секретный ключ key, полученный с помощью протокола BAUTH с состоянием state.

Ожидается

btokBAuthCTStep4() < btokBAuthCTStepG().

Возвращает

ERR_OK, если ключ успешно извлечен, и код ошибки в противном случае.

Аргументы

key общий ключ  
state состояние

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 состояние

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 состояние

err_t btokBAuthTStepG (octet key[32], void * state)

Т определяет общий секретный ключ key, полученный с помощью протокола BAUTH с состоянием state.

Ожидается

Если КТ аутентифицируется перед терминалом, то btokBAuthTStep5() < btokBAuthTStepG(), иначе btokBAuthTStep3() < btokBAuthTStepG().

Возвращает

ERR_OK, если ключ успешно извлечен, и код ошибки в противном случае.

Аргументы

key общий ключ  
state состояние

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 содержание сертификата  
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 содержание сертификата  
privkey личный ключ  
privkey_len длина privkey в октетах

bool_t btokPwdTransition (btok_pwd_state * state, btok_pwd_event event)

Парольный автомат с состоянием state обрабатывает событие event. Состояние может изменяться при обработке.

Предусловие

Указатель state корректен.

Возвращает

TRUE, если событие event является допустимым и поэтому обработано, и FALSE в противном случае.

Аргументы

state состояние  
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 состояние 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 состояние SM

void btokSMCtrInc (void * state)

Счетчик, размещенный в состоянии state, увеличивается на 1.

Предусловие

По адресу state зарезервировано btokSM_keep() октетов.

Ожидается

btokSMStart() < btokSMCtrInc()*.

Прим.

Отправитель команд и ответов должен увеличивать счетчик всякий раз перед установкой их защиты. Соответственно получатель должен увеличивать счетчик всякий раз перед снятием защиты.

Установка и снятие защиты команд должны выполняться с нечетными значениями счетчика. Установка и снятие защиты ответов -- с четными.

Аргументы

state состояние 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 состояние 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 состояние SM

void btokSMStart (void * state, const octet key[32])

По ключу key в state формируются объекты, необходимые для управления защищенным соединением.

Предусловие

По адресу state зарезервировано btokSM_keep() октетов.

Прим.

В перечень объектов входит счетчик, первоначально равный нулю.

Аргументы

state состояние SM  
key ключ

Автор

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.

Info

Вт 23 Янв 2024 00:00:00 Библиотека Bee2