| 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_pl_certpolicymap.c | |
| 6 * | |
| 7 * CertPolicyMap Type Functions | |
| 8 * | |
| 9 */ | |
| 10 | |
| 11 #include "pkix_pl_certpolicymap.h" | |
| 12 | |
| 13 /* | |
| 14 * FUNCTION: pkix_pl_CertPolicyMap_Create | |
| 15 * DESCRIPTION: | |
| 16 * | |
| 17 * Creates a new CertPolicyMap Object pairing the OID given by | |
| 18 * "issuerDomainPolicy" with the OID given by "subjectDomainPolicy", and | |
| 19 * stores the result at "pCertPolicyMap". | |
| 20 * | |
| 21 * PARAMETERS | |
| 22 * "issuerDomainPolicy" | |
| 23 * Address of the OID of the IssuerDomainPolicy. Must be non-NULL. | |
| 24 * "subjectDomainPolicy" | |
| 25 * Address of the OID of the SubjectDomainPolicy. Must be non-NULL. | |
| 26 * "pCertPolicyMap" | |
| 27 * Address where CertPolicyMap pointer will be stored. Must be non-NULL. | |
| 28 * "plContext" | |
| 29 * Platform-specific context pointer. | |
| 30 * THREAD SAFETY: | |
| 31 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) | |
| 32 * RETURNS: | |
| 33 * Returns NULL if the function succeeds. | |
| 34 * Returns a CertPolicyMap Error if the function fails in a non-fatal way. | |
| 35 * Returns a Fatal Error if the function fails in an unrecoverable way. | |
| 36 */ | |
| 37 PKIX_Error * | |
| 38 pkix_pl_CertPolicyMap_Create( | |
| 39 PKIX_PL_OID *issuerDomainPolicy, | |
| 40 PKIX_PL_OID *subjectDomainPolicy, | |
| 41 PKIX_PL_CertPolicyMap **pCertPolicyMap, | |
| 42 void *plContext) | |
| 43 { | |
| 44 PKIX_PL_CertPolicyMap *policyMap = NULL; | |
| 45 | |
| 46 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_Create"); | |
| 47 | |
| 48 PKIX_NULLCHECK_THREE | |
| 49 (issuerDomainPolicy, subjectDomainPolicy, pCertPolicyMap); | |
| 50 | |
| 51 PKIX_CHECK(PKIX_PL_Object_Alloc | |
| 52 (PKIX_CERTPOLICYMAP_TYPE, | |
| 53 sizeof (PKIX_PL_CertPolicyMap), | |
| 54 (PKIX_PL_Object **)&policyMap, | |
| 55 plContext), | |
| 56 PKIX_COULDNOTCREATECERTPOLICYMAPOBJECT); | |
| 57 | |
| 58 PKIX_INCREF(issuerDomainPolicy); | |
| 59 policyMap->issuerDomainPolicy = issuerDomainPolicy; | |
| 60 | |
| 61 PKIX_INCREF(subjectDomainPolicy); | |
| 62 policyMap->subjectDomainPolicy = subjectDomainPolicy; | |
| 63 | |
| 64 *pCertPolicyMap = policyMap; | |
| 65 policyMap = NULL; | |
| 66 | |
| 67 cleanup: | |
| 68 PKIX_DECREF(policyMap); | |
| 69 | |
| 70 PKIX_RETURN(CERTPOLICYMAP); | |
| 71 } | |
| 72 | |
| 73 /* | |
| 74 * FUNCTION: pkix_pl_CertPolicyMap_Destroy | |
| 75 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) | |
| 76 */ | |
| 77 static PKIX_Error * | |
| 78 pkix_pl_CertPolicyMap_Destroy( | |
| 79 PKIX_PL_Object *object, | |
| 80 void *plContext) | |
| 81 { | |
| 82 PKIX_PL_CertPolicyMap *certMap = NULL; | |
| 83 | |
| 84 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_Destroy"); | |
| 85 | |
| 86 PKIX_NULLCHECK_ONE(object); | |
| 87 | |
| 88 PKIX_CHECK(pkix_CheckType(object, PKIX_CERTPOLICYMAP_TYPE, plContext), | |
| 89 PKIX_OBJECTNOTCERTPOLICYMAP); | |
| 90 | |
| 91 certMap = (PKIX_PL_CertPolicyMap*)object; | |
| 92 | |
| 93 PKIX_DECREF(certMap->issuerDomainPolicy); | |
| 94 PKIX_DECREF(certMap->subjectDomainPolicy); | |
| 95 | |
| 96 cleanup: | |
| 97 | |
| 98 PKIX_RETURN(CERTPOLICYMAP); | |
| 99 } | |
| 100 | |
| 101 /* | |
| 102 * FUNCTION: pkix_pl_CertPolicyMap_ToString | |
| 103 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) | |
| 104 */ | |
| 105 static PKIX_Error * | |
| 106 pkix_pl_CertPolicyMap_ToString( | |
| 107 PKIX_PL_Object *object, | |
| 108 PKIX_PL_String **pString, | |
| 109 void *plContext) | |
| 110 { | |
| 111 PKIX_PL_CertPolicyMap *certMap = NULL; | |
| 112 PKIX_PL_String *format = NULL; | |
| 113 PKIX_PL_String *outString = NULL; | |
| 114 PKIX_PL_String *issuerString = NULL; | |
| 115 PKIX_PL_String *subjectString = NULL; | |
| 116 | |
| 117 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_ToString"); | |
| 118 | |
| 119 PKIX_NULLCHECK_TWO(object, pString); | |
| 120 | |
| 121 PKIX_CHECK(pkix_CheckType(object, PKIX_CERTPOLICYMAP_TYPE, plContext), | |
| 122 PKIX_OBJECTNOTCERTPOLICYMAP); | |
| 123 | |
| 124 certMap = (PKIX_PL_CertPolicyMap *)object; | |
| 125 | |
| 126 PKIX_TOSTRING | |
| 127 (certMap->issuerDomainPolicy, | |
| 128 &issuerString, | |
| 129 plContext, | |
| 130 PKIX_OBJECTTOSTRINGFAILED); | |
| 131 | |
| 132 PKIX_TOSTRING | |
| 133 (certMap->subjectDomainPolicy, | |
| 134 &subjectString, | |
| 135 plContext, | |
| 136 PKIX_OBJECTTOSTRINGFAILED); | |
| 137 | |
| 138 /* Put them together in the form issuerPolicy=>subjectPolicy */ | |
| 139 PKIX_CHECK(PKIX_PL_String_Create | |
| 140 (PKIX_ESCASCII, "%s=>%s", 0, &format, plContext), | |
| 141 PKIX_ERRORINSTRINGCREATE); | |
| 142 | |
| 143 PKIX_CHECK(PKIX_PL_Sprintf | |
| 144 (&outString, plContext, format, issuerString, subjectString), | |
| 145 PKIX_ERRORINSPRINTF); | |
| 146 | |
| 147 *pString = outString; | |
| 148 | |
| 149 cleanup: | |
| 150 PKIX_DECREF(format); | |
| 151 PKIX_DECREF(issuerString); | |
| 152 PKIX_DECREF(subjectString); | |
| 153 | |
| 154 PKIX_RETURN(CERTPOLICYMAP); | |
| 155 } | |
| 156 | |
| 157 /* | |
| 158 * FUNCTION: pkix_pl_CertPolicyMap_Hashcode | |
| 159 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) | |
| 160 */ | |
| 161 static PKIX_Error * | |
| 162 pkix_pl_CertPolicyMap_Hashcode( | |
| 163 PKIX_PL_Object *object, | |
| 164 PKIX_UInt32 *pHashcode, | |
| 165 void *plContext) | |
| 166 { | |
| 167 PKIX_UInt32 issuerHash = 0; | |
| 168 PKIX_UInt32 subjectHash = 0; | |
| 169 PKIX_PL_CertPolicyMap *certMap = NULL; | |
| 170 | |
| 171 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_Hashcode"); | |
| 172 | |
| 173 PKIX_NULLCHECK_TWO(object, pHashcode); | |
| 174 | |
| 175 PKIX_CHECK(pkix_CheckType(object, PKIX_CERTPOLICYMAP_TYPE, plContext), | |
| 176 PKIX_OBJECTNOTCERTPOLICYMAP); | |
| 177 | |
| 178 certMap = (PKIX_PL_CertPolicyMap *)object; | |
| 179 | |
| 180 PKIX_HASHCODE | |
| 181 (certMap->issuerDomainPolicy, | |
| 182 &issuerHash, | |
| 183 plContext, | |
| 184 PKIX_OBJECTHASHCODEFAILED); | |
| 185 | |
| 186 PKIX_HASHCODE | |
| 187 (certMap->subjectDomainPolicy, | |
| 188 &subjectHash, | |
| 189 plContext, | |
| 190 PKIX_OBJECTHASHCODEFAILED); | |
| 191 | |
| 192 *pHashcode = issuerHash*31 + subjectHash; | |
| 193 | |
| 194 cleanup: | |
| 195 | |
| 196 PKIX_RETURN(CERTPOLICYMAP); | |
| 197 } | |
| 198 | |
| 199 /* | |
| 200 * FUNCTION: pkix_pl_CertPolicyMap_Equals | |
| 201 * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h) | |
| 202 */ | |
| 203 static PKIX_Error * | |
| 204 pkix_pl_CertPolicyMap_Equals( | |
| 205 PKIX_PL_Object *firstObject, | |
| 206 PKIX_PL_Object *secondObject, | |
| 207 PKIX_Boolean *pResult, | |
| 208 void *plContext) | |
| 209 { | |
| 210 PKIX_PL_CertPolicyMap *firstCertMap = NULL; | |
| 211 PKIX_PL_CertPolicyMap *secondCertMap = NULL; | |
| 212 PKIX_UInt32 secondType = 0; | |
| 213 PKIX_Boolean compare = PKIX_FALSE; | |
| 214 | |
| 215 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_Equals"); | |
| 216 PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); | |
| 217 | |
| 218 /* test that firstObject is a CertPolicyMap */ | |
| 219 PKIX_CHECK(pkix_CheckType | |
| 220 (firstObject, PKIX_CERTPOLICYMAP_TYPE, plContext), | |
| 221 PKIX_FIRSTOBJECTNOTCERTPOLICYMAP); | |
| 222 | |
| 223 /* | |
| 224 * Since we know firstObject is a CertPolicyMap, | |
| 225 * if both references are identical, they must be equal | |
| 226 */ | |
| 227 if (firstObject == secondObject){ | |
| 228 *pResult = PKIX_TRUE; | |
| 229 goto cleanup; | |
| 230 } | |
| 231 | |
| 232 /* | |
| 233 * If secondObject isn't a CertPolicyMap, we | |
| 234 * don't throw an error. We simply return FALSE. | |
| 235 */ | |
| 236 PKIX_CHECK(PKIX_PL_Object_GetType | |
| 237 (secondObject, &secondType, plContext), | |
| 238 PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); | |
| 239 if (secondType != PKIX_CERTPOLICYMAP_TYPE) { | |
| 240 *pResult = PKIX_FALSE; | |
| 241 goto cleanup; | |
| 242 } | |
| 243 | |
| 244 firstCertMap = (PKIX_PL_CertPolicyMap *)firstObject; | |
| 245 secondCertMap = (PKIX_PL_CertPolicyMap *)secondObject; | |
| 246 | |
| 247 PKIX_EQUALS | |
| 248 (firstCertMap->issuerDomainPolicy, | |
| 249 secondCertMap->issuerDomainPolicy, | |
| 250 &compare, | |
| 251 plContext, | |
| 252 PKIX_OBJECTEQUALSFAILED); | |
| 253 | |
| 254 if (compare) { | |
| 255 PKIX_EQUALS | |
| 256 (firstCertMap->subjectDomainPolicy, | |
| 257 secondCertMap->subjectDomainPolicy, | |
| 258 &compare, | |
| 259 plContext, | |
| 260 PKIX_OBJECTEQUALSFAILED); | |
| 261 } | |
| 262 | |
| 263 *pResult = compare; | |
| 264 | |
| 265 cleanup: | |
| 266 | |
| 267 PKIX_RETURN(CERTPOLICYMAP); | |
| 268 } | |
| 269 | |
| 270 /* | |
| 271 * FUNCTION: pkix_pl_CertPolicyMap_Duplicate | |
| 272 * (see comments for PKIX_PL_Duplicate_Callback in pkix_pl_system.h) | |
| 273 */ | |
| 274 static PKIX_Error * | |
| 275 pkix_pl_CertPolicyMap_Duplicate( | |
| 276 PKIX_PL_Object *object, | |
| 277 PKIX_PL_Object **pNewObject, | |
| 278 void *plContext) | |
| 279 { | |
| 280 PKIX_PL_CertPolicyMap *original = NULL; | |
| 281 PKIX_PL_CertPolicyMap *copy = NULL; | |
| 282 | |
| 283 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_Duplicate"); | |
| 284 | |
| 285 PKIX_NULLCHECK_TWO(object, pNewObject); | |
| 286 | |
| 287 PKIX_CHECK(pkix_CheckType | |
| 288 (object, PKIX_CERTPOLICYMAP_TYPE, plContext), | |
| 289 PKIX_OBJECTARGUMENTNOTPOLICYMAP); | |
| 290 | |
| 291 original = (PKIX_PL_CertPolicyMap *)object; | |
| 292 | |
| 293 PKIX_CHECK(pkix_pl_CertPolicyMap_Create | |
| 294 (original->issuerDomainPolicy, | |
| 295 original->subjectDomainPolicy, | |
| 296 ©, | |
| 297 plContext), | |
| 298 PKIX_CERTPOLICYMAPCREATEFAILED); | |
| 299 | |
| 300 *pNewObject = (PKIX_PL_Object *)copy; | |
| 301 | |
| 302 cleanup: | |
| 303 | |
| 304 PKIX_RETURN(CERTPOLICYMAP); | |
| 305 } | |
| 306 | |
| 307 /* | |
| 308 * FUNCTION: pkix_pl_CertPolicyMap_RegisterSelf | |
| 309 * DESCRIPTION: | |
| 310 * Registers PKIX_CERTPOLICYMAP_TYPE and its related | |
| 311 * functions with systemClasses[] | |
| 312 * THREAD SAFETY: | |
| 313 * Not Thread Safe - for performance and complexity reasons | |
| 314 * | |
| 315 * Since this function is only called by PKIX_PL_Initialize, | |
| 316 * which should only be called once, it is acceptable that | |
| 317 * this function is not thread-safe. | |
| 318 */ | |
| 319 PKIX_Error * | |
| 320 pkix_pl_CertPolicyMap_RegisterSelf(void *plContext) | |
| 321 { | |
| 322 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; | |
| 323 pkix_ClassTable_Entry entry; | |
| 324 | |
| 325 PKIX_ENTER(CERTPOLICYMAP, "pkix_pl_CertPolicyMap_RegisterSelf"); | |
| 326 | |
| 327 entry.description = "CertPolicyMap"; | |
| 328 entry.objCounter = 0; | |
| 329 entry.typeObjectSize = sizeof(PKIX_PL_CertPolicyMap); | |
| 330 entry.destructor = pkix_pl_CertPolicyMap_Destroy; | |
| 331 entry.equalsFunction = pkix_pl_CertPolicyMap_Equals; | |
| 332 entry.hashcodeFunction = pkix_pl_CertPolicyMap_Hashcode; | |
| 333 entry.toStringFunction = pkix_pl_CertPolicyMap_ToString; | |
| 334 entry.comparator = NULL; | |
| 335 entry.duplicateFunction = pkix_pl_CertPolicyMap_Duplicate; | |
| 336 | |
| 337 systemClasses[PKIX_CERTPOLICYMAP_TYPE] = entry; | |
| 338 | |
| 339 PKIX_RETURN(CERTPOLICYMAP); | |
| 340 } | |
| 341 | |
| 342 /* --Public-CertPolicyMap-Functions------------------------- */ | |
| 343 | |
| 344 /* | |
| 345 * FUNCTION: PKIX_PL_CertPolicyMap_GetIssuerDomainPolicy | |
| 346 * (see comments in pkix_pl_pki.h) | |
| 347 */ | |
| 348 PKIX_Error * | |
| 349 PKIX_PL_CertPolicyMap_GetIssuerDomainPolicy( | |
| 350 PKIX_PL_CertPolicyMap *policyMapping, | |
| 351 PKIX_PL_OID **pIssuerDomainPolicy, | |
| 352 void *plContext) | |
| 353 { | |
| 354 PKIX_ENTER | |
| 355 (CERTPOLICYMAP, "PKIX_PL_CertPolicyMap_GetIssuerDomainPolicy"); | |
| 356 | |
| 357 PKIX_NULLCHECK_TWO(policyMapping, pIssuerDomainPolicy); | |
| 358 | |
| 359 PKIX_INCREF(policyMapping->issuerDomainPolicy); | |
| 360 *pIssuerDomainPolicy = policyMapping->issuerDomainPolicy; | |
| 361 | |
| 362 cleanup: | |
| 363 PKIX_RETURN(CERTPOLICYMAP); | |
| 364 } | |
| 365 | |
| 366 /* | |
| 367 * FUNCTION: PKIX_PL_CertPolicyMap_GetSubjectDomainPolicy | |
| 368 * (see comments in pkix_pl_pki.h) | |
| 369 */ | |
| 370 PKIX_Error * | |
| 371 PKIX_PL_CertPolicyMap_GetSubjectDomainPolicy( | |
| 372 PKIX_PL_CertPolicyMap *policyMapping, | |
| 373 PKIX_PL_OID **pSubjectDomainPolicy, | |
| 374 void *plContext) | |
| 375 { | |
| 376 PKIX_ENTER | |
| 377 (CERTPOLICYMAP, "PKIX_PL_CertPolicyMap_GetSubjectDomainPolicy"); | |
| 378 | |
| 379 PKIX_NULLCHECK_TWO(policyMapping, pSubjectDomainPolicy); | |
| 380 | |
| 381 PKIX_INCREF(policyMapping->subjectDomainPolicy); | |
| 382 *pSubjectDomainPolicy = policyMapping->subjectDomainPolicy; | |
| 383 | |
| 384 cleanup: | |
| 385 PKIX_RETURN(CERTPOLICYMAP); | |
| 386 } | |
| OLD | NEW |