Прошу прошения за задержку с ответом. Вот код целиком:
//Получаем дескриптор CSP
if (!CryptAcquireContext( &hProv, "Public", NULL, 75, 0))
goto err;
//Получаем дескриптор закрытого ключа отправителя
if (!CryptGetUserKey( hProv, AT_SIGNATURE, &hKey))
goto err;
//Получаем ключевой блоб открытого ключа получателя
BYTE KeyBlob[100] = {
0x06, 0x20, 0x00, 0x00, 0x23, 0x2E, 0x00, 0x00, 0x4D, 0x41, 0x47, 0x31, 0x00, 0x02, 0x00, 0x00,
0x30, 0x12, 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01, 0x06, 0x07, 0x2A, 0x85, 0x03,
0x02, 0x02, 0x1E, 0x01
};
//Дополняем блоб самим ключом
CK_BYTE pubKeyValue[64]; //64 байта ключа из eToken
memcpy(KeyBlob + 36, pubKeyValue, 64);
//Получаем ключ согласования
HCRYPTKEY hAgreeKey;
if (!CryptImportKey(hProv, (BYTE*)&KeyBlob, sizeof(KeyBlob), hKey, CRYPT_EXPORTABLE, &hAgreeKey))
goto err;
//Определяем вектор инициализации ключа согласования - он получается 8 байт
BYTE *pbIV = NULL;
DWORD dwIV = 0; // Длина вектора инициализации
if (!CryptGetKeyParam( hAgreeKey, KP_IV, NULL, &dwIV, 0))
goto err;
pbIV = (BYTE*)malloc(dwIV);
if (!CryptGetKeyParam( hAgreeKey, KP_IV, pbIV, &dwIV, 0))
goto err;
//Определяем ключевой алгоритм ключа согласования - он получается CALG_PRO_AGREEDKEY_DH
if (!CryptGetKeyParam( hAgreeKey, KP_ALGID, NULL, &dwIV, 0))
goto err;
pbIV = (BYTE*)malloc(dwIV);
if (!CryptGetKeyParam( hAgreeKey, KP_ALGID, pbIV, &dwIV, 0))
goto err;
//Теперь пытаемся изменить параметры ключа
//Устанавливаем вектор инициализации ключа согласования 8 или 32 байт - здесь всё хорошо
if (!CryptSetKeyParam( hAgreeKey, KP_IV, pbIV, 0))
goto err ;
//Пытаемся изменить KP_ALGID на CALG_G28147 - ошибка "NTE_BAD_TYPE"
ALG_ID dwKeyType = CALG_G28147
if (!CryptSetKeyParam( hAgreeKey, KP_ALGID, (PBYTE)&dwKeyType, 0 ))
goto err;
//Пытаемся экспортировать ключ согласования в блоб - разные ошибки ( "NTE_BAD_KEY" , "NTE_BAD_KEY_STATE" , "NTE_BAD_TYPE" )
DWORD dwBlobLen;
if (!CryptExportKey( hAgreeKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen)) // тут ошибка "NTE_BAD_KEY"
goto err;
if (!CryptExportKey( hAgreeKey, 0, SIMPLEBLOB , 0, NULL, &dwBlobLen)) // тут ошибка "NTE_BAD_KEY_STATE"
goto err;
if (!CryptExportKey( hAgreeKey, 0, PLAINTEXTKEYBLOB, 0, NULL, &dwBlobLen)) // тут ошибка "NTE_BAD_TYPE"
goto err;
//Пытаемся шифровать ключом согласования - ошибка "NTE_BAD_ALGID"
if (!CryptEncrypt( hAgreeKey, 0, TRUE, 0, pbContent, &cbContent, bufLen))
goto err;