2 * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
3 * Redistribution and modifications are permitted subject to BSD license.
5 #ifndef _OBJECT_IDENTIFIER_H_
6 #define _OBJECT_IDENTIFIER_H_
8 #include <asn_application.h>
9 #include <asn_codecs_prim.h>
10 #include <OCTET_STRING.h>
16 typedef uint32_t asn_oid_arc_t;
17 #define ASN_OID_ARC_MAX (~((asn_oid_arc_t)0))
19 typedef ASN__PRIMITIVE_TYPE_t OBJECT_IDENTIFIER_t;
21 extern asn_TYPE_descriptor_t asn_DEF_OBJECT_IDENTIFIER;
22 extern asn_TYPE_operation_t asn_OP_OBJECT_IDENTIFIER;
24 ssize_t OBJECT_IDENTIFIER__dump_body(const OBJECT_IDENTIFIER_t *st,
25 asn_app_consume_bytes_f *cb,
28 #define OBJECT_IDENTIFIER_free ASN__PRIMITIVE_TYPE_free
30 #if !defined(ASN_DISABLE_PRINT_SUPPORT)
31 asn_struct_print_f OBJECT_IDENTIFIER_print;
32 #endif /* !defined(ASN_DISABLE_PRINT_SUPPORT) */
34 #define OBJECT_IDENTIFIER_compare OCTET_STRING_compare
36 asn_constr_check_f OBJECT_IDENTIFIER_constraint;
38 #if !defined(ASN_DISABLE_BER_SUPPORT)
39 #define OBJECT_IDENTIFIER_decode_ber ber_decode_primitive
40 #define OBJECT_IDENTIFIER_encode_der der_encode_primitive
41 #endif /* !defined(ASN_DISABLE_BER_SUPPORT) */
43 #if !defined(ASN_DISABLE_XER_SUPPORT)
44 xer_type_decoder_f OBJECT_IDENTIFIER_decode_xer;
45 xer_type_encoder_f OBJECT_IDENTIFIER_encode_xer;
46 #endif /* !defined(ASN_DISABLE_XER_SUPPORT) */
48 #if !defined(ASN_DISABLE_JER_SUPPORT)
49 jer_type_encoder_f OBJECT_IDENTIFIER_encode_jer;
50 #endif /* !defined(ASN_DISABLE_JER_SUPPORT) */
52 #if !defined(ASN_DISABLE_OER_SUPPORT)
53 #define OBJECT_IDENTIFIER_decode_oer oer_decode_primitive
54 #define OBJECT_IDENTIFIER_encode_oer oer_encode_primitive
55 #endif /* !defined(ASN_DISABLE_OER_SUPPORT) */
57 #if !defined(ASN_DISABLE_UPER_SUPPORT)
58 #define OBJECT_IDENTIFIER_decode_uper OCTET_STRING_decode_uper
59 #define OBJECT_IDENTIFIER_encode_uper OCTET_STRING_encode_uper
60 #endif /* !defined(ASN_DISABLE_UPER_SUPPORT) */
61 #if !defined(ASN_DISABLE_APER_SUPPORT)
62 #define OBJECT_IDENTIFIER_decode_aper OCTET_STRING_decode_aper
63 #define OBJECT_IDENTIFIER_encode_aper OCTET_STRING_encode_aper
64 #endif /* !defined(ASN_DISABLE_APER_SUPPORT) */
66 #if !defined(ASN_DISABLE_RFILL_SUPPORT)
67 asn_random_fill_f OBJECT_IDENTIFIER_random_fill;
68 #endif /* !defined(ASN_DISABLE_RFILL_SUPPORT) */
70 /**********************************
71 * Some handy conversion routines *
72 **********************************/
75 * This function fills an (arcs) array with OBJECT IDENTIFIER arcs
76 * up to specified (arc_slots) elements.
79 * void print_arcs(OBJECT_IDENTIFIER_t *oid) {
80 * asn_oid_arc_t fixed_arcs[10]; // Try with fixed space first
81 * asn_oid_arc_t *arcs = fixed_arcs;
82 * size_t arc_slots = sizeof(fixed_arcs)/sizeof(fixed_arcs[0]); // 10
83 * ssize_t count; // Real number of arcs.
86 * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
87 * // If necessary, reallocate arcs array and try again.
88 * if(count > arc_slots) {
90 * arcs = malloc(sizeof(asn_oid_arc_t) * arc_slots);
92 * count = OBJECT_IDENTIFIER_get_arcs(oid, arcs, arc_slots);
93 * assert(count == arc_slots);
96 * // Print the contents of the arcs array.
97 * for(i = 0; i < count; i++)
98 * printf("%"PRIu32"\n", arcs[i]);
100 * // Avoid memory leak.
101 * if(arcs != fixed_arcs) free(arcs);
105 * -1/EINVAL: Invalid arguments (oid is missing)
106 * -1/ERANGE: One or more arcs have value out of array cell type range.
107 * >=0: Number of arcs contained in the OBJECT IDENTIFIER
109 * WARNING: The function always returns the actual number of arcs,
110 * even if there is no sufficient (arc_slots) provided.
112 ssize_t OBJECT_IDENTIFIER_get_arcs(const OBJECT_IDENTIFIER_t *oid,
113 asn_oid_arc_t *arcs, size_t arc_slots);
116 * This functions initializes the OBJECT IDENTIFIER object with
117 * the given set of arcs.
118 * The minimum of two arcs must be present; some restrictions apply.
120 * -1/EINVAL: Invalid arguments
121 * -1/ERANGE: The first two arcs do not conform to ASN.1 restrictions.
122 * -1/ENOMEM: Memory allocation failed
123 * 0: The object was initialized with new arcs.
125 int OBJECT_IDENTIFIER_set_arcs(OBJECT_IDENTIFIER_t *oid,
126 const asn_oid_arc_t *arcs, size_t arcs_count);
130 * Parse the OBJECT IDENTIFIER textual representation ("1.3.6.1.4.1.9363").
131 * No arc can exceed the (0..ASN_OID_ARC_MAX, which is the same as UINT32_MAX).
132 * This function is not specific to OBJECT IDENTIFIER, it may be used to parse
133 * the RELATIVE-OID data, or any other data consisting of dot-separated
134 * series of numeric values.
136 * If (oid_txt_length == -1), the strlen() will be invoked to determine the
137 * size of the (oid_text) string.
139 * After return, the optional (opt_oid_text_end) is set to the character after
140 * the last parsed one. (opt_oid_text_end) is never less than (oid_text).
144 * >= 0: Number of arcs contained in the OBJECT IDENTIFIER.
146 * WARNING: The function always returns the real number of arcs,
147 * even if there is no sufficient (arc_slots) provided.
148 * This is useful for (arc_slots) value estimation.
150 ssize_t OBJECT_IDENTIFIER_parse_arcs(const char *oid_text,
151 ssize_t oid_txt_length,
152 asn_oid_arc_t *arcs, size_t arcs_count,
153 const char **opt_oid_text_end);
156 * Internal functions.
157 * Used by RELATIVE-OID implementation in particular.
161 * Retrieve a single arc of size from the (arcbuf) buffer.
163 * -1: Failed to retrieve the value from the (arcbuf).
164 * >0: Number of bytes consumed from the (arcbuf), <= (arcbuf_len).
166 ssize_t OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf,
168 asn_oid_arc_t *ret_value);
171 * Write the unterminated arc value into the (arcbuf) which has the size at
172 * least (arcbuf_len).
174 * -1: (arcbuf_len) size is not sufficient to write the value.
175 * <n>: Number of bytes appended to the arcbuf (<= arcbuf_len).
177 ssize_t OBJECT_IDENTIFIER_set_single_arc(uint8_t *arcbuf, size_t arcbuf_len,
178 asn_oid_arc_t arc_value);
184 #endif /* _OBJECT_IDENTIFIER_H_ */