Juan Lang : crypt32: Vista doesn't actually add duplicate usage identifiers ; fix tests and change Wine to match.

Alexandre Julliard julliard at winehq.org
Sat Feb 16 09:57:23 CST 2008


Module: wine
Branch: master
Commit: b04c4aa6ff7606895a11dbab043a83bad2c3b916
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b04c4aa6ff7606895a11dbab043a83bad2c3b916

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Feb 14 10:54:51 2008 -0800

crypt32: Vista doesn't actually add duplicate usage identifiers; fix tests and change Wine to match.

---

 dlls/crypt32/cert.c       |   48 +++++++++++++++++++++++++++++---------------
 dlls/crypt32/tests/cert.c |    8 ++++--
 2 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index d747574..84780cb 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -1902,29 +1902,43 @@ BOOL WINAPI CertAddEnhancedKeyUsageIdentifier(PCCERT_CONTEXT pCertContext,
              CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG, usage, &size);
             if (ret)
             {
-                PCERT_ENHKEY_USAGE newUsage = CryptMemAlloc(size +
-                 sizeof(LPSTR) + strlen(pszUsageIdentifier) + 1);
+                DWORD i;
+                BOOL exists = FALSE;
 
-                if (newUsage)
+                /* Make sure usage doesn't already exist */
+                for (i = 0; !exists && i < usage->cUsageIdentifier; i++)
                 {
-                    LPSTR nextOID;
-                    DWORD i;
+                    if (!strcmp(usage->rgpszUsageIdentifier[i],
+                     pszUsageIdentifier))
+                        exists = TRUE;
+                }
+                if (!exists)
+                {
+                    PCERT_ENHKEY_USAGE newUsage = CryptMemAlloc(size +
+                     sizeof(LPSTR) + strlen(pszUsageIdentifier) + 1);
 
-                    newUsage->rgpszUsageIdentifier =
-                     (LPSTR *)((LPBYTE)newUsage + sizeof(CERT_ENHKEY_USAGE));
-                    nextOID = (LPSTR)((LPBYTE)newUsage->rgpszUsageIdentifier +
-                     (usage->cUsageIdentifier + 1) * sizeof(LPSTR));
-                    for (i = 0; i < usage->cUsageIdentifier; i++)
+                    if (newUsage)
                     {
+                        LPSTR nextOID;
+
+                        newUsage->rgpszUsageIdentifier = (LPSTR *)
+                         ((LPBYTE)newUsage + sizeof(CERT_ENHKEY_USAGE));
+                        nextOID = (LPSTR)((LPBYTE)newUsage->rgpszUsageIdentifier
+                          + (usage->cUsageIdentifier + 1) * sizeof(LPSTR));
+                        for (i = 0; i < usage->cUsageIdentifier; i++)
+                        {
+                            newUsage->rgpszUsageIdentifier[i] = nextOID;
+                            strcpy(nextOID, usage->rgpszUsageIdentifier[i]);
+                            nextOID += strlen(nextOID) + 1;
+                        }
                         newUsage->rgpszUsageIdentifier[i] = nextOID;
-                        strcpy(nextOID, usage->rgpszUsageIdentifier[i]);
-                        nextOID += strlen(nextOID) + 1;
+                        strcpy(nextOID, pszUsageIdentifier);
+                        newUsage->cUsageIdentifier = i + 1;
+                        ret = CertSetEnhancedKeyUsage(pCertContext, newUsage);
+                        CryptMemFree(newUsage);
                     }
-                    newUsage->rgpszUsageIdentifier[i] = nextOID;
-                    strcpy(nextOID, pszUsageIdentifier);
-                    newUsage->cUsageIdentifier = i + 1;
-                    ret = CertSetEnhancedKeyUsage(pCertContext, newUsage);
-                    CryptMemFree(newUsage);
+                    else
+                        ret = FALSE;
                 }
             }
             CryptMemFree(usage);
diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c
index 37a709b..0ab9334 100644
--- a/dlls/crypt32/tests/cert.c
+++ b/dlls/crypt32/tests/cert.c
@@ -2053,7 +2053,9 @@ static void testKeyUsage(void)
         if (pUsage->cUsageIdentifier)
             ok(!strcmp(pUsage->rgpszUsageIdentifier[0], oid),
              "Expected %s, got %s\n", oid, pUsage->rgpszUsageIdentifier[0]);
-        /* Yep, I can re-add the same usage identifier */
+        /* Re-adding the same usage identifier succeeds, though it only adds
+         * a duplicate usage identifier on versions prior to Vista
+         */
         ret = CertAddEnhancedKeyUsageIdentifier(context, oid);
         ok(ret, "CertAddEnhancedKeyUsageIdentifier failed: %08x\n",
          GetLastError());
@@ -2061,8 +2063,8 @@ static void testKeyUsage(void)
         ret = CertGetEnhancedKeyUsage(context, 0, pUsage, &size);
         ok(ret && GetLastError() == 0,
          "CertGetEnhancedKeyUsage failed: %08x\n", GetLastError());
-        ok(pUsage->cUsageIdentifier == 2, "Expected 2 identifiers, got %d\n",
-         pUsage->cUsageIdentifier);
+        ok(pUsage->cUsageIdentifier == 1 || pUsage->cUsageIdentifier == 2,
+         "Expected 1 or 2 identifiers, got %d\n", pUsage->cUsageIdentifier);
         if (pUsage->cUsageIdentifier)
             ok(!strcmp(pUsage->rgpszUsageIdentifier[0], oid),
              "Expected %s, got %s\n", oid, pUsage->rgpszUsageIdentifier[0]);




More information about the wine-cvs mailing list