Module: wine Branch: master Commit: f5546692861f7eac76669d4fbd25f4f62684c84c URL: http://source.winehq.org/git/wine.git/?a=commit;h=f5546692861f7eac76669d4fbd...
Author: Juan Lang juan.lang@gmail.com Date: Tue Nov 3 10:45:51 2009 -0800
crypt32: Implement CryptGetIntendedKeyUsage.
---
dlls/crypt32/cert.c | 33 +++++++++++++++++++++++++++++++-- dlls/crypt32/tests/cert.c | 4 ---- 2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index cb1b973..c87b07c 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -2200,9 +2200,38 @@ BOOL WINAPI CryptVerifyCertificateSignatureEx(HCRYPTPROV_LEGACY hCryptProv, BOOL WINAPI CertGetIntendedKeyUsage(DWORD dwCertEncodingType, PCERT_INFO pCertInfo, BYTE *pbKeyUsage, DWORD cbKeyUsage) { - FIXME("(%08x, %p, %p, %d)\n", dwCertEncodingType, pCertInfo, pbKeyUsage, + PCERT_EXTENSION ext; + BOOL ret = FALSE; + + TRACE("(%08x, %p, %p, %d)\n", dwCertEncodingType, pCertInfo, pbKeyUsage, cbKeyUsage); - return FALSE; + + ext = CertFindExtension(szOID_KEY_USAGE, pCertInfo->cExtension, + pCertInfo->rgExtension); + if (ext) + { + CRYPT_BIT_BLOB usage; + DWORD size = sizeof(usage); + + ret = CryptDecodeObjectEx(dwCertEncodingType, X509_BITS, + ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_NOCOPY_FLAG, NULL, + &usage, &size); + if (ret) + { + if (cbKeyUsage < usage.cbData) + ret = FALSE; + else + { + memcpy(pbKeyUsage, usage.pbData, usage.cbData); + if (cbKeyUsage > usage.cbData) + memset(pbKeyUsage + usage.cbData, 0, + cbKeyUsage - usage.cbData); + } + } + } + else + SetLastError(0); + return ret; }
BOOL WINAPI CertGetEnhancedKeyUsage(PCCERT_CONTEXT pCertContext, DWORD dwFlags, diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c index ea904f6..4dc8846 100644 --- a/dlls/crypt32/tests/cert.c +++ b/dlls/crypt32/tests/cert.c @@ -2100,21 +2100,17 @@ static void testIntendedKeyUsage(void) /* The unused bytes are filled with 0. */ ret = CertGetIntendedKeyUsage(X509_ASN_ENCODING, &info, usage_bytes, sizeof(usage_bytes)); - todo_wine { ok(ret, "CertGetIntendedKeyUsage failed: %08x\n", GetLastError()); ok(!memcmp(usage_bytes, expected_usage1, sizeof(expected_usage1)), "unexpected value\n"); - } /* The usage bytes are copied in big-endian order. */ ext.Value.cbData = sizeof(usage2); ext.Value.pbData = usage2; ret = CertGetIntendedKeyUsage(X509_ASN_ENCODING, &info, usage_bytes, sizeof(usage_bytes)); - todo_wine { ok(ret, "CertGetIntendedKeyUsage failed: %08x\n", GetLastError()); ok(!memcmp(usage_bytes, expected_usage2, sizeof(expected_usage2)), "unexpected value\n"); - } }
static const LPCSTR keyUsages[] = { szOID_PKIX_KP_CODE_SIGNING,