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