Развернуть все
Свернуть все

Функция espEncapFn

Функция инкапсуляции ESP пакетов SPI сессии.

Синтаксис

C/C++
 capi_result CAPI_EXTC espEncapFn (
   ESP_HANDLE sid,
   unsigned uFlags,
   char *pcNextProto,
   void *pData,
   unsigned *puDataLen,
   unsigned uBufLen,
   CPC_CONFIG *config
 );

Параметры

sid

[in] Дескриптор ESP сессии

uFlags

[in] Функциональные флаги

  • При ESP_DATA_IOVEC pData указатель на массив CSP_iovec, uBufLen количество CSP_iovec

  • При ESP_DATA_MULTIPACKET pData указатель на массив CSP_Multipacket_ENC, uBufLen количество CSP_Multipacket_ENC

  • При ESP_PADDING_SEQ паддинг заполняется последовательностью 1, 2, 3 .. 255

  • При ESP_PADDING_ZERO паддинг заполняется нулями

  • При ESP_PADDING_SIZE точный размер паддинга содержится в числе получаемом из uFlags & ESP_PADDING_MASK

pcNextProto

[in] Идентификатор вложенного протокола (TCP, UDP и т.п.)

  • указатель на массив идентификаторов при ESP_DATA_MULTIPACKET

pData

[in/out] Инкапсулируемые данные

  • указатель на линейный буфер при отсутствии ESP_DATA_IOVEC и ESP_DATA_MULTIPACKET

  • указатель на массив CSP_iovec при ESP_DATA_IOVEC и отсутствии ESP_DATA_MULTIPACKET

  • указатель на массив CSP_Multipacket_ENC при ESP_DATA_MULTIPACKET

  • При pData == NULL происходит расчёт финального размера пакета, который возвращается через puDataLen

puDataLen

[in/out] Размер пакета

  • указатель на массив размеров при ESP_DATA_MULTIPACKET

  • на входе размер заголовка и данных PAYLOAD

  • на выходе полный размер финального пакета

uBufLen

[in] Размер данных

  • размер линейного буфера данных при отсутствии ESP_DATA_IOVEC и ESP_DATA_MULTIPACKET

  • количество CSP_iovec при ESP_DATA_IOVEC и отсутствии ESP_DATA_MULTIPACKET

  • количество CSP_Multipacket_ENC при ESP_DATA_MULTIPACKET

config

[in] Указатель на CPC_CONFIG используемый при создании HCRYPTMODULE

Возвращаемое значение

CAPI_NOERROR Успешное завершение

CAPI_CSP_ERROR Ошибка вызова CSP

CAPI_INTERNAL_ERROR Внутренняя ошибка

CAPI_NOT_ENOUGH_SPACE Размер буфера недостаточен для инкапсуляции и шифрования данных

CAPI_CALL_ERROR Неверные аргументы

CAPI_PROTOCOL_ERROR Функция вызвана неверно

CAPI_TTL_SECS_EXPIRED_ERROR Превышено время жизни сессии

CAPI_TTL_BYTES_EXPIRED_ERROR Превышен объём данных, который может быть обработан в сессии

CAPI_SN_ERROR Ошибка при проверках окна (отстающий/повторный пакет)

CAPI_TOO_MANY_THREADS Все доступные HCRYPTMODULE заняты (слишком много потоков)

CAPI_MULTI_RESULT Только при ESP_DATA_MULTIPACKET, означает несколько результатов обработки, необходимо уточнение результатов capi_result для каждого пакета в CSP_Multipacket_ENC::dwEncResult

Примечания

Под инкапсуляцией понимается процесс формирования финального зашифрованного пакета для отправки удаленной стороне обмена.

Функция обрабатывает входные пакеты, представленные в форме линейного буфера, или в форме IOVEC, или в форме MULTIPACKET + IOVEC для трансформов CPIPSEC_PROTO_IPSEC_ESP в зависмости от значения флага uFlags.

При работе с пакетами в виде IOVEC воспринимает набор из N+1 координат:

  • [0]..[N]: содержат заголовок пакета, место под IV (в режимах CPESP_NULL отсутствует), PAYLOAD, место под PADDING + 2 байта + все MAC

  • [N+1]: приложением не используется, на входе должны быть обнулены (ptr == NULL, len == 0)

Формат пакета соответствует "Методические рекомендации по использованию комбинированного алгоритма шифрования вложений IPsec ESP на основе ГОСТ 28147-89",

При работе с пакетами в виде IOVEC после успешного выполнения:

  • [0]..[N]: содержат обработанный пакет, включая заголовок пакета, IV (в режимах CPESP_NULL отсутствует), PAYLOAD (в зашифрованном виде), PADDING + 2 (в зашифрованном виде) + MAC (IMITA или HMAC);

  • [N+1] приложением не используется.

При работе с пакетами в виде IOVEC пользовательские координаты финального пакета не изменяются.

При работе с пакетами в виде MULTIPACKET + IOVEC каждый пакет должен быть представлен согласно работе с пакетами в виде IOVEC.

Требования

Заголовочный файл esp_gost.h
Библиотека
Минимальная версия продукта 1.0