| OLD | NEW |
| (Empty) |
| 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 } | |
| OLD | NEW |