/*
 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
 * 2004.
 */
/* ====================================================================
 * Copyright (c) 2004 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com). */

#include <openssl/mem.h>
#include <openssl/obj.h>
#include <openssl/thread.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>

#include "../internal.h"
#include "../x509/internal.h"
#include "internal.h"

static int policy_data_cmp(const X509_POLICY_DATA **a,
                           const X509_POLICY_DATA **b);
static int policy_cache_set_int(long *out, ASN1_INTEGER *value);

/*
 * Set cache entry according to CertificatePolicies extension. Note: this
 * destroys the passed CERTIFICATEPOLICIES structure.
 */

static int policy_cache_create(X509 *x, CERTIFICATEPOLICIES *policies,
                               int crit) {
  size_t 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.
     */
    sk_X509_POLICY_DATA_sort(cache->data);
    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, NULL, data)) {
      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;
}

static int policy_cache_new(X509 *x) {
  X509_POLICY_CACHE *cache;
  ASN1_INTEGER *ext_any = NULL;
  POLICY_CONSTRAINTS *ext_pcons = NULL;
  CERTIFICATEPOLICIES *ext_cpols = NULL;
  POLICY_MAPPINGS *ext_pmaps = NULL;
  int i;
  cache = OPENSSL_malloc(sizeof(X509_POLICY_CACHE));
  if (!cache)
    return 0;
  cache->anyPolicy = NULL;
  cache->data = NULL;
  cache->any_skip = -1;
  cache->explicit_skip = -1;
  cache->map_skip = -1;

  x->policy_cache = cache;

  /*
   * Handle requireExplicitPolicy *first*. Need to process this even if we
   * don't have any policies.
   */
  ext_pcons = X509_get_ext_d2i(x, NID_policy_constraints, &i, NULL);

  if (!ext_pcons) {
    if (i != -1)
      goto bad_cache;
  } else {
    if (!ext_pcons->requireExplicitPolicy && !ext_pcons->inhibitPolicyMapping)
      goto bad_cache;
    if (!policy_cache_set_int(&cache->explicit_skip,
                              ext_pcons->requireExplicitPolicy))
      goto bad_cache;
    if (!policy_cache_set_int(&cache->map_skip,
                              ext_pcons->inhibitPolicyMapping))
      goto bad_cache;
  }

  /* Process CertificatePolicies */

  ext_cpols = X509_get_ext_d2i(x, NID_certificate_policies, &i, NULL);
  /*
   * If no CertificatePolicies extension or problem decoding then there is
   * no point continuing because the valid policies will be NULL.
   */
  if (!ext_cpols) {
    /* If not absent some problem with extension */
    if (i != -1)
      goto bad_cache;
    return 1;
  }

  i = policy_cache_create(x, ext_cpols, i);

  /* NB: ext_cpols freed by policy_cache_set_policies */

  if (i <= 0)
    return i;

  ext_pmaps = X509_get_ext_d2i(x, NID_policy_mappings, &i, NULL);

  if (!ext_pmaps) {
    /* If not absent some problem with extension */
    if (i != -1)
      goto bad_cache;
  } else {
    i = policy_cache_set_mapping(x, ext_pmaps);
    if (i <= 0)
      goto bad_cache;
  }

  ext_any = X509_get_ext_d2i(x, NID_inhibit_any_policy, &i, NULL);

  if (!ext_any) {
    if (i != -1)
      goto bad_cache;
  } else if (!policy_cache_set_int(&cache->any_skip, ext_any))
    goto bad_cache;

  if (0) {
  bad_cache:
    x->ex_flags |= EXFLAG_INVALID_POLICY;
  }

  if (ext_pcons)
    POLICY_CONSTRAINTS_free(ext_pcons);

  if (ext_any)
    ASN1_INTEGER_free(ext_any);

  return 1;
}

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

/*
 * g_x509_policy_cache_lock is used to protect against concurrent calls to
 * |policy_cache_new|. Ideally this would be done with a |CRYPTO_once_t| in
 * the |X509| structure, but |CRYPTO_once_t| isn't public.
 */
static struct CRYPTO_STATIC_MUTEX g_x509_policy_cache_lock =
    CRYPTO_STATIC_MUTEX_INIT;

const X509_POLICY_CACHE *policy_cache_set(X509 *x) {
  X509_POLICY_CACHE *cache;

  CRYPTO_STATIC_MUTEX_lock_read(&g_x509_policy_cache_lock);
  cache = x->policy_cache;
  CRYPTO_STATIC_MUTEX_unlock_read(&g_x509_policy_cache_lock);

  if (cache != NULL)
    return cache;

  CRYPTO_STATIC_MUTEX_lock_write(&g_x509_policy_cache_lock);
  if (x->policy_cache == NULL)
    policy_cache_new(x);
  cache = x->policy_cache;
  CRYPTO_STATIC_MUTEX_unlock_write(&g_x509_policy_cache_lock);

  return cache;
}

X509_POLICY_DATA *policy_cache_find_data(const X509_POLICY_CACHE *cache,
                                         const ASN1_OBJECT *id) {
  size_t idx;
  X509_POLICY_DATA tmp;

  tmp.valid_policy = (ASN1_OBJECT *)id;
  sk_X509_POLICY_DATA_sort(cache->data);
  if (!sk_X509_POLICY_DATA_find(cache->data, &idx, &tmp))
    return NULL;
  return sk_X509_POLICY_DATA_value(cache->data, idx);
}

static int policy_data_cmp(const X509_POLICY_DATA **a,
                           const X509_POLICY_DATA **b) {
  return OBJ_cmp((*a)->valid_policy, (*b)->valid_policy);
}

static int policy_cache_set_int(long *out, ASN1_INTEGER *value) {
  if (value == NULL)
    return 1;
  if (value->type == V_ASN1_NEG_INTEGER)
    return 0;
  *out = ASN1_INTEGER_get(value);
  return 1;
}
