Добрый день всем постояльцам форума.
Есть необходимость перенести ключ с одного контейнера на другой (на разных RSA-криптопровайдерах).
В качестве источника MS_ENH_RSA_AES_PROV.
Мое видение:
--
0. Захватываем контексты криптопровайдеров и приватного ключа
CryptAcquireContext(&hProvDest, CONTAINER_DEST, PROVNAME_DEST,PROVTYPE_DEST,CRYPT_NEWKEYSET)
CryptAcquireContext(&hProvSrc,CONTAINER_SRC,PROVNAME_SRC,PROVTYPE_SRC,0)
CryptGetUserKey(hProvSrc,AT_KEYEXCHANGE,&hPrivateKey)
--
1. Генерируем на получателе ключ для обмена
CryptGenKey(hProvDest, CALG_RSA_KEYX, CRYPT_EXPORTABLE, &hKeyForEnchangeDest)
--
2. Экспортируем публичную часть этого ключа в blob (предварительно узнав размер)
CryptExportKey(hKeyForEnchangeDest,0,PUBLICKEYBLOB,0,pbKeyBlob,&dwBlobLen)
--
3. Импортируем в провайдер-источник
CryptImportKey(hProvSrc,pbKeyBlob,dwBlobLen,0,0,&hKeyForEnchangeSrc)
--
4. Экспортируем целевой секретный ключ из источника (предварительно запросив размер)
CryptExportKey(hPrivateKey, hKeyForEnchangeSrc, PRIVATEKEYBLOB, 0, NULL, &dwBlobLen)
CryptExportKey(hPrivateKey, hKeyForEnchangeSrc, PRIVATEKEYBLOB, 0, pbKeyBlob, &dwBlobLen)
--
На последней строчке падаем с GetLastError 2148073476 (NTE_BAD_LEN, dwBlobLen получает значение 1300).
В чем может быть проблема? И верен ли в принципе подход? Может я что-то упустил или делаю неверно?
Спасибо.