/*
 * 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;
}
