X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fcrypto.h;h=aee1899a253650d3f893643050c1f000e67a9ebe;hp=0a38b5b87ca2298a26a2985abb33161663f35a36;hb=0c109ea2cbf3f2ba027fb45c744fb52f7a3f0009;hpb=78414a6a897db42c9bcf06aa21c705811ab33921 diff --git a/crypto/crypto.h b/crypto/crypto.h index 0a38b5b87c..aee1899a25 100644 --- a/crypto/crypto.h +++ b/crypto/crypto.h @@ -59,20 +59,38 @@ #ifndef HEADER_CRYPTO_H #define HEADER_CRYPTO_H +#include + +#ifndef NO_FP_API +#include +#endif + +#include +#include +#include + +#ifdef CHARSET_EBCDIC +#include +#endif + +#if defined(VMS) || defined(__VMS) +#include "vms_idhacks.h" +#endif + + #ifdef __cplusplus extern "C" { #endif -#include "stack.h" - +/* Backward compatibility to SSLeay */ /* This is more to be used to check the correct DLL is being used * in the MS world. */ -#define SSLEAY_VERSION_NUMBER 0x0902 /* Version 0.5.1c would be 0513 */ - +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER #define SSLEAY_VERSION 0 /* #define SSLEAY_OPTIONS 1 no longer supported */ #define SSLEAY_CFLAGS 2 #define SSLEAY_BUILT_ON 3 +#define SSLEAY_PLATFORM 4 /* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock * names in cryptlib.c @@ -92,19 +110,26 @@ extern "C" { #define CRYPTO_LOCK_SSL_CTX 12 #define CRYPTO_LOCK_SSL_CERT 13 #define CRYPTO_LOCK_SSL_SESSION 14 -#define CRYPTO_LOCK_SSL 15 -#define CRYPTO_LOCK_RAND 16 -#define CRYPTO_LOCK_MALLOC 17 -#define CRYPTO_LOCK_BIO 18 -#define CRYPTO_LOCK_BIO_GETHOSTBYNAME 19 -#define CRYPTO_LOCK_RSA_BLINDING 20 -#define CRYPTO_NUM_LOCKS 21 +#define CRYPTO_LOCK_SSL_SESS_CERT 15 +#define CRYPTO_LOCK_SSL 16 +#define CRYPTO_LOCK_RAND 17 +#define CRYPTO_LOCK_MALLOC 18 +#define CRYPTO_LOCK_BIO 19 +#define CRYPTO_LOCK_GETHOSTBYNAME 20 +#define CRYPTO_LOCK_GETSERVBYNAME 21 +#define CRYPTO_LOCK_READDIR 22 +#define CRYPTO_LOCK_RSA_BLINDING 23 +#define CRYPTO_LOCK_DH 24 +#define CRYPTO_LOCK_MALLOC2 25 +#define CRYPTO_LOCK_DSO 26 +#define CRYPTO_NUM_LOCKS 27 #define CRYPTO_LOCK 1 #define CRYPTO_UNLOCK 2 #define CRYPTO_READ 4 #define CRYPTO_WRITE 8 +#ifndef NO_LOCKING #ifndef CRYPTO_w_lock #define CRYPTO_w_lock(type) \ CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) @@ -116,23 +141,33 @@ extern "C" { CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) #define CRYPTO_add(addr,amount,type) \ CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) - +#endif +#else +#define CRYPTO_w_lock(a) +#define CRYPTO_w_unlock(a) +#define CRYPTO_r_lock(a) +#define CRYPTO_r_unlock(a) +#define CRYPTO_add(a,b,c) ((*(a))+=(b)) #endif /* The following can be used to detect memory leaks in the SSLeay library. * It used, it turns on malloc checking */ -#define CRYPTO_MEM_CHECK_OFF 0x0 -#define CRYPTO_MEM_CHECK_ON 0x1 +#define CRYPTO_MEM_CHECK_OFF 0x0 /* an enume */ +#define CRYPTO_MEM_CHECK_ON 0x1 /* a bit */ +#define CRYPTO_MEM_CHECK_ENABLE 0x2 /* a bit */ +#define CRYPTO_MEM_CHECK_DISABLE 0x3 /* an enume */ + +/* The following are bit values to turn on or off options connected to the + * malloc checking functionality */ + +/* Adds time to the memory checking information */ +#define V_CRYPTO_MDEBUG_TIME 0x1 /* a bit */ +/* Adds thread number to the memory checking information */ +#define V_CRYPTO_MDEBUG_THREAD 0x2 /* a bit */ + +#define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) -/* -typedef struct crypto_mem_st - { - char *(*malloc_func)(); - char *(*realloc_func)(); - void (*free_func)(); - } CRYPTO_MEM_FUNC; -*/ /* predec of the BIO type */ typedef struct bio_st BIO_dummy; @@ -143,24 +178,30 @@ typedef struct crypto_ex_data_st int dummy; /* gcc is screwing up this data structure :-( */ } CRYPTO_EX_DATA; +/* Called when a new object is created */ +typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when an object is free()ed */ +typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, + int idx, long argl, void *argp); +/* Called when we need to dup an object */ +typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, + int idx, long argl, void *argp); + /* This stuff is basically class callback functions - * The current classes are SSL_CTX, SSL, SSL_SESION, and a few more */ + * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */ + typedef struct crypto_ex_data_func_st { long argl; /* Arbitary long */ - char *argp; /* Arbitary char * */ - /* Called when a new object is created */ - int (*new_func)(/*char *obj, - char *item,int index,long argl,char *argp*/); - /* Called when this object is free()ed */ - void (*free_func)(/*char *obj, - char *item,int index,long argl,char *argp*/); - - /* Called when we need to dup this one */ - int (*dup_func)(/*char *obj_to,char *obj_from, - char **new,int index,long argl,char *argp*/); + void *argp; /* Arbitary void * */ + CRYPTO_EX_new *new_func; + CRYPTO_EX_free *free_func; + CRYPTO_EX_dup *dup_func; } CRYPTO_EX_DATA_FUNCS; +DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) + /* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA * entry. */ @@ -172,137 +213,159 @@ typedef struct crypto_ex_data_func_st #define CRYPTO_EX_INDEX_X509_STORE 4 #define CRYPTO_EX_INDEX_X509_STORE_CTX 5 -/* Use this for win32 DLL's */ + +/* This is the default callbacks, but we can have others as well: + * this is needed in Win32 where the application malloc and the + * library malloc may not be the same. + */ #define CRYPTO_malloc_init() CRYPTO_set_mem_functions(\ - (char *(*)())malloc,\ - (char *(*)())realloc,\ - (void (*)())free) + malloc, realloc, free) -#ifdef CRYPTO_MDEBUG -#define Malloc(num) CRYPTO_dbg_malloc((int)num,__FILE__,__LINE__) +#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD +# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ +# define CRYPTO_MDEBUG +# endif +#endif + +/* Set standard debugging functions (not done by default + * unless CRYPTO_MDEBUG is defined) */ +#define CRYPTO_malloc_debug_init() do {\ + CRYPTO_set_mem_debug_functions(\ + (void (*)())CRYPTO_dbg_malloc,\ + (void (*)())CRYPTO_dbg_realloc,\ + (void (*)())CRYPTO_dbg_free,\ + (void (*)())CRYPTO_dbg_set_options,\ + (long (*)())CRYPTO_dbg_get_options);\ + } while(0) + +int CRYPTO_mem_ctrl(int mode); +int CRYPTO_is_mem_check_on(void); + +/* for applications */ +#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) +#define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) + +/* for library-internal use */ +#define MemCheck_on() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) +#define MemCheck_off() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) +#define is_MemCheck_on() CRYPTO_is_mem_check_on() + +#define Malloc(num) CRYPTO_malloc((int)num,__FILE__,__LINE__) #define Realloc(addr,num) \ - CRYPTO_dbg_realloc((char *)addr,(int)num,__FILE__,__LINE__) + CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) #define Remalloc(addr,num) \ - CRYPTO_dbg_remalloc((char **)addr,(int)num,__FILE__,__LINE__) -#define FreeFunc CRYPTO_dbg_free -#define Free(addr) CRYPTO_dbg_free((char *)(addr)) -#else -#define Remalloc CRYPTO_remalloc -#if defined(WIN32) || defined(MFUNC) -#define Malloc CRYPTO_malloc -#define Realloc(a,n) CRYPTO_realloc((char *)(a),(n)) + CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) #define FreeFunc CRYPTO_free -#define Free(addr) CRYPTO_free((char *)(addr)) -#else -#define Malloc malloc -#define Realloc realloc -#define FreeFunc free -#define Free(addr) free((char *)(addr)) -#endif /* WIN32 || MFUNC */ -#endif /* MDEBUG */ +#define Free(addr) CRYPTO_free(addr) + +#define Malloc_locked(num) CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) +#define Free_locked(addr) CRYPTO_free_locked(addr) + /* Case insensiteve linking causes problems.... */ -#ifdef WIN16 +#if defined(WIN16) || defined(VMS) #define ERR_load_CRYPTO_strings ERR_load_CRYPTOlib_strings #endif -#ifndef NOPROTO -char *SSLeay_version(int type); +const char *SSLeay_version(int type); unsigned long SSLeay(void); -int CRYPTO_get_ex_new_index(int idx,STACK **sk,long argl,char *argp, - int (*new_func)(),int (*dup_func)(),void (*free_func)()); -int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad,int idx,char *val); -char *CRYPTO_get_ex_data(CRYPTO_EX_DATA *ad,int idx); -int CRYPTO_dup_ex_data(STACK *meth,CRYPTO_EX_DATA *from,CRYPTO_EX_DATA *to); -void CRYPTO_free_ex_data(STACK *meth,char *obj,CRYPTO_EX_DATA *ad); -void CRYPTO_new_ex_data(STACK *meth, char *obj, CRYPTO_EX_DATA *ad); +int CRYPTO_get_ex_new_index(int idx, STACK_OF(CRYPTO_EX_DATA_FUNCS) **skp, long argl, void *argp, + CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func); +int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); +void *CRYPTO_get_ex_data(CRYPTO_EX_DATA *ad,int idx); +int CRYPTO_dup_ex_data(STACK_OF(CRYPTO_EX_DATA_FUNCS) *meth, CRYPTO_EX_DATA *to, + CRYPTO_EX_DATA *from); +void CRYPTO_free_ex_data(STACK_OF(CRYPTO_EX_DATA_FUNCS) *meth, void *obj, CRYPTO_EX_DATA *ad); +void CRYPTO_new_ex_data(STACK_OF(CRYPTO_EX_DATA_FUNCS) *meth, void *obj, CRYPTO_EX_DATA *ad); -int CRYPTO_mem_ctrl(int mode); int CRYPTO_get_new_lockid(char *name); -void CRYPTO_lock(int mode, int type,char *file,int line); -void CRYPTO_set_locking_callback(void (*func)(int mode,int type,char *file, - int line)); -void (*CRYPTO_get_locking_callback(void))(int mode,int type,char *file, + +int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ +void CRYPTO_lock(int mode, int type,const char *file,int line); +void CRYPTO_set_locking_callback(void (*func)(int mode,int type, + const char *file,int line)); +void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, int line); -void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount, - int type,char *file, int line)); -int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount, - int type,char *file,int line); +void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type, + const char *file, int line)); +int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type, + const char *file,int line); void CRYPTO_set_id_callback(unsigned long (*func)(void)); unsigned long (*CRYPTO_get_id_callback(void))(void); unsigned long CRYPTO_thread_id(void); -char *CRYPTO_get_lock_name(int type); -int CRYPTO_add_lock(int *pointer,int amount,int type, char *file,int line); - -void CRYPTO_set_mem_functions(char *(*m)(),char *(*r)(), void (*free_func)()); -void CRYPTO_get_mem_functions(char *(**m)(),char *(**r)(), void (**f)()); +const char *CRYPTO_get_lock_name(int type); +int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, + int line); + +/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- + * call the latter last if you need different functions */ +int CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *)); +int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *)); +int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int), + void (*r)(void *,void *,int,const char *,int,int), + void (*f)(void *,int), + void (*so)(long), + long (*go)(void)); +void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *)); +void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); +void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int), + void (**r)(void *,void *,int,const char *,int,int), + void (**f)(void *,int), + void (**so)(long), + long (**go)(void)); + +void *CRYPTO_malloc_locked(int num, const char *file, int line); +void CRYPTO_free_locked(void *); +void *CRYPTO_malloc(int num, const char *file, int line); +void CRYPTO_free(void *); +void *CRYPTO_realloc(void *addr,int num, const char *file, int line); +void *CRYPTO_remalloc(void *addr,int num, const char *file, int line); + +void CRYPTO_set_mem_debug_options(long bits); +long CRYPTO_get_mem_debug_options(void); + +#define CRYPTO_push_info(info) \ + CRYPTO_push_info_(info, __FILE__, __LINE__); +int CRYPTO_push_info_(const char *info, const char *file, int line); +int CRYPTO_pop_info(void); +int CRYPTO_remove_all_info(void); + +/* The last argument has the following significance: + * + * 0: called before the actual memory allocation has taken place + * 1: called after the actual memory allocation has taken place + */ +void CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p); +void CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p); +void CRYPTO_dbg_free(void *addr,int before_p); -char *CRYPTO_malloc(int num); -char *CRYPTO_realloc(char *addr,int num); -void CRYPTO_free(char *); -char *CRYPTO_remalloc(char *addr,int num); +/* Tell the debugging code about options. By default, the following values + * apply: + * + * 0: Clear all options. + * 1: Set the "Show Time" option. + * 2: Set the "Show Thread Number" option. + * 3: 1 + 2 + */ +void CRYPTO_dbg_set_options(long bits); +long CRYPTO_dbg_get_options(void); -char *CRYPTO_dbg_malloc(int num,char *file,int line); -char *CRYPTO_dbg_realloc(char *addr,int num,char *file,int line); -void CRYPTO_dbg_free(char *); -char *CRYPTO_dbg_remalloc(char *addr,int num,char *file,int line); #ifndef NO_FP_API void CRYPTO_mem_leaks_fp(FILE *); #endif void CRYPTO_mem_leaks(struct bio_st *bio); /* unsigned long order, char *file, int line, int num_bytes, char *addr */ -void CRYPTO_mem_leaks_cb(void (*cb)()); - -void ERR_load_CRYPTO_strings(void ); - -#else - -int CRYPTO_get_ex_new_index(); -int CRYPTO_set_ex_data(); -char *CRYPTO_get_ex_data(); -int CRYPTO_dup_ex_data(); -void CRYPTO_free_ex_data(); -void CRYPTO_new_ex_data(); - -int CRYPTO_mem_ctrl(); -char *SSLeay_version(); -unsigned long SSLeay(); - -int CRYPTO_get_new_lockid(); -void CRYPTO_lock(); -void CRYPTO_set_locking_callback(); -void (*CRYPTO_get_locking_callback())(); -void CRYPTO_set_add_lock_callback(); -int (*CRYPTO_get_add_lock_callback())(); -void CRYPTO_set_id_callback(); -unsigned long (*CRYPTO_get_id_callback())(); -unsigned long CRYPTO_thread_id(); -char *CRYPTO_get_lock_name(); -int CRYPTO_add_lock(); - -void CRYPTO_set_mem_functions(); -void CRYPTO_get_mem_functions(); -char *CRYPTO_malloc(); -char *CRYPTO_realloc(); -void CRYPTO_free(); -char *CRYPTO_remalloc(); -char *CRYPTO_dbg_remalloc(); -char *CRYPTO_dbg_malloc(); -char *CRYPTO_dbg_realloc(); -void CRYPTO_dbg_free(); -#ifndef NO_FP_API -void CRYPTO_mem_leaks_fp(); -#endif -void CRYPTO_mem_leaks(); -void CRYPTO_mem_leaks_cb(); - -void ERR_load_CRYPTO_strings(); +void CRYPTO_mem_leaks_cb(void (*cb)(unsigned long, const char *, int, int, void *)); -#endif +void ERR_load_CRYPTO_strings(void); /* BEGIN ERROR CODES */ +/* The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ + /* Error codes for the CRYPTO functions. */ /* Function codes. */ @@ -311,7 +374,7 @@ void ERR_load_CRYPTO_strings(); #define CRYPTO_F_CRYPTO_SET_EX_DATA 102 /* Reason codes. */ - + #ifdef __cplusplus } #endif