crypt32: Pass on aiKeyAlg on RSA key import.
This commit is contained in:
parent
a3223df865
commit
8fa3b6871f
@ -3918,8 +3918,12 @@ static BOOL WINAPI CRYPT_ImportRsaPublicKeyInfoEx(HCRYPTPROV hCryptProv,
|
|||||||
pInfo->PublicKey.pbData, pInfo->PublicKey.cbData, 0, pubKey,
|
pInfo->PublicKey.pbData, pInfo->PublicKey.cbData, 0, pubKey,
|
||||||
&pubKeySize);
|
&pubKeySize);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
{
|
||||||
|
if(aiKeyAlg)
|
||||||
|
((BLOBHEADER*)pubKey)->aiKeyAlg = aiKeyAlg;
|
||||||
ret = CryptImportKey(hCryptProv, pubKey, pubKeySize, 0, 0,
|
ret = CryptImportKey(hCryptProv, pubKey, pubKeySize, 0, 0,
|
||||||
phKey);
|
phKey);
|
||||||
|
}
|
||||||
CryptMemFree(pubKey);
|
CryptMemFree(pubKey);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -5802,6 +5802,8 @@ static void testImportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO info)
|
|||||||
BOOL ret;
|
BOOL ret;
|
||||||
HCRYPTKEY key;
|
HCRYPTKEY key;
|
||||||
PCCERT_CONTEXT context;
|
PCCERT_CONTEXT context;
|
||||||
|
DWORD dwSize;
|
||||||
|
ALG_ID ai;
|
||||||
|
|
||||||
/* These crash
|
/* These crash
|
||||||
ret = CryptImportPublicKeyInfoEx(0, 0, NULL, 0, 0, NULL, NULL);
|
ret = CryptImportPublicKeyInfoEx(0, 0, NULL, 0, 0, NULL, NULL);
|
||||||
@ -5820,9 +5822,37 @@ static void testImportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO info)
|
|||||||
&key);
|
&key);
|
||||||
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
|
ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
|
||||||
"Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
|
"Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError());
|
||||||
|
|
||||||
|
/* Export key with standard algorithm (CALG_RSA_KEYX) */
|
||||||
ret = CryptImportPublicKeyInfoEx(csp, X509_ASN_ENCODING, info, 0, 0, NULL,
|
ret = CryptImportPublicKeyInfoEx(csp, X509_ASN_ENCODING, info, 0, 0, NULL,
|
||||||
&key);
|
&key);
|
||||||
ok(ret, "CryptImportPublicKeyInfoEx failed: %08x\n", GetLastError());
|
ok(ret, "CryptImportPublicKeyInfoEx failed: %08x\n", GetLastError());
|
||||||
|
|
||||||
|
dwSize = sizeof(ai);
|
||||||
|
CryptGetKeyParam(key, KP_ALGID, (LPVOID)&ai, &dwSize, 0);
|
||||||
|
ok(ret, "CryptGetKeyParam failed: %08x\n", GetLastError());
|
||||||
|
if(ret)
|
||||||
|
{
|
||||||
|
ok(dwSize == sizeof(ai), "CryptGetKeyParam returned size %d\n",dwSize);
|
||||||
|
ok(ai == CALG_RSA_KEYX, "Default ALG_ID is %04x (expected CALG_RSA_KEYX)\n", ai);
|
||||||
|
}
|
||||||
|
|
||||||
|
CryptDestroyKey(key);
|
||||||
|
|
||||||
|
/* Repeat with forced algorithm */
|
||||||
|
ret = CryptImportPublicKeyInfoEx(csp, X509_ASN_ENCODING, info, CALG_RSA_SIGN, 0, NULL,
|
||||||
|
&key);
|
||||||
|
ok(ret, "CryptImportPublicKeyInfoEx failed: %08x\n", GetLastError());
|
||||||
|
|
||||||
|
dwSize = sizeof(ai);
|
||||||
|
CryptGetKeyParam(key, KP_ALGID, (LPVOID)&ai, &dwSize, 0);
|
||||||
|
ok(ret, "CryptGetKeyParam failed: %08x\n", GetLastError());
|
||||||
|
if(ret)
|
||||||
|
{
|
||||||
|
ok(dwSize == sizeof(ai), "CryptGetKeyParam returned size %d\n",dwSize);
|
||||||
|
ok(ai == CALG_RSA_SIGN, "ALG_ID is %04x (expected CALG_RSA_SIGN)\n", ai);
|
||||||
|
}
|
||||||
|
|
||||||
CryptDestroyKey(key);
|
CryptDestroyKey(key);
|
||||||
|
|
||||||
/* Test importing a public key from a certificate context */
|
/* Test importing a public key from a certificate context */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user