versadac
1
versadac - Scalable Recorder Firmware
Main Page
Classes
Files
File List
File Members
core
openssl
sslinclude
openssl
asn1_mac.h
1
/* crypto/asn1/asn1_mac.h */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3
* All rights reserved.
4
*
5
* This package is an SSL implementation written
6
* by Eric Young (eay@cryptsoft.com).
7
* The implementation was written so as to conform with Netscapes SSL.
8
*
9
* This library is free for commercial and non-commercial use as long as
10
* the following conditions are aheared to. The following conditions
11
* apply to all code found in this distribution, be it the RC4, RSA,
12
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
13
* included with this distribution is covered by the same copyright terms
14
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
*
16
* Copyright remains Eric Young's, and as such any Copyright notices in
17
* the code are not to be removed.
18
* If this package is used in a product, Eric Young should be given attribution
19
* as the author of the parts of the library used.
20
* This can be in the form of a textual message at program startup or
21
* in documentation (online or textual) provided with the package.
22
*
23
* Redistribution and use in source and binary forms, with or without
24
* modification, are permitted provided that the following conditions
25
* are met:
26
* 1. Redistributions of source code must retain the copyright
27
* notice, this list of conditions and the following disclaimer.
28
* 2. Redistributions in binary form must reproduce the above copyright
29
* notice, this list of conditions and the following disclaimer in the
30
* documentation and/or other materials provided with the distribution.
31
* 3. All advertising materials mentioning features or use of this software
32
* must display the following acknowledgement:
33
* "This product includes cryptographic software written by
34
* Eric Young (eay@cryptsoft.com)"
35
* The word 'cryptographic' can be left out if the rouines from the library
36
* being used are not cryptographic related :-).
37
* 4. If you include any Windows specific code (or a derivative thereof) from
38
* the apps directory (application code) you must include an acknowledgement:
39
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
*
41
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
* SUCH DAMAGE.
52
*
53
* The licence and distribution terms for any publically available version or
54
* derivative of this code cannot be changed. i.e. this code cannot simply be
55
* copied and put under another distribution licence
56
* [including the GNU Public Licence.]
57
*/
58
59
#ifndef HEADER_ASN1_MAC_H
60
#define HEADER_ASN1_MAC_H
61
62
#include <openssl/asn1.h>
63
64
#ifdef __cplusplus
65
extern
"C"
{
66
#endif
67
68
#ifndef ASN1_MAC_ERR_LIB
69
#define ASN1_MAC_ERR_LIB ERR_LIB_ASN1
70
#endif
71
72
#define ASN1_MAC_H_err(f,r,line) \
73
ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))
74
75
#define M_ASN1_D2I_vars(a,type,func) \
76
ASN1_const_CTX c; \
77
type ret=NULL; \
78
\
79
c.pp=(const unsigned char **)pp; \
80
c.q= *(const unsigned char **)pp; \
81
c.error=ERR_R_NESTED_ASN1_ERROR; \
82
if ((a == NULL) || ((*a) == NULL)) \
83
{ if ((ret=(type)func()) == NULL) \
84
{ c.line=__LINE__; goto err; } } \
85
else ret=(*a);
86
87
#define M_ASN1_D2I_Init() \
88
c.p= *(const unsigned char **)pp; \
89
c.max=(length == 0)?0:(c.p+length);
90
91
#define M_ASN1_D2I_Finish_2(a) \
92
if (!asn1_const_Finish(&c)) \
93
{ c.line=__LINE__; goto err; } \
94
*(const unsigned char **)pp=c.p; \
95
if (a != NULL) (*a)=ret; \
96
return(ret);
97
98
#define M_ASN1_D2I_Finish(a,func,e) \
99
M_ASN1_D2I_Finish_2(a); \
100
err:\
101
ASN1_MAC_H_err((e),c.error,c.line); \
102
asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \
103
if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
104
return(NULL)
105
106
#define M_ASN1_D2I_start_sequence() \
107
if (!asn1_GetSequence(&c,&length)) \
108
{ c.line=__LINE__; goto err; }
109
/* Begin reading ASN1 without a surrounding sequence */
110
#define M_ASN1_D2I_begin() \
111
c.slen = length;
112
113
/* End reading ASN1 with no check on length */
114
#define M_ASN1_D2I_Finish_nolen(a, func, e) \
115
*pp=c.p; \
116
if (a != NULL) (*a)=ret; \
117
return(ret); \
118
err:\
119
ASN1_MAC_H_err((e),c.error,c.line); \
120
asn1_add_error(*pp,(int)(c.q- *pp)); \
121
if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
122
return(NULL)
123
124
#define M_ASN1_D2I_end_sequence() \
125
(((c.inf&1) == 0)?(c.slen <= 0): \
126
(c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))
127
128
/* Don't use this with d2i_ASN1_BOOLEAN() */
129
#define M_ASN1_D2I_get(b, func) \
130
c.q=c.p; \
131
if (func(&(b),&c.p,c.slen) == NULL) \
132
{c.line=__LINE__; goto err; } \
133
c.slen-=(c.p-c.q);
134
135
/* Don't use this with d2i_ASN1_BOOLEAN() */
136
#define M_ASN1_D2I_get_x(type,b,func) \
137
c.q=c.p; \
138
if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \
139
{c.line=__LINE__; goto err; } \
140
c.slen-=(c.p-c.q);
141
142
/* use this instead () */
143
#define M_ASN1_D2I_get_int(b,func) \
144
c.q=c.p; \
145
if (func(&(b),&c.p,c.slen) < 0) \
146
{c.line=__LINE__; goto err; } \
147
c.slen-=(c.p-c.q);
148
149
#define M_ASN1_D2I_get_opt(b,func,type) \
150
if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
151
== (V_ASN1_UNIVERSAL|(type)))) \
152
{ \
153
M_ASN1_D2I_get(b,func); \
154
}
155
156
#define M_ASN1_D2I_get_imp(b,func, type) \
157
M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
158
c.q=c.p; \
159
if (func(&(b),&c.p,c.slen) == NULL) \
160
{c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
161
c.slen-=(c.p-c.q);\
162
M_ASN1_next_prev=_tmp;
163
164
#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
165
if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
166
(V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
167
{ \
168
unsigned char _tmp = M_ASN1_next; \
169
M_ASN1_D2I_get_imp(b,func, type);\
170
}
171
172
#define M_ASN1_D2I_get_set(r,func,free_func) \
173
M_ASN1_D2I_get_imp_set(r,func,free_func, \
174
V_ASN1_SET,V_ASN1_UNIVERSAL);
175
176
#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
177
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
178
V_ASN1_SET,V_ASN1_UNIVERSAL);
179
180
#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
181
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
182
V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
183
{ M_ASN1_D2I_get_set(r,func,free_func); }
184
185
#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
186
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
187
V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
188
{ M_ASN1_D2I_get_set_type(type,r,func,free_func); }
189
190
#define M_ASN1_I2D_len_SET_opt(a,f) \
191
if ((a != NULL) && (sk_num(a) != 0)) \
192
M_ASN1_I2D_len_SET(a,f);
193
194
#define M_ASN1_I2D_put_SET_opt(a,f) \
195
if ((a != NULL) && (sk_num(a) != 0)) \
196
M_ASN1_I2D_put_SET(a,f);
197
198
#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
199
if ((a != NULL) && (sk_num(a) != 0)) \
200
M_ASN1_I2D_put_SEQUENCE(a,f);
201
202
#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
203
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
204
M_ASN1_I2D_put_SEQUENCE_type(type,a,f);
205
206
#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
207
if ((c.slen != 0) && \
208
(M_ASN1_next == \
209
(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
210
{ \
211
M_ASN1_D2I_get_imp_set(b,func,free_func,\
212
tag,V_ASN1_CONTEXT_SPECIFIC); \
213
}
214
215
#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
216
if ((c.slen != 0) && \
217
(M_ASN1_next == \
218
(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
219
{ \
220
M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
221
tag,V_ASN1_CONTEXT_SPECIFIC); \
222
}
223
224
#define M_ASN1_D2I_get_seq(r,func,free_func) \
225
M_ASN1_D2I_get_imp_set(r,func,free_func,\
226
V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);
227
228
#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
229
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
230
V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
231
232
#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
233
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
234
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
235
{ M_ASN1_D2I_get_seq(r,func,free_func); }
236
237
#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
238
if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
239
V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
240
{ M_ASN1_D2I_get_seq_type(type,r,func,free_func); }
241
242
#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
243
M_ASN1_D2I_get_imp_set(r,func,free_func,\
244
x,V_ASN1_CONTEXT_SPECIFIC);
245
246
#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
247
M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
248
x,V_ASN1_CONTEXT_SPECIFIC);
249
250
#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
251
c.q=c.p; \
252
if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
253
(void (*)())free_func,a,b) == NULL) \
254
{ c.line=__LINE__; goto err; } \
255
c.slen-=(c.p-c.q);
256
257
#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
258
c.q=c.p; \
259
if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
260
free_func,a,b) == NULL) \
261
{ c.line=__LINE__; goto err; } \
262
c.slen-=(c.p-c.q);
263
264
#define M_ASN1_D2I_get_set_strings(r,func,a,b) \
265
c.q=c.p; \
266
if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
267
{ c.line=__LINE__; goto err; } \
268
c.slen-=(c.p-c.q);
269
270
#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
271
if ((c.slen != 0L) && (M_ASN1_next == \
272
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
273
{ \
274
int Tinf,Ttag,Tclass; \
275
long Tlen; \
276
\
277
c.q=c.p; \
278
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
279
if (Tinf & 0x80) \
280
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
281
c.line=__LINE__; goto err; } \
282
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
283
Tlen = c.slen - (c.p - c.q) - 2; \
284
if (func(&(r),&c.p,Tlen) == NULL) \
285
{ c.line=__LINE__; goto err; } \
286
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
287
Tlen = c.slen - (c.p - c.q); \
288
if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \
289
{ c.error=ERR_R_MISSING_ASN1_EOS; \
290
c.line=__LINE__; goto err; } \
291
}\
292
c.slen-=(c.p-c.q); \
293
}
294
295
#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
296
if ((c.slen != 0) && (M_ASN1_next == \
297
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
298
{ \
299
int Tinf,Ttag,Tclass; \
300
long Tlen; \
301
\
302
c.q=c.p; \
303
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
304
if (Tinf & 0x80) \
305
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
306
c.line=__LINE__; goto err; } \
307
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
308
Tlen = c.slen - (c.p - c.q) - 2; \
309
if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
310
(void (*)())free_func, \
311
b,V_ASN1_UNIVERSAL) == NULL) \
312
{ c.line=__LINE__; goto err; } \
313
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
314
Tlen = c.slen - (c.p - c.q); \
315
if(!ASN1_check_infinite_end(&c.p, Tlen)) \
316
{ c.error=ERR_R_MISSING_ASN1_EOS; \
317
c.line=__LINE__; goto err; } \
318
}\
319
c.slen-=(c.p-c.q); \
320
}
321
322
#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
323
if ((c.slen != 0) && (M_ASN1_next == \
324
(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
325
{ \
326
int Tinf,Ttag,Tclass; \
327
long Tlen; \
328
\
329
c.q=c.p; \
330
Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
331
if (Tinf & 0x80) \
332
{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
333
c.line=__LINE__; goto err; } \
334
if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
335
Tlen = c.slen - (c.p - c.q) - 2; \
336
if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
337
free_func,b,V_ASN1_UNIVERSAL) == NULL) \
338
{ c.line=__LINE__; goto err; } \
339
if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
340
Tlen = c.slen - (c.p - c.q); \
341
if(!ASN1_check_infinite_end(&c.p, Tlen)) \
342
{ c.error=ERR_R_MISSING_ASN1_EOS; \
343
c.line=__LINE__; goto err; } \
344
}\
345
c.slen-=(c.p-c.q); \
346
}
347
348
/* New macros */
349
#define M_ASN1_New_Malloc(ret,type) \
350
if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \
351
{ c.line=__LINE__; goto err2; }
352
353
#define M_ASN1_New(arg,func) \
354
if (((arg)=func()) == NULL) return(NULL)
355
356
#define M_ASN1_New_Error(a) \
357
/* err: ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
358
return(NULL);*/
\
359
err2: ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
360
return(NULL)
361
362
363
/* BIG UGLY WARNING! This is so damn ugly I wanna puke. Unfortunately,
364
some macros that use ASN1_const_CTX still insist on writing in the input
365
stream. ARGH! ARGH! ARGH! Let's get rid of this macro package.
366
Please? -- Richard Levitte */
367
#define M_ASN1_next (*((unsigned char *)(c.p)))
368
#define M_ASN1_next_prev (*((unsigned char *)(c.q)))
369
370
/*************************************************/
371
372
#define M_ASN1_I2D_vars(a) int r=0,ret=0; \
373
unsigned char *p; \
374
if (a == NULL) return(0)
375
376
/* Length Macros */
377
#define M_ASN1_I2D_len(a,f) ret+=f(a,NULL)
378
#define M_ASN1_I2D_len_IMP_opt(a,f) if (a != NULL) M_ASN1_I2D_len(a,f)
379
380
#define M_ASN1_I2D_len_SET(a,f) \
381
ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);
382
383
#define M_ASN1_I2D_len_SET_type(type,a,f) \
384
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
385
V_ASN1_UNIVERSAL,IS_SET);
386
387
#define M_ASN1_I2D_len_SEQUENCE(a,f) \
388
ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
389
IS_SEQUENCE);
390
391
#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
392
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
393
V_ASN1_UNIVERSAL,IS_SEQUENCE)
394
395
#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
396
if ((a != NULL) && (sk_num(a) != 0)) \
397
M_ASN1_I2D_len_SEQUENCE(a,f);
398
399
#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
400
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
401
M_ASN1_I2D_len_SEQUENCE_type(type,a,f);
402
403
#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
404
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);
405
406
#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
407
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
408
V_ASN1_CONTEXT_SPECIFIC,IS_SET);
409
410
#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
411
if ((a != NULL) && (sk_num(a) != 0)) \
412
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
413
IS_SET);
414
415
#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
416
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
417
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
418
V_ASN1_CONTEXT_SPECIFIC,IS_SET);
419
420
#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
421
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
422
IS_SEQUENCE);
423
424
#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
425
if ((a != NULL) && (sk_num(a) != 0)) \
426
ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
427
IS_SEQUENCE);
428
429
#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
430
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
431
ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
432
V_ASN1_CONTEXT_SPECIFIC, \
433
IS_SEQUENCE);
434
435
#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
436
if (a != NULL)\
437
{ \
438
v=f(a,NULL); \
439
ret+=ASN1_object_size(1,v,mtag); \
440
}
441
442
#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
443
if ((a != NULL) && (sk_num(a) != 0))\
444
{ \
445
v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
446
ret+=ASN1_object_size(1,v,mtag); \
447
}
448
449
#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
450
if ((a != NULL) && (sk_num(a) != 0))\
451
{ \
452
v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
453
IS_SEQUENCE); \
454
ret+=ASN1_object_size(1,v,mtag); \
455
}
456
457
#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
458
if ((a != NULL) && (sk_##type##_num(a) != 0))\
459
{ \
460
v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
461
V_ASN1_UNIVERSAL, \
462
IS_SEQUENCE); \
463
ret+=ASN1_object_size(1,v,mtag); \
464
}
465
466
/* Put Macros */
467
#define M_ASN1_I2D_put(a,f) f(a,&p)
468
469
#define M_ASN1_I2D_put_IMP_opt(a,f,t) \
470
if (a != NULL) \
471
{ \
472
unsigned char *q=p; \
473
f(a,&p); \
474
*q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\
475
}
476
477
#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
478
V_ASN1_UNIVERSAL,IS_SET)
479
#define M_ASN1_I2D_put_SET_type(type,a,f) \
480
i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
481
#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
482
V_ASN1_CONTEXT_SPECIFIC,IS_SET)
483
#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
484
i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
485
#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
486
V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)
487
488
#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
489
V_ASN1_UNIVERSAL,IS_SEQUENCE)
490
491
#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
492
i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
493
IS_SEQUENCE)
494
495
#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
496
if ((a != NULL) && (sk_num(a) != 0)) \
497
M_ASN1_I2D_put_SEQUENCE(a,f);
498
499
#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
500
if ((a != NULL) && (sk_num(a) != 0)) \
501
{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
502
IS_SET); }
503
504
#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
505
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
506
{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
507
V_ASN1_CONTEXT_SPECIFIC, \
508
IS_SET); }
509
510
#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
511
if ((a != NULL) && (sk_num(a) != 0)) \
512
{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
513
IS_SEQUENCE); }
514
515
#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
516
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
517
{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
518
V_ASN1_CONTEXT_SPECIFIC, \
519
IS_SEQUENCE); }
520
521
#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
522
if (a != NULL) \
523
{ \
524
ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \
525
f(a,&p); \
526
}
527
528
#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
529
if ((a != NULL) && (sk_num(a) != 0)) \
530
{ \
531
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
532
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
533
}
534
535
#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
536
if ((a != NULL) && (sk_num(a) != 0)) \
537
{ \
538
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
539
i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
540
}
541
542
#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
543
if ((a != NULL) && (sk_##type##_num(a) != 0)) \
544
{ \
545
ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
546
i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
547
IS_SEQUENCE); \
548
}
549
550
#define M_ASN1_I2D_seq_total() \
551
r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
552
if (pp == NULL) return(r); \
553
p= *pp; \
554
ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)
555
556
#define M_ASN1_I2D_INF_seq_start(tag,ctx) \
557
*(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \
558
*(p++)=0x80
559
560
#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00
561
562
#define M_ASN1_I2D_finish() *pp=p; \
563
return(r);
564
565
int
asn1_GetSequence(
ASN1_const_CTX
*c,
long
*length);
566
void
asn1_add_error(
const
unsigned
char
*address,
int
offset);
567
#ifdef __cplusplus
568
}
569
#endif
570
571
#endif
asn1_const_ctx_st
Definition:
asn1.h:190
Generated on Wed Aug 19 2020 10:33:39 for versadac by
1.8.9.1