Juan Lang : crypt32: Implement CryptFormatObject for SPC_FINANCIAL_CRITERIA_OBJID.
Alexandre Julliard
julliard at winehq.org
Fri Nov 7 07:23:56 CST 2008
Module: wine
Branch: master
Commit: 305c96527680e79ac5841c39e232ab1b388500d3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=305c96527680e79ac5841c39e232ab1b388500d3
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Nov 6 14:42:58 2008 -0800
crypt32: Implement CryptFormatObject for SPC_FINANCIAL_CRITERIA_OBJID.
---
dlls/crypt32/crypt32_En.rc | 6 ++
dlls/crypt32/cryptres.h | 6 ++
dlls/crypt32/object.c | 111 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 123 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/crypt32_En.rc b/dlls/crypt32/crypt32_En.rc
index ceb0703..3e08476 100644
--- a/dlls/crypt32/crypt32_En.rc
+++ b/dlls/crypt32/crypt32_En.rc
@@ -211,4 +211,10 @@ STRINGTABLE DISCARDABLE
IDS_REASON_SUPERCEDED "Superceded"
IDS_REASON_CESSATION_OF_OPERATION "Operation Ceased"
IDS_REASON_CERTIFICATE_HOLD "Certificate Hold"
+ IDS_FINANCIAL_CRITERIA "Financial Information="
+ IDS_FINANCIAL_CRITERIA_AVAILABLE "Available"
+ IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Not Available"
+ IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Meets Criteria="
+ IDS_YES "Yes"
+ IDS_NO "No"
}
diff --git a/dlls/crypt32/cryptres.h b/dlls/crypt32/cryptres.h
index 0ac839f..894b3bd 100644
--- a/dlls/crypt32/cryptres.h
+++ b/dlls/crypt32/cryptres.h
@@ -201,5 +201,11 @@
#define IDS_REASON_SUPERCEDED 1234
#define IDS_REASON_CESSATION_OF_OPERATION 1235
#define IDS_REASON_CERTIFICATE_HOLD 1236
+#define IDS_FINANCIAL_CRITERIA 1237
+#define IDS_FINANCIAL_CRITERIA_AVAILABLE 1238
+#define IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE 1239
+#define IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA 1240
+#define IDS_YES 1241
+#define IDS_NO 1242
#endif /* ndef __WINE_CRYPTRES_H__ */
diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index 87b5a20..19a3217 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -24,6 +24,7 @@
#include "wincrypt.h"
#include "mssip.h"
#include "winuser.h"
+#include "wintrust.h"
#include "crypt32_private.h"
#include "cryptres.h"
#include "wine/unicode.h"
@@ -1768,6 +1769,111 @@ static BOOL WINAPI CRYPT_FormatEnhancedKeyUsage(DWORD dwCertEncodingType,
return ret;
}
+static WCHAR financialCriteria[MAX_STRING_RESOURCE_LEN];
+static WCHAR available[MAX_STRING_RESOURCE_LEN];
+static WCHAR notAvailable[MAX_STRING_RESOURCE_LEN];
+static WCHAR meetsCriteria[MAX_STRING_RESOURCE_LEN];
+static WCHAR yes[MAX_STRING_RESOURCE_LEN];
+static WCHAR no[MAX_STRING_RESOURCE_LEN];
+
+static BOOL WINAPI CRYPT_FormatSpcFinancialCriteria(DWORD dwCertEncodingType,
+ DWORD dwFormatType, DWORD dwFormatStrType, void *pFormatStruct,
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, void *pbFormat,
+ DWORD *pcbFormat)
+{
+ SPC_FINANCIAL_CRITERIA criteria;
+ DWORD size = sizeof(criteria);
+ BOOL ret = FALSE;
+
+ if (!cbEncoded)
+ {
+ SetLastError(E_INVALIDARG);
+ return FALSE;
+ }
+ if ((ret = CryptDecodeObjectEx(dwCertEncodingType,
+ SPC_FINANCIAL_CRITERIA_STRUCT, pbEncoded, cbEncoded, 0, NULL, &criteria,
+ &size)))
+ {
+ static BOOL stringsLoaded = FALSE;
+ DWORD bytesNeeded = sizeof(WCHAR);
+ LPCWSTR sep;
+ DWORD sepLen;
+
+ if (!stringsLoaded)
+ {
+ LoadStringW(hInstance, IDS_FINANCIAL_CRITERIA, financialCriteria,
+ sizeof(financialCriteria) / sizeof(financialCriteria[0]));
+ LoadStringW(hInstance, IDS_FINANCIAL_CRITERIA_AVAILABLE, available,
+ sizeof(available) / sizeof(available[0]));
+ LoadStringW(hInstance, IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE,
+ notAvailable, sizeof(notAvailable) / sizeof(notAvailable[0]));
+ LoadStringW(hInstance, IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA,
+ meetsCriteria, sizeof(meetsCriteria) / sizeof(meetsCriteria[0]));
+ LoadStringW(hInstance, IDS_YES, yes, sizeof(yes) / sizeof(yes[0]));
+ LoadStringW(hInstance, IDS_NO, no, sizeof(no) / sizeof(no[0]));
+ stringsLoaded = TRUE;
+ }
+ if (dwFormatStrType & CRYPT_FORMAT_STR_MULTI_LINE)
+ {
+ sep = crlf;
+ sepLen = strlenW(crlf) * sizeof(WCHAR);
+ }
+ else
+ {
+ sep = commaSpace;
+ sepLen = strlenW(commaSpace) * sizeof(WCHAR);
+ }
+ bytesNeeded += strlenW(financialCriteria) * sizeof(WCHAR);
+ if (criteria.fFinancialInfoAvailable)
+ {
+ bytesNeeded += strlenW(available) * sizeof(WCHAR);
+ bytesNeeded += sepLen;
+ bytesNeeded += strlenW(meetsCriteria) * sizeof(WCHAR);
+ if (criteria.fMeetsCriteria)
+ bytesNeeded += strlenW(yes) * sizeof(WCHAR);
+ else
+ bytesNeeded += strlenW(no) * sizeof(WCHAR);
+ }
+ else
+ bytesNeeded += strlenW(notAvailable) * sizeof(WCHAR);
+ if (!pbFormat)
+ *pcbFormat = bytesNeeded;
+ else if (*pcbFormat < bytesNeeded)
+ {
+ *pcbFormat = bytesNeeded;
+ SetLastError(ERROR_MORE_DATA);
+ ret = FALSE;
+ }
+ else
+ {
+ LPWSTR str = pbFormat;
+
+ *pcbFormat = bytesNeeded;
+ strcpyW(str, financialCriteria);
+ str += strlenW(financialCriteria);
+ if (criteria.fFinancialInfoAvailable)
+ {
+ strcpyW(str, available);
+ str += strlenW(available);
+ strcpyW(str, sep);
+ str += sepLen / sizeof(WCHAR);
+ strcpyW(str, meetsCriteria);
+ str += strlenW(meetsCriteria);
+ if (criteria.fMeetsCriteria)
+ strcpyW(str, yes);
+ else
+ strcpyW(str, no);
+ }
+ else
+ {
+ strcpyW(str, notAvailable);
+ str += strlenW(notAvailable);
+ }
+ }
+ }
+ return ret;
+}
+
typedef BOOL (WINAPI *CryptFormatObjectFunc)(DWORD, DWORD, DWORD, void *,
LPCSTR, const BYTE *, DWORD, void *, DWORD *);
@@ -1800,6 +1906,9 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType,
case LOWORD(X509_ENHANCED_KEY_USAGE):
format = CRYPT_FormatEnhancedKeyUsage;
break;
+ case LOWORD(SPC_FINANCIAL_CRITERIA_STRUCT):
+ format = CRYPT_FormatSpcFinancialCriteria;
+ break;
}
}
else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS2))
@@ -1812,6 +1921,8 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType,
format = CRYPT_FormatCRLDistPoints;
else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE))
format = CRYPT_FormatEnhancedKeyUsage;
+ else if (!strcmp(lpszStructType, SPC_FINANCIAL_CRITERIA_OBJID))
+ format = CRYPT_FormatSpcFinancialCriteria;
if (!format && !(formatStrType & CRYPT_FORMAT_STR_NO_HEX))
format = CRYPT_FormatHexString;
return format;
More information about the wine-cvs
mailing list