crypt32: Implement CryptGetIntendedKeyUsage.
authorJuan Lang <juan.lang@gmail.com>
Tue, 3 Nov 2009 18:45:51 +0000 (10:45 -0800)
committerAlexander Morozov <amorozov@etersoft.ru>
Thu, 1 Jul 2010 13:18:06 +0000 (17:18 +0400)
dlls/crypt32/cert.c
dlls/crypt32/tests/cert.c

index cb1b9737cc9b7b8f843c250bd78b07fc90e27629..c87b07ce179eb9ca4bef2aeae99e0644fe31a0c0 100644 (file)
@@ -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,
index ea904f6be96567d57982596d8724dff225f88c30..4dc884618c6afd14804e5dccccd4b9fe0ffd453e 100644 (file)
@@ -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,