/*
 * Copyright (C) 2002-2021 Free Software Foundation, Inc.
 *
 * This file is part of LIBTASN1.
 *
 * LIBTASN1 is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * LIBTASN1 is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with LIBTASN1; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 *
 */

/**
 * SECTION:libtasn1
 * @short_description: GNU ASN.1 library
 *
 * The Libtasn1 library provides Abstract Syntax Notation One (ASN.1, as
 * specified by the X.680 ITU-T recommendation) parsing and structures
 * management, and Distinguished Encoding Rules (DER, as per X.690)
 * encoding and decoding functions.
 */


#ifndef LIBTASN1_H
# define LIBTASN1_H

# ifndef ASN1_API
#  if defined ASN1_BUILDING && defined HAVE_VISIBILITY && HAVE_VISIBILITY
#   define ASN1_API __attribute__((__visibility__("default")))
#  elif defined ASN1_BUILDING && defined _MSC_VER && ! defined ASN1_STATIC
#   define ASN1_API __declspec(dllexport)
#  elif defined _MSC_VER && ! defined ASN1_STATIC
#   define ASN1_API __declspec(dllimport)
#  else
#   define ASN1_API
#  endif
# endif

# ifdef __GNUC__
#  define __LIBTASN1_CONST__  __attribute__((const))
#  define __LIBTASN1_PURE__  __attribute__((pure))
# else
#  define __LIBTASN1_CONST__
#  define __LIBTASN1_PURE__
# endif

# include <sys/types.h>
# include <time.h>
# include <stdio.h>		/* for FILE* */

# ifdef __cplusplus
extern "C"
{
# endif

/**
 * ASN1_VERSION:
 *
 * Version of the library as a string.
 */
# define ASN1_VERSION "@VERSION@"

/**
 * ASN1_VERSION_MAJOR:
 *
 * Major version number of the library.
 */
# define ASN1_VERSION_MAJOR @MAJOR_VERSION@

/**
 * ASN1_VERSION_MINOR:
 *
 * Minor version number of the library.
 */
# define ASN1_VERSION_MINOR @MINOR_VERSION@

/**
 * ASN1_VERSION_PATCH:
 *
 * Patch version number of the library.
 */
# define ASN1_VERSION_PATCH @PATCH_VERSION@

/**
 * ASN1_VERSION_NUMBER:
 *
 * Version number of the library as a number.
 */
# define ASN1_VERSION_NUMBER @NUMBER_VERSION@


# if defined __GNUC__ && !defined ASN1_INTERNAL_BUILD
#  define _ASN1_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
#  if _ASN1_GCC_VERSION >= 30100
#   define _ASN1_GCC_ATTR_DEPRECATED __attribute__ ((__deprecated__))
#  endif
# endif

# ifndef _ASN1_GCC_ATTR_DEPRECATED
#  define _ASN1_GCC_ATTR_DEPRECATED
# endif

/*****************************************/
/* Errors returned by libtasn1 functions */
/*****************************************/
# define ASN1_SUCCESS			0
# define ASN1_FILE_NOT_FOUND		1
# define ASN1_ELEMENT_NOT_FOUND		2
# define ASN1_IDENTIFIER_NOT_FOUND	3
# define ASN1_DER_ERROR			4
# define ASN1_VALUE_NOT_FOUND		5
# define ASN1_GENERIC_ERROR		6
# define ASN1_VALUE_NOT_VALID		7
# define ASN1_TAG_ERROR			8
# define ASN1_TAG_IMPLICIT		9
# define ASN1_ERROR_TYPE_ANY		10
# define ASN1_SYNTAX_ERROR		11
# define ASN1_MEM_ERROR			12
# define ASN1_MEM_ALLOC_ERROR		13
# define ASN1_DER_OVERFLOW		14
# define ASN1_NAME_TOO_LONG		15
# define ASN1_ARRAY_ERROR		16
# define ASN1_ELEMENT_NOT_EMPTY		17
# define ASN1_TIME_ENCODING_ERROR	18
# define ASN1_RECURSION			19

/*************************************/
/* Constants used in asn1_visit_tree */
/*************************************/
# define ASN1_PRINT_NAME			1
# define ASN1_PRINT_NAME_TYPE		2
# define ASN1_PRINT_NAME_TYPE_VALUE	3
# define ASN1_PRINT_ALL			4

/*****************************************/
/* Constants returned by asn1_read_tag   */
/*****************************************/
# define ASN1_CLASS_UNIVERSAL		0x00	/* old: 1 */
# define ASN1_CLASS_APPLICATION		0x40	/* old: 2 */
# define ASN1_CLASS_CONTEXT_SPECIFIC	0x80	/* old: 3 */
# define ASN1_CLASS_PRIVATE		0xC0	/* old: 4 */
# define ASN1_CLASS_STRUCTURED		0x20

/*****************************************/
/* Constants returned by asn1_read_tag   */
/*****************************************/
# define ASN1_TAG_BOOLEAN		0x01
# define ASN1_TAG_INTEGER		0x02
# define ASN1_TAG_SEQUENCE		0x10
# define ASN1_TAG_SET			0x11
# define ASN1_TAG_OCTET_STRING		0x04
# define ASN1_TAG_BIT_STRING		0x03
# define ASN1_TAG_UTCTime		0x17
# define ASN1_TAG_GENERALIZEDTime	0x18
# define ASN1_TAG_OBJECT_ID		0x06
# define ASN1_TAG_ENUMERATED		0x0A
# define ASN1_TAG_NULL			0x05
# define ASN1_TAG_GENERALSTRING		0x1B
# define ASN1_TAG_NUMERIC_STRING		0x12
# define ASN1_TAG_IA5_STRING		0x16
# define ASN1_TAG_TELETEX_STRING		0x14
# define ASN1_TAG_PRINTABLE_STRING	0x13
# define ASN1_TAG_UNIVERSAL_STRING	0x1C
# define ASN1_TAG_BMP_STRING		0x1E
# define ASN1_TAG_UTF8_STRING		0x0C
# define ASN1_TAG_VISIBLE_STRING		0x1A

/**
 * asn1_node:
 *
 * Structure definition used for the node of the tree
 * that represents an ASN.1 DEFINITION.
 */
  typedef struct asn1_node_st asn1_node_st;

  typedef asn1_node_st *asn1_node;
  typedef const asn1_node_st *asn1_node_const;

/**
 * ASN1_MAX_NAME_SIZE:
 *
 * Maximum number of characters of a name
 * inside a file with ASN1 definitions.
 */
# define ASN1_MAX_NAME_SIZE 64


/**
 * asn1_static_node:
 * @name: Node name
 * @type: Node typ
 * @value: Node value
 *
 * For the on-disk format of ASN.1 trees, created by asn1_parser2array().
 */
  typedef struct asn1_static_node_st
  {
    const char *name;		/* Node name */
    unsigned int type;		/* Node type */
    const void *value;		/* Node value */
  } asn1_static_node;

/* List of constants for field type of asn1_static_node */
# define ASN1_ETYPE_INVALID        0
# define ASN1_ETYPE_CONSTANT       1
# define ASN1_ETYPE_IDENTIFIER     2
# define ASN1_ETYPE_INTEGER        3
# define ASN1_ETYPE_BOOLEAN        4
# define ASN1_ETYPE_SEQUENCE       5
# define ASN1_ETYPE_BIT_STRING     6
# define ASN1_ETYPE_OCTET_STRING   7
# define ASN1_ETYPE_TAG            8
# define ASN1_ETYPE_DEFAULT        9
# define ASN1_ETYPE_SIZE          10
# define ASN1_ETYPE_SEQUENCE_OF   11
# define ASN1_ETYPE_OBJECT_ID     12
# define ASN1_ETYPE_ANY           13
# define ASN1_ETYPE_SET           14
# define ASN1_ETYPE_SET_OF        15
# define ASN1_ETYPE_DEFINITIONS   16
# define ASN1_ETYPE_CHOICE        18
# define ASN1_ETYPE_IMPORTS       19
# define ASN1_ETYPE_NULL          20
# define ASN1_ETYPE_ENUMERATED    21
# define ASN1_ETYPE_GENERALSTRING 27
# define ASN1_ETYPE_NUMERIC_STRING 28
# define ASN1_ETYPE_IA5_STRING     29
# define ASN1_ETYPE_TELETEX_STRING 30
# define ASN1_ETYPE_PRINTABLE_STRING 31
# define ASN1_ETYPE_UNIVERSAL_STRING 32
# define ASN1_ETYPE_BMP_STRING     33
# define ASN1_ETYPE_UTF8_STRING    34
# define ASN1_ETYPE_VISIBLE_STRING 35
# define ASN1_ETYPE_UTC_TIME       36
# define ASN1_ETYPE_GENERALIZED_TIME 37

/**
 * ASN1_DELETE_FLAG_ZEROIZE:
 *
 * Used by: asn1_delete_structure2()
 *
 * Zeroize values prior to deinitialization.
 */
# define ASN1_DELETE_FLAG_ZEROIZE 1

/**
 * ASN1_DECODE_FLAG_ALLOW_PADDING:
 *
 * Used by: asn1_der_decoding2()
 *
 * This flag would allow arbitrary data past the DER data.
 */
# define ASN1_DECODE_FLAG_ALLOW_PADDING 1
/**
 * ASN1_DECODE_FLAG_STRICT_DER:
 *
 * Used by: asn1_der_decoding2()
 *
 * This flag would ensure that no BER decoding takes place.
 */
# define ASN1_DECODE_FLAG_STRICT_DER (1<<1)
/**
 * ASN1_DECODE_FLAG_ALLOW_INCORRECT_TIME:
 *
 * Used by: asn1_der_decoding2()
 *
 * This flag will tolerate Time encoding errors when in strict DER.
 */
# define ASN1_DECODE_FLAG_ALLOW_INCORRECT_TIME (1<<2)


/**
 * asn1_data_node_st:
 * @name: Node name
 * @value: Node value
 * @value_len: Node value size
 * @type: Node value type (ASN1_ETYPE_*)
 *
 * Data node inside a #asn1_node structure.
 */
  struct asn1_data_node_st
  {
    const char *name;		/* Node name */
    const void *value;		/* Node value */
    unsigned int value_len;	/* Node value size */
    unsigned int type;		/* Node value type (ASN1_ETYPE_*) */
  };
  typedef struct asn1_data_node_st asn1_data_node_st;

/***********************************/
/*  Fixed constants                */
/***********************************/

/**
 * ASN1_MAX_ERROR_DESCRIPTION_SIZE:
 *
 * Maximum number of characters
 * of a description message
 * (null character included).
 */
# define ASN1_MAX_ERROR_DESCRIPTION_SIZE 128

/***********************************/
/*  Functions definitions          */
/***********************************/

  extern ASN1_API int
    asn1_parser2tree (const char *file,
		      asn1_node * definitions, char *error_desc);

  extern ASN1_API int
    asn1_parser2array (const char *inputFileName,
		       const char *outputFileName,
		       const char *vectorName, char *error_desc);

  extern ASN1_API int
    asn1_array2tree (const asn1_static_node * array,
		     asn1_node * definitions, char *errorDescription);

  extern ASN1_API void
    asn1_print_structure (FILE * out, asn1_node_const structure,
			  const char *name, int mode);

  extern ASN1_API int
    asn1_create_element (asn1_node_const definitions,
			 const char *source_name, asn1_node * element);

  extern ASN1_API int asn1_delete_structure (asn1_node * structure);

  extern ASN1_API int asn1_delete_structure2 (asn1_node * structure,
					      unsigned int flags);

  extern ASN1_API int
    asn1_delete_element (asn1_node structure, const char *element_name);

  extern ASN1_API int
    asn1_write_value (asn1_node node_root, const char *name,
		      const void *ivalue, int len);

  extern ASN1_API int
    asn1_read_value (asn1_node_const root, const char *name,
		     void *ivalue, int *len);

  extern ASN1_API int
    asn1_read_value_type (asn1_node_const root, const char *name,
			  void *ivalue, int *len, unsigned int *etype);

  extern ASN1_API int
    asn1_read_node_value (asn1_node_const node, asn1_data_node_st * data);

  extern ASN1_API int
    asn1_number_of_elements (asn1_node_const element, const char *name,
			     int *num);

  extern ASN1_API int
    asn1_der_coding (asn1_node_const element, const char *name,
		     void *ider, int *len, char *ErrorDescription);

  extern ASN1_API int
    asn1_der_decoding2 (asn1_node * element, const void *ider,
			int *max_ider_len, unsigned int flags,
			char *errorDescription);

  extern ASN1_API int
    asn1_der_decoding (asn1_node * element, const void *ider,
		       int ider_len, char *errorDescription);

/* Do not use. Use asn1_der_decoding() instead. */
  extern ASN1_API int
    asn1_der_decoding_element (asn1_node * structure,
			       const char *elementName,
			       const void *ider, int len,
			       char *errorDescription)
    _ASN1_GCC_ATTR_DEPRECATED;

  extern ASN1_API int
    asn1_der_decoding_startEnd (asn1_node element,
				const void *ider, int ider_len,
				const char *name_element,
				int *start, int *end);

  extern ASN1_API int
    asn1_expand_any_defined_by (asn1_node_const definitions,
				asn1_node * element);

  extern ASN1_API int
    asn1_expand_octet_string (asn1_node_const definitions,
			      asn1_node * element,
			      const char *octetName, const char *objectName);

  extern ASN1_API int
    asn1_read_tag (asn1_node_const root, const char *name,
		   int *tagValue, int *classValue);

  extern ASN1_API const char *asn1_find_structure_from_oid (asn1_node_const
							    definitions,
							    const char
							    *oidValue);

    __LIBTASN1_PURE__
    extern ASN1_API const char *asn1_check_version (const char *req_version);

  __LIBTASN1_PURE__ extern ASN1_API const char *asn1_strerror (int error);

  extern ASN1_API void asn1_perror (int error);

# define ASN1_MAX_TAG_SIZE 4
# define ASN1_MAX_LENGTH_SIZE 9
# define ASN1_MAX_TL_SIZE (ASN1_MAX_TAG_SIZE+ASN1_MAX_LENGTH_SIZE)
  extern ASN1_API long
    asn1_get_length_der (const unsigned char *der, int der_len, int *len);

  extern ASN1_API long
    asn1_get_length_ber (const unsigned char *ber, int ber_len, int *len);

  extern ASN1_API void
    asn1_length_der (unsigned long int len, unsigned char *der, int *der_len);

/* Other utility functions. */

  extern ASN1_API
    int asn1_decode_simple_der (unsigned int etype, const unsigned char *der,
				unsigned int _der_len,
				const unsigned char **str,
				unsigned int *str_len);

  extern ASN1_API
    int asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
				unsigned int _der_len,
				unsigned char **str,
				unsigned int *str_len, unsigned int *ber_len);

  extern ASN1_API int
    asn1_encode_simple_der (unsigned int etype, const unsigned char *str,
			    unsigned int str_len, unsigned char *tl,
			    unsigned int *tl_len);

  extern ASN1_API asn1_node
    asn1_find_node (asn1_node_const pointer, const char *name);

  extern ASN1_API int
    asn1_copy_node (asn1_node dst, const char *dst_name,
		    asn1_node_const src, const char *src_name);
  extern ASN1_API asn1_node
    asn1_dup_node (asn1_node_const src, const char *src_name);

/* Internal and low-level DER utility functions. */

  extern ASN1_API int
    asn1_get_tag_der (const unsigned char *der, int der_len,
		      unsigned char *cls, int *len, unsigned long *tag);

  extern ASN1_API void
    asn1_octet_der (const unsigned char *str, int str_len,
		    unsigned char *der, int *der_len);

  extern ASN1_API int
    asn1_get_octet_der (const unsigned char *der, int der_len,
			int *ret_len, unsigned char *str,
			int str_size, int *str_len);

  extern ASN1_API void asn1_bit_der (const unsigned char *str, int bit_len,
				     unsigned char *der, int *der_len);

  extern ASN1_API int
    asn1_get_bit_der (const unsigned char *der, int der_len,
		      int *ret_len, unsigned char *str,
		      int str_size, int *bit_len);

  extern ASN1_API int
    asn1_get_object_id_der (const unsigned char *der,
			    int der_len, int *ret_len,
			    char *str, int str_size);

  extern ASN1_API int
    asn1_object_id_der (const char *str, unsigned char *der, int *der_len,
			unsigned flags);

/* Compatibility types */

/**
 * asn1_retCode:
 *
 * Type formerly returned by libtasn1 functions.
 *
 * Deprecated: 3.0: Use int instead.
 */
  typedef int asn1_retCode _ASN1_GCC_ATTR_DEPRECATED;

/**
 * node_asn_struct:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define node_asn_struct _Pragma ("GCC warning \"'node_asn_struct' macro is deprecated, use 'asn1_node' instead.\"") asn1_node_st
#  else
#   define node_asn_struct asn1_node_st
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * node_asn:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define node_asn _Pragma ("GCC warning \"'node_asn' macro is deprecated, use 'asn1_node' instead.\"") asn1_node_st
#  else
#   define node_asn asn1_node_st
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * ASN1_TYPE:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define ASN1_TYPE _Pragma ("GCC warning \"'ASN1_TYPE' macro is deprecated, use 'asn1_node' instead.\"") asn1_node
#  else
#   define ASN1_TYPE asn1_node
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * ASN1_TYPE_EMPTY:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use NULL instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define ASN1_TYPE_EMPTY _Pragma ("GCC warning \"'ASN1_TYPE_EMPTY' macro is deprecated, use 'NULL' instead.\"") NULL
#  else
#   define ASN1_TYPE_EMPTY NULL
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * static_struct_asn:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_static_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define static_struct_asn _Pragma ("GCC warning \"'static_struct_asn' macro is deprecated, use 'asn1_static_node_st' instead.\"") asn1_static_node_st
#  else
#   define static_struct_asn asn1_static_node_st
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * ASN1_ARRAY_TYPE:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_static_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define ASN1_ARRAY_TYPE _Pragma ("GCC warning \"'ASN1_ARRAY_TYPE' macro is deprecated, use 'asn1_static_node' instead.\"") asn1_static_node
#  else
#   define ASN1_ARRAY_TYPE asn1_static_node
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * asn1_static_node_t:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_static_node instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define asn1_static_node_t _Pragma ("GCC warning \"'asn1_static_node_t' macro is deprecated, use 'asn1_static_node' instead.\"") asn1_static_node
#  else
#   define asn1_static_node_t asn1_static_node
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * node_data_struct:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_data_node_st instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define node_data_struct _Pragma ("GCC warning \"'node_data_struct' macro is deprecated, use 'asn1_data_node_st' instead.\"") asn1_data_node_st
#  else
#   define node_data_struct asn1_data_node_st
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

/**
 * ASN1_DATA_NODE:
 *
 * Compat #define.
 *
 * Deprecated: 3.0: Use #asn1_data_node_st instead.
 */
# ifndef ASN1_DISABLE_DEPRECATED
#  if _ASN1_GCC_VERSION >= 30100
#   define ASN1_DATA_NODE _Pragma ("GCC warning \"'asn1_static_node_t' macro is deprecated, use 'asn1_static_node' instead.\"") asn1_data_node_st
#  else
#   define ASN1_DATA_NODE asn1_data_node_st
#  endif
# endif				/* !ASN1_DISABLE_DEPRECATED */

# ifdef __cplusplus
}
# endif

#endif				/* LIBTASN1_H */
