/* ====================================================================
 * Copyright (c) 2001-2008 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).
 *
 */

#ifndef HEADER_CAPI_ERR_H
# define HEADER_CAPI_ERR_H

#ifdef  __cplusplus
extern "C" {
#endif

/* 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.
 */
static void ERR_load_CAPI_strings(void);
static void ERR_unload_CAPI_strings(void);
static void ERR_CAPI_error(int function, int reason, char *file, int line);
# define CAPIerr(f,r) ERR_CAPI_error((f),(r),__FILE__,__LINE__)

/* Error codes for the CAPI functions. */

/* Function codes. */
# define CAPI_F_CAPI_CERT_GET_FNAME                       99
# define CAPI_F_CAPI_CTRL                                 100
# define CAPI_F_CAPI_CTX_NEW                              101
# define CAPI_F_CAPI_CTX_SET_PROVNAME                     102
# define CAPI_F_CAPI_DSA_DO_SIGN                          114
# define CAPI_F_CAPI_GET_KEY                              103
# define CAPI_F_CAPI_GET_PKEY                             115
# define CAPI_F_CAPI_GET_PROVNAME                         104
# define CAPI_F_CAPI_GET_PROV_INFO                        105
# define CAPI_F_CAPI_INIT                                 106
# define CAPI_F_CAPI_LIST_CONTAINERS                      107
# define CAPI_F_CAPI_LOAD_PRIVKEY                         108
# define CAPI_F_CAPI_OPEN_STORE                           109
# define CAPI_F_CAPI_RSA_PRIV_DEC                         110
# define CAPI_F_CAPI_RSA_PRIV_ENC                         111
# define CAPI_F_CAPI_RSA_SIGN                             112
# define CAPI_F_CAPI_VTRACE                               118
# define CAPI_F_CERT_SELECT_DIALOG                        117
# define CAPI_F_CLIENT_CERT_SELECT                        116
# define CAPI_F_WIDE_TO_ASC                               113

/* Reason codes. */
# define CAPI_R_CANT_CREATE_HASH_OBJECT                   99
# define CAPI_R_CANT_FIND_CAPI_CONTEXT                    100
# define CAPI_R_CANT_GET_KEY                              101
# define CAPI_R_CANT_SET_HASH_VALUE                       102
# define CAPI_R_CRYPTACQUIRECONTEXT_ERROR                 103
# define CAPI_R_CRYPTENUMPROVIDERS_ERROR                  104
# define CAPI_R_DECRYPT_ERROR                             105
# define CAPI_R_ENGINE_NOT_INITIALIZED                    106
# define CAPI_R_ENUMCONTAINERS_ERROR                      107
# define CAPI_R_ERROR_ADDING_CERT                         125
# define CAPI_R_ERROR_CREATING_STORE                      126
# define CAPI_R_ERROR_GETTING_FRIENDLY_NAME               108
# define CAPI_R_ERROR_GETTING_KEY_PROVIDER_INFO           109
# define CAPI_R_ERROR_OPENING_STORE                       110
# define CAPI_R_ERROR_SIGNING_HASH                        111
# define CAPI_R_FILE_OPEN_ERROR                           128
# define CAPI_R_FUNCTION_NOT_SUPPORTED                    112
# define CAPI_R_GETUSERKEY_ERROR                          113
# define CAPI_R_INVALID_DIGEST_LENGTH                     124
# define CAPI_R_INVALID_DSA_PUBLIC_KEY_BLOB_MAGIC_NUMBER  122
# define CAPI_R_INVALID_LOOKUP_METHOD                     114
# define CAPI_R_INVALID_PUBLIC_KEY_BLOB                   115
# define CAPI_R_INVALID_RSA_PUBLIC_KEY_BLOB_MAGIC_NUMBER  123
# define CAPI_R_PUBKEY_EXPORT_ERROR                       116
# define CAPI_R_PUBKEY_EXPORT_LENGTH_ERROR                117
# define CAPI_R_UNKNOWN_COMMAND                           118
# define CAPI_R_UNSUPPORTED_ALGORITHM_NID                 119
# define CAPI_R_UNSUPPORTED_PADDING                       120
# define CAPI_R_UNSUPPORTED_PUBLIC_KEY_ALGORITHM          121
# define CAPI_R_WIN32_ERROR                               127

#ifdef  __cplusplus
}
#endif
#endif
