Здравствуйте!
Мне нужно получить ключ, диверсифицированный по алгоритму из п.7 rfc4357,
чтобы пользоваться им впоследствии как симметричным ключом.
Исходный ключ, который подлежит диверсификации должен находится в долговременном хранилище.
Поэтому я создаю пару AT_KEYEXCHANGE (или AT_SIGNATURE).
Но следующий код не работает (асимметричный ключ не диверсифицируется):
Цитата:
//для примера
BYTE UKM[20]={
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,
0xA0,0xA1,0xA2,0xA3,0xA4,0xF6,0xE7,0xD8,0xC9,0xBA
};
BYTE blob[sizeof(CRYPT_DIVERSBLOB)+20];
CRYPT_DIVERSBLOB * Blob = (CRYPT_DIVERSBLOB*)blob;
Blob->DiversBlobHeader.BlobHeader.bType = DIVERSKEYBLOB;
Blob->DiversBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob->DiversBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob->DiversBlobHeader.aiDiversAlgId = CALG_PRO_DIVERS;
Blob->DiversBlobHeader.dwDiversMagic = DIVERS_MAGIC;
Blob->DiversBlobHeader.cbDiversData = 20;
CopyMemory((LPBYTE)Blob->bDiversData,UKM,20);
if(!CryptImportKey(hProv, blob, sizeof(CRYPT_DIVERSBLOB)+20, hAsymKey, 0, &hSymDiversKey))HandleError("Diversify error");
Функция импорта возвращает: NTE_BAD_TYPE : "Тип ключевого блоба не поддерживается этим криптопровайдером и, возможно, ошибочен".
На всякий случай, AsymKey получен кодом:
Цитата:
if(!CryptAcquireContext(
&hProv,
cont_name,
NULL,
PROV_GOST_2001_DH,
CRYPT_NEWKEYSET)
) {
HandleError("Could not create Key Container");
}
printf( "Key Container %s created\n", cont_name);
if(!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hAsymKey)){
HandleError("Could not create AsymKey");
}
printf( "AsymKey in container %s created\n", cont_name);
В тоже время, если я устанавливаю в контейнер симметричный ключ (CALG_G28147) и диверсифицирую его кодом, приведенным выше, то всё работает.
Но вся проблема в том, что исходный ключ должен находиться в долговременном хранилище, а симметричные и эфемеральные асимметричные в долговременном хранилище не хранятся.
Подскажите, пожалуйста, что я делаю не так ?
Может быть надо установить какие-то атрибуты исходному (hAsymKey) ключу перед вызовом CryptImportKey ?
Всё это нам нужно для того, чтобы получать хендлы диверсифицированных ключей из CryptoPro HSM (сейчас строим макет на CryptoPro CSP 3.6).
Да, забыл сказать, что контейнер я создаю на машине (т.е.
LPCSTR cont_name="\\\\.\\hdimage\\test_container").
И еще, под windows не проверял (если это важно).
Отредактировано пользователем 24 декабря 2014 г. 15:37:34(UTC)
| Причина: Не указана