155714Skris/* crypto/crypto.h */
2160814Ssimon/* ====================================================================
3238405Sjkim * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
4160814Ssimon *
5160814Ssimon * Redistribution and use in source and binary forms, with or without
6160814Ssimon * modification, are permitted provided that the following conditions
7160814Ssimon * are met:
8160814Ssimon *
9160814Ssimon * 1. Redistributions of source code must retain the above copyright
10160814Ssimon *    notice, this list of conditions and the following disclaimer.
11160814Ssimon *
12160814Ssimon * 2. Redistributions in binary form must reproduce the above copyright
13160814Ssimon *    notice, this list of conditions and the following disclaimer in
14160814Ssimon *    the documentation and/or other materials provided with the
15160814Ssimon *    distribution.
16160814Ssimon *
17160814Ssimon * 3. All advertising materials mentioning features or use of this
18160814Ssimon *    software must display the following acknowledgment:
19160814Ssimon *    "This product includes software developed by the OpenSSL Project
20160814Ssimon *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21160814Ssimon *
22160814Ssimon * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23160814Ssimon *    endorse or promote products derived from this software without
24160814Ssimon *    prior written permission. For written permission, please contact
25160814Ssimon *    openssl-core@openssl.org.
26160814Ssimon *
27160814Ssimon * 5. Products derived from this software may not be called "OpenSSL"
28160814Ssimon *    nor may "OpenSSL" appear in their names without prior written
29160814Ssimon *    permission of the OpenSSL Project.
30160814Ssimon *
31160814Ssimon * 6. Redistributions of any form whatsoever must retain the following
32160814Ssimon *    acknowledgment:
33160814Ssimon *    "This product includes software developed by the OpenSSL Project
34160814Ssimon *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35160814Ssimon *
36160814Ssimon * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37160814Ssimon * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38160814Ssimon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39160814Ssimon * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40160814Ssimon * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41160814Ssimon * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42160814Ssimon * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43160814Ssimon * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44160814Ssimon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45160814Ssimon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46160814Ssimon * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47160814Ssimon * OF THE POSSIBILITY OF SUCH DAMAGE.
48160814Ssimon * ====================================================================
49160814Ssimon *
50160814Ssimon * This product includes cryptographic software written by Eric Young
51160814Ssimon * (eay@cryptsoft.com).  This product includes software written by Tim
52160814Ssimon * Hudson (tjh@cryptsoft.com).
53160814Ssimon *
54160814Ssimon */
5555714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5655714Skris * All rights reserved.
5755714Skris *
5855714Skris * This package is an SSL implementation written
5955714Skris * by Eric Young (eay@cryptsoft.com).
6055714Skris * The implementation was written so as to conform with Netscapes SSL.
6155714Skris *
6255714Skris * This library is free for commercial and non-commercial use as long as
6355714Skris * the following conditions are aheared to.  The following conditions
6455714Skris * apply to all code found in this distribution, be it the RC4, RSA,
6555714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
6655714Skris * included with this distribution is covered by the same copyright terms
6755714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
6855714Skris *
6955714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
7055714Skris * the code are not to be removed.
7155714Skris * If this package is used in a product, Eric Young should be given attribution
7255714Skris * as the author of the parts of the library used.
7355714Skris * This can be in the form of a textual message at program startup or
7455714Skris * in documentation (online or textual) provided with the package.
7555714Skris *
7655714Skris * Redistribution and use in source and binary forms, with or without
7755714Skris * modification, are permitted provided that the following conditions
7855714Skris * are met:
7955714Skris * 1. Redistributions of source code must retain the copyright
8055714Skris *    notice, this list of conditions and the following disclaimer.
8155714Skris * 2. Redistributions in binary form must reproduce the above copyright
8255714Skris *    notice, this list of conditions and the following disclaimer in the
8355714Skris *    documentation and/or other materials provided with the distribution.
8455714Skris * 3. All advertising materials mentioning features or use of this software
8555714Skris *    must display the following acknowledgement:
8655714Skris *    "This product includes cryptographic software written by
8755714Skris *     Eric Young (eay@cryptsoft.com)"
8855714Skris *    The word 'cryptographic' can be left out if the rouines from the library
8955714Skris *    being used are not cryptographic related :-).
9055714Skris * 4. If you include any Windows specific code (or a derivative thereof) from
9155714Skris *    the apps directory (application code) you must include an acknowledgement:
9255714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
9355714Skris *
9455714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
9555714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9655714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9755714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
9855714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
9955714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
10055714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
10155714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
10255714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
10355714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
10455714Skris * SUCH DAMAGE.
10555714Skris *
10655714Skris * The licence and distribution terms for any publically available version or
10755714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
10855714Skris * copied and put under another distribution licence
10955714Skris * [including the GNU Public Licence.]
11055714Skris */
111160814Ssimon/* ====================================================================
112160814Ssimon * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113160814Ssimon * ECDH support in OpenSSL originally developed by
114160814Ssimon * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115160814Ssimon */
11655714Skris
11755714Skris#ifndef HEADER_CRYPTO_H
11855714Skris#define HEADER_CRYPTO_H
11955714Skris
12059191Skris#include <stdlib.h>
12159191Skris
122160814Ssimon#include <openssl/e_os2.h>
123160814Ssimon
124109998Smarkm#ifndef OPENSSL_NO_FP_API
12555714Skris#include <stdio.h>
12655714Skris#endif
12755714Skris
12855714Skris#include <openssl/stack.h>
12959191Skris#include <openssl/safestack.h>
13055714Skris#include <openssl/opensslv.h>
131160814Ssimon#include <openssl/ossl_typ.h>
13255714Skris
13355714Skris#ifdef CHARSET_EBCDIC
13455714Skris#include <openssl/ebcdic.h>
13555714Skris#endif
13655714Skris
13768651Skris/* Resolve problems on some operating systems with symbol names that clash
13868651Skris   one way or another */
13968651Skris#include <openssl/symhacks.h>
14068651Skris
14168651Skris#ifdef  __cplusplus
14268651Skrisextern "C" {
14359191Skris#endif
14459191Skris
14555714Skris/* Backward compatibility to SSLeay */
14655714Skris/* This is more to be used to check the correct DLL is being used
14755714Skris * in the MS world. */
14855714Skris#define SSLEAY_VERSION_NUMBER	OPENSSL_VERSION_NUMBER
14955714Skris#define SSLEAY_VERSION		0
15055714Skris/* #define SSLEAY_OPTIONS	1 no longer supported */
15155714Skris#define SSLEAY_CFLAGS		2
15255714Skris#define SSLEAY_BUILT_ON		3
15355714Skris#define SSLEAY_PLATFORM		4
154109998Smarkm#define SSLEAY_DIR		5
15555714Skris
156160814Ssimon/* Already declared in ossl_typ.h */
157160814Ssimon#if 0
158160814Ssimontypedef struct crypto_ex_data_st CRYPTO_EX_DATA;
159160814Ssimon/* Called when a new object is created */
160160814Ssimontypedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
161160814Ssimon					int idx, long argl, void *argp);
162160814Ssimon/* Called when an object is free()ed */
163160814Ssimontypedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
164160814Ssimon					int idx, long argl, void *argp);
165160814Ssimon/* Called when we need to dup an object */
166160814Ssimontypedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d,
167160814Ssimon					int idx, long argl, void *argp);
168160814Ssimon#endif
169160814Ssimon
170160814Ssimon/* A generic structure to pass assorted data in a expandable way */
171160814Ssimontypedef struct openssl_item_st
172160814Ssimon	{
173160814Ssimon	int code;
174160814Ssimon	void *value;		/* Not used for flag attributes */
175160814Ssimon	size_t value_size;	/* Max size of value for output, length for input */
176160814Ssimon	size_t *value_length;	/* Returned length of value for output */
177160814Ssimon	} OPENSSL_ITEM;
178160814Ssimon
179160814Ssimon
18055714Skris/* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock
18155714Skris * names in cryptlib.c
18255714Skris */
18355714Skris
184160814Ssimon#define	CRYPTO_LOCK_ERR			1
185160814Ssimon#define	CRYPTO_LOCK_EX_DATA		2
186160814Ssimon#define	CRYPTO_LOCK_X509		3
187160814Ssimon#define	CRYPTO_LOCK_X509_INFO		4
188160814Ssimon#define	CRYPTO_LOCK_X509_PKEY		5
18955714Skris#define CRYPTO_LOCK_X509_CRL		6
19055714Skris#define CRYPTO_LOCK_X509_REQ		7
19155714Skris#define CRYPTO_LOCK_DSA			8
19255714Skris#define CRYPTO_LOCK_RSA			9
19355714Skris#define CRYPTO_LOCK_EVP_PKEY		10
194109998Smarkm#define CRYPTO_LOCK_X509_STORE		11
195109998Smarkm#define CRYPTO_LOCK_SSL_CTX		12
196109998Smarkm#define CRYPTO_LOCK_SSL_CERT		13
197109998Smarkm#define CRYPTO_LOCK_SSL_SESSION		14
198109998Smarkm#define CRYPTO_LOCK_SSL_SESS_CERT	15
199109998Smarkm#define CRYPTO_LOCK_SSL			16
200109998Smarkm#define CRYPTO_LOCK_SSL_METHOD		17
201109998Smarkm#define CRYPTO_LOCK_RAND		18
202109998Smarkm#define CRYPTO_LOCK_RAND2		19
203109998Smarkm#define CRYPTO_LOCK_MALLOC		20
204109998Smarkm#define CRYPTO_LOCK_BIO			21
205109998Smarkm#define CRYPTO_LOCK_GETHOSTBYNAME	22
206109998Smarkm#define CRYPTO_LOCK_GETSERVBYNAME	23
207109998Smarkm#define CRYPTO_LOCK_READDIR		24
208109998Smarkm#define CRYPTO_LOCK_RSA_BLINDING	25
209109998Smarkm#define CRYPTO_LOCK_DH			26
210109998Smarkm#define CRYPTO_LOCK_MALLOC2		27
211109998Smarkm#define CRYPTO_LOCK_DSO			28
212109998Smarkm#define CRYPTO_LOCK_DYNLOCK		29
213109998Smarkm#define CRYPTO_LOCK_ENGINE		30
214109998Smarkm#define CRYPTO_LOCK_UI			31
215160814Ssimon#define CRYPTO_LOCK_ECDSA               32
216160814Ssimon#define CRYPTO_LOCK_EC			33
217160814Ssimon#define CRYPTO_LOCK_ECDH		34
218160814Ssimon#define CRYPTO_LOCK_BN  		35
219160814Ssimon#define CRYPTO_LOCK_EC_PRE_COMP		36
220160814Ssimon#define CRYPTO_LOCK_STORE		37
221160814Ssimon#define CRYPTO_LOCK_COMP		38
222194206Ssimon#define CRYPTO_LOCK_FIPS		39
223194206Ssimon#define CRYPTO_LOCK_FIPS2		40
224194206Ssimon#define CRYPTO_NUM_LOCKS		41
22555714Skris
22655714Skris#define CRYPTO_LOCK		1
22755714Skris#define CRYPTO_UNLOCK		2
22855714Skris#define CRYPTO_READ		4
22955714Skris#define CRYPTO_WRITE		8
23055714Skris
231109998Smarkm#ifndef OPENSSL_NO_LOCKING
23255714Skris#ifndef CRYPTO_w_lock
23355714Skris#define CRYPTO_w_lock(type)	\
23455714Skris	CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
23555714Skris#define CRYPTO_w_unlock(type)	\
23655714Skris	CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
23755714Skris#define CRYPTO_r_lock(type)	\
23855714Skris	CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__)
23955714Skris#define CRYPTO_r_unlock(type)	\
24055714Skris	CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
24155714Skris#define CRYPTO_add(addr,amount,type)	\
24255714Skris	CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
24355714Skris#endif
24455714Skris#else
24555714Skris#define CRYPTO_w_lock(a)
246109998Smarkm#define CRYPTO_w_unlock(a)
24755714Skris#define CRYPTO_r_lock(a)
24855714Skris#define CRYPTO_r_unlock(a)
24955714Skris#define CRYPTO_add(a,b,c)	((*(a))+=(b))
25055714Skris#endif
25155714Skris
25268651Skris/* Some applications as well as some parts of OpenSSL need to allocate
25368651Skris   and deallocate locks in a dynamic fashion.  The following typedef
25468651Skris   makes this possible in a type-safe manner.  */
25568651Skris/* struct CRYPTO_dynlock_value has to be defined by the application. */
25668651Skristypedef struct
25768651Skris	{
25868651Skris	int references;
25968651Skris	struct CRYPTO_dynlock_value *data;
26068651Skris	} CRYPTO_dynlock;
26168651Skris
26268651Skris
26355714Skris/* The following can be used to detect memory leaks in the SSLeay library.
26455714Skris * It used, it turns on malloc checking */
26555714Skris
26655714Skris#define CRYPTO_MEM_CHECK_OFF	0x0	/* an enume */
26755714Skris#define CRYPTO_MEM_CHECK_ON	0x1	/* a bit */
26855714Skris#define CRYPTO_MEM_CHECK_ENABLE	0x2	/* a bit */
26955714Skris#define CRYPTO_MEM_CHECK_DISABLE 0x3	/* an enume */
27055714Skris
27159191Skris/* The following are bit values to turn on or off options connected to the
27259191Skris * malloc checking functionality */
27355714Skris
27459191Skris/* Adds time to the memory checking information */
27559191Skris#define V_CRYPTO_MDEBUG_TIME	0x1 /* a bit */
27659191Skris/* Adds thread number to the memory checking information */
27759191Skris#define V_CRYPTO_MDEBUG_THREAD	0x2 /* a bit */
27859191Skris
27959191Skris#define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD)
28059191Skris
28159191Skris
28255714Skris/* predec of the BIO type */
28355714Skristypedef struct bio_st BIO_dummy;
28455714Skris
285160814Ssimonstruct crypto_ex_data_st
28655714Skris	{
287238405Sjkim	STACK_OF(void) *sk;
28855714Skris	int dummy; /* gcc is screwing up this data structure :-( */
289160814Ssimon	};
290238405SjkimDECLARE_STACK_OF(void)
29155714Skris
29255714Skris/* This stuff is basically class callback functions
29359191Skris * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */
29459191Skris
29555714Skristypedef struct crypto_ex_data_func_st
29655714Skris	{
29755714Skris	long argl;	/* Arbitary long */
29859191Skris	void *argp;	/* Arbitary void * */
29959191Skris	CRYPTO_EX_new *new_func;
30059191Skris	CRYPTO_EX_free *free_func;
30159191Skris	CRYPTO_EX_dup *dup_func;
30255714Skris	} CRYPTO_EX_DATA_FUNCS;
30355714Skris
30459191SkrisDECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS)
30559191Skris
30655714Skris/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA
30755714Skris * entry.
30855714Skris */
30955714Skris
31055714Skris#define CRYPTO_EX_INDEX_BIO		0
31155714Skris#define CRYPTO_EX_INDEX_SSL		1
31255714Skris#define CRYPTO_EX_INDEX_SSL_CTX		2
31355714Skris#define CRYPTO_EX_INDEX_SSL_SESSION	3
31455714Skris#define CRYPTO_EX_INDEX_X509_STORE	4
31555714Skris#define CRYPTO_EX_INDEX_X509_STORE_CTX	5
316109998Smarkm#define CRYPTO_EX_INDEX_RSA		6
317109998Smarkm#define CRYPTO_EX_INDEX_DSA		7
318109998Smarkm#define CRYPTO_EX_INDEX_DH		8
319109998Smarkm#define CRYPTO_EX_INDEX_ENGINE		9
320109998Smarkm#define CRYPTO_EX_INDEX_X509		10
321109998Smarkm#define CRYPTO_EX_INDEX_UI		11
322160814Ssimon#define CRYPTO_EX_INDEX_ECDSA		12
323160814Ssimon#define CRYPTO_EX_INDEX_ECDH		13
324160814Ssimon#define CRYPTO_EX_INDEX_COMP		14
325160814Ssimon#define CRYPTO_EX_INDEX_STORE		15
32655714Skris
327109998Smarkm/* Dynamically assigned indexes start from this value (don't use directly, use
328109998Smarkm * via CRYPTO_ex_data_new_class). */
329109998Smarkm#define CRYPTO_EX_INDEX_USER		100
33059191Skris
331109998Smarkm
33259191Skris/* This is the default callbacks, but we can have others as well:
33359191Skris * this is needed in Win32 where the application malloc and the
33459191Skris * library malloc may not be the same.
33559191Skris */
33655714Skris#define CRYPTO_malloc_init()	CRYPTO_set_mem_functions(\
33759191Skris	malloc, realloc, free)
33855714Skris
33959191Skris#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD
34055714Skris# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */
34155714Skris#  define CRYPTO_MDEBUG
34255714Skris# endif
34355714Skris#endif
34455714Skris
34559191Skris/* Set standard debugging functions (not done by default
34659191Skris * unless CRYPTO_MDEBUG is defined) */
347238405Sjkim#define CRYPTO_malloc_debug_init()	do {\
348238405Sjkim	CRYPTO_set_mem_debug_functions(\
349238405Sjkim		CRYPTO_dbg_malloc,\
350238405Sjkim		CRYPTO_dbg_realloc,\
351238405Sjkim		CRYPTO_dbg_free,\
352238405Sjkim		CRYPTO_dbg_set_options,\
353238405Sjkim		CRYPTO_dbg_get_options);\
354238405Sjkim	} while(0)
35559191Skris
35659191Skrisint CRYPTO_mem_ctrl(int mode);
35759191Skrisint CRYPTO_is_mem_check_on(void);
35859191Skris
35959191Skris/* for applications */
36055714Skris#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)
36155714Skris#define MemCheck_stop()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF)
36259191Skris
36359191Skris/* for library-internal use */
36455714Skris#define MemCheck_on()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE)
36555714Skris#define MemCheck_off()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE)
36659191Skris#define is_MemCheck_on() CRYPTO_is_mem_check_on()
36759191Skris
36868651Skris#define OPENSSL_malloc(num)	CRYPTO_malloc((int)num,__FILE__,__LINE__)
369194206Ssimon#define OPENSSL_strdup(str)	CRYPTO_strdup((str),__FILE__,__LINE__)
37068651Skris#define OPENSSL_realloc(addr,num) \
37159191Skris	CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__)
372109998Smarkm#define OPENSSL_realloc_clean(addr,old_num,num) \
373109998Smarkm	CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__)
37468651Skris#define OPENSSL_remalloc(addr,num) \
37559191Skris	CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__)
37668651Skris#define OPENSSL_freeFunc	CRYPTO_free
37768651Skris#define OPENSSL_free(addr)	CRYPTO_free(addr)
37859191Skris
37968651Skris#define OPENSSL_malloc_locked(num) \
38068651Skris	CRYPTO_malloc_locked((int)num,__FILE__,__LINE__)
38168651Skris#define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr)
38255714Skris
38359191Skris
38455714Skrisconst char *SSLeay_version(int type);
38555714Skrisunsigned long SSLeay(void);
38655714Skris
38776866Skrisint OPENSSL_issetugid(void);
38876866Skris
389109998Smarkm/* An opaque type representing an implementation of "ex_data" support */
390109998Smarkmtypedef struct st_CRYPTO_EX_DATA_IMPL	CRYPTO_EX_DATA_IMPL;
391109998Smarkm/* Return an opaque pointer to the current "ex_data" implementation */
392109998Smarkmconst CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void);
393109998Smarkm/* Sets the "ex_data" implementation to be used (if it's not too late) */
394109998Smarkmint CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i);
395109998Smarkm/* Get a new "ex_data" class, and return the corresponding "class_index" */
396109998Smarkmint CRYPTO_ex_data_new_class(void);
397109998Smarkm/* Within a given class, get/register a new index */
398109998Smarkmint CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
399109998Smarkm		CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func,
400109998Smarkm		CRYPTO_EX_free *free_func);
401109998Smarkm/* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given
402109998Smarkm * class (invokes whatever per-class callbacks are applicable) */
403109998Smarkmint CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
404109998Smarkmint CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to,
405109998Smarkm		CRYPTO_EX_DATA *from);
406109998Smarkmvoid CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
407109998Smarkm/* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index
408109998Smarkm * (relative to the class type involved) */
40959191Skrisint CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val);
410109998Smarkmvoid *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad,int idx);
411109998Smarkm/* This function cleans up all "ex_data" state. It mustn't be called under
412109998Smarkm * potential race-conditions. */
413109998Smarkmvoid CRYPTO_cleanup_all_ex_data(void);
41455714Skris
41555714Skrisint CRYPTO_get_new_lockid(char *name);
41655714Skris
41755714Skrisint CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */
41855714Skrisvoid CRYPTO_lock(int mode, int type,const char *file,int line);
41955714Skrisvoid CRYPTO_set_locking_callback(void (*func)(int mode,int type,
42055714Skris					      const char *file,int line));
42155714Skrisvoid (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file,
42255714Skris		int line);
42355714Skrisvoid CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type,
42455714Skris					      const char *file, int line));
42555714Skrisint (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type,
42655714Skris					  const char *file,int line);
427238405Sjkim
428238405Sjkim/* Don't use this structure directly. */
429238405Sjkimtypedef struct crypto_threadid_st
430238405Sjkim	{
431238405Sjkim	void *ptr;
432238405Sjkim	unsigned long val;
433238405Sjkim	} CRYPTO_THREADID;
434238405Sjkim/* Only use CRYPTO_THREADID_set_[numeric|pointer]() within callbacks */
435238405Sjkimvoid CRYPTO_THREADID_set_numeric(CRYPTO_THREADID *id, unsigned long val);
436238405Sjkimvoid CRYPTO_THREADID_set_pointer(CRYPTO_THREADID *id, void *ptr);
437238405Sjkimint CRYPTO_THREADID_set_callback(void (*threadid_func)(CRYPTO_THREADID *));
438238405Sjkimvoid (*CRYPTO_THREADID_get_callback(void))(CRYPTO_THREADID *);
439238405Sjkimvoid CRYPTO_THREADID_current(CRYPTO_THREADID *id);
440238405Sjkimint CRYPTO_THREADID_cmp(const CRYPTO_THREADID *a, const CRYPTO_THREADID *b);
441238405Sjkimvoid CRYPTO_THREADID_cpy(CRYPTO_THREADID *dest, const CRYPTO_THREADID *src);
442238405Sjkimunsigned long CRYPTO_THREADID_hash(const CRYPTO_THREADID *id);
443238405Sjkim#ifndef OPENSSL_NO_DEPRECATED
44455714Skrisvoid CRYPTO_set_id_callback(unsigned long (*func)(void));
44555714Skrisunsigned long (*CRYPTO_get_id_callback(void))(void);
44655714Skrisunsigned long CRYPTO_thread_id(void);
447238405Sjkim#endif
448238405Sjkim
44955714Skrisconst char *CRYPTO_get_lock_name(int type);
45055714Skrisint CRYPTO_add_lock(int *pointer,int amount,int type, const char *file,
45155714Skris		    int line);
45255714Skris
45368651Skrisint CRYPTO_get_new_dynlockid(void);
45468651Skrisvoid CRYPTO_destroy_dynlockid(int i);
45568651Skrisstruct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i);
45668651Skrisvoid CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line));
45768651Skrisvoid CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line));
45868651Skrisvoid CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line));
45968651Skrisstruct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line);
46068651Skrisvoid (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line);
46168651Skrisvoid (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line);
46268651Skris
46359191Skris/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions --
46459191Skris * call the latter last if you need different functions */
46559191Skrisint CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *));
46659191Skrisint CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *));
467109998Smarkmint CRYPTO_set_mem_ex_functions(void *(*m)(size_t,const char *,int),
468109998Smarkm                                void *(*r)(void *,size_t,const char *,int),
469109998Smarkm                                void (*f)(void *));
470109998Smarkmint CRYPTO_set_locked_mem_ex_functions(void *(*m)(size_t,const char *,int),
471109998Smarkm                                       void (*free_func)(void *));
47268651Skrisint CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int),
47368651Skris				   void (*r)(void *,void *,int,const char *,int,int),
47468651Skris				   void (*f)(void *,int),
47568651Skris				   void (*so)(long),
47668651Skris				   long (*go)(void));
47759191Skrisvoid CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *));
47859191Skrisvoid CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *));
479109998Smarkmvoid CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int),
480109998Smarkm                                 void *(**r)(void *, size_t,const char *,int),
481109998Smarkm                                 void (**f)(void *));
482109998Smarkmvoid CRYPTO_get_locked_mem_ex_functions(void *(**m)(size_t,const char *,int),
483109998Smarkm                                        void (**f)(void *));
48468651Skrisvoid CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int),
48568651Skris				    void (**r)(void *,void *,int,const char *,int,int),
48668651Skris				    void (**f)(void *,int),
48768651Skris				    void (**so)(long),
48868651Skris				    long (**go)(void));
48955714Skris
49059191Skrisvoid *CRYPTO_malloc_locked(int num, const char *file, int line);
491246772Sjkimvoid CRYPTO_free_locked(void *ptr);
49259191Skrisvoid *CRYPTO_malloc(int num, const char *file, int line);
493194206Ssimonchar *CRYPTO_strdup(const char *str, const char *file, int line);
494246772Sjkimvoid CRYPTO_free(void *ptr);
49559191Skrisvoid *CRYPTO_realloc(void *addr,int num, const char *file, int line);
496109998Smarkmvoid *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file,
497109998Smarkm			   int line);
49859191Skrisvoid *CRYPTO_remalloc(void *addr,int num, const char *file, int line);
49955714Skris
500109998Smarkmvoid OPENSSL_cleanse(void *ptr, size_t len);
501109998Smarkm
50259191Skrisvoid CRYPTO_set_mem_debug_options(long bits);
50359191Skrislong CRYPTO_get_mem_debug_options(void);
50459191Skris
50559191Skris#define CRYPTO_push_info(info) \
50659191Skris        CRYPTO_push_info_(info, __FILE__, __LINE__);
50759191Skrisint CRYPTO_push_info_(const char *info, const char *file, int line);
50859191Skrisint CRYPTO_pop_info(void);
50959191Skrisint CRYPTO_remove_all_info(void);
51059191Skris
51189837Skris
51289837Skris/* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro;
51389837Skris * used as default in CRYPTO_MDEBUG compilations): */
51459191Skris/* The last argument has the following significance:
51559191Skris *
51659191Skris * 0:	called before the actual memory allocation has taken place
51759191Skris * 1:	called after the actual memory allocation has taken place
51859191Skris */
51959191Skrisvoid CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p);
52059191Skrisvoid CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p);
52159191Skrisvoid CRYPTO_dbg_free(void *addr,int before_p);
52259191Skris/* Tell the debugging code about options.  By default, the following values
52359191Skris * apply:
52459191Skris *
52589837Skris * 0:                           Clear all options.
52689837Skris * V_CRYPTO_MDEBUG_TIME (1):    Set the "Show Time" option.
52789837Skris * V_CRYPTO_MDEBUG_THREAD (2):  Set the "Show Thread Number" option.
52889837Skris * V_CRYPTO_MDEBUG_ALL (3):     1 + 2
52959191Skris */
53059191Skrisvoid CRYPTO_dbg_set_options(long bits);
53159191Skrislong CRYPTO_dbg_get_options(void);
53259191Skris
53389837Skris
534109998Smarkm#ifndef OPENSSL_NO_FP_API
53555714Skrisvoid CRYPTO_mem_leaks_fp(FILE *);
53655714Skris#endif
53755714Skrisvoid CRYPTO_mem_leaks(struct bio_st *bio);
53855714Skris/* unsigned long order, char *file, int line, int num_bytes, char *addr */
539109998Smarkmtypedef void *CRYPTO_MEM_LEAK_CB(unsigned long, const char *, int, int, void *);
540109998Smarkmvoid CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb);
54155714Skris
542109998Smarkm/* die if we have to */
543109998Smarkmvoid OpenSSLDie(const char *file,int line,const char *assertion);
544160814Ssimon#define OPENSSL_assert(e)       (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1))
545109998Smarkm
546160814Ssimonunsigned long *OPENSSL_ia32cap_loc(void);
547160814Ssimon#define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc()))
548194206Ssimonint OPENSSL_isservice(void);
549142425Snectar
550238405Sjkimint FIPS_mode(void);
551238405Sjkimint FIPS_mode_set(int r);
552194206Ssimon
553238405Sjkimvoid OPENSSL_init(void);
554194206Ssimon
555238405Sjkim#define fips_md_init(alg) fips_md_init_ctx(alg, alg)
556238405Sjkim
557238405Sjkim#ifdef OPENSSL_FIPS
558238405Sjkim#define fips_md_init_ctx(alg, cx) \
559238405Sjkim	int alg##_Init(cx##_CTX *c) \
560194206Ssimon	{ \
561238405Sjkim	if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \
562238405Sjkim		"Low level API call to digest " #alg " forbidden in FIPS mode!"); \
563238405Sjkim	return private_##alg##_Init(c); \
564238405Sjkim	} \
565238405Sjkim	int private_##alg##_Init(cx##_CTX *c)
566194206Ssimon
567238405Sjkim#define fips_cipher_abort(alg) \
568238405Sjkim	if (FIPS_mode()) OpenSSLDie(__FILE__, __LINE__, \
569238405Sjkim		"Low level API call to cipher " #alg " forbidden in FIPS mode!")
570194206Ssimon
571194206Ssimon#else
572238405Sjkim#define fips_md_init_ctx(alg, cx) \
573238405Sjkim	int alg##_Init(cx##_CTX *c)
574238405Sjkim#define fips_cipher_abort(alg) while(0)
575238405Sjkim#endif
576194206Ssimon
577246772Sjkim/* CRYPTO_memcmp returns zero iff the |len| bytes at |a| and |b| are equal. It
578246772Sjkim * takes an amount of time dependent on |len|, but independent of the contents
579246772Sjkim * of |a| and |b|. Unlike memcmp, it cannot be used to put elements into a
580246772Sjkim * defined order as the return value when a != b is undefined, other than to be
581246772Sjkim * non-zero. */
582246772Sjkimint CRYPTO_memcmp(const void *a, const void *b, size_t len);
583246772Sjkim
58455714Skris/* BEGIN ERROR CODES */
58555714Skris/* The following lines are auto generated by the script mkerr.pl. Any changes
58655714Skris * made after this point may be overwritten when the script is next run.
58755714Skris */
58889837Skrisvoid ERR_load_CRYPTO_strings(void);
58955714Skris
59055714Skris/* Error codes for the CRYPTO functions. */
59155714Skris
59255714Skris/* Function codes. */
59355714Skris#define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX		 100
59468651Skris#define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID		 103
59555714Skris#define CRYPTO_F_CRYPTO_GET_NEW_LOCKID			 101
59655714Skris#define CRYPTO_F_CRYPTO_SET_EX_DATA			 102
597109998Smarkm#define CRYPTO_F_DEF_ADD_INDEX				 104
598109998Smarkm#define CRYPTO_F_DEF_GET_CLASS				 105
599238405Sjkim#define CRYPTO_F_FIPS_MODE_SET				 109
600109998Smarkm#define CRYPTO_F_INT_DUP_EX_DATA			 106
601109998Smarkm#define CRYPTO_F_INT_FREE_EX_DATA			 107
602109998Smarkm#define CRYPTO_F_INT_NEW_EX_DATA			 108
60355714Skris
60455714Skris/* Reason codes. */
605238405Sjkim#define CRYPTO_R_FIPS_MODE_NOT_SUPPORTED		 101
60668651Skris#define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK		 100
60755714Skris
60855714Skris#ifdef  __cplusplus
60955714Skris}
61055714Skris#endif
61155714Skris#endif
612