<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jan 23, 2019 at 1:26 PM Orhan 'aib' Kavrakoğlu <<a href="mailto:aibok42@gmail.com">aibok42@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">My first patch, I could use a review. Thanks.<br>
<br></blockquote><div>You need to sign off the patch.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
 dlls/crypt32/cert.c       | 59 +++++++++++++++++++++++++++++++++++++++<br>
 dlls/crypt32/crypt32.spec |  1 +<br>
 include/wincrypt.h        |  4 +++<br>
 3 files changed, 64 insertions(+)<br>
<br>
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c<br>
index 2d4ce8c10c..82d06e2e33 100644<br>
--- a/dlls/crypt32/cert.c<br>
+++ b/dlls/crypt32/cert.c<br>
@@ -2213,6 +2213,65 @@ BOOL WINAPI CryptHashCertificate(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,<br>
     return ret;<br>
 }<br>
<br>
+BOOL WINAPI CryptHashCertificate2(LPCWSTR pwszCNGHashAlgid, DWORD dwFlags,<br>
+ void *pvReserved, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,<br>
+ DWORD *pcbComputedHash)<br>
+{<br>
+    BCRYPT_HASH_HANDLE hash = NULL;<br>
+    BCRYPT_ALG_HANDLE alg = NULL;<br>
+    NTSTATUS status;<br>
+    DWORD hash_len;<br>
+    DWORD hash_len_size;<br>
+<br>
+    TRACE("(%s, %08x, %p, %p, %d, %p, %p)\n", debugstr_w(pwszCNGHashAlgid),<br>
+     dwFlags, pvReserved, pbEncoded, cbEncoded, pbComputedHash, pcbComputedHash);<br>
+<br>
+    if (pcbComputedHash == NULL)<br>
+    {<br>
+        status = STATUS_INVALID_PARAMETER;<br>
+        goto done;<br>
+    }<br>
+<br>
+    if ((status = BCryptOpenAlgorithmProvider(&alg, pwszCNGHashAlgid, NULL, 0)))<br>
+        goto done;<br>
+<br>
+    if ((status = BCryptCreateHash(alg, &hash, NULL, 0, NULL, 0, 0)))<br>
+        goto done;<br>
+<br>
+    if ((status = BCryptGetProperty(hash, BCRYPT_HASH_LENGTH, (BYTE *)&hash_len, sizeof(hash_len), &hash_len_size, 0)))<br>
+        goto done;<br>
+<br>
+    if (pbComputedHash == NULL)<br>
+    {<br>
+        *pcbComputedHash = hash_len;<br>
+        goto done;<br>
+    }<br>
+<br>
+    if (*pcbComputedHash < hash_len)<br>
+    {<br>
+        status = STATUS_INVALID_PARAMETER;<br>
+        goto done;<br>
+    }<br>
+    else<br>
+    {<br>
+        *pcbComputedHash = hash_len;<br>
+    }<br>
+<br>
+    if ((status = BCryptHashData(hash, (BYTE *)pbEncoded, cbEncoded, 0)))<br>
+        goto done;<br>
+<br>
+    if ((status = BCryptFinishHash(hash, pbComputedHash, hash_len, 0)))<br>
+    {<br>
+        goto done;<br>
+    }<br>
+<br>
+done:<br>
+    if (hash) BCryptDestroyHash(hash);<br>
+    if (alg)  BCryptCloseAlgorithmProvider(alg, 0);<br>
+    if (status) SetLastError(RtlNtStatusToDosError(status));<br>
+    return status == 0;<br>
+}<br>
+<br>
 BOOL WINAPI CryptHashPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,<br>
  DWORD dwFlags, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo,<br>
  BYTE *pbComputedHash, DWORD *pcbComputedHash)<br>
diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec<br>
index fc32570b52..fa507dfc65 100644<br>
--- a/dlls/crypt32/crypt32.spec<br>
+++ b/dlls/crypt32/crypt32.spec<br>
@@ -136,6 +136,7 @@<br>
 @ stdcall CryptGetOIDFunctionAddress(long long str long ptr ptr)<br>
 @ stdcall CryptGetOIDFunctionValue(long str str wstr ptr ptr ptr)<br>
 @ stdcall CryptHashCertificate(long long long ptr long ptr ptr)<br>
+@ stdcall CryptHashCertificate2(wstr long ptr ptr long ptr ptr)<br>
 @ stdcall CryptHashMessage(ptr long long ptr ptr ptr ptr ptr ptr)<br>
 @ stdcall CryptHashPublicKeyInfo(long long long long ptr ptr ptr)<br>
 @ stdcall CryptHashToBeSigned(ptr long ptr long ptr ptr)<br>
diff --git a/include/wincrypt.h b/include/wincrypt.h<br>
index a1b1305902..cbc76d7f10 100644<br>
--- a/include/wincrypt.h<br>
+++ b/include/wincrypt.h<br>
@@ -4379,6 +4379,10 @@ BOOL WINAPI CryptHashCertificate(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,<br>
  DWORD dwFlags, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,<br>
  DWORD *pcbComputedHash);<br>
<br>
+BOOL WINAPI CryptHashCertificate2(LPCWSTR pwszCNGHashAlgid, DWORD dwFlags,<br>
+ void *pvReserved, const BYTE *pbEncoded, DWORD cbEncoded, BYTE *pbComputedHash,<br>
+ DWORD *pcbComputedHash);<br>
+<br>
 BOOL WINAPI CryptHashPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv, ALG_ID Algid,<br>
  DWORD dwFlags, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo,<br>
  BYTE *pbComputedHash, DWORD *pcbComputedHash);<br>
-- <br>
2.19.1<br>
<br>
<br>
<br>
</blockquote></div></div>