/* v3_pci.c -*- mode:C; c-file-style: "eay" -*- */
/*
 * Contributed to the OpenSSL Project 2004 by Richard Levitte
 * (richard@levitte.org)
 */
/* Copyright (c) 2004 Kungliga Tekniska Högskolan
 * (Royal Institute of Technology, Stockholm, Sweden).
 * 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. Neither the name of the Institute nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS 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 INSTITUTE OR 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.
 */

#include <string.h>

#include <openssl/conf.h>
#include <openssl/err.h>
#include <openssl/mem.h>
#include <openssl/obj.h>
#include <openssl/x509v3.h>

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


static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
                   int indent);
static void *r2i_pci(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
                     const char *str);

const X509V3_EXT_METHOD v3_pci = {
    NID_proxyCertInfo,
    0,
    ASN1_ITEM_ref(PROXY_CERT_INFO_EXTENSION),
    0,
    0,
    0,
    0,
    0,
    0,
    NULL,
    NULL,
    i2r_pci,
    r2i_pci,
    NULL,
};

static int i2r_pci(const X509V3_EXT_METHOD *method, void *ext, BIO *out,
                   int indent) {
  const PROXY_CERT_INFO_EXTENSION *pci = ext;
  BIO_printf(out, "%*sPath Length Constraint: ", indent, "");
  if (pci->pcPathLengthConstraint) {
    i2a_ASN1_INTEGER(out, pci->pcPathLengthConstraint);
  } else {
    BIO_printf(out, "infinite");
  }
  BIO_puts(out, "\n");
  BIO_printf(out, "%*sPolicy Language: ", indent, "");
  i2a_ASN1_OBJECT(out, pci->proxyPolicy->policyLanguage);
  BIO_puts(out, "\n");
  if (pci->proxyPolicy->policy && pci->proxyPolicy->policy->data) {
    BIO_printf(out, "%*sPolicy Text: %.*s\n", indent, "",
               pci->proxyPolicy->policy->length,
               pci->proxyPolicy->policy->data);
  }
  return 1;
}

static int process_pci_value(CONF_VALUE *val, ASN1_OBJECT **language,
                             ASN1_INTEGER **pathlen,
                             ASN1_OCTET_STRING **policy) {
  int free_policy = 0;

  if (strcmp(val->name, "language") == 0) {
    if (*language) {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED);
      X509V3_conf_err(val);
      return 0;
    }
    if (!(*language = OBJ_txt2obj(val->value, 0))) {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_OBJECT_IDENTIFIER);
      X509V3_conf_err(val);
      return 0;
    }
  } else if (strcmp(val->name, "pathlen") == 0) {
    if (*pathlen) {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED);
      X509V3_conf_err(val);
      return 0;
    }
    if (!X509V3_get_value_int(val, pathlen)) {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_POLICY_PATH_LENGTH);
      X509V3_conf_err(val);
      return 0;
    }
  } else if (strcmp(val->name, "policy") == 0) {
    unsigned char *tmp_data = NULL;
    long val_len;
    if (!*policy) {
      *policy = ASN1_OCTET_STRING_new();
      if (!*policy) {
        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
        X509V3_conf_err(val);
        return 0;
      }
      free_policy = 1;
    }
    if (strncmp(val->value, "hex:", 4) == 0) {
      unsigned char *tmp_data2 = x509v3_hex_to_bytes(val->value + 4, &val_len);

      if (!tmp_data2) {
        OPENSSL_PUT_ERROR(X509V3, X509V3_R_ILLEGAL_HEX_DIGIT);
        X509V3_conf_err(val);
        goto err;
      }

      tmp_data =
          OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1);
      if (tmp_data) {
        (*policy)->data = tmp_data;
        OPENSSL_memcpy(&(*policy)->data[(*policy)->length], tmp_data2, val_len);
        (*policy)->length += val_len;
        (*policy)->data[(*policy)->length] = '\0';
      } else {
        OPENSSL_free(tmp_data2);
        // realloc failure implies the original data space is b0rked
        // too!
        (*policy)->data = NULL;
        (*policy)->length = 0;
        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
        X509V3_conf_err(val);
        goto err;
      }
      OPENSSL_free(tmp_data2);
    } else if (strncmp(val->value, "text:", 5) == 0) {
      val_len = strlen(val->value + 5);
      tmp_data =
          OPENSSL_realloc((*policy)->data, (*policy)->length + val_len + 1);
      if (tmp_data) {
        (*policy)->data = tmp_data;
        OPENSSL_memcpy(&(*policy)->data[(*policy)->length], val->value + 5,
                       val_len);
        (*policy)->length += val_len;
        (*policy)->data[(*policy)->length] = '\0';
      } else {
        // realloc failure implies the original data space is b0rked
        // too!
        (*policy)->data = NULL;
        (*policy)->length = 0;
        OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
        X509V3_conf_err(val);
        goto err;
      }
    } else {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG);
      X509V3_conf_err(val);
      goto err;
    }
    if (!tmp_data) {
      OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
      X509V3_conf_err(val);
      goto err;
    }
  }
  return 1;
err:
  if (free_policy) {
    ASN1_OCTET_STRING_free(*policy);
    *policy = NULL;
  }
  return 0;
}

static void *r2i_pci(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
                     const char *value) {
  PROXY_CERT_INFO_EXTENSION *pci = NULL;
  STACK_OF(CONF_VALUE) *vals;
  ASN1_OBJECT *language = NULL;
  ASN1_INTEGER *pathlen = NULL;
  ASN1_OCTET_STRING *policy = NULL;
  size_t i, j;
  int nid;

  vals = X509V3_parse_list(value);
  for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
    CONF_VALUE *cnf = sk_CONF_VALUE_value(vals, i);
    if (!cnf->name || (*cnf->name != '@' && !cnf->value)) {
      OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_PROXY_POLICY_SETTING);
      X509V3_conf_err(cnf);
      goto err;
    }
    if (*cnf->name == '@') {
      STACK_OF(CONF_VALUE) *sect;
      int success_p = 1;

      sect = X509V3_get_section(ctx, cnf->name + 1);
      if (!sect) {
        OPENSSL_PUT_ERROR(X509V3, X509V3_R_INVALID_SECTION);
        X509V3_conf_err(cnf);
        goto err;
      }
      for (j = 0; success_p && j < sk_CONF_VALUE_num(sect); j++) {
        success_p = process_pci_value(sk_CONF_VALUE_value(sect, j), &language,
                                      &pathlen, &policy);
      }
      X509V3_section_free(ctx, sect);
      if (!success_p) {
        goto err;
      }
    } else {
      if (!process_pci_value(cnf, &language, &pathlen, &policy)) {
        X509V3_conf_err(cnf);
        goto err;
      }
    }
  }

  // Language is mandatory
  if (!language) {
    OPENSSL_PUT_ERROR(X509V3, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED);
    goto err;
  }
  nid = OBJ_obj2nid(language);
  if ((nid == NID_Independent || nid == NID_id_ppl_inheritAll) && policy) {
    OPENSSL_PUT_ERROR(X509V3,
                      X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY);
    goto err;
  }

  pci = PROXY_CERT_INFO_EXTENSION_new();
  if (!pci) {
    OPENSSL_PUT_ERROR(X509V3, ERR_R_MALLOC_FAILURE);
    goto err;
  }

  pci->proxyPolicy->policyLanguage = language;
  language = NULL;
  pci->proxyPolicy->policy = policy;
  policy = NULL;
  pci->pcPathLengthConstraint = pathlen;
  pathlen = NULL;
  goto end;
err:
  if (language) {
    ASN1_OBJECT_free(language);
    language = NULL;
  }
  if (pathlen) {
    ASN1_INTEGER_free(pathlen);
    pathlen = NULL;
  }
  if (policy) {
    ASN1_OCTET_STRING_free(policy);
    policy = NULL;
  }
  if (pci) {
    PROXY_CERT_INFO_EXTENSION_free(pci);
    pci = NULL;
  }
end:
  sk_CONF_VALUE_pop_free(vals, X509V3_conf_free);
  return pci;
}
