tor-browser

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

pkixutil.c (10319B)


      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 * testwrapper.c
      6 *
      7 * Wrpper programm for libpkix tests.
      8 *
      9 */
     10 
     11 #include <stdio.h>
     12 
     13 #include "nspr.h"
     14 #include "plgetopt.h"
     15 
     16 #include "nss.h"
     17 #include "secport.h"
     18 
     19 typedef int (*mainTestFn)(int argc, char *argv[]);
     20 
     21 extern int libpkix_buildthreads(int argc, char *argv[]);
     22 extern int nss_threads(int argc, char *argv[]);
     23 extern int test_certselector(int argc, char *argv[]);
     24 extern int test_comcertselparams(int argc, char *argv[]);
     25 extern int test_certchainchecker(int argc, char *argv[]);
     26 extern int test_comcrlselparams(int argc, char *argv[]);
     27 extern int test_crlselector(int argc, char *argv[]);
     28 
     29 extern int test_procparams(int argc, char *argv[]);
     30 extern int test_resourcelimits(int argc, char *argv[]);
     31 extern int test_trustanchor(int argc, char *argv[]);
     32 extern int test_valparams(int argc, char *argv[]);
     33 extern int test_buildresult(int argc, char *argv[]);
     34 extern int test_policynode(int argc, char *argv[]);
     35 extern int test_valresult(int argc, char *argv[]);
     36 extern int test_verifynode(int argc, char *argv[]);
     37 extern int test_store(int argc, char *argv[]);
     38 extern int test_basicchecker(int argc, char *argv[]);
     39 extern int test_basicconstraintschecker(int argc, char *argv[]);
     40 extern int test_buildchain(int argc, char *argv[]);
     41 extern int test_buildchain_partialchain(int argc, char *argv[]);
     42 extern int test_buildchain_resourcelimits(int argc, char *argv[]);
     43 extern int test_buildchain_uchecker(int argc, char *argv[]);
     44 extern int test_customcrlchecker(int argc, char *argv[]);
     45 extern int test_defaultcrlchecker2stores(int argc, char *argv[]);
     46 extern int test_ocsp(int argc, char *argv[]);
     47 extern int test_policychecker(int argc, char *argv[]);
     48 extern int test_subjaltnamechecker(int argc, char *argv[]);
     49 extern int test_validatechain(int argc, char *argv[]);
     50 extern int test_validatechain_NB(int argc, char *argv[]);
     51 extern int test_validatechain_bc(int argc, char *argv[]);
     52 extern int test_error(int argc, char *argv[]);
     53 extern int test_list(int argc, char *argv[]);
     54 extern int test_list2(int argc, char *argv[]);
     55 extern int test_logger(int argc, char *argv[]);
     56 extern int test_colcertstore(int argc, char *argv[]);
     57 extern int test_ekuchecker(int argc, char *argv[]);
     58 extern int test_httpcertstore(int argc, char *argv[]);
     59 extern int test_pk11certstore(int argc, char *argv[]);
     60 extern int test_socket(int argc, char *argv[]);
     61 extern int test_authorityinfoaccess(int argc, char *argv[]);
     62 extern int test_cert(int argc, char *argv[]);
     63 extern int test_crl(int argc, char *argv[]);
     64 extern int test_crlentry(int argc, char *argv[]);
     65 extern int test_date(int argc, char *argv[]);
     66 extern int test_generalname(int argc, char *argv[]);
     67 extern int test_nameconstraints(int argc, char *argv[]);
     68 extern int test_subjectinfoaccess(int argc, char *argv[]);
     69 extern int test_x500name(int argc, char *argv[]);
     70 extern int stress_test(int argc, char *argv[]);
     71 extern int test_bigint(int argc, char *argv[]);
     72 extern int test_bytearray(int argc, char *argv[]);
     73 extern int test_hashtable(int argc, char *argv[]);
     74 extern int test_mem(int argc, char *argv[]);
     75 extern int test_monitorlock(int argc, char *argv[]);
     76 extern int test_mutex(int argc, char *argv[]);
     77 extern int test_mutex2(int argc, char *argv[]);
     78 extern int test_mutex3(int argc, char *argv[]);
     79 extern int test_object(int argc, char *argv[]);
     80 extern int test_oid(int argc, char *argv[]);
     81 
     82 /* Taken out. Problem with build                   */
     83 /* extern int test_rwlock(int argc, char *argv[]); */
     84 extern int test_string(int argc, char *argv[]);
     85 extern int test_string2(int argc, char *argv[]);
     86 extern int build_chain(int argc, char *argv[]);
     87 extern int dumpcert(int argc, char *argv[]);
     88 extern int dumpcrl(int argc, char *argv[]);
     89 extern int validate_chain(int argc, char *argv[]);
     90 
     91 typedef struct {
     92    char *fnName;
     93    mainTestFn fnPointer;
     94 } testFunctionRef;
     95 
     96 testFunctionRef testFnRefTable[] = {
     97    { "libpkix_buildthreads", libpkix_buildthreads },
     98    { "nss_threads", nss_threads },
     99    { "test_certselector", test_certselector },
    100    { "test_comcertselparams", test_comcertselparams },
    101    { "test_certchainchecker", test_certchainchecker },
    102    { "test_comcrlselparams", test_comcrlselparams },
    103    { "test_crlselector", test_crlselector },
    104    { "test_procparams", test_procparams },
    105    { "test_resourcelimits", test_resourcelimits },
    106    { "test_trustanchor", test_trustanchor },
    107    { "test_valparams", test_valparams },
    108    { "test_buildresult", test_buildresult },
    109    { "test_policynode", test_policynode },
    110    { "test_valresult", test_valresult },
    111    { "test_verifynode", test_verifynode },
    112    { "test_store", test_store },
    113    { "test_basicchecker", test_basicchecker },
    114    { "test_basicconstraintschecker", test_basicconstraintschecker },
    115    { "test_buildchain", test_buildchain },
    116    { "test_buildchain_partialchain", test_buildchain_partialchain },
    117    { "test_buildchain_resourcelimits", test_buildchain_resourcelimits },
    118    { "test_buildchain_uchecker", test_buildchain_uchecker },
    119    { "test_customcrlchecker", test_customcrlchecker },
    120    { "test_defaultcrlchecker2stores", test_defaultcrlchecker2stores },
    121    { "test_ocsp", test_ocsp },
    122    { "test_policychecker", test_policychecker },
    123    { "test_subjaltnamechecker", test_subjaltnamechecker },
    124    { "test_validatechain", test_validatechain },
    125    { "test_validatechain_NB", test_validatechain_NB },
    126    { "test_validatechain_bc", test_validatechain_bc },
    127    { "test_error", test_error },
    128    { "test_list", test_list },
    129    { "test_list2", test_list2 },
    130    { "test_logger", test_logger },
    131    { "test_colcertstore", test_colcertstore },
    132    { "test_ekuchecker", test_ekuchecker },
    133    { "test_httpcertstore", test_httpcertstore },
    134    { "test_pk11certstore", test_pk11certstore },
    135    { "test_socket", test_socket },
    136    { "test_authorityinfoaccess", test_authorityinfoaccess },
    137    { "test_cert", test_cert },
    138    { "test_crl", test_crl },
    139    { "test_crlentry", test_crlentry },
    140    { "test_date", test_date },
    141    { "test_generalname", test_generalname },
    142    { "test_nameconstraints", test_nameconstraints },
    143    { "test_subjectinfoaccess", test_subjectinfoaccess },
    144    { "test_x500name", test_x500name },
    145    { "stress_test", stress_test },
    146    { "test_bigint", test_bigint },
    147    { "test_bytearray", test_bytearray },
    148    { "test_hashtable", test_hashtable },
    149    { "test_mem", test_mem },
    150    { "test_monitorlock", test_monitorlock },
    151    { "test_mutex", test_mutex },
    152    { "test_mutex2", test_mutex2 },
    153    { "test_mutex3", test_mutex3 },
    154    { "test_object", test_object },
    155    { "test_oid", test_oid },
    156    /*  {"test_rwlock",                    test_rwlock }*/
    157    { "test_string", test_string },
    158    { "test_string2", test_string2 },
    159    { "build_chain", build_chain },
    160    { "dumpcert", dumpcert },
    161    { "dumpcrl", dumpcrl },
    162    { "validate_chain", validate_chain },
    163    { NULL, NULL },
    164 };
    165 
    166 static void
    167 printUsage(char *cmdName)
    168 {
    169    int fnCounter = 0;
    170 
    171    fprintf(stderr, "Usage: %s [test name] [arg1]...[argN]\n\n", cmdName);
    172    fprintf(stderr, "List of possible names for the tests:");
    173    while (testFnRefTable[fnCounter].fnName != NULL) {
    174        if (fnCounter % 2 == 0) {
    175            fprintf(stderr, "\n");
    176        }
    177        fprintf(stderr, "  %-35s ", testFnRefTable[fnCounter].fnName);
    178        fnCounter += 1;
    179    }
    180    fprintf(stderr, "\n");
    181 }
    182 
    183 static SECStatus
    184 getTestArguments(int argc,
    185                 char **argv,
    186                 mainTestFn *ptestFn,
    187                 char **pdbPath,
    188                 int *pargc,
    189                 char ***pargv)
    190 {
    191    PLOptState *optstate = NULL;
    192    PLOptStatus status;
    193    mainTestFn testFunction = NULL;
    194    char **wArgv = NULL;
    195    char *dbPath = NULL;
    196    char *fnName = NULL;
    197    int wArgc = 0;
    198    int fnCounter = 0;
    199 
    200    if (argc < 2) {
    201        printf("ERROR: insufficient number of arguments: %s.\n", fnName);
    202        return SECFailure;
    203    }
    204 
    205    fnName = argv[1];
    206    while (testFnRefTable[fnCounter].fnName != NULL) {
    207        if (!PORT_Strcmp(fnName, testFnRefTable[fnCounter].fnName)) {
    208            testFunction = testFnRefTable[fnCounter].fnPointer;
    209            break;
    210        }
    211        fnCounter += 1;
    212    }
    213    if (!testFunction) {
    214        printf("ERROR: unknown name of the test: %s.\n", fnName);
    215        return SECFailure;
    216    }
    217 
    218    wArgv = PORT_ZNewArray(char *, argc);
    219    if (!wArgv) {
    220        return SECFailure;
    221    }
    222 
    223    /* set name of the function as a first arg and increment arg count. */
    224    wArgv[0] = fnName;
    225    wArgc += 1;
    226 
    227    optstate = PL_CreateOptState(argc - 1, argv + 1, "d:");
    228    while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
    229        switch (optstate->option) {
    230            case 'd':
    231                dbPath = (char *)optstate->value;
    232                break;
    233 
    234            default:
    235                wArgv[wArgc] = (char *)optstate->value;
    236                wArgc += 1;
    237                break;
    238        }
    239    }
    240    PL_DestroyOptState(optstate);
    241 
    242    *ptestFn = testFunction;
    243    *pdbPath = dbPath;
    244    *pargc = wArgc;
    245    *pargv = wArgv;
    246 
    247    return SECSuccess;
    248 }
    249 
    250 static int
    251 runCmd(mainTestFn fnPointer,
    252       int argc,
    253       char **argv,
    254       char *dbPath)
    255 {
    256    int retStat = 0;
    257 
    258    /*  Initialize NSPR and NSS.  */
    259    PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
    260 
    261    /* if using databases, use NSS_Init and not NSS_NoDB_Init */
    262    if (dbPath && PORT_Strlen(dbPath) != 0) {
    263        if (NSS_Init(dbPath) != SECSuccess)
    264            return SECFailure;
    265    } else {
    266        if (NSS_NoDB_Init(NULL) != 0)
    267            return SECFailure;
    268    }
    269    retStat = fnPointer(argc, argv);
    270 
    271    if (NSS_Shutdown() != SECSuccess) {
    272        exit(1);
    273    }
    274    PR_Cleanup();
    275    return retStat;
    276 }
    277 
    278 int
    279 main(int argc, char **argv)
    280 {
    281    mainTestFn testFunction = NULL;
    282    char *dbPath = NULL;
    283    char **testArgv = NULL;
    284    int testArgc = 0;
    285    int rv = 0;
    286 
    287    rv = getTestArguments(argc, argv, &testFunction, &dbPath,
    288                          &testArgc, &testArgv);
    289    if (rv != SECSuccess) {
    290        printUsage(argv[0]);
    291        return 1;
    292    }
    293 
    294    rv = runCmd(testFunction, testArgc, testArgv, dbPath);
    295 
    296    PORT_Free(testArgv);
    297 
    298    return rv;
    299 }