security/nss/lib/libpkix/pkix/results/pkix_buildresult.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rwxr-xr-x

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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  */
    11 #include "pkix_buildresult.h"
    13 /* --Private-Functions-------------------------------------------- */
    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;
    26         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Destroy");
    27         PKIX_NULLCHECK_ONE(object);
    29         /* Check that this object is a build result object */
    30         PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
    31                     PKIX_OBJECTNOTBUILDRESULT);
    33         result = (PKIX_BuildResult *)object;
    35         PKIX_DECREF(result->valResult);
    36         PKIX_DECREF(result->certChain);
    38 cleanup:
    40         PKIX_RETURN(BUILDRESULT);
    41 }
    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;
    59         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Equals");
    60         PKIX_NULLCHECK_THREE(first, second, pResult);
    62         PKIX_CHECK(pkix_CheckType(first, PKIX_BUILDRESULT_TYPE, plContext),
    63                     PKIX_FIRSTOBJECTNOTBUILDRESULT);
    65         PKIX_CHECK(PKIX_PL_Object_GetType(second, &secondType, plContext),
    66                     PKIX_COULDNOTGETTYPEOFSECONDARGUMENT);
    68         *pResult = PKIX_FALSE;
    70         if (secondType != PKIX_BUILDRESULT_TYPE) goto cleanup;
    72         firstBuildResult = (PKIX_BuildResult *)first;
    73         secondBuildResult = (PKIX_BuildResult *)second;
    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);
    82         if (!cmpResult) goto cleanup;
    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);
    91         if (!cmpResult) goto cleanup;
    93         /*
    94          * The remaining case is that both are null,
    95          * which we consider equality.
    96          *      cmpResult = PKIX_TRUE;
    97          */
    99         *pResult = cmpResult;
   101 cleanup:
   103         PKIX_RETURN(BUILDRESULT);
   104 }
   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;
   121         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Hashcode");
   122         PKIX_NULLCHECK_TWO(object, pHashcode);
   124         PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
   125                     PKIX_OBJECTNOTBUILDRESULT);
   127         buildResult = (PKIX_BuildResult*)object;
   129         PKIX_CHECK(PKIX_PL_Object_Hashcode
   130                     ((PKIX_PL_Object *)buildResult->valResult,
   131                     &valResultHash,
   132                     plContext),
   133                     PKIX_OBJECTHASHCODEFAILED);
   135         PKIX_CHECK(PKIX_PL_Object_Hashcode
   136                     ((PKIX_PL_Object *)buildResult->certChain,
   137                     &certChainHash,
   138                     plContext),
   139                     PKIX_OBJECTHASHCODEFAILED);
   141         hash = 31*(31 * valResultHash + certChainHash);
   143         *pHashcode = hash;
   145 cleanup:
   147         PKIX_RETURN(BUILDRESULT);
   148 }
   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;
   164         PKIX_ValidateResult *valResult = NULL;
   165         PKIX_List *certChain = NULL;
   167         PKIX_PL_String *valResultString = NULL;
   168         PKIX_PL_String *certChainString = NULL;
   170         char *asciiFormat =
   171                 "[\n"
   172                 "\tValidateResult: \t\t%s"
   173                 "\tCertChain:    \t\t%s\n"
   174                 "]\n";
   176         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_ToString");
   177         PKIX_NULLCHECK_TWO(object, pString);
   179         PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext),
   180                 PKIX_OBJECTNOTBUILDRESULT);
   182         buildResult = (PKIX_BuildResult*)object;
   184         valResult = buildResult->valResult;
   186         PKIX_CHECK(PKIX_PL_String_Create
   187                 (PKIX_ESCASCII, asciiFormat, 0, &formatString, plContext),
   188                 PKIX_STRINGCREATEFAILED);
   190         PKIX_CHECK(PKIX_PL_Object_ToString
   191                 ((PKIX_PL_Object *)valResult, &valResultString, plContext),
   192                 PKIX_OBJECTTOSTRINGFAILED);
   194         certChain = buildResult->certChain;
   196         PKIX_CHECK(PKIX_PL_Object_ToString
   197                 ((PKIX_PL_Object *)certChain, &certChainString, plContext),
   198                 PKIX_OBJECTTOSTRINGFAILED);
   200         PKIX_CHECK(PKIX_PL_Sprintf
   201                 (&buildResultString,
   202                 plContext,
   203                 formatString,
   204                 valResultString,
   205                 certChainString),
   206                 PKIX_SPRINTFFAILED);
   208         *pString = buildResultString;
   210 cleanup:
   212         PKIX_DECREF(formatString);
   213         PKIX_DECREF(valResultString);
   214         PKIX_DECREF(certChainString);
   216         PKIX_RETURN(BUILDRESULT);
   217 }
   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 {
   235         extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
   236         pkix_ClassTable_Entry entry;
   238         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_RegisterSelf");
   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;
   250         systemClasses[PKIX_BUILDRESULT_TYPE] = entry;
   252         PKIX_RETURN(BUILDRESULT);
   253 }
   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;
   287         PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Create");
   288         PKIX_NULLCHECK_THREE(valResult, certChain, pResult);
   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);
   297         /* initialize fields */
   299         PKIX_INCREF(valResult);
   300         result->valResult = valResult;
   302         PKIX_INCREF(certChain);
   303         result->certChain = certChain;
   305         PKIX_CHECK(PKIX_List_SetImmutable(result->certChain, plContext),
   306                      PKIX_LISTSETIMMUTABLEFAILED);
   308         *pResult = result;
   309         result = NULL;
   311 cleanup:
   313         PKIX_DECREF(result);
   315         PKIX_RETURN(BUILDRESULT);
   317 }
   319 /* --Public-Functions--------------------------------------------- */
   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);
   335         PKIX_INCREF(result->valResult);
   336         *pResult = result->valResult;
   338 cleanup:
   339         PKIX_RETURN(BUILDRESULT);
   340 }
   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);
   357         PKIX_INCREF(result->certChain);
   358         *pChain = result->certChain;
   360 cleanup:
   361         PKIX_RETURN(BUILDRESULT);
   362 }

mercurial