Juan Lang : crypt32: Implement CryptFormatObject for szOID_ENHANCED_KEY_USAGE.

Alexandre Julliard julliard at winehq.org
Fri Nov 7 07:23:55 CST 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Thu Nov  6 13:48:34 2008 -0800

crypt32: Implement CryptFormatObject for szOID_ENHANCED_KEY_USAGE.

---

 dlls/crypt32/crypt32_En.rc |    1 +
 dlls/crypt32/cryptres.h    |    1 +
 dlls/crypt32/object.c      |  106 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/crypt32_En.rc b/dlls/crypt32/crypt32_En.rc
index f791206..7b0c38e 100644
--- a/dlls/crypt32/crypt32_En.rc
+++ b/dlls/crypt32/crypt32_En.rc
@@ -186,4 +186,5 @@ STRINGTABLE DISCARDABLE
     IDS_ALT_NAME_IP_ADDRESS "IP Address="
     IDS_ALT_NAME_MASK "Mask="
     IDS_ALT_NAME_REGISTERED_ID "Registered ID="
+    IDS_USAGE_UNKNOWN "Unknown Key Usage"
 }
diff --git a/dlls/crypt32/cryptres.h b/dlls/crypt32/cryptres.h
index be123bf..975e88c 100644
--- a/dlls/crypt32/cryptres.h
+++ b/dlls/crypt32/cryptres.h
@@ -176,5 +176,6 @@
 #define IDS_ALT_NAME_IP_ADDRESS 1208
 #define IDS_ALT_NAME_MASK 1209
 #define IDS_ALT_NAME_REGISTERED_ID 1210
+#define IDS_USAGE_UNKNOWN 1211
 
 #endif /* ndef __WINE_CRYPTRES_H__ */
diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index 76687a6..cdbe8db 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -1002,6 +1002,107 @@ static BOOL WINAPI CRYPT_FormatAuthorityKeyId2(DWORD dwCertEncodingType,
     return ret;
 }
 
+static BOOL WINAPI CRYPT_FormatEnhancedKeyUsage(DWORD dwCertEncodingType,
+ DWORD dwFormatType, DWORD dwFormatStrType, void *pFormatStruct,
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, void *pbFormat,
+ DWORD *pcbFormat)
+{
+    CERT_ENHKEY_USAGE *usage;
+    DWORD size;
+    BOOL ret = FALSE;
+
+    if (!cbEncoded)
+    {
+        SetLastError(E_INVALIDARG);
+        return FALSE;
+    }
+    if ((ret = CryptDecodeObjectEx(dwCertEncodingType, X509_ENHANCED_KEY_USAGE,
+     pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, &usage, &size)))
+    {
+        WCHAR unknown[MAX_STRING_RESOURCE_LEN];
+        DWORD i;
+        DWORD bytesNeeded = sizeof(WCHAR); /* space for the NULL terminator */
+        LPCWSTR sep;
+        DWORD sepLen;
+
+        if (dwFormatStrType & CRYPT_FORMAT_STR_MULTI_LINE)
+        {
+            sep = crlf;
+            sepLen = strlenW(crlf) * sizeof(WCHAR);
+        }
+        else
+        {
+            sep = commaSpace;
+            sepLen = strlenW(commaSpace) * sizeof(WCHAR);
+        }
+
+        LoadStringW(hInstance, IDS_USAGE_UNKNOWN, unknown,
+         sizeof(unknown) / sizeof(unknown[0]));
+        for (i = 0; i < usage->cUsageIdentifier; i++)
+        {
+            PCCRYPT_OID_INFO info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
+             usage->rgpszUsageIdentifier[i], CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
+
+            if (info)
+                bytesNeeded += strlenW(info->pwszName) * sizeof(WCHAR);
+            else
+                bytesNeeded += strlenW(unknown) * sizeof(WCHAR);
+            bytesNeeded += sizeof(WCHAR); /* space */
+            bytesNeeded += sizeof(WCHAR); /* left paren */
+            bytesNeeded += strlen(usage->rgpszUsageIdentifier[i]) *
+             sizeof(WCHAR);
+            bytesNeeded += sizeof(WCHAR); /* right paren */
+            if (i < usage->cUsageIdentifier - 1)
+                bytesNeeded += sepLen;
+        }
+        if (!pbFormat)
+            *pcbFormat = bytesNeeded;
+        else if (*pcbFormat < bytesNeeded)
+        {
+            *pcbFormat = bytesNeeded;
+            SetLastError(ERROR_MORE_DATA);
+            ret = FALSE;
+        }
+        else
+        {
+            LPWSTR str = pbFormat;
+
+            *pcbFormat = bytesNeeded;
+            for (i = 0; i < usage->cUsageIdentifier; i++)
+            {
+                PCCRYPT_OID_INFO info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
+                 usage->rgpszUsageIdentifier[i],
+                 CRYPT_ENHKEY_USAGE_OID_GROUP_ID);
+                LPCSTR oidPtr;
+
+                if (info)
+                {
+                    strcpyW(str, info->pwszName);
+                    str += strlenW(info->pwszName);
+                }
+                else
+                {
+                    strcpyW(str, unknown);
+                    str += strlenW(unknown);
+                }
+                *str++ = ' ';
+                *str++ = '(';
+                for (oidPtr = usage->rgpszUsageIdentifier[i]; *oidPtr; oidPtr++)
+                    *str++ = *oidPtr;
+                *str++ = ')';
+                *str = 0;
+                if (i < usage->cUsageIdentifier - 1)
+                {
+                    strcpyW(str, sep);
+                    str += sepLen / sizeof(WCHAR);
+                }
+            }
+        }
+        LocalFree(usage);
+    }
+    return ret;
+}
+
 typedef BOOL (WINAPI *CryptFormatObjectFunc)(DWORD, DWORD, DWORD, void *,
  LPCSTR, const BYTE *, DWORD, void *, DWORD *);
 
@@ -1022,10 +1123,15 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType,
         case LOWORD(X509_AUTHORITY_KEY_ID2):
             format = CRYPT_FormatAuthorityKeyId2;
             break;
+        case LOWORD(X509_ENHANCED_KEY_USAGE):
+            format = CRYPT_FormatEnhancedKeyUsage;
+            break;
         }
     }
     else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2))
         format = CRYPT_FormatAuthorityKeyId2;
+    else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE))
+        format = CRYPT_FormatEnhancedKeyUsage;
     if (!format && !(formatStrType & CRYPT_FORMAT_STR_NO_HEX))
         format = CRYPT_FormatHexString;
     return format;




More information about the wine-cvs mailing list