ARC SDK
VOMSAttribute.h
1 
2 
8 #ifndef ARC_VOMSATTRIBUTE_H
9 #define ARC_VOMSATTRIBUTE_H
10 
11 #include <openssl/opensslv.h>
12 
13 #if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
14 // Workaround for broken header in openssl 1.0.0
15 #include <openssl/safestack.h>
16 #undef SKM_ASN1_SET_OF_d2i
17 #define SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
18  (STACK_OF(type) *)d2i_ASN1_SET((STACK_OF(OPENSSL_BLOCK) **)CHECKED_PTR_OF(STACK_OF(type)*, st), \
19  pp, length, \
20  CHECKED_D2I_OF(type, d2i_func), \
21  CHECKED_SK_FREE_FUNC(type, free_func), \
22  ex_tag, ex_class)
23 #undef SKM_ASN1_SET_OF_i2d
24 #define SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \
25  i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK) *)CHECKED_STACK_OF(type, st), pp, \
26  CHECKED_I2D_OF(type, i2d_func), \
27  ex_tag, ex_class, is_set)
28 #endif
29 
30 #include <openssl/evp.h>
31 #include <openssl/asn1_mac.h>
32 #include <openssl/x509.h>
33 #include <openssl/x509v3.h>
34 #include <openssl/stack.h>
35 #include <openssl/safestack.h>
36 #include <openssl/err.h>
37 
38 #define VOMS_AC_HEADER "-----BEGIN VOMS AC-----"
39 #define VOMS_AC_TRAILER "-----END VOMS AC-----"
40 
41 namespace ArcCredential {
42 
43 #define ASN1_F_D2I_AC_ATTR 5000
44 #define AC_F_ATTR_New 5001
45 #define ASN1_F_D2I_AC_ROLE 5002
46 #define AC_F_ROLE_New 5003
47 #define ASN1_F_D2I_AC_IETFATTR 5004
48 #define AC_F_IETFATTR_New 5005
49 #define ASN1_F_D2I_AC_IETFATTRVAL 5006
50 #define ASN1_F_D2I_AC_DIGEST 5007
51 #define AC_F_DIGEST_New 5008
52 #define ASN1_F_D2I_AC_IS 5009
53 #define AC_F_AC_IS_New 5010
54 #define ASN1_F_D2I_AC_FORM 5011
55 #define AC_F_AC_FORM_New 5012
56 #define ASN1_F_D2I_AC_ACI 5013
57 #define ASN1_F_AC_ACI_New 5014
58 #define ASN1_F_D2I_AC_HOLDER 5015
59 #define ASN1_F_AC_HOLDER_New 5016
60 #define ASN1_F_AC_VAL_New 5017
61 #define AC_F_AC_INFO_NEW 5018
62 #define AC_F_D2I_AC 5019
63 #define AC_F_AC_New 5020
64 #define ASN1_F_I2D_AC_IETFATTRVAL 5021
65 #define AC_F_D2I_AC_DIGEST 5022
66 #define AC_F_AC_DIGEST_New 5023
67 #define AC_F_D2I_AC_IS 5024
68 #define AC_ERR_UNSET 5025
69 #define AC_ERR_SET 5026
70 #define AC_ERR_SIGNATURE 5027
71 #define AC_ERR_VERSION 5028
72 #define AC_ERR_HOLDER_SERIAL 5029
73 #define AC_ERR_HOLDER 5030
74 #define AC_ERR_UID_MISMATCH 5031
75 #define AC_ERR_ISSUER_NAME 5032
76 #define AC_ERR_SERIAL 5033
77 #define AC_ERR_DATES 5034
78 #define AC_ERR_ATTRIBS 5035
79 #define AC_F_AC_TARGET_New 5036
80 #define ASN1_F_D2I_AC_TARGET 5037
81 #define AC_F_AC_TARGETS_New 5036
82 #define ASN1_F_D2I_AC_TARGETS 5037
83 #define ASN1_F_D2I_AC_SEQ 5038
84 #define AC_F_AC_SEQ_new 5039
85 #define AC_ERR_ATTRIB_URI 5040
86 #define AC_ERR_ATTRIB_FQAN 5041
87 #define AC_ERR_EXTS_ABSENT 5042
88 #define AC_ERR_MEMORY 5043
89 #define AC_ERR_EXT_CRIT 5044
90 #define AC_ERR_EXT_TARGET 5045
91 #define AC_ERR_EXT_KEY 5046
92 #define AC_ERR_UNKNOWN 5047
93 
94 #define AC_ERR_PARAMETERS 5048
95 #define X509_ERR_ISSUER_NAME 5049
96 #define X509_ERR_HOLDER_NAME 5050
97 #define AC_ERR_NO_EXTENSION 5051
98 
99 #define ASN1_F_D2I_AC_CERTS 5052
100 #define AC_F_X509_New 5053
101 
102 #define AC_F_D2I_AC_ATTRIBUTE 5054
103 #define AC_F_ATTRIBUTE_New 5055
104 #define ASN1_F_D2I_AC_ATT_HOLDER 5056
105 #define AC_F_AC_ATT_HOLDER_New 5057
106 #define ASN1_F_D2I_AC_FULL_ATTRIBUTES 5058
107 #define AC_F_AC_FULL_ATTRIBUTES_New 5059
108 #define ASN1_F_D2I_AC_ATTRIBUTEVAL 5060
109 #define ASN1_F_I2D_AC_ATTRIBUTEVAL 5061
110 #define AC_F_AC_ATTRIBUTEVAL_New 5062
111 #define AC_ERR_ATTRIB 5063
112 
113 typedef struct ACDIGEST {
114  ASN1_ENUMERATED *type;
115  ASN1_OBJECT *oid;
116  X509_ALGOR *algor;
117  ASN1_BIT_STRING *digest;
118 } AC_DIGEST;
119 
120 typedef struct ACIS {
121  STACK_OF(GENERAL_NAME) *issuer;
122  ASN1_INTEGER *serial;
123  ASN1_BIT_STRING *uid;
124 } AC_IS;
125 
126 typedef struct ACFORM {
127  STACK_OF(GENERAL_NAME) *names;
128  AC_IS *is;
129  AC_DIGEST *digest;
130 } AC_FORM;
131 
132 typedef struct ACACI {
133  STACK_OF(GENERAL_NAME) *names;
134  AC_FORM *form;
135 } AC_ACI;
136 
137 typedef struct ACHOLDER {
138  AC_IS *baseid;
139  STACK_OF(GENERAL_NAME) *name;
140  AC_DIGEST *digest;
141 } AC_HOLDER;
142 
143 typedef struct ACVAL {
144  ASN1_GENERALIZEDTIME *notBefore;
145  ASN1_GENERALIZEDTIME *notAfter;
146 } AC_VAL;
147 
148 typedef struct asn1_string_st AC_IETFATTRVAL;
149 
150 typedef struct ACIETFATTR {
151  STACK_OF(GENERAL_NAME) *names;
152  STACK_OF(AC_IETFATTRVAL) *values;
153 } AC_IETFATTR;
154 
155 typedef struct ACTARGET {
156  GENERAL_NAME *name;
157  GENERAL_NAME *group;
158  AC_IS *cert;
159 } AC_TARGET;
160 
161 typedef struct ACTARGETS {
162  STACK_OF(AC_TARGET) *targets;
163 } AC_TARGETS;
164 
165 typedef struct ACATTR {
166  ASN1_OBJECT * type;
167  int get_type;
168  STACK_OF(AC_IETFATTR) *ietfattr;
169  STACK_OF(AC_FULL_ATTRIBUTES) *fullattributes;
170 } AC_ATTR;
171 #define GET_TYPE_FQAN 1
172 #define GET_TYPE_ATTRIBUTES 2
173 
174 typedef struct ACINFO {
175  ASN1_INTEGER *version;
176  AC_HOLDER *holder;
177  AC_FORM *form;
178  X509_ALGOR *alg;
179  ASN1_INTEGER *serial;
180  AC_VAL *validity;
181  STACK_OF(AC_ATTR) *attrib;
182  ASN1_BIT_STRING *id;
183  STACK_OF(X509_EXTENSION) *exts;
184 } AC_INFO;
185 
186 typedef struct ACC {
187  AC_INFO *acinfo;
188  X509_ALGOR *sig_alg;
189  ASN1_BIT_STRING *signature;
190 } AC;
191 
192 typedef struct ACSEQ {
193  STACK_OF(AC) *acs;
194 } AC_SEQ;
195 
196 typedef struct ACCERTS {
197  STACK_OF(X509) *stackcert;
198 } AC_CERTS;
199 
200 typedef struct ACATTRIBUTE {
201  ASN1_OCTET_STRING *name;
202  ASN1_OCTET_STRING *qualifier;
203  ASN1_OCTET_STRING *value;
204 } AC_ATTRIBUTE;
205 
206 typedef struct ACATTHOLDER {
207  STACK_OF(GENERAL_NAME) *grantor;
208  STACK_OF(AC_ATTRIBUTE) *attributes;
209 } AC_ATT_HOLDER;
210 
211 typedef struct ACFULLATTRIBUTES {
212  STACK_OF(AC_ATT_HOLDER) *providers;
213 } AC_FULL_ATTRIBUTES;
214 
215 #if (OPENSSL_VERSION_NUMBER >= 0x10000000L)
216 #define IMPL_STACK(type) \
217  DECLARE_STACK_OF(type) \
218  STACK_OF(type) *sk_##type##_new (int (*cmp)(const type * const *, \
219  const type * const *)) \
220  { return (STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp));} \
221  STACK_OF(type) *sk_##type##_new_null () { return (STACK_OF(type) *)sk_new_null(); } \
222  void sk_##type##_free (STACK_OF(type) *st) { sk_free(CHECKED_STACK_OF(type, st)); } \
223  int sk_##type##_num (const STACK_OF(type) *st) { return sk_num(CHECKED_STACK_OF(type, st)); } \
224  type *sk_##type##_value (const STACK_OF(type) *st, int i) { return (type *)sk_value(CHECKED_STACK_OF(type, st), i); } \
225  type *sk_##type##_set (STACK_OF(type) *st, int i, type *val) { return (type *)sk_set(CHECKED_STACK_OF(type, st), i, CHECKED_PTR_OF(type, val)); } \
226  void sk_##type##_zero (STACK_OF(type) *st) { sk_zero(CHECKED_STACK_OF(type, st)); } \
227  int sk_##type##_push (STACK_OF(type) *st, type *val) { return sk_push(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)); } \
228  int sk_##type##_unshift (STACK_OF(type) *st, type *val) { return sk_unshift(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)); } \
229  int sk_##type##_find (STACK_OF(type) *st, type *val) { return sk_find(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val)); } \
230  type *sk_##type##_delete (STACK_OF(type) *st, int i) { return (type *)sk_delete(CHECKED_STACK_OF(type, st), i); } \
231  type *sk_##type##_delete_ptr (STACK_OF(type) *st, type *ptr) { return (type *)sk_delete_ptr(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, ptr)); } \
232  int sk_##type##_insert (STACK_OF(type) *st, type *val, int i) { return sk_insert(CHECKED_STACK_OF(type, st), CHECKED_PTR_OF(type, val), i); } \
233  int (*sk_##type##_set_cmp_func (STACK_OF(type) *st, int (*cmp)(const type * const *, const type * const *)))(const type * const *, const type * const *) \
234  { return (int ((*)(const type * const *, const type * const *)))sk_set_cmp_func(CHECKED_STACK_OF(type, st), CHECKED_SK_CMP_FUNC(type, cmp)); } \
235  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *st) { return (STACK_OF(type) *)sk_dup(CHECKED_STACK_OF(type, st)); } \
236  void sk_##type##_pop_free (STACK_OF(type) *st, void (*func)(type *)) { sk_pop_free(CHECKED_STACK_OF(type, st), CHECKED_SK_FREE_FUNC(type, func)); } \
237  type *sk_##type##_shift (STACK_OF(type) *st) { return (type *)sk_shift(CHECKED_STACK_OF(type, st)); } \
238  type *sk_##type##_pop (STACK_OF(type) *st) { return (type *)sk_pop(CHECKED_STACK_OF(type, st)); } \
239  void sk_##type##_sort (STACK_OF(type) *st) { sk_sort(CHECKED_STACK_OF(type, st)); } \
240  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **st, const unsigned char **pp, long length, type *(*d2ifunc)(type**, const unsigned char**, long), void (*freefunc)(type *), int ex_tag, int ex_class) \
241  { return (STACK_OF(type) *)d2i_ASN1_SET((STACK_OF(OPENSSL_BLOCK)**)CHECKED_PTR_OF(STACK_OF(type)*, st), \
242  pp, length, \
243  CHECKED_D2I_OF(type, d2ifunc), \
244  CHECKED_SK_FREE_FUNC(type, freefunc), \
245  ex_tag, ex_class); } \
246  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *st, unsigned char **pp, int (*i2dfunc)(type*, unsigned char**), int ex_tag, int ex_class, int is_set) \
247  { return i2d_ASN1_SET((STACK_OF(OPENSSL_BLOCK)*)CHECKED_STACK_OF(type, st), pp, \
248  CHECKED_I2D_OF(type, i2dfunc), \
249  ex_tag, ex_class, is_set); } \
250  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *st, int (*i2dfunc)(type*, unsigned char**), unsigned char **buf, int *len) { return ASN1_seq_pack((STACK_OF(OPENSSL_BLOCK)*)CHECKED_PTR_OF(STACK_OF(type), st), \
251  CHECKED_I2D_OF(type, i2dfunc), buf, len); } \
252  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *buf, int len, type *(*d2ifunc)(type**, const unsigned char**, long), void (*freefunc)(type *)) \
253  { return (STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2ifunc), CHECKED_SK_FREE_FUNC(type, freefunc)); }
254 
255 #define DECL_STACK(type) \
256  PREDECLARE_STACK_OF(type) \
257  STACK_OF(type) *sk_##type##_new (int (*)(const type * const *, const type * const *)); \
258  STACK_OF(type) *sk_##type##_new_null (); \
259  void sk_##type##_free (STACK_OF(type) *); \
260  int sk_##type##_num (const STACK_OF(type) *); \
261  type *sk_##type##_value (const STACK_OF(type) *, int); \
262  type *sk_##type##_set (STACK_OF(type) *, int, type *); \
263  void sk_##type##_zero (STACK_OF(type) *); \
264  int sk_##type##_push (STACK_OF(type) *, type *); \
265  int sk_##type##_unshift (STACK_OF(type) *, type *); \
266  int sk_##type##_find (STACK_OF(type) *, type *); \
267  type *sk_##type##_delete (STACK_OF(type) *, int); \
268  type *sk_##type##_delete_ptr (STACK_OF(type) *, type *); \
269  int sk_##type##_insert (STACK_OF(type) *, type *, int); \
270  int (*sk_##type##_set_cmp_func (STACK_OF(type) *, int (*)(const type * const *, const type * const *)))(const type * const *, const type * const *); \
271  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *); \
272  void sk_##type##_pop_free (STACK_OF(type) *, void (*)(type *)); \
273  type *sk_##type##_shift (STACK_OF(type) *); \
274  type *sk_##type##_pop (STACK_OF(type) *); \
275  void sk_##type##_sort (STACK_OF(type) *); \
276  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **, const unsigned char **, long, type *(*)(type**, const unsigned char **, long), void (*)(type *), int, int); \
277  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *, unsigned char **, int (*)(type*, unsigned char**), int, int, int); \
278  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *, int (*)(type*, unsigned char**), unsigned char **, int *); \
279  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *, int, type *(*)(), void (*)(type *)) ;
280 
281 #elif (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
282 #define IMPL_STACK(type) \
283  DECLARE_STACK_OF(type) \
284  STACK_OF(type) *sk_##type##_new (int (*cmp)(const type * const *, const type * const *)) \
285  { return sk_new ( (int (*)(const char * const *, const char * const *))cmp);} \
286  STACK_OF(type) *sk_##type##_new_null () { return sk_new_null(); } \
287  void sk_##type##_free (STACK_OF(type) *st) { sk_free(st); } \
288  int sk_##type##_num (const STACK_OF(type) *st) { return sk_num(st); } \
289  type *sk_##type##_value (const STACK_OF(type) *st, int i) { return (type *)sk_value(st, i); } \
290  type *sk_##type##_set (STACK_OF(type) *st, int i, type *val) { return ((type *)sk_set(st, i, (char *)val)); } \
291  void sk_##type##_zero (STACK_OF(type) *st) { sk_zero(st);} \
292  int sk_##type##_push (STACK_OF(type) *st, type *val) { return sk_push(st, (char *)val); } \
293  int sk_##type##_unshift (STACK_OF(type) *st, type *val) { return sk_unshift(st, (char *)val); } \
294  int sk_##type##_find (STACK_OF(type) *st, type *val) { return sk_find(st, (char *)val); } \
295  type *sk_##type##_delete (STACK_OF(type) *st, int i) { return (type *)sk_delete(st, i); } \
296  type *sk_##type##_delete_ptr (STACK_OF(type) *st, type *ptr) { return (type *)sk_delete_ptr(st, (char *)ptr); } \
297  int sk_##type##_insert (STACK_OF(type) *st, type *val, int i) { return sk_insert(st, (char *)val, i); } \
298  int (*sk_##type##_set_cmp_func (STACK_OF(type) *st, int (*cmp)(const type * const *, const type * const *)))(const type * const *, const type * const *) \
299  { return (int ((*)(const type * const *, const type * const *)))sk_set_cmp_func (st, (int (*)(const char * const *, const char * const *))cmp); } \
300  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *st) { return sk_dup(st); } \
301  void sk_##type##_pop_free (STACK_OF(type) *st, void (*func)(type *)) { sk_pop_free(st, (void (*)(void *))func); } \
302  type *sk_##type##_shift (STACK_OF(type) *st) { return (type *)sk_shift(st); } \
303  type *sk_##type##_pop (STACK_OF(type) *st) { return (type *)sk_pop(st); } \
304  void sk_##type##_sort (STACK_OF(type) *st) { sk_sort(st); } \
305  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **st, const unsigned char **pp, long length, type *(*d2ifunc)(), void (*freefunc)(type *), int ex_tag, int ex_class) \
306  { return d2i_ASN1_SET(st, pp, length, (void*(*)(void**, const unsigned char**, long int))d2ifunc, (void (*)(void *))freefunc, ex_tag, ex_class); } \
307  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *st, unsigned char **pp, int (*i2dfunc)(void*, unsigned char**), int ex_tag, int ex_class, int is_set) \
308  { return i2d_ASN1_SET(st, pp, i2dfunc, ex_tag, ex_class, is_set); } \
309  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *st, int (*i2d)(void*, unsigned char**), unsigned char **buf, int *len) { return ASN1_seq_pack(st, i2d, buf, len); } \
310  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *buf, int len, type *(*d2i)(), void (*freefunc)(type *)) \
311  { return ASN1_seq_unpack(buf, len, (void*(*)(void**, const unsigned char**, long int))d2i, (void (*)(void *))freefunc); }
312 
313 #define DECL_STACK(type) \
314  PREDECLARE_STACK_OF(type) \
315  STACK_OF(type) *sk_##type##_new (int (*)(const type * const *, const type * const *)); \
316  STACK_OF(type) *sk_##type##_new_null (); \
317  void sk_##type##_free (STACK_OF(type) *); \
318  int sk_##type##_num (const STACK_OF(type) *); \
319  type *sk_##type##_value (const STACK_OF(type) *, int); \
320  type *sk_##type##_set (STACK_OF(type) *, int, type *); \
321  void sk_##type##_zero (STACK_OF(type) *); \
322  int sk_##type##_push (STACK_OF(type) *, type *); \
323  int sk_##type##_unshift (STACK_OF(type) *, type *); \
324  int sk_##type##_find (STACK_OF(type) *, type *); \
325  type *sk_##type##_delete (STACK_OF(type) *, int); \
326  type *sk_##type##_delete_ptr (STACK_OF(type) *, type *); \
327  int sk_##type##_insert (STACK_OF(type) *, type *, int); \
328  int (*sk_##type##_set_cmp_func (STACK_OF(type) *, int (*)(const type * const *, const type * const *)))(const type * const *, const type * const *); \
329  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *); \
330  void sk_##type##_pop_free (STACK_OF(type) *, void (*)(type *)); \
331  type *sk_##type##_shift (STACK_OF(type) *); \
332  type *sk_##type##_pop (STACK_OF(type) *); \
333  void sk_##type##_sort (STACK_OF(type) *); \
334  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **, const unsigned char **, long, type *(*)(), void (*)(type *), int, int); \
335  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *, unsigned char **, int (*)(void*, unsigned char**), int, int, int); \
336  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *, int (*)(void*, unsigned char**), unsigned char **, int *); \
337  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *, int, type *(*)(), void (*)(type *)) ;
338 
339 #else
340 #define IMPL_STACK(type) \
341  DECLARE_STACK_OF(type) \
342  STACK_OF(type) *sk_##type##_new (int (*cmp)(const type * const *, const type * const *)) \
343  { return sk_new ( (int (*)(const char * const *, const char * const *))cmp);} \
344  STACK_OF(type) *sk_##type##_new_null () { return sk_new_null(); } \
345  void sk_##type##_free (STACK_OF(type) *st) { sk_free(st); } \
346  int sk_##type##_num (const STACK_OF(type) *st) { return sk_num(st); } \
347  type *sk_##type##_value (const STACK_OF(type) *st, int i) { return (type *)sk_value(st, i); } \
348  type *sk_##type##_set (STACK_OF(type) *st, int i, type *val) { return ((type *)sk_set(st, i, (char *)val)); } \
349  void sk_##type##_zero (STACK_OF(type) *st) { sk_zero(st);} \
350  int sk_##type##_push (STACK_OF(type) *st, type *val) { return sk_push(st, (char *)val); } \
351  int sk_##type##_unshift (STACK_OF(type) *st, type *val) { return sk_unshift(st, (char *)val); } \
352  int sk_##type##_find (STACK_OF(type) *st, type *val) { return sk_find(st, (char *)val); } \
353  type *sk_##type##_delete (STACK_OF(type) *st, int i) { return (type *)sk_delete(st, i); } \
354  type *sk_##type##_delete_ptr (STACK_OF(type) *st, type *ptr) { return (type *)sk_delete_ptr(st, (char *)ptr); } \
355  int sk_##type##_insert (STACK_OF(type) *st, type *val, int i) { return sk_insert(st, (char *)val, i); } \
356  int (*sk_##type##_set_cmp_func (STACK_OF(type) *st, int (*cmp)(const type * const *, const type * const *)))(const type * const *, const type * const *) \
357  { return (int ((*)(const type * const *, const type * const *)))sk_set_cmp_func (st, (int (*)(const char * const *, const char * const *))cmp); } \
358  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *st) { return sk_dup(st); } \
359  void sk_##type##_pop_free (STACK_OF(type) *st, void (*func)(type *)) { sk_pop_free(st, (void (*)(void *))func); } \
360  type *sk_##type##_shift (STACK_OF(type) *st) { return (type *)sk_shift(st); } \
361  type *sk_##type##_pop (STACK_OF(type) *st) { return (type *)sk_pop(st); } \
362  void sk_##type##_sort (STACK_OF(type) *st) { sk_sort(st); } \
363  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **st, unsigned char **pp, long length, type *(*d2ifunc)(), void (*freefunc)(type *), int ex_tag, int ex_class) \
364  { return d2i_ASN1_SET(st, pp, length, (char *(*)())d2ifunc, (void (*)(void *))freefunc, ex_tag, ex_class); } \
365  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *st, unsigned char **pp, int (*i2dfunc)(), int ex_tag, int ex_class, int is_set) \
366  { return i2d_ASN1_SET(st, pp, i2dfunc, ex_tag, ex_class, is_set); } \
367  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *st, int (*i2d)(), unsigned char **buf, int *len) { return ASN1_seq_pack(st, i2d, buf, len); } \
368  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *buf, int len, type *(*d2i)(), void (*freefunc)(type *)) \
369  { return ASN1_seq_unpack(buf, len, (char *(*)())d2i, (void (*)(void *))freefunc); }
370 
371 #define DECL_STACK(type) \
372  PREDECLARE_STACK_OF(type) \
373  STACK_OF(type) *sk_##type##_new (int (*)(const type * const *, const type * const *)); \
374  STACK_OF(type) *sk_##type##_new_null (); \
375  void sk_##type##_free (STACK_OF(type) *); \
376  int sk_##type##_num (const STACK_OF(type) *); \
377  type *sk_##type##_value (const STACK_OF(type) *, int); \
378  type *sk_##type##_set (STACK_OF(type) *, int, type *); \
379  void sk_##type##_zero (STACK_OF(type) *); \
380  int sk_##type##_push (STACK_OF(type) *, type *); \
381  int sk_##type##_unshift (STACK_OF(type) *, type *); \
382  int sk_##type##_find (STACK_OF(type) *, type *); \
383  type *sk_##type##_delete (STACK_OF(type) *, int); \
384  type *sk_##type##_delete_ptr (STACK_OF(type) *, type *); \
385  int sk_##type##_insert (STACK_OF(type) *, type *, int); \
386  int (*sk_##type##_set_cmp_func (STACK_OF(type) *, int (*)(const type * const *, const type * const *)))(const type * const *, const type * const *); \
387  STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *); \
388  void sk_##type##_pop_free (STACK_OF(type) *, void (*)(type *)); \
389  type *sk_##type##_shift (STACK_OF(type) *); \
390  type *sk_##type##_pop (STACK_OF(type) *); \
391  void sk_##type##_sort (STACK_OF(type) *); \
392  STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **, unsigned char **, long, type *(*)(), void (*)(type *), int, int); \
393  int i2d_ASN1_SET_OF_##type (STACK_OF(type) *, unsigned char **, int (*)(), int, int, int); \
394  unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *, int (*)(), unsigned char **, int *); \
395  STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *, int, type *(*)(), void (*)(type *)) ;
396 #endif
397 
398 DECL_STACK(AC_TARGET)
399 DECL_STACK(AC_TARGETS)
400 DECL_STACK(AC_IETFATTR)
401 DECL_STACK(AC_IETFATTRVAL)
402 DECL_STACK(AC_ATTR)
403 DECL_STACK(AC)
404 DECL_STACK(AC_INFO)
405 DECL_STACK(AC_VAL)
406 DECL_STACK(AC_HOLDER)
407 DECL_STACK(AC_ACI)
408 DECL_STACK(AC_FORM)
409 DECL_STACK(AC_IS)
410 DECL_STACK(AC_DIGEST)
411 DECL_STACK(AC_CERTS)
412 DECL_STACK(AC_ATTRIBUTE)
413 DECL_STACK(AC_ATT_HOLDER)
414 DECL_STACK(AC_FULL_ATTRIBUTES)
415 
416 #if (OPENSSL_VERSION_NUMBER >= 0x0090800fL)
417 #define SSLCONST const
418 #else
419 #define SSLCONST
420 #endif
421 
422 int i2d_AC_ATTR(AC_ATTR *a, unsigned char **pp);
423 AC_ATTR *d2i_AC_ATTR(AC_ATTR **a, SSLCONST unsigned char **p, long length);
424 AC_ATTR *AC_ATTR_new();
425 void AC_ATTR_free(AC_ATTR *a);
426 
427 int i2d_AC_IETFATTR(AC_IETFATTR *a, unsigned char **pp);
428 AC_IETFATTR *d2i_AC_IETFATTR(AC_IETFATTR **a, SSLCONST unsigned char **p, long length);
429 AC_IETFATTR *AC_IETFATTR_new();
430 void AC_IETFATTR_free (AC_IETFATTR *a);
431 
432 int i2d_AC_IETFATTRVAL(AC_IETFATTRVAL *a, unsigned char **pp);
433 AC_IETFATTRVAL *d2i_AC_IETFATTRVAL(AC_IETFATTRVAL **a, SSLCONST unsigned char **pp, long length);
434 AC_IETFATTRVAL *AC_IETFATTRVAL_new();
435 void AC_IETFATTRVAL_free(AC_IETFATTRVAL *a);
436 
437 int i2d_AC_DIGEST(AC_DIGEST *a, unsigned char **pp);
438 AC_DIGEST *d2i_AC_DIGEST(AC_DIGEST **a, SSLCONST unsigned char **pp, long length);
439 AC_DIGEST *AC_DIGEST_new(void);
440 void AC_DIGEST_free(AC_DIGEST *a);
441 
442 int i2d_AC_IS(AC_IS *a, unsigned char **pp);
443 AC_IS *d2i_AC_IS(AC_IS **a, SSLCONST unsigned char **pp, long length);
444 AC_IS *AC_IS_new(void);
445 void AC_IS_free(AC_IS *a);
446 
447 int i2d_AC_FORM(AC_FORM *a, unsigned char **pp);
448 AC_FORM *d2i_AC_FORM(AC_FORM **a, SSLCONST unsigned char **pp, long length);
449 AC_FORM *AC_FORM_new(void);
450 void AC_FORM_free(AC_FORM *a);
451 
452 int i2d_AC_ACI(AC_ACI *a, unsigned char **pp);
453 AC_ACI *d2i_AC_ACI(AC_ACI **a, SSLCONST unsigned char **pp, long length);
454 AC_ACI *AC_ACI_new(void);
455 void AC_ACI_free(AC_ACI *a);
456 
457 int i2d_AC_HOLDER(AC_HOLDER *a, unsigned char **pp);
458 AC_HOLDER *d2i_AC_HOLDER(AC_HOLDER **a, SSLCONST unsigned char **pp, long length);
459 AC_HOLDER *AC_HOLDER_new(void);
460 void AC_HOLDER_free(AC_HOLDER *a);
461 
462 /* new AC_VAL functions by Valerio */
463 int i2d_AC_VAL(AC_VAL *a, unsigned char **pp);
464 AC_VAL *d2i_AC_VAL(AC_VAL **a, SSLCONST unsigned char **pp, long length);
465 AC_VAL *AC_VAL_new(void);
466 void AC_VAL_free(AC_VAL *a);
467 /* end */
468 
469 int i2d_AC_INFO(AC_INFO *a, unsigned char **pp);
470 AC_INFO *d2i_AC_INFO(AC_INFO **a, SSLCONST unsigned char **p, long length);
471 AC_INFO *AC_INFO_new(void);
472 void AC_INFO_free(AC_INFO *a);
473 
474 int i2d_AC(AC *a, unsigned char **pp) ;
475 AC *d2i_AC(AC **a, SSLCONST unsigned char **pp, long length);
476 AC *AC_new(void);
477 void AC_free(AC *a);
478 
479 int i2d_AC_TARGETS(AC_TARGETS *a, unsigned char **pp) ;
480 AC_TARGETS *d2i_AC_TARGETS(AC_TARGETS **a, SSLCONST unsigned char **pp, long length);
481 AC_TARGETS *AC_TARGETS_new(void);
482 void AC_TARGETS_free(AC_TARGETS *a);
483 
484 int i2d_AC_TARGET(AC_TARGET *a, unsigned char **pp) ;
485 AC_TARGET *d2i_AC_TARGET(AC_TARGET **a, SSLCONST unsigned char **pp, long length);
486 AC_TARGET *AC_TARGET_new(void);
487 void AC_TARGET_free(AC_TARGET *a);
488 
489 int i2d_AC_SEQ(AC_SEQ *a, unsigned char **pp) ;
490 AC_SEQ *d2i_AC_SEQ(AC_SEQ **a, SSLCONST unsigned char **pp, long length);
491 AC_SEQ *AC_SEQ_new(void);
492 void AC_SEQ_free(AC_SEQ *a);
493 
494 int i2d_AC_CERTS(AC_CERTS *a, unsigned char **pp) ;
495 AC_CERTS *d2i_AC_CERTS(AC_CERTS **a, SSLCONST unsigned char **pp, long length);
496 AC_CERTS *AC_CERTS_new(void);
497 void AC_CERTS_free(AC_CERTS *a);
498 
499 int i2d_AC_ATTRIBUTE(AC_ATTRIBUTE *, unsigned char **);
500 AC_ATTRIBUTE *d2i_AC_ATTRIBUTE(AC_ATTRIBUTE **, SSLCONST unsigned char **, long);
501 AC_ATTRIBUTE *AC_ATTRIBUTE_new();
502 void AC_ATTRIBUTE_free(AC_ATTRIBUTE *);
503 
504 int i2d_AC_ATT_HOLDER(AC_ATT_HOLDER *, unsigned char **);
505 AC_ATT_HOLDER *d2i_AC_ATT_HOLDER(AC_ATT_HOLDER **, SSLCONST unsigned char **, long);
506 AC_ATT_HOLDER *AC_ATT_HOLDER_new();
507 void AC_ATT_HOLDER_free(AC_ATT_HOLDER *);
508 
509 int i2d_AC_FULL_ATTRIBUTES(AC_FULL_ATTRIBUTES *, unsigned char **);
510 AC_FULL_ATTRIBUTES *d2i_AC_FULL_ATTRIBUTES(AC_FULL_ATTRIBUTES **, SSLCONST unsigned char **, long);
511 AC_FULL_ATTRIBUTES *AC_FULL_ATTRIBUTES_new();
512 void AC_FULL_ATTRIBUTES_free(AC_FULL_ATTRIBUTES *);
513 
514 X509V3_EXT_METHOD * VOMSAttribute_auth_x509v3_ext_meth();
515 X509V3_EXT_METHOD * VOMSAttribute_avail_x509v3_ext_meth();
516 X509V3_EXT_METHOD * VOMSAttribute_targets_x509v3_ext_meth();
517 X509V3_EXT_METHOD * VOMSAttribute_acseq_x509v3_ext_meth();
518 X509V3_EXT_METHOD * VOMSAttribute_certseq_x509v3_ext_meth();
519 X509V3_EXT_METHOD * VOMSAttribute_attribs_x509v3_ext_meth();
520 
521 } // namespace ArcCredential
522 
523 #endif
524