/* asn1-func.h - definitions for asn1-func.c * Copyright (C) 2000,2001 Fabio Fiorina * Copyright (C) 2001 Free Software Foundation, Inc. * Copyright (C) 2002, 2003, 2006, 2007, 2010, 2012 g10 Code GmbH * * This file is part of KSBA. * * KSBA is free software; you can redistribute it and/or modify * it under the terms of either * * - the GNU Lesser General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at * your option) any later version. * * or * * - the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at * your option) any later version. * * or both in parallel, as here. * * KSBA 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 General Public * License for more details. * * You should have received a copies of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, see <http://www.gnu.org/licenses/>. */ #ifndef ASN1_FUNC_H #define ASN1_FUNC_H typedef enum { TYPE_NONE = 0, TYPE_BOOLEAN = 1, TYPE_INTEGER = 2, TYPE_BIT_STRING = 3, TYPE_OCTET_STRING = 4, TYPE_NULL = 5, TYPE_OBJECT_ID = 6, TYPE_OBJECT_DESCRIPTOR = 7, TYPE_EXTERNAL = 8, TYPE_REAL = 9, TYPE_ENUMERATED = 10, TYPE_EMBEDDED_PDV = 11, TYPE_UTF8_STRING = 12, TYPE_REALTIVE_OID = 13, TYPE_SEQUENCE = 16, TYPE_SET = 17, TYPE_NUMERIC_STRING = 18, TYPE_PRINTABLE_STRING = 19, TYPE_TELETEX_STRING = 20, TYPE_VIDEOTEX_STRING = 21, TYPE_IA5_STRING = 22, TYPE_UTC_TIME = 23, TYPE_GENERALIZED_TIME = 24, TYPE_GRAPHIC_STRING = 25, TYPE_VISIBLE_STRING = 26, TYPE_GENERAL_STRING = 27, TYPE_UNIVERSAL_STRING = 28, TYPE_CHARACTER_STRING = 29, TYPE_BMP_STRING = 30, /* the following values do not correspond to an Universal tag */ TYPE_CONSTANT = 128, TYPE_IDENTIFIER, TYPE_TAG, TYPE_DEFAULT, TYPE_SIZE, TYPE_SEQUENCE_OF, TYPE_ANY, TYPE_SET_OF, TYPE_DEFINITIONS, TYPE_CHOICE, TYPE_IMPORTS, TYPE_PRE_SEQUENCE /* premanufactured Seqences as used by the DER encoder. */ } node_type_t; enum tag_class { CLASS_UNIVERSAL = 0, CLASS_APPLICATION = 1, CLASS_CONTEXT = 2, CLASS_PRIVATE =3 }; /* Important: this must match the code in asn1-gentables.c */ struct node_flag_s { enum tag_class class; int explicit:1; int implicit:1; int has_imports:1; int assignment:1; /* node is an assignment */ int one_param:1; int has_tag:1; int has_size:1; int has_list:1; int has_min_max:1; int has_defined_by:1; int is_false:1; int is_true:1; int has_default:1; /* node has a default value (fixme:needed???)*/ int is_optional:1; int is_implicit:1; int in_set:1; int in_choice:1; int in_array:1; int is_any:1; /* The der-encoder must change any to a real type but still be aware that it actually is any */ int not_used:1; int help_down:1; /* helper for create_tree */ int help_right:1; /* helper for create_tree */ int tag_seen:1; int skip_this:1; /* helper */ }; enum asn_value_type { VALTYPE_NULL = 0, VALTYPE_BOOL, VALTYPE_CSTR, VALTYPE_MEM, VALTYPE_LONG, VALTYPE_ULONG }; union asn_value_u { int v_bool; char *v_cstr; struct { size_t len; unsigned char *buf; } v_mem; long v_long; unsigned long v_ulong; }; /* * Structure definition used for the node of the tree that represents * an ASN.1 DEFINITION. */ #ifndef HAVE_TYPEDEFD_ASNNODE typedef struct asn_node_struct *AsnNode; typedef struct asn_node_struct *asn_node_t; #define HAVE_TYPEDEFD_ASNNODE #endif struct asn_node_struct { char *name; /* Node name */ node_type_t type; struct node_flag_s flags; enum asn_value_type valuetype; union asn_value_u value; int off; /* offset of this TLV */ int nhdr; /* length of the header */ int len; /* length part of the TLV */ node_type_t actual_type; /* ugly helper to overcome TYPE_ANY probs*/ AsnNode down; /* Pointer to the son node */ AsnNode right; /* Pointer to the brother node */ AsnNode left; /* Pointer to the next list element */ AsnNode link_next; /* to keep track of all nodes in a tree */ }; /* Structure to keep an entire ASN.1 parse tree and associated information */ struct ksba_asn_tree_s { AsnNode parse_tree; AsnNode node_list; /* for easier release of all nodes */ char filename[1]; }; typedef struct static_struct_asn { unsigned int name_off; /* Node name */ node_type_t type; /* Node type */ struct node_flag_s flags; unsigned int stringvalue_off; } static_asn; /*-- asn1-parse.y --*/ void _ksba_asn_release_nodes (AsnNode node); /*-- asn1-func.c --*/ void _ksba_asn_set_value (AsnNode node, enum asn_value_type vtype, const void *value, size_t len); void _ksba_asn_set_name (AsnNode node, const char *name); AsnNode _ksba_asn_walk_tree (AsnNode root, AsnNode node); AsnNode _ksba_asn_walk_tree_up_right (AsnNode root, AsnNode node); AsnNode _ksba_asn_find_node(AsnNode pointer,const char *name); int _ksba_asn_check_identifier(AsnNode node); int _ksba_asn_change_integer_value(AsnNode node); int _ksba_asn_delete_not_used(AsnNode node); int _ksba_asn_expand_object_id(AsnNode node); void _ksba_asn_set_default_tag (AsnNode node); void _ksba_asn_type_set_config (AsnNode node); AsnNode _ksba_asn_expand_tree (AsnNode parse_tree, const char *name); AsnNode _ksba_asn_insert_copy (AsnNode node); int _ksba_asn_is_primitive (node_type_t type); AsnNode _ksba_asn_new_node (node_type_t type); void _ksba_asn_node_dump (AsnNode p, FILE *fp); void _ksba_asn_node_dump_all (AsnNode root, FILE *fp); AsnNode _ksba_asn_find_type_value (const unsigned char *image, AsnNode root, int idx, const void *oidbuf, size_t oidlen); int _ksba_asn_delete_structure (AsnNode root); /*-- asn2-func.c --*/ /*(functions are all declared in ksba.h)*/ /*-- asn1-tables.c (generated) --*/ const static_asn *_ksba_asn_lookup_table (const char *name, const char **stringtbl); #endif /*ASN1_FUNC_H*/