Module: wine Branch: master Commit: 86c998e551f25cbd0c04379ce17d4f3ec1161fac URL: https://source.winehq.org/git/wine.git/?a=commit;h=86c998e551f25cbd0c04379ce...
Author: Jacek Caban jacek@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@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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"