This program is working for Windows 10 properly but on Windows 7 and Windows 8 and Windows 8.1 I am getting following error :
NCryptFinalizeKey key2 Response Code:-2146893785
Hi I am giving proper details below:
NCRYPT_PROV_HANDLE prov = NULL;
NCRYPT_KEY_HANDLE key = NULL;
DWORD keyLength = 2048;
DWORD blobLen = 0x1000;
BYTE blobexport[0x1000] = {0};
DWORD policy = NCRYPT_ALLOW_EXPORT_FLAG | NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
int errCode = 0;
errCode = NCryptOpenStorageProvider(&prov, MS_KEY_STORAGE_PROVIDER, 0) ;//creatingstorageProvider
out<<"NCryptOpenStorageProvider "<<" Response Code:"<<errCode<<endl;
errCode = NCryptCreatePersistedKey(prov, &key, NCRYPT_RSA_ALGORITHM, L"persist",0,NCRYPT_OVERWRITE_KEY_FLAG) ;//create and store key
out<<"NCryptCreatePersistedKey "<<" Response Code:"<<errCode<<endl;
errCode = NCryptSetProperty(key, NCRYPT_LENGTH_PROPERTY, (PBYTE)(&keyLength), sizeof(keyLength), NCRYPT_PERSIST_FLAG) ;//set length to store key
out<<"NCryptSetProperty "<<" Response Code1:"<<errCode<<endl;
errCode = NCryptSetProperty(key, NCRYPT_EXPORT_POLICY_PROPERTY, (PBYTE)(&policy), sizeof(policy), NCRYPT_PERSIST_FLAG);//set export property
out<<"NCryptSetProperty "<<" Response Code2:"<<errCode<<endl;
errCode = NCryptFinalizeKey(key, 0);//Do finiliaze key
out<<"NCryptFinalizeKey "<<" Response Code:"<<errCode<<endl;
errCode = NCryptExportKey(key, NULL, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, NULL, blobexport, blobLen, &blobLen, 0) ;//exporting the key from keystorage
out<<"NCryptExportKey "<<" Response Code:"<<errCode<<endl;
//I am adding my own Values to the exported key blob from keys array
int keys[32] = "{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','1','2',3','4','5','6'}"
int keysincrementValues=0;
for(int setValues =64;setValues<=96;setValues++)
{
blobexport[setValues]=keys[keysincrementValues]+3;//Assigning key values to blobexport
keysincrementValues++;
}
keys[32]='\0';
NCRYPT_PROV_HANDLE prov2 = NULL;
NCRYPT_KEY_HANDLE key2 = NULL;
DWORD policy2 = NCRYPT_ALLOW_EXPORT_FLAG | NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
LPCWSTR name = L"importKey";
BCryptBuffer cb[1];
cb[0].BufferType = NCRYPTBUFFER_PKCS_KEY_NAME;
cb[0].pvBuffer = (void*)name;
cb[0].cbBuffer = lstrlenW(name) * 2 + 2;
NCryptBufferDesc desc;
desc.ulVersion = 0;
desc.pBuffers = cb;
desc.cBuffers = 1;
errCode = NCryptOpenStorageProvider(&prov2, MS_KEY_STORAGE_PROVIDER, 0) ;//creating onemore storage
out<<"NCryptOpenStorageProvider prov2 "<<" Response Code:"<<errCode<<endl;
errCode = NCryptImportKey(prov2, NULL, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, &desc, &key2, blobexport, blobLen, NCRYPT_DO_NOT_FINALIZE_FLAG);//Importing blobexport to key storage means the 32 keys will be present in RSA KEY
out<<"NCryptImportKey key2 "<<" Response Code:"<<errCode<<endl;
errCode = NCryptSetProperty(key2, NCRYPT_EXPORT_POLICY_PROPERTY, (PBYTE)(&policy2), sizeof(policy2), NCRYPT_PERSIST_FLAG) ;//We are setting the export policy
out<<"NCryptSetProperty key2 "<<" Response Code:"<<errCode<<endl;
errCode = NCryptFinalizeKey(key2, 0);//finalized the key.
out<<"NCryptFinalizeKey key2 "<<" Response Code:"<<errCode<<endl;// NCryptFinalizeKey key2 Response Code:-2146893785
//I am getting error for finiliazed key NCryptFinalizeKey key2 Response Code:-2146893785
And also NCryptFinalizeKey api supported OS is below which is given in the Microsoft doc:
Minimum supported client Windows Vista [desktop apps | UWP apps]
Minimum supported server Windows Server 2008 [desktop apps | UWP apps]
the Microsoft doc link is below:
https://learn.microsoft.com/en-us/windows/win32/api/ncrypt/nf-ncrypt-ncryptfinalizekey