diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index cb1b9737cc9..c87b07ce179 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 ea904f6be96..4dc884618c6 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,