Пакет - неделимый фрагмент данных, подаваемых на функции шифрования CPEncrypt(), CPCEncrypt(),CPDecrypt(), CPCDecrypt(). Пакет состоит из полей:
Поле | Описание |
---|---|
Предзаголовок пакета (DIVERSBLOB) | Опциональное поле, содержащее блоб диверсификации ключа шифрования и хэширования по алгоритму CALG_PRO_DIVERS. Признак обработки поля - установленный флаг CP_CHP_STARTMIX. |
Заголовок пакета (HEADER) | Опциональное поле длины не более 255 байт. Не шифруется, хэшируется хэш-функцией hHash. |
Вектор инициализации (IV) | Опциональное поле, содержащее вектор инициализации шифрования пакета. Не шифруется, хэшируется опционально. |
Тело пакета (PAYLOAD) | Обязательное поле, шифруется и хэшируется. |
Трейлер (TRAILER) | Опциональное поле длины не более 254 байт. Не шифруется, хэшируется хэш-функцией hHash. |
Знечение функции хэширования пакета (HASH) | Опциональное поле, может быть зашифровано. |
При шифровании пакетов поддерживаются режимы шифрования: CRYPT_MODE_CNT, CRYPT_MODE_CFB, CRYPT_MODE_CBCSTRICT, CRYPT_MODE_CTR, CRYPT_MODE_MGM. Во всех режимах шифрования может быть использован флаг CRYPT_SIMPLEMIX_MODE. В режимах шифрования CRYPT_MODE_CNT, CRYPT_MODE_CFB, CRYPT_MODE_CBCSTRICT может быть использован флаг CRYPT_PROMIX_MODE. В режиме шифрования CRYPT_MODE_CTR может быть использован флаг CRYPT_ACPKM_MODE.
В пакетном режиме шифрования длина пакетов остаётся неизменной.
В режиме CBC общая длина шифруемых данных должна быть кратна 8, также должна быть кратной 8 длина каждого шифруемого элемента IOVEC, в противном случае возвращается ошибка NTE_BAD_DATA. Пакеты обрабатываются с сохранением размера полей, паддинг в режиме CBC игнорируется.
Флаги CP_CHP_IV_RANDOM, CP_CHP_IV_USER, CP_CHP_HASH_PACKET предназначены для обработки пакетов в потоках с возможным нарушением порядка следования пакетов, с возможной потерей пакетов.
Флаги CP_CHP_IV_CHAIN, CP_CHP_HASH_CHAIN, CP_CHP_HASH_NONE предназначены для обработки пакетов в потоках, гарантирующих доставку всех пакетов в неизменной последовательности.
В следующей таблице приведены условия использовантя режимов ширования пакетов:
Значение флагов | Условия и ограничения режима |
---|---|
CRYPT_SIMPLEMIX_MODE совместно с CP_CHP_IV_RANDOM, CRYPT_SIMPLEMIX_MODE совместно с CP_CHP_IV_USER | Обработка пакетов может выполняться с установленным флагом Final=FALSE. Объём данных, обрабатываемых на одном ключе, ограничен 4М. |
CRYPT_PROMIX_MODE совместно с CP_CHP_IV_RANDOM, CRYPT_PROMIX_MODE совместно с CP_CHP_IV_USER | Обработка пакетов должна выполняться с установленным флагом Final=TRUE. Объём данных, обрабатываемых на одном ключе, ограничен 4М либо числом пакетов < 4096. |
CRYPT_SIMPLEMIX_MODE совместно с CP_CHP_IV_CHAIN | Обработка пакета с флагом Final=TRUE означает завершение обработки цепочки пакетов. Обработка пакета с флагом Final=FALSE означает продолжение обработки цепочки пакетов. На одном ключе последовательно может быть обработано несколько цепочек пакетов. Объём данных, обрабатываемых на одном ключе, ограничен 4М. |
CRYPT_PROMIX_MODE совместно с CP_CHP_IV_CHAIN | Обработка пакета с флагом Final=TRUE означает завершение обработки цепочки пакетов. Обработка пакета с флагом Final=FALSE означает продолжение обработки цепочки пакетов. На одном ключе может обрабатываться цепочка длины не более 128000М. Количество цепочек ограничено 4096. |
Во всех режимах объект функции хэширования после завершения обработки пакета подготовлен для обработки следующего пакета. При этом, в случае CP_CHP_HASH_CHAIN и CP_CHP_HASH_NONE объект открыт для продолжения хэширования потока, в случае CP_CHP_HASH_PACKET объект инициализирован.
При расшифровании пакета в случае его искажения в канале, приводящего к несовпадению значения HASH, передаваемого в составе пакета, с вновь рассчитанным значением, функция CPDecrypt() возвращают ошибку (FALSE), функции CPCDecrypt() и GetLastError() возвращают NTE_BAD_HASH, объект функции хэширования функциями CPDecrypt(), CPCDecrypt() не инициализируется. В этом случае приложение может получить рассчитанное значение HASH вызовом CPGetHashParam() и должно принять решение о завершении обрабатываемого потока (например: поток, обрабатываемый с флагом CP_CHP_HASH_CHAIN, должен быть закрыт; поток, обрабатываемый с флагом CP_CHP_HASH_PACKET может быть продолжен). В случае продолжения обработки потока приложение должно открыть (создать новый) объект функции хэширования.
Во входных параметрах функций шифрования и хэширования пакет может быть представлен как буфером, определяемым указателем pbData и длиной cbData, так и вектором IOVEC ввода/вывода, определяемым указателем pbData на вершину массива структур CSP_iovec и числом элементов массива cbData. Режим использования векторной формы представления ввода/вывода определяется флагом CP_CRYPT_DATA_IOVEC, в настоящей версии СКЗИ режим CP_CRYPT_DATA_IOVEC является подрежимом пакетной обработки.
В режиме пакетной обработки возможно получение ключа шифрования и имитозащиты пакета диверсификацией базовых ключей, ассоциированных с hKey и hHash. Диверсификация осуществляется по алгоритму CALG_PRO_DIVERS с использованием даных CRYPT_DIVERSBLOB, размещённых в предзаголовке пакета. Если используется представление данных в форме вектора ввода-вывода, блоб диверсификации должен передаваться в первой координате вектора целиком. Признаком использования диверсификации ключей является установленный флаг CP_CHP_STARTMIX. Диверсифицированное значение ключей сохраняется для использования для обработки последующих пакетов. Диверсификация ключей не приводит к изменению значений базовых ключей.
В режиме пакетной обработки возможна SIMD параллельная обработка до 16 пакетов при использовании аппаратной платформы, поддерживающей расширения SSSE3, AVX. Все пакеты обрабатываются на ключах с одним значением для шифрования и с обним значением для функции хэшироваия. Пакеты должны быть упакованы в массиве структур CSP_Multipacket. Признаком использования мультипакетной обработки является установленный флаг CP_CHP_MULTIPACKET. Пакеты могут быть представлены как линейным буфером, так и вектором IOVEC ввода/вывода. Требуется, чтобы все пакеты были однотипными, тип пакетов определяется флагом CP_CRYPT_DATA_IOVEC. В мультипакетном режиме использование предварительной диверсификации ключа, определяемой флагом CP_CHP_STARTMIX, не допускается. См. Мультипакетная обработка .
Флаг CP_CRYPT_NOKEYWLOCK используется для организации шифрования\расшифрования пакетов в многопоточном режиме, при этом ключ шифрования\расшифрования блокируется только на чтение. Для обеспечения данного режима работы необходимо заранее создать специальный объект HCRYPTMODULE с помощью функции CPCGetProvParam() с флагом PP_CREATE_THREAD_CSP; данный объект в дальнейшем следует передавать функциям CPCEncrypt() и CPCDecrypt() в качестве первого параметра.
Использование флага CP_CRYPT_NOKEYWLOCK разрешается только совместно с флагом CP_CRYPT_HASH_PACKET, при значении параметра Final == TRUE; использование флага при шифровании\расшифровании на ключе с режимом преобразования (KP_MIXMODE), отличным от CRYPT_SIMPLEMIX_MODE, а также совместно с флагом CP_CHP_IV_CHAIN не допускается.
Пример
CPCGetProvParam(hCSP, hProv, PP_CREATE_THREAD_CSP, NULL, &dwThreadCSPData, 0); pbThreadCSPData = (BYTE*)malloc(dwThreadCSPData); CPCGetProvParam(hCSP, hProv, PP_CREATE_THREAD_CSP, pbThreadCSPData, &dwThreadCSPData, 0); hThreadCSP = (HCRYPTMODULE)pbThreadCSPData; CPCEncrypt(hThreadCSP, hProv, hKey, hHash, TRUE, CP_CHP(CP_CHP_HASH_ENCRYPT | CP_CHP_IV_RANDOM | CP_CHP_STARTMIX | CP_CHP_HASH_PACKET | CP_CRYPT_NOKEYWLOCK, HEADER_BYTE_SIZE, TRAILER_BYTE_SIZE, HASH_DWORD_SIZE), pbThreadPacketData, &cbThreadPacketData, cbThreadPacketData);
Умолчания:
1. В случае hHash=0, значение функции хэширования не рассчитывается.
2. Представление данных в виде IOVEC является производным от представления, определяемого флагами. Имеется ввиду, что IOVEC представляет данные, а описание структуры данных содержится во флагах.
3. Максимальное количество элементов IOVEC зависит от реализации. Любая реализация должна предоставлять возможность использовать 16 элементов IOVEC.
4. Поле длины элемента IOVEC >= 0.
Структура пакета и порядок обработки полей пакета определяются значениями флагов параметра dwFlags, объединяемыми операцией OR; значения флагов зависимы, не все сочетания значений полей допустимы. Для формирования флагов рекомендуется использовать макрос CP_CHP().
Макросы | Описание |
---|---|
CP_CRYPT_HASH_PACKET | Флаг - признак пакетной обработки данных, должен быть установлен, если используется обработка пакета, в противном случае dwFlags должен быть равен нулю, что соответствует обработке простого потока данных. |
CP_CHP_HASH_ENCRYPT | Флаг определяет порядок обработки данных пакета - хэширование (имитозащита) затем шифрование. |
CP_CHP_ENCRYPT_HASH | Флаг определяет порядок обработки данных пакета - шифрование затем хэширование (имитозащита). |
CP_CHP_MULTIPACKET | Флаг - признак мультипакетного режима работы. Параметр pbData должен указывать на массив структур CSP_MultiPacket_ENC/CSP_Multipacket_DEC, в параметре cbData/reserved передаётся число структур в массиве (не должно превышать 16). В каждой из структур CSP_MultiPacket_ENC/CSP_Multipacket_DEC до вызова CPEncrypt()/CPDecrypt() соответственно в поле dwResult должно быть записано значение 1. В случае ошибок, связанных с проверкой значений имитовставки одного или нескольких пакетов (ошибка NTE_BAD_HASH), после выхода из функции в поле dwResult будет 0 только у тех пакетов, обработка которых завершилась с успешной проверкой значения имитовставки (значения функции хэширования). |
CP_CRYPT_NOKEYWLOCK | Флаг - признак работы с блокировкой ключа только на чтение. Ситуации, при которой блокировка на чтение невозможна, сопоставляется ошибка NTE_BAD_FLAGS. |
CP_CHP_IV_HEADER | Флаг хэширования вектора инициализации (IV). Если установлен, IV следует за заголовком пакета и хэшируется. Если не установлен, IV ,если присутствует в пакете, следует за заголовком пакета, но не хэшируется. |
CP_CHP_STARTMIX | Флаг диверсификации ключа шифрования и хэширования по алгоритму CALG_PRO_DIVERS. Если используется представление данных в форме пакета, блоб диверсификации должен передаваться в составе пакета в его начале. Если используется представление данных в форме вектора ввода-вывода, блоб диверсификации должен передаваться в первой координате вектора целиком. При обработке мультипакета (флаг CP_CHP_MULTIPACKET установлен) блоб диверсификации должен передаваться в составе первого пакета, в этом случае все пакеты мультипакета обрабатваются на диверсифицированных ключах шифрования и имитозащиты. |
CP_CHP_TLS_PACKET | Флаг - признак пакета, содержащего запись протокола TLS. При использовании этого флага будет производиться работа с заголовком пакета в соответствии с подпротоколом RECORD протокола TLS. |
CP_CHP_IV_MASK | Маска управления IV. Представляет собой поле из 2 зависимых бит. Нулевое значение поля соответствует CP_CHP_IV_CHAIN. Ненулевые значения соответствуют CP_CHP_IV_USER, CP_CHP_IV_RANDOM. Может быть установлен только один из флагов CP_CHP_IV_CHAIN, CP_CHP_IV_USER, CP_CHP_IV_RANDOM. |
CP_CHP_IV_RANDOM | Если флаг установлен, IV генерируется функцией CPEncrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCEncrypt()) и передаётся в пакет. Функция CPDecrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCEncrypt()) считывает IV из пакета. |
CP_CHP_IV_USER | Если флаг установлен, приложение устанавливает IV в пакет, функции CPEncrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCEncrypt()), CPDecrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCEncrypt()) считывают IV из пакета. |
CP_CHP_IV_CHAIN | Если флаг установлен, функции CPEncrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCEncrypt()), CPDecrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCDecrypt()) получают IV пакета из контекста ключа. |
CP_CHP_HASH_MASK | Маска управления значением хэш-функции пакета. Представляет собой поле из 2 зависимых бит. Нулевое значение поля соответствует CP_CHP_HASH_NONE. Ненулевые значения соответствуют CP_CHP_HASH_CHAIN, CP_CHP_HASH_PACKET. Может быть установлен только один из флагов CP_CHP_HASH_NONE, CP_CHP_HASH_CHAIN, CP_CHP_HASH_PACKET. |
CP_CHP_HASH_NONE | Если флаг установлен, функция хэширования расчитывается на весь поток пакетов. В пакет значение хэш-функции не передаётся. |
CP_CHP_HASH_CHAIN | Если флаг установлен, функция хэширования рассчитывается на поток пакетов, текущее значение хэш-функции устанавливается в пакет функциями CPEncrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_HASH_CHAIN...,...) (CPCEncrypt()). Функции CPDecrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCDecrypt()) сравнивают рассчитанное значение хэш-функции со значением, полученным из пакета, и в случае несовпадения возвращают ошибку NTE_BAD_HASH. |
CP_CHP_HASH_PACKET | Если флаг установлен, функция хэширования рассчитывается на пакет, значение хэш-функции устанавливается в пакет функциями CPEncrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_HASH_CHAIN...,...) (CPCEncrypt()). Функции CPDecrypt(...,CP_CRYPT_HASH_PACKET|CP_CHP_IV_CHAIN...,...) (CPCDecrypt()) сравнивают рассчитанное значение хэш-функции со значением, полученным из пакета, и в случае несовпадения возвращают ошибку NTE_BAD_HASH. |
CP_CHP_HASH_SIZE_MASK | Маска размера значения хэш-функции в двойных словах (4 октета), устанавливаемого в пакет. Возможные значения: 1 (для имитозащиты) от 1 до 8 (ддя хэш-функции по ГОСТ Р34.11-94 и HMAC). |
CP_CHP_TRAILER_MASK | Маска размера трейлера в байтах, значения 0 - 254 означают длину трейлера, значение 255 означает: длина трейлера 0, значения хэш-функции в пакете шифруется. |
CP_CHP_ENCRYPTED_TRAILER | |
CP_CHP_HEADER_MASK | Маска размера заголовка в байтах, размер может проинимать значения 0 - 255. |
BASE_AEAD_FLAGS | Пакетные флаги для AEAD-режимов. |
CP_CHP | Макрос для формирования параметра dwFlags (флагов) функций CPEncrypt() и CPDecrypt(). |
CPEncrypt (CP_CRYPT_HASH_PACKET) ,CPDecrypt (CP_CRYPT_HASH_PACKET) ,CP_CHP()