87f192fa80bb1421f242c04ee4e03c538c9c3a7f
[openssl.git] / crypto / x509 / x509.h
1 /* crypto/x509/x509.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_X509_H
60 #define HEADER_X509_H
61
62 #ifdef VMS
63 #undef X509_REVOKED_get_ext_by_critical
64 #define X509_REVOKED_get_ext_by_critical X509_REVOKED_get_ext_by_critic
65 #endif
66
67 #ifndef NO_BUFFER
68 #include <openssl/buffer.h>
69 #endif
70 #ifndef NO_EVP
71 #include <openssl/evp.h>
72 #endif
73 #ifndef NO_BIO
74 #include <openssl/bio.h>
75 #endif
76 #include <openssl/stack.h>
77 #include <openssl/asn1.h>
78 #include <openssl/safestack.h>
79
80 #ifndef NO_RSA
81 #include <openssl/rsa.h>
82 #endif
83
84 #ifndef NO_DSA
85 #include <openssl/dsa.h>
86 #endif
87
88 #ifndef NO_DH
89 #include <openssl/dh.h>
90 #endif
91
92 #include <openssl/evp.h>
93
94
95 #ifdef  __cplusplus
96 extern "C" {
97 #endif
98
99 #ifdef WIN32
100 /* Under Win32 this is defined in wincrypt.h */
101 #undef X509_NAME
102 #endif
103
104   /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */
105 #define DECLARE_PKCS12_STACK_OF(type) \
106 STACK_OF(type) *PKCS12_decrypt_d2i_##type(struct X509_algor_st *algor, \
107                                           type *(*d2i)(type **, \
108                                                        unsigned char **, \
109                                                        long), \
110                                           void (*free_func)(type *), \
111                                           const char *pass, int passlen, \
112                                           ASN1_STRING *oct, int seq);
113
114 #define IMPLEMENT_PKCS12_STACK_OF(type) \
115 STACK_OF(type) *PKCS12_decrypt_d2i_##type(struct X509_algor_st *algor, \
116                                           type *(*d2i)(type **, \
117                                                        unsigned char **, \
118                                                        long), \
119                                           void (*free_func)(type *), \
120                                           const char *pass, int passlen, \
121                                           ASN1_STRING *oct, int seq) \
122     { return (STACK_OF(type) *)PKCS12_decrypt_d2i(algor,(char *(*)())d2i, \
123                                                   (void(*)(void *))free_func, \
124                                                   pass,passlen,oct,seq); }
125
126 #define X509_FILETYPE_PEM       1
127 #define X509_FILETYPE_ASN1      2
128 #define X509_FILETYPE_DEFAULT   3
129
130 #define X509v3_KU_DIGITAL_SIGNATURE     0x0080
131 #define X509v3_KU_NON_REPUDIATION       0x0040
132 #define X509v3_KU_KEY_ENCIPHERMENT      0x0020
133 #define X509v3_KU_DATA_ENCIPHERMENT     0x0010
134 #define X509v3_KU_KEY_AGREEMENT         0x0008
135 #define X509v3_KU_KEY_CERT_SIGN         0x0004
136 #define X509v3_KU_CRL_SIGN              0x0002
137 #define X509v3_KU_ENCIPHER_ONLY         0x0001
138 #define X509v3_KU_DECIPHER_ONLY         0x8000
139 #define X509v3_KU_UNDEF                 0xffff
140
141 typedef struct X509_objects_st
142         {
143         int nid;
144         int (*a2i)();
145         int (*i2a)();
146         } X509_OBJECTS;
147
148 typedef struct X509_algor_st
149         {
150         ASN1_OBJECT *algorithm;
151         ASN1_TYPE *parameter;
152         } X509_ALGOR;
153
154 DECLARE_STACK_OF(X509_ALGOR)
155 /* This block of defines is updated by a perl script, please do not touch! */
156 #ifndef DEBUG_SAFESTACK
157         #define sk_X509_ALGOR_new(a) sk_new((int (*) \
158                 (const char * const *, const char * const *))(a))
159         #define sk_X509_ALGOR_new_null() sk_new_null()
160         #define sk_X509_ALGOR_free(a) sk_free(a)
161         #define sk_X509_ALGOR_num(a) sk_num(a)
162         #define sk_X509_ALGOR_value(a,b) ((X509_ALGOR *) \
163                 sk_value((a),(b)))
164         #define sk_X509_ALGOR_set(a,b,c) ((X509_ALGOR *) \
165                 sk_set((a),(b),(char *)(c)))
166         #define sk_X509_ALGOR_zero(a) sk_zero(a)
167         #define sk_X509_ALGOR_push(a,b) sk_push((a),(char *)(b))
168         #define sk_X509_ALGOR_unshift(a,b) sk_unshift((a),(b))
169         #define sk_X509_ALGOR_find(a,b) sk_find((a), (char *)(b))
170         #define sk_X509_ALGOR_delete(a,b) ((X509_ALGOR *) \
171                 sk_delete((a),(b)))
172         #define sk_X509_ALGOR_delete_ptr(a,b) ((X509_ALGOR *) \
173                 sk_delete_ptr((a),(char *)(b)))
174         #define sk_X509_ALGOR_insert(a,b,c) sk_insert((a),(char *)(b),(c))
175         #define sk_X509_ALGOR_set_cmp_func(a,b) ((int (*) \
176                 (const X509_ALGOR * const *,const X509_ALGOR * const *)) \
177                 sk_set_cmp_func((a),(int (*) \
178                 (const char * const *, const char * const *))(b)))
179         #define sk_X509_ALGOR_dup(a) sk_dup(a)
180         #define sk_X509_ALGOR_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
181         #define sk_X509_ALGOR_shift(a) ((X509_ALGOR *)sk_shift(a))
182         #define sk_X509_ALGOR_pop(a) ((X509_ALGOR *)sk_pop(a))
183         #define sk_X509_ALGOR_sort(a) sk_sort(a)
184 #endif /* !DEBUG_SAFESTACK */
185 /* End of perl script block, you may now edit :-) */
186 DECLARE_ASN1_SET_OF(X509_ALGOR)
187
188 typedef struct X509_val_st
189         {
190         ASN1_UTCTIME *notBefore;
191         ASN1_UTCTIME *notAfter;
192         } X509_VAL;
193
194 typedef struct X509_pubkey_st
195         {
196         X509_ALGOR *algor;
197         ASN1_BIT_STRING *public_key;
198         EVP_PKEY *pkey;
199         } X509_PUBKEY;
200
201 typedef struct X509_sig_st
202         {
203         X509_ALGOR *algor;
204         ASN1_OCTET_STRING *digest;
205         } X509_SIG;
206
207 typedef struct X509_name_entry_st
208         {
209         ASN1_OBJECT *object;
210         ASN1_STRING *value;
211         int set;
212         int size;       /* temp variable */
213         } X509_NAME_ENTRY;
214
215 DECLARE_STACK_OF(X509_NAME_ENTRY)
216 /* This block of defines is updated by a perl script, please do not touch! */
217 #ifndef DEBUG_SAFESTACK
218         #define sk_X509_NAME_ENTRY_new(a) sk_new((int (*) \
219                 (const char * const *, const char * const *))(a))
220         #define sk_X509_NAME_ENTRY_new_null() sk_new_null()
221         #define sk_X509_NAME_ENTRY_free(a) sk_free(a)
222         #define sk_X509_NAME_ENTRY_num(a) sk_num(a)
223         #define sk_X509_NAME_ENTRY_value(a,b) ((X509_NAME_ENTRY *) \
224                 sk_value((a),(b)))
225         #define sk_X509_NAME_ENTRY_set(a,b,c) ((X509_NAME_ENTRY *) \
226                 sk_set((a),(b),(char *)(c)))
227         #define sk_X509_NAME_ENTRY_zero(a) sk_zero(a)
228         #define sk_X509_NAME_ENTRY_push(a,b) sk_push((a),(char *)(b))
229         #define sk_X509_NAME_ENTRY_unshift(a,b) sk_unshift((a),(b))
230         #define sk_X509_NAME_ENTRY_find(a,b) sk_find((a), (char *)(b))
231         #define sk_X509_NAME_ENTRY_delete(a,b) ((X509_NAME_ENTRY *) \
232                 sk_delete((a),(b)))
233         #define sk_X509_NAME_ENTRY_delete_ptr(a,b) ((X509_NAME_ENTRY *) \
234                 sk_delete_ptr((a),(char *)(b)))
235         #define sk_X509_NAME_ENTRY_insert(a,b,c) sk_insert((a),(char *)(b),(c))
236         #define sk_X509_NAME_ENTRY_set_cmp_func(a,b) ((int (*) \
237                 (const X509_NAME_ENTRY * const *,const X509_NAME_ENTRY * const *)) \
238                 sk_set_cmp_func((a),(int (*) \
239                 (const char * const *, const char * const *))(b)))
240         #define sk_X509_NAME_ENTRY_dup(a) sk_dup(a)
241         #define sk_X509_NAME_ENTRY_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
242         #define sk_X509_NAME_ENTRY_shift(a) ((X509_NAME_ENTRY *)sk_shift(a))
243         #define sk_X509_NAME_ENTRY_pop(a) ((X509_NAME_ENTRY *)sk_pop(a))
244         #define sk_X509_NAME_ENTRY_sort(a) sk_sort(a)
245 #endif /* !DEBUG_SAFESTACK */
246 /* End of perl script block, you may now edit :-) */
247 DECLARE_ASN1_SET_OF(X509_NAME_ENTRY)
248
249 /* we always keep X509_NAMEs in 2 forms. */
250 typedef struct X509_name_st
251         {
252         STACK_OF(X509_NAME_ENTRY) *entries;
253         int modified;   /* true if 'bytes' needs to be built */
254 #ifndef NO_BUFFER
255         BUF_MEM *bytes;
256 #else
257         char *bytes;
258 #endif
259         unsigned long hash; /* Keep the hash around for lookups */
260         } X509_NAME;
261
262 DECLARE_STACK_OF(X509_NAME)
263 /* This block of defines is updated by a perl script, please do not touch! */
264 #ifndef DEBUG_SAFESTACK
265         #define sk_X509_NAME_new(a) sk_new((int (*) \
266                 (const char * const *, const char * const *))(a))
267         #define sk_X509_NAME_new_null() sk_new_null()
268         #define sk_X509_NAME_free(a) sk_free(a)
269         #define sk_X509_NAME_num(a) sk_num(a)
270         #define sk_X509_NAME_value(a,b) ((X509_NAME *) \
271                 sk_value((a),(b)))
272         #define sk_X509_NAME_set(a,b,c) ((X509_NAME *) \
273                 sk_set((a),(b),(char *)(c)))
274         #define sk_X509_NAME_zero(a) sk_zero(a)
275         #define sk_X509_NAME_push(a,b) sk_push((a),(char *)(b))
276         #define sk_X509_NAME_unshift(a,b) sk_unshift((a),(b))
277         #define sk_X509_NAME_find(a,b) sk_find((a), (char *)(b))
278         #define sk_X509_NAME_delete(a,b) ((X509_NAME *) \
279                 sk_delete((a),(b)))
280         #define sk_X509_NAME_delete_ptr(a,b) ((X509_NAME *) \
281                 sk_delete_ptr((a),(char *)(b)))
282         #define sk_X509_NAME_insert(a,b,c) sk_insert((a),(char *)(b),(c))
283         #define sk_X509_NAME_set_cmp_func(a,b) ((int (*) \
284                 (const X509_NAME * const *,const X509_NAME * const *)) \
285                 sk_set_cmp_func((a),(int (*) \
286                 (const char * const *, const char * const *))(b)))
287         #define sk_X509_NAME_dup(a) sk_dup(a)
288         #define sk_X509_NAME_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
289         #define sk_X509_NAME_shift(a) ((X509_NAME *)sk_shift(a))
290         #define sk_X509_NAME_pop(a) ((X509_NAME *)sk_pop(a))
291         #define sk_X509_NAME_sort(a) sk_sort(a)
292 #endif /* !DEBUG_SAFESTACK */
293 /* End of perl script block, you may now edit :-) */
294
295 #define X509_EX_V_NETSCAPE_HACK         0x8000
296 #define X509_EX_V_INIT                  0x0001
297 typedef struct X509_extension_st
298         {
299         ASN1_OBJECT *object;
300         short critical;
301         short netscape_hack;
302         ASN1_OCTET_STRING *value;
303         struct v3_ext_method *method;   /* V3 method to use */
304         void *ext_val;                  /* extension value */
305         } X509_EXTENSION;
306
307 DECLARE_STACK_OF(X509_EXTENSION)
308 /* This block of defines is updated by a perl script, please do not touch! */
309 #ifndef DEBUG_SAFESTACK
310         #define sk_X509_EXTENSION_new(a) sk_new((int (*) \
311                 (const char * const *, const char * const *))(a))
312         #define sk_X509_EXTENSION_new_null() sk_new_null()
313         #define sk_X509_EXTENSION_free(a) sk_free(a)
314         #define sk_X509_EXTENSION_num(a) sk_num(a)
315         #define sk_X509_EXTENSION_value(a,b) ((X509_EXTENSION *) \
316                 sk_value((a),(b)))
317         #define sk_X509_EXTENSION_set(a,b,c) ((X509_EXTENSION *) \
318                 sk_set((a),(b),(char *)(c)))
319         #define sk_X509_EXTENSION_zero(a) sk_zero(a)
320         #define sk_X509_EXTENSION_push(a,b) sk_push((a),(char *)(b))
321         #define sk_X509_EXTENSION_unshift(a,b) sk_unshift((a),(b))
322         #define sk_X509_EXTENSION_find(a,b) sk_find((a), (char *)(b))
323         #define sk_X509_EXTENSION_delete(a,b) ((X509_EXTENSION *) \
324                 sk_delete((a),(b)))
325         #define sk_X509_EXTENSION_delete_ptr(a,b) ((X509_EXTENSION *) \
326                 sk_delete_ptr((a),(char *)(b)))
327         #define sk_X509_EXTENSION_insert(a,b,c) sk_insert((a),(char *)(b),(c))
328         #define sk_X509_EXTENSION_set_cmp_func(a,b) ((int (*) \
329                 (const X509_EXTENSION * const *,const X509_EXTENSION * const *)) \
330                 sk_set_cmp_func((a),(int (*) \
331                 (const char * const *, const char * const *))(b)))
332         #define sk_X509_EXTENSION_dup(a) sk_dup(a)
333         #define sk_X509_EXTENSION_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
334         #define sk_X509_EXTENSION_shift(a) ((X509_EXTENSION *)sk_shift(a))
335         #define sk_X509_EXTENSION_pop(a) ((X509_EXTENSION *)sk_pop(a))
336         #define sk_X509_EXTENSION_sort(a) sk_sort(a)
337 #endif /* !DEBUG_SAFESTACK */
338 /* End of perl script block, you may now edit :-) */
339 DECLARE_ASN1_SET_OF(X509_EXTENSION)
340
341 /* a sequence of these are used */
342 typedef struct x509_attributes_st
343         {
344         ASN1_OBJECT *object;
345         int set; /* 1 for a set, 0 for a single item (which is wrong) */
346         union   {
347                 char            *ptr;
348 /* 1 */         STACK_OF(ASN1_TYPE) *set;
349 /* 0 */         ASN1_TYPE       *single;
350                 } value;
351         } X509_ATTRIBUTE;
352
353 DECLARE_STACK_OF(X509_ATTRIBUTE)
354 /* This block of defines is updated by a perl script, please do not touch! */
355 #ifndef DEBUG_SAFESTACK
356         #define sk_X509_ATTRIBUTE_new(a) sk_new((int (*) \
357                 (const char * const *, const char * const *))(a))
358         #define sk_X509_ATTRIBUTE_new_null() sk_new_null()
359         #define sk_X509_ATTRIBUTE_free(a) sk_free(a)
360         #define sk_X509_ATTRIBUTE_num(a) sk_num(a)
361         #define sk_X509_ATTRIBUTE_value(a,b) ((X509_ATTRIBUTE *) \
362                 sk_value((a),(b)))
363         #define sk_X509_ATTRIBUTE_set(a,b,c) ((X509_ATTRIBUTE *) \
364                 sk_set((a),(b),(char *)(c)))
365         #define sk_X509_ATTRIBUTE_zero(a) sk_zero(a)
366         #define sk_X509_ATTRIBUTE_push(a,b) sk_push((a),(char *)(b))
367         #define sk_X509_ATTRIBUTE_unshift(a,b) sk_unshift((a),(b))
368         #define sk_X509_ATTRIBUTE_find(a,b) sk_find((a), (char *)(b))
369         #define sk_X509_ATTRIBUTE_delete(a,b) ((X509_ATTRIBUTE *) \
370                 sk_delete((a),(b)))
371         #define sk_X509_ATTRIBUTE_delete_ptr(a,b) ((X509_ATTRIBUTE *) \
372                 sk_delete_ptr((a),(char *)(b)))
373         #define sk_X509_ATTRIBUTE_insert(a,b,c) sk_insert((a),(char *)(b),(c))
374         #define sk_X509_ATTRIBUTE_set_cmp_func(a,b) ((int (*) \
375                 (const X509_ATTRIBUTE * const *,const X509_ATTRIBUTE * const *)) \
376                 sk_set_cmp_func((a),(int (*) \
377                 (const char * const *, const char * const *))(b)))
378         #define sk_X509_ATTRIBUTE_dup(a) sk_dup(a)
379         #define sk_X509_ATTRIBUTE_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
380         #define sk_X509_ATTRIBUTE_shift(a) ((X509_ATTRIBUTE *)sk_shift(a))
381         #define sk_X509_ATTRIBUTE_pop(a) ((X509_ATTRIBUTE *)sk_pop(a))
382         #define sk_X509_ATTRIBUTE_sort(a) sk_sort(a)
383 #endif /* !DEBUG_SAFESTACK */
384 /* End of perl script block, you may now edit :-) */
385 DECLARE_ASN1_SET_OF(X509_ATTRIBUTE)
386
387 typedef struct X509_req_info_st
388         {
389         ASN1_INTEGER *version;
390         X509_NAME *subject;
391         X509_PUBKEY *pubkey;
392         /*  d=2 hl=2 l=  0 cons: cont: 00 */
393         STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
394         int req_kludge;
395         } X509_REQ_INFO;
396
397 typedef struct X509_req_st
398         {
399         X509_REQ_INFO *req_info;
400         X509_ALGOR *sig_alg;
401         ASN1_BIT_STRING *signature;
402         int references;
403         } X509_REQ;
404
405 typedef struct x509_cinf_st
406         {
407         ASN1_INTEGER *version;          /* [ 0 ] default of v1 */
408         ASN1_INTEGER *serialNumber;
409         X509_ALGOR *signature;
410         X509_NAME *issuer;
411         X509_VAL *validity;
412         X509_NAME *subject;
413         X509_PUBKEY *key;
414         ASN1_BIT_STRING *issuerUID;             /* [ 1 ] optional in v2 */
415         ASN1_BIT_STRING *subjectUID;            /* [ 2 ] optional in v2 */
416         STACK_OF(X509_EXTENSION) *extensions;   /* [ 3 ] optional in v3 */
417         } X509_CINF;
418
419 /* This stuff is certificate "auxiliary info"
420  * it contains details which are useful in certificate
421  * stores and databases. When used this is tagged onto
422  * the end of the certificate itself
423  */
424
425 typedef struct x509_cert_aux_st
426         {
427         STACK_OF(ASN1_OBJECT) *trust;           /* trusted uses */
428         STACK_OF(ASN1_OBJECT) *reject;          /* rejected uses */
429         ASN1_UTF8STRING *alias;                 /* "friendly name" */
430         ASN1_OCTET_STRING *keyid;               /* key id of private key */
431         STACK_OF(X509_ALGOR) *other;            /* other unspecified info */
432         } X509_CERT_AUX;
433
434 typedef struct x509_st
435         {
436         X509_CINF *cert_info;
437         X509_ALGOR *sig_alg;
438         ASN1_BIT_STRING *signature;
439         int valid;
440         int references;
441         char *name;
442         CRYPTO_EX_DATA ex_data;
443         /* These contain copies of various extension values */
444         long ex_pathlen;
445         unsigned long ex_flags;
446         unsigned long ex_kusage;
447         unsigned long ex_xkusage;
448         unsigned long ex_nscert;
449 #ifndef NO_SHA
450         unsigned char sha1_hash[SHA_DIGEST_LENGTH];
451 #endif
452         X509_CERT_AUX *aux;
453         } X509;
454
455 DECLARE_STACK_OF(X509)
456 /* This block of defines is updated by a perl script, please do not touch! */
457 #ifndef DEBUG_SAFESTACK
458         #define sk_X509_new(a) sk_new((int (*) \
459                 (const char * const *, const char * const *))(a))
460         #define sk_X509_new_null() sk_new_null()
461         #define sk_X509_free(a) sk_free(a)
462         #define sk_X509_num(a) sk_num(a)
463         #define sk_X509_value(a,b) ((X509 *) \
464                 sk_value((a),(b)))
465         #define sk_X509_set(a,b,c) ((X509 *) \
466                 sk_set((a),(b),(char *)(c)))
467         #define sk_X509_zero(a) sk_zero(a)
468         #define sk_X509_push(a,b) sk_push((a),(char *)(b))
469         #define sk_X509_unshift(a,b) sk_unshift((a),(b))
470         #define sk_X509_find(a,b) sk_find((a), (char *)(b))
471         #define sk_X509_delete(a,b) ((X509 *) \
472                 sk_delete((a),(b)))
473         #define sk_X509_delete_ptr(a,b) ((X509 *) \
474                 sk_delete_ptr((a),(char *)(b)))
475         #define sk_X509_insert(a,b,c) sk_insert((a),(char *)(b),(c))
476         #define sk_X509_set_cmp_func(a,b) ((int (*) \
477                 (const X509 * const *,const X509 * const *)) \
478                 sk_set_cmp_func((a),(int (*) \
479                 (const char * const *, const char * const *))(b)))
480         #define sk_X509_dup(a) sk_dup(a)
481         #define sk_X509_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
482         #define sk_X509_shift(a) ((X509 *)sk_shift(a))
483         #define sk_X509_pop(a) ((X509 *)sk_pop(a))
484         #define sk_X509_sort(a) sk_sort(a)
485 #endif /* !DEBUG_SAFESTACK */
486 /* End of perl script block, you may now edit :-) */
487 DECLARE_ASN1_SET_OF(X509)
488
489 /* This is used for a table of trust checking functions */
490
491 typedef struct x509_trust_st {
492         int trust;
493         int flags;
494         int (*check_trust)(struct x509_trust_st *, X509 *, int);
495         char *name;
496         int arg1;
497         void *arg2;
498 } X509_TRUST;
499
500 DECLARE_STACK_OF(X509_TRUST)
501 /* This block of defines is updated by a perl script, please do not touch! */
502 #ifndef DEBUG_SAFESTACK
503         #define sk_X509_TRUST_new(a) sk_new((int (*) \
504                 (const char * const *, const char * const *))(a))
505         #define sk_X509_TRUST_new_null() sk_new_null()
506         #define sk_X509_TRUST_free(a) sk_free(a)
507         #define sk_X509_TRUST_num(a) sk_num(a)
508         #define sk_X509_TRUST_value(a,b) ((X509_TRUST *) \
509                 sk_value((a),(b)))
510         #define sk_X509_TRUST_set(a,b,c) ((X509_TRUST *) \
511                 sk_set((a),(b),(char *)(c)))
512         #define sk_X509_TRUST_zero(a) sk_zero(a)
513         #define sk_X509_TRUST_push(a,b) sk_push((a),(char *)(b))
514         #define sk_X509_TRUST_unshift(a,b) sk_unshift((a),(b))
515         #define sk_X509_TRUST_find(a,b) sk_find((a), (char *)(b))
516         #define sk_X509_TRUST_delete(a,b) ((X509_TRUST *) \
517                 sk_delete((a),(b)))
518         #define sk_X509_TRUST_delete_ptr(a,b) ((X509_TRUST *) \
519                 sk_delete_ptr((a),(char *)(b)))
520         #define sk_X509_TRUST_insert(a,b,c) sk_insert((a),(char *)(b),(c))
521         #define sk_X509_TRUST_set_cmp_func(a,b) ((int (*) \
522                 (const X509_TRUST * const *,const X509_TRUST * const *)) \
523                 sk_set_cmp_func((a),(int (*) \
524                 (const char * const *, const char * const *))(b)))
525         #define sk_X509_TRUST_dup(a) sk_dup(a)
526         #define sk_X509_TRUST_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
527         #define sk_X509_TRUST_shift(a) ((X509_TRUST *)sk_shift(a))
528         #define sk_X509_TRUST_pop(a) ((X509_TRUST *)sk_pop(a))
529         #define sk_X509_TRUST_sort(a) sk_sort(a)
530 #endif /* !DEBUG_SAFESTACK */
531 /* End of perl script block, you may now edit :-) */
532
533 /* standard trust ids */
534
535 #define X509_TRUST_DEFAULT      -1      /* Only valid in purpose settings */
536
537 #define X509_TRUST_COMPAT       1
538 #define X509_TRUST_SSL_CLIENT   2
539 #define X509_TRUST_SSL_SERVER   3
540 #define X509_TRUST_EMAIL        4
541 #define X509_TRUST_OBJECT_SIGN  5
542
543 /* Keep these up to date! */
544 #define X509_TRUST_MIN          1
545 #define X509_TRUST_MAX          5
546
547
548 /* trust_flags values */
549 #define X509_TRUST_DYNAMIC      1
550 #define X509_TRUST_DYNAMIC_NAME 2
551
552 /* check_trust return codes */
553
554 #define X509_TRUST_TRUSTED      1
555 #define X509_TRUST_REJECTED     2
556 #define X509_TRUST_UNTRUSTED    3
557
558 typedef struct X509_revoked_st
559         {
560         ASN1_INTEGER *serialNumber;
561         ASN1_UTCTIME *revocationDate;
562         STACK_OF(X509_EXTENSION) /* optional */ *extensions;
563         int sequence; /* load sequence */
564         } X509_REVOKED;
565
566 DECLARE_STACK_OF(X509_REVOKED)
567 /* This block of defines is updated by a perl script, please do not touch! */
568 #ifndef DEBUG_SAFESTACK
569         #define sk_X509_REVOKED_new(a) sk_new((int (*) \
570                 (const char * const *, const char * const *))(a))
571         #define sk_X509_REVOKED_new_null() sk_new_null()
572         #define sk_X509_REVOKED_free(a) sk_free(a)
573         #define sk_X509_REVOKED_num(a) sk_num(a)
574         #define sk_X509_REVOKED_value(a,b) ((X509_REVOKED *) \
575                 sk_value((a),(b)))
576         #define sk_X509_REVOKED_set(a,b,c) ((X509_REVOKED *) \
577                 sk_set((a),(b),(char *)(c)))
578         #define sk_X509_REVOKED_zero(a) sk_zero(a)
579         #define sk_X509_REVOKED_push(a,b) sk_push((a),(char *)(b))
580         #define sk_X509_REVOKED_unshift(a,b) sk_unshift((a),(b))
581         #define sk_X509_REVOKED_find(a,b) sk_find((a), (char *)(b))
582         #define sk_X509_REVOKED_delete(a,b) ((X509_REVOKED *) \
583                 sk_delete((a),(b)))
584         #define sk_X509_REVOKED_delete_ptr(a,b) ((X509_REVOKED *) \
585                 sk_delete_ptr((a),(char *)(b)))
586         #define sk_X509_REVOKED_insert(a,b,c) sk_insert((a),(char *)(b),(c))
587         #define sk_X509_REVOKED_set_cmp_func(a,b) ((int (*) \
588                 (const X509_REVOKED * const *,const X509_REVOKED * const *)) \
589                 sk_set_cmp_func((a),(int (*) \
590                 (const char * const *, const char * const *))(b)))
591         #define sk_X509_REVOKED_dup(a) sk_dup(a)
592         #define sk_X509_REVOKED_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
593         #define sk_X509_REVOKED_shift(a) ((X509_REVOKED *)sk_shift(a))
594         #define sk_X509_REVOKED_pop(a) ((X509_REVOKED *)sk_pop(a))
595         #define sk_X509_REVOKED_sort(a) sk_sort(a)
596 #endif /* !DEBUG_SAFESTACK */
597 /* End of perl script block, you may now edit :-) */
598 DECLARE_ASN1_SET_OF(X509_REVOKED)
599
600 typedef struct X509_crl_info_st
601         {
602         ASN1_INTEGER *version;
603         X509_ALGOR *sig_alg;
604         X509_NAME *issuer;
605         ASN1_UTCTIME *lastUpdate;
606         ASN1_UTCTIME *nextUpdate;
607         STACK_OF(X509_REVOKED) *revoked;
608         STACK_OF(X509_EXTENSION) /* [0] */ *extensions;
609         } X509_CRL_INFO;
610
611 typedef struct X509_crl_st
612         {
613         /* actual signature */
614         X509_CRL_INFO *crl;
615         X509_ALGOR *sig_alg;
616         ASN1_BIT_STRING *signature;
617         int references;
618         } X509_CRL;
619
620 DECLARE_STACK_OF(X509_CRL)
621 /* This block of defines is updated by a perl script, please do not touch! */
622 #ifndef DEBUG_SAFESTACK
623         #define sk_X509_CRL_new(a) sk_new((int (*) \
624                 (const char * const *, const char * const *))(a))
625         #define sk_X509_CRL_new_null() sk_new_null()
626         #define sk_X509_CRL_free(a) sk_free(a)
627         #define sk_X509_CRL_num(a) sk_num(a)
628         #define sk_X509_CRL_value(a,b) ((X509_CRL *) \
629                 sk_value((a),(b)))
630         #define sk_X509_CRL_set(a,b,c) ((X509_CRL *) \
631                 sk_set((a),(b),(char *)(c)))
632         #define sk_X509_CRL_zero(a) sk_zero(a)
633         #define sk_X509_CRL_push(a,b) sk_push((a),(char *)(b))
634         #define sk_X509_CRL_unshift(a,b) sk_unshift((a),(b))
635         #define sk_X509_CRL_find(a,b) sk_find((a), (char *)(b))
636         #define sk_X509_CRL_delete(a,b) ((X509_CRL *) \
637                 sk_delete((a),(b)))
638         #define sk_X509_CRL_delete_ptr(a,b) ((X509_CRL *) \
639                 sk_delete_ptr((a),(char *)(b)))
640         #define sk_X509_CRL_insert(a,b,c) sk_insert((a),(char *)(b),(c))
641         #define sk_X509_CRL_set_cmp_func(a,b) ((int (*) \
642                 (const X509_CRL * const *,const X509_CRL * const *)) \
643                 sk_set_cmp_func((a),(int (*) \
644                 (const char * const *, const char * const *))(b)))
645         #define sk_X509_CRL_dup(a) sk_dup(a)
646         #define sk_X509_CRL_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
647         #define sk_X509_CRL_shift(a) ((X509_CRL *)sk_shift(a))
648         #define sk_X509_CRL_pop(a) ((X509_CRL *)sk_pop(a))
649         #define sk_X509_CRL_sort(a) sk_sort(a)
650 #endif /* !DEBUG_SAFESTACK */
651 /* End of perl script block, you may now edit :-) */
652 DECLARE_ASN1_SET_OF(X509_CRL)
653
654 typedef struct private_key_st
655         {
656         int version;
657         /* The PKCS#8 data types */
658         X509_ALGOR *enc_algor;
659         ASN1_OCTET_STRING *enc_pkey;    /* encrypted pub key */
660
661         /* When decrypted, the following will not be NULL */
662         EVP_PKEY *dec_pkey;
663
664         /* used to encrypt and decrypt */
665         int key_length;
666         char *key_data;
667         int key_free;   /* true if we should auto free key_data */
668
669         /* expanded version of 'enc_algor' */
670         EVP_CIPHER_INFO cipher;
671
672         int references;
673         } X509_PKEY;
674
675 #ifndef NO_EVP
676 typedef struct X509_info_st
677         {
678         X509 *x509;
679         X509_CRL *crl;
680         X509_PKEY *x_pkey;
681
682         EVP_CIPHER_INFO enc_cipher;
683         int enc_len;
684         char *enc_data;
685
686         int references;
687         } X509_INFO;
688
689 DECLARE_STACK_OF(X509_INFO)
690 /* This block of defines is updated by a perl script, please do not touch! */
691 #ifndef DEBUG_SAFESTACK
692         #define sk_X509_INFO_new(a) sk_new((int (*) \
693                 (const char * const *, const char * const *))(a))
694         #define sk_X509_INFO_new_null() sk_new_null()
695         #define sk_X509_INFO_free(a) sk_free(a)
696         #define sk_X509_INFO_num(a) sk_num(a)
697         #define sk_X509_INFO_value(a,b) ((X509_INFO *) \
698                 sk_value((a),(b)))
699         #define sk_X509_INFO_set(a,b,c) ((X509_INFO *) \
700                 sk_set((a),(b),(char *)(c)))
701         #define sk_X509_INFO_zero(a) sk_zero(a)
702         #define sk_X509_INFO_push(a,b) sk_push((a),(char *)(b))
703         #define sk_X509_INFO_unshift(a,b) sk_unshift((a),(b))
704         #define sk_X509_INFO_find(a,b) sk_find((a), (char *)(b))
705         #define sk_X509_INFO_delete(a,b) ((X509_INFO *) \
706                 sk_delete((a),(b)))
707         #define sk_X509_INFO_delete_ptr(a,b) ((X509_INFO *) \
708                 sk_delete_ptr((a),(char *)(b)))
709         #define sk_X509_INFO_insert(a,b,c) sk_insert((a),(char *)(b),(c))
710         #define sk_X509_INFO_set_cmp_func(a,b) ((int (*) \
711                 (const X509_INFO * const *,const X509_INFO * const *)) \
712                 sk_set_cmp_func((a),(int (*) \
713                 (const char * const *, const char * const *))(b)))
714         #define sk_X509_INFO_dup(a) sk_dup(a)
715         #define sk_X509_INFO_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
716         #define sk_X509_INFO_shift(a) ((X509_INFO *)sk_shift(a))
717         #define sk_X509_INFO_pop(a) ((X509_INFO *)sk_pop(a))
718         #define sk_X509_INFO_sort(a) sk_sort(a)
719 #endif /* !DEBUG_SAFESTACK */
720 /* End of perl script block, you may now edit :-) */
721 #endif
722
723 /* The next 2 structures and their 8 routines were sent to me by
724  * Pat Richard <patr@x509.com> and are used to manipulate
725  * Netscapes spki structures - useful if you are writing a CA web page
726  */
727 typedef struct Netscape_spkac_st
728         {
729         X509_PUBKEY *pubkey;
730         ASN1_IA5STRING *challenge;      /* challenge sent in atlas >= PR2 */
731         } NETSCAPE_SPKAC;
732
733 typedef struct Netscape_spki_st
734         {
735         NETSCAPE_SPKAC *spkac;  /* signed public key and challenge */
736         X509_ALGOR *sig_algor;
737         ASN1_BIT_STRING *signature;
738         } NETSCAPE_SPKI;
739
740 /* Netscape certificate sequence structure */
741 typedef struct Netscape_certificate_sequence
742         {
743         ASN1_OBJECT *type;
744         STACK_OF(X509) *certs;
745         } NETSCAPE_CERT_SEQUENCE;
746
747 typedef struct CBCParameter_st
748         {
749         unsigned char iv[8];
750         } CBC_PARAM;
751
752 /* Password based encryption structure */
753
754 typedef struct PBEPARAM_st {
755 ASN1_OCTET_STRING *salt;
756 ASN1_INTEGER *iter;
757 } PBEPARAM;
758
759 /* Password based encryption V2 structures */
760
761 typedef struct PBE2PARAM_st {
762 X509_ALGOR *keyfunc;
763 X509_ALGOR *encryption;
764 } PBE2PARAM;
765
766 typedef struct PBKDF2PARAM_st {
767 ASN1_TYPE *salt;        /* Usually OCTET STRING but could be anything */
768 ASN1_INTEGER *iter;
769 ASN1_INTEGER *keylength;
770 X509_ALGOR *prf;
771 } PBKDF2PARAM;
772
773
774 /* PKCS#8 private key info structure */
775
776 typedef struct pkcs8_priv_key_info_st
777         {
778         int broken;     /* Flag for various broken formats */
779 #define PKCS8_OK                0
780 #define PKCS8_NO_OCTET          1
781 #define PKCS8_EMBEDDED_PARAM    2
782 #define PKCS8_NS_DB             3
783         ASN1_INTEGER *version;
784         X509_ALGOR *pkeyalg;
785         ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */
786         STACK_OF(X509_ATTRIBUTE) *attributes;
787         } PKCS8_PRIV_KEY_INFO;
788
789 #ifdef  __cplusplus
790 }
791 #endif
792
793 #include <openssl/x509_vfy.h>
794 #include <openssl/pkcs7.h>
795
796 #ifdef  __cplusplus
797 extern "C" {
798 #endif
799
800 #ifdef SSLEAY_MACROS
801 #define X509_verify(a,r) ASN1_verify((int (*)())i2d_X509_CINF,a->sig_alg,\
802         a->signature,(char *)a->cert_info,r)
803 #define X509_REQ_verify(a,r) ASN1_verify((int (*)())i2d_X509_REQ_INFO, \
804         a->sig_alg,a->signature,(char *)a->req_info,r)
805 #define X509_CRL_verify(a,r) ASN1_verify((int (*)())i2d_X509_CRL_INFO, \
806         a->sig_alg, a->signature,(char *)a->crl,r)
807
808 #define X509_sign(x,pkey,md) \
809         ASN1_sign((int (*)())i2d_X509_CINF, x->cert_info->signature, \
810                 x->sig_alg, x->signature, (char *)x->cert_info,pkey,md)
811 #define X509_REQ_sign(x,pkey,md) \
812         ASN1_sign((int (*)())i2d_X509_REQ_INFO,x->sig_alg, NULL, \
813                 x->signature, (char *)x->req_info,pkey,md)
814 #define X509_CRL_sign(x,pkey,md) \
815         ASN1_sign((int (*)())i2d_X509_CRL_INFO,x->crl->sig_alg,x->sig_alg, \
816                 x->signature, (char *)x->crl,pkey,md)
817 #define NETSCAPE_SPKI_sign(x,pkey,md) \
818         ASN1_sign((int (*)())i2d_NETSCAPE_SPKAC, x->sig_algor,NULL, \
819                 x->signature, (char *)x->spkac,pkey,md)
820
821 #define X509_dup(x509) (X509 *)ASN1_dup((int (*)())i2d_X509, \
822                 (char *(*)())d2i_X509,(char *)x509)
823 #define X509_ATTRIBUTE_dup(xa) (X509_ATTRIBUTE *)ASN1_dup(\
824                 (int (*)())i2d_X509_ATTRIBUTE, \
825                 (char *(*)())d2i_X509_ATTRIBUTE,(char *)xa)
826 #define X509_EXTENSION_dup(ex) (X509_EXTENSION *)ASN1_dup( \
827                 (int (*)())i2d_X509_EXTENSION, \
828                 (char *(*)())d2i_X509_EXTENSION,(char *)ex)
829 #define d2i_X509_fp(fp,x509) (X509 *)ASN1_d2i_fp((char *(*)())X509_new, \
830                 (char *(*)())d2i_X509, (fp),(unsigned char **)(x509))
831 #define i2d_X509_fp(fp,x509) ASN1_i2d_fp(i2d_X509,fp,(unsigned char *)x509)
832 #define d2i_X509_bio(bp,x509) (X509 *)ASN1_d2i_bio((char *(*)())X509_new, \
833                 (char *(*)())d2i_X509, (bp),(unsigned char **)(x509))
834 #define i2d_X509_bio(bp,x509) ASN1_i2d_bio(i2d_X509,bp,(unsigned char *)x509)
835
836 #define X509_CRL_dup(crl) (X509_CRL *)ASN1_dup((int (*)())i2d_X509_CRL, \
837                 (char *(*)())d2i_X509_CRL,(char *)crl)
838 #define d2i_X509_CRL_fp(fp,crl) (X509_CRL *)ASN1_d2i_fp((char *(*)()) \
839                 X509_CRL_new,(char *(*)())d2i_X509_CRL, (fp),\
840                 (unsigned char **)(crl))
841 #define i2d_X509_CRL_fp(fp,crl) ASN1_i2d_fp(i2d_X509_CRL,fp,\
842                 (unsigned char *)crl)
843 #define d2i_X509_CRL_bio(bp,crl) (X509_CRL *)ASN1_d2i_bio((char *(*)()) \
844                 X509_CRL_new,(char *(*)())d2i_X509_CRL, (bp),\
845                 (unsigned char **)(crl))
846 #define i2d_X509_CRL_bio(bp,crl) ASN1_i2d_bio(i2d_X509_CRL,bp,\
847                 (unsigned char *)crl)
848
849 #define PKCS7_dup(p7) (PKCS7 *)ASN1_dup((int (*)())i2d_PKCS7, \
850                 (char *(*)())d2i_PKCS7,(char *)p7)
851 #define d2i_PKCS7_fp(fp,p7) (PKCS7 *)ASN1_d2i_fp((char *(*)()) \
852                 PKCS7_new,(char *(*)())d2i_PKCS7, (fp),\
853                 (unsigned char **)(p7))
854 #define i2d_PKCS7_fp(fp,p7) ASN1_i2d_fp(i2d_PKCS7,fp,\
855                 (unsigned char *)p7)
856 #define d2i_PKCS7_bio(bp,p7) (PKCS7 *)ASN1_d2i_bio((char *(*)()) \
857                 PKCS7_new,(char *(*)())d2i_PKCS7, (bp),\
858                 (unsigned char **)(p7))
859 #define i2d_PKCS7_bio(bp,p7) ASN1_i2d_bio(i2d_PKCS7,bp,\
860                 (unsigned char *)p7)
861
862 #define X509_REQ_dup(req) (X509_REQ *)ASN1_dup((int (*)())i2d_X509_REQ, \
863                 (char *(*)())d2i_X509_REQ,(char *)req)
864 #define d2i_X509_REQ_fp(fp,req) (X509_REQ *)ASN1_d2i_fp((char *(*)())\
865                 X509_REQ_new, (char *(*)())d2i_X509_REQ, (fp),\
866                 (unsigned char **)(req))
867 #define i2d_X509_REQ_fp(fp,req) ASN1_i2d_fp(i2d_X509_REQ,fp,\
868                 (unsigned char *)req)
869 #define d2i_X509_REQ_bio(bp,req) (X509_REQ *)ASN1_d2i_bio((char *(*)())\
870                 X509_REQ_new, (char *(*)())d2i_X509_REQ, (bp),\
871                 (unsigned char **)(req))
872 #define i2d_X509_REQ_bio(bp,req) ASN1_i2d_bio(i2d_X509_REQ,bp,\
873                 (unsigned char *)req)
874
875 #define RSAPublicKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPublicKey, \
876                 (char *(*)())d2i_RSAPublicKey,(char *)rsa)
877 #define RSAPrivateKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPrivateKey, \
878                 (char *(*)())d2i_RSAPrivateKey,(char *)rsa)
879
880 #define d2i_RSAPrivateKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
881                 RSA_new,(char *(*)())d2i_RSAPrivateKey, (fp), \
882                 (unsigned char **)(rsa))
883 #define i2d_RSAPrivateKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPrivateKey,fp, \
884                 (unsigned char *)rsa)
885 #define d2i_RSAPrivateKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
886                 RSA_new,(char *(*)())d2i_RSAPrivateKey, (bp), \
887                 (unsigned char **)(rsa))
888 #define i2d_RSAPrivateKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPrivateKey,bp, \
889                 (unsigned char *)rsa)
890
891 #define d2i_RSAPublicKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
892                 RSA_new,(char *(*)())d2i_RSAPublicKey, (fp), \
893                 (unsigned char **)(rsa))
894 #define i2d_RSAPublicKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPublicKey,fp, \
895                 (unsigned char *)rsa)
896 #define d2i_RSAPublicKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
897                 RSA_new,(char *(*)())d2i_RSAPublicKey, (bp), \
898                 (unsigned char **)(rsa))
899 #define i2d_RSAPublicKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPublicKey,bp, \
900                 (unsigned char *)rsa)
901
902 #define d2i_DSAPrivateKey_fp(fp,dsa) (DSA *)ASN1_d2i_fp((char *(*)())\
903                 DSA_new,(char *(*)())d2i_DSAPrivateKey, (fp), \
904                 (unsigned char **)(dsa))
905 #define i2d_DSAPrivateKey_fp(fp,dsa) ASN1_i2d_fp(i2d_DSAPrivateKey,fp, \
906                 (unsigned char *)dsa)
907 #define d2i_DSAPrivateKey_bio(bp,dsa) (DSA *)ASN1_d2i_bio((char *(*)())\
908                 DSA_new,(char *(*)())d2i_DSAPrivateKey, (bp), \
909                 (unsigned char **)(dsa))
910 #define i2d_DSAPrivateKey_bio(bp,dsa) ASN1_i2d_bio(i2d_DSAPrivateKey,bp, \
911                 (unsigned char *)dsa)
912
913 #define X509_ALGOR_dup(xn) (X509_ALGOR *)ASN1_dup((int (*)())i2d_X509_ALGOR,\
914                 (char *(*)())d2i_X509_ALGOR,(char *)xn)
915
916 #define X509_NAME_dup(xn) (X509_NAME *)ASN1_dup((int (*)())i2d_X509_NAME, \
917                 (char *(*)())d2i_X509_NAME,(char *)xn)
918 #define X509_NAME_ENTRY_dup(ne) (X509_NAME_ENTRY *)ASN1_dup( \
919                 (int (*)())i2d_X509_NAME_ENTRY, \
920                 (char *(*)())d2i_X509_NAME_ENTRY,\
921                 (char *)ne)
922
923 #define X509_digest(data,type,md,len) \
924         ASN1_digest((int (*)())i2d_X509,type,(char *)data,md,len)
925 #define X509_NAME_digest(data,type,md,len) \
926         ASN1_digest((int (*)())i2d_X509_NAME,type,(char *)data,md,len)
927 #ifndef PKCS7_ISSUER_AND_SERIAL_digest
928 #define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
929         ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
930                 (char *)data,md,len)
931 #endif
932 #endif
933
934 #define X509_EXT_PACK_UNKNOWN   1
935 #define X509_EXT_PACK_STRING    2
936
937 #define         X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
938 /* #define      X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */
939 #define         X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
940 #define         X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
941 #define         X509_extract_key(x)     X509_get_pubkey(x) /*****/
942 #define         X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version)
943 #define         X509_REQ_get_subject_name(x) ((x)->req_info->subject)
944 #define         X509_REQ_extract_key(a) X509_REQ_get_pubkey(a)
945 #define         X509_name_cmp(a,b)      X509_NAME_cmp((a),(b))
946 #define         X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm))
947
948 #define         X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version)
949 #define         X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate)
950 #define         X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate)
951 #define         X509_CRL_get_issuer(x) ((x)->crl->issuer)
952 #define         X509_CRL_get_REVOKED(x) ((x)->crl->revoked)
953
954 /* This one is only used so that a binary form can output, as in
955  * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */
956 #define         X509_get_X509_PUBKEY(x) ((x)->cert_info->key)
957
958
959 const char *X509_verify_cert_error_string(long n);
960
961 #ifndef SSLEAY_MACROS
962 #ifndef NO_EVP
963 int X509_verify(X509 *a, EVP_PKEY *r);
964
965 int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r);
966 int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r);
967 int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r);
968
969 NETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len);
970 char * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x);
971 EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x);
972 int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey);
973
974 int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki);
975
976 int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
977 int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md);
978 int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md);
979 int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md);
980
981 int X509_digest(const X509 *data,const EVP_MD *type,
982                 unsigned char *md, unsigned int *len);
983 int X509_CRL_digest(const X509_CRL *data,const EVP_MD *type,
984                 unsigned char *md, unsigned int *len);
985 int X509_REQ_digest(const X509_REQ *data,const EVP_MD *type,
986                 unsigned char *md, unsigned int *len);
987 int X509_NAME_digest(const X509_NAME *data,const EVP_MD *type,
988                 unsigned char *md, unsigned int *len);
989 #endif
990
991 #ifndef NO_FP_API
992 X509 *d2i_X509_fp(FILE *fp, X509 **x509);
993 int i2d_X509_fp(FILE *fp,X509 *x509);
994 X509_CRL *d2i_X509_CRL_fp(FILE *fp,X509_CRL **crl);
995 int i2d_X509_CRL_fp(FILE *fp,X509_CRL *crl);
996 X509_REQ *d2i_X509_REQ_fp(FILE *fp,X509_REQ **req);
997 int i2d_X509_REQ_fp(FILE *fp,X509_REQ *req);
998 #ifndef NO_RSA
999 RSA *d2i_RSAPrivateKey_fp(FILE *fp,RSA **rsa);
1000 int i2d_RSAPrivateKey_fp(FILE *fp,RSA *rsa);
1001 RSA *d2i_RSAPublicKey_fp(FILE *fp,RSA **rsa);
1002 int i2d_RSAPublicKey_fp(FILE *fp,RSA *rsa);
1003 RSA *d2i_RSA_PUBKEY_fp(FILE *fp,RSA **rsa);
1004 int i2d_RSA_PUBKEY_fp(FILE *fp,RSA *rsa);
1005 #endif
1006 #ifndef NO_DSA
1007 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
1008 int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa);
1009 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
1010 int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa);
1011 #endif
1012 X509_SIG *d2i_PKCS8_fp(FILE *fp,X509_SIG **p8);
1013 int i2d_PKCS8_fp(FILE *fp,X509_SIG *p8);
1014 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
1015                                                 PKCS8_PRIV_KEY_INFO **p8inf);
1016 int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,PKCS8_PRIV_KEY_INFO *p8inf);
1017 int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key);
1018 int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey);
1019 EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
1020 #endif
1021
1022 #ifndef NO_BIO
1023 X509 *d2i_X509_bio(BIO *bp,X509 **x509);
1024 int i2d_X509_bio(BIO *bp,X509 *x509);
1025 X509_CRL *d2i_X509_CRL_bio(BIO *bp,X509_CRL **crl);
1026 int i2d_X509_CRL_bio(BIO *bp,X509_CRL *crl);
1027 X509_REQ *d2i_X509_REQ_bio(BIO *bp,X509_REQ **req);
1028 int i2d_X509_REQ_bio(BIO *bp,X509_REQ *req);
1029 #ifndef NO_RSA
1030 RSA *d2i_RSAPrivateKey_bio(BIO *bp,RSA **rsa);
1031 int i2d_RSAPrivateKey_bio(BIO *bp,RSA *rsa);
1032 RSA *d2i_RSAPublicKey_bio(BIO *bp,RSA **rsa);
1033 int i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa);
1034 RSA *d2i_RSA_PUBKEY_bio(BIO *bp,RSA **rsa);
1035 int i2d_RSA_PUBKEY_bio(BIO *bp,RSA *rsa);
1036 #endif
1037 #ifndef NO_DSA
1038 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
1039 int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
1040 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
1041 int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
1042 #endif
1043 X509_SIG *d2i_PKCS8_bio(BIO *bp,X509_SIG **p8);
1044 int i2d_PKCS8_bio(BIO *bp,X509_SIG *p8);
1045 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
1046                                                 PKCS8_PRIV_KEY_INFO **p8inf);
1047 int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,PKCS8_PRIV_KEY_INFO *p8inf);
1048 int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
1049 int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
1050 EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
1051 #endif
1052
1053 X509 *X509_dup(X509 *x509);
1054 X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa);
1055 X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex);
1056 X509_CRL *X509_CRL_dup(X509_CRL *crl);
1057 X509_REQ *X509_REQ_dup(X509_REQ *req);
1058 X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
1059 X509_NAME *X509_NAME_dup(X509_NAME *xn);
1060 X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);
1061 #ifndef NO_RSA
1062 RSA *RSAPublicKey_dup(RSA *rsa);
1063 RSA *RSAPrivateKey_dup(RSA *rsa);
1064 #endif
1065
1066 #endif /* !SSLEAY_MACROS */
1067
1068 int             X509_cmp_current_time(ASN1_UTCTIME *s);
1069 ASN1_UTCTIME *  X509_gmtime_adj(ASN1_UTCTIME *s, long adj);
1070
1071 const char *    X509_get_default_cert_area(void );
1072 const char *    X509_get_default_cert_dir(void );
1073 const char *    X509_get_default_cert_file(void );
1074 const char *    X509_get_default_cert_dir_env(void );
1075 const char *    X509_get_default_cert_file_env(void );
1076 const char *    X509_get_default_private_dir(void );
1077
1078 X509_REQ *      X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
1079 X509 *          X509_REQ_to_X509(X509_REQ *r, int days,EVP_PKEY *pkey);
1080 void ERR_load_X509_strings(void );
1081
1082 X509_ALGOR *    X509_ALGOR_new(void );
1083 void            X509_ALGOR_free(X509_ALGOR *a);
1084 int             i2d_X509_ALGOR(X509_ALGOR *a,unsigned char **pp);
1085 X509_ALGOR *    d2i_X509_ALGOR(X509_ALGOR **a,unsigned char **pp,
1086                         long length);
1087
1088 X509_VAL *      X509_VAL_new(void );
1089 void            X509_VAL_free(X509_VAL *a);
1090 int             i2d_X509_VAL(X509_VAL *a,unsigned char **pp);
1091 X509_VAL *      d2i_X509_VAL(X509_VAL **a,unsigned char **pp,
1092                         long length);
1093
1094 X509_PUBKEY *   X509_PUBKEY_new(void );
1095 void            X509_PUBKEY_free(X509_PUBKEY *a);
1096 int             i2d_X509_PUBKEY(X509_PUBKEY *a,unsigned char **pp);
1097 X509_PUBKEY *   d2i_X509_PUBKEY(X509_PUBKEY **a,unsigned char **pp,
1098                         long length);
1099 int             X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey);
1100 EVP_PKEY *      X509_PUBKEY_get(X509_PUBKEY *key);
1101 int             X509_get_pubkey_parameters(EVP_PKEY *pkey,
1102                                            STACK_OF(X509) *chain);
1103 int             i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp);
1104 EVP_PKEY *      d2i_PUBKEY(EVP_PKEY **a,unsigned char **pp,
1105                         long length);
1106 #ifndef NO_RSA
1107 int             i2d_RSA_PUBKEY(RSA *a,unsigned char **pp);
1108 RSA *           d2i_RSA_PUBKEY(RSA **a,unsigned char **pp,
1109                         long length);
1110 #endif
1111 #ifndef NO_DSA
1112 int             i2d_DSA_PUBKEY(DSA *a,unsigned char **pp);
1113 DSA *           d2i_DSA_PUBKEY(DSA **a,unsigned char **pp,
1114                         long length);
1115 #endif
1116
1117 X509_SIG *      X509_SIG_new(void );
1118 void            X509_SIG_free(X509_SIG *a);
1119 int             i2d_X509_SIG(X509_SIG *a,unsigned char **pp);
1120 X509_SIG *      d2i_X509_SIG(X509_SIG **a,unsigned char **pp,long length);
1121
1122 X509_REQ_INFO *X509_REQ_INFO_new(void);
1123 void            X509_REQ_INFO_free(X509_REQ_INFO *a);
1124 int             i2d_X509_REQ_INFO(X509_REQ_INFO *a,unsigned char **pp);
1125 X509_REQ_INFO *d2i_X509_REQ_INFO(X509_REQ_INFO **a,unsigned char **pp,
1126                         long length);
1127
1128 X509_REQ *      X509_REQ_new(void);
1129 void            X509_REQ_free(X509_REQ *a);
1130 int             i2d_X509_REQ(X509_REQ *a,unsigned char **pp);
1131 X509_REQ *      d2i_X509_REQ(X509_REQ **a,unsigned char **pp,long length);
1132
1133 X509_ATTRIBUTE *X509_ATTRIBUTE_new(void );
1134 void            X509_ATTRIBUTE_free(X509_ATTRIBUTE *a);
1135 int             i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a,unsigned char **pp);
1136 X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a,unsigned char **pp,
1137                         long length);
1138 X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value);
1139
1140
1141 X509_EXTENSION *X509_EXTENSION_new(void );
1142 void            X509_EXTENSION_free(X509_EXTENSION *a);
1143 int             i2d_X509_EXTENSION(X509_EXTENSION *a,unsigned char **pp);
1144 X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **a,unsigned char **pp,
1145                         long length);
1146
1147 X509_NAME_ENTRY *X509_NAME_ENTRY_new(void);
1148 void            X509_NAME_ENTRY_free(X509_NAME_ENTRY *a);
1149 int             i2d_X509_NAME_ENTRY(X509_NAME_ENTRY *a,unsigned char **pp);
1150 X509_NAME_ENTRY *d2i_X509_NAME_ENTRY(X509_NAME_ENTRY **a,unsigned char **pp,
1151                         long length);
1152
1153 X509_NAME *     X509_NAME_new(void);
1154 void            X509_NAME_free(X509_NAME *a);
1155 int             i2d_X509_NAME(X509_NAME *a,unsigned char **pp);
1156 X509_NAME *     d2i_X509_NAME(X509_NAME **a,unsigned char **pp,long length);
1157 int             X509_NAME_set(X509_NAME **xn, X509_NAME *name);
1158
1159
1160 X509_CINF *     X509_CINF_new(void);
1161 void            X509_CINF_free(X509_CINF *a);
1162 int             i2d_X509_CINF(X509_CINF *a,unsigned char **pp);
1163 X509_CINF *     d2i_X509_CINF(X509_CINF **a,unsigned char **pp,long length);
1164
1165 X509 *          X509_new(void);
1166 void            X509_free(X509 *a);
1167 int             i2d_X509(X509 *a,unsigned char **pp);
1168 X509 *          d2i_X509(X509 **a,unsigned char **pp,long length);
1169 int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
1170              CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
1171 int X509_set_ex_data(X509 *r, int idx, void *arg);
1172 void *X509_get_ex_data(X509 *r, int idx);
1173 int             i2d_X509_AUX(X509 *a,unsigned char **pp);
1174 X509 *          d2i_X509_AUX(X509 **a,unsigned char **pp,long length);
1175
1176 X509_CERT_AUX * X509_CERT_AUX_new(void);
1177 void            X509_CERT_AUX_free(X509_CERT_AUX *a);
1178 int             i2d_X509_CERT_AUX(X509_CERT_AUX *a,unsigned char **pp);
1179 X509_CERT_AUX * d2i_X509_CERT_AUX(X509_CERT_AUX **a,unsigned char **pp,
1180                                                                 long length);
1181 int X509_alias_set1(X509 *x, unsigned char *name, int len);
1182 unsigned char * X509_alias_get0(X509 *x, int *len);
1183 int (*X509_TRUST_set_default(int (*trust)(int , X509 *, int)))(int, X509 *, int);
1184 int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj);
1185 int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj);
1186 void X509_trust_clear(X509 *x);
1187 void X509_reject_clear(X509 *x);
1188
1189 X509_REVOKED *  X509_REVOKED_new(void);
1190 void            X509_REVOKED_free(X509_REVOKED *a);
1191 int             i2d_X509_REVOKED(X509_REVOKED *a,unsigned char **pp);
1192 X509_REVOKED *  d2i_X509_REVOKED(X509_REVOKED **a,unsigned char **pp,long length);
1193
1194 X509_CRL_INFO *X509_CRL_INFO_new(void);
1195 void            X509_CRL_INFO_free(X509_CRL_INFO *a);
1196 int             i2d_X509_CRL_INFO(X509_CRL_INFO *a,unsigned char **pp);
1197 X509_CRL_INFO *d2i_X509_CRL_INFO(X509_CRL_INFO **a,unsigned char **pp,
1198                         long length);
1199
1200 X509_CRL *      X509_CRL_new(void);
1201 void            X509_CRL_free(X509_CRL *a);
1202 int             i2d_X509_CRL(X509_CRL *a,unsigned char **pp);
1203 X509_CRL *      d2i_X509_CRL(X509_CRL **a,unsigned char **pp,long length);
1204
1205 X509_PKEY *     X509_PKEY_new(void );
1206 void            X509_PKEY_free(X509_PKEY *a);
1207 int             i2d_X509_PKEY(X509_PKEY *a,unsigned char **pp);
1208 X509_PKEY *     d2i_X509_PKEY(X509_PKEY **a,unsigned char **pp,long length);
1209
1210 NETSCAPE_SPKI * NETSCAPE_SPKI_new(void );
1211 void            NETSCAPE_SPKI_free(NETSCAPE_SPKI *a);
1212 int             i2d_NETSCAPE_SPKI(NETSCAPE_SPKI *a,unsigned char **pp);
1213 NETSCAPE_SPKI * d2i_NETSCAPE_SPKI(NETSCAPE_SPKI **a,unsigned char **pp,
1214                         long length);
1215
1216 NETSCAPE_SPKAC *NETSCAPE_SPKAC_new(void );
1217 void            NETSCAPE_SPKAC_free(NETSCAPE_SPKAC *a);
1218 int             i2d_NETSCAPE_SPKAC(NETSCAPE_SPKAC *a,unsigned char **pp);
1219 NETSCAPE_SPKAC *d2i_NETSCAPE_SPKAC(NETSCAPE_SPKAC **a,unsigned char **pp,
1220                 long length);
1221
1222
1223 int i2d_NETSCAPE_CERT_SEQUENCE(NETSCAPE_CERT_SEQUENCE *a, unsigned char **pp);
1224 NETSCAPE_CERT_SEQUENCE *NETSCAPE_CERT_SEQUENCE_new(void);
1225 NETSCAPE_CERT_SEQUENCE *d2i_NETSCAPE_CERT_SEQUENCE(NETSCAPE_CERT_SEQUENCE **a, unsigned char **pp, long length);
1226 void NETSCAPE_CERT_SEQUENCE_free(NETSCAPE_CERT_SEQUENCE *a);
1227
1228 #ifndef NO_EVP
1229 X509_INFO *     X509_INFO_new(void);
1230 void            X509_INFO_free(X509_INFO *a);
1231 char *          X509_NAME_oneline(X509_NAME *a,char *buf,int size);
1232
1233 int ASN1_verify(int (*i2d)(), X509_ALGOR *algor1,
1234         ASN1_BIT_STRING *signature,char *data,EVP_PKEY *pkey);
1235
1236 int ASN1_digest(int (*i2d)(),const EVP_MD *type,char *data,
1237         unsigned char *md,unsigned int *len);
1238
1239 int ASN1_sign(int (*i2d)(), X509_ALGOR *algor1, X509_ALGOR *algor2,
1240         ASN1_BIT_STRING *signature,
1241         char *data,EVP_PKEY *pkey, const EVP_MD *type);
1242 #endif
1243
1244 int             X509_set_version(X509 *x,long version);
1245 int             X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial);
1246 ASN1_INTEGER *  X509_get_serialNumber(X509 *x);
1247 int             X509_set_issuer_name(X509 *x, X509_NAME *name);
1248 X509_NAME *     X509_get_issuer_name(X509 *a);
1249 int             X509_set_subject_name(X509 *x, X509_NAME *name);
1250 X509_NAME *     X509_get_subject_name(X509 *a);
1251 int             X509_set_notBefore(X509 *x, ASN1_UTCTIME *tm);
1252 int             X509_set_notAfter(X509 *x, ASN1_UTCTIME *tm);
1253 int             X509_set_pubkey(X509 *x, EVP_PKEY *pkey);
1254 EVP_PKEY *      X509_get_pubkey(X509 *x);
1255 int             X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */);
1256
1257 int             X509_REQ_set_version(X509_REQ *x,long version);
1258 int             X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name);
1259 int             X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey);
1260 EVP_PKEY *      X509_REQ_get_pubkey(X509_REQ *req);
1261 int             X509_REQ_extension_nid(int nid);
1262 int *           X509_REQ_get_extension_nids(void);
1263 void            X509_REQ_set_extension_nids(int *nids);
1264 STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
1265 int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts,
1266                                 int nid);
1267 int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts);
1268 int X509_REQ_get_attr_count(const X509_REQ *req);
1269 int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid,
1270                           int lastpos);
1271 int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj,
1272                           int lastpos);
1273 X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
1274 X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
1275 int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr);
1276 int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
1277                         ASN1_OBJECT *obj, int type,
1278                         unsigned char *bytes, int len);
1279 int X509_REQ_add1_attr_by_NID(X509_REQ *req,
1280                         int nid, int type,
1281                         unsigned char *bytes, int len);
1282 int X509_REQ_add1_attr_by_txt(X509_REQ *req,
1283                         char *attrname, int type,
1284                         unsigned char *bytes, int len);
1285
1286 int             X509_check_private_key(X509 *x509,EVP_PKEY *pkey);
1287
1288 int             X509_issuer_and_serial_cmp(const X509 *a, const X509 *b);
1289 unsigned long   X509_issuer_and_serial_hash(X509 *a);
1290
1291 int             X509_issuer_name_cmp(const X509 *a, const X509 *b);
1292 unsigned long   X509_issuer_name_hash(X509 *a);
1293
1294 int             X509_subject_name_cmp(const X509 *a, const X509 *b);
1295 unsigned long   X509_subject_name_hash(X509 *x);
1296
1297 int             X509_cmp(const X509 *a, const X509 *b);
1298 int             X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b);
1299 unsigned long   X509_NAME_hash(X509_NAME *x);
1300
1301 int             X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b);
1302 #ifndef NO_FP_API
1303 int             X509_print_fp(FILE *bp,X509 *x);
1304 int             X509_CRL_print_fp(FILE *bp,X509_CRL *x);
1305 int             X509_REQ_print_fp(FILE *bp,X509_REQ *req);
1306 #endif
1307
1308 #ifndef NO_BIO
1309 int             X509_NAME_print(BIO *bp, X509_NAME *name, int obase);
1310 int             X509_print(BIO *bp,X509 *x);
1311 int             X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent);
1312 int             X509_CRL_print(BIO *bp,X509_CRL *x);
1313 int             X509_REQ_print(BIO *bp,X509_REQ *req);
1314 #endif
1315
1316 int             X509_NAME_entry_count(X509_NAME *name);
1317 int             X509_NAME_get_text_by_NID(X509_NAME *name, int nid,
1318                         char *buf,int len);
1319 int             X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj,
1320                         char *buf,int len);
1321
1322 /* NOTE: you should be passsing -1, not 0 as lastpos.  The functions that use
1323  * lastpos, search after that position on. */
1324 int             X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos);
1325 int             X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj,
1326                         int lastpos);
1327 X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc);
1328 X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc);
1329 int             X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne,
1330                         int loc, int set);
1331 int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
1332                         unsigned char *bytes, int len, int loc, int set);
1333 int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
1334                         unsigned char *bytes, int len, int loc, int set);
1335 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
1336                 char *field, int type, unsigned char *bytes, int len);
1337 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
1338                         int type,unsigned char *bytes, int len);
1339 int X509_NAME_add_entry_by_txt(X509_NAME *name, char *field, int type,
1340                         unsigned char *bytes, int len, int loc, int set);
1341 X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
1342                         ASN1_OBJECT *obj, int type,unsigned char *bytes,
1343                         int len);
1344 int             X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne,
1345                         ASN1_OBJECT *obj);
1346 int             X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
1347                         unsigned char *bytes, int len);
1348 ASN1_OBJECT *   X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne);
1349 ASN1_STRING *   X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne);
1350
1351 int             X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
1352 int             X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
1353                                       int nid, int lastpos);
1354 int             X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
1355                                       ASN1_OBJECT *obj,int lastpos);
1356 int             X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
1357                                            int crit, int lastpos);
1358 X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc);
1359 X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc);
1360 STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
1361                                          X509_EXTENSION *ex, int loc);
1362
1363 int             X509_get_ext_count(X509 *x);
1364 int             X509_get_ext_by_NID(X509 *x, int nid, int lastpos);
1365 int             X509_get_ext_by_OBJ(X509 *x,ASN1_OBJECT *obj,int lastpos);
1366 int             X509_get_ext_by_critical(X509 *x, int crit, int lastpos);
1367 X509_EXTENSION *X509_get_ext(X509 *x, int loc);
1368 X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
1369 int             X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
1370 void    *       X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx);
1371
1372 int             X509_CRL_get_ext_count(X509_CRL *x);
1373 int             X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos);
1374 int             X509_CRL_get_ext_by_OBJ(X509_CRL *x,ASN1_OBJECT *obj,int lastpos);
1375 int             X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos);
1376 X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc);
1377 X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
1378 int             X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc);
1379 void    *       X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx);
1380
1381 int             X509_REVOKED_get_ext_count(X509_REVOKED *x);
1382 int             X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos);
1383 int             X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x,ASN1_OBJECT *obj,int lastpos);
1384 int             X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos);
1385 X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc);
1386 X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc);
1387 int             X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc);
1388 void    *       X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx);
1389
1390 X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex,
1391                         int nid, int crit, ASN1_OCTET_STRING *data);
1392 X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
1393                         ASN1_OBJECT *obj,int crit,ASN1_OCTET_STRING *data);
1394 int             X509_EXTENSION_set_object(X509_EXTENSION *ex,ASN1_OBJECT *obj);
1395 int             X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
1396 int             X509_EXTENSION_set_data(X509_EXTENSION *ex,
1397                         ASN1_OCTET_STRING *data);
1398 ASN1_OBJECT *   X509_EXTENSION_get_object(X509_EXTENSION *ex);
1399 ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
1400 int             X509_EXTENSION_get_critical(X509_EXTENSION *ex);
1401
1402 int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
1403 int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
1404                           int lastpos);
1405 int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
1406                           int lastpos);
1407 X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc);
1408 X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc);
1409 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
1410                                          X509_ATTRIBUTE *attr);
1411 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
1412                         ASN1_OBJECT *obj, int type,
1413                         unsigned char *bytes, int len);
1414 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x,
1415                         int nid, int type,
1416                         unsigned char *bytes, int len);
1417 STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x,
1418                         char *attrname, int type,
1419                         unsigned char *bytes, int len);
1420 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
1421              int atrtype, void *data, int len);
1422 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
1423              ASN1_OBJECT *obj, int atrtype, void *data, int len);
1424 X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
1425                 char *atrname, int type, unsigned char *bytes, int len);
1426 int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, ASN1_OBJECT *obj);
1427 int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, void *data, int len);
1428 void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
1429                                         int atrtype, void *data);
1430 int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr);
1431 ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
1432 ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx);
1433
1434 int             X509_verify_cert(X509_STORE_CTX *ctx);
1435
1436 /* lookup a cert from a X509 STACK */
1437 X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name,
1438                                      ASN1_INTEGER *serial);
1439 X509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name);
1440
1441 int i2d_PBEPARAM(PBEPARAM *a, unsigned char **pp);
1442 PBEPARAM *PBEPARAM_new(void);
1443 PBEPARAM *d2i_PBEPARAM(PBEPARAM **a, unsigned char **pp, long length);
1444 void PBEPARAM_free(PBEPARAM *a);
1445 X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt, int saltlen);
1446 X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
1447                                          unsigned char *salt, int saltlen);
1448
1449 int i2d_PBKDF2PARAM(PBKDF2PARAM *a, unsigned char **pp);
1450 PBKDF2PARAM *PBKDF2PARAM_new(void);
1451 PBKDF2PARAM *d2i_PBKDF2PARAM(PBKDF2PARAM **a, unsigned char **pp, long length);
1452 void PBKDF2PARAM_free(PBKDF2PARAM *a);
1453
1454 int i2d_PBE2PARAM(PBE2PARAM *a, unsigned char **pp);
1455 PBE2PARAM *PBE2PARAM_new(void);
1456 PBE2PARAM *d2i_PBE2PARAM(PBE2PARAM **a, unsigned char **pp, long length);
1457 void PBE2PARAM_free(PBE2PARAM *a);
1458
1459 /* PKCS#8 utilities */
1460
1461 int i2d_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO *a, unsigned char **pp);
1462 PKCS8_PRIV_KEY_INFO *PKCS8_PRIV_KEY_INFO_new(void);
1463 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO **a,
1464                                          unsigned char **pp, long length);
1465 void PKCS8_PRIV_KEY_INFO_free(PKCS8_PRIV_KEY_INFO *a);
1466
1467 EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8);
1468 PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
1469 PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken);
1470 PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken);
1471
1472 int X509_check_trust(X509 *x, int id, int flags);
1473 int X509_TRUST_get_count(void);
1474 X509_TRUST * X509_TRUST_get0(int idx);
1475 int X509_TRUST_get_by_id(int id);
1476 int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
1477                                         char *name, int arg1, void *arg2);
1478 void X509_TRUST_cleanup(void);
1479 int X509_TRUST_get_flags(X509_TRUST *xp);
1480 char *X509_TRUST_get0_name(X509_TRUST *xp);
1481 int X509_TRUST_get_trust(X509_TRUST *xp);
1482
1483 /* BEGIN ERROR CODES */
1484 /* The following lines are auto generated by the script mkerr.pl. Any changes
1485  * made after this point may be overwritten when the script is next run.
1486  */
1487
1488 /* Error codes for the X509 functions. */
1489
1490 /* Function codes. */
1491 #define X509_F_ADD_CERT_DIR                              100
1492 #define X509_F_BY_FILE_CTRL                              101
1493 #define X509_F_DIR_CTRL                                  102
1494 #define X509_F_GET_CERT_BY_SUBJECT                       103
1495 #define X509_F_NETSCAPE_SPKI_B64_DECODE                  129
1496 #define X509_F_NETSCAPE_SPKI_B64_ENCODE                  130
1497 #define X509_F_X509V3_ADD_EXT                            104
1498 #define X509_F_X509_ADD_ATTR                             135
1499 #define X509_F_X509_ATTRIBUTE_CREATE_BY_NID              136
1500 #define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ              137
1501 #define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT              140
1502 #define X509_F_X509_ATTRIBUTE_GET0_DATA                  139
1503 #define X509_F_X509_ATTRIBUTE_SET1_DATA                  138
1504 #define X509_F_X509_CHECK_PRIVATE_KEY                    128
1505 #define X509_F_X509_EXTENSION_CREATE_BY_NID              108
1506 #define X509_F_X509_EXTENSION_CREATE_BY_OBJ              109
1507 #define X509_F_X509_GET_PUBKEY_PARAMETERS                110
1508 #define X509_F_X509_LOAD_CERT_CRL_FILE                   132
1509 #define X509_F_X509_LOAD_CERT_FILE                       111
1510 #define X509_F_X509_LOAD_CRL_FILE                        112
1511 #define X509_F_X509_NAME_ADD_ENTRY                       113
1512 #define X509_F_X509_NAME_ENTRY_CREATE_BY_NID             114
1513 #define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT             131
1514 #define X509_F_X509_NAME_ENTRY_SET_OBJECT                115
1515 #define X509_F_X509_NAME_ONELINE                         116
1516 #define X509_F_X509_NAME_PRINT                           117
1517 #define X509_F_X509_PRINT_FP                             118
1518 #define X509_F_X509_PUBKEY_GET                           119
1519 #define X509_F_X509_PUBKEY_SET                           120
1520 #define X509_F_X509_REQ_PRINT                            121
1521 #define X509_F_X509_REQ_PRINT_FP                         122
1522 #define X509_F_X509_REQ_TO_X509                          123
1523 #define X509_F_X509_STORE_ADD_CERT                       124
1524 #define X509_F_X509_STORE_ADD_CRL                        125
1525 #define X509_F_X509_STORE_CTX_PURPOSE_INHERIT            134
1526 #define X509_F_X509_TO_X509_REQ                          126
1527 #define X509_F_X509_TRUST_ADD                            133
1528 #define X509_F_X509_VERIFY_CERT                          127
1529
1530 /* Reason codes. */
1531 #define X509_R_BAD_X509_FILETYPE                         100
1532 #define X509_R_BASE64_DECODE_ERROR                       118
1533 #define X509_R_CANT_CHECK_DH_KEY                         114
1534 #define X509_R_CERT_ALREADY_IN_HASH_TABLE                101
1535 #define X509_R_ERR_ASN1_LIB                              102
1536 #define X509_R_INVALID_DIRECTORY                         113
1537 #define X509_R_INVALID_FIELD_NAME                        119
1538 #define X509_R_KEY_TYPE_MISMATCH                         115
1539 #define X509_R_KEY_VALUES_MISMATCH                       116
1540 #define X509_R_LOADING_CERT_DIR                          103
1541 #define X509_R_LOADING_DEFAULTS                          104
1542 #define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY              105
1543 #define X509_R_SHOULD_RETRY                              106
1544 #define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN        107
1545 #define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY            108
1546 #define X509_R_UNKNOWN_KEY_TYPE                          117
1547 #define X509_R_UNKNOWN_NID                               109
1548 #define X509_R_UNKNOWN_PURPOSE_ID                        121
1549 #define X509_R_UNKNOWN_TRUST_ID                          120
1550 #define X509_R_UNSUPPORTED_ALGORITHM                     111
1551 #define X509_R_WRONG_LOOKUP_TYPE                         112
1552 #define X509_R_WRONG_TYPE                                122
1553
1554 #ifdef  __cplusplus
1555 }
1556 #endif
1557 #endif
1558