x509.h revision 277195
155714Skris/* crypto/x509/x509.h */
255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
355714Skris * All rights reserved.
455714Skris *
555714Skris * This package is an SSL implementation written
655714Skris * by Eric Young (eay@cryptsoft.com).
755714Skris * The implementation was written so as to conform with Netscapes SSL.
855714Skris *
955714Skris * This library is free for commercial and non-commercial use as long as
1055714Skris * the following conditions are aheared to.  The following conditions
1155714Skris * apply to all code found in this distribution, be it the RC4, RSA,
1255714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1355714Skris * included with this distribution is covered by the same copyright terms
1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1555714Skris *
1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
1755714Skris * the code are not to be removed.
1855714Skris * If this package is used in a product, Eric Young should be given attribution
1955714Skris * as the author of the parts of the library used.
2055714Skris * This can be in the form of a textual message at program startup or
2155714Skris * in documentation (online or textual) provided with the package.
2255714Skris *
2355714Skris * Redistribution and use in source and binary forms, with or without
2455714Skris * modification, are permitted provided that the following conditions
2555714Skris * are met:
2655714Skris * 1. Redistributions of source code must retain the copyright
2755714Skris *    notice, this list of conditions and the following disclaimer.
2855714Skris * 2. Redistributions in binary form must reproduce the above copyright
2955714Skris *    notice, this list of conditions and the following disclaimer in the
3055714Skris *    documentation and/or other materials provided with the distribution.
3155714Skris * 3. All advertising materials mentioning features or use of this software
3255714Skris *    must display the following acknowledgement:
3355714Skris *    "This product includes cryptographic software written by
3455714Skris *     Eric Young (eay@cryptsoft.com)"
3555714Skris *    The word 'cryptographic' can be left out if the rouines from the library
3655714Skris *    being used are not cryptographic related :-).
3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from
3855714Skris *    the apps directory (application code) you must include an acknowledgement:
3955714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4055714Skris *
4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5155714Skris * SUCH DAMAGE.
5255714Skris *
5355714Skris * The licence and distribution terms for any publically available version or
5455714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
5555714Skris * copied and put under another distribution licence
5655714Skris * [including the GNU Public Licence.]
5755714Skris */
58160814Ssimon/* ====================================================================
59160814Ssimon * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60160814Ssimon * ECDH support in OpenSSL originally developed by
61160814Ssimon * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
62160814Ssimon */
6355714Skris
6455714Skris#ifndef HEADER_X509_H
6555714Skris#define HEADER_X509_H
6655714Skris
67160814Ssimon#include <openssl/e_os2.h>
6868651Skris#include <openssl/symhacks.h>
69109998Smarkm#ifndef OPENSSL_NO_BUFFER
7068651Skris#include <openssl/buffer.h>
7155714Skris#endif
72109998Smarkm#ifndef OPENSSL_NO_EVP
7368651Skris#include <openssl/evp.h>
7455714Skris#endif
75109998Smarkm#ifndef OPENSSL_NO_BIO
7668651Skris#include <openssl/bio.h>
7768651Skris#endif
7855714Skris#include <openssl/stack.h>
7955714Skris#include <openssl/asn1.h>
8055714Skris#include <openssl/safestack.h>
8155714Skris
82160814Ssimon#ifndef OPENSSL_NO_EC
83160814Ssimon#include <openssl/ec.h>
84160814Ssimon#endif
85160814Ssimon
86160814Ssimon#ifndef OPENSSL_NO_ECDSA
87160814Ssimon#include <openssl/ecdsa.h>
88160814Ssimon#endif
89160814Ssimon
90160814Ssimon#ifndef OPENSSL_NO_ECDH
91160814Ssimon#include <openssl/ecdh.h>
92160814Ssimon#endif
93160814Ssimon
94160814Ssimon#ifndef OPENSSL_NO_DEPRECATED
95109998Smarkm#ifndef OPENSSL_NO_RSA
9655714Skris#include <openssl/rsa.h>
9755714Skris#endif
98109998Smarkm#ifndef OPENSSL_NO_DSA
9955714Skris#include <openssl/dsa.h>
10055714Skris#endif
101109998Smarkm#ifndef OPENSSL_NO_DH
10255714Skris#include <openssl/dh.h>
10355714Skris#endif
104160814Ssimon#endif
105160814Ssimon
106109998Smarkm#ifndef OPENSSL_NO_SHA
107109998Smarkm#include <openssl/sha.h>
108109998Smarkm#endif
109109998Smarkm#include <openssl/ossl_typ.h>
11055714Skris
11168651Skris#ifdef  __cplusplus
11268651Skrisextern "C" {
11368651Skris#endif
11468651Skris
115109998Smarkm#ifdef OPENSSL_SYS_WIN32
116160814Ssimon/* Under Win32 these are defined in wincrypt.h */
11755714Skris#undef X509_NAME
118160814Ssimon#undef X509_CERT_PAIR
119205128Ssimon#undef X509_EXTENSIONS
12055714Skris#endif
12155714Skris
12255714Skris#define X509_FILETYPE_PEM	1
12355714Skris#define X509_FILETYPE_ASN1	2
12455714Skris#define X509_FILETYPE_DEFAULT	3
12555714Skris
12655714Skris#define X509v3_KU_DIGITAL_SIGNATURE	0x0080
12755714Skris#define X509v3_KU_NON_REPUDIATION	0x0040
12855714Skris#define X509v3_KU_KEY_ENCIPHERMENT	0x0020
12955714Skris#define X509v3_KU_DATA_ENCIPHERMENT	0x0010
13055714Skris#define X509v3_KU_KEY_AGREEMENT		0x0008
13155714Skris#define X509v3_KU_KEY_CERT_SIGN		0x0004
13255714Skris#define X509v3_KU_CRL_SIGN		0x0002
13355714Skris#define X509v3_KU_ENCIPHER_ONLY		0x0001
13455714Skris#define X509v3_KU_DECIPHER_ONLY		0x8000
13555714Skris#define X509v3_KU_UNDEF			0xffff
13655714Skris
13755714Skristypedef struct X509_objects_st
13855714Skris	{
13955714Skris	int nid;
140160814Ssimon	int (*a2i)(void);
141160814Ssimon	int (*i2a)(void);
14255714Skris	} X509_OBJECTS;
14355714Skris
144109998Smarkmstruct X509_algor_st
14555714Skris	{
14655714Skris	ASN1_OBJECT *algorithm;
14755714Skris	ASN1_TYPE *parameter;
148109998Smarkm	} /* X509_ALGOR */;
14955714Skris
15055714SkrisDECLARE_ASN1_SET_OF(X509_ALGOR)
15155714Skris
152194206Ssimontypedef STACK_OF(X509_ALGOR) X509_ALGORS;
153194206Ssimon
15455714Skristypedef struct X509_val_st
15555714Skris	{
15668651Skris	ASN1_TIME *notBefore;
15768651Skris	ASN1_TIME *notAfter;
15855714Skris	} X509_VAL;
15955714Skris
16055714Skristypedef struct X509_pubkey_st
16155714Skris	{
16255714Skris	X509_ALGOR *algor;
16355714Skris	ASN1_BIT_STRING *public_key;
16455714Skris	EVP_PKEY *pkey;
16555714Skris	} X509_PUBKEY;
16655714Skris
16755714Skristypedef struct X509_sig_st
16855714Skris	{
16955714Skris	X509_ALGOR *algor;
17055714Skris	ASN1_OCTET_STRING *digest;
17155714Skris	} X509_SIG;
17255714Skris
17355714Skristypedef struct X509_name_entry_st
17455714Skris	{
17555714Skris	ASN1_OBJECT *object;
17655714Skris	ASN1_STRING *value;
17755714Skris	int set;
17855714Skris	int size; 	/* temp variable */
17955714Skris	} X509_NAME_ENTRY;
18055714Skris
18155714SkrisDECLARE_STACK_OF(X509_NAME_ENTRY)
18255714SkrisDECLARE_ASN1_SET_OF(X509_NAME_ENTRY)
18355714Skris
18455714Skris/* we always keep X509_NAMEs in 2 forms. */
185109998Smarkmstruct X509_name_st
18655714Skris	{
18755714Skris	STACK_OF(X509_NAME_ENTRY) *entries;
18855714Skris	int modified;	/* true if 'bytes' needs to be built */
189109998Smarkm#ifndef OPENSSL_NO_BUFFER
19055714Skris	BUF_MEM *bytes;
19155714Skris#else
19255714Skris	char *bytes;
19355714Skris#endif
19455714Skris	unsigned long hash; /* Keep the hash around for lookups */
195109998Smarkm	} /* X509_NAME */;
19655714Skris
19755714SkrisDECLARE_STACK_OF(X509_NAME)
19855714Skris
19955714Skris#define X509_EX_V_NETSCAPE_HACK		0x8000
20055714Skris#define X509_EX_V_INIT			0x0001
20155714Skristypedef struct X509_extension_st
20255714Skris	{
20355714Skris	ASN1_OBJECT *object;
204109998Smarkm	ASN1_BOOLEAN critical;
20555714Skris	ASN1_OCTET_STRING *value;
20655714Skris	} X509_EXTENSION;
20755714Skris
208194206Ssimontypedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;
209194206Ssimon
21055714SkrisDECLARE_STACK_OF(X509_EXTENSION)
21155714SkrisDECLARE_ASN1_SET_OF(X509_EXTENSION)
21255714Skris
21355714Skris/* a sequence of these are used */
21455714Skristypedef struct x509_attributes_st
21555714Skris	{
21655714Skris	ASN1_OBJECT *object;
217109998Smarkm	int single; /* 0 for a set, 1 for a single item (which is wrong) */
21855714Skris	union	{
21955714Skris		char		*ptr;
220109998Smarkm/* 0 */		STACK_OF(ASN1_TYPE) *set;
221109998Smarkm/* 1 */		ASN1_TYPE	*single;
22255714Skris		} value;
22355714Skris	} X509_ATTRIBUTE;
22455714Skris
22555714SkrisDECLARE_STACK_OF(X509_ATTRIBUTE)
22655714SkrisDECLARE_ASN1_SET_OF(X509_ATTRIBUTE)
22755714Skris
228109998Smarkm
22955714Skristypedef struct X509_req_info_st
23055714Skris	{
231109998Smarkm	ASN1_ENCODING enc;
23255714Skris	ASN1_INTEGER *version;
23355714Skris	X509_NAME *subject;
23455714Skris	X509_PUBKEY *pubkey;
23555714Skris	/*  d=2 hl=2 l=  0 cons: cont: 00 */
23655714Skris	STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
23755714Skris	} X509_REQ_INFO;
23855714Skris
23955714Skristypedef struct X509_req_st
24055714Skris	{
24155714Skris	X509_REQ_INFO *req_info;
24255714Skris	X509_ALGOR *sig_alg;
24355714Skris	ASN1_BIT_STRING *signature;
24455714Skris	int references;
24555714Skris	} X509_REQ;
24655714Skris
24755714Skristypedef struct x509_cinf_st
24855714Skris	{
24955714Skris	ASN1_INTEGER *version;		/* [ 0 ] default of v1 */
25055714Skris	ASN1_INTEGER *serialNumber;
25155714Skris	X509_ALGOR *signature;
25255714Skris	X509_NAME *issuer;
25355714Skris	X509_VAL *validity;
25455714Skris	X509_NAME *subject;
25555714Skris	X509_PUBKEY *key;
25655714Skris	ASN1_BIT_STRING *issuerUID;		/* [ 1 ] optional in v2 */
25755714Skris	ASN1_BIT_STRING *subjectUID;		/* [ 2 ] optional in v2 */
25855714Skris	STACK_OF(X509_EXTENSION) *extensions;	/* [ 3 ] optional in v3 */
259215697Ssimon	ASN1_ENCODING enc;
26055714Skris	} X509_CINF;
26155714Skris
26259191Skris/* This stuff is certificate "auxiliary info"
26359191Skris * it contains details which are useful in certificate
26459191Skris * stores and databases. When used this is tagged onto
26559191Skris * the end of the certificate itself
26659191Skris */
26759191Skris
26859191Skristypedef struct x509_cert_aux_st
26959191Skris	{
27059191Skris	STACK_OF(ASN1_OBJECT) *trust;		/* trusted uses */
27159191Skris	STACK_OF(ASN1_OBJECT) *reject;		/* rejected uses */
27259191Skris	ASN1_UTF8STRING *alias;			/* "friendly name" */
27359191Skris	ASN1_OCTET_STRING *keyid;		/* key id of private key */
27459191Skris	STACK_OF(X509_ALGOR) *other;		/* other unspecified info */
27559191Skris	} X509_CERT_AUX;
27659191Skris
277109998Smarkmstruct x509_st
27855714Skris	{
27955714Skris	X509_CINF *cert_info;
28055714Skris	X509_ALGOR *sig_alg;
28155714Skris	ASN1_BIT_STRING *signature;
28255714Skris	int valid;
28355714Skris	int references;
28455714Skris	char *name;
28559191Skris	CRYPTO_EX_DATA ex_data;
28659191Skris	/* These contain copies of various extension values */
28759191Skris	long ex_pathlen;
288160814Ssimon	long ex_pcpathlen;
28959191Skris	unsigned long ex_flags;
29059191Skris	unsigned long ex_kusage;
29159191Skris	unsigned long ex_xkusage;
29259191Skris	unsigned long ex_nscert;
29368651Skris	ASN1_OCTET_STRING *skid;
29468651Skris	struct AUTHORITY_KEYID_st *akid;
295160814Ssimon	X509_POLICY_CACHE *policy_cache;
296167612Ssimon#ifndef OPENSSL_NO_RFC3779
297167612Ssimon	STACK_OF(IPAddressFamily) *rfc3779_addr;
298167612Ssimon	struct ASIdentifiers_st *rfc3779_asid;
299167612Ssimon#endif
300109998Smarkm#ifndef OPENSSL_NO_SHA
30159191Skris	unsigned char sha1_hash[SHA_DIGEST_LENGTH];
30259191Skris#endif
30359191Skris	X509_CERT_AUX *aux;
304109998Smarkm	} /* X509 */;
30555714Skris
30655714SkrisDECLARE_STACK_OF(X509)
30755714SkrisDECLARE_ASN1_SET_OF(X509)
30855714Skris
30959191Skris/* This is used for a table of trust checking functions */
31059191Skris
31159191Skristypedef struct x509_trust_st {
31259191Skris	int trust;
31359191Skris	int flags;
31459191Skris	int (*check_trust)(struct x509_trust_st *, X509 *, int);
31559191Skris	char *name;
31659191Skris	int arg1;
31759191Skris	void *arg2;
31859191Skris} X509_TRUST;
31959191Skris
32059191SkrisDECLARE_STACK_OF(X509_TRUST)
32159191Skris
322160814Ssimontypedef struct x509_cert_pair_st {
323160814Ssimon	X509 *forward;
324160814Ssimon	X509 *reverse;
325160814Ssimon} X509_CERT_PAIR;
326160814Ssimon
32759191Skris/* standard trust ids */
32859191Skris
32959191Skris#define X509_TRUST_DEFAULT	-1	/* Only valid in purpose settings */
33059191Skris
33159191Skris#define X509_TRUST_COMPAT	1
33259191Skris#define X509_TRUST_SSL_CLIENT	2
33359191Skris#define X509_TRUST_SSL_SERVER	3
33459191Skris#define X509_TRUST_EMAIL	4
33559191Skris#define X509_TRUST_OBJECT_SIGN	5
336109998Smarkm#define X509_TRUST_OCSP_SIGN	6
337109998Smarkm#define X509_TRUST_OCSP_REQUEST	7
33859191Skris
33959191Skris/* Keep these up to date! */
34059191Skris#define X509_TRUST_MIN		1
341109998Smarkm#define X509_TRUST_MAX		7
34259191Skris
34359191Skris
34459191Skris/* trust_flags values */
34559191Skris#define	X509_TRUST_DYNAMIC 	1
34659191Skris#define	X509_TRUST_DYNAMIC_NAME	2
34759191Skris
34859191Skris/* check_trust return codes */
34959191Skris
35059191Skris#define X509_TRUST_TRUSTED	1
35159191Skris#define X509_TRUST_REJECTED	2
35259191Skris#define X509_TRUST_UNTRUSTED	3
35359191Skris
354109998Smarkm/* Flags for X509_print_ex() */
355109998Smarkm
356109998Smarkm#define	X509_FLAG_COMPAT		0
357109998Smarkm#define	X509_FLAG_NO_HEADER		1L
358109998Smarkm#define	X509_FLAG_NO_VERSION		(1L << 1)
359109998Smarkm#define	X509_FLAG_NO_SERIAL		(1L << 2)
360109998Smarkm#define	X509_FLAG_NO_SIGNAME		(1L << 3)
361109998Smarkm#define	X509_FLAG_NO_ISSUER		(1L << 4)
362109998Smarkm#define	X509_FLAG_NO_VALIDITY		(1L << 5)
363109998Smarkm#define	X509_FLAG_NO_SUBJECT		(1L << 6)
364109998Smarkm#define	X509_FLAG_NO_PUBKEY		(1L << 7)
365109998Smarkm#define	X509_FLAG_NO_EXTENSIONS		(1L << 8)
366109998Smarkm#define	X509_FLAG_NO_SIGDUMP		(1L << 9)
367109998Smarkm#define	X509_FLAG_NO_AUX		(1L << 10)
368109998Smarkm#define	X509_FLAG_NO_ATTRIBUTES		(1L << 11)
369109998Smarkm
37068651Skris/* Flags specific to X509_NAME_print_ex() */
37168651Skris
37268651Skris/* The field separator information */
37368651Skris
37468651Skris#define XN_FLAG_SEP_MASK	(0xf << 16)
37568651Skris
37668651Skris#define XN_FLAG_COMPAT		0		/* Traditional SSLeay: use old X509_NAME_print */
37768651Skris#define XN_FLAG_SEP_COMMA_PLUS	(1 << 16)	/* RFC2253 ,+ */
37868651Skris#define XN_FLAG_SEP_CPLUS_SPC	(2 << 16)	/* ,+ spaced: more readable */
37968651Skris#define XN_FLAG_SEP_SPLUS_SPC	(3 << 16)	/* ;+ spaced */
38068651Skris#define XN_FLAG_SEP_MULTILINE	(4 << 16)	/* One line per field */
38168651Skris
38268651Skris#define XN_FLAG_DN_REV		(1 << 20)	/* Reverse DN order */
38368651Skris
38468651Skris/* How the field name is shown */
38568651Skris
38668651Skris#define XN_FLAG_FN_MASK		(0x3 << 21)
38768651Skris
38868651Skris#define XN_FLAG_FN_SN		0		/* Object short name */
38968651Skris#define XN_FLAG_FN_LN		(1 << 21)	/* Object long name */
39068651Skris#define XN_FLAG_FN_OID		(2 << 21)	/* Always use OIDs */
39168651Skris#define XN_FLAG_FN_NONE		(3 << 21)	/* No field names */
39268651Skris
39368651Skris#define XN_FLAG_SPC_EQ		(1 << 23)	/* Put spaces round '=' */
39468651Skris
39568651Skris/* This determines if we dump fields we don't recognise:
39668651Skris * RFC2253 requires this.
39768651Skris */
39868651Skris
39968651Skris#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24)
40068651Skris
401109998Smarkm#define XN_FLAG_FN_ALIGN	(1 << 25)	/* Align field names to 20 characters */
402109998Smarkm
40368651Skris/* Complete set of RFC2253 flags */
40468651Skris
40568651Skris#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \
40668651Skris			XN_FLAG_SEP_COMMA_PLUS | \
40768651Skris			XN_FLAG_DN_REV | \
40868651Skris			XN_FLAG_FN_SN | \
40968651Skris			XN_FLAG_DUMP_UNKNOWN_FIELDS)
41068651Skris
41168651Skris/* readable oneline form */
41268651Skris
41368651Skris#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \
41468651Skris			ASN1_STRFLGS_ESC_QUOTE | \
41568651Skris			XN_FLAG_SEP_CPLUS_SPC | \
41668651Skris			XN_FLAG_SPC_EQ | \
41768651Skris			XN_FLAG_FN_SN)
41868651Skris
41968651Skris/* readable multiline form */
42068651Skris
42168651Skris#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \
42268651Skris			ASN1_STRFLGS_ESC_MSB | \
42368651Skris			XN_FLAG_SEP_MULTILINE | \
42468651Skris			XN_FLAG_SPC_EQ | \
425109998Smarkm			XN_FLAG_FN_LN | \
426109998Smarkm			XN_FLAG_FN_ALIGN)
42768651Skris
42855714Skristypedef struct X509_revoked_st
42955714Skris	{
43055714Skris	ASN1_INTEGER *serialNumber;
43168651Skris	ASN1_TIME *revocationDate;
43255714Skris	STACK_OF(X509_EXTENSION) /* optional */ *extensions;
43355714Skris	int sequence; /* load sequence */
43455714Skris	} X509_REVOKED;
43555714Skris
43655714SkrisDECLARE_STACK_OF(X509_REVOKED)
43755714SkrisDECLARE_ASN1_SET_OF(X509_REVOKED)
43855714Skris
43955714Skristypedef struct X509_crl_info_st
44055714Skris	{
44155714Skris	ASN1_INTEGER *version;
44255714Skris	X509_ALGOR *sig_alg;
44355714Skris	X509_NAME *issuer;
44468651Skris	ASN1_TIME *lastUpdate;
44568651Skris	ASN1_TIME *nextUpdate;
44655714Skris	STACK_OF(X509_REVOKED) *revoked;
44755714Skris	STACK_OF(X509_EXTENSION) /* [0] */ *extensions;
448142425Snectar	ASN1_ENCODING enc;
44955714Skris	} X509_CRL_INFO;
45055714Skris
451109998Smarkmstruct X509_crl_st
45255714Skris	{
45355714Skris	/* actual signature */
45455714Skris	X509_CRL_INFO *crl;
45555714Skris	X509_ALGOR *sig_alg;
45655714Skris	ASN1_BIT_STRING *signature;
45755714Skris	int references;
458109998Smarkm	} /* X509_CRL */;
45955714Skris
46055714SkrisDECLARE_STACK_OF(X509_CRL)
46155714SkrisDECLARE_ASN1_SET_OF(X509_CRL)
46255714Skris
46355714Skristypedef struct private_key_st
46455714Skris	{
46555714Skris	int version;
46655714Skris	/* The PKCS#8 data types */
46755714Skris	X509_ALGOR *enc_algor;
46855714Skris	ASN1_OCTET_STRING *enc_pkey;	/* encrypted pub key */
46955714Skris
47055714Skris	/* When decrypted, the following will not be NULL */
47155714Skris	EVP_PKEY *dec_pkey;
47255714Skris
47355714Skris	/* used to encrypt and decrypt */
47455714Skris	int key_length;
47555714Skris	char *key_data;
47655714Skris	int key_free;	/* true if we should auto free key_data */
47755714Skris
47855714Skris	/* expanded version of 'enc_algor' */
47955714Skris	EVP_CIPHER_INFO cipher;
48055714Skris
48155714Skris	int references;
48255714Skris	} X509_PKEY;
48355714Skris
484109998Smarkm#ifndef OPENSSL_NO_EVP
48555714Skristypedef struct X509_info_st
48655714Skris	{
48755714Skris	X509 *x509;
48855714Skris	X509_CRL *crl;
48955714Skris	X509_PKEY *x_pkey;
49055714Skris
49155714Skris	EVP_CIPHER_INFO enc_cipher;
49255714Skris	int enc_len;
49355714Skris	char *enc_data;
49455714Skris
49555714Skris	int references;
49655714Skris	} X509_INFO;
49755714Skris
49855714SkrisDECLARE_STACK_OF(X509_INFO)
49955714Skris#endif
50055714Skris
50155714Skris/* The next 2 structures and their 8 routines were sent to me by
50255714Skris * Pat Richard <patr@x509.com> and are used to manipulate
50359191Skris * Netscapes spki structures - useful if you are writing a CA web page
50455714Skris */
50555714Skristypedef struct Netscape_spkac_st
50655714Skris	{
50755714Skris	X509_PUBKEY *pubkey;
50855714Skris	ASN1_IA5STRING *challenge;	/* challenge sent in atlas >= PR2 */
50955714Skris	} NETSCAPE_SPKAC;
51055714Skris
51155714Skristypedef struct Netscape_spki_st
51255714Skris	{
51355714Skris	NETSCAPE_SPKAC *spkac;	/* signed public key and challenge */
51455714Skris	X509_ALGOR *sig_algor;
51555714Skris	ASN1_BIT_STRING *signature;
51655714Skris	} NETSCAPE_SPKI;
51755714Skris
51855714Skris/* Netscape certificate sequence structure */
51955714Skristypedef struct Netscape_certificate_sequence
52055714Skris	{
52155714Skris	ASN1_OBJECT *type;
52255714Skris	STACK_OF(X509) *certs;
52355714Skris	} NETSCAPE_CERT_SEQUENCE;
52455714Skris
525109998Smarkm/* Unused (and iv length is wrong)
52655714Skristypedef struct CBCParameter_st
52755714Skris	{
52855714Skris	unsigned char iv[8];
52955714Skris	} CBC_PARAM;
530109998Smarkm*/
53155714Skris
53255714Skris/* Password based encryption structure */
53355714Skris
53455714Skristypedef struct PBEPARAM_st {
53555714SkrisASN1_OCTET_STRING *salt;
53655714SkrisASN1_INTEGER *iter;
53755714Skris} PBEPARAM;
53855714Skris
53955714Skris/* Password based encryption V2 structures */
54055714Skris
54155714Skristypedef struct PBE2PARAM_st {
54255714SkrisX509_ALGOR *keyfunc;
54355714SkrisX509_ALGOR *encryption;
54455714Skris} PBE2PARAM;
54555714Skris
54655714Skristypedef struct PBKDF2PARAM_st {
54755714SkrisASN1_TYPE *salt;	/* Usually OCTET STRING but could be anything */
54855714SkrisASN1_INTEGER *iter;
54955714SkrisASN1_INTEGER *keylength;
55055714SkrisX509_ALGOR *prf;
55155714Skris} PBKDF2PARAM;
55255714Skris
55355714Skris
55455714Skris/* PKCS#8 private key info structure */
55555714Skris
55655714Skristypedef struct pkcs8_priv_key_info_st
55755714Skris        {
55855714Skris        int broken;     /* Flag for various broken formats */
55959191Skris#define PKCS8_OK		0
56059191Skris#define PKCS8_NO_OCTET		1
56159191Skris#define PKCS8_EMBEDDED_PARAM	2
56259191Skris#define PKCS8_NS_DB		3
56355714Skris        ASN1_INTEGER *version;
56455714Skris        X509_ALGOR *pkeyalg;
56555714Skris        ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */
56655714Skris        STACK_OF(X509_ATTRIBUTE) *attributes;
56755714Skris        } PKCS8_PRIV_KEY_INFO;
56855714Skris
56968651Skris#ifdef  __cplusplus
57068651Skris}
57168651Skris#endif
57268651Skris
57355714Skris#include <openssl/x509_vfy.h>
57455714Skris#include <openssl/pkcs7.h>
57555714Skris
57668651Skris#ifdef  __cplusplus
57768651Skrisextern "C" {
57868651Skris#endif
57968651Skris
58055714Skris#ifdef SSLEAY_MACROS
58155714Skris#define X509_verify(a,r) ASN1_verify((int (*)())i2d_X509_CINF,a->sig_alg,\
58255714Skris	a->signature,(char *)a->cert_info,r)
58355714Skris#define X509_REQ_verify(a,r) ASN1_verify((int (*)())i2d_X509_REQ_INFO, \
58455714Skris	a->sig_alg,a->signature,(char *)a->req_info,r)
58555714Skris#define X509_CRL_verify(a,r) ASN1_verify((int (*)())i2d_X509_CRL_INFO, \
58655714Skris	a->sig_alg, a->signature,(char *)a->crl,r)
58755714Skris
58855714Skris#define X509_sign(x,pkey,md) \
58955714Skris	ASN1_sign((int (*)())i2d_X509_CINF, x->cert_info->signature, \
59055714Skris		x->sig_alg, x->signature, (char *)x->cert_info,pkey,md)
59155714Skris#define X509_REQ_sign(x,pkey,md) \
59255714Skris	ASN1_sign((int (*)())i2d_X509_REQ_INFO,x->sig_alg, NULL, \
59355714Skris		x->signature, (char *)x->req_info,pkey,md)
59455714Skris#define X509_CRL_sign(x,pkey,md) \
59555714Skris	ASN1_sign((int (*)())i2d_X509_CRL_INFO,x->crl->sig_alg,x->sig_alg, \
59655714Skris		x->signature, (char *)x->crl,pkey,md)
59755714Skris#define NETSCAPE_SPKI_sign(x,pkey,md) \
59855714Skris	ASN1_sign((int (*)())i2d_NETSCAPE_SPKAC, x->sig_algor,NULL, \
59955714Skris		x->signature, (char *)x->spkac,pkey,md)
60055714Skris
60155714Skris#define X509_dup(x509) (X509 *)ASN1_dup((int (*)())i2d_X509, \
60255714Skris		(char *(*)())d2i_X509,(char *)x509)
60355714Skris#define X509_ATTRIBUTE_dup(xa) (X509_ATTRIBUTE *)ASN1_dup(\
60455714Skris		(int (*)())i2d_X509_ATTRIBUTE, \
60555714Skris		(char *(*)())d2i_X509_ATTRIBUTE,(char *)xa)
60655714Skris#define X509_EXTENSION_dup(ex) (X509_EXTENSION *)ASN1_dup( \
60755714Skris		(int (*)())i2d_X509_EXTENSION, \
60855714Skris		(char *(*)())d2i_X509_EXTENSION,(char *)ex)
60955714Skris#define d2i_X509_fp(fp,x509) (X509 *)ASN1_d2i_fp((char *(*)())X509_new, \
61055714Skris		(char *(*)())d2i_X509, (fp),(unsigned char **)(x509))
61155714Skris#define i2d_X509_fp(fp,x509) ASN1_i2d_fp(i2d_X509,fp,(unsigned char *)x509)
61255714Skris#define d2i_X509_bio(bp,x509) (X509 *)ASN1_d2i_bio((char *(*)())X509_new, \
61355714Skris		(char *(*)())d2i_X509, (bp),(unsigned char **)(x509))
61455714Skris#define i2d_X509_bio(bp,x509) ASN1_i2d_bio(i2d_X509,bp,(unsigned char *)x509)
61555714Skris
61655714Skris#define X509_CRL_dup(crl) (X509_CRL *)ASN1_dup((int (*)())i2d_X509_CRL, \
61755714Skris		(char *(*)())d2i_X509_CRL,(char *)crl)
61855714Skris#define d2i_X509_CRL_fp(fp,crl) (X509_CRL *)ASN1_d2i_fp((char *(*)()) \
61955714Skris		X509_CRL_new,(char *(*)())d2i_X509_CRL, (fp),\
62055714Skris		(unsigned char **)(crl))
62155714Skris#define i2d_X509_CRL_fp(fp,crl) ASN1_i2d_fp(i2d_X509_CRL,fp,\
62255714Skris		(unsigned char *)crl)
62355714Skris#define d2i_X509_CRL_bio(bp,crl) (X509_CRL *)ASN1_d2i_bio((char *(*)()) \
62455714Skris		X509_CRL_new,(char *(*)())d2i_X509_CRL, (bp),\
62555714Skris		(unsigned char **)(crl))
62655714Skris#define i2d_X509_CRL_bio(bp,crl) ASN1_i2d_bio(i2d_X509_CRL,bp,\
62755714Skris		(unsigned char *)crl)
62855714Skris
62955714Skris#define PKCS7_dup(p7) (PKCS7 *)ASN1_dup((int (*)())i2d_PKCS7, \
63055714Skris		(char *(*)())d2i_PKCS7,(char *)p7)
63155714Skris#define d2i_PKCS7_fp(fp,p7) (PKCS7 *)ASN1_d2i_fp((char *(*)()) \
63255714Skris		PKCS7_new,(char *(*)())d2i_PKCS7, (fp),\
63355714Skris		(unsigned char **)(p7))
63455714Skris#define i2d_PKCS7_fp(fp,p7) ASN1_i2d_fp(i2d_PKCS7,fp,\
63555714Skris		(unsigned char *)p7)
63655714Skris#define d2i_PKCS7_bio(bp,p7) (PKCS7 *)ASN1_d2i_bio((char *(*)()) \
63755714Skris		PKCS7_new,(char *(*)())d2i_PKCS7, (bp),\
63855714Skris		(unsigned char **)(p7))
63955714Skris#define i2d_PKCS7_bio(bp,p7) ASN1_i2d_bio(i2d_PKCS7,bp,\
64055714Skris		(unsigned char *)p7)
64155714Skris
64255714Skris#define X509_REQ_dup(req) (X509_REQ *)ASN1_dup((int (*)())i2d_X509_REQ, \
64355714Skris		(char *(*)())d2i_X509_REQ,(char *)req)
64455714Skris#define d2i_X509_REQ_fp(fp,req) (X509_REQ *)ASN1_d2i_fp((char *(*)())\
64555714Skris		X509_REQ_new, (char *(*)())d2i_X509_REQ, (fp),\
64655714Skris		(unsigned char **)(req))
64755714Skris#define i2d_X509_REQ_fp(fp,req) ASN1_i2d_fp(i2d_X509_REQ,fp,\
64855714Skris		(unsigned char *)req)
64955714Skris#define d2i_X509_REQ_bio(bp,req) (X509_REQ *)ASN1_d2i_bio((char *(*)())\
65055714Skris		X509_REQ_new, (char *(*)())d2i_X509_REQ, (bp),\
65155714Skris		(unsigned char **)(req))
65255714Skris#define i2d_X509_REQ_bio(bp,req) ASN1_i2d_bio(i2d_X509_REQ,bp,\
65355714Skris		(unsigned char *)req)
65455714Skris
65555714Skris#define RSAPublicKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPublicKey, \
65655714Skris		(char *(*)())d2i_RSAPublicKey,(char *)rsa)
65755714Skris#define RSAPrivateKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPrivateKey, \
65855714Skris		(char *(*)())d2i_RSAPrivateKey,(char *)rsa)
65955714Skris
66055714Skris#define d2i_RSAPrivateKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
66155714Skris		RSA_new,(char *(*)())d2i_RSAPrivateKey, (fp), \
66255714Skris		(unsigned char **)(rsa))
66355714Skris#define i2d_RSAPrivateKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPrivateKey,fp, \
66455714Skris		(unsigned char *)rsa)
66555714Skris#define d2i_RSAPrivateKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
66655714Skris		RSA_new,(char *(*)())d2i_RSAPrivateKey, (bp), \
66755714Skris		(unsigned char **)(rsa))
66855714Skris#define i2d_RSAPrivateKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPrivateKey,bp, \
66955714Skris		(unsigned char *)rsa)
67055714Skris
67155714Skris#define d2i_RSAPublicKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
67255714Skris		RSA_new,(char *(*)())d2i_RSAPublicKey, (fp), \
67355714Skris		(unsigned char **)(rsa))
67455714Skris#define i2d_RSAPublicKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPublicKey,fp, \
67555714Skris		(unsigned char *)rsa)
67655714Skris#define d2i_RSAPublicKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
67755714Skris		RSA_new,(char *(*)())d2i_RSAPublicKey, (bp), \
67855714Skris		(unsigned char **)(rsa))
67955714Skris#define i2d_RSAPublicKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPublicKey,bp, \
68055714Skris		(unsigned char *)rsa)
68155714Skris
68255714Skris#define d2i_DSAPrivateKey_fp(fp,dsa) (DSA *)ASN1_d2i_fp((char *(*)())\
68355714Skris		DSA_new,(char *(*)())d2i_DSAPrivateKey, (fp), \
68455714Skris		(unsigned char **)(dsa))
68555714Skris#define i2d_DSAPrivateKey_fp(fp,dsa) ASN1_i2d_fp(i2d_DSAPrivateKey,fp, \
68655714Skris		(unsigned char *)dsa)
68755714Skris#define d2i_DSAPrivateKey_bio(bp,dsa) (DSA *)ASN1_d2i_bio((char *(*)())\
68855714Skris		DSA_new,(char *(*)())d2i_DSAPrivateKey, (bp), \
68955714Skris		(unsigned char **)(dsa))
69055714Skris#define i2d_DSAPrivateKey_bio(bp,dsa) ASN1_i2d_bio(i2d_DSAPrivateKey,bp, \
69155714Skris		(unsigned char *)dsa)
69255714Skris
693160814Ssimon#define d2i_ECPrivateKey_fp(fp,ecdsa) (EC_KEY *)ASN1_d2i_fp((char *(*)())\
694160814Ssimon		EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (fp), \
695160814Ssimon		(unsigned char **)(ecdsa))
696160814Ssimon#define i2d_ECPrivateKey_fp(fp,ecdsa) ASN1_i2d_fp(i2d_ECPrivateKey,fp, \
697160814Ssimon		(unsigned char *)ecdsa)
698160814Ssimon#define d2i_ECPrivateKey_bio(bp,ecdsa) (EC_KEY *)ASN1_d2i_bio((char *(*)())\
699160814Ssimon		EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (bp), \
700160814Ssimon		(unsigned char **)(ecdsa))
701160814Ssimon#define i2d_ECPrivateKey_bio(bp,ecdsa) ASN1_i2d_bio(i2d_ECPrivateKey,bp, \
702160814Ssimon		(unsigned char *)ecdsa)
703160814Ssimon
70455714Skris#define X509_ALGOR_dup(xn) (X509_ALGOR *)ASN1_dup((int (*)())i2d_X509_ALGOR,\
70555714Skris		(char *(*)())d2i_X509_ALGOR,(char *)xn)
70655714Skris
70755714Skris#define X509_NAME_dup(xn) (X509_NAME *)ASN1_dup((int (*)())i2d_X509_NAME, \
70855714Skris		(char *(*)())d2i_X509_NAME,(char *)xn)
70955714Skris#define X509_NAME_ENTRY_dup(ne) (X509_NAME_ENTRY *)ASN1_dup( \
71055714Skris		(int (*)())i2d_X509_NAME_ENTRY, \
71155714Skris		(char *(*)())d2i_X509_NAME_ENTRY,\
71255714Skris		(char *)ne)
71355714Skris
71455714Skris#define X509_digest(data,type,md,len) \
71555714Skris	ASN1_digest((int (*)())i2d_X509,type,(char *)data,md,len)
71655714Skris#define X509_NAME_digest(data,type,md,len) \
71755714Skris	ASN1_digest((int (*)())i2d_X509_NAME,type,(char *)data,md,len)
71855714Skris#ifndef PKCS7_ISSUER_AND_SERIAL_digest
71955714Skris#define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
72055714Skris	ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
72155714Skris		(char *)data,md,len)
72255714Skris#endif
72355714Skris#endif
72455714Skris
72555714Skris#define X509_EXT_PACK_UNKNOWN	1
72655714Skris#define X509_EXT_PACK_STRING	2
72755714Skris
72855714Skris#define		X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
72955714Skris/* #define	X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */
73055714Skris#define		X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
73155714Skris#define		X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
73255714Skris#define		X509_extract_key(x)	X509_get_pubkey(x) /*****/
73355714Skris#define		X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version)
73455714Skris#define		X509_REQ_get_subject_name(x) ((x)->req_info->subject)
73555714Skris#define		X509_REQ_extract_key(a)	X509_REQ_get_pubkey(a)
73655714Skris#define		X509_name_cmp(a,b)	X509_NAME_cmp((a),(b))
73755714Skris#define		X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm))
73855714Skris
73955714Skris#define		X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version)
74055714Skris#define 	X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate)
74155714Skris#define 	X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate)
74255714Skris#define		X509_CRL_get_issuer(x) ((x)->crl->issuer)
74355714Skris#define		X509_CRL_get_REVOKED(x) ((x)->crl->revoked)
74455714Skris
74555714Skris/* This one is only used so that a binary form can output, as in
74655714Skris * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */
74755714Skris#define 	X509_get_X509_PUBKEY(x) ((x)->cert_info->key)
74855714Skris
74955714Skris
75055714Skrisconst char *X509_verify_cert_error_string(long n);
75155714Skris
75255714Skris#ifndef SSLEAY_MACROS
753109998Smarkm#ifndef OPENSSL_NO_EVP
75455714Skrisint X509_verify(X509 *a, EVP_PKEY *r);
75555714Skris
75655714Skrisint X509_REQ_verify(X509_REQ *a, EVP_PKEY *r);
75755714Skrisint X509_CRL_verify(X509_CRL *a, EVP_PKEY *r);
75855714Skrisint NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r);
75955714Skris
76059191SkrisNETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len);
76159191Skrischar * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x);
76259191SkrisEVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x);
76359191Skrisint NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey);
76459191Skris
76559191Skrisint NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki);
76659191Skris
767109998Smarkmint X509_signature_print(BIO *bp,X509_ALGOR *alg, ASN1_STRING *sig);
768109998Smarkm
76955714Skrisint X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
77055714Skrisint X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md);
77155714Skrisint X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md);
77255714Skrisint NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md);
77355714Skris
774109998Smarkmint X509_pubkey_digest(const X509 *data,const EVP_MD *type,
775109998Smarkm		unsigned char *md, unsigned int *len);
77668651Skrisint X509_digest(const X509 *data,const EVP_MD *type,
77768651Skris		unsigned char *md, unsigned int *len);
77868651Skrisint X509_CRL_digest(const X509_CRL *data,const EVP_MD *type,
77968651Skris		unsigned char *md, unsigned int *len);
78068651Skrisint X509_REQ_digest(const X509_REQ *data,const EVP_MD *type,
78168651Skris		unsigned char *md, unsigned int *len);
78268651Skrisint X509_NAME_digest(const X509_NAME *data,const EVP_MD *type,
78368651Skris		unsigned char *md, unsigned int *len);
78455714Skris#endif
78555714Skris
786109998Smarkm#ifndef OPENSSL_NO_FP_API
78755714SkrisX509 *d2i_X509_fp(FILE *fp, X509 **x509);
78855714Skrisint i2d_X509_fp(FILE *fp,X509 *x509);
78955714SkrisX509_CRL *d2i_X509_CRL_fp(FILE *fp,X509_CRL **crl);
79055714Skrisint i2d_X509_CRL_fp(FILE *fp,X509_CRL *crl);
79155714SkrisX509_REQ *d2i_X509_REQ_fp(FILE *fp,X509_REQ **req);
79255714Skrisint i2d_X509_REQ_fp(FILE *fp,X509_REQ *req);
793109998Smarkm#ifndef OPENSSL_NO_RSA
79455714SkrisRSA *d2i_RSAPrivateKey_fp(FILE *fp,RSA **rsa);
79555714Skrisint i2d_RSAPrivateKey_fp(FILE *fp,RSA *rsa);
79655714SkrisRSA *d2i_RSAPublicKey_fp(FILE *fp,RSA **rsa);
79755714Skrisint i2d_RSAPublicKey_fp(FILE *fp,RSA *rsa);
79859191SkrisRSA *d2i_RSA_PUBKEY_fp(FILE *fp,RSA **rsa);
79959191Skrisint i2d_RSA_PUBKEY_fp(FILE *fp,RSA *rsa);
80055714Skris#endif
801109998Smarkm#ifndef OPENSSL_NO_DSA
80259191SkrisDSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
80359191Skrisint i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa);
80455714SkrisDSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
80555714Skrisint i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa);
80659191Skris#endif
807160814Ssimon#ifndef OPENSSL_NO_EC
808160814SsimonEC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
809160814Ssimonint   i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey);
810160814SsimonEC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
811160814Ssimonint   i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey);
812160814Ssimon#endif
81355714SkrisX509_SIG *d2i_PKCS8_fp(FILE *fp,X509_SIG **p8);
81455714Skrisint i2d_PKCS8_fp(FILE *fp,X509_SIG *p8);
81555714SkrisPKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
81655714Skris						PKCS8_PRIV_KEY_INFO **p8inf);
81755714Skrisint i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,PKCS8_PRIV_KEY_INFO *p8inf);
81859191Skrisint i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key);
81959191Skrisint i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey);
82059191SkrisEVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
82168651Skrisint i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey);
82268651SkrisEVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
82355714Skris#endif
82455714Skris
825109998Smarkm#ifndef OPENSSL_NO_BIO
82655714SkrisX509 *d2i_X509_bio(BIO *bp,X509 **x509);
82755714Skrisint i2d_X509_bio(BIO *bp,X509 *x509);
82855714SkrisX509_CRL *d2i_X509_CRL_bio(BIO *bp,X509_CRL **crl);
82955714Skrisint i2d_X509_CRL_bio(BIO *bp,X509_CRL *crl);
83055714SkrisX509_REQ *d2i_X509_REQ_bio(BIO *bp,X509_REQ **req);
83155714Skrisint i2d_X509_REQ_bio(BIO *bp,X509_REQ *req);
832109998Smarkm#ifndef OPENSSL_NO_RSA
83355714SkrisRSA *d2i_RSAPrivateKey_bio(BIO *bp,RSA **rsa);
83455714Skrisint i2d_RSAPrivateKey_bio(BIO *bp,RSA *rsa);
83555714SkrisRSA *d2i_RSAPublicKey_bio(BIO *bp,RSA **rsa);
83655714Skrisint i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa);
83759191SkrisRSA *d2i_RSA_PUBKEY_bio(BIO *bp,RSA **rsa);
83859191Skrisint i2d_RSA_PUBKEY_bio(BIO *bp,RSA *rsa);
83955714Skris#endif
840109998Smarkm#ifndef OPENSSL_NO_DSA
84159191SkrisDSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
84259191Skrisint i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
84355714SkrisDSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
84455714Skrisint i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
84555714Skris#endif
846160814Ssimon#ifndef OPENSSL_NO_EC
847160814SsimonEC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
848160814Ssimonint   i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
849160814SsimonEC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
850160814Ssimonint   i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
851160814Ssimon#endif
85255714SkrisX509_SIG *d2i_PKCS8_bio(BIO *bp,X509_SIG **p8);
85355714Skrisint i2d_PKCS8_bio(BIO *bp,X509_SIG *p8);
85455714SkrisPKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
85555714Skris						PKCS8_PRIV_KEY_INFO **p8inf);
85655714Skrisint i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,PKCS8_PRIV_KEY_INFO *p8inf);
85759191Skrisint i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
85859191Skrisint i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
85959191SkrisEVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
86068651Skrisint i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
86168651SkrisEVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
86255714Skris#endif
86355714Skris
86455714SkrisX509 *X509_dup(X509 *x509);
86555714SkrisX509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa);
86655714SkrisX509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex);
86755714SkrisX509_CRL *X509_CRL_dup(X509_CRL *crl);
86855714SkrisX509_REQ *X509_REQ_dup(X509_REQ *req);
86955714SkrisX509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
870194206Ssimonint X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
871194206Ssimonvoid X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
872194206Ssimon						X509_ALGOR *algor);
873277195Sdelphijint X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
874194206Ssimon
87555714SkrisX509_NAME *X509_NAME_dup(X509_NAME *xn);
87655714SkrisX509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);
87755714Skris
87855714Skris#endif /* !SSLEAY_MACROS */
87955714Skris
88068651Skrisint		X509_cmp_time(ASN1_TIME *s, time_t *t);
88168651Skrisint		X509_cmp_current_time(ASN1_TIME *s);
88268651SkrisASN1_TIME *	X509_time_adj(ASN1_TIME *s, long adj, time_t *t);
88368651SkrisASN1_TIME *	X509_gmtime_adj(ASN1_TIME *s, long adj);
88455714Skris
88555714Skrisconst char *	X509_get_default_cert_area(void );
88655714Skrisconst char *	X509_get_default_cert_dir(void );
88755714Skrisconst char *	X509_get_default_cert_file(void );
88855714Skrisconst char *	X509_get_default_cert_dir_env(void );
88955714Skrisconst char *	X509_get_default_cert_file_env(void );
89055714Skrisconst char *	X509_get_default_private_dir(void );
89155714Skris
89259191SkrisX509_REQ *	X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
89355714SkrisX509 *		X509_REQ_to_X509(X509_REQ *r, int days,EVP_PKEY *pkey);
89455714Skris
895109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_ALGOR)
896194206SsimonDECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS)
897109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_VAL)
89855714Skris
899109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_PUBKEY)
90055714Skris
90155714Skrisint		X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey);
90255714SkrisEVP_PKEY *	X509_PUBKEY_get(X509_PUBKEY *key);
90355714Skrisint		X509_get_pubkey_parameters(EVP_PKEY *pkey,
90455714Skris					   STACK_OF(X509) *chain);
90559191Skrisint		i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp);
906160814SsimonEVP_PKEY *	d2i_PUBKEY(EVP_PKEY **a,const unsigned char **pp,
90759191Skris			long length);
908109998Smarkm#ifndef OPENSSL_NO_RSA
90959191Skrisint		i2d_RSA_PUBKEY(RSA *a,unsigned char **pp);
910160814SsimonRSA *		d2i_RSA_PUBKEY(RSA **a,const unsigned char **pp,
91159191Skris			long length);
91259191Skris#endif
913109998Smarkm#ifndef OPENSSL_NO_DSA
91459191Skrisint		i2d_DSA_PUBKEY(DSA *a,unsigned char **pp);
915160814SsimonDSA *		d2i_DSA_PUBKEY(DSA **a,const unsigned char **pp,
91659191Skris			long length);
91759191Skris#endif
918160814Ssimon#ifndef OPENSSL_NO_EC
919160814Ssimonint		i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp);
920160814SsimonEC_KEY 		*d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp,
921160814Ssimon			long length);
922160814Ssimon#endif
92355714Skris
924109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_SIG)
925109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_REQ_INFO)
926109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_REQ)
92755714Skris
928109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE)
92955714SkrisX509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value);
93055714Skris
931109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_EXTENSION)
932194206SsimonDECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)
93355714Skris
934109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY)
93555714Skris
936109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_NAME)
93755714Skris
93855714Skrisint		X509_NAME_set(X509_NAME **xn, X509_NAME *name);
93955714Skris
940109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_CINF)
94155714Skris
942109998SmarkmDECLARE_ASN1_FUNCTIONS(X509)
943109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_CERT_AUX)
94455714Skris
945160814SsimonDECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR)
946160814Ssimon
94759191Skrisint X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
94859191Skris	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
94959191Skrisint X509_set_ex_data(X509 *r, int idx, void *arg);
95059191Skrisvoid *X509_get_ex_data(X509 *r, int idx);
95159191Skrisint		i2d_X509_AUX(X509 *a,unsigned char **pp);
952160814SsimonX509 *		d2i_X509_AUX(X509 **a,const unsigned char **pp,long length);
95355714Skris
95459191Skrisint X509_alias_set1(X509 *x, unsigned char *name, int len);
95568651Skrisint X509_keyid_set1(X509 *x, unsigned char *id, int len);
95659191Skrisunsigned char * X509_alias_get0(X509 *x, int *len);
957160814Ssimonunsigned char * X509_keyid_get0(X509 *x, int *len);
95859191Skrisint (*X509_TRUST_set_default(int (*trust)(int , X509 *, int)))(int, X509 *, int);
959109998Smarkmint X509_TRUST_set(int *t, int trust);
96059191Skrisint X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj);
96159191Skrisint X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj);
96259191Skrisvoid X509_trust_clear(X509 *x);
96359191Skrisvoid X509_reject_clear(X509 *x);
96459191Skris
965109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_REVOKED)
966109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_CRL_INFO)
967109998SmarkmDECLARE_ASN1_FUNCTIONS(X509_CRL)
96855714Skris
969109998Smarkmint X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
97055714Skris
97155714SkrisX509_PKEY *	X509_PKEY_new(void );
97255714Skrisvoid		X509_PKEY_free(X509_PKEY *a);
97355714Skrisint		i2d_X509_PKEY(X509_PKEY *a,unsigned char **pp);
974160814SsimonX509_PKEY *	d2i_X509_PKEY(X509_PKEY **a,const unsigned char **pp,long length);
97555714Skris
976109998SmarkmDECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI)
977109998SmarkmDECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
978109998SmarkmDECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE)
97955714Skris
980109998Smarkm#ifndef OPENSSL_NO_EVP
98155714SkrisX509_INFO *	X509_INFO_new(void);
98255714Skrisvoid		X509_INFO_free(X509_INFO *a);
98355714Skrischar *		X509_NAME_oneline(X509_NAME *a,char *buf,int size);
98455714Skris
985160814Ssimonint ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1,
986160814Ssimon		ASN1_BIT_STRING *signature,char *data,EVP_PKEY *pkey);
98755714Skris
988160814Ssimonint ASN1_digest(i2d_of_void *i2d,const EVP_MD *type,char *data,
989160814Ssimon		unsigned char *md,unsigned int *len);
99055714Skris
991160814Ssimonint ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1,
992160814Ssimon	      X509_ALGOR *algor2, ASN1_BIT_STRING *signature,
993160814Ssimon	      char *data,EVP_PKEY *pkey, const EVP_MD *type);
994109998Smarkm
995109998Smarkmint ASN1_item_digest(const ASN1_ITEM *it,const EVP_MD *type,void *data,
996109998Smarkm	unsigned char *md,unsigned int *len);
997109998Smarkm
998109998Smarkmint ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1,
999109998Smarkm	ASN1_BIT_STRING *signature,void *data,EVP_PKEY *pkey);
1000109998Smarkm
1001109998Smarkmint ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2,
1002109998Smarkm	ASN1_BIT_STRING *signature,
1003109998Smarkm	void *data, EVP_PKEY *pkey, const EVP_MD *type);
100455714Skris#endif
100555714Skris
100655714Skrisint 		X509_set_version(X509 *x,long version);
100755714Skrisint 		X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial);
100855714SkrisASN1_INTEGER *	X509_get_serialNumber(X509 *x);
100955714Skrisint 		X509_set_issuer_name(X509 *x, X509_NAME *name);
101055714SkrisX509_NAME *	X509_get_issuer_name(X509 *a);
101155714Skrisint 		X509_set_subject_name(X509 *x, X509_NAME *name);
101255714SkrisX509_NAME *	X509_get_subject_name(X509 *a);
101368651Skrisint 		X509_set_notBefore(X509 *x, ASN1_TIME *tm);
101468651Skrisint 		X509_set_notAfter(X509 *x, ASN1_TIME *tm);
101555714Skrisint 		X509_set_pubkey(X509 *x, EVP_PKEY *pkey);
101655714SkrisEVP_PKEY *	X509_get_pubkey(X509 *x);
1017109998SmarkmASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x);
101855714Skrisint		X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */);
101955714Skris
102055714Skrisint		X509_REQ_set_version(X509_REQ *x,long version);
102155714Skrisint		X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name);
102255714Skrisint		X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey);
102355714SkrisEVP_PKEY *	X509_REQ_get_pubkey(X509_REQ *req);
102459191Skrisint		X509_REQ_extension_nid(int nid);
102559191Skrisint *		X509_REQ_get_extension_nids(void);
102659191Skrisvoid		X509_REQ_set_extension_nids(int *nids);
102759191SkrisSTACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
102859191Skrisint X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts,
102959191Skris				int nid);
103059191Skrisint X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts);
103159191Skrisint X509_REQ_get_attr_count(const X509_REQ *req);
103259191Skrisint X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid,
103359191Skris			  int lastpos);
103459191Skrisint X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj,
103559191Skris			  int lastpos);
103659191SkrisX509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
103759191SkrisX509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
103859191Skrisint X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr);
103959191Skrisint X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
1040109998Smarkm			const ASN1_OBJECT *obj, int type,
1041109998Smarkm			const unsigned char *bytes, int len);
104259191Skrisint X509_REQ_add1_attr_by_NID(X509_REQ *req,
104359191Skris			int nid, int type,
1044109998Smarkm			const unsigned char *bytes, int len);
104559191Skrisint X509_REQ_add1_attr_by_txt(X509_REQ *req,
1046109998Smarkm			const char *attrname, int type,
1047109998Smarkm			const unsigned char *bytes, int len);
104855714Skris
1049109998Smarkmint X509_CRL_set_version(X509_CRL *x, long version);
1050109998Smarkmint X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
1051109998Smarkmint X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
1052109998Smarkmint X509_CRL_set_nextUpdate(X509_CRL *x, ASN1_TIME *tm);
1053109998Smarkmint X509_CRL_sort(X509_CRL *crl);
1054109998Smarkm
1055109998Smarkmint X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial);
1056109998Smarkmint X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm);
1057109998Smarkm
1058160814Ssimonint		X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey);
1059160814Ssimon
106055714Skrisint		X509_check_private_key(X509 *x509,EVP_PKEY *pkey);
106155714Skris
106268651Skrisint		X509_issuer_and_serial_cmp(const X509 *a, const X509 *b);
106355714Skrisunsigned long	X509_issuer_and_serial_hash(X509 *a);
106455714Skris
106568651Skrisint		X509_issuer_name_cmp(const X509 *a, const X509 *b);
106655714Skrisunsigned long	X509_issuer_name_hash(X509 *a);
106755714Skris
106868651Skrisint		X509_subject_name_cmp(const X509 *a, const X509 *b);
106955714Skrisunsigned long	X509_subject_name_hash(X509 *x);
107055714Skris
107168651Skrisint		X509_cmp(const X509 *a, const X509 *b);
107268651Skrisint		X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b);
107355714Skrisunsigned long	X509_NAME_hash(X509_NAME *x);
107455714Skris
107568651Skrisint		X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b);
1076109998Smarkm#ifndef OPENSSL_NO_FP_API
1077109998Smarkmint		X509_print_ex_fp(FILE *bp,X509 *x, unsigned long nmflag, unsigned long cflag);
107855714Skrisint		X509_print_fp(FILE *bp,X509 *x);
107955714Skrisint		X509_CRL_print_fp(FILE *bp,X509_CRL *x);
108055714Skrisint		X509_REQ_print_fp(FILE *bp,X509_REQ *req);
108168651Skrisint X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags);
108255714Skris#endif
108355714Skris
1084109998Smarkm#ifndef OPENSSL_NO_BIO
108555714Skrisint		X509_NAME_print(BIO *bp, X509_NAME *name, int obase);
108668651Skrisint X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, unsigned long flags);
1087109998Smarkmint		X509_print_ex(BIO *bp,X509 *x, unsigned long nmflag, unsigned long cflag);
108855714Skrisint		X509_print(BIO *bp,X509 *x);
1089109998Smarkmint		X509_ocspid_print(BIO *bp,X509 *x);
109059191Skrisint		X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent);
109155714Skrisint		X509_CRL_print(BIO *bp,X509_CRL *x);
1092109998Smarkmint		X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned long cflag);
109355714Skrisint		X509_REQ_print(BIO *bp,X509_REQ *req);
109455714Skris#endif
109555714Skris
109655714Skrisint 		X509_NAME_entry_count(X509_NAME *name);
109755714Skrisint 		X509_NAME_get_text_by_NID(X509_NAME *name, int nid,
109855714Skris			char *buf,int len);
109955714Skrisint		X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj,
110055714Skris			char *buf,int len);
110155714Skris
110255714Skris/* NOTE: you should be passsing -1, not 0 as lastpos.  The functions that use
110359191Skris * lastpos, search after that position on. */
110455714Skrisint 		X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos);
110555714Skrisint 		X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj,
110655714Skris			int lastpos);
110755714SkrisX509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc);
110855714SkrisX509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc);
110955714Skrisint 		X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne,
111055714Skris			int loc, int set);
111159191Skrisint X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
111259191Skris			unsigned char *bytes, int len, int loc, int set);
111359191Skrisint X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
111459191Skris			unsigned char *bytes, int len, int loc, int set);
111559191SkrisX509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
1116160814Ssimon		const char *field, int type, const unsigned char *bytes, int len);
111755714SkrisX509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
111855714Skris			int type,unsigned char *bytes, int len);
1119160814Ssimonint X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
1120160814Ssimon			const unsigned char *bytes, int len, int loc, int set);
112155714SkrisX509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
1122160814Ssimon			ASN1_OBJECT *obj, int type,const unsigned char *bytes,
112355714Skris			int len);
112455714Skrisint 		X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne,
112555714Skris			ASN1_OBJECT *obj);
112655714Skrisint 		X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
1127160814Ssimon			const unsigned char *bytes, int len);
112855714SkrisASN1_OBJECT *	X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne);
112955714SkrisASN1_STRING *	X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne);
113055714Skris
113155714Skrisint		X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
113255714Skrisint		X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
113355714Skris				      int nid, int lastpos);
113455714Skrisint		X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
113555714Skris				      ASN1_OBJECT *obj,int lastpos);
113655714Skrisint		X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
113755714Skris					   int crit, int lastpos);
113855714SkrisX509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc);
113955714SkrisX509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc);
114055714SkrisSTACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
114155714Skris					 X509_EXTENSION *ex, int loc);
114255714Skris
114355714Skrisint		X509_get_ext_count(X509 *x);
114455714Skrisint		X509_get_ext_by_NID(X509 *x, int nid, int lastpos);
114555714Skrisint		X509_get_ext_by_OBJ(X509 *x,ASN1_OBJECT *obj,int lastpos);
114655714Skrisint		X509_get_ext_by_critical(X509 *x, int crit, int lastpos);
114755714SkrisX509_EXTENSION *X509_get_ext(X509 *x, int loc);
114855714SkrisX509_EXTENSION *X509_delete_ext(X509 *x, int loc);
114955714Skrisint		X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
115059191Skrisvoid	*	X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx);
1151109998Smarkmint		X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
1152109998Smarkm							unsigned long flags);
115355714Skris
115455714Skrisint		X509_CRL_get_ext_count(X509_CRL *x);
115555714Skrisint		X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos);
115655714Skrisint		X509_CRL_get_ext_by_OBJ(X509_CRL *x,ASN1_OBJECT *obj,int lastpos);
115755714Skrisint		X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos);
115855714SkrisX509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc);
115955714SkrisX509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
116055714Skrisint		X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc);
116159191Skrisvoid	*	X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx);
1162109998Smarkmint		X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit,
1163109998Smarkm							unsigned long flags);
116455714Skris
116555714Skrisint		X509_REVOKED_get_ext_count(X509_REVOKED *x);
116655714Skrisint		X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos);
116755714Skrisint		X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x,ASN1_OBJECT *obj,int lastpos);
116855714Skrisint		X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos);
116955714SkrisX509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc);
117055714SkrisX509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc);
117155714Skrisint		X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc);
117259191Skrisvoid	*	X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx);
1173109998Smarkmint		X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit,
1174109998Smarkm							unsigned long flags);
117555714Skris
117655714SkrisX509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex,
117755714Skris			int nid, int crit, ASN1_OCTET_STRING *data);
117855714SkrisX509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
117955714Skris			ASN1_OBJECT *obj,int crit,ASN1_OCTET_STRING *data);
118055714Skrisint		X509_EXTENSION_set_object(X509_EXTENSION *ex,ASN1_OBJECT *obj);
118155714Skrisint		X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
118255714Skrisint		X509_EXTENSION_set_data(X509_EXTENSION *ex,
118355714Skris			ASN1_OCTET_STRING *data);
118455714SkrisASN1_OBJECT *	X509_EXTENSION_get_object(X509_EXTENSION *ex);
118555714SkrisASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
118655714Skrisint		X509_EXTENSION_get_critical(X509_EXTENSION *ex);
118755714Skris
118859191Skrisint X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
118959191Skrisint X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
119059191Skris			  int lastpos);
119159191Skrisint X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
119259191Skris			  int lastpos);
119359191SkrisX509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc);
119459191SkrisX509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc);
119559191SkrisSTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
119659191Skris					 X509_ATTRIBUTE *attr);
119759191SkrisSTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
1198109998Smarkm			const ASN1_OBJECT *obj, int type,
1199109998Smarkm			const unsigned char *bytes, int len);
120059191SkrisSTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x,
120159191Skris			int nid, int type,
1202109998Smarkm			const unsigned char *bytes, int len);
120359191SkrisSTACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x,
1204109998Smarkm			const char *attrname, int type,
1205109998Smarkm			const unsigned char *bytes, int len);
1206194206Ssimonvoid *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x,
1207194206Ssimon				ASN1_OBJECT *obj, int lastpos, int type);
120859191SkrisX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
1209109998Smarkm	     int atrtype, const void *data, int len);
121059191SkrisX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
1211109998Smarkm	     const ASN1_OBJECT *obj, int atrtype, const void *data, int len);
121259191SkrisX509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
1213109998Smarkm		const char *atrname, int type, const unsigned char *bytes, int len);
1214109998Smarkmint X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj);
1215109998Smarkmint X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len);
121659191Skrisvoid *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
121759191Skris					int atrtype, void *data);
121859191Skrisint X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr);
121959191SkrisASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
122059191SkrisASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx);
122159191Skris
1222160814Ssimonint EVP_PKEY_get_attr_count(const EVP_PKEY *key);
1223160814Ssimonint EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid,
1224160814Ssimon			  int lastpos);
1225160814Ssimonint EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj,
1226160814Ssimon			  int lastpos);
1227160814SsimonX509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc);
1228160814SsimonX509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc);
1229160814Ssimonint EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr);
1230160814Ssimonint EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key,
1231160814Ssimon			const ASN1_OBJECT *obj, int type,
1232160814Ssimon			const unsigned char *bytes, int len);
1233160814Ssimonint EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key,
1234160814Ssimon			int nid, int type,
1235160814Ssimon			const unsigned char *bytes, int len);
1236160814Ssimonint EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key,
1237160814Ssimon			const char *attrname, int type,
1238160814Ssimon			const unsigned char *bytes, int len);
1239160814Ssimon
124055714Skrisint		X509_verify_cert(X509_STORE_CTX *ctx);
124155714Skris
124255714Skris/* lookup a cert from a X509 STACK */
124355714SkrisX509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name,
124455714Skris				     ASN1_INTEGER *serial);
124555714SkrisX509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name);
124655714Skris
1247109998SmarkmDECLARE_ASN1_FUNCTIONS(PBEPARAM)
1248109998SmarkmDECLARE_ASN1_FUNCTIONS(PBE2PARAM)
1249109998SmarkmDECLARE_ASN1_FUNCTIONS(PBKDF2PARAM)
1250109998Smarkm
125155714SkrisX509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt, int saltlen);
125255714SkrisX509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
125355714Skris					 unsigned char *salt, int saltlen);
125455714Skris
125555714Skris/* PKCS#8 utilities */
125655714Skris
1257109998SmarkmDECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)
125855714Skris
125955714SkrisEVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8);
126055714SkrisPKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
126159191SkrisPKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken);
126255714SkrisPKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken);
126355714Skris
126459191Skrisint X509_check_trust(X509 *x, int id, int flags);
126559191Skrisint X509_TRUST_get_count(void);
126659191SkrisX509_TRUST * X509_TRUST_get0(int idx);
126759191Skrisint X509_TRUST_get_by_id(int id);
126859191Skrisint X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
126959191Skris					char *name, int arg1, void *arg2);
127059191Skrisvoid X509_TRUST_cleanup(void);
127159191Skrisint X509_TRUST_get_flags(X509_TRUST *xp);
127259191Skrischar *X509_TRUST_get0_name(X509_TRUST *xp);
127359191Skrisint X509_TRUST_get_trust(X509_TRUST *xp);
127459191Skris
127555714Skris/* BEGIN ERROR CODES */
127655714Skris/* The following lines are auto generated by the script mkerr.pl. Any changes
127755714Skris * made after this point may be overwritten when the script is next run.
127855714Skris */
127989837Skrisvoid ERR_load_X509_strings(void);
128055714Skris
128155714Skris/* Error codes for the X509 functions. */
128255714Skris
128355714Skris/* Function codes. */
128455714Skris#define X509_F_ADD_CERT_DIR				 100
128555714Skris#define X509_F_BY_FILE_CTRL				 101
1286160814Ssimon#define X509_F_CHECK_POLICY				 145
128755714Skris#define X509_F_DIR_CTRL					 102
128855714Skris#define X509_F_GET_CERT_BY_SUBJECT			 103
128959191Skris#define X509_F_NETSCAPE_SPKI_B64_DECODE			 129
129059191Skris#define X509_F_NETSCAPE_SPKI_B64_ENCODE			 130
1291160814Ssimon#define X509_F_X509AT_ADD1_ATTR				 135
129255714Skris#define X509_F_X509V3_ADD_EXT				 104
129359191Skris#define X509_F_X509_ATTRIBUTE_CREATE_BY_NID		 136
129459191Skris#define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ		 137
129559191Skris#define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT		 140
129659191Skris#define X509_F_X509_ATTRIBUTE_GET0_DATA			 139
129759191Skris#define X509_F_X509_ATTRIBUTE_SET1_DATA			 138
129855714Skris#define X509_F_X509_CHECK_PRIVATE_KEY			 128
1299160814Ssimon#define X509_F_X509_CRL_PRINT_FP			 147
130055714Skris#define X509_F_X509_EXTENSION_CREATE_BY_NID		 108
130155714Skris#define X509_F_X509_EXTENSION_CREATE_BY_OBJ		 109
130255714Skris#define X509_F_X509_GET_PUBKEY_PARAMETERS		 110
130359191Skris#define X509_F_X509_LOAD_CERT_CRL_FILE			 132
130455714Skris#define X509_F_X509_LOAD_CERT_FILE			 111
130555714Skris#define X509_F_X509_LOAD_CRL_FILE			 112
130655714Skris#define X509_F_X509_NAME_ADD_ENTRY			 113
130755714Skris#define X509_F_X509_NAME_ENTRY_CREATE_BY_NID		 114
130859191Skris#define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT		 131
130955714Skris#define X509_F_X509_NAME_ENTRY_SET_OBJECT		 115
131055714Skris#define X509_F_X509_NAME_ONELINE			 116
131155714Skris#define X509_F_X509_NAME_PRINT				 117
1312160814Ssimon#define X509_F_X509_PRINT_EX_FP				 118
131355714Skris#define X509_F_X509_PUBKEY_GET				 119
131455714Skris#define X509_F_X509_PUBKEY_SET				 120
1315160814Ssimon#define X509_F_X509_REQ_CHECK_PRIVATE_KEY		 144
1316160814Ssimon#define X509_F_X509_REQ_PRINT_EX			 121
131755714Skris#define X509_F_X509_REQ_PRINT_FP			 122
131855714Skris#define X509_F_X509_REQ_TO_X509				 123
131955714Skris#define X509_F_X509_STORE_ADD_CERT			 124
132055714Skris#define X509_F_X509_STORE_ADD_CRL			 125
1321160814Ssimon#define X509_F_X509_STORE_CTX_GET1_ISSUER		 146
1322109998Smarkm#define X509_F_X509_STORE_CTX_INIT			 143
1323109998Smarkm#define X509_F_X509_STORE_CTX_NEW			 142
132459191Skris#define X509_F_X509_STORE_CTX_PURPOSE_INHERIT		 134
132555714Skris#define X509_F_X509_TO_X509_REQ				 126
132659191Skris#define X509_F_X509_TRUST_ADD				 133
1327109998Smarkm#define X509_F_X509_TRUST_SET				 141
132855714Skris#define X509_F_X509_VERIFY_CERT				 127
132955714Skris
133055714Skris/* Reason codes. */
133155714Skris#define X509_R_BAD_X509_FILETYPE			 100
133259191Skris#define X509_R_BASE64_DECODE_ERROR			 118
133355714Skris#define X509_R_CANT_CHECK_DH_KEY			 114
133455714Skris#define X509_R_CERT_ALREADY_IN_HASH_TABLE		 101
133555714Skris#define X509_R_ERR_ASN1_LIB				 102
133655714Skris#define X509_R_INVALID_DIRECTORY			 113
133759191Skris#define X509_R_INVALID_FIELD_NAME			 119
1338109998Smarkm#define X509_R_INVALID_TRUST				 123
133955714Skris#define X509_R_KEY_TYPE_MISMATCH			 115
134055714Skris#define X509_R_KEY_VALUES_MISMATCH			 116
134155714Skris#define X509_R_LOADING_CERT_DIR				 103
134255714Skris#define X509_R_LOADING_DEFAULTS				 104
134355714Skris#define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY		 105
134455714Skris#define X509_R_SHOULD_RETRY				 106
134555714Skris#define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN	 107
134655714Skris#define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY		 108
134755714Skris#define X509_R_UNKNOWN_KEY_TYPE				 117
134855714Skris#define X509_R_UNKNOWN_NID				 109
134959191Skris#define X509_R_UNKNOWN_PURPOSE_ID			 121
135059191Skris#define X509_R_UNKNOWN_TRUST_ID				 120
135155714Skris#define X509_R_UNSUPPORTED_ALGORITHM			 111
135255714Skris#define X509_R_WRONG_LOOKUP_TYPE			 112
135359191Skris#define X509_R_WRONG_TYPE				 122
135455714Skris
135555714Skris#ifdef  __cplusplus
135655714Skris}
135755714Skris#endif
135855714Skris#endif
1359