Juan Lang : crypt32: Implement CryptFormatObject for szOID_BASIC_CONSTRAINTS2.

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


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

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

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 7b0c38e..7a433be 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 975e88c..ac7c65c 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 cdbe8db..783dbce 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))




More information about the wine-cvs mailing list