⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcy_tree.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 2 页
字号:
			(void)sk_X509_POLICY_NODE_delete(curr->nodes, i);			}		}	for(;;)	{		--curr;		for (i = sk_X509_POLICY_NODE_num(curr->nodes) - 1; i >= 0; i--)			{			node = sk_X509_POLICY_NODE_value(curr->nodes, i);			if (node->nchild == 0)				{				node->parent->nchild--;				OPENSSL_free(node);				(void)sk_X509_POLICY_NODE_delete(curr->nodes, i);				}			}		if (curr->anyPolicy && !curr->anyPolicy->nchild)			{			if (curr->anyPolicy->parent)				curr->anyPolicy->parent->nchild--;			OPENSSL_free(curr->anyPolicy);			curr->anyPolicy = NULL;			}		if (curr == tree->levels)			{			/* If we zapped anyPolicy at top then tree is empty */			if (!curr->anyPolicy)					return 2;			return 1;			}		}	return 1;	}static int tree_add_auth_node(STACK_OF(X509_POLICY_NODE) **pnodes,						 X509_POLICY_NODE *pcy)	{	if (!*pnodes)		{		*pnodes = policy_node_cmp_new();		if (!*pnodes)			return 0;		}	else if (sk_X509_POLICY_NODE_find(*pnodes, pcy) != -1)		return 1;	if (!sk_X509_POLICY_NODE_push(*pnodes, pcy))		return 0;	return 1;	}/* Calculate the authority set based on policy tree. * The 'pnodes' parameter is used as a store for the set of policy nodes * used to calculate the user set. If the authority set is not anyPolicy * then pnodes will just point to the authority set. If however the authority * set is anyPolicy then the set of valid policies (other than anyPolicy) * is store in pnodes. The return value of '2' is used in this case to indicate * that pnodes should be freed. */static int tree_calculate_authority_set(X509_POLICY_TREE *tree,					STACK_OF(X509_POLICY_NODE) **pnodes)	{	X509_POLICY_LEVEL *curr;	X509_POLICY_NODE *node, *anyptr;	STACK_OF(X509_POLICY_NODE) **addnodes;	int i, j;	curr = tree->levels + tree->nlevel - 1;	/* If last level contains anyPolicy set is anyPolicy */	if (curr->anyPolicy)		{		if (!tree_add_auth_node(&tree->auth_policies, curr->anyPolicy))			return 0;		addnodes = pnodes;		}	else		/* Add policies to authority set */		addnodes = &tree->auth_policies;	curr = tree->levels;	for (i = 1; i < tree->nlevel; i++)		{		/* If no anyPolicy node on this this level it can't		 * appear on lower levels so end search.		 */		if (!(anyptr = curr->anyPolicy))			break;		curr++;		for (j = 0; j < sk_X509_POLICY_NODE_num(curr->nodes); j++)			{			node = sk_X509_POLICY_NODE_value(curr->nodes, j);			if ((node->parent == anyptr)				&& !tree_add_auth_node(addnodes, node))					return 0;			}		}	if (addnodes == pnodes)		return 2;	*pnodes = tree->auth_policies;	return 1;	}static int tree_calculate_user_set(X509_POLICY_TREE *tree,				STACK_OF(ASN1_OBJECT) *policy_oids,				STACK_OF(X509_POLICY_NODE) *auth_nodes)	{	int i;	X509_POLICY_NODE *node;	ASN1_OBJECT *oid;	X509_POLICY_NODE *anyPolicy;	X509_POLICY_DATA *extra;	/* Check if anyPolicy present in authority constrained policy set:	 * this will happen if it is a leaf node.	 */	if (sk_ASN1_OBJECT_num(policy_oids) <= 0)		return 1;	anyPolicy = tree->levels[tree->nlevel - 1].anyPolicy;	for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++)		{		oid = sk_ASN1_OBJECT_value(policy_oids, i);		if (OBJ_obj2nid(oid) == NID_any_policy)			{			tree->flags |= POLICY_FLAG_ANY_POLICY;			return 1;			}		}	for (i = 0; i < sk_ASN1_OBJECT_num(policy_oids); i++)		{		oid = sk_ASN1_OBJECT_value(policy_oids, i);		node = tree_find_sk(auth_nodes, oid);		if (!node)			{			if (!anyPolicy)				continue;			/* Create a new node with policy ID from user set			 * and qualifiers from anyPolicy.			 */			extra = policy_data_new(NULL, oid,						node_critical(anyPolicy));			if (!extra)				return 0;			extra->qualifier_set = anyPolicy->data->qualifier_set;			extra->flags = POLICY_DATA_FLAG_SHARED_QUALIFIERS						| POLICY_DATA_FLAG_EXTRA_NODE;			node = level_add_node(NULL, extra, anyPolicy->parent,						tree);			}		if (!tree->user_policies)			{			tree->user_policies = sk_X509_POLICY_NODE_new_null();			if (!tree->user_policies)				return 1;			}		if (!sk_X509_POLICY_NODE_push(tree->user_policies, node))			return 0;		}	return 1;	}static int tree_evaluate(X509_POLICY_TREE *tree)	{	int ret, i;	X509_POLICY_LEVEL *curr = tree->levels + 1;	const X509_POLICY_CACHE *cache;	for(i = 1; i < tree->nlevel; i++, curr++)		{		cache = policy_cache_set(curr->cert);		if (!tree_link_nodes(curr, cache))			return 0;		if (!(curr->flags & X509_V_FLAG_INHIBIT_ANY)			&& !tree_link_any(curr, cache, tree))			return 0;		ret = tree_prune(tree, curr);		if (ret != 1)			return ret;		}	return 1;	}static void exnode_free(X509_POLICY_NODE *node)	{	if (node->data && (node->data->flags & POLICY_DATA_FLAG_EXTRA_NODE))		OPENSSL_free(node);	}void X509_policy_tree_free(X509_POLICY_TREE *tree)	{	X509_POLICY_LEVEL *curr;	int i;	if (!tree)		return;	sk_X509_POLICY_NODE_free(tree->auth_policies);	sk_X509_POLICY_NODE_pop_free(tree->user_policies, exnode_free);	for(i = 0, curr = tree->levels; i < tree->nlevel; i++, curr++)		{		if (curr->cert)			X509_free(curr->cert);		if (curr->nodes)			sk_X509_POLICY_NODE_pop_free(curr->nodes,						policy_node_free);		if (curr->anyPolicy)			policy_node_free(curr->anyPolicy);		}	if (tree->extra_data)		sk_X509_POLICY_DATA_pop_free(tree->extra_data,						policy_data_free);	OPENSSL_free(tree->levels);	OPENSSL_free(tree);	}/* Application policy checking function. * Return codes: *  0 	Internal Error. *  1   Successful. * -1   One or more certificates contain invalid or inconsistent extensions * -2	User constrained policy set empty and requireExplicit true. */int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,			STACK_OF(X509) *certs,			STACK_OF(ASN1_OBJECT) *policy_oids,			unsigned int flags)	{	int ret;	X509_POLICY_TREE *tree = NULL;	STACK_OF(X509_POLICY_NODE) *nodes, *auth_nodes = NULL;	*ptree = NULL;	*pexplicit_policy = 0;	ret = tree_init(&tree, certs, flags);	switch (ret)		{		/* Tree empty requireExplicit False: OK */		case 2:		return 1;		/* Some internal error */		case 0:		return 0;		/* Tree empty requireExplicit True: Error */		case 6:		*pexplicit_policy = 1;		return -2;		/* Tree OK requireExplicit True: OK and continue */		case 5:		*pexplicit_policy = 1;		break;		/* Tree OK: continue */		case 1:		if (!tree)			/*			 * tree_init() returns success and a null tree			 * if it's just looking at a trust anchor.			 * I'm not sure that returning success here is			 * correct, but I'm sure that reporting this			 * as an internal error which our caller			 * interprets as a malloc failure is wrong.			 */			return 1;		break;		}	if (!tree) goto error;	ret = tree_evaluate(tree);	if (ret <= 0)		goto error;	/* Return value 2 means tree empty */	if (ret == 2)		{		X509_policy_tree_free(tree);		if (*pexplicit_policy)			return -2;		else			return 1;		}	/* Tree is not empty: continue */	ret = tree_calculate_authority_set(tree, &auth_nodes);	if (!ret)		goto error;	if (!tree_calculate_user_set(tree, policy_oids, auth_nodes))		goto error;		if (ret == 2)		sk_X509_POLICY_NODE_free(auth_nodes);	if (tree)		*ptree = tree;	if (*pexplicit_policy)		{		nodes = X509_policy_tree_get0_user_policies(tree);		if (sk_X509_POLICY_NODE_num(nodes) <= 0)			return -2;		}	return 1;	error:	X509_policy_tree_free(tree);	return 0;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -