From c6ec755469a0c67307d590cb74e8e4985b0af439 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 6 Nov 2008 13:48:54 -0800 Subject: [PATCH] crypt32: Implement CryptFormatObject for szOID_BASIC_CONSTRAINTS2. --- dlls/crypt32/crypt32_En.rc | 5 +++ dlls/crypt32/cryptres.h | 5 +++ dlls/crypt32/object.c | 108 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/dlls/crypt32/crypt32_En.rc b/dlls/crypt32/crypt32_En.rc index 7b0c38e1d8e..7a433be0121 100644 --- a/dlls/crypt32/crypt32_En.rc +++ b/dlls/crypt32/crypt32_En.rc @@ -187,4 +187,9 @@ STRINGTABLE DISCARDABLE IDS_ALT_NAME_MASK "Mask=" IDS_ALT_NAME_REGISTERED_ID "Registered ID=" IDS_USAGE_UNKNOWN "Unknown Key Usage" + IDS_SUBJECT_TYPE "Subject Type=" + IDS_SUBJECT_TYPE_CA "CA" + IDS_SUBJECT_TYPE_END_CERT "End Entity" + IDS_PATH_LENGTH "Path Length Constraint=" + IDS_PATH_LENGTH_NONE "None" } diff --git a/dlls/crypt32/cryptres.h b/dlls/crypt32/cryptres.h index 975e88c5295..ac7c65c2518 100644 --- a/dlls/crypt32/cryptres.h +++ b/dlls/crypt32/cryptres.h @@ -177,5 +177,10 @@ #define IDS_ALT_NAME_MASK 1209 #define IDS_ALT_NAME_REGISTERED_ID 1210 #define IDS_USAGE_UNKNOWN 1211 +#define IDS_SUBJECT_TYPE 1212 +#define IDS_SUBJECT_TYPE_CA 1213 +#define IDS_SUBJECT_TYPE_END_CERT 1214 +#define IDS_PATH_LENGTH 1215 +#define IDS_PATH_LENGTH_NONE 1216 #endif /* ndef __WINE_CRYPTRES_H__ */ diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c index cdbe8db9412..783dbce9baa 100644 --- a/dlls/crypt32/object.c +++ b/dlls/crypt32/object.c @@ -603,6 +603,105 @@ static BOOL WINAPI CRYPT_FormatHexString(DWORD dwCertEncodingType, #define MAX_STRING_RESOURCE_LEN 128 +static const WCHAR crlf[] = { '\r','\n',0 }; +static const WCHAR commaSpace[] = { ',',' ',0 }; + +static WCHAR subjectTypeHeader[MAX_STRING_RESOURCE_LEN]; +static WCHAR subjectTypeCA[MAX_STRING_RESOURCE_LEN]; +static WCHAR subjectTypeEndCert[MAX_STRING_RESOURCE_LEN]; +static WCHAR pathLengthHeader[MAX_STRING_RESOURCE_LEN]; + +static BOOL WINAPI CRYPT_FormatBasicConstraints2(DWORD dwCertEncodingType, + DWORD dwFormatType, DWORD dwFormatStrType, void *pFormatStruct, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, void *pbFormat, + DWORD *pcbFormat) +{ + DWORD size; + CERT_BASIC_CONSTRAINTS2_INFO *info; + BOOL ret; + + if (!cbEncoded) + { + SetLastError(E_INVALIDARG); + return FALSE; + } + if ((ret = CryptDecodeObjectEx(dwCertEncodingType, X509_BASIC_CONSTRAINTS2, + pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size))) + { + static const WCHAR pathFmt[] = { '%','d',0 }; + static BOOL stringsLoaded = FALSE; + DWORD bytesNeeded = sizeof(WCHAR); /* space for the NULL terminator */ + WCHAR pathLength[MAX_STRING_RESOURCE_LEN]; + LPCWSTR sep, subjectType; + DWORD sepLen; + + if (dwFormatStrType & CRYPT_FORMAT_STR_MULTI_LINE) + { + sep = crlf; + sepLen = strlenW(crlf) * sizeof(WCHAR); + } + else + { + sep = commaSpace; + sepLen = strlenW(commaSpace) * sizeof(WCHAR); + } + + if (!stringsLoaded) + { + LoadStringW(hInstance, IDS_SUBJECT_TYPE, subjectTypeHeader, + sizeof(subjectTypeHeader) / sizeof(subjectTypeHeader[0])); + LoadStringW(hInstance, IDS_SUBJECT_TYPE_CA, subjectTypeCA, + sizeof(subjectTypeCA) / sizeof(subjectTypeCA[0])); + LoadStringW(hInstance, IDS_SUBJECT_TYPE_END_CERT, + subjectTypeEndCert, + sizeof(subjectTypeEndCert) / sizeof(subjectTypeEndCert[0])); + LoadStringW(hInstance, IDS_PATH_LENGTH, pathLengthHeader, + sizeof(pathLengthHeader) / sizeof(pathLengthHeader[0])); + stringsLoaded = TRUE; + } + bytesNeeded += strlenW(subjectTypeHeader) * sizeof(WCHAR); + if (info->fCA) + subjectType = subjectTypeCA; + else + subjectType = subjectTypeEndCert; + bytesNeeded += strlenW(subjectType) * sizeof(WCHAR); + bytesNeeded += sepLen; + bytesNeeded += strlenW(pathLengthHeader) * sizeof(WCHAR); + if (info->fPathLenConstraint) + sprintfW(pathLength, pathFmt, info->dwPathLenConstraint); + else + LoadStringW(hInstance, IDS_PATH_LENGTH_NONE, pathLength, + sizeof(pathLength) / sizeof(pathLength[0])); + bytesNeeded += strlenW(pathLength) * 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, subjectTypeHeader); + str += strlenW(subjectTypeHeader); + strcpyW(str, subjectType); + str += strlenW(subjectType); + strcpyW(str, sep); + str += sepLen / sizeof(WCHAR); + strcpyW(str, pathLengthHeader); + str += strlenW(pathLengthHeader); + strcpyW(str, pathLength); + str += strlenW(pathLength); + } + LocalFree(info); + } + return ret; +} + static BOOL CRYPT_FormatHexStringWithPrefix(CRYPT_DATA_BLOB *blob, int id, LPWSTR str, DWORD *pcbStr) { @@ -650,8 +749,6 @@ static BOOL CRYPT_FormatCertSerialNumber(CRYPT_DATA_BLOB *serialNum, LPWSTR str, str, pcbStr); } -static const WCHAR crlf[] = { '\r','\n',0 }; - static BOOL CRYPT_FormatAltNameEntry(DWORD dwFormatStrType, CERT_ALT_NAME_ENTRY *entry, LPWSTR str, DWORD *pcbStr) { @@ -783,8 +880,6 @@ static BOOL CRYPT_FormatAltNameEntry(DWORD dwFormatStrType, return ret; } -static const WCHAR commaSpace[] = { ',',' ',0 }; - static BOOL CRYPT_FormatAltNameInfo(DWORD dwFormatStrType, CERT_ALT_NAME_INFO *name, LPWSTR str, DWORD *pcbStr) { @@ -1120,6 +1215,9 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType, { switch (LOWORD(lpszStructType)) { + case LOWORD(X509_BASIC_CONSTRAINTS2): + format = CRYPT_FormatBasicConstraints2; + break; case LOWORD(X509_AUTHORITY_KEY_ID2): format = CRYPT_FormatAuthorityKeyId2; break; @@ -1128,6 +1226,8 @@ static CryptFormatObjectFunc CRYPT_GetBuiltinFormatFunction(DWORD encodingType, break; } } + else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS2)) + format = CRYPT_FormatBasicConstraints2; else if (!strcmp(lpszStructType, szOID_AUTHORITY_KEY_IDENTIFIER2)) format = CRYPT_FormatAuthorityKeyId2; else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE)) -- 2.11.4.GIT