My first patch, I could use a review. Thanks.
You need to sign off the patch.
---
��dlls/crypt32/cert.c�� �� �� ��| 59 +++++++++++++++++++++++++++++++++++++++
��dlls/crypt32/crypt32.spec |�� 1 +
��include/wincrypt.h�� �� �� �� |�� 4 +++
��3 files changed, 64 insertions(+)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 2d4ce8c10c..82d06e2e33 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -2213,6 +2213,65 @@ BOOL WINAPI CryptHashCertificate(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,
�� �� ��return ret;
��}
+BOOL WINAPI CryptHashCertificate2(LPCWSTR pwszCNGHashAlgid, DWORD dwFlags,
+ void *pvReserved, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,
+ DWORD *pcbComputedHash)
+{
+�� �� BCRYPT_HASH_HANDLE hash = NULL;
+�� �� BCRYPT_ALG_HANDLE alg = NULL;
+�� �� NTSTATUS status;
+�� �� DWORD hash_len;
+�� �� DWORD hash_len_size;
+
+�� �� TRACE("(%s, %08x, %p, %p, %d, %p, %p)\n", debugstr_w(pwszCNGHashAlgid),
+�� �� ��dwFlags, pvReserved, pbEncoded, cbEncoded, pbComputedHash, pcbComputedHash);
+
+�� �� if (pcbComputedHash == NULL)
+�� �� {
+�� �� �� �� status = STATUS_INVALID_PARAMETER;
+�� �� �� �� goto done;
+�� �� }
+
+�� �� if ((status = BCryptOpenAlgorithmProvider(&alg, pwszCNGHashAlgid, NULL, 0)))
+�� �� �� �� goto done;
+
+�� �� if ((status = BCryptCreateHash(alg, &hash, NULL, 0, NULL, 0, 0)))
+�� �� �� �� goto done;
+
+�� �� if ((status = BCryptGetProperty(hash, BCRYPT_HASH_LENGTH, (BYTE *)&hash_len, sizeof(hash_len), &hash_len_size, 0)))
+�� �� �� �� goto done;
+
+�� �� if (pbComputedHash == NULL)
+�� �� {
+�� �� �� �� *pcbComputedHash = hash_len;
+�� �� �� �� goto done;
+�� �� }
+
+�� �� if (*pcbComputedHash < hash_len)
+�� �� {
+�� �� �� �� status = STATUS_INVALID_PARAMETER;
+�� �� �� �� goto done;
+�� �� }
+�� �� else
+�� �� {
+�� �� �� �� *pcbComputedHash = hash_len;
+�� �� }
+
+�� �� if ((status = BCryptHashData(hash, (BYTE *)pbEncoded, cbEncoded, 0)))
+�� �� �� �� goto done;
+
+�� �� if ((status = BCryptFinishHash(hash, pbComputedHash, hash_len, 0)))
+�� �� {
+�� �� �� �� goto done;
+�� �� }
+
+done:
+�� �� if (hash) BCryptDestroyHash(hash);
+�� �� if (alg)�� BCryptCloseAlgorithmProvider(alg, 0);
+�� �� if (status) SetLastError(RtlNtStatusToDosError(status));
+�� �� return status == 0;
+}
+
��BOOL WINAPI CryptHashPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,
�� DWORD dwFlags, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo,
�� BYTE *pbComputedHash, DWORD *pcbComputedHash)
diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec
index fc32570b52..fa507dfc65 100644
--- a/dlls/crypt32/crypt32.spec
+++ b/dlls/crypt32/crypt32.spec
@@ -136,6 +136,7 @@
��@ stdcall CryptGetOIDFunctionAddress(long long str long ptr ptr)
��@ stdcall CryptGetOIDFunctionValue(long str str wstr ptr ptr ptr)
��@ stdcall CryptHashCertificate(long long long ptr long ptr ptr)
+@ stdcall CryptHashCertificate2(wstr long ptr ptr long ptr ptr)
��@ stdcall CryptHashMessage(ptr long long ptr ptr ptr ptr ptr ptr)
��@ stdcall CryptHashPublicKeyInfo(long long long long ptr ptr ptr)
��@ stdcall CryptHashToBeSigned(ptr long ptr long ptr ptr)
diff --git a/include/wincrypt.h b/include/wincrypt.h
index a1b1305902..cbc76d7f10 100644
--- a/include/wincrypt.h
+++ b/include/wincrypt.h
@@ -4379,6 +4379,10 @@ BOOL WINAPI CryptHashCertificate(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,
�� DWORD dwFlags, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,
�� DWORD *pcbComputedHash);
+BOOL WINAPI CryptHashCertificate2(LPCWSTR pwszCNGHashAlgid, DWORD dwFlags,
+ void *pvReserved, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,
+ DWORD *pcbComputedHash);
+
��BOOL WINAPI CryptHashPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,
�� DWORD dwFlags, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo,
�� BYTE *pbComputedHash, DWORD *pcbComputedHash);
--
2.19.1