Ejemplo n.º 1
0
int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps)
{
    POLICY_MAPPING *map;
    X509_POLICY_DATA *data;
    X509_POLICY_CACHE *cache = x->policy_cache;
    size_t i;
    int ret = 0;
    if (sk_POLICY_MAPPING_num(maps) == 0) {
        ret = -1;
        goto bad_mapping;
    }
    for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++) {
        map = sk_POLICY_MAPPING_value(maps, i);
        /* Reject if map to or from anyPolicy */
        if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy)
            || (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy)) {
            ret = -1;
            goto bad_mapping;
        }

        /* Attempt to find matching policy data */
        data = policy_cache_find_data(cache, map->issuerDomainPolicy);
        /* If we don't have anyPolicy can't map */
        if (!data && !cache->anyPolicy)
            continue;

        /* Create a NODE from anyPolicy */
        if (!data) {
            data = policy_data_new(NULL, map->issuerDomainPolicy,
                                   cache->anyPolicy->flags
                                   & POLICY_DATA_FLAG_CRITICAL);
            if (!data)
                goto bad_mapping;
            data->qualifier_set = cache->anyPolicy->qualifier_set;
            /*
             * map->issuerDomainPolicy = NULL;
             */
            data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
            data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
            if (!sk_X509_POLICY_DATA_push(cache->data, data)) {
                policy_data_free(data);
                goto bad_mapping;
            }
        } else
            data->flags |= POLICY_DATA_FLAG_MAPPED;
        if (!sk_ASN1_OBJECT_push(data->expected_policy_set,
                                 map->subjectDomainPolicy))
            goto bad_mapping;
        map->subjectDomainPolicy = NULL;

    }

    ret = 1;
 bad_mapping:
    if (ret == -1)
        x->ex_flags |= EXFLAG_INVALID_POLICY;
    sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
    return ret;

}
Ejemplo n.º 2
0
static int policy_cache_create (X509 * x, CERTIFICATEPOLICIES * policies, int crit)
{
    int i;

    int ret = 0;

    X509_POLICY_CACHE *cache = x->policy_cache;

    X509_POLICY_DATA *data = NULL;

    POLICYINFO *policy;

    if (sk_POLICYINFO_num (policies) == 0)
        goto bad_policy;
    cache->data = sk_X509_POLICY_DATA_new (policy_data_cmp);
    if (!cache->data)
        goto bad_policy;
    for (i = 0; i < sk_POLICYINFO_num (policies); i++)
    {
        policy = sk_POLICYINFO_value (policies, i);
        data = policy_data_new (policy, NULL, crit);
        if (!data)
            goto bad_policy;
        /* Duplicate policy OIDs are illegal: reject if matches
         * found.
         */
        if (OBJ_obj2nid (data->valid_policy) == NID_any_policy)
        {
            if (cache->anyPolicy)
            {
                ret = -1;
                goto bad_policy;
            }
            cache->anyPolicy = data;
        }
        else if (sk_X509_POLICY_DATA_find (cache->data, data) != -1)
        {
            ret = -1;
            goto bad_policy;
        }
        else if (!sk_X509_POLICY_DATA_push (cache->data, data))
            goto bad_policy;
        data = NULL;
    }
    ret = 1;
  bad_policy:
    if (ret == -1)
        x->ex_flags |= EXFLAG_INVALID_POLICY;
    if (data)
        policy_data_free (data);
    sk_POLICYINFO_pop_free (policies, POLICYINFO_free);
    if (ret <= 0)
    {
        sk_X509_POLICY_DATA_pop_free (cache->data, policy_data_free);
        cache->data = NULL;
    }
    return ret;
}
Ejemplo n.º 3
0
void policy_cache_free(X509_POLICY_CACHE *cache)
{
    if (!cache)
        return;
    if (cache->anyPolicy)
        policy_data_free(cache->anyPolicy);
    if (cache->data)
        sk_X509_POLICY_DATA_pop_free(cache->data, policy_data_free);
    OPENSSL_free(cache);
}
Ejemplo n.º 4
0
int policy_cache_set_mapping(X509 *x, POLICY_MAPPINGS *maps)
	{
	POLICY_MAPPING *map;
	X509_POLICY_REF *ref = NULL;
	X509_POLICY_DATA *data;
	X509_POLICY_CACHE *cache = x->policy_cache;
	int i;
	int ret = 0;
	if (sk_POLICY_MAPPING_num(maps) == 0)
		{
		ret = -1;
		goto bad_mapping;
		}
	cache->maps = sk_X509_POLICY_REF_new(ref_cmp);
	for (i = 0; i < sk_POLICY_MAPPING_num(maps); i++)
		{
		map = sk_POLICY_MAPPING_value(maps, i);
		/* Reject if map to or from anyPolicy */
		if ((OBJ_obj2nid(map->subjectDomainPolicy) == NID_any_policy)
		   || (OBJ_obj2nid(map->issuerDomainPolicy) == NID_any_policy))
			{
			ret = -1;
			goto bad_mapping;
			}

		/* If we've already mapped from this OID bad mapping */
		if (policy_map_find(cache, map->subjectDomainPolicy) != NULL)
			{
			ret = -1;
			goto bad_mapping;
			}

		/* Attempt to find matching policy data */
		data = policy_cache_find_data(cache, map->issuerDomainPolicy);
		/* If we don't have anyPolicy can't map */
		if (!data && !cache->anyPolicy)
			continue;

		/* Create a NODE from anyPolicy */
		if (!data)
			{
			data = policy_data_new(NULL, map->issuerDomainPolicy,
					cache->anyPolicy->flags
						& POLICY_DATA_FLAG_CRITICAL);
			if (!data)
				goto bad_mapping;
			data->qualifier_set = cache->anyPolicy->qualifier_set;
			map->issuerDomainPolicy = NULL;
			data->flags |= POLICY_DATA_FLAG_MAPPED_ANY;
			data->flags |= POLICY_DATA_FLAG_SHARED_QUALIFIERS;
			if (!sk_X509_POLICY_DATA_push(cache->data, data))
				{
				policy_data_free(data);
				goto bad_mapping;
				}
			}
		else
			data->flags |= POLICY_DATA_FLAG_MAPPED;

		if (!sk_ASN1_OBJECT_push(data->expected_policy_set, 
						map->subjectDomainPolicy))
			goto bad_mapping;
		
		ref = OPENSSL_malloc(sizeof(X509_POLICY_REF));
		if (!ref)
			goto bad_mapping;

		ref->subjectDomainPolicy = map->subjectDomainPolicy;
		map->subjectDomainPolicy = NULL;
		ref->data = data;

		if (!sk_X509_POLICY_REF_push(cache->maps, ref))
			goto bad_mapping;

		ref = NULL;

		}

	ret = 1;
	bad_mapping:
	if (ret == -1)
		x->ex_flags |= EXFLAG_INVALID_POLICY;
	if (ref)
		policy_map_free(ref);
	if (ret <= 0)
		{
		sk_X509_POLICY_REF_pop_free(cache->maps, policy_map_free);
		cache->maps = NULL;
		}
	sk_POLICY_MAPPING_pop_free(maps, POLICY_MAPPING_free);
	return ret;

	}