| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| /* vim: set ts=2 et sw=2 tw=80: */ |
| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
| * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #include <stdint.h> |
| |
| #include "gtest/gtest.h" |
| |
| #include "nss.h" |
| #include "nss_scoped_ptrs.h" |
| #include "prprf.h" |
| |
| namespace nss_test { |
| |
| typedef struct AVATestValuesStr { |
| std::string avaString; |
| bool expectedResult; |
| } AVATestValues; |
| |
| typedef struct AVACompareValuesStr { |
| std::string avaString1; |
| std::string avaString2; |
| SECComparison expectedResult; |
| } AVACompareValues; |
| |
| class Alg1485Test : public ::testing::Test {}; |
| |
| class Alg1485ParseTest : public Alg1485Test, |
| public ::testing::WithParamInterface<AVATestValues> {}; |
| |
| class Alg1485CompareTest |
| : public Alg1485Test, |
| public ::testing::WithParamInterface<AVACompareValues> {}; |
| |
| static const AVATestValues kAVATestStrings[] = { |
| {"CN=Marshall T. Rose, O=Dover Beach Consulting, L=Santa Clara, " |
| "ST=California, C=US", |
| true}, |
| {"C=HU,L=Budapest,O=Organization,CN=Example - Qualified Citizen " |
| "CA,2.5.4.97=VATHU-10", |
| true}, |
| {"C=HU,L=Budapest,O=Example,CN=Example - Qualified Citizen " |
| "CA,OID.2.5.4.97=VATHU-10", |
| true}, |
| {"CN=Somebody,L=Set,O=Up,C=US,1=The,2=Bomb", true}, |
| {"OID.2.5.4.6=😑", true}, |
| {"2.5.4.6=😑", true}, |
| {"OID.moocow=😑", false}, // OIDs must be numeric |
| {"3.2=bad", false}, // OIDs cannot be overly large; 3 is too big |
| {"256.257=bad", false}, // Still too big |
| {"YO=LO", false}, // Unknown Tag, 'YO' |
| {"CN=Tester,ZZ=Top", false}, // Unknown tag, 'ZZ' |
| // These tests are disabled pending Bug 1363416 |
| // { "01.02.03=Nope", false }, // Numbers not in minimal form |
| // { "000001.0000000001=👌", false }, |
| // { "CN=Somebody,L=Set,O=Up,C=US,01=The,02=Bomb", false }, |
| }; |
| |
| static const AVACompareValues kAVACompareStrings[] = { |
| {"CN=Max, O=Mozilla, ST=Berlin", "CN=Max, O=Mozilla, ST=Berlin, C=DE", |
| SECLessThan}, |
| {"CN=Max, O=Mozilla, ST=Berlin, C=DE", "CN=Max, O=Mozilla, ST=Berlin", |
| SECGreaterThan}, |
| {"CN=Max, O=Mozilla, ST=Berlin, C=DE", "CN=Max, O=Mozilla, ST=Berlin, C=DE", |
| SECEqual}, |
| {"CN=Max1, O=Mozilla, ST=Berlin, C=DE", |
| "CN=Max2, O=Mozilla, ST=Berlin, C=DE", SECLessThan}, |
| {"CN=Max, O=Mozilla, ST=Berlin, C=DE", "CN=Max, O=Mozilla, ST=Berlin, C=US", |
| SECLessThan}, |
| }; |
| |
| TEST_P(Alg1485ParseTest, TryParsingAVAStrings) { |
| const AVATestValues& param(GetParam()); |
| |
| ScopedCERTName certName(CERT_AsciiToName(param.avaString.c_str())); |
| ASSERT_EQ(certName != nullptr, param.expectedResult); |
| } |
| |
| TEST_P(Alg1485CompareTest, CompareAVAStrings) { |
| const AVACompareValues& param(GetParam()); |
| ScopedCERTName a(CERT_AsciiToName(param.avaString1.c_str())); |
| ScopedCERTName b(CERT_AsciiToName(param.avaString2.c_str())); |
| ASSERT_TRUE(a && b); |
| EXPECT_EQ(param.expectedResult, CERT_CompareName(a.get(), b.get())); |
| } |
| |
| INSTANTIATE_TEST_CASE_P(ParseAVAStrings, Alg1485ParseTest, |
| ::testing::ValuesIn(kAVATestStrings)); |
| INSTANTIATE_TEST_CASE_P(CompareAVAStrings, Alg1485CompareTest, |
| ::testing::ValuesIn(kAVACompareStrings)); |
| |
| TEST_F(Alg1485Test, ShortOIDTest) { |
| // This is not a valid OID (too short). CERT_GetOidString should return 0. |
| unsigned char data[] = {0x05}; |
| const SECItem oid = {siBuffer, data, sizeof(data)}; |
| char* result = CERT_GetOidString(&oid); |
| EXPECT_EQ(result, nullptr); |
| } |
| |
| TEST_F(Alg1485Test, BrokenOIDTest) { |
| // This is not a valid OID (first bit of last byte is not set). |
| // CERT_GetOidString should return 0. |
| unsigned char data[] = {0x81, 0x82, 0x83, 0x84}; |
| const SECItem oid = {siBuffer, data, sizeof(data)}; |
| char* result = CERT_GetOidString(&oid); |
| EXPECT_EQ(15U, strlen(result)); |
| EXPECT_EQ(0, strncmp("OID.UNSUPPORTED", result, 15)); |
| PR_smprintf_free(result); |
| } |
| } |