/* crypto/bn/bn_err.c */
/* ====================================================================
 * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

/* NOTE: this file was auto generated by the mkerr.pl script: any changes
 * made to it will be overwritten when the script next updates this file,
 * only reason strings will be preserved.
 */

#include <stdio.h>
#include <openssl/err.h>
#include <openssl/bn.h>

/* BEGIN ERROR CODES */
#ifndef OPENSSL_NO_ERR

#define ERR_FUNC(func) ERR_PACK(ERR_LIB_BN,func,0)
#define ERR_REASON(reason) ERR_PACK(ERR_LIB_BN,0,reason)

static ERR_STRING_DATA BN_str_functs[]=
	{
{ERR_FUNC(BN_F_BNRAND),	"BNRAND"},
{ERR_FUNC(BN_F_BN_BLINDING_CONVERT_EX),	"BN_BLINDING_convert_ex"},
{ERR_FUNC(BN_F_BN_BLINDING_CREATE_PARAM),	"BN_BLINDING_create_param"},
{ERR_FUNC(BN_F_BN_BLINDING_INVERT_EX),	"BN_BLINDING_invert_ex"},
{ERR_FUNC(BN_F_BN_BLINDING_NEW),	"BN_BLINDING_new"},
{ERR_FUNC(BN_F_BN_BLINDING_UPDATE),	"BN_BLINDING_update"},
{ERR_FUNC(BN_F_BN_BN2DEC),	"BN_bn2dec"},
{ERR_FUNC(BN_F_BN_BN2HEX),	"BN_bn2hex"},
{ERR_FUNC(BN_F_BN_CTX_GET),	"BN_CTX_get"},
{ERR_FUNC(BN_F_BN_CTX_NEW),	"BN_CTX_new"},
{ERR_FUNC(BN_F_BN_CTX_START),	"BN_CTX_start"},
{ERR_FUNC(BN_F_BN_DIV),	"BN_div"},
{ERR_FUNC(BN_F_BN_DIV_NO_BRANCH),	"BN_div_no_branch"},
{ERR_FUNC(BN_F_BN_DIV_RECP),	"BN_div_recp"},
{ERR_FUNC(BN_F_BN_EXP),	"BN_exp"},
{ERR_FUNC(BN_F_BN_EXPAND2),	"bn_expand2"},
{ERR_FUNC(BN_F_BN_EXPAND_INTERNAL),	"BN_EXPAND_INTERNAL"},
{ERR_FUNC(BN_F_BN_GENERATE_DSA_NONCE),	"BN_generate_dsa_nonce"},
{ERR_FUNC(BN_F_BN_GF2M_MOD),	"BN_GF2m_mod"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_EXP),	"BN_GF2m_mod_exp"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_MUL),	"BN_GF2m_mod_mul"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_SOLVE_QUAD),	"BN_GF2m_mod_solve_quad"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR),	"BN_GF2m_mod_solve_quad_arr"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_SQR),	"BN_GF2m_mod_sqr"},
{ERR_FUNC(BN_F_BN_GF2M_MOD_SQRT),	"BN_GF2m_mod_sqrt"},
{ERR_FUNC(BN_F_BN_MOD_EXP2_MONT),	"BN_mod_exp2_mont"},
{ERR_FUNC(BN_F_BN_MOD_EXP_MONT),	"BN_mod_exp_mont"},
{ERR_FUNC(BN_F_BN_MOD_EXP_MONT_CONSTTIME),	"BN_mod_exp_mont_consttime"},
{ERR_FUNC(BN_F_BN_MOD_EXP_MONT_WORD),	"BN_mod_exp_mont_word"},
{ERR_FUNC(BN_F_BN_MOD_EXP_RECP),	"BN_mod_exp_recp"},
{ERR_FUNC(BN_F_BN_MOD_EXP_SIMPLE),	"BN_mod_exp_simple"},
{ERR_FUNC(BN_F_BN_MOD_INVERSE),	"BN_mod_inverse"},
{ERR_FUNC(BN_F_BN_MOD_INVERSE_NO_BRANCH),	"BN_mod_inverse_no_branch"},
{ERR_FUNC(BN_F_BN_MOD_LSHIFT_QUICK),	"BN_mod_lshift_quick"},
{ERR_FUNC(BN_F_BN_MOD_MUL_RECIPROCAL),	"BN_mod_mul_reciprocal"},
{ERR_FUNC(BN_F_BN_MOD_SQRT),	"BN_mod_sqrt"},
{ERR_FUNC(BN_F_BN_MPI2BN),	"BN_mpi2bn"},
{ERR_FUNC(BN_F_BN_NEW),	"BN_new"},
{ERR_FUNC(BN_F_BN_RAND),	"BN_rand"},
{ERR_FUNC(BN_F_BN_RAND_RANGE),	"BN_rand_range"},
{ERR_FUNC(BN_F_BN_USUB),	"BN_usub"},
{0,NULL}
	};

static ERR_STRING_DATA BN_str_reasons[]=
	{
{ERR_REASON(BN_R_ARG2_LT_ARG3)           ,"arg2 lt arg3"},
{ERR_REASON(BN_R_BAD_RECIPROCAL)         ,"bad reciprocal"},
{ERR_REASON(BN_R_BIGNUM_TOO_LONG)        ,"bignum too long"},
{ERR_REASON(BN_R_CALLED_WITH_EVEN_MODULUS),"called with even modulus"},
{ERR_REASON(BN_R_DIV_BY_ZERO)            ,"div by zero"},
{ERR_REASON(BN_R_ENCODING_ERROR)         ,"encoding error"},
{ERR_REASON(BN_R_EXPAND_ON_STATIC_BIGNUM_DATA),"expand on static bignum data"},
{ERR_REASON(BN_R_INPUT_NOT_REDUCED)      ,"input not reduced"},
{ERR_REASON(BN_R_INVALID_LENGTH)         ,"invalid length"},
{ERR_REASON(BN_R_INVALID_RANGE)          ,"invalid range"},
{ERR_REASON(BN_R_NOT_A_SQUARE)           ,"not a square"},
{ERR_REASON(BN_R_NOT_INITIALIZED)        ,"not initialized"},
{ERR_REASON(BN_R_NO_INVERSE)             ,"no inverse"},
{ERR_REASON(BN_R_NO_SOLUTION)            ,"no solution"},
{ERR_REASON(BN_R_PRIVATE_KEY_TOO_LARGE)  ,"private key too large"},
{ERR_REASON(BN_R_P_IS_NOT_PRIME)         ,"p is not prime"},
{ERR_REASON(BN_R_TOO_MANY_ITERATIONS)    ,"too many iterations"},
{ERR_REASON(BN_R_TOO_MANY_TEMPORARY_VARIABLES),"too many temporary variables"},
{0,NULL}
	};

#endif

void ERR_load_BN_strings(void)
	{
#ifndef OPENSSL_NO_ERR

	if (ERR_func_error_string(BN_str_functs[0].error) == NULL)
		{
		ERR_load_strings(0,BN_str_functs);
		ERR_load_strings(0,BN_str_reasons);
		}
#endif
	}
