Jacek Caban : crypt32: Added support for szOID_NIST_sha* OIDs.

Alexandre Julliard julliard at winehq.org
Tue Jan 30 14:38:13 CST 2018


Module: wine
Branch: master
Commit: 86c998e551f25cbd0c04379ce17d4f3ec1161fac
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=86c998e551f25cbd0c04379ce17d4f3ec1161fac

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jan 29 19:51:21 2018 +0100

crypt32: Added support for szOID_NIST_sha* OIDs.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/crypt32/oid.c       |  7 +++++++
 dlls/crypt32/tests/oid.c | 25 ++++++++++++++++++++-----
 include/wincrypt.h       |  3 +++
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/dlls/crypt32/oid.c b/dlls/crypt32/oid.c
index d5c2953..5a447d0 100644
--- a/dlls/crypt32/oid.c
+++ b/dlls/crypt32/oid.c
@@ -1053,6 +1053,9 @@ static const WCHAR rc2[] = { 'r','c','2',0 };
 static const WCHAR rc4[] = { 'r','c','4',0 };
 static const WCHAR sha[] = { 's','h','a',0 };
 static const WCHAR sha1[] = { 's','h','a','1',0 };
+static const WCHAR sha256[] = { 's','h','a','2','5','6',0 };
+static const WCHAR sha384[] = { 's','h','a','3','8','4',0 };
+static const WCHAR sha512[] = { 's','h','a','5','1','2',0 };
 static const WCHAR RSA[] = { 'R','S','A',0 };
 static const WCHAR RSA_KEYX[] = { 'R','S','A','_','K','E','Y','X',0 };
 static const WCHAR RSA_SIGN[] = { 'R','S','A','_','S','I','G','N',0 };
@@ -1157,6 +1160,10 @@ static const struct OIDInfoConstructor {
  { 1, szOID_RSA_MD5,                   CALG_MD5,      md5, NULL },
  { 1, szOID_RSA_MD4,                   CALG_MD4,      md4, NULL },
  { 1, szOID_RSA_MD2,                   CALG_MD2,      md2, NULL },
+ /* NOTE: Windows Vista+ uses -1 instead of CALG_SHA_* following SHA entries. */
+ { 1, szOID_NIST_sha256,               CALG_SHA_256,  sha256, NULL },
+ { 1, szOID_NIST_sha384,               CALG_SHA_384,  sha384, NULL },
+ { 1, szOID_NIST_sha512,               CALG_SHA_512,  sha512, NULL },
 
  { 2, szOID_OIWSEC_desCBC,             CALG_DES,      des, NULL },
  { 2, szOID_RSA_DES_EDE3_CBC,          CALG_3DES,     tripledes, NULL },
diff --git a/dlls/crypt32/tests/oid.c b/dlls/crypt32/tests/oid.c
index b661407..8fc67b3 100644
--- a/dlls/crypt32/tests/oid.c
+++ b/dlls/crypt32/tests/oid.c
@@ -36,6 +36,7 @@ struct OIDToAlgID
     LPCSTR oid;
     LPCSTR altOid;
     DWORD algID;
+    DWORD altAlgID;
 };
 
 static const struct OIDToAlgID oidToAlgID[] = {
@@ -72,6 +73,9 @@ static const struct OIDToAlgID oidToAlgID[] = {
  { szOID_OIWDIR_md2RSA, NULL, CALG_MD2 },
  { szOID_INFOSEC_mosaicUpdatedSig, NULL, CALG_SHA },
  { szOID_INFOSEC_mosaicKMandUpdSig, NULL, CALG_DSS_SIGN },
+ { szOID_NIST_sha256, NULL, CALG_SHA_256, -1 },
+ { szOID_NIST_sha384, NULL, CALG_SHA_384, -1 },
+ { szOID_NIST_sha512, NULL, CALG_SHA_512, -1 }
 };
 
 static const struct OIDToAlgID algIDToOID[] = {
@@ -104,10 +108,7 @@ static void testOIDToAlgID(void)
     for (i = 0; i < sizeof(oidToAlgID) / sizeof(oidToAlgID[0]); i++)
     {
         alg = CertOIDToAlgId(oidToAlgID[i].oid);
-        /* Not all Windows installations support all these, so make sure it's
-         * at least not the wrong one.
-         */
-        ok(alg == 0 || alg == oidToAlgID[i].algID,
+        ok(alg == oidToAlgID[i].algID || (oidToAlgID[i].altAlgID && alg == oidToAlgID[i].altAlgID),
          "Expected %d, got %d\n", oidToAlgID[i].algID, alg);
     }
 }
@@ -126,6 +127,7 @@ static void testAlgIDToOID(void)
     {
         oid = CertAlgIdToOID(algIDToOID[i].algID);
         /* Allow failure, not every version of Windows supports every algo */
+        ok(oid != NULL || broken(!oid), "CertAlgIdToOID failed, expected %s\n", algIDToOID[i].oid);
         if (oid)
         {
             if (strcmp(oid, algIDToOID[i].oid))
@@ -542,11 +544,13 @@ static void test_enumOIDInfo(void)
 static void test_findOIDInfo(void)
 {
     static WCHAR sha1[] = { 's','h','a','1',0 };
-    static CHAR oid_rsa_md5[] = szOID_RSA_MD5;
+    static CHAR oid_rsa_md5[] = szOID_RSA_MD5, oid_sha256[] = szOID_NIST_sha256;
     ALG_ID alg = CALG_SHA1;
     ALG_ID algs[2] = { CALG_MD5, CALG_RSA_SIGN };
     PCCRYPT_OID_INFO info;
 
+    static const WCHAR sha256W[] = {'s','h','a','2','5','6',0};
+
     info = CryptFindOIDInfo(0, NULL, 0);
     ok(info == NULL, "Expected NULL\n");
     info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_rsa_md5, 0);
@@ -585,6 +589,17 @@ static void test_findOIDInfo(void)
         ok(U(*info).Algid == CALG_MD5, "Expected CALG_MD5, got %d\n",
            U(*info).Algid);
     }
+
+    info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_sha256, 0);
+    ok(info != NULL, "Expected to find szOID_RSA_MD5\n");
+    if (info)
+    {
+        ok(!strcmp(info->pszOID, szOID_NIST_sha256), "Expected %s, got %s\n",
+         szOID_NIST_sha256, info->pszOID);
+        ok(!lstrcmpW(info->pwszName, sha256W), "pwszName = %s\n", wine_dbgstr_w(info->pwszName));
+        ok(U(*info).Algid == CALG_SHA_256 || U(*info).Algid == -1,
+           "Expected CALG_MD5 or -1, got %d\n", U(*info).Algid);
+    }
 }
 
 START_TEST(oid)
diff --git a/include/wincrypt.h b/include/wincrypt.h
index 6986bd8..d688567 100644
--- a/include/wincrypt.h
+++ b/include/wincrypt.h
@@ -2941,6 +2941,9 @@ typedef struct _CTL_FIND_SUBJECT_PARA
 #define szOID_INFOSEC_mosaicUpdatedSig      "2.16.840.1.101.2.1.1.19"
 #define szOID_INFOSEC_mosaicKMandUpdSig     "2.16.840.1.101.2.1.1.20"
 #define szOID_INFOSEC_mosaicUpdateInteg     "2.16.840.1.101.2.1.1.21"
+#define szOID_NIST_sha256                   "2.16.840.1.101.3.4.2.1"
+#define szOID_NIST_sha384                   "2.16.840.1.101.3.4.2.2"
+#define szOID_NIST_sha512                   "2.16.840.1.101.3.4.2.3"
 #define szOID_COMMON_NAME                   "2.5.4.3"
 #define szOID_SUR_NAME                      "2.5.4.4"
 #define szOID_DEVICE_SERIAL_NUMBER          "2.5.4.5"




More information about the wine-cvs mailing list