| 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);
|
| -}
|
|
|