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