| 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_certchainchecker.c | |
| 6 * | |
| 7 * CertChainChecker Object Functions | |
| 8 * | |
| 9 */ | |
| 10 | |
| 11 #include "pkix_certchainchecker.h" | |
| 12 | |
| 13 /* --Private-Functions-------------------------------------------- */ | |
| 14 | |
| 15 /* | |
| 16 * FUNCTION: pkix_CertChainChecker_Destroy | |
| 17 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) | |
| 18 */ | |
| 19 static PKIX_Error * | |
| 20 pkix_CertChainChecker_Destroy( | |
| 21 PKIX_PL_Object *object, | |
| 22 void *plContext) | |
| 23 { | |
| 24 PKIX_CertChainChecker *checker = NULL; | |
| 25 | |
| 26 PKIX_ENTER(CERTCHAINCHECKER, "pkix_CertChainChecker_Destroy"); | |
| 27 PKIX_NULLCHECK_ONE(object); | |
| 28 | |
| 29 /* Check that this object is a cert chain checker */ | |
| 30 PKIX_CHECK(pkix_CheckType | |
| 31 (object, PKIX_CERTCHAINCHECKER_TYPE, plContext), | |
| 32 PKIX_OBJECTNOTCERTCHAINCHECKER); | |
| 33 | |
| 34 checker = (PKIX_CertChainChecker *)object; | |
| 35 | |
| 36 PKIX_DECREF(checker->extensions); | |
| 37 PKIX_DECREF(checker->state); | |
| 38 | |
| 39 cleanup: | |
| 40 | |
| 41 PKIX_RETURN(CERTCHAINCHECKER); | |
| 42 } | |
| 43 | |
| 44 /* | |
| 45 * FUNCTION: pkix_CertChainChecker_Duplicate | |
| 46 * (see comments for PKIX_PL_DuplicateCallback in pkix_pl_system.h) | |
| 47 */ | |
| 48 static PKIX_Error * | |
| 49 pkix_CertChainChecker_Duplicate( | |
| 50 PKIX_PL_Object *object, | |
| 51 PKIX_PL_Object **pNewObject, | |
| 52 void *plContext) | |
| 53 { | |
| 54 PKIX_CertChainChecker *checker = NULL; | |
| 55 PKIX_CertChainChecker *checkerDuplicate = NULL; | |
| 56 PKIX_List *extensionsDuplicate = NULL; | |
| 57 PKIX_PL_Object *stateDuplicate = NULL; | |
| 58 | |
| 59 PKIX_ENTER(CERTCHAINCHECKER, "pkix_CertChainChecker_Duplicate"); | |
| 60 PKIX_NULLCHECK_TWO(object, pNewObject); | |
| 61 | |
| 62 PKIX_CHECK(pkix_CheckType | |
| 63 (object, PKIX_CERTCHAINCHECKER_TYPE, plContext), | |
| 64 PKIX_OBJECTNOTCERTCHAINCHECKER); | |
| 65 | |
| 66 checker = (PKIX_CertChainChecker *)object; | |
| 67 | |
| 68 if (checker->extensions){ | |
| 69 PKIX_CHECK(PKIX_PL_Object_Duplicate | |
| 70 ((PKIX_PL_Object *)checker->extensions, | |
| 71 (PKIX_PL_Object **)&extensionsDuplicate, | |
| 72 plContext), | |
| 73 PKIX_OBJECTDUPLICATEFAILED); | |
| 74 } | |
| 75 | |
| 76 if (checker->state){ | |
| 77 PKIX_CHECK(PKIX_PL_Object_Duplicate | |
| 78 ((PKIX_PL_Object *)checker->state, | |
| 79 (PKIX_PL_Object **)&stateDuplicate, | |
| 80 plContext), | |
| 81 PKIX_OBJECTDUPLICATEFAILED); | |
| 82 } | |
| 83 | |
| 84 PKIX_CHECK(PKIX_CertChainChecker_Create | |
| 85 (checker->checkCallback, | |
| 86 checker->forwardChecking, | |
| 87 checker->isForwardDirectionExpected, | |
| 88 extensionsDuplicate, | |
| 89 stateDuplicate, | |
| 90 &checkerDuplicate, | |
| 91 plContext), | |
| 92 PKIX_CERTCHAINCHECKERCREATEFAILED); | |
| 93 | |
| 94 *pNewObject = (PKIX_PL_Object *)checkerDuplicate; | |
| 95 | |
| 96 cleanup: | |
| 97 | |
| 98 PKIX_DECREF(extensionsDuplicate); | |
| 99 PKIX_DECREF(stateDuplicate); | |
| 100 | |
| 101 PKIX_RETURN(CERTCHAINCHECKER); | |
| 102 } | |
| 103 | |
| 104 /* | |
| 105 * FUNCTION: pkix_CertChainChecker_RegisterSelf | |
| 106 * DESCRIPTION: | |
| 107 * Registers PKIX_CERTCHAINCHECKER_TYPE and its related functions with | |
| 108 * systemClasses[] | |
| 109 * THREAD SAFETY: | |
| 110 * Not Thread Safe - for performance and complexity reasons | |
| 111 * | |
| 112 * Since this function is only called by PKIX_PL_Initialize, which should | |
| 113 * only be called once, it is acceptable that this function is not | |
| 114 * thread-safe. | |
| 115 */ | |
| 116 PKIX_Error * | |
| 117 pkix_CertChainChecker_RegisterSelf(void *plContext) | |
| 118 { | |
| 119 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; | |
| 120 pkix_ClassTable_Entry entry; | |
| 121 | |
| 122 PKIX_ENTER(CERTCHAINCHECKER, "pkix_CertChainChecker_RegisterSelf"); | |
| 123 | |
| 124 entry.description = "CertChainChecker"; | |
| 125 entry.objCounter = 0; | |
| 126 entry.typeObjectSize = sizeof(PKIX_CertChainChecker); | |
| 127 entry.destructor = pkix_CertChainChecker_Destroy; | |
| 128 entry.equalsFunction = NULL; | |
| 129 entry.hashcodeFunction = NULL; | |
| 130 entry.toStringFunction = NULL; | |
| 131 entry.comparator = NULL; | |
| 132 entry.duplicateFunction = pkix_CertChainChecker_Duplicate; | |
| 133 | |
| 134 systemClasses[PKIX_CERTCHAINCHECKER_TYPE] = entry; | |
| 135 | |
| 136 PKIX_RETURN(CERTCHAINCHECKER); | |
| 137 } | |
| 138 | |
| 139 /* --Public-Functions--------------------------------------------- */ | |
| 140 | |
| 141 | |
| 142 /* | |
| 143 * FUNCTION: PKIX_CertChainChecker_Create (see comments in pkix_checker.h) | |
| 144 */ | |
| 145 PKIX_Error * | |
| 146 PKIX_CertChainChecker_Create( | |
| 147 PKIX_CertChainChecker_CheckCallback callback, | |
| 148 PKIX_Boolean forwardCheckingSupported, | |
| 149 PKIX_Boolean isForwardDirectionExpected, | |
| 150 PKIX_List *list, /* list of PKIX_PL_OID */ | |
| 151 PKIX_PL_Object *initialState, | |
| 152 PKIX_CertChainChecker **pChecker, | |
| 153 void *plContext) | |
| 154 { | |
| 155 PKIX_CertChainChecker *checker = NULL; | |
| 156 | |
| 157 PKIX_ENTER(CERTCHAINCHECKER, "PKIX_CertChainChecker_Create"); | |
| 158 PKIX_NULLCHECK_ONE(pChecker); | |
| 159 | |
| 160 PKIX_CHECK(PKIX_PL_Object_Alloc | |
| 161 (PKIX_CERTCHAINCHECKER_TYPE, | |
| 162 sizeof (PKIX_CertChainChecker), | |
| 163 (PKIX_PL_Object **)&checker, | |
| 164 plContext), | |
| 165 PKIX_COULDNOTCREATECERTCHAINCHECKEROBJECT); | |
| 166 | |
| 167 /* initialize fields */ | |
| 168 checker->checkCallback = callback; | |
| 169 checker->forwardChecking = forwardCheckingSupported; | |
| 170 checker->isForwardDirectionExpected = isForwardDirectionExpected; | |
| 171 | |
| 172 PKIX_INCREF(list); | |
| 173 checker->extensions = list; | |
| 174 | |
| 175 PKIX_INCREF(initialState); | |
| 176 checker->state = initialState; | |
| 177 | |
| 178 *pChecker = checker; | |
| 179 checker = NULL; | |
| 180 cleanup: | |
| 181 | |
| 182 PKIX_DECREF(checker); | |
| 183 | |
| 184 PKIX_RETURN(CERTCHAINCHECKER); | |
| 185 | |
| 186 } | |
| 187 | |
| 188 /* | |
| 189 * FUNCTION: PKIX_CertChainChecker_GetCheckCallback | |
| 190 * (see comments in pkix_checker.h) | |
| 191 */ | |
| 192 PKIX_Error * | |
| 193 PKIX_CertChainChecker_GetCheckCallback( | |
| 194 PKIX_CertChainChecker *checker, | |
| 195 PKIX_CertChainChecker_CheckCallback *pCallback, | |
| 196 void *plContext) | |
| 197 { | |
| 198 PKIX_ENTER(CERTCHAINCHECKER, "PKIX_CertChainChecker_GetCheckCallback"); | |
| 199 PKIX_NULLCHECK_TWO(checker, pCallback); | |
| 200 | |
| 201 *pCallback = checker->checkCallback; | |
| 202 | |
| 203 PKIX_RETURN(CERTCHAINCHECKER); | |
| 204 } | |
| 205 | |
| 206 /* | |
| 207 * FUNCTION: PKIX_CertChainChecker_IsForwardCheckingSupported | |
| 208 * (see comments in pkix_checker.h) | |
| 209 */ | |
| 210 PKIX_Error * | |
| 211 PKIX_CertChainChecker_IsForwardCheckingSupported( | |
| 212 PKIX_CertChainChecker *checker, | |
| 213 PKIX_Boolean *pForwardCheckingSupported, | |
| 214 void *plContext) | |
| 215 { | |
| 216 PKIX_ENTER | |
| 217 (CERTCHAINCHECKER, | |
| 218 "PKIX_CertChainChecker_IsForwardCheckingSupported"); | |
| 219 PKIX_NULLCHECK_TWO(checker, pForwardCheckingSupported); | |
| 220 | |
| 221 *pForwardCheckingSupported = checker->forwardChecking; | |
| 222 | |
| 223 PKIX_RETURN(CERTCHAINCHECKER); | |
| 224 } | |
| 225 | |
| 226 /* | |
| 227 * FUNCTION: PKIX_CertChainChecker_IsForwardDirectionExpected | |
| 228 * (see comments in pkix_checker.h) | |
| 229 */ | |
| 230 PKIX_Error * | |
| 231 PKIX_CertChainChecker_IsForwardDirectionExpected( | |
| 232 PKIX_CertChainChecker *checker, | |
| 233 PKIX_Boolean *pForwardDirectionExpected, | |
| 234 void *plContext) | |
| 235 { | |
| 236 PKIX_ENTER | |
| 237 (CERTCHAINCHECKER, | |
| 238 "PKIX_CertChainChecker_IsForwardDirectionExpected"); | |
| 239 PKIX_NULLCHECK_TWO(checker, pForwardDirectionExpected); | |
| 240 | |
| 241 *pForwardDirectionExpected = checker->isForwardDirectionExpected; | |
| 242 | |
| 243 PKIX_RETURN(CERTCHAINCHECKER); | |
| 244 } | |
| 245 | |
| 246 /* | |
| 247 * FUNCTION: PKIX_CertChainChecker_GetCertChainCheckerState | |
| 248 * (see comments in pkix_checker.h) | |
| 249 */ | |
| 250 PKIX_Error * | |
| 251 PKIX_CertChainChecker_GetCertChainCheckerState( | |
| 252 PKIX_CertChainChecker *checker, | |
| 253 PKIX_PL_Object **pCertChainCheckerState, | |
| 254 void *plContext) | |
| 255 { | |
| 256 PKIX_ENTER(CERTCHAINCHECKER, | |
| 257 "PKIX_CertChainChecker_GetCertChainCheckerState"); | |
| 258 | |
| 259 PKIX_NULLCHECK_TWO(checker, pCertChainCheckerState); | |
| 260 | |
| 261 PKIX_INCREF(checker->state); | |
| 262 | |
| 263 *pCertChainCheckerState = checker->state; | |
| 264 | |
| 265 cleanup: | |
| 266 PKIX_RETURN(CERTCHAINCHECKER); | |
| 267 | |
| 268 } | |
| 269 | |
| 270 /* | |
| 271 * FUNCTION: PKIX_CertChainChecker_SetCertChainCheckerState | |
| 272 * (see comments in pkix_checker.h) | |
| 273 */ | |
| 274 PKIX_Error * | |
| 275 PKIX_CertChainChecker_SetCertChainCheckerState( | |
| 276 PKIX_CertChainChecker *checker, | |
| 277 PKIX_PL_Object *certChainCheckerState, | |
| 278 void *plContext) | |
| 279 { | |
| 280 PKIX_ENTER(CERTCHAINCHECKER, | |
| 281 "PKIX_CertChainChecker_SetCertChainCheckerState"); | |
| 282 | |
| 283 PKIX_NULLCHECK_ONE(checker); | |
| 284 | |
| 285 /* DecRef old contents */ | |
| 286 PKIX_DECREF(checker->state); | |
| 287 | |
| 288 PKIX_INCREF(certChainCheckerState); | |
| 289 checker->state = certChainCheckerState; | |
| 290 | |
| 291 PKIX_CHECK(PKIX_PL_Object_InvalidateCache | |
| 292 ((PKIX_PL_Object *)checker, plContext), | |
| 293 PKIX_OBJECTINVALIDATECACHEFAILED); | |
| 294 | |
| 295 cleanup: | |
| 296 | |
| 297 PKIX_RETURN(CERTCHAINCHECKER); | |
| 298 } | |
| 299 | |
| 300 /* | |
| 301 * FUNCTION: PKIX_CertChainChecker_GetSupportedExtensions | |
| 302 * (see comments in pkix_checker.h) | |
| 303 */ | |
| 304 PKIX_Error * | |
| 305 PKIX_CertChainChecker_GetSupportedExtensions( | |
| 306 PKIX_CertChainChecker *checker, | |
| 307 PKIX_List **pExtensions, /* list of PKIX_PL_OID */ | |
| 308 void *plContext) | |
| 309 { | |
| 310 PKIX_ENTER(CERTCHAINCHECKER, | |
| 311 "PKIX_CertChainChecker_GetSupportedExtensions"); | |
| 312 | |
| 313 PKIX_NULLCHECK_TWO(checker, pExtensions); | |
| 314 | |
| 315 PKIX_INCREF(checker->extensions); | |
| 316 | |
| 317 *pExtensions = checker->extensions; | |
| 318 | |
| 319 cleanup: | |
| 320 PKIX_RETURN(CERTCHAINCHECKER); | |
| 321 | |
| 322 } | |
| OLD | NEW |