Пробую экспортировать пользовательский ключ - не получается.
Получил ключ - CryptGetUserKey(AT_SIGNATURE)
Сгенерировал симметричный - CryptGenKey(CALG_G28147)
Сменил тип на экспорт - CryptSetKeyParam( KP_ALGID, CALG_PRO_EXPORT, 0 );
Проставил IV в ноль -
unsigned char iv[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }
CryptSetKeyParam( KP_IV, iv, 0 );
Проэкспортировал пользовательский на симметричном - CryptExportKey( PRIVATEKEYBLOB )
Вырезал заголовок и имитовставку.
Проверяю ключ:
Диверсифицирую ключ на IV
CRYPT_DIVERSBLOB Blob;
Blob.DiversBlobHeader.BlobHeader.bType = DIVERSKEYBLOB;
Blob.DiversBlobHeader.BlobHeader.bVersion = 0x20;
Blob.DiversBlobHeader.BlobHeader.reserved = 0;
Blob.DiversBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob.DiversBlobHeader.aiDiversAlgId = CALG_PRO_DIVERS;
Blob.DiversBlobHeader.dwDiversMagic = 0x31564944;
Blob.DiversBlobHeader.cbDiversData = 8;
CopyMemory((LPBYTE)Blob.bDiversData,iv,8);
CryptSetKeyParam( agree, KP_IV, iv, 0 );
ImportKey( hProv, (BYTE*)&Blob, sizeof(Blob) + 7, agree, 0, hSymKey );
Далее на ключе считаю имиту, не сходится (!!!)
CryptCreateHash( hProv, CALG_G28147_IMIT, hSymKey, 0, hHash );
CryptHashData( hHash, &data.at(0), data.size(), 0 );
unsigned char countimito[4];
DWORD datalen = 4;
CryptGetHashParam( hHash, HP_HASHVAL, countimito, &datalen, 0 );