tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_crl.c (8180B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 /*
      5 * test_crl.c
      6 *
      7 * Test CRL Type
      8 *
      9 */
     10 
     11 #include "testutil.h"
     12 #include "testutil_nss.h"
     13 
     14 static void *plContext = NULL;
     15 
     16 static void
     17 createCRLs(
     18    char *dataDir,
     19    char *goodInput,
     20    char *diffInput,
     21    PKIX_PL_CRL **goodObject,
     22    PKIX_PL_CRL **equalObject,
     23    PKIX_PL_CRL **diffObject)
     24 {
     25    PKIX_TEST_STD_VARS();
     26 
     27    subTest("PKIX_PL_CRL_Create <goodObject>");
     28    *goodObject = createCRL(dataDir, goodInput, plContext);
     29 
     30    subTest("PKIX_PL_CRL_Create <equalObject>");
     31    *equalObject = createCRL(dataDir, goodInput, plContext);
     32 
     33    subTest("PKIX_PL_CRL_Create <diffObject>");
     34    *diffObject = createCRL(dataDir, diffInput, plContext);
     35 
     36    PKIX_TEST_RETURN();
     37 }
     38 
     39 static void
     40 testGetCRLEntryForSerialNumber(
     41    PKIX_PL_CRL *goodObject)
     42 {
     43    PKIX_PL_BigInt *bigInt;
     44    PKIX_PL_String *bigIntString = NULL;
     45    PKIX_PL_CRLEntry *crlEntry = NULL;
     46    PKIX_PL_String *crlEntryString = NULL;
     47    char *snAscii = "3039";
     48    char *expectedAscii =
     49        "\n\t[\n"
     50        "\tSerialNumber:    3039\n"
     51        "\tReasonCode:      257\n"
     52        "\tRevocationDate:  Fri Jan 07, 2005\n"
     53        /*      "\tRevocationDate:  Fri Jan 07 15:09:10 2005\n" */
     54        "\tCritExtOIDs:     (EMPTY)\n"
     55        "\t]\n\t";
     56 
     57    PKIX_TEST_STD_VARS();
     58 
     59    subTest("PKIX_PL_CRL_GetCRLEntryForSerialNumber");
     60 
     61    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
     62        PKIX_ESCASCII,
     63        snAscii,
     64        PL_strlen(snAscii),
     65        &bigIntString,
     66        plContext));
     67 
     68    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_BigInt_Create(
     69        bigIntString,
     70        &bigInt,
     71        plContext));
     72 
     73    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_GetCRLEntryForSerialNumber(
     74        goodObject, bigInt, &crlEntry, plContext));
     75 
     76    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString(
     77        (PKIX_PL_Object *)crlEntry,
     78        &crlEntryString,
     79        plContext));
     80 
     81    testToStringHelper((PKIX_PL_Object *)crlEntryString,
     82                       expectedAscii, plContext);
     83 
     84 cleanup:
     85 
     86    PKIX_TEST_DECREF_AC(bigIntString);
     87    PKIX_TEST_DECREF_AC(bigInt);
     88    PKIX_TEST_DECREF_AC(crlEntryString);
     89    PKIX_TEST_DECREF_AC(crlEntry);
     90    PKIX_TEST_RETURN();
     91 }
     92 
     93 static void
     94 testGetIssuer(
     95    PKIX_PL_CRL *goodObject,
     96    PKIX_PL_CRL *equalObject,
     97    PKIX_PL_CRL *diffObject)
     98 {
     99    PKIX_PL_X500Name *goodIssuer = NULL;
    100    PKIX_PL_X500Name *equalIssuer = NULL;
    101    PKIX_PL_X500Name *diffIssuer = NULL;
    102    char *expectedAscii = "CN=hanfeiyu,O=sun,C=us";
    103 
    104    PKIX_TEST_STD_VARS();
    105 
    106    subTest("PKIX_PL_CRL_GetIssuer");
    107 
    108    PKIX_TEST_EXPECT_NO_ERROR(
    109        PKIX_PL_CRL_GetIssuer(goodObject, &goodIssuer, plContext));
    110 
    111    PKIX_TEST_EXPECT_NO_ERROR(
    112        PKIX_PL_CRL_GetIssuer(equalObject, &equalIssuer, plContext));
    113 
    114    PKIX_TEST_EXPECT_NO_ERROR(
    115        PKIX_PL_CRL_GetIssuer(diffObject, &diffIssuer, plContext));
    116 
    117    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodIssuer,
    118                                equalIssuer,
    119                                diffIssuer,
    120                                expectedAscii,
    121                                X500Name,
    122                                PKIX_TRUE);
    123 
    124 cleanup:
    125 
    126    PKIX_TEST_DECREF_AC(goodIssuer);
    127    PKIX_TEST_DECREF_AC(equalIssuer);
    128    PKIX_TEST_DECREF_AC(diffIssuer);
    129 
    130    PKIX_TEST_RETURN();
    131 }
    132 
    133 static void
    134 testCritExtensionsAbsent(PKIX_PL_CRL *crl)
    135 {
    136    PKIX_List *oidList = NULL;
    137    PKIX_UInt32 numOids = 0;
    138 
    139    PKIX_TEST_STD_VARS();
    140 
    141    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_GetCriticalExtensionOIDs(crl, &oidList, plContext));
    142 
    143    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetLength(oidList, &numOids, plContext));
    144    if (numOids != 0) {
    145        pkixTestErrorMsg = "unexpected mismatch";
    146    }
    147 
    148 cleanup:
    149 
    150    PKIX_TEST_DECREF_AC(oidList);
    151 
    152    PKIX_TEST_RETURN();
    153 }
    154 
    155 static void
    156 testGetCriticalExtensionOIDs(PKIX_PL_CRL *goodObject)
    157 {
    158    subTest("PKIX_PL_CRL_GetCriticalExtensionOIDs "
    159            "<0 element>");
    160    testCritExtensionsAbsent(goodObject);
    161 }
    162 
    163 static void
    164 testVerifySignature(char *dataCentralDir, PKIX_PL_CRL *crl)
    165 {
    166    PKIX_PL_Cert *firstCert = NULL;
    167    PKIX_PL_Cert *secondCert = NULL;
    168    PKIX_PL_PublicKey *firstPubKey = NULL;
    169    PKIX_PL_PublicKey *secondPubKey = NULL;
    170 
    171    PKIX_TEST_STD_VARS();
    172 
    173    subTest("PKIX_PL_Cert_Create <hanfeiyu2hanfeiyu>");
    174    firstCert = createCert(dataCentralDir, "hanfeiyu2hanfeiyu", plContext);
    175 
    176    subTest("PKIX_PL_Cert_Create <hy2hy-bc0>");
    177    secondCert = createCert(dataCentralDir, "hy2hy-bc0", plContext);
    178 
    179    subTest("PKIX_PL_Cert_GetSubjectPublicKey <hanfeiyu2hanfeiyu>");
    180    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetSubjectPublicKey(firstCert, &firstPubKey, plContext));
    181 
    182    subTest("PKIX_PL_Cert_GetSubjectPublicKey <hanfei2hanfei>");
    183    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetSubjectPublicKey(secondCert, &secondPubKey, plContext));
    184 
    185    subTest("PKIX_PL_CRL_VerifySignature <positive>");
    186    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CRL_VerifySignature(crl, firstPubKey, plContext));
    187 
    188    subTest("PKIX_PL_CRL_VerifySignature <negative>");
    189    PKIX_TEST_EXPECT_ERROR(PKIX_PL_CRL_VerifySignature(crl, secondPubKey, plContext));
    190 
    191 cleanup:
    192 
    193    PKIX_TEST_DECREF_AC(firstCert);
    194    PKIX_TEST_DECREF_AC(secondCert);
    195    PKIX_TEST_DECREF_AC(firstPubKey);
    196    PKIX_TEST_DECREF_AC(secondPubKey);
    197 
    198    PKIX_TEST_RETURN();
    199 }
    200 
    201 static void
    202 printUsage(void)
    203 {
    204    (void)printf("\nUSAGE:\ttest_crl <test-purpose> <data-central-dir>\n\n");
    205 }
    206 
    207 /* Functional tests for CRL public functions */
    208 
    209 int
    210 test_crl(int argc, char *argv[])
    211 {
    212    PKIX_PL_CRL *goodObject = NULL;
    213    PKIX_PL_CRL *equalObject = NULL;
    214    PKIX_PL_CRL *diffObject = NULL;
    215    PKIX_UInt32 actualMinorVersion;
    216    PKIX_UInt32 j = 0;
    217 
    218    char *dataCentralDir = NULL;
    219    char *goodInput = "crlgood.crl";
    220    char *diffInput = "crldiff.crl";
    221    char *expectedAscii =
    222        "[\n"
    223        "\tVersion:         v2\n"
    224        "\tIssuer:          CN=hanfeiyu,O=sun,C=us\n"
    225        "\tUpdate:   [Last: Fri Jan 07, 2005\n"
    226        /*      "\tUpdate:   [Last: Fri Jan 07 15:09:10 2005\n" */
    227        "\t           Next: Sat Jan 07, 2006]\n"
    228        /*      "\t           Next: Sat Jan 07 15:09:10 2006]\n" */
    229        "\tSignatureAlgId:  1.2.840.10040.4.3\n"
    230        "\tCRL Number     : (null)\n"
    231        "\n\tEntry List:      (\n"
    232        "\t[\n"
    233        "\tSerialNumber:    010932\n"
    234        "\tReasonCode:      260\n"
    235        "\tRevocationDate:  Fri Jan 07, 2005\n"
    236        /*      "\tRevocationDate:  Fri Jan 07 15:09:10 2005\n" */
    237        "\tCritExtOIDs:     (EMPTY)\n"
    238        "\t]\n\t"
    239        ", "
    240        "\n\t[\n"
    241        "\tSerialNumber:    3039\n"
    242        "\tReasonCode:      257\n"
    243        "\tRevocationDate:  Fri Jan 07, 2005\n"
    244        /*      "\tRevocationDate:  Fri Jan 07 15:09:10 2005\n" */
    245        "\tCritExtOIDs:     (EMPTY)\n"
    246        "\t]\n\t"
    247        ")"
    248        "\n\n"
    249        "\tCritExtOIDs:     (EMPTY)\n"
    250        "]\n";
    251    /* Note XXX serialnumber and reasoncode need debug */
    252 
    253    PKIX_TEST_STD_VARS();
    254 
    255    startTests("CRL");
    256 
    257    PKIX_TEST_EXPECT_NO_ERROR(
    258        PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
    259 
    260    if (argc < 3 + j) {
    261        printUsage();
    262        return (0);
    263    }
    264 
    265    dataCentralDir = argv[2 + j];
    266 
    267    createCRLs(dataCentralDir,
    268               goodInput,
    269               diffInput,
    270               &goodObject,
    271               &equalObject,
    272               &diffObject);
    273 
    274    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodObject,
    275                                equalObject,
    276                                diffObject,
    277                                expectedAscii,
    278                                CRL,
    279                                PKIX_TRUE);
    280 
    281    testGetIssuer(goodObject, equalObject, diffObject);
    282 
    283    testGetCriticalExtensionOIDs(goodObject);
    284 
    285    testGetCRLEntryForSerialNumber(goodObject);
    286 
    287    testVerifySignature(dataCentralDir, goodObject);
    288 
    289 cleanup:
    290 
    291    PKIX_TEST_DECREF_AC(goodObject);
    292    PKIX_TEST_DECREF_AC(equalObject);
    293    PKIX_TEST_DECREF_AC(diffObject);
    294 
    295    PKIX_Shutdown(plContext);
    296 
    297    PKIX_TEST_RETURN();
    298 
    299    endTests("CRL");
    300 
    301    return (0);
    302 }