2  * Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
 
   4  * Redistribution and modifications are permitted subject to BSD license.
 
   6 #ifndef _OBJECT_IDENTIFIER_H_
 
   7 #define _OBJECT_IDENTIFIER_H_
 
   9 #include <asn_application.h>
 
  10 #include <asn_codecs_prim.h>
 
  16 typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
 
  18 extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER;
 
  20 asn_struct_print_f OBJECT_IDENTIFIER_print;
 
  21 asn_constr_check_f OBJECT_IDENTIFIER_constraint;
 
  22 der_type_encoder_f OBJECT_IDENTIFIER_encode_der;
 
  23 xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer;
 
  24 xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer;
 
  26 /**********************************
 
  27  * Some handy conversion routines *
 
  28  **********************************/
 
  31  * This function fills an (_arcs) array with OBJECT IDENTIFIER arcs
 
  32  * up to specified (_arc_slots) elements.
 
  35  *      void print_arcs(OBJECT_IDENTIFIER_t *oid) {
 
  36  *              unsigned long fixed_arcs[10];   // Try with fixed space first
 
  37  *              unsigned long *arcs = fixed_arcs;
 
  38  *              int arc_type_size = sizeof(fixed_arcs[0]);      // sizeof(long)
 
  39  *              int arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10
 
  40  *              int count;      // Real number of arcs.
 
  43  *              count = OBJECT_IDENTIFIER_get_arcs(oid, arcs,
 
  44  *                      arc_type_size, arc_slots);
 
  45  *              // If necessary, reallocate arcs array and try again.
 
  46  *              if(count > arc_slots) {
 
  48  *                      arcs = malloc(arc_type_size * arc_slots);
 
  50  *                      count = OBJECT_IDENTIFIER_get_arcs(oid, arcs,
 
  51  *                              arc_type_size, arc_slots);
 
  52  *                      assert(count == arc_slots);
 
  55  *              // Print the contents of the arcs array.
 
  56  *              for(i = 0; i < count; i++)
 
  57  *                      printf("%d\n", arcs[i]);
 
  59  *              // Avoid memory leak.
 
  60  *              if(arcs != fixed_arcs) free(arcs);
 
  64  * -1/EINVAL:   Invalid arguments (oid is missing)
 
  65  * -1/ERANGE:   One or more arcs have value out of array cell type range.
 
  66  * >=0:         Number of arcs contained in the OBJECT IDENTIFIER
 
  68  * WARNING: The function always returns the real number of arcs,
 
  69  * even if there is no sufficient (_arc_slots) provided.
 
  71 int OBJECT_IDENTIFIER_get_arcs(OBJECT_IDENTIFIER_t *_oid,
 
  72         void *_arcs,                    /* e.g., unsigned int arcs[N] */
 
  73         unsigned int _arc_type_size,    /* e.g., sizeof(arcs[0]) */
 
  74         unsigned int _arc_slots         /* e.g., N */);
 
  77  * This functions initializes the OBJECT IDENTIFIER object with
 
  78  * the given set of arcs.
 
  79  * The minimum of two arcs must be present; some restrictions apply.
 
  81  * -1/EINVAL:   Invalid arguments
 
  82  * -1/ERANGE:   The first two arcs do not conform to ASN.1 restrictions.
 
  83  * -1/ENOMEM:   Memory allocation failed
 
  84  * 0:           The object was initialized with new arcs.
 
  86 int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *_oid,
 
  87         const void *_arcs,              /* e.g., unsigned int arcs[N] */
 
  88         unsigned int _arc_type_size,    /* e.g., sizeof(arcs[0]) */
 
  89         unsigned int _arc_slots         /* e.g., N */);
 
  92  * Print the specified OBJECT IDENTIFIER arc.
 
  94 int OBJECT_IDENTIFIER_print_arc(uint8_t *arcbuf, int arclen,
 
  95         int add, /* Arbitrary offset, required to process the first two arcs */
 
  96         asn_app_consume_bytes_f *cb, void *app_key);
 
  98 /* Same as above, but returns the number of written digits, instead of 0 */
 
  99 ssize_t OBJECT_IDENTIFIER__dump_arc(uint8_t *arcbuf, int arclen, int add,
 
 100         asn_app_consume_bytes_f *cb, void *app_key);
 
 103  * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363").
 
 104  * No arc can exceed the (0..signed_long_max) range (typically, 0..2G if L32).
 
 105  * This function is not specific to OBJECT IDENTIFIER, it may be used to parse
 
 106  * the RELATIVE-OID data, or any other data consisting of dot-separated
 
 107  * series of numeric values.
 
 109  * If (oid_txt_length == -1), the strlen() will be invoked to determine the
 
 110  * size of the (oid_text) string.
 
 112  * After return, the optional (opt_oid_text_end) is set to the character after
 
 113  * the last parsed one. (opt_oid_text_end) is never less than (oid_text).
 
 117  * >= 0:        Number of arcs contained in the OBJECT IDENTIFIER.
 
 119  * WARNING: The function always returns the real number of arcs,
 
 120  * even if there is no sufficient (_arc_slots) provided.
 
 121  * This is useful for (_arc_slots) value estimation.
 
 123 int OBJECT_IDENTIFIER_parse_arcs(const char *oid_text, ssize_t oid_txt_length,
 
 124         long arcs[], unsigned int arcs_slots, const char **opt_oid_text_end);
 
 127  * Internal functions.
 
 128  * Used by RELATIVE-OID implementation in particular.
 
 130 int OBJECT_IDENTIFIER_get_single_arc(uint8_t *arcbuf, unsigned int arclen,
 
 131         signed int add, void *value, unsigned int value_size);
 
 132 int OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf,
 
 133         const void *arcval, unsigned int arcval_size, int _prepared_order);
 
 139 #endif  /* _OBJECT_IDENTIFIER_H_ */