Juan Lang : crypt32: Implement CryptHashToBeSigned.
Alexandre Julliard
julliard at winehq.org
Tue Aug 19 08:46:24 CDT 2008
Module: wine
Branch: master
Commit: d8da3e83ff5bcb0e406c508de58cd081a7434bad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d8da3e83ff5bcb0e406c508de58cd081a7434bad
Author: Juan Lang <juan.lang at gmail.com>
Date: Fri Aug 8 10:25:43 2008 -0700
crypt32: Implement CryptHashToBeSigned.
---
dlls/crypt32/cert.c | 40 ++++++++++++++++++++++++++++++++++++++--
dlls/crypt32/tests/cert.c | 5 -----
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index 0dc10c0..7eedd52 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -1534,9 +1534,45 @@ BOOL WINAPI CryptHashToBeSigned(HCRYPTPROV_LEGACY hCryptProv,
DWORD dwCertEncodingType, const BYTE *pbEncoded, DWORD cbEncoded,
BYTE *pbComputedHash, DWORD *pcbComputedHash)
{
- FIXME("(%08lx, %08x, %p, %d, %p, %d): stub\n", hCryptProv, dwCertEncodingType,
+ BOOL ret;
+ CERT_SIGNED_CONTENT_INFO *info;
+ DWORD size;
+
+ TRACE("(%08lx, %08x, %p, %d, %p, %d)\n", hCryptProv, dwCertEncodingType,
pbEncoded, cbEncoded, pbComputedHash, *pcbComputedHash);
- return FALSE;
+
+ ret = CryptDecodeObjectEx(dwCertEncodingType, X509_CERT,
+ pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, (void *)&info, &size);
+ if (ret)
+ {
+ PCCRYPT_OID_INFO oidInfo;
+ HCRYPTHASH hHash;
+
+ if (!hCryptProv)
+ hCryptProv = CRYPT_GetDefaultProvider();
+ oidInfo = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
+ info->SignatureAlgorithm.pszObjId, 0);
+ if (!oidInfo)
+ {
+ SetLastError(NTE_BAD_ALGID);
+ ret = FALSE;
+ }
+ else
+ {
+ ret = CryptCreateHash(hCryptProv, oidInfo->u.Algid, 0, 0, &hHash);
+ if (ret)
+ {
+ ret = CryptHashData(hHash, info->ToBeSigned.pbData,
+ info->ToBeSigned.cbData, 0);
+ if (ret)
+ ret = CryptGetHashParam(hHash, HP_HASHVAL, pbComputedHash,
+ pcbComputedHash, 0);
+ CryptDestroyHash(hHash);
+ }
+ }
+ LocalFree(info);
+ }
+ return ret;
}
BOOL WINAPI CryptSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProv,
diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c
index ce3bf88..118b6b0 100644
--- a/dlls/crypt32/tests/cert.c
+++ b/dlls/crypt32/tests/cert.c
@@ -2575,33 +2575,28 @@ static void testHashToBeSigned(void)
"expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError());
SetLastError(0xdeadbeef);
ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, NULL, 0, NULL, &size);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD,
"expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError());
/* Can't sign anything: has to be asn.1 encoded, at least */
SetLastError(0xdeadbeef);
ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, int1, sizeof(int1),
NULL, &size);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG,
"expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError());
/* Can't be empty, either */
SetLastError(0xdeadbeef);
ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, emptyCert,
sizeof(emptyCert), NULL, &size);
- todo_wine
ok(!ret && GetLastError() == CRYPT_E_ASN1_CORRUPT,
"expected CRYPT_E_ASN1_CORRUPT, got %08x\n", GetLastError());
/* Signing a cert works */
ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, md5SignedEmptyCert,
sizeof(md5SignedEmptyCert), NULL, &size);
- todo_wine {
ok(ret, "CryptHashToBeSigned failed: %08x\n", GetLastError());
ok(size == sizeof(md5SignedEmptyCertHash), "unexpected size %d\n", size);
ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, md5SignedEmptyCert,
sizeof(md5SignedEmptyCert), hash, &size);
ok(!memcmp(hash, md5SignedEmptyCertHash, size), "unexpected value\n");
- }
}
static void testCompareCert(void)
More information about the wine-cvs
mailing list