Index: mozilla/security/nss/lib/libpkix/pkix/results/pkix_verifynode.c |
=================================================================== |
--- mozilla/security/nss/lib/libpkix/pkix/results/pkix_verifynode.c (revision 191424) |
+++ mozilla/security/nss/lib/libpkix/pkix/results/pkix_verifynode.c (working copy) |
@@ -1,1182 +0,0 @@ |
-/* This Source Code Form is subject to the terms of the Mozilla Public |
- * License, v. 2.0. If a copy of the MPL was not distributed with this |
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
-/* |
- * pkix_verifynode.c |
- * |
- * Verify Node Object Type Definition |
- * |
- */ |
- |
-#include "pkix_verifynode.h" |
- |
-/* --Private-VerifyNode-Functions---------------------------------- */ |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_Create |
- * DESCRIPTION: |
- * |
- * This function creates a VerifyNode using the Cert pointed to by "cert", |
- * the depth given by "depth", and the Error pointed to by "error", storing |
- * the result at "pObject". |
- * |
- * PARAMETERS |
- * "cert" |
- * Address of Cert for the node. Must be non-NULL |
- * "depth" |
- * UInt32 value of the depth for this node. |
- * "error" |
- * Address of Error for the node. |
- * "pObject" |
- * Address where the VerifyNode pointer will be stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_Create( |
- PKIX_PL_Cert *cert, |
- PKIX_UInt32 depth, |
- PKIX_Error *error, |
- PKIX_VerifyNode **pObject, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *node = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_Create"); |
- PKIX_NULLCHECK_TWO(cert, pObject); |
- |
- PKIX_CHECK(PKIX_PL_Object_Alloc |
- (PKIX_VERIFYNODE_TYPE, |
- sizeof (PKIX_VerifyNode), |
- (PKIX_PL_Object **)&node, |
- plContext), |
- PKIX_COULDNOTCREATEVERIFYNODEOBJECT); |
- |
- PKIX_INCREF(cert); |
- node->verifyCert = cert; |
- |
- PKIX_INCREF(error); |
- node->error = error; |
- |
- node->depth = depth; |
- |
- node->children = NULL; |
- |
- *pObject = node; |
- node = NULL; |
- |
-cleanup: |
- |
- PKIX_DECREF(node); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_AddToChain |
- * DESCRIPTION: |
- * |
- * Adds the VerifyNode pointed to by "child", at the appropriate depth, to the |
- * List of children of the VerifyNode pointed to by "parentNode". The chain of |
- * VerifyNodes is traversed until a VerifyNode is found at a depth one less |
- * than that specified in "child". An Error is returned if there is no parent |
- * at a suitable depth. |
- * |
- * If "parentNode" has a NULL pointer for the List of children, a new List is |
- * created containing "child". Otherwise "child" is appended to the existing |
- * List. |
- * |
- * Depth, in this context, means distance from the root node, which |
- * is at depth zero. |
- * |
- * PARAMETERS: |
- * "parentNode" |
- * Address of VerifyNode whose List of child VerifyNodes is to be |
- * created or appended to. Must be non-NULL. |
- * "child" |
- * Address of VerifyNode to be added to parentNode's List. Must be |
- * non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Not Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_AddToChain( |
- PKIX_VerifyNode *parentNode, |
- PKIX_VerifyNode *child, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *successor = NULL; |
- PKIX_List *listOfChildren = NULL; |
- PKIX_UInt32 numChildren = 0; |
- PKIX_UInt32 parentDepth = 0; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_AddToChain"); |
- PKIX_NULLCHECK_TWO(parentNode, child); |
- |
- parentDepth = parentNode->depth; |
- listOfChildren = parentNode->children; |
- if (listOfChildren == NULL) { |
- |
- if (parentDepth != (child->depth - 1)) { |
- PKIX_ERROR(PKIX_NODESMISSINGFROMCHAIN); |
- } |
- |
- PKIX_CHECK(PKIX_List_Create(&listOfChildren, plContext), |
- PKIX_LISTCREATEFAILED); |
- |
- PKIX_CHECK(PKIX_List_AppendItem |
- (listOfChildren, (PKIX_PL_Object *)child, plContext), |
- PKIX_COULDNOTAPPENDCHILDTOPARENTSVERIFYNODELIST); |
- |
- parentNode->children = listOfChildren; |
- } else { |
- /* get number of children */ |
- PKIX_CHECK(PKIX_List_GetLength |
- (listOfChildren, &numChildren, plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- |
- if (numChildren != 1) { |
- PKIX_ERROR(PKIX_AMBIGUOUSPARENTAGEOFVERIFYNODE); |
- } |
- |
- /* successor = listOfChildren[0] */ |
- PKIX_CHECK(PKIX_List_GetItem |
- (listOfChildren, |
- 0, |
- (PKIX_PL_Object **)&successor, |
- plContext), |
- PKIX_LISTGETITEMFAILED); |
- |
- PKIX_CHECK(pkix_VerifyNode_AddToChain |
- (successor, child, plContext), |
- PKIX_VERIFYNODEADDTOCHAINFAILED); |
- } |
- |
- PKIX_CHECK(PKIX_PL_Object_InvalidateCache |
- ((PKIX_PL_Object *)parentNode, plContext), |
- PKIX_OBJECTINVALIDATECACHEFAILED); |
- |
-cleanup: |
- PKIX_DECREF(successor); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_SetDepth |
- * DESCRIPTION: |
- * |
- * The function sets the depth field of each VerifyNode in the List "children" |
- * to the value given by "depth", and recursively sets the depth of any |
- * successive generations to the successive values. |
- * |
- * PARAMETERS: |
- * "children" |
- * The List of VerifyNodes. Must be non-NULL. |
- * "depth" |
- * The value of the depth field to be set in members of the List. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_SetDepth(PKIX_List *children, |
- PKIX_UInt32 depth, |
- void *plContext) |
-{ |
- PKIX_UInt32 numChildren = 0; |
- PKIX_UInt32 chIx = 0; |
- PKIX_VerifyNode *child = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_SetDepth"); |
- PKIX_NULLCHECK_ONE(children); |
- |
- PKIX_CHECK(PKIX_List_GetLength(children, &numChildren, plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- |
- for (chIx = 0; chIx < numChildren; chIx++) { |
- PKIX_CHECK(PKIX_List_GetItem |
- (children, chIx, (PKIX_PL_Object **)&child, plContext), |
- PKIX_LISTGETITEMFAILED); |
- |
- child->depth = depth; |
- |
- if (child->children != NULL) { |
- PKIX_CHECK(pkix_VerifyNode_SetDepth |
- (child->children, depth + 1, plContext), |
- PKIX_VERIFYNODESETDEPTHFAILED); |
- } |
- |
- PKIX_DECREF(child); |
- } |
- |
-cleanup: |
- |
- PKIX_DECREF(child); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_AddToTree |
- * DESCRIPTION: |
- * |
- * Adds the VerifyNode pointed to by "child" to the List of children of the |
- * VerifyNode pointed to by "parentNode". If "parentNode" has a NULL pointer |
- * for the List of children, a new List is created containing "child". |
- * Otherwise "child" is appended to the existing List. The depth field of |
- * "child" is set to one more than the corresponding value in "parent", and |
- * if the "child" itself has child nodes, their depth fields are updated |
- * accordingly. |
- * |
- * Depth, in this context, means distance from the root node, which |
- * is at depth zero. |
- * |
- * PARAMETERS: |
- * "parentNode" |
- * Address of VerifyNode whose List of child VerifyNodes is to be |
- * created or appended to. Must be non-NULL. |
- * "child" |
- * Address of VerifyNode to be added to parentNode's List. Must be |
- * non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Not Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_AddToTree( |
- PKIX_VerifyNode *parentNode, |
- PKIX_VerifyNode *child, |
- void *plContext) |
-{ |
- PKIX_List *listOfChildren = NULL; |
- PKIX_UInt32 parentDepth = 0; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_AddToTree"); |
- PKIX_NULLCHECK_TWO(parentNode, child); |
- |
- parentDepth = parentNode->depth; |
- listOfChildren = parentNode->children; |
- if (listOfChildren == NULL) { |
- |
- PKIX_CHECK(PKIX_List_Create(&listOfChildren, plContext), |
- PKIX_LISTCREATEFAILED); |
- |
- parentNode->children = listOfChildren; |
- } |
- |
- child->depth = parentDepth + 1; |
- |
- PKIX_CHECK(PKIX_List_AppendItem |
- (parentNode->children, (PKIX_PL_Object *)child, plContext), |
- PKIX_COULDNOTAPPENDCHILDTOPARENTSVERIFYNODELIST); |
- |
- if (child->children != NULL) { |
- PKIX_CHECK(pkix_VerifyNode_SetDepth |
- (child->children, child->depth + 1, plContext), |
- PKIX_VERIFYNODESETDEPTHFAILED); |
- } |
- |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_SingleVerifyNode_ToString |
- * DESCRIPTION: |
- * |
- * Creates a String representation of the attributes of the VerifyNode pointed |
- * to by "node", other than its children, and stores the result at "pString". |
- * |
- * PARAMETERS: |
- * "node" |
- * Address of VerifyNode to be described by the string. Must be non-NULL. |
- * "pString" |
- * Address where object pointer will be stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if function succeeds |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in a fatal way |
- */ |
-PKIX_Error * |
-pkix_SingleVerifyNode_ToString( |
- PKIX_VerifyNode *node, |
- PKIX_PL_String **pString, |
- void *plContext) |
-{ |
- PKIX_PL_String *fmtString = NULL; |
- PKIX_PL_String *errorString = NULL; |
- PKIX_PL_String *outString = NULL; |
- |
- PKIX_PL_X500Name *issuerName = NULL; |
- PKIX_PL_X500Name *subjectName = NULL; |
- PKIX_PL_String *issuerString = NULL; |
- PKIX_PL_String *subjectString = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_SingleVerifyNode_ToString"); |
- PKIX_NULLCHECK_THREE(node, pString, node->verifyCert); |
- |
- PKIX_TOSTRING(node->error, &errorString, plContext, |
- PKIX_ERRORTOSTRINGFAILED); |
- |
- PKIX_CHECK(PKIX_PL_Cert_GetIssuer |
- (node->verifyCert, &issuerName, plContext), |
- PKIX_CERTGETISSUERFAILED); |
- |
- PKIX_TOSTRING(issuerName, &issuerString, plContext, |
- PKIX_X500NAMETOSTRINGFAILED); |
- |
- PKIX_CHECK(PKIX_PL_Cert_GetSubject |
- (node->verifyCert, &subjectName, plContext), |
- PKIX_CERTGETSUBJECTFAILED); |
- |
- PKIX_TOSTRING(subjectName, &subjectString, plContext, |
- PKIX_X500NAMETOSTRINGFAILED); |
- |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- "CERT[Issuer:%s, Subject:%s], depth=%d, error=%s", |
- 0, |
- &fmtString, |
- plContext), |
- PKIX_CANTCREATESTRING); |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&outString, |
- plContext, |
- fmtString, |
- issuerString, |
- subjectString, |
- node->depth, |
- errorString), |
- PKIX_SPRINTFFAILED); |
- |
- *pString = outString; |
- |
-cleanup: |
- |
- PKIX_DECREF(fmtString); |
- PKIX_DECREF(errorString); |
- PKIX_DECREF(issuerName); |
- PKIX_DECREF(subjectName); |
- PKIX_DECREF(issuerString); |
- PKIX_DECREF(subjectString); |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_ToString_Helper |
- * DESCRIPTION: |
- * |
- * Produces a String representation of a VerifyNode tree below the VerifyNode |
- * pointed to by "rootNode", with each line of output prefixed by the String |
- * pointed to by "indent", and stores the result at "pTreeString". It is |
- * called recursively, with ever-increasing indentation, for successively |
- * lower nodes on the tree. |
- * |
- * PARAMETERS: |
- * "rootNode" |
- * Address of VerifyNode subtree. Must be non-NULL. |
- * "indent" |
- * Address of String to be prefixed to each line of output. May be NULL |
- * if no indentation is desired |
- * "pTreeString" |
- * Address where the resulting String will be stored; must be non-NULL |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_ToString_Helper( |
- PKIX_VerifyNode *rootNode, |
- PKIX_PL_String *indent, |
- PKIX_PL_String **pTreeString, |
- void *plContext) |
-{ |
- PKIX_PL_String *nextIndentFormat = NULL; |
- PKIX_PL_String *thisNodeFormat = NULL; |
- PKIX_PL_String *childrenFormat = NULL; |
- PKIX_PL_String *nextIndentString = NULL; |
- PKIX_PL_String *resultString = NULL; |
- PKIX_PL_String *thisItemString = NULL; |
- PKIX_PL_String *childString = NULL; |
- PKIX_VerifyNode *childNode = NULL; |
- PKIX_UInt32 numberOfChildren = 0; |
- PKIX_UInt32 childIndex = 0; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_ToString_Helper"); |
- |
- PKIX_NULLCHECK_TWO(rootNode, pTreeString); |
- |
- /* Create a string for this node */ |
- PKIX_CHECK(pkix_SingleVerifyNode_ToString |
- (rootNode, &thisItemString, plContext), |
- PKIX_ERRORINSINGLEVERIFYNODETOSTRING); |
- |
- if (indent) { |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- "%s%s", |
- 0, |
- &thisNodeFormat, |
- plContext), |
- PKIX_ERRORCREATINGFORMATSTRING); |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&resultString, |
- plContext, |
- thisNodeFormat, |
- indent, |
- thisItemString), |
- PKIX_ERRORINSPRINTF); |
- } else { |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- "%s", |
- 0, |
- &thisNodeFormat, |
- plContext), |
- PKIX_ERRORCREATINGFORMATSTRING); |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&resultString, |
- plContext, |
- thisNodeFormat, |
- thisItemString), |
- PKIX_ERRORINSPRINTF); |
- } |
- |
- PKIX_DECREF(thisItemString); |
- thisItemString = resultString; |
- |
- /* if no children, we are done */ |
- if (rootNode->children) { |
- PKIX_CHECK(PKIX_List_GetLength |
- (rootNode->children, &numberOfChildren, plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- } |
- |
- if (numberOfChildren != 0) { |
- /* |
- * We create a string for each child in turn, |
- * concatenating them to thisItemString. |
- */ |
- |
- /* Prepare an indent string for each child */ |
- if (indent) { |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- "%s. ", |
- 0, |
- &nextIndentFormat, |
- plContext), |
- PKIX_ERRORCREATINGFORMATSTRING); |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&nextIndentString, |
- plContext, |
- nextIndentFormat, |
- indent), |
- PKIX_ERRORINSPRINTF); |
- } else { |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- ". ", |
- 0, |
- &nextIndentString, |
- plContext), |
- PKIX_ERRORCREATINGINDENTSTRING); |
- } |
- |
- /* Prepare the format for concatenation. */ |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, |
- "%s\n%s", |
- 0, |
- &childrenFormat, |
- plContext), |
- PKIX_ERRORCREATINGFORMATSTRING); |
- |
- for (childIndex = 0; |
- childIndex < numberOfChildren; |
- childIndex++) { |
- PKIX_CHECK(PKIX_List_GetItem |
- (rootNode->children, |
- childIndex, |
- (PKIX_PL_Object **)&childNode, |
- plContext), |
- PKIX_LISTGETITEMFAILED); |
- |
- PKIX_CHECK(pkix_VerifyNode_ToString_Helper |
- (childNode, |
- nextIndentString, |
- &childString, |
- plContext), |
- PKIX_ERRORCREATINGCHILDSTRING); |
- |
- |
- PKIX_CHECK(PKIX_PL_Sprintf |
- (&resultString, |
- plContext, |
- childrenFormat, |
- thisItemString, |
- childString), |
- PKIX_ERRORINSPRINTF); |
- |
- PKIX_DECREF(childNode); |
- PKIX_DECREF(childString); |
- PKIX_DECREF(thisItemString); |
- |
- thisItemString = resultString; |
- } |
- } |
- |
- *pTreeString = thisItemString; |
- |
-cleanup: |
- if (PKIX_ERROR_RECEIVED) { |
- PKIX_DECREF(thisItemString); |
- } |
- |
- PKIX_DECREF(nextIndentFormat); |
- PKIX_DECREF(thisNodeFormat); |
- PKIX_DECREF(childrenFormat); |
- PKIX_DECREF(nextIndentString); |
- PKIX_DECREF(childString); |
- PKIX_DECREF(childNode); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_ToString |
- * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_ToString( |
- PKIX_PL_Object *object, |
- PKIX_PL_String **pTreeString, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *rootNode = NULL; |
- PKIX_PL_String *resultString = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_ToString"); |
- |
- PKIX_NULLCHECK_TWO(object, pTreeString); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_VERIFYNODE_TYPE, plContext), |
- PKIX_OBJECTNOTVERIFYNODE); |
- |
- rootNode = (PKIX_VerifyNode *)object; |
- |
- PKIX_CHECK(pkix_VerifyNode_ToString_Helper |
- (rootNode, NULL, &resultString, plContext), |
- PKIX_ERRORCREATINGSUBTREESTRING); |
- |
- *pTreeString = resultString; |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_Destroy |
- * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_Destroy( |
- PKIX_PL_Object *object, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *node = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_Destroy"); |
- |
- PKIX_NULLCHECK_ONE(object); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_VERIFYNODE_TYPE, plContext), |
- PKIX_OBJECTNOTVERIFYNODE); |
- |
- node = (PKIX_VerifyNode*)object; |
- |
- PKIX_DECREF(node->verifyCert); |
- PKIX_DECREF(node->children); |
- PKIX_DECREF(node->error); |
- |
- node->depth = 0; |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_SingleVerifyNode_Hashcode |
- * DESCRIPTION: |
- * |
- * Computes the hashcode of the attributes of the VerifyNode pointed to by |
- * "node", other than its parents and children, and stores the result at |
- * "pHashcode". |
- * |
- * PARAMETERS: |
- * "node" |
- * Address of VerifyNode to be hashcoded; must be non-NULL |
- * "pHashcode" |
- * Address where UInt32 result will be stored; must be non-NULL |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if function succeeds |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in a fatal way |
- */ |
-static PKIX_Error * |
-pkix_SingleVerifyNode_Hashcode( |
- PKIX_VerifyNode *node, |
- PKIX_UInt32 *pHashcode, |
- void *plContext) |
-{ |
- PKIX_UInt32 errorHash = 0; |
- PKIX_UInt32 nodeHash = 0; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_SingleVerifyNode_Hashcode"); |
- PKIX_NULLCHECK_TWO(node, pHashcode); |
- |
- PKIX_HASHCODE |
- (node->verifyCert, |
- &nodeHash, |
- plContext, |
- PKIX_FAILUREHASHINGCERT); |
- |
- PKIX_CHECK(PKIX_PL_Object_Hashcode |
- ((PKIX_PL_Object *)node->error, |
- &errorHash, |
- plContext), |
- PKIX_FAILUREHASHINGERROR); |
- |
- nodeHash = 31*nodeHash + errorHash; |
- *pHashcode = nodeHash; |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_Hashcode |
- * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_Hashcode( |
- PKIX_PL_Object *object, |
- PKIX_UInt32 *pHashcode, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *node = NULL; |
- PKIX_UInt32 childrenHash = 0; |
- PKIX_UInt32 nodeHash = 0; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_Hashcode"); |
- PKIX_NULLCHECK_TWO(object, pHashcode); |
- |
- PKIX_CHECK(pkix_CheckType |
- (object, PKIX_VERIFYNODE_TYPE, plContext), |
- PKIX_OBJECTNOTVERIFYNODE); |
- |
- node = (PKIX_VerifyNode *)object; |
- |
- PKIX_CHECK(pkix_SingleVerifyNode_Hashcode |
- (node, &nodeHash, plContext), |
- PKIX_SINGLEVERIFYNODEHASHCODEFAILED); |
- |
- PKIX_HASHCODE |
- (node->children, |
- &childrenHash, |
- plContext, |
- PKIX_OBJECTHASHCODEFAILED); |
- |
- nodeHash = 31*nodeHash + childrenHash; |
- |
- *pHashcode = nodeHash; |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_SingleVerifyNode_Equals |
- * DESCRIPTION: |
- * |
- * Compares for equality the components of the VerifyNode pointed to by |
- * "firstPN", other than its parents and children, with those of the |
- * VerifyNode pointed to by "secondPN" and stores the result at "pResult" |
- * (PKIX_TRUE if equal; PKIX_FALSE if not). |
- * |
- * PARAMETERS: |
- * "firstPN" |
- * Address of first of the VerifyNodes to be compared; must be non-NULL |
- * "secondPN" |
- * Address of second of the VerifyNodes to be compared; must be non-NULL |
- * "pResult" |
- * Address where Boolean will be stored; must be non-NULL |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if function succeeds |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in a fatal way |
- */ |
-static PKIX_Error * |
-pkix_SingleVerifyNode_Equals( |
- PKIX_VerifyNode *firstVN, |
- PKIX_VerifyNode *secondVN, |
- PKIX_Boolean *pResult, |
- void *plContext) |
-{ |
- PKIX_Boolean compResult = PKIX_FALSE; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_SingleVerifyNode_Equals"); |
- PKIX_NULLCHECK_THREE(firstVN, secondVN, pResult); |
- |
- /* If both references are identical, they must be equal */ |
- if (firstVN == secondVN) { |
- compResult = PKIX_TRUE; |
- goto cleanup; |
- } |
- |
- /* |
- * It seems we have to do the comparisons. Do |
- * the easiest ones first. |
- */ |
- if ((firstVN->depth) != (secondVN->depth)) { |
- goto cleanup; |
- } |
- |
- /* These fields must be non-NULL */ |
- PKIX_NULLCHECK_TWO(firstVN->verifyCert, secondVN->verifyCert); |
- |
- PKIX_EQUALS |
- (firstVN->verifyCert, |
- secondVN->verifyCert, |
- &compResult, |
- plContext, |
- PKIX_OBJECTEQUALSFAILED); |
- |
- if (compResult == PKIX_FALSE) { |
- goto cleanup; |
- } |
- |
- PKIX_EQUALS |
- (firstVN->error, |
- secondVN->error, |
- &compResult, |
- plContext, |
- PKIX_OBJECTEQUALSFAILED); |
- |
-cleanup: |
- |
- *pResult = compResult; |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_Equals |
- * (see comments for PKIX_PL_Equals_Callback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_Equals( |
- PKIX_PL_Object *firstObject, |
- PKIX_PL_Object *secondObject, |
- PKIX_Boolean *pResult, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *firstVN = NULL; |
- PKIX_VerifyNode *secondVN = NULL; |
- PKIX_UInt32 secondType; |
- PKIX_Boolean compResult = PKIX_FALSE; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_Equals"); |
- PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult); |
- |
- /* test that firstObject is a VerifyNode */ |
- PKIX_CHECK(pkix_CheckType |
- (firstObject, PKIX_VERIFYNODE_TYPE, plContext), |
- PKIX_FIRSTOBJECTNOTVERIFYNODE); |
- |
- /* |
- * Since we know firstObject is a VerifyNode, |
- * if both references are identical, they must be equal |
- */ |
- if (firstObject == secondObject){ |
- compResult = PKIX_TRUE; |
- goto cleanup; |
- } |
- |
- /* |
- * If secondObject isn't a VerifyNode, we |
- * don't throw an error. We simply return FALSE. |
- */ |
- PKIX_CHECK(PKIX_PL_Object_GetType |
- (secondObject, &secondType, plContext), |
- PKIX_COULDNOTGETTYPEOFSECONDARGUMENT); |
- |
- if (secondType != PKIX_VERIFYNODE_TYPE) { |
- goto cleanup; |
- } |
- |
- /* |
- * Oh, well, we have to do the comparisons. Do |
- * the easiest ones first. |
- */ |
- firstVN = (PKIX_VerifyNode *)firstObject; |
- secondVN = (PKIX_VerifyNode *)secondObject; |
- |
- PKIX_CHECK(pkix_SingleVerifyNode_Equals |
- (firstVN, secondVN, &compResult, plContext), |
- PKIX_SINGLEVERIFYNODEEQUALSFAILED); |
- |
- if (compResult == PKIX_FALSE) { |
- goto cleanup; |
- } |
- |
- PKIX_EQUALS |
- (firstVN->children, |
- secondVN->children, |
- &compResult, |
- plContext, |
- PKIX_OBJECTEQUALSFAILEDONCHILDREN); |
- |
-cleanup: |
- |
- *pResult = compResult; |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_DuplicateHelper |
- * DESCRIPTION: |
- * |
- * Duplicates the VerifyNode whose address is pointed to by "original", |
- * and stores the result at "pNewNode", if a non-NULL pointer is provided |
- * for "pNewNode". In addition, the created VerifyNode is added as a child |
- * to "parent", if a non-NULL pointer is provided for "parent". Then this |
- * function is called recursively to duplicate each of the children of |
- * "original". At the top level this function is called with a null |
- * "parent" and a non-NULL "pNewNode". Below the top level "parent" will |
- * be non-NULL and "pNewNode" will be NULL. |
- * |
- * PARAMETERS: |
- * "original" |
- * Address of VerifyNode to be copied; must be non-NULL |
- * "parent" |
- * Address of VerifyNode to which the created node is to be added as a |
- * child; NULL for the top-level call and non-NULL below the top level |
- * "pNewNode" |
- * Address to store the node created; should be NULL if "parent" is |
- * non-NULL and vice versa |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Conditionally Thread Safe |
- * (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if function succeeds |
- * Returns a VerifyNode Error if the function fails in a non-fatal way. |
- * Returns a Fatal Error if the function fails in a fatal way |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_DuplicateHelper( |
- PKIX_VerifyNode *original, |
- PKIX_VerifyNode *parent, |
- PKIX_VerifyNode **pNewNode, |
- void *plContext) |
-{ |
- PKIX_UInt32 numChildren = 0; |
- PKIX_UInt32 childIndex = 0; |
- PKIX_List *children = NULL; /* List of PKIX_VerifyNode */ |
- PKIX_VerifyNode *copy = NULL; |
- PKIX_VerifyNode *child = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_DuplicateHelper"); |
- |
- PKIX_NULLCHECK_TWO |
- (original, original->verifyCert); |
- |
- /* |
- * These components are immutable, so copying the pointers |
- * is sufficient. The create function increments the reference |
- * counts as it stores the pointers into the new object. |
- */ |
- PKIX_CHECK(pkix_VerifyNode_Create |
- (original->verifyCert, |
- original->depth, |
- original->error, |
- ©, |
- plContext), |
- PKIX_VERIFYNODECREATEFAILED); |
- |
- /* Are there any children to duplicate? */ |
- children = original->children; |
- |
- if (children) { |
- PKIX_CHECK(PKIX_List_GetLength(children, &numChildren, plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- } |
- |
- for (childIndex = 0; childIndex < numChildren; childIndex++) { |
- PKIX_CHECK(PKIX_List_GetItem |
- (children, |
- childIndex, |
- (PKIX_PL_Object **)&child, |
- plContext), |
- PKIX_LISTGETITEMFAILED); |
- |
- PKIX_CHECK(pkix_VerifyNode_DuplicateHelper |
- (child, copy, NULL, plContext), |
- PKIX_VERIFYNODEDUPLICATEHELPERFAILED); |
- |
- PKIX_DECREF(child); |
- } |
- |
- if (pNewNode) { |
- *pNewNode = copy; |
- copy = NULL; /* no DecRef if we give our handle away */ |
- } |
- |
-cleanup: |
- PKIX_DECREF(copy); |
- PKIX_DECREF(child); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_Duplicate |
- * (see comments for PKIX_PL_Duplicate_Callback in pkix_pl_system.h) |
- */ |
-static PKIX_Error * |
-pkix_VerifyNode_Duplicate( |
- PKIX_PL_Object *object, |
- PKIX_PL_Object **pNewObject, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *original = NULL; |
- PKIX_VerifyNode *copy = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_Duplicate"); |
- |
- PKIX_NULLCHECK_TWO(object, pNewObject); |
- |
- PKIX_CHECK(pkix_CheckType |
- (object, PKIX_VERIFYNODE_TYPE, plContext), |
- PKIX_OBJECTNOTVERIFYNODE); |
- |
- original = (PKIX_VerifyNode *)object; |
- |
- PKIX_CHECK(pkix_VerifyNode_DuplicateHelper |
- (original, NULL, ©, plContext), |
- PKIX_VERIFYNODEDUPLICATEHELPERFAILED); |
- |
- *pNewObject = (PKIX_PL_Object *)copy; |
- |
-cleanup: |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: pkix_VerifyNode_RegisterSelf |
- * DESCRIPTION: |
- * |
- * Registers PKIX_VERIFYNODE_TYPE and its related |
- * functions with systemClasses[] |
- * |
- * THREAD SAFETY: |
- * Not Thread Safe - for performance and complexity reasons |
- * |
- * Since this function is only called by PKIX_PL_Initialize, |
- * which should only be called once, it is acceptable that |
- * this function is not thread-safe. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_RegisterSelf(void *plContext) |
-{ |
- |
- extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
- pkix_ClassTable_Entry entry; |
- |
- PKIX_ENTER(VERIFYNODE, "pkix_VerifyNode_RegisterSelf"); |
- |
- entry.description = "VerifyNode"; |
- entry.objCounter = 0; |
- entry.typeObjectSize = sizeof(PKIX_VerifyNode); |
- entry.destructor = pkix_VerifyNode_Destroy; |
- entry.equalsFunction = pkix_VerifyNode_Equals; |
- entry.hashcodeFunction = pkix_VerifyNode_Hashcode; |
- entry.toStringFunction = pkix_VerifyNode_ToString; |
- entry.comparator = NULL; |
- entry.duplicateFunction = pkix_VerifyNode_Duplicate; |
- |
- systemClasses[PKIX_VERIFYNODE_TYPE] = entry; |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* --Public-VerifyNode-Functions----------------------------------- */ |
- |
-/* |
- * FUNCTION: PKIX_VerifyNode_SetError |
- * DESCRIPTION: |
- * |
- * This function sets the Error field of the VerifyNode pointed to by "node" |
- * to contain the Error pointed to by "error". |
- * |
- * PARAMETERS: |
- * "node" |
- * The address of the VerifyNode to be modified. Must be non-NULL. |
- * "error" |
- * The address of the Error to be stored. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_SetError( |
- PKIX_VerifyNode *node, |
- PKIX_Error *error, |
- void *plContext) |
-{ |
- |
- PKIX_ENTER(VERIFYNODE, "PKIX_VerifyNode_SetError"); |
- |
- PKIX_NULLCHECK_TWO(node, error); |
- |
- PKIX_DECREF(node->error); /* should have been NULL */ |
- PKIX_INCREF(error); |
- node->error = error; |
- |
-cleanup: |
- PKIX_RETURN(VERIFYNODE); |
-} |
- |
-/* |
- * FUNCTION: PKIX_VerifyNode_FindError |
- * DESCRIPTION: |
- * |
- * Finds meaningful error in the log. For now, just returns the first |
- * error it finds in. In the future the function should be changed to |
- * return a top priority error. |
- * |
- * PARAMETERS: |
- * "node" |
- * The address of the VerifyNode to be modified. Must be non-NULL. |
- * "error" |
- * The address of a pointer the error will be returned to. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-pkix_VerifyNode_FindError( |
- PKIX_VerifyNode *node, |
- PKIX_Error **error, |
- void *plContext) |
-{ |
- PKIX_VerifyNode *childNode = NULL; |
- |
- PKIX_ENTER(VERIFYNODE, "PKIX_VerifyNode_FindError"); |
- |
- /* Make sure the return address is initialized with NULL */ |
- PKIX_DECREF(*error); |
- |
- if (!node) |
- goto cleanup; |
- |
- /* First, try to get error from lowest level. */ |
- if (node->children) { |
- PKIX_UInt32 length = 0; |
- PKIX_UInt32 index = 0; |
- |
- PKIX_CHECK( |
- PKIX_List_GetLength(node->children, &length, |
- plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- for (index = 0;index < length;index++) { |
- PKIX_CHECK( |
- PKIX_List_GetItem(node->children, index, |
- (PKIX_PL_Object**)&childNode, plContext), |
- PKIX_LISTGETITEMFAILED); |
- if (!childNode) |
- continue; |
- PKIX_CHECK( |
- pkix_VerifyNode_FindError(childNode, error, |
- plContext), |
- PKIX_VERIFYNODEFINDERRORFAILED); |
- PKIX_DECREF(childNode); |
- if (*error) { |
- goto cleanup; |
- } |
- } |
- } |
- |
- if (node->error && node->error->plErr) { |
- PKIX_INCREF(node->error); |
- *error = node->error; |
- } |
- |
-cleanup: |
- PKIX_DECREF(childNode); |
- |
- PKIX_RETURN(VERIFYNODE); |
-} |