1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/libpkix/pkix/results/pkix_buildresult.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,362 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 +/* 1.8 + * pkix_buildresult.c 1.9 + * 1.10 + * BuildResult Object Functions 1.11 + * 1.12 + */ 1.13 + 1.14 +#include "pkix_buildresult.h" 1.15 + 1.16 +/* --Private-Functions-------------------------------------------- */ 1.17 + 1.18 +/* 1.19 + * FUNCTION: pkix_BuildResult_Destroy 1.20 + * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) 1.21 + */ 1.22 +static PKIX_Error * 1.23 +pkix_BuildResult_Destroy( 1.24 + PKIX_PL_Object *object, 1.25 + void *plContext) 1.26 +{ 1.27 + PKIX_BuildResult *result = NULL; 1.28 + 1.29 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Destroy"); 1.30 + PKIX_NULLCHECK_ONE(object); 1.31 + 1.32 + /* Check that this object is a build result object */ 1.33 + PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext), 1.34 + PKIX_OBJECTNOTBUILDRESULT); 1.35 + 1.36 + result = (PKIX_BuildResult *)object; 1.37 + 1.38 + PKIX_DECREF(result->valResult); 1.39 + PKIX_DECREF(result->certChain); 1.40 + 1.41 +cleanup: 1.42 + 1.43 + PKIX_RETURN(BUILDRESULT); 1.44 +} 1.45 + 1.46 +/* 1.47 + * FUNCTION: pkix_BuildResult_Equals 1.48 + * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h) 1.49 + */ 1.50 +static PKIX_Error * 1.51 +pkix_BuildResult_Equals( 1.52 + PKIX_PL_Object *first, 1.53 + PKIX_PL_Object *second, 1.54 + PKIX_Boolean *pResult, 1.55 + void *plContext) 1.56 +{ 1.57 + PKIX_UInt32 secondType; 1.58 + PKIX_Boolean cmpResult; 1.59 + PKIX_BuildResult *firstBuildResult = NULL; 1.60 + PKIX_BuildResult *secondBuildResult = NULL; 1.61 + 1.62 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Equals"); 1.63 + PKIX_NULLCHECK_THREE(first, second, pResult); 1.64 + 1.65 + PKIX_CHECK(pkix_CheckType(first, PKIX_BUILDRESULT_TYPE, plContext), 1.66 + PKIX_FIRSTOBJECTNOTBUILDRESULT); 1.67 + 1.68 + PKIX_CHECK(PKIX_PL_Object_GetType(second, &secondType, plContext), 1.69 + PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); 1.70 + 1.71 + *pResult = PKIX_FALSE; 1.72 + 1.73 + if (secondType != PKIX_BUILDRESULT_TYPE) goto cleanup; 1.74 + 1.75 + firstBuildResult = (PKIX_BuildResult *)first; 1.76 + secondBuildResult = (PKIX_BuildResult *)second; 1.77 + 1.78 + PKIX_CHECK(PKIX_PL_Object_Equals 1.79 + ((PKIX_PL_Object *)firstBuildResult->valResult, 1.80 + (PKIX_PL_Object *)secondBuildResult->valResult, 1.81 + &cmpResult, 1.82 + plContext), 1.83 + PKIX_OBJECTEQUALSFAILED); 1.84 + 1.85 + if (!cmpResult) goto cleanup; 1.86 + 1.87 + PKIX_CHECK(PKIX_PL_Object_Equals 1.88 + ((PKIX_PL_Object *)firstBuildResult->certChain, 1.89 + (PKIX_PL_Object *)secondBuildResult->certChain, 1.90 + &cmpResult, 1.91 + plContext), 1.92 + PKIX_OBJECTEQUALSFAILED); 1.93 + 1.94 + if (!cmpResult) goto cleanup; 1.95 + 1.96 + /* 1.97 + * The remaining case is that both are null, 1.98 + * which we consider equality. 1.99 + * cmpResult = PKIX_TRUE; 1.100 + */ 1.101 + 1.102 + *pResult = cmpResult; 1.103 + 1.104 +cleanup: 1.105 + 1.106 + PKIX_RETURN(BUILDRESULT); 1.107 +} 1.108 + 1.109 +/* 1.110 + * FUNCTION: pkix_BuildResult_Hashcode 1.111 + * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) 1.112 + */ 1.113 +static PKIX_Error * 1.114 +pkix_BuildResult_Hashcode( 1.115 + PKIX_PL_Object *object, 1.116 + PKIX_UInt32 *pHashcode, 1.117 + void *plContext) 1.118 +{ 1.119 + PKIX_BuildResult *buildResult = NULL; 1.120 + PKIX_UInt32 hash = 0; 1.121 + PKIX_UInt32 valResultHash = 0; 1.122 + PKIX_UInt32 certChainHash = 0; 1.123 + 1.124 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Hashcode"); 1.125 + PKIX_NULLCHECK_TWO(object, pHashcode); 1.126 + 1.127 + PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext), 1.128 + PKIX_OBJECTNOTBUILDRESULT); 1.129 + 1.130 + buildResult = (PKIX_BuildResult*)object; 1.131 + 1.132 + PKIX_CHECK(PKIX_PL_Object_Hashcode 1.133 + ((PKIX_PL_Object *)buildResult->valResult, 1.134 + &valResultHash, 1.135 + plContext), 1.136 + PKIX_OBJECTHASHCODEFAILED); 1.137 + 1.138 + PKIX_CHECK(PKIX_PL_Object_Hashcode 1.139 + ((PKIX_PL_Object *)buildResult->certChain, 1.140 + &certChainHash, 1.141 + plContext), 1.142 + PKIX_OBJECTHASHCODEFAILED); 1.143 + 1.144 + hash = 31*(31 * valResultHash + certChainHash); 1.145 + 1.146 + *pHashcode = hash; 1.147 + 1.148 +cleanup: 1.149 + 1.150 + PKIX_RETURN(BUILDRESULT); 1.151 +} 1.152 + 1.153 +/* 1.154 + * FUNCTION: pkix_BuildResult_ToString 1.155 + * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) 1.156 + */ 1.157 +static PKIX_Error * 1.158 +pkix_BuildResult_ToString( 1.159 + PKIX_PL_Object *object, 1.160 + PKIX_PL_String **pString, 1.161 + void *plContext) 1.162 +{ 1.163 + PKIX_BuildResult *buildResult = NULL; 1.164 + PKIX_PL_String *formatString = NULL; 1.165 + PKIX_PL_String *buildResultString = NULL; 1.166 + 1.167 + PKIX_ValidateResult *valResult = NULL; 1.168 + PKIX_List *certChain = NULL; 1.169 + 1.170 + PKIX_PL_String *valResultString = NULL; 1.171 + PKIX_PL_String *certChainString = NULL; 1.172 + 1.173 + char *asciiFormat = 1.174 + "[\n" 1.175 + "\tValidateResult: \t\t%s" 1.176 + "\tCertChain: \t\t%s\n" 1.177 + "]\n"; 1.178 + 1.179 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_ToString"); 1.180 + PKIX_NULLCHECK_TWO(object, pString); 1.181 + 1.182 + PKIX_CHECK(pkix_CheckType(object, PKIX_BUILDRESULT_TYPE, plContext), 1.183 + PKIX_OBJECTNOTBUILDRESULT); 1.184 + 1.185 + buildResult = (PKIX_BuildResult*)object; 1.186 + 1.187 + valResult = buildResult->valResult; 1.188 + 1.189 + PKIX_CHECK(PKIX_PL_String_Create 1.190 + (PKIX_ESCASCII, asciiFormat, 0, &formatString, plContext), 1.191 + PKIX_STRINGCREATEFAILED); 1.192 + 1.193 + PKIX_CHECK(PKIX_PL_Object_ToString 1.194 + ((PKIX_PL_Object *)valResult, &valResultString, plContext), 1.195 + PKIX_OBJECTTOSTRINGFAILED); 1.196 + 1.197 + certChain = buildResult->certChain; 1.198 + 1.199 + PKIX_CHECK(PKIX_PL_Object_ToString 1.200 + ((PKIX_PL_Object *)certChain, &certChainString, plContext), 1.201 + PKIX_OBJECTTOSTRINGFAILED); 1.202 + 1.203 + PKIX_CHECK(PKIX_PL_Sprintf 1.204 + (&buildResultString, 1.205 + plContext, 1.206 + formatString, 1.207 + valResultString, 1.208 + certChainString), 1.209 + PKIX_SPRINTFFAILED); 1.210 + 1.211 + *pString = buildResultString; 1.212 + 1.213 +cleanup: 1.214 + 1.215 + PKIX_DECREF(formatString); 1.216 + PKIX_DECREF(valResultString); 1.217 + PKIX_DECREF(certChainString); 1.218 + 1.219 + PKIX_RETURN(BUILDRESULT); 1.220 +} 1.221 + 1.222 +/* 1.223 + * FUNCTION: pkix_BuildResult_RegisterSelf 1.224 + * DESCRIPTION: 1.225 + * Registers PKIX_BUILDRESULT_TYPE and its related functions with 1.226 + * systemClasses[] 1.227 + * THREAD SAFETY: 1.228 + * Not Thread Safe - for performance and complexity reasons 1.229 + * 1.230 + * Since this function is only called by PKIX_PL_Initialize, which should 1.231 + * only be called once, it is acceptable that this function is not 1.232 + * thread-safe. 1.233 + */ 1.234 +PKIX_Error * 1.235 +pkix_BuildResult_RegisterSelf(void *plContext) 1.236 +{ 1.237 + 1.238 + extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; 1.239 + pkix_ClassTable_Entry entry; 1.240 + 1.241 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_RegisterSelf"); 1.242 + 1.243 + entry.description = "BuildResult"; 1.244 + entry.objCounter = 0; 1.245 + entry.typeObjectSize = sizeof(PKIX_BuildResult); 1.246 + entry.destructor = pkix_BuildResult_Destroy; 1.247 + entry.equalsFunction = pkix_BuildResult_Equals; 1.248 + entry.hashcodeFunction = pkix_BuildResult_Hashcode; 1.249 + entry.toStringFunction = pkix_BuildResult_ToString; 1.250 + entry.comparator = NULL; 1.251 + entry.duplicateFunction = pkix_duplicateImmutable; 1.252 + 1.253 + systemClasses[PKIX_BUILDRESULT_TYPE] = entry; 1.254 + 1.255 + PKIX_RETURN(BUILDRESULT); 1.256 +} 1.257 + 1.258 +/* 1.259 + * FUNCTION: pkix_BuildResult_Create 1.260 + * DESCRIPTION: 1.261 + * 1.262 + * Creates a new BuildResult Object using the ValidateResult pointed to by 1.263 + * "valResult" and the List pointed to by "certChain", and stores it at 1.264 + * "pResult". 1.265 + * 1.266 + * PARAMETERS 1.267 + * "valResult" 1.268 + * Address of ValidateResult component. Must be non-NULL. 1.269 + * "certChain 1.270 + * Address of List component. Must be non-NULL. 1.271 + * "pResult" 1.272 + * Address where object pointer will be stored. Must be non-NULL. 1.273 + * "plContext" 1.274 + * Platform-specific context pointer. 1.275 + * THREAD SAFETY: 1.276 + * Thread Safe (see Thread Safety Definitions in Programmer's Guide) 1.277 + * RETURNS: 1.278 + * Returns NULL if the function succeeds. 1.279 + * Returns a Fatal Error if the function fails in an unrecoverable way. 1.280 + */ 1.281 +PKIX_Error * 1.282 +pkix_BuildResult_Create( 1.283 + PKIX_ValidateResult *valResult, 1.284 + PKIX_List *certChain, 1.285 + PKIX_BuildResult **pResult, 1.286 + void *plContext) 1.287 +{ 1.288 + PKIX_BuildResult *result = NULL; 1.289 + 1.290 + PKIX_ENTER(BUILDRESULT, "pkix_BuildResult_Create"); 1.291 + PKIX_NULLCHECK_THREE(valResult, certChain, pResult); 1.292 + 1.293 + PKIX_CHECK(PKIX_PL_Object_Alloc 1.294 + (PKIX_BUILDRESULT_TYPE, 1.295 + sizeof (PKIX_BuildResult), 1.296 + (PKIX_PL_Object **)&result, 1.297 + plContext), 1.298 + PKIX_COULDNOTCREATEBUILDRESULTOBJECT); 1.299 + 1.300 + /* initialize fields */ 1.301 + 1.302 + PKIX_INCREF(valResult); 1.303 + result->valResult = valResult; 1.304 + 1.305 + PKIX_INCREF(certChain); 1.306 + result->certChain = certChain; 1.307 + 1.308 + PKIX_CHECK(PKIX_List_SetImmutable(result->certChain, plContext), 1.309 + PKIX_LISTSETIMMUTABLEFAILED); 1.310 + 1.311 + *pResult = result; 1.312 + result = NULL; 1.313 + 1.314 +cleanup: 1.315 + 1.316 + PKIX_DECREF(result); 1.317 + 1.318 + PKIX_RETURN(BUILDRESULT); 1.319 + 1.320 +} 1.321 + 1.322 +/* --Public-Functions--------------------------------------------- */ 1.323 + 1.324 + 1.325 +/* 1.326 + * FUNCTION: PKIX_BuildResult_GetValidateResult 1.327 + * (see comments in pkix_result.h) 1.328 + */ 1.329 +PKIX_Error * 1.330 +PKIX_BuildResult_GetValidateResult( 1.331 + PKIX_BuildResult *result, 1.332 + PKIX_ValidateResult **pResult, 1.333 + void *plContext) 1.334 +{ 1.335 + PKIX_ENTER(BUILDRESULT, "PKIX_BuildResult_GetValidateResult"); 1.336 + PKIX_NULLCHECK_TWO(result, pResult); 1.337 + 1.338 + PKIX_INCREF(result->valResult); 1.339 + *pResult = result->valResult; 1.340 + 1.341 +cleanup: 1.342 + PKIX_RETURN(BUILDRESULT); 1.343 +} 1.344 + 1.345 + 1.346 + 1.347 +/* 1.348 + * FUNCTION: PKIX_BuildResult_GetCertChain 1.349 + * (see comments in pkix_result.h) 1.350 + */ 1.351 +PKIX_Error * 1.352 +PKIX_BuildResult_GetCertChain( 1.353 + PKIX_BuildResult *result, 1.354 + PKIX_List **pChain, 1.355 + void *plContext) 1.356 +{ 1.357 + PKIX_ENTER(BUILDRESULT, "PKIX_BuildResult_GetCertChain"); 1.358 + PKIX_NULLCHECK_TWO(result, pChain); 1.359 + 1.360 + PKIX_INCREF(result->certChain); 1.361 + *pChain = result->certChain; 1.362 + 1.363 +cleanup: 1.364 + PKIX_RETURN(BUILDRESULT); 1.365 +}