Home | History | Annotate | Download | only in err
      1 /* crypto/err/err.h */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) cryptsoft.com).
      7  * The implementation was written so as to conform with Netscapes SSL.
      8  *
      9  * This library is free for commercial and non-commercial use as long as
     10  * the following conditions are aheared to.  The following conditions
     11  * apply to all code found in this distribution, be it the RC4, RSA,
     12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
     13  * included with this distribution is covered by the same copyright terms
     14  * except that the holder is Tim Hudson (tjh (at) cryptsoft.com).
     15  *
     16  * Copyright remains Eric Young's, and as such any Copyright notices in
     17  * the code are not to be removed.
     18  * If this package is used in a product, Eric Young should be given attribution
     19  * as the author of the parts of the library used.
     20  * This can be in the form of a textual message at program startup or
     21  * in documentation (online or textual) provided with the package.
     22  *
     23  * Redistribution and use in source and binary forms, with or without
     24  * modification, are permitted provided that the following conditions
     25  * are met:
     26  * 1. Redistributions of source code must retain the copyright
     27  *    notice, this list of conditions and the following disclaimer.
     28  * 2. Redistributions in binary form must reproduce the above copyright
     29  *    notice, this list of conditions and the following disclaimer in the
     30  *    documentation and/or other materials provided with the distribution.
     31  * 3. All advertising materials mentioning features or use of this software
     32  *    must display the following acknowledgement:
     33  *    "This product includes cryptographic software written by
     34  *     Eric Young (eay (at) cryptsoft.com)"
     35  *    The word 'cryptographic' can be left out if the rouines from the library
     36  *    being used are not cryptographic related :-).
     37  * 4. If you include any Windows specific code (or a derivative thereof) from
     38  *    the apps directory (application code) you must include an acknowledgement:
     39  *    "This product includes software written by Tim Hudson (tjh (at) cryptsoft.com)"
     40  *
     41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
     42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     51  * SUCH DAMAGE.
     52  *
     53  * The licence and distribution terms for any publically available version or
     54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
     55  * copied and put under another distribution licence
     56  * [including the GNU Public Licence.]
     57  */
     58 /* ====================================================================
     59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
     60  *
     61  * Redistribution and use in source and binary forms, with or without
     62  * modification, are permitted provided that the following conditions
     63  * are met:
     64  *
     65  * 1. Redistributions of source code must retain the above copyright
     66  *    notice, this list of conditions and the following disclaimer.
     67  *
     68  * 2. Redistributions in binary form must reproduce the above copyright
     69  *    notice, this list of conditions and the following disclaimer in
     70  *    the documentation and/or other materials provided with the
     71  *    distribution.
     72  *
     73  * 3. All advertising materials mentioning features or use of this
     74  *    software must display the following acknowledgment:
     75  *    "This product includes software developed by the OpenSSL Project
     76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     77  *
     78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     79  *    endorse or promote products derived from this software without
     80  *    prior written permission. For written permission, please contact
     81  *    openssl-core (at) openssl.org.
     82  *
     83  * 5. Products derived from this software may not be called "OpenSSL"
     84  *    nor may "OpenSSL" appear in their names without prior written
     85  *    permission of the OpenSSL Project.
     86  *
     87  * 6. Redistributions of any form whatsoever must retain the following
     88  *    acknowledgment:
     89  *    "This product includes software developed by the OpenSSL Project
     90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     91  *
     92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    103  * OF THE POSSIBILITY OF SUCH DAMAGE.
    104  * ====================================================================
    105  *
    106  * This product includes cryptographic software written by Eric Young
    107  * (eay (at) cryptsoft.com).  This product includes software written by Tim
    108  * Hudson (tjh (at) cryptsoft.com).
    109  *
    110  */
    111 
    112 #ifndef HEADER_ERR_H
    113 #define HEADER_ERR_H
    114 
    115 #include <openssl/e_os2.h>
    116 
    117 #ifndef OPENSSL_NO_FP_API
    118 #include <stdio.h>
    119 #include <stdlib.h>
    120 #endif
    121 
    122 #include <openssl/ossl_typ.h>
    123 #ifndef OPENSSL_NO_BIO
    124 #include <openssl/bio.h>
    125 #endif
    126 #ifndef OPENSSL_NO_LHASH
    127 #include <openssl/lhash.h>
    128 #endif
    129 
    130 #ifdef	__cplusplus
    131 extern "C" {
    132 #endif
    133 
    134 #ifndef OPENSSL_NO_ERR
    135 #define ERR_PUT_error(a,b,c,d,e)	ERR_put_error(a,b,c,d,e)
    136 #else
    137 #define ERR_PUT_error(a,b,c,d,e)	ERR_put_error(a,b,c,NULL,0)
    138 #endif
    139 
    140 #include <errno.h>
    141 
    142 #define ERR_TXT_MALLOCED	0x01
    143 #define ERR_TXT_STRING		0x02
    144 
    145 #define ERR_FLAG_MARK		0x01
    146 
    147 #define ERR_NUM_ERRORS	16
    148 typedef struct err_state_st
    149 	{
    150 	CRYPTO_THREADID tid;
    151 	int err_flags[ERR_NUM_ERRORS];
    152 	unsigned long err_buffer[ERR_NUM_ERRORS];
    153 	char *err_data[ERR_NUM_ERRORS];
    154 	int err_data_flags[ERR_NUM_ERRORS];
    155 	const char *err_file[ERR_NUM_ERRORS];
    156 	int err_line[ERR_NUM_ERRORS];
    157 	int top,bottom;
    158 	} ERR_STATE;
    159 
    160 /* library */
    161 #define ERR_LIB_NONE		1
    162 #define ERR_LIB_SYS		2
    163 #define ERR_LIB_BN		3
    164 #define ERR_LIB_RSA		4
    165 #define ERR_LIB_DH		5
    166 #define ERR_LIB_EVP		6
    167 #define ERR_LIB_BUF		7
    168 #define ERR_LIB_OBJ		8
    169 #define ERR_LIB_PEM		9
    170 #define ERR_LIB_DSA		10
    171 #define ERR_LIB_X509		11
    172 /* #define ERR_LIB_METH         12 */
    173 #define ERR_LIB_ASN1		13
    174 #define ERR_LIB_CONF		14
    175 #define ERR_LIB_CRYPTO		15
    176 #define ERR_LIB_EC		16
    177 #define ERR_LIB_SSL		20
    178 /* #define ERR_LIB_SSL23        21 */
    179 /* #define ERR_LIB_SSL2         22 */
    180 /* #define ERR_LIB_SSL3         23 */
    181 /* #define ERR_LIB_RSAREF       30 */
    182 /* #define ERR_LIB_PROXY        31 */
    183 #define ERR_LIB_BIO		32
    184 #define ERR_LIB_PKCS7		33
    185 #define ERR_LIB_X509V3		34
    186 #define ERR_LIB_PKCS12		35
    187 #define ERR_LIB_RAND		36
    188 #define ERR_LIB_DSO		37
    189 #define ERR_LIB_ENGINE		38
    190 #define ERR_LIB_OCSP            39
    191 #define ERR_LIB_UI              40
    192 #define ERR_LIB_COMP            41
    193 #define ERR_LIB_ECDSA		42
    194 #define ERR_LIB_ECDH		43
    195 #define ERR_LIB_STORE           44
    196 #define ERR_LIB_FIPS		45
    197 #define ERR_LIB_CMS		46
    198 #define ERR_LIB_TS		47
    199 #define ERR_LIB_HMAC		48
    200 #define ERR_LIB_JPAKE		49
    201 
    202 #define ERR_LIB_USER		128
    203 
    204 #define SYSerr(f,r)  ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__)
    205 #define BNerr(f,r)   ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__)
    206 #define RSAerr(f,r)  ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__)
    207 #define DHerr(f,r)   ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__)
    208 #define EVPerr(f,r)  ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__)
    209 #define BUFerr(f,r)  ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__)
    210 #define OBJerr(f,r)  ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__)
    211 #define PEMerr(f,r)  ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__)
    212 #define DSAerr(f,r)  ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__)
    213 #define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__)
    214 #define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__)
    215 #define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__)
    216 #define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__)
    217 #define ECerr(f,r)   ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__)
    218 #define SSLerr(f,r)  ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__)
    219 #define BIOerr(f,r)  ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__)
    220 #define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__)
    221 #define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__)
    222 #define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__)
    223 #define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__)
    224 #define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__)
    225 #define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__)
    226 #define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__)
    227 #define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__)
    228 #define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__)
    229 #define ECDSAerr(f,r)  ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__)
    230 #define ECDHerr(f,r)  ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__)
    231 #define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__)
    232 #define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__)
    233 #define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__)
    234 #define TSerr(f,r) ERR_PUT_error(ERR_LIB_TS,(f),(r),__FILE__,__LINE__)
    235 #define HMACerr(f,r) ERR_PUT_error(ERR_LIB_HMAC,(f),(r),__FILE__,__LINE__)
    236 #define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__)
    237 
    238 /* Borland C seems too stupid to be able to shift and do longs in
    239  * the pre-processor :-( */
    240 #define ERR_PACK(l,f,r)		(((((unsigned long)l)&0xffL)*0x1000000)| \
    241 				((((unsigned long)f)&0xfffL)*0x1000)| \
    242 				((((unsigned long)r)&0xfffL)))
    243 #define ERR_GET_LIB(l)		(int)((((unsigned long)l)>>24L)&0xffL)
    244 #define ERR_GET_FUNC(l)		(int)((((unsigned long)l)>>12L)&0xfffL)
    245 #define ERR_GET_REASON(l)	(int)((l)&0xfffL)
    246 #define ERR_FATAL_ERROR(l)	(int)((l)&ERR_R_FATAL)
    247 
    248 
    249 /* OS functions */
    250 #define SYS_F_FOPEN		1
    251 #define SYS_F_CONNECT		2
    252 #define SYS_F_GETSERVBYNAME	3
    253 #define SYS_F_SOCKET		4
    254 #define SYS_F_IOCTLSOCKET	5
    255 #define SYS_F_BIND		6
    256 #define SYS_F_LISTEN		7
    257 #define SYS_F_ACCEPT		8
    258 #define SYS_F_WSASTARTUP	9 /* Winsock stuff */
    259 #define SYS_F_OPENDIR		10
    260 #define SYS_F_FREAD		11
    261 
    262 
    263 /* reasons */
    264 #define ERR_R_SYS_LIB	ERR_LIB_SYS       /* 2 */
    265 #define ERR_R_BN_LIB	ERR_LIB_BN        /* 3 */
    266 #define ERR_R_RSA_LIB	ERR_LIB_RSA       /* 4 */
    267 #define ERR_R_DH_LIB	ERR_LIB_DH        /* 5 */
    268 #define ERR_R_EVP_LIB	ERR_LIB_EVP       /* 6 */
    269 #define ERR_R_BUF_LIB	ERR_LIB_BUF       /* 7 */
    270 #define ERR_R_OBJ_LIB	ERR_LIB_OBJ       /* 8 */
    271 #define ERR_R_PEM_LIB	ERR_LIB_PEM       /* 9 */
    272 #define ERR_R_DSA_LIB	ERR_LIB_DSA      /* 10 */
    273 #define ERR_R_X509_LIB	ERR_LIB_X509     /* 11 */
    274 #define ERR_R_ASN1_LIB	ERR_LIB_ASN1     /* 13 */
    275 #define ERR_R_CONF_LIB	ERR_LIB_CONF     /* 14 */
    276 #define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO  /* 15 */
    277 #define ERR_R_EC_LIB	ERR_LIB_EC       /* 16 */
    278 #define ERR_R_SSL_LIB	ERR_LIB_SSL      /* 20 */
    279 #define ERR_R_BIO_LIB	ERR_LIB_BIO      /* 32 */
    280 #define ERR_R_PKCS7_LIB	ERR_LIB_PKCS7    /* 33 */
    281 #define ERR_R_X509V3_LIB ERR_LIB_X509V3  /* 34 */
    282 #define ERR_R_PKCS12_LIB ERR_LIB_PKCS12  /* 35 */
    283 #define ERR_R_RAND_LIB	ERR_LIB_RAND     /* 36 */
    284 #define ERR_R_DSO_LIB	ERR_LIB_DSO      /* 37 */
    285 #define ERR_R_ENGINE_LIB ERR_LIB_ENGINE  /* 38 */
    286 #define ERR_R_OCSP_LIB  ERR_LIB_OCSP     /* 39 */
    287 #define ERR_R_UI_LIB    ERR_LIB_UI       /* 40 */
    288 #define ERR_R_COMP_LIB	ERR_LIB_COMP     /* 41 */
    289 #define ERR_R_ECDSA_LIB ERR_LIB_ECDSA	 /* 42 */
    290 #define ERR_R_ECDH_LIB  ERR_LIB_ECDH	 /* 43 */
    291 #define ERR_R_STORE_LIB ERR_LIB_STORE    /* 44 */
    292 #define ERR_R_TS_LIB	ERR_LIB_TS       /* 45 */
    293 
    294 #define ERR_R_NESTED_ASN1_ERROR			58
    295 #define ERR_R_BAD_ASN1_OBJECT_HEADER		59
    296 #define ERR_R_BAD_GET_ASN1_OBJECT_CALL		60
    297 #define ERR_R_EXPECTING_AN_ASN1_SEQUENCE	61
    298 #define ERR_R_ASN1_LENGTH_MISMATCH		62
    299 #define ERR_R_MISSING_ASN1_EOS			63
    300 
    301 /* fatal error */
    302 #define ERR_R_FATAL				64
    303 #define	ERR_R_MALLOC_FAILURE			(1|ERR_R_FATAL)
    304 #define	ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED	(2|ERR_R_FATAL)
    305 #define	ERR_R_PASSED_NULL_PARAMETER		(3|ERR_R_FATAL)
    306 #define	ERR_R_INTERNAL_ERROR			(4|ERR_R_FATAL)
    307 #define	ERR_R_DISABLED				(5|ERR_R_FATAL)
    308 
    309 /* 99 is the maximum possible ERR_R_... code, higher values
    310  * are reserved for the individual libraries */
    311 
    312 
    313 typedef struct ERR_string_data_st
    314 	{
    315 	unsigned long error;
    316 	const char *string;
    317 	} ERR_STRING_DATA;
    318 
    319 void ERR_put_error(int lib, int func,int reason,const char *file,int line);
    320 void ERR_set_error_data(char *data,int flags);
    321 
    322 unsigned long ERR_get_error(void);
    323 unsigned long ERR_get_error_line(const char **file,int *line);
    324 unsigned long ERR_get_error_line_data(const char **file,int *line,
    325 				      const char **data, int *flags);
    326 unsigned long ERR_peek_error(void);
    327 unsigned long ERR_peek_error_line(const char **file,int *line);
    328 unsigned long ERR_peek_error_line_data(const char **file,int *line,
    329 				       const char **data,int *flags);
    330 unsigned long ERR_peek_last_error(void);
    331 unsigned long ERR_peek_last_error_line(const char **file,int *line);
    332 unsigned long ERR_peek_last_error_line_data(const char **file,int *line,
    333 				       const char **data,int *flags);
    334 void ERR_clear_error(void );
    335 char *ERR_error_string(unsigned long e,char *buf);
    336 void ERR_error_string_n(unsigned long e, char *buf, size_t len);
    337 const char *ERR_lib_error_string(unsigned long e);
    338 const char *ERR_func_error_string(unsigned long e);
    339 const char *ERR_reason_error_string(unsigned long e);
    340 void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u),
    341 			 void *u);
    342 #ifndef OPENSSL_NO_FP_API
    343 void ERR_print_errors_fp(FILE *fp);
    344 #endif
    345 #ifndef OPENSSL_NO_BIO
    346 void ERR_print_errors(BIO *bp);
    347 void ERR_add_error_data(int num, ...);
    348 #endif
    349 void ERR_load_strings(int lib,ERR_STRING_DATA str[]);
    350 void ERR_unload_strings(int lib,ERR_STRING_DATA str[]);
    351 void ERR_load_ERR_strings(void);
    352 void ERR_load_crypto_strings(void);
    353 void ERR_free_strings(void);
    354 
    355 void ERR_remove_thread_state(const CRYPTO_THREADID *tid);
    356 #ifndef OPENSSL_NO_DEPRECATED
    357 void ERR_remove_state(unsigned long pid); /* if zero we look it up */
    358 #endif
    359 ERR_STATE *ERR_get_state(void);
    360 
    361 #ifndef OPENSSL_NO_LHASH
    362 LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void);
    363 LHASH_OF(ERR_STATE) *ERR_get_err_state_table(void);
    364 void ERR_release_err_state_table(LHASH_OF(ERR_STATE) **hash);
    365 #endif
    366 
    367 int ERR_get_next_error_library(void);
    368 
    369 int ERR_set_mark(void);
    370 int ERR_pop_to_mark(void);
    371 
    372 /* Already defined in ossl_typ.h */
    373 /* typedef struct st_ERR_FNS ERR_FNS; */
    374 /* An application can use this function and provide the return value to loaded
    375  * modules that should use the application's ERR state/functionality */
    376 const ERR_FNS *ERR_get_implementation(void);
    377 /* A loaded module should call this function prior to any ERR operations using
    378  * the application's "ERR_FNS". */
    379 int ERR_set_implementation(const ERR_FNS *fns);
    380 
    381 #ifdef	__cplusplus
    382 }
    383 #endif
    384 
    385 #endif
    386