КриптоПро CSP  

Шифрование и хэширование пакета

Пакет - неделимый фрагмент данных, подаваемых на функции шифрования 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_PROMIX_MODE, CRYPT_SIMPLEMIX_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_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.
CP_CHP Макрос для формирования параметра dwFlags (флагов) функций CPEncrypt() и CPDecrypt().

См. также

CPEncrypt (CP_CRYPT_HASH_PACKET) ,CPDecrypt (CP_CRYPT_HASH_PACKET) ,CP_CHP()