Home | History | Annotate | Download | only in err
      1 /* crypto/err/err_str.c */
      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-2001 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 #include <stdio.h>
    113 #include <stdarg.h>
    114 #include <string.h>
    115 #include "cryptlib.h"
    116 #include <openssl/lhash.h>
    117 #include <openssl/crypto.h>
    118 #include <openssl/buffer.h>
    119 #include <openssl/bio.h>
    120 #include <openssl/err.h>
    121 
    122 #ifndef OPENSSL_NO_ERR
    123 static ERR_STRING_DATA ERR_str_libraries[]=
    124 	{
    125 {ERR_PACK(ERR_LIB_NONE,0,0)		,"unknown library"},
    126 {ERR_PACK(ERR_LIB_SYS,0,0)		,"system library"},
    127 {ERR_PACK(ERR_LIB_BN,0,0)		,"bignum routines"},
    128 {ERR_PACK(ERR_LIB_RSA,0,0)		,"rsa routines"},
    129 {ERR_PACK(ERR_LIB_DH,0,0)		,"Diffie-Hellman routines"},
    130 {ERR_PACK(ERR_LIB_EVP,0,0)		,"digital envelope routines"},
    131 {ERR_PACK(ERR_LIB_BUF,0,0)		,"memory buffer routines"},
    132 {ERR_PACK(ERR_LIB_OBJ,0,0)		,"object identifier routines"},
    133 {ERR_PACK(ERR_LIB_PEM,0,0)		,"PEM routines"},
    134 {ERR_PACK(ERR_LIB_DSA,0,0)		,"dsa routines"},
    135 {ERR_PACK(ERR_LIB_X509,0,0)		,"x509 certificate routines"},
    136 {ERR_PACK(ERR_LIB_ASN1,0,0)		,"asn1 encoding routines"},
    137 {ERR_PACK(ERR_LIB_CONF,0,0)		,"configuration file routines"},
    138 {ERR_PACK(ERR_LIB_CRYPTO,0,0)		,"common libcrypto routines"},
    139 {ERR_PACK(ERR_LIB_EC,0,0)		,"elliptic curve routines"},
    140 {ERR_PACK(ERR_LIB_SSL,0,0)		,"SSL routines"},
    141 {ERR_PACK(ERR_LIB_BIO,0,0)		,"BIO routines"},
    142 {ERR_PACK(ERR_LIB_PKCS7,0,0)		,"PKCS7 routines"},
    143 {ERR_PACK(ERR_LIB_X509V3,0,0)		,"X509 V3 routines"},
    144 {ERR_PACK(ERR_LIB_PKCS12,0,0)		,"PKCS12 routines"},
    145 {ERR_PACK(ERR_LIB_RAND,0,0)		,"random number generator"},
    146 {ERR_PACK(ERR_LIB_DSO,0,0)		,"DSO support routines"},
    147 {ERR_PACK(ERR_LIB_ENGINE,0,0)		,"engine routines"},
    148 {ERR_PACK(ERR_LIB_OCSP,0,0)		,"OCSP routines"},
    149 {ERR_PACK(ERR_LIB_FIPS,0,0)		,"FIPS routines"},
    150 {ERR_PACK(ERR_LIB_CMS,0,0)		,"CMS routines"},
    151 {ERR_PACK(ERR_LIB_JPAKE,0,0)		,"JPAKE routines"},
    152 {0,NULL},
    153 	};
    154 
    155 static ERR_STRING_DATA ERR_str_functs[]=
    156 	{
    157 	{ERR_PACK(0,SYS_F_FOPEN,0),     	"fopen"},
    158 	{ERR_PACK(0,SYS_F_CONNECT,0),		"connect"},
    159 	{ERR_PACK(0,SYS_F_GETSERVBYNAME,0),	"getservbyname"},
    160 	{ERR_PACK(0,SYS_F_SOCKET,0),		"socket"},
    161 	{ERR_PACK(0,SYS_F_IOCTLSOCKET,0),	"ioctlsocket"},
    162 	{ERR_PACK(0,SYS_F_BIND,0),		"bind"},
    163 	{ERR_PACK(0,SYS_F_LISTEN,0),		"listen"},
    164 	{ERR_PACK(0,SYS_F_ACCEPT,0),		"accept"},
    165 #ifdef OPENSSL_SYS_WINDOWS
    166 	{ERR_PACK(0,SYS_F_WSASTARTUP,0),	"WSAstartup"},
    167 #endif
    168 	{ERR_PACK(0,SYS_F_OPENDIR,0),		"opendir"},
    169 	{ERR_PACK(0,SYS_F_FREAD,0),		"fread"},
    170 	{0,NULL},
    171 	};
    172 
    173 static ERR_STRING_DATA ERR_str_reasons[]=
    174 	{
    175 {ERR_R_SYS_LIB				,"system lib"},
    176 {ERR_R_BN_LIB				,"BN lib"},
    177 {ERR_R_RSA_LIB				,"RSA lib"},
    178 {ERR_R_DH_LIB				,"DH lib"},
    179 {ERR_R_EVP_LIB				,"EVP lib"},
    180 {ERR_R_BUF_LIB				,"BUF lib"},
    181 {ERR_R_OBJ_LIB				,"OBJ lib"},
    182 {ERR_R_PEM_LIB				,"PEM lib"},
    183 {ERR_R_DSA_LIB				,"DSA lib"},
    184 {ERR_R_X509_LIB				,"X509 lib"},
    185 {ERR_R_ASN1_LIB				,"ASN1 lib"},
    186 {ERR_R_CONF_LIB				,"CONF lib"},
    187 {ERR_R_CRYPTO_LIB			,"CRYPTO lib"},
    188 {ERR_R_EC_LIB				,"EC lib"},
    189 {ERR_R_SSL_LIB				,"SSL lib"},
    190 {ERR_R_BIO_LIB				,"BIO lib"},
    191 {ERR_R_PKCS7_LIB			,"PKCS7 lib"},
    192 {ERR_R_X509V3_LIB			,"X509V3 lib"},
    193 {ERR_R_PKCS12_LIB			,"PKCS12 lib"},
    194 {ERR_R_RAND_LIB				,"RAND lib"},
    195 {ERR_R_DSO_LIB				,"DSO lib"},
    196 {ERR_R_ENGINE_LIB			,"ENGINE lib"},
    197 {ERR_R_OCSP_LIB				,"OCSP lib"},
    198 
    199 {ERR_R_NESTED_ASN1_ERROR		,"nested asn1 error"},
    200 {ERR_R_BAD_ASN1_OBJECT_HEADER		,"bad asn1 object header"},
    201 {ERR_R_BAD_GET_ASN1_OBJECT_CALL		,"bad get asn1 object call"},
    202 {ERR_R_EXPECTING_AN_ASN1_SEQUENCE	,"expecting an asn1 sequence"},
    203 {ERR_R_ASN1_LENGTH_MISMATCH		,"asn1 length mismatch"},
    204 {ERR_R_MISSING_ASN1_EOS			,"missing asn1 eos"},
    205 
    206 {ERR_R_FATAL                            ,"fatal"},
    207 {ERR_R_MALLOC_FAILURE			,"malloc failure"},
    208 {ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED	,"called a function you should not call"},
    209 {ERR_R_PASSED_NULL_PARAMETER		,"passed a null parameter"},
    210 {ERR_R_INTERNAL_ERROR			,"internal error"},
    211 {ERR_R_DISABLED				,"called a function that was disabled at compile-time"},
    212 
    213 {0,NULL},
    214 	};
    215 #endif
    216 
    217 #ifndef OPENSSL_NO_ERR
    218 #define NUM_SYS_STR_REASONS 127
    219 #define LEN_SYS_STR_REASON 32
    220 
    221 static ERR_STRING_DATA SYS_str_reasons[NUM_SYS_STR_REASONS + 1];
    222 /* SYS_str_reasons is filled with copies of strerror() results at
    223  * initialization.
    224  * 'errno' values up to 127 should cover all usual errors,
    225  * others will be displayed numerically by ERR_error_string.
    226  * It is crucial that we have something for each reason code
    227  * that occurs in ERR_str_reasons, or bogus reason strings
    228  * will be returned for SYSerr, which always gets an errno
    229  * value and never one of those 'standard' reason codes. */
    230 
    231 static void build_SYS_str_reasons(void)
    232 	{
    233 	/* OPENSSL_malloc cannot be used here, use static storage instead */
    234 	static char strerror_tab[NUM_SYS_STR_REASONS][LEN_SYS_STR_REASON];
    235 	int i;
    236 	static int init = 1;
    237 
    238 	CRYPTO_r_lock(CRYPTO_LOCK_ERR);
    239 	if (!init)
    240 		{
    241 		CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
    242 		return;
    243 		}
    244 
    245 	CRYPTO_r_unlock(CRYPTO_LOCK_ERR);
    246 	CRYPTO_w_lock(CRYPTO_LOCK_ERR);
    247 	if (!init)
    248 		{
    249 		CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
    250 		return;
    251 		}
    252 
    253 	for (i = 1; i <= NUM_SYS_STR_REASONS; i++)
    254 		{
    255 		ERR_STRING_DATA *str = &SYS_str_reasons[i - 1];
    256 
    257 		str->error = (unsigned long)i;
    258 		if (str->string == NULL)
    259 			{
    260 			char (*dest)[LEN_SYS_STR_REASON] = &(strerror_tab[i - 1]);
    261 			char *src = strerror(i);
    262 			if (src != NULL)
    263 				{
    264 				strncpy(*dest, src, sizeof *dest);
    265 				(*dest)[sizeof *dest - 1] = '\0';
    266 				str->string = *dest;
    267 				}
    268 			}
    269 		if (str->string == NULL)
    270 			str->string = "unknown";
    271 		}
    272 
    273 	/* Now we still have SYS_str_reasons[NUM_SYS_STR_REASONS] = {0, NULL},
    274 	 * as required by ERR_load_strings. */
    275 
    276 	init = 0;
    277 
    278 	CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
    279 	}
    280 #endif
    281 
    282 void ERR_load_ERR_strings(void)
    283 	{
    284 #ifndef OPENSSL_NO_ERR
    285 	if (ERR_func_error_string(ERR_str_functs[0].error) == NULL)
    286 		{
    287 		ERR_load_strings(0,ERR_str_libraries);
    288 		ERR_load_strings(0,ERR_str_reasons);
    289 		ERR_load_strings(ERR_LIB_SYS,ERR_str_functs);
    290 		build_SYS_str_reasons();
    291 		ERR_load_strings(ERR_LIB_SYS,SYS_str_reasons);
    292 		}
    293 #endif
    294 	}
    295 
    296