Module: wine Branch: master Commit: b04c4aa6ff7606895a11dbab043a83bad2c3b916 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b04c4aa6ff7606895a11dbab04...
Author: Juan Lang juan.lang@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]);