xref: /third_party/openssl/crypto/x509/pcy_data.c (revision e1051a39)
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