tor-browser

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

pkix_buildresult.c (10288B)


      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 * pkix_buildresult.c
      6 *
      7 * BuildResult Object Functions
      8 *
      9 */
     10 
     11 #include "pkix_buildresult.h"
     12 
     13 /* --Private-Functions-------------------------------------------- */
     14 
     15 /*
     16 * FUNCTION: pkix_BuildResult_Destroy
     17 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h)
     18 */
     19 static PKIX_Error *
     20 pkix_BuildResult_Destroy(
     21        PKIX_PL_Object *object,
     22        void *plContext)
     23 {
     24        PKIX_BuildResult *result = NULL;
     25 
     26        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Destroy");
     27        PKIX_NULLCHECK_ONE(object);
     28 
     29        /* Check that this object is a build result object */
     30        PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
     31                    PKIX_OBJECTNOTBUILDRESULT);
     32 
     33        result = (PKIX_BuildResult *)object;
     34 
     35        PKIX_DECREF(result->valResult);
     36        PKIX_DECREF(result->certChain);
     37 
     38 cleanup:
     39 
     40        PKIX_RETURN(BUILDRESULT);
     41 }
     42 
     43 /*
     44 * FUNCTION: pkix_BuildResult_Equals
     45 * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h)
     46 */
     47 static PKIX_Error *
     48 pkix_BuildResult_Equals(
     49        PKIX_PL_Object *first,
     50        PKIX_PL_Object *second,
     51        PKIX_Boolean *pResult,
     52        void *plContext)
     53 {
     54        PKIX_UInt32 secondType;
     55        PKIX_Boolean cmpResult;
     56        PKIX_BuildResult *firstBuildResult = NULL;
     57        PKIX_BuildResult *secondBuildResult = NULL;
     58 
     59        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Equals");
     60        PKIX_NULLCHECK_THREE(first, second, pResult);
     61 
     62        PKIX_CHECK(pkix_CheckType(first, PKIX_BUILDRESULT_TYPE, plContext),
     63                    PKIX_FIRSTOBJECTNOTBUILDRESULT);
     64 
     65        PKIX_CHECK(PKIX_PL_Object_GetType(second, &secondType, plContext),
     66                    PKIX_COULDNOTGETTYPEOFSECONDARGUMENT);
     67 
     68        *pResult = PKIX_FALSE;
     69 
     70        if (secondType != PKIX_BUILDRESULT_TYPE) goto cleanup;
     71 
     72        firstBuildResult = (PKIX_BuildResult *)first;
     73        secondBuildResult = (PKIX_BuildResult *)second;
     74 
     75        PKIX_CHECK(PKIX_PL_Object_Equals
     76                    ((PKIX_PL_Object *)firstBuildResult->valResult,
     77                    (PKIX_PL_Object *)secondBuildResult->valResult,
     78                    &cmpResult,
     79                    plContext),
     80                    PKIX_OBJECTEQUALSFAILED);
     81 
     82        if (!cmpResult) goto cleanup;
     83 
     84        PKIX_CHECK(PKIX_PL_Object_Equals
     85                    ((PKIX_PL_Object *)firstBuildResult->certChain,
     86                    (PKIX_PL_Object *)secondBuildResult->certChain,
     87                    &cmpResult,
     88                    plContext),
     89                    PKIX_OBJECTEQUALSFAILED);
     90 
     91        if (!cmpResult) goto cleanup;
     92 
     93        /*
     94         * The remaining case is that both are null,
     95         * which we consider equality.
     96         *      cmpResult = PKIX_TRUE;
     97         */
     98 
     99        *pResult = cmpResult;
    100 
    101 cleanup:
    102 
    103        PKIX_RETURN(BUILDRESULT);
    104 }
    105 
    106 /*
    107 * FUNCTION: pkix_BuildResult_Hashcode
    108 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h)
    109 */
    110 static PKIX_Error *
    111 pkix_BuildResult_Hashcode(
    112        PKIX_PL_Object *object,
    113        PKIX_UInt32 *pHashcode,
    114        void *plContext)
    115 {
    116        PKIX_BuildResult *buildResult = NULL;
    117        PKIX_UInt32 hash = 0;
    118        PKIX_UInt32 valResultHash = 0;
    119        PKIX_UInt32 certChainHash = 0;
    120 
    121        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Hashcode");
    122        PKIX_NULLCHECK_TWO(object, pHashcode);
    123 
    124        PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
    125                    PKIX_OBJECTNOTBUILDRESULT);
    126 
    127        buildResult = (PKIX_BuildResult*)object;
    128 
    129        PKIX_CHECK(PKIX_PL_Object_Hashcode
    130                    ((PKIX_PL_Object *)buildResult->valResult,
    131                    &valResultHash,
    132                    plContext),
    133                    PKIX_OBJECTHASHCODEFAILED);
    134 
    135        PKIX_CHECK(PKIX_PL_Object_Hashcode
    136                    ((PKIX_PL_Object *)buildResult->certChain,
    137                    &certChainHash,
    138                    plContext),
    139                    PKIX_OBJECTHASHCODEFAILED);
    140 
    141        hash = 31*(31 * valResultHash + certChainHash);
    142 
    143        *pHashcode = hash;
    144 
    145 cleanup:
    146 
    147        PKIX_RETURN(BUILDRESULT);
    148 }
    149 
    150 /*
    151 * FUNCTION: pkix_BuildResult_ToString
    152 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h)
    153 */
    154 static PKIX_Error *
    155 pkix_BuildResult_ToString(
    156        PKIX_PL_Object *object,
    157        PKIX_PL_String **pString,
    158        void *plContext)
    159 {
    160        PKIX_BuildResult *buildResult = NULL;
    161        PKIX_PL_String *formatString = NULL;
    162        PKIX_PL_String *buildResultString = NULL;
    163 
    164        PKIX_ValidateResult *valResult = NULL;
    165        PKIX_List *certChain = NULL;
    166 
    167        PKIX_PL_String *valResultString = NULL;
    168        PKIX_PL_String *certChainString = NULL;
    169 
    170        char *asciiFormat =
    171                "[\n"
    172                "\tValidateResult: \t\t%s"
    173                "\tCertChain:    \t\t%s\n"
    174                "]\n";
    175 
    176        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_ToString");
    177        PKIX_NULLCHECK_TWO(object, pString);
    178 
    179        PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
    180                PKIX_OBJECTNOTBUILDRESULT);
    181 
    182        buildResult = (PKIX_BuildResult*)object;
    183 
    184        valResult = buildResult->valResult;
    185 
    186        PKIX_CHECK(PKIX_PL_String_Create
    187                (PKIX_ESCASCII, asciiFormat, 0, &formatString, plContext),
    188                PKIX_STRINGCREATEFAILED);
    189 
    190        PKIX_CHECK(PKIX_PL_Object_ToString
    191                ((PKIX_PL_Object *)valResult, &valResultString, plContext),
    192                PKIX_OBJECTTOSTRINGFAILED);
    193 
    194        certChain = buildResult->certChain;
    195 
    196        PKIX_CHECK(PKIX_PL_Object_ToString
    197                ((PKIX_PL_Object *)certChain, &certChainString, plContext),
    198                PKIX_OBJECTTOSTRINGFAILED);
    199 
    200        PKIX_CHECK(PKIX_PL_Sprintf
    201                (&buildResultString,
    202                plContext,
    203                formatString,
    204                valResultString,
    205                certChainString),
    206                PKIX_SPRINTFFAILED);
    207 
    208        *pString = buildResultString;
    209 
    210 cleanup:
    211 
    212        PKIX_DECREF(formatString);
    213        PKIX_DECREF(valResultString);
    214        PKIX_DECREF(certChainString);
    215 
    216        PKIX_RETURN(BUILDRESULT);
    217 }
    218 
    219 /*
    220 * FUNCTION: pkix_BuildResult_RegisterSelf
    221 * DESCRIPTION:
    222 *  Registers PKIX_BUILDRESULT_TYPE and its related functions with
    223 *  systemClasses[]
    224 * THREAD SAFETY:
    225 *  Not Thread Safe - for performance and complexity reasons
    226 *
    227 *  Since this function is only called by PKIX_PL_Initialize, which should
    228 *  only be called once, it is acceptable that this function is not
    229 *  thread-safe.
    230 */
    231 PKIX_Error *
    232 pkix_BuildResult_RegisterSelf(void *plContext)
    233 {
    234 
    235        extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
    236        pkix_ClassTable_Entry entry;
    237 
    238        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_RegisterSelf");
    239 
    240        entry.description = "BuildResult";
    241        entry.objCounter = 0;
    242        entry.typeObjectSize = sizeof(PKIX_BuildResult);
    243        entry.destructor = pkix_BuildResult_Destroy;
    244        entry.equalsFunction = pkix_BuildResult_Equals;
    245        entry.hashcodeFunction = pkix_BuildResult_Hashcode;
    246        entry.toStringFunction = pkix_BuildResult_ToString;
    247        entry.comparator = NULL;
    248        entry.duplicateFunction = pkix_duplicateImmutable;
    249 
    250        systemClasses[PKIX_BUILDRESULT_TYPE] = entry;
    251 
    252        PKIX_RETURN(BUILDRESULT);
    253 }
    254 
    255 /*
    256 * FUNCTION: pkix_BuildResult_Create
    257 * DESCRIPTION:
    258 *
    259 *  Creates a new BuildResult Object using the ValidateResult pointed to by
    260 *  "valResult" and the List pointed to by "certChain", and stores it at
    261 *  "pResult".
    262 *
    263 * PARAMETERS
    264 *  "valResult"
    265 *      Address of ValidateResult component. Must be non-NULL.
    266 *  "certChain
    267 *      Address of List component. Must be non-NULL.
    268 *  "pResult"
    269 *      Address where object pointer will be stored. Must be non-NULL.
    270 *  "plContext"
    271 *      Platform-specific context pointer.
    272 * THREAD SAFETY:
    273 *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
    274 * RETURNS:
    275 *  Returns NULL if the function succeeds.
    276 *  Returns a Fatal Error if the function fails in an unrecoverable way.
    277 */
    278 PKIX_Error *
    279 pkix_BuildResult_Create(
    280        PKIX_ValidateResult *valResult,
    281        PKIX_List *certChain,
    282        PKIX_BuildResult **pResult,
    283        void *plContext)
    284 {
    285        PKIX_BuildResult *result = NULL;
    286 
    287        PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Create");
    288        PKIX_NULLCHECK_THREE(valResult, certChain, pResult);
    289 
    290        PKIX_CHECK(PKIX_PL_Object_Alloc
    291                    (PKIX_BUILDRESULT_TYPE,
    292                    sizeof (PKIX_BuildResult),
    293                    (PKIX_PL_Object **)&result,
    294                    plContext),
    295                    PKIX_COULDNOTCREATEBUILDRESULTOBJECT);
    296 
    297        /* initialize fields */
    298 
    299        PKIX_INCREF(valResult);
    300        result->valResult = valResult;
    301 
    302        PKIX_INCREF(certChain);
    303        result->certChain = certChain;
    304 
    305        PKIX_CHECK(PKIX_List_SetImmutable(result->certChain, plContext),
    306                     PKIX_LISTSETIMMUTABLEFAILED);
    307 
    308        *pResult = result;
    309        result = NULL;
    310 
    311 cleanup:
    312 
    313        PKIX_DECREF(result);
    314 
    315        PKIX_RETURN(BUILDRESULT);
    316 
    317 }
    318 
    319 /* --Public-Functions--------------------------------------------- */
    320 
    321 
    322 /*
    323 * FUNCTION: PKIX_BuildResult_GetValidateResult
    324 *      (see comments in pkix_result.h)
    325 */
    326 PKIX_Error *
    327 PKIX_BuildResult_GetValidateResult(
    328        PKIX_BuildResult *result,
    329        PKIX_ValidateResult **pResult,
    330        void *plContext)
    331 {
    332        PKIX_ENTER(BUILDRESULT, "PKIX_BuildResult_GetValidateResult");
    333        PKIX_NULLCHECK_TWO(result, pResult);
    334 
    335        PKIX_INCREF(result->valResult);
    336        *pResult = result->valResult;
    337 
    338 cleanup:
    339        PKIX_RETURN(BUILDRESULT);
    340 }
    341 
    342 
    343 
    344 /*
    345 * FUNCTION: PKIX_BuildResult_GetCertChain
    346 *      (see comments in pkix_result.h)
    347 */
    348 PKIX_Error *
    349 PKIX_BuildResult_GetCertChain(
    350        PKIX_BuildResult *result,
    351        PKIX_List **pChain,
    352        void *plContext)
    353 {
    354        PKIX_ENTER(BUILDRESULT, "PKIX_BuildResult_GetCertChain");
    355        PKIX_NULLCHECK_TWO(result, pChain);
    356 
    357        PKIX_INCREF(result->certChain);
    358        *pChain = result->certChain;
    359 
    360 cleanup:
    361        PKIX_RETURN(BUILDRESULT);
    362 }