1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2004-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 11e1051a39Sopenharmony_ci#include <openssl/x509.h> 12e1051a39Sopenharmony_ci#include <openssl/x509v3.h> 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ci#include "pcy_local.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci/* Policy Node routines */ 17e1051a39Sopenharmony_ci 18e1051a39Sopenharmony_civoid ossl_policy_data_free(X509_POLICY_DATA *data) 19e1051a39Sopenharmony_ci{ 20e1051a39Sopenharmony_ci if (data == NULL) 21e1051a39Sopenharmony_ci return; 22e1051a39Sopenharmony_ci ASN1_OBJECT_free(data->valid_policy); 23e1051a39Sopenharmony_ci /* Don't free qualifiers if shared */ 24e1051a39Sopenharmony_ci if (!(data->flags & POLICY_DATA_FLAG_SHARED_QUALIFIERS)) 25e1051a39Sopenharmony_ci sk_POLICYQUALINFO_pop_free(data->qualifier_set, POLICYQUALINFO_free); 26e1051a39Sopenharmony_ci sk_ASN1_OBJECT_pop_free(data->expected_policy_set, ASN1_OBJECT_free); 27e1051a39Sopenharmony_ci OPENSSL_free(data); 28e1051a39Sopenharmony_ci} 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ci/* 31e1051a39Sopenharmony_ci * Create a data based on an existing policy. If 'id' is NULL use the OID in 32e1051a39Sopenharmony_ci * the policy, otherwise use 'id'. This behaviour covers the two types of 33e1051a39Sopenharmony_ci * data in RFC3280: data with from a CertificatePolicies extension and 34e1051a39Sopenharmony_ci * additional data with just the qualifiers of anyPolicy and ID from another 35e1051a39Sopenharmony_ci * source. 36e1051a39Sopenharmony_ci */ 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ciX509_POLICY_DATA *ossl_policy_data_new(POLICYINFO *policy, 39e1051a39Sopenharmony_ci const ASN1_OBJECT *cid, int crit) 40e1051a39Sopenharmony_ci{ 41e1051a39Sopenharmony_ci X509_POLICY_DATA *ret; 42e1051a39Sopenharmony_ci ASN1_OBJECT *id; 43e1051a39Sopenharmony_ci 44e1051a39Sopenharmony_ci if (policy == NULL && cid == NULL) 45e1051a39Sopenharmony_ci return NULL; 46e1051a39Sopenharmony_ci if (cid) { 47e1051a39Sopenharmony_ci id = OBJ_dup(cid); 48e1051a39Sopenharmony_ci if (id == NULL) 49e1051a39Sopenharmony_ci return NULL; 50e1051a39Sopenharmony_ci } else 51e1051a39Sopenharmony_ci id = NULL; 52e1051a39Sopenharmony_ci ret = OPENSSL_zalloc(sizeof(*ret)); 53e1051a39Sopenharmony_ci if (ret == NULL) { 54e1051a39Sopenharmony_ci ASN1_OBJECT_free(id); 55e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE); 56e1051a39Sopenharmony_ci return NULL; 57e1051a39Sopenharmony_ci } 58e1051a39Sopenharmony_ci ret->expected_policy_set = sk_ASN1_OBJECT_new_null(); 59e1051a39Sopenharmony_ci if (ret->expected_policy_set == NULL) { 60e1051a39Sopenharmony_ci OPENSSL_free(ret); 61e1051a39Sopenharmony_ci ASN1_OBJECT_free(id); 62e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509V3, ERR_R_MALLOC_FAILURE); 63e1051a39Sopenharmony_ci return NULL; 64e1051a39Sopenharmony_ci } 65e1051a39Sopenharmony_ci 66e1051a39Sopenharmony_ci if (crit) 67e1051a39Sopenharmony_ci ret->flags = POLICY_DATA_FLAG_CRITICAL; 68e1051a39Sopenharmony_ci 69e1051a39Sopenharmony_ci if (id) 70e1051a39Sopenharmony_ci ret->valid_policy = id; 71e1051a39Sopenharmony_ci else { 72e1051a39Sopenharmony_ci ret->valid_policy = policy->policyid; 73e1051a39Sopenharmony_ci policy->policyid = NULL; 74e1051a39Sopenharmony_ci } 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci if (policy) { 77e1051a39Sopenharmony_ci ret->qualifier_set = policy->qualifiers; 78e1051a39Sopenharmony_ci policy->qualifiers = NULL; 79e1051a39Sopenharmony_ci } 80e1051a39Sopenharmony_ci 81e1051a39Sopenharmony_ci return ret; 82e1051a39Sopenharmony_ci} 83