Commit 7780caf4 authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

crypt32: Use BCrypt algorithm pseudo-handles.

parent 430b9db0
...@@ -2620,9 +2620,8 @@ done: ...@@ -2620,9 +2620,8 @@ done:
static BOOL CNG_ImportECCPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HANDLE *key) static BOOL CNG_ImportECCPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HANDLE *key)
{ {
DWORD blob_magic, ecckey_len, size; DWORD blob_magic, ecckey_len, size;
BCRYPT_ALG_HANDLE alg = NULL; BCRYPT_ALG_HANDLE alg_handle;
BCRYPT_ECCKEY_BLOB *ecckey; BCRYPT_ECCKEY_BLOB *ecckey;
const WCHAR *sign_algo;
char **ecc_curve; char **ecc_curve;
NTSTATUS status; NTSTATUS status;
...@@ -2645,47 +2644,39 @@ static BOOL CNG_ImportECCPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HAN ...@@ -2645,47 +2644,39 @@ static BOOL CNG_ImportECCPubKey(CERT_PUBLIC_KEY_INFO *pubKeyInfo, BCRYPT_KEY_HAN
if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P256)) if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P256))
{ {
sign_algo = BCRYPT_ECDSA_P256_ALGORITHM; alg_handle = BCRYPT_ECDSA_P256_ALG_HANDLE;
blob_magic = BCRYPT_ECDSA_PUBLIC_P256_MAGIC; blob_magic = BCRYPT_ECDSA_PUBLIC_P256_MAGIC;
} }
else if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P384)) else if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P384))
{ {
sign_algo = BCRYPT_ECDSA_P384_ALGORITHM; alg_handle = BCRYPT_ECDSA_P384_ALG_HANDLE;
blob_magic = BCRYPT_ECDSA_PUBLIC_P384_MAGIC; blob_magic = BCRYPT_ECDSA_PUBLIC_P384_MAGIC;
} }
else else
{ {
FIXME("Unsupported ecc curve type: %s\n", *ecc_curve); FIXME("Unsupported ecc curve type: %s\n", *ecc_curve);
sign_algo = NULL; alg_handle = NULL;
blob_magic = 0; blob_magic = 0;
} }
LocalFree(ecc_curve); LocalFree(ecc_curve);
if (!sign_algo) if (!alg_handle)
{ {
SetLastError(NTE_BAD_ALGID); SetLastError(NTE_BAD_ALGID);
return FALSE; return FALSE;
} }
if ((status = BCryptOpenAlgorithmProvider(&alg, sign_algo, NULL, 0)))
goto done;
ecckey_len = sizeof(BCRYPT_ECCKEY_BLOB) + pubKeyInfo->PublicKey.cbData - 1; ecckey_len = sizeof(BCRYPT_ECCKEY_BLOB) + pubKeyInfo->PublicKey.cbData - 1;
if (!(ecckey = CryptMemAlloc(ecckey_len))) if (!(ecckey = CryptMemAlloc(ecckey_len)))
{ return STATUS_NO_MEMORY;
status = STATUS_NO_MEMORY;
goto done;
}
ecckey->dwMagic = blob_magic; ecckey->dwMagic = blob_magic;
ecckey->cbKey = (pubKeyInfo->PublicKey.cbData - 1) / 2; ecckey->cbKey = (pubKeyInfo->PublicKey.cbData - 1) / 2;
memcpy(ecckey + 1, pubKeyInfo->PublicKey.pbData + 1, pubKeyInfo->PublicKey.cbData - 1); memcpy(ecckey + 1, pubKeyInfo->PublicKey.pbData + 1, pubKeyInfo->PublicKey.cbData - 1);
status = BCryptImportKeyPair(alg, NULL, BCRYPT_ECCPUBLIC_BLOB, key, (BYTE*)ecckey, ecckey_len, 0); status = BCryptImportKeyPair(alg_handle, NULL, BCRYPT_ECCPUBLIC_BLOB, key, (BYTE*)ecckey, ecckey_len, 0);
CryptMemFree(ecckey); CryptMemFree(ecckey);
done:
if (alg) BCryptCloseAlgorithmProvider(alg, 0);
if (status) SetLastError(RtlNtStatusToDosError(status)); if (status) SetLastError(RtlNtStatusToDosError(status));
return !status; return !status;
} }
...@@ -2695,8 +2686,7 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k ...@@ -2695,8 +2686,7 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k
DWORD size, modulus_len, i; DWORD size, modulus_len, i;
BLOBHEADER *hdr; BLOBHEADER *hdr;
RSAPUBKEY *rsapubkey; RSAPUBKEY *rsapubkey;
const WCHAR *rsa_algo; BCRYPT_ALG_HANDLE alg_handle;
BCRYPT_ALG_HANDLE alg = NULL;
BCRYPT_RSAKEY_BLOB *rsakey; BCRYPT_RSAKEY_BLOB *rsakey;
BYTE *s, *d; BYTE *s, *d;
NTSTATUS status; NTSTATUS status;
...@@ -2715,9 +2705,9 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k ...@@ -2715,9 +2705,9 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k
} }
if (hdr->aiKeyAlg == CALG_RSA_KEYX) if (hdr->aiKeyAlg == CALG_RSA_KEYX)
rsa_algo = BCRYPT_RSA_ALGORITHM; alg_handle = BCRYPT_RSA_ALG_HANDLE;
else if (hdr->aiKeyAlg == CALG_RSA_SIGN) else if (hdr->aiKeyAlg == CALG_RSA_SIGN)
rsa_algo = BCRYPT_RSA_SIGN_ALGORITHM; alg_handle = BCRYPT_RSA_SIGN_ALG_HANDLE;
else else
{ {
FIXME("Unsupported RSA algorithm: %#x\n", hdr->aiKeyAlg); FIXME("Unsupported RSA algorithm: %#x\n", hdr->aiKeyAlg);
...@@ -2726,9 +2716,6 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k ...@@ -2726,9 +2716,6 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k
return FALSE; return FALSE;
} }
if ((status = BCryptOpenAlgorithmProvider(&alg, rsa_algo, NULL, 0)))
goto done;
rsapubkey = (RSAPUBKEY *)(hdr + 1); rsapubkey = (RSAPUBKEY *)(hdr + 1);
modulus_len = size - sizeof(*hdr) - sizeof(*rsapubkey); modulus_len = size - sizeof(*hdr) - sizeof(*rsapubkey);
...@@ -2736,12 +2723,8 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k ...@@ -2736,12 +2723,8 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k
FIXME("RSA pubkey has wrong modulus_len %lu\n", modulus_len); FIXME("RSA pubkey has wrong modulus_len %lu\n", modulus_len);
size = sizeof(*rsakey) + sizeof(ULONG) + modulus_len; size = sizeof(*rsakey) + sizeof(ULONG) + modulus_len;
if (!(rsakey = CryptMemAlloc(size))) if (!(rsakey = CryptMemAlloc(size)))
{ return STATUS_NO_MEMORY;
status = STATUS_NO_MEMORY;
goto done;
}
rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC; rsakey->Magic = BCRYPT_RSAPUBLIC_MAGIC;
rsakey->BitLength = rsapubkey->bitlen; rsakey->BitLength = rsapubkey->bitlen;
...@@ -2759,12 +2742,10 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k ...@@ -2759,12 +2742,10 @@ static BOOL CNG_ImportRSAPubKey(CERT_PUBLIC_KEY_INFO *info, BCRYPT_KEY_HANDLE *k
for (i = 0; i < modulus_len; i++) for (i = 0; i < modulus_len; i++)
d[i] = s[modulus_len - i - 1]; d[i] = s[modulus_len - i - 1];
status = BCryptImportKeyPair(alg, NULL, BCRYPT_RSAPUBLIC_BLOB, key, (BYTE *)rsakey, size, 0); status = BCryptImportKeyPair(alg_handle, NULL, BCRYPT_RSAPUBLIC_BLOB, key, (BYTE *)rsakey, size, 0);
CryptMemFree(rsakey); CryptMemFree(rsakey);
done:
LocalFree(hdr); LocalFree(hdr);
if (alg) BCryptCloseAlgorithmProvider(alg, 0);
if (status) SetLastError(RtlNtStatusToDosError(status)); if (status) SetLastError(RtlNtStatusToDosError(status));
return !status; return !status;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment