tor-browser

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

pkix_valresult.c (13297B)


      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_valresult.c
      6 *
      7 * ValidateResult Object Functions
      8 *
      9 */
     10 
     11 #include "pkix_valresult.h"
     12 
     13 /* --Private-Functions-------------------------------------------- */
     14 
     15 /*
     16 * FUNCTION: pkix_ValidateResult_Destroy
     17 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h)
     18 */
     19 static PKIX_Error *
     20 pkix_ValidateResult_Destroy(
     21        PKIX_PL_Object *object,
     22        void *plContext)
     23 {
     24        PKIX_ValidateResult *result = NULL;
     25 
     26        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_Destroy");
     27        PKIX_NULLCHECK_ONE(object);
     28 
     29        /* Check that this object is a validate result object */
     30        PKIX_CHECK(pkix_CheckType(object, PKIX_VALIDATERESULT_TYPE, plContext),
     31                PKIX_OBJECTNOTVALIDATERESULT);
     32 
     33        result = (PKIX_ValidateResult *)object;
     34 
     35        PKIX_DECREF(result->anchor);
     36        PKIX_DECREF(result->pubKey);
     37        PKIX_DECREF(result->policyTree);
     38 
     39 cleanup:
     40 
     41        PKIX_RETURN(VALIDATERESULT);
     42 }
     43 
     44 /*
     45 * FUNCTION: pkix_ValidateResult_Equals
     46 * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h)
     47 */
     48 static PKIX_Error *
     49 pkix_ValidateResult_Equals(
     50        PKIX_PL_Object *first,
     51        PKIX_PL_Object *second,
     52        PKIX_Boolean *pResult,
     53        void *plContext)
     54 {
     55        PKIX_UInt32 secondType;
     56        PKIX_Boolean cmpResult;
     57        PKIX_ValidateResult *firstValResult = NULL;
     58        PKIX_ValidateResult *secondValResult = NULL;
     59        PKIX_TrustAnchor *firstAnchor = NULL;
     60        PKIX_TrustAnchor *secondAnchor = NULL;
     61        PKIX_PolicyNode *firstTree = NULL;
     62        PKIX_PolicyNode *secondTree = NULL;
     63 
     64        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_Equals");
     65        PKIX_NULLCHECK_THREE(first, second, pResult);
     66 
     67        PKIX_CHECK(pkix_CheckType(first, PKIX_VALIDATERESULT_TYPE, plContext),
     68                PKIX_FIRSTOBJECTNOTVALIDATERESULT);
     69 
     70        PKIX_CHECK(PKIX_PL_Object_GetType(second, &secondType, plContext),
     71                PKIX_COULDNOTGETTYPEOFSECONDARGUMENT);
     72 
     73        *pResult = PKIX_FALSE;
     74 
     75        if (secondType != PKIX_VALIDATERESULT_TYPE) goto cleanup;
     76 
     77        firstValResult = (PKIX_ValidateResult *)first;
     78        secondValResult = (PKIX_ValidateResult *)second;
     79 
     80        PKIX_CHECK(PKIX_PL_Object_Equals
     81                ((PKIX_PL_Object *)firstValResult->pubKey,
     82                (PKIX_PL_Object *)secondValResult->pubKey,
     83                &cmpResult,
     84                plContext),
     85                PKIX_OBJECTEQUALSFAILED);
     86 
     87        if (!cmpResult) goto cleanup;
     88 
     89        firstAnchor = firstValResult->anchor;
     90        secondAnchor = secondValResult->anchor;
     91 
     92        if ((firstAnchor != NULL) && (secondAnchor != NULL)) {
     93                PKIX_CHECK(PKIX_PL_Object_Equals
     94                        ((PKIX_PL_Object *)firstAnchor,
     95                        (PKIX_PL_Object *)secondAnchor,
     96                        &cmpResult,
     97                        plContext),
     98                        PKIX_OBJECTEQUALSFAILED);
     99        } else {
    100                cmpResult = (firstAnchor == secondAnchor);
    101        }
    102 
    103        if (!cmpResult) goto cleanup;
    104 
    105        firstTree = firstValResult->policyTree;
    106        secondTree = secondValResult->policyTree;
    107 
    108        if ((firstTree != NULL) && (secondTree != NULL)) {
    109                PKIX_CHECK(PKIX_PL_Object_Equals
    110                        ((PKIX_PL_Object *)firstTree,
    111                        (PKIX_PL_Object *)secondTree,
    112                        &cmpResult,
    113                        plContext),
    114                        PKIX_OBJECTEQUALSFAILED);
    115        } else {
    116                cmpResult = (firstTree == secondTree);
    117        }
    118 
    119        *pResult = cmpResult;
    120 
    121 cleanup:
    122 
    123        PKIX_RETURN(VALIDATERESULT);
    124 }
    125 
    126 /*
    127 * FUNCTION: pkix_ValidateResult_Hashcode
    128 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h)
    129 */
    130 static PKIX_Error *
    131 pkix_ValidateResult_Hashcode(
    132        PKIX_PL_Object *object,
    133        PKIX_UInt32 *pHashcode,
    134        void *plContext)
    135 {
    136        PKIX_ValidateResult *valResult = NULL;
    137        PKIX_UInt32 hash = 0;
    138        PKIX_UInt32 pubKeyHash = 0;
    139        PKIX_UInt32 anchorHash = 0;
    140        PKIX_UInt32 policyTreeHash = 0;
    141 
    142        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_Hashcode");
    143        PKIX_NULLCHECK_TWO(object, pHashcode);
    144 
    145        PKIX_CHECK(pkix_CheckType(object, PKIX_VALIDATERESULT_TYPE, plContext),
    146                PKIX_OBJECTNOTVALIDATERESULT);
    147 
    148        valResult = (PKIX_ValidateResult*)object;
    149 
    150        PKIX_CHECK(PKIX_PL_Object_Hashcode
    151                ((PKIX_PL_Object *)valResult->pubKey, &pubKeyHash, plContext),
    152                PKIX_OBJECTHASHCODEFAILED);
    153 
    154        if (valResult->anchor) {
    155                PKIX_CHECK(PKIX_PL_Object_Hashcode
    156                        ((PKIX_PL_Object *)valResult->anchor,
    157                        &anchorHash,
    158                        plContext),
    159                        PKIX_OBJECTHASHCODEFAILED);
    160        }
    161 
    162        if (valResult->policyTree) {
    163                PKIX_CHECK(PKIX_PL_Object_Hashcode
    164                        ((PKIX_PL_Object *)valResult->policyTree,
    165                        &policyTreeHash,
    166                        plContext),
    167                        PKIX_OBJECTHASHCODEFAILED);
    168        }
    169 
    170        hash = 31*(31 * pubKeyHash + anchorHash) + policyTreeHash;
    171 
    172        *pHashcode = hash;
    173 
    174 cleanup:
    175 
    176        PKIX_RETURN(VALIDATERESULT);
    177 }
    178 
    179 /*
    180 * FUNCTION: pkix_ValidateResult_ToString
    181 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h)
    182 */
    183 static PKIX_Error *
    184 pkix_ValidateResult_ToString(
    185        PKIX_PL_Object *object,
    186        PKIX_PL_String **pString,
    187        void *plContext)
    188 {
    189        PKIX_ValidateResult *valResult = NULL;
    190        PKIX_PL_String *formatString = NULL;
    191        PKIX_PL_String *valResultString = NULL;
    192 
    193        PKIX_TrustAnchor *anchor = NULL;
    194        PKIX_PL_PublicKey *pubKey = NULL;
    195        PKIX_PolicyNode *policyTree = NULL;
    196 
    197        PKIX_PL_String *anchorString = NULL;
    198        PKIX_PL_String *pubKeyString = NULL;
    199        PKIX_PL_String *treeString = NULL;
    200        char *asciiNullString = "(null)";
    201        char *asciiFormat =
    202                "[\n"
    203                "\tTrustAnchor: \t\t%s"
    204                "\tPubKey:    \t\t%s\n"
    205                "\tPolicyTree:  \t\t%s\n"
    206                "]\n";
    207 
    208        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_ToString");
    209        PKIX_NULLCHECK_TWO(object, pString);
    210 
    211        PKIX_CHECK(pkix_CheckType(object, PKIX_VALIDATERESULT_TYPE, plContext),
    212                PKIX_OBJECTNOTVALIDATERESULT);
    213 
    214        PKIX_CHECK(PKIX_PL_String_Create
    215                (PKIX_ESCASCII, asciiFormat, 0, &formatString, plContext),
    216                PKIX_STRINGCREATEFAILED);
    217 
    218        valResult = (PKIX_ValidateResult*)object;
    219 
    220        anchor = valResult->anchor;
    221 
    222        if (anchor) {
    223                PKIX_CHECK(PKIX_PL_Object_ToString
    224                        ((PKIX_PL_Object *)anchor, &anchorString, plContext),
    225                        PKIX_OBJECTTOSTRINGFAILED);
    226        } else {
    227                PKIX_CHECK(PKIX_PL_String_Create
    228                        (PKIX_ESCASCII,
    229                        asciiNullString,
    230                        0,
    231                        &anchorString,
    232                        plContext),
    233                        PKIX_STRINGCREATEFAILED);
    234        }
    235 
    236        pubKey = valResult->pubKey;
    237 
    238        PKIX_CHECK(PKIX_PL_Object_ToString
    239                ((PKIX_PL_Object *)pubKey, &pubKeyString, plContext),
    240                PKIX_OBJECTTOSTRINGFAILED);
    241 
    242        policyTree = valResult->policyTree;
    243 
    244        if (policyTree) {
    245                PKIX_CHECK(PKIX_PL_Object_ToString
    246                        ((PKIX_PL_Object *)policyTree, &treeString, plContext),
    247                        PKIX_OBJECTTOSTRINGFAILED);
    248        } else {
    249                PKIX_CHECK(PKIX_PL_String_Create
    250                        (PKIX_ESCASCII,
    251                        asciiNullString,
    252                        0,
    253                        &treeString,
    254                        plContext),
    255                        PKIX_STRINGCREATEFAILED);
    256        }
    257 
    258        PKIX_CHECK(PKIX_PL_Sprintf
    259                (&valResultString,
    260                plContext,
    261                formatString,
    262                anchorString,
    263                pubKeyString,
    264                treeString),
    265                PKIX_SPRINTFFAILED);
    266 
    267        *pString = valResultString;
    268 
    269 cleanup:
    270 
    271        PKIX_DECREF(formatString);
    272        PKIX_DECREF(anchorString);
    273        PKIX_DECREF(pubKeyString);
    274        PKIX_DECREF(treeString);
    275 
    276        PKIX_RETURN(VALIDATERESULT);
    277 }
    278 
    279 /*
    280 * FUNCTION: pkix_ValidateResult_RegisterSelf
    281 * DESCRIPTION:
    282 *  Registers PKIX_VALIDATERESULT_TYPE and its related functions with
    283 *  systemClasses[]
    284 * THREAD SAFETY:
    285 *  Not Thread Safe - for performance and complexity reasons
    286 *
    287 *  Since this function is only called by PKIX_PL_Initialize, which should
    288 *  only be called once, it is acceptable that this function is not
    289 *  thread-safe.
    290 */
    291 PKIX_Error *
    292 pkix_ValidateResult_RegisterSelf(void *plContext)
    293 {
    294 
    295        extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
    296        pkix_ClassTable_Entry entry;
    297 
    298        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_RegisterSelf");
    299 
    300        entry.description = "ValidateResult";
    301        entry.objCounter = 0;
    302        entry.typeObjectSize = sizeof(PKIX_ValidateResult);
    303        entry.destructor = pkix_ValidateResult_Destroy;
    304        entry.equalsFunction = pkix_ValidateResult_Equals;
    305        entry.hashcodeFunction = pkix_ValidateResult_Hashcode;
    306        entry.toStringFunction = pkix_ValidateResult_ToString;
    307        entry.comparator = NULL;
    308        entry.duplicateFunction = pkix_duplicateImmutable;
    309 
    310        systemClasses[PKIX_VALIDATERESULT_TYPE] = entry;
    311 
    312        PKIX_RETURN(VALIDATERESULT);
    313 }
    314 
    315 /*
    316 * FUNCTION: pkix_ValidateResult_Create
    317 * DESCRIPTION:
    318 *
    319 *  Creates a new ValidateResult Object using the PublicKey pointed to by
    320 *  "pubKey", the TrustAnchor pointed to by "anchor", and the PolicyNode
    321 *  pointed to by "policyTree", and stores it at "pResult".
    322 *
    323 * PARAMETERS
    324 *  "pubKey"
    325 *      PublicKey of the desired ValidateResult. Must be non-NULL.
    326 *  "anchor"
    327 *      TrustAnchor of the desired Validateresult. May be NULL.
    328 *  "policyTree"
    329 *      PolicyNode of the desired ValidateResult; may be NULL
    330 *  "pResult"
    331 *      Address where object pointer will be stored. Must be non-NULL.
    332 *  "plContext"
    333 *      Platform-specific context pointer.
    334 * THREAD SAFETY:
    335 *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
    336 * RETURNS:
    337 *  Returns NULL if the function succeeds.
    338 *  Returns a Fatal Error if the function fails in an unrecoverable way.
    339 */
    340 PKIX_Error *
    341 pkix_ValidateResult_Create(
    342        PKIX_PL_PublicKey *pubKey,
    343        PKIX_TrustAnchor *anchor,
    344        PKIX_PolicyNode *policyTree,
    345        PKIX_ValidateResult **pResult,
    346        void *plContext)
    347 {
    348        PKIX_ValidateResult *result = NULL;
    349 
    350        PKIX_ENTER(VALIDATERESULT, "pkix_ValidateResult_Create");
    351        PKIX_NULLCHECK_TWO(pubKey, pResult);
    352 
    353        PKIX_CHECK(PKIX_PL_Object_Alloc
    354                    (PKIX_VALIDATERESULT_TYPE,
    355                    sizeof (PKIX_ValidateResult),
    356                    (PKIX_PL_Object **)&result,
    357                    plContext),
    358                    PKIX_COULDNOTCREATEVALIDATERESULTOBJECT);
    359 
    360        /* initialize fields */
    361 
    362        PKIX_INCREF(pubKey);
    363        result->pubKey = pubKey;
    364 
    365        PKIX_INCREF(anchor);
    366        result->anchor = anchor;
    367 
    368        PKIX_INCREF(policyTree);
    369        result->policyTree = policyTree;
    370 
    371        *pResult = result;
    372        result = NULL;
    373 
    374 cleanup:
    375 
    376        PKIX_DECREF(result);
    377 
    378        PKIX_RETURN(VALIDATERESULT);
    379 
    380 }
    381 
    382 /* --Public-Functions--------------------------------------------- */
    383 
    384 /*
    385 * FUNCTION: PKIX_ValidateResult_GetPublicKey
    386 *      (see comments in pkix_result.h)
    387 */
    388 PKIX_Error *
    389 PKIX_ValidateResult_GetPublicKey(
    390        PKIX_ValidateResult *result,
    391        PKIX_PL_PublicKey **pPublicKey,
    392        void *plContext)
    393 {
    394        PKIX_ENTER(VALIDATERESULT, "PKIX_ValidateResult_GetPublicKey");
    395        PKIX_NULLCHECK_TWO(result, pPublicKey);
    396 
    397        PKIX_INCREF(result->pubKey);
    398        *pPublicKey = result->pubKey;
    399 
    400 cleanup:
    401        PKIX_RETURN(VALIDATERESULT);
    402 }
    403 
    404 /*
    405 * FUNCTION: PKIX_ValidateResult_GetTrustAnchor
    406 *      (see comments in pkix_result.h)
    407 */
    408 PKIX_Error *
    409 PKIX_ValidateResult_GetTrustAnchor(
    410        PKIX_ValidateResult *result,
    411        PKIX_TrustAnchor **pTrustAnchor,
    412        void *plContext)
    413 {
    414        PKIX_ENTER(VALIDATERESULT, "PKIX_ValidateResult_GetTrustAnchor");
    415        PKIX_NULLCHECK_TWO(result, pTrustAnchor);
    416 
    417        PKIX_INCREF(result->anchor);
    418        *pTrustAnchor = result->anchor;
    419 
    420 cleanup:
    421        PKIX_RETURN(VALIDATERESULT);
    422 }
    423 
    424 /*
    425 * FUNCTION: PKIX_ValidateResult_GetPolicyTree
    426 *      (see comments in pkix_result.h)
    427 */
    428 PKIX_Error *
    429 PKIX_ValidateResult_GetPolicyTree(
    430        PKIX_ValidateResult *result,
    431        PKIX_PolicyNode **pPolicyTree,
    432        void *plContext)
    433 {
    434        PKIX_ENTER(VALIDATERESULT, "PKIX_ValidateResult_GetPolicyTree");
    435        PKIX_NULLCHECK_TWO(result, pPolicyTree);
    436 
    437        PKIX_INCREF(result->policyTree);
    438        (*pPolicyTree) = result->policyTree;
    439 
    440 cleanup:
    441        PKIX_RETURN(VALIDATERESULT);
    442 }