| [1] | 1 | /* crypto/crypto.h */ | 
|---|
|  | 2 | /* ==================================================================== | 
|---|
|  | 3 | * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved. | 
|---|
|  | 4 | * | 
|---|
|  | 5 | * Redistribution and use in source and binary forms, with or without | 
|---|
|  | 6 | * modification, are permitted provided that the following conditions | 
|---|
|  | 7 | * are met: | 
|---|
|  | 8 | * | 
|---|
|  | 9 | * 1. Redistributions of source code must retain the above copyright | 
|---|
|  | 10 | *    notice, this list of conditions and the following disclaimer. | 
|---|
|  | 11 | * | 
|---|
|  | 12 | * 2. Redistributions in binary form must reproduce the above copyright | 
|---|
|  | 13 | *    notice, this list of conditions and the following disclaimer in | 
|---|
|  | 14 | *    the documentation and/or other materials provided with the | 
|---|
|  | 15 | *    distribution. | 
|---|
|  | 16 | * | 
|---|
|  | 17 | * 3. All advertising materials mentioning features or use of this | 
|---|
|  | 18 | *    software must display the following acknowledgment: | 
|---|
|  | 19 | *    "This product includes software developed by the OpenSSL Project | 
|---|
|  | 20 | *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | 
|---|
|  | 21 | * | 
|---|
|  | 22 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | 
|---|
|  | 23 | *    endorse or promote products derived from this software without | 
|---|
|  | 24 | *    prior written permission. For written permission, please contact | 
|---|
|  | 25 | *    openssl-core@openssl.org. | 
|---|
|  | 26 | * | 
|---|
|  | 27 | * 5. Products derived from this software may not be called "OpenSSL" | 
|---|
|  | 28 | *    nor may "OpenSSL" appear in their names without prior written | 
|---|
|  | 29 | *    permission of the OpenSSL Project. | 
|---|
|  | 30 | * | 
|---|
|  | 31 | * 6. Redistributions of any form whatsoever must retain the following | 
|---|
|  | 32 | *    acknowledgment: | 
|---|
|  | 33 | *    "This product includes software developed by the OpenSSL Project | 
|---|
|  | 34 | *    for use in the OpenSSL Toolkit (http://www.openssl.org/)" | 
|---|
|  | 35 | * | 
|---|
|  | 36 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | 
|---|
|  | 37 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|---|
|  | 38 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
|---|
|  | 39 | * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR | 
|---|
|  | 40 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|---|
|  | 41 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
|---|
|  | 42 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
|---|
|  | 43 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
|---|
|  | 44 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 
|---|
|  | 45 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|---|
|  | 46 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | 
|---|
|  | 47 | * OF THE POSSIBILITY OF SUCH DAMAGE. | 
|---|
|  | 48 | * ==================================================================== | 
|---|
|  | 49 | * | 
|---|
|  | 50 | * This product includes cryptographic software written by Eric Young | 
|---|
|  | 51 | * (eay@cryptsoft.com).  This product includes software written by Tim | 
|---|
|  | 52 | * Hudson (tjh@cryptsoft.com). | 
|---|
|  | 53 | * | 
|---|
|  | 54 | */ | 
|---|
|  | 55 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
|---|
|  | 56 | * All rights reserved. | 
|---|
|  | 57 | * | 
|---|
|  | 58 | * This package is an SSL implementation written | 
|---|
|  | 59 | * by Eric Young (eay@cryptsoft.com). | 
|---|
|  | 60 | * The implementation was written so as to conform with Netscapes SSL. | 
|---|
|  | 61 | * | 
|---|
|  | 62 | * This library is free for commercial and non-commercial use as long as | 
|---|
|  | 63 | * the following conditions are aheared to.  The following conditions | 
|---|
|  | 64 | * apply to all code found in this distribution, be it the RC4, RSA, | 
|---|
|  | 65 | * lhash, DES, etc., code; not just the SSL code.  The SSL documentation | 
|---|
|  | 66 | * included with this distribution is covered by the same copyright terms | 
|---|
|  | 67 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | 
|---|
|  | 68 | * | 
|---|
|  | 69 | * Copyright remains Eric Young's, and as such any Copyright notices in | 
|---|
|  | 70 | * the code are not to be removed. | 
|---|
|  | 71 | * If this package is used in a product, Eric Young should be given attribution | 
|---|
|  | 72 | * as the author of the parts of the library used. | 
|---|
|  | 73 | * This can be in the form of a textual message at program startup or | 
|---|
|  | 74 | * in documentation (online or textual) provided with the package. | 
|---|
|  | 75 | * | 
|---|
|  | 76 | * Redistribution and use in source and binary forms, with or without | 
|---|
|  | 77 | * modification, are permitted provided that the following conditions | 
|---|
|  | 78 | * are met: | 
|---|
|  | 79 | * 1. Redistributions of source code must retain the copyright | 
|---|
|  | 80 | *    notice, this list of conditions and the following disclaimer. | 
|---|
|  | 81 | * 2. Redistributions in binary form must reproduce the above copyright | 
|---|
|  | 82 | *    notice, this list of conditions and the following disclaimer in the | 
|---|
|  | 83 | *    documentation and/or other materials provided with the distribution. | 
|---|
|  | 84 | * 3. All advertising materials mentioning features or use of this software | 
|---|
|  | 85 | *    must display the following acknowledgement: | 
|---|
|  | 86 | *    "This product includes cryptographic software written by | 
|---|
|  | 87 | *     Eric Young (eay@cryptsoft.com)" | 
|---|
|  | 88 | *    The word 'cryptographic' can be left out if the rouines from the library | 
|---|
|  | 89 | *    being used are not cryptographic related :-). | 
|---|
|  | 90 | * 4. If you include any Windows specific code (or a derivative thereof) from | 
|---|
|  | 91 | *    the apps directory (application code) you must include an acknowledgement: | 
|---|
|  | 92 | *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | 
|---|
|  | 93 | * | 
|---|
|  | 94 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | 
|---|
|  | 95 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|---|
|  | 96 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
|---|
|  | 97 | * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
|---|
|  | 98 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
|---|
|  | 99 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
|---|
|  | 100 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
|---|
|  | 101 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
|---|
|  | 102 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
|---|
|  | 103 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
|---|
|  | 104 | * SUCH DAMAGE. | 
|---|
|  | 105 | * | 
|---|
|  | 106 | * The licence and distribution terms for any publically available version or | 
|---|
|  | 107 | * derivative of this code cannot be changed.  i.e. this code cannot simply be | 
|---|
|  | 108 | * copied and put under another distribution licence | 
|---|
|  | 109 | * [including the GNU Public Licence.] | 
|---|
|  | 110 | */ | 
|---|
|  | 111 | /* ==================================================================== | 
|---|
|  | 112 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 
|---|
|  | 113 | * ECDH support in OpenSSL originally developed by | 
|---|
|  | 114 | * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. | 
|---|
|  | 115 | */ | 
|---|
|  | 116 |  | 
|---|
|  | 117 | #ifndef HEADER_CRYPTO_H | 
|---|
|  | 118 | #define HEADER_CRYPTO_H | 
|---|
|  | 119 |  | 
|---|
|  | 120 | #include <stdlib.h> | 
|---|
|  | 121 |  | 
|---|
|  | 122 | //#include <e_os2.h> | 
|---|
|  | 123 |  | 
|---|
|  | 124 | #ifndef OPENSSL_NO_FP_API | 
|---|
|  | 125 | #include <stdio.h> | 
|---|
|  | 126 | #endif | 
|---|
|  | 127 |  | 
|---|
|  | 128 | #include <openssl/stack.h> | 
|---|
|  | 129 | #include <openssl/safestack.h> | 
|---|
|  | 130 | #include <openssl/opensslv.h> | 
|---|
|  | 131 | #include <openssl/ossl_typ.h> | 
|---|
|  | 132 |  | 
|---|
|  | 133 | #ifdef CHARSET_EBCDIC | 
|---|
|  | 134 | #include <ebcdic.h> | 
|---|
|  | 135 | #endif | 
|---|
|  | 136 |  | 
|---|
|  | 137 | /* Resolve problems on some operating systems with symbol names that clash | 
|---|
|  | 138 | one way or another */ | 
|---|
|  | 139 | #include <openssl/symhacks.h> | 
|---|
|  | 140 |  | 
|---|
|  | 141 | #ifdef  __cplusplus | 
|---|
|  | 142 | extern "C" { | 
|---|
|  | 143 | #endif | 
|---|
|  | 144 |  | 
|---|
|  | 145 | /* Backward compatibility to SSLeay */ | 
|---|
|  | 146 | /* This is more to be used to check the correct DLL is being used | 
|---|
|  | 147 | * in the MS world. */ | 
|---|
|  | 148 | #define SSLEAY_VERSION_NUMBER   OPENSSL_VERSION_NUMBER | 
|---|
|  | 149 | #define SSLEAY_VERSION          0 | 
|---|
|  | 150 | /* #define SSLEAY_OPTIONS       1 no longer supported */ | 
|---|
|  | 151 | #define SSLEAY_CFLAGS           2 | 
|---|
|  | 152 | #define SSLEAY_BUILT_ON         3 | 
|---|
|  | 153 | #define SSLEAY_PLATFORM         4 | 
|---|
|  | 154 | #define SSLEAY_DIR              5 | 
|---|
|  | 155 |  | 
|---|
|  | 156 | /* Already declared in ossl_typ.h */ | 
|---|
|  | 157 | #if 0 | 
|---|
|  | 158 | typedef struct crypto_ex_data_st CRYPTO_EX_DATA; | 
|---|
|  | 159 | /* Called when a new object is created */ | 
|---|
|  | 160 | typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
|---|
|  | 161 | int idx, long argl, void *argp); | 
|---|
|  | 162 | /* Called when an object is free()ed */ | 
|---|
|  | 163 | typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, | 
|---|
|  | 164 | int idx, long argl, void *argp); | 
|---|
|  | 165 | /* Called when we need to dup an object */ | 
|---|
|  | 166 | typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, | 
|---|
|  | 167 | int idx, long argl, void *argp); | 
|---|
|  | 168 | #endif | 
|---|
|  | 169 |  | 
|---|
|  | 170 | /* A generic structure to pass assorted data in a expandable way */ | 
|---|
|  | 171 | typedef struct openssl_item_st | 
|---|
|  | 172 | { | 
|---|
|  | 173 | int code; | 
|---|
|  | 174 | void *value;            /* Not used for flag attributes */ | 
|---|
|  | 175 | size_t value_size;      /* Max size of value for output, length for input */ | 
|---|
|  | 176 | size_t *value_length;   /* Returned length of value for output */ | 
|---|
|  | 177 | } OPENSSL_ITEM; | 
|---|
|  | 178 |  | 
|---|
|  | 179 |  | 
|---|
|  | 180 | /* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock | 
|---|
|  | 181 | * names in cryptlib.c | 
|---|
|  | 182 | */ | 
|---|
|  | 183 |  | 
|---|
|  | 184 | #define CRYPTO_LOCK_ERR                 1 | 
|---|
|  | 185 | #define CRYPTO_LOCK_EX_DATA             2 | 
|---|
|  | 186 | #define CRYPTO_LOCK_X509                3 | 
|---|
|  | 187 | #define CRYPTO_LOCK_X509_INFO           4 | 
|---|
|  | 188 | #define CRYPTO_LOCK_X509_PKEY           5 | 
|---|
|  | 189 | #define CRYPTO_LOCK_X509_CRL            6 | 
|---|
|  | 190 | #define CRYPTO_LOCK_X509_REQ            7 | 
|---|
|  | 191 | #define CRYPTO_LOCK_DSA                 8 | 
|---|
|  | 192 | #define CRYPTO_LOCK_RSA                 9 | 
|---|
|  | 193 | #define CRYPTO_LOCK_EVP_PKEY            10 | 
|---|
|  | 194 | #define CRYPTO_LOCK_X509_STORE          11 | 
|---|
|  | 195 | #define CRYPTO_LOCK_SSL_CTX             12 | 
|---|
|  | 196 | #define CRYPTO_LOCK_SSL_CERT            13 | 
|---|
|  | 197 | #define CRYPTO_LOCK_SSL_SESSION         14 | 
|---|
|  | 198 | #define CRYPTO_LOCK_SSL_SESS_CERT       15 | 
|---|
|  | 199 | #define CRYPTO_LOCK_SSL                 16 | 
|---|
|  | 200 | #define CRYPTO_LOCK_SSL_METHOD          17 | 
|---|
|  | 201 | #define CRYPTO_LOCK_RAND                18 | 
|---|
|  | 202 | #define CRYPTO_LOCK_RAND2               19 | 
|---|
|  | 203 | #define CRYPTO_LOCK_MALLOC              20 | 
|---|
|  | 204 | #define CRYPTO_LOCK_BIO                 21 | 
|---|
|  | 205 | #define CRYPTO_LOCK_GETHOSTBYNAME       22 | 
|---|
|  | 206 | #define CRYPTO_LOCK_GETSERVBYNAME       23 | 
|---|
|  | 207 | #define CRYPTO_LOCK_READDIR             24 | 
|---|
|  | 208 | #define CRYPTO_LOCK_RSA_BLINDING        25 | 
|---|
|  | 209 | #define CRYPTO_LOCK_DH                  26 | 
|---|
|  | 210 | #define CRYPTO_LOCK_MALLOC2             27 | 
|---|
|  | 211 | #define CRYPTO_LOCK_DSO                 28 | 
|---|
|  | 212 | #define CRYPTO_LOCK_DYNLOCK             29 | 
|---|
|  | 213 | #define CRYPTO_LOCK_ENGINE              30 | 
|---|
|  | 214 | #define CRYPTO_LOCK_UI                  31 | 
|---|
|  | 215 | #define CRYPTO_LOCK_ECDSA               32 | 
|---|
|  | 216 | #define CRYPTO_LOCK_EC                  33 | 
|---|
|  | 217 | #define CRYPTO_LOCK_ECDH                34 | 
|---|
|  | 218 | #define CRYPTO_LOCK_BN                  35 | 
|---|
|  | 219 | #define CRYPTO_LOCK_EC_PRE_COMP         36 | 
|---|
|  | 220 | #define CRYPTO_LOCK_STORE               37 | 
|---|
|  | 221 | #define CRYPTO_LOCK_COMP                38 | 
|---|
|  | 222 | #ifndef OPENSSL_FIPS | 
|---|
|  | 223 | #define CRYPTO_NUM_LOCKS                39 | 
|---|
|  | 224 | #else | 
|---|
|  | 225 | #define CRYPTO_LOCK_FIPS                39 | 
|---|
|  | 226 | #define CRYPTO_LOCK_FIPS2               40 | 
|---|
|  | 227 | #define CRYPTO_NUM_LOCKS                41 | 
|---|
|  | 228 | #endif | 
|---|
|  | 229 |  | 
|---|
|  | 230 | #define CRYPTO_LOCK             1 | 
|---|
|  | 231 | #define CRYPTO_UNLOCK           2 | 
|---|
|  | 232 | #define CRYPTO_READ             4 | 
|---|
|  | 233 | #define CRYPTO_WRITE            8 | 
|---|
|  | 234 |  | 
|---|
|  | 235 | #ifndef OPENSSL_NO_LOCKING | 
|---|
|  | 236 | #ifndef CRYPTO_w_lock | 
|---|
|  | 237 | #define CRYPTO_w_lock(type)     \ | 
|---|
|  | 238 | CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) | 
|---|
|  | 239 | #define CRYPTO_w_unlock(type)   \ | 
|---|
|  | 240 | CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__) | 
|---|
|  | 241 | #define CRYPTO_r_lock(type)     \ | 
|---|
|  | 242 | CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__) | 
|---|
|  | 243 | #define CRYPTO_r_unlock(type)   \ | 
|---|
|  | 244 | CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__) | 
|---|
|  | 245 | #define CRYPTO_add(addr,amount,type)    \ | 
|---|
|  | 246 | CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__) | 
|---|
|  | 247 | #endif | 
|---|
|  | 248 | #else | 
|---|
|  | 249 | #define CRYPTO_w_lock(a) | 
|---|
|  | 250 | #define CRYPTO_w_unlock(a) | 
|---|
|  | 251 | #define CRYPTO_r_lock(a) | 
|---|
|  | 252 | #define CRYPTO_r_unlock(a) | 
|---|
|  | 253 | #define CRYPTO_add(a,b,c)       ((*(a))+=(b)) | 
|---|
|  | 254 | #endif | 
|---|
|  | 255 |  | 
|---|
|  | 256 | /* Some applications as well as some parts of OpenSSL need to allocate | 
|---|
|  | 257 | and deallocate locks in a dynamic fashion.  The following typedef | 
|---|
|  | 258 | makes this possible in a type-safe manner.  */ | 
|---|
|  | 259 | /* struct CRYPTO_dynlock_value has to be defined by the application. */ | 
|---|
|  | 260 | typedef struct | 
|---|
|  | 261 | { | 
|---|
|  | 262 | int references; | 
|---|
|  | 263 | struct CRYPTO_dynlock_value *data; | 
|---|
|  | 264 | } CRYPTO_dynlock; | 
|---|
|  | 265 |  | 
|---|
|  | 266 |  | 
|---|
|  | 267 | /* The following can be used to detect memory leaks in the SSLeay library. | 
|---|
|  | 268 | * It used, it turns on malloc checking */ | 
|---|
|  | 269 |  | 
|---|
|  | 270 | #define CRYPTO_MEM_CHECK_OFF    0x0     /* an enume */ | 
|---|
|  | 271 | #define CRYPTO_MEM_CHECK_ON     0x1     /* a bit */ | 
|---|
|  | 272 | #define CRYPTO_MEM_CHECK_ENABLE 0x2     /* a bit */ | 
|---|
|  | 273 | #define CRYPTO_MEM_CHECK_DISABLE 0x3    /* an enume */ | 
|---|
|  | 274 |  | 
|---|
|  | 275 | /* The following are bit values to turn on or off options connected to the | 
|---|
|  | 276 | * malloc checking functionality */ | 
|---|
|  | 277 |  | 
|---|
|  | 278 | /* Adds time to the memory checking information */ | 
|---|
|  | 279 | #define V_CRYPTO_MDEBUG_TIME    0x1 /* a bit */ | 
|---|
|  | 280 | /* Adds thread number to the memory checking information */ | 
|---|
|  | 281 | #define V_CRYPTO_MDEBUG_THREAD  0x2 /* a bit */ | 
|---|
|  | 282 |  | 
|---|
|  | 283 | #define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD) | 
|---|
|  | 284 |  | 
|---|
|  | 285 |  | 
|---|
|  | 286 | /* predec of the BIO type */ | 
|---|
|  | 287 | typedef struct bio_st BIO_dummy; | 
|---|
|  | 288 |  | 
|---|
|  | 289 | struct crypto_ex_data_st | 
|---|
|  | 290 | { | 
|---|
|  | 291 | STACK *sk; | 
|---|
|  | 292 | int dummy; /* gcc is screwing up this data structure :-( */ | 
|---|
|  | 293 | }; | 
|---|
|  | 294 |  | 
|---|
|  | 295 | /* This stuff is basically class callback functions | 
|---|
|  | 296 | * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */ | 
|---|
|  | 297 |  | 
|---|
|  | 298 | typedef struct crypto_ex_data_func_st | 
|---|
|  | 299 | { | 
|---|
|  | 300 | long argl;      /* Arbitary long */ | 
|---|
|  | 301 | void *argp;     /* Arbitary void * */ | 
|---|
|  | 302 | CRYPTO_EX_new *new_func; | 
|---|
|  | 303 | CRYPTO_EX_free *free_func; | 
|---|
|  | 304 | CRYPTO_EX_dup *dup_func; | 
|---|
|  | 305 | } CRYPTO_EX_DATA_FUNCS; | 
|---|
|  | 306 |  | 
|---|
|  | 307 | DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS) | 
|---|
|  | 308 |  | 
|---|
|  | 309 | /* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA | 
|---|
|  | 310 | * entry. | 
|---|
|  | 311 | */ | 
|---|
|  | 312 |  | 
|---|
|  | 313 | #define CRYPTO_EX_INDEX_BIO             0 | 
|---|
|  | 314 | #define CRYPTO_EX_INDEX_SSL             1 | 
|---|
|  | 315 | #define CRYPTO_EX_INDEX_SSL_CTX         2 | 
|---|
|  | 316 | #define CRYPTO_EX_INDEX_SSL_SESSION     3 | 
|---|
|  | 317 | #define CRYPTO_EX_INDEX_X509_STORE      4 | 
|---|
|  | 318 | #define CRYPTO_EX_INDEX_X509_STORE_CTX  5 | 
|---|
|  | 319 | #define CRYPTO_EX_INDEX_RSA             6 | 
|---|
|  | 320 | #define CRYPTO_EX_INDEX_DSA             7 | 
|---|
|  | 321 | #define CRYPTO_EX_INDEX_DH              8 | 
|---|
|  | 322 | #define CRYPTO_EX_INDEX_ENGINE          9 | 
|---|
|  | 323 | #define CRYPTO_EX_INDEX_X509            10 | 
|---|
|  | 324 | #define CRYPTO_EX_INDEX_UI              11 | 
|---|
|  | 325 | #define CRYPTO_EX_INDEX_ECDSA           12 | 
|---|
|  | 326 | #define CRYPTO_EX_INDEX_ECDH            13 | 
|---|
|  | 327 | #define CRYPTO_EX_INDEX_COMP            14 | 
|---|
|  | 328 | #define CRYPTO_EX_INDEX_STORE           15 | 
|---|
|  | 329 |  | 
|---|
|  | 330 | /* Dynamically assigned indexes start from this value (don't use directly, use | 
|---|
|  | 331 | * via CRYPTO_ex_data_new_class). */ | 
|---|
|  | 332 | #define CRYPTO_EX_INDEX_USER            100 | 
|---|
|  | 333 |  | 
|---|
|  | 334 |  | 
|---|
|  | 335 | /* This is the default callbacks, but we can have others as well: | 
|---|
|  | 336 | * this is needed in Win32 where the application malloc and the | 
|---|
|  | 337 | * library malloc may not be the same. | 
|---|
|  | 338 | */ | 
|---|
|  | 339 | #define CRYPTO_malloc_init()    CRYPTO_set_mem_functions(\ | 
|---|
|  | 340 | malloc, realloc, free) | 
|---|
|  | 341 |  | 
|---|
|  | 342 | #if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD | 
|---|
|  | 343 | # ifndef CRYPTO_MDEBUG /* avoid duplicate #define */ | 
|---|
|  | 344 | #  define CRYPTO_MDEBUG | 
|---|
|  | 345 | # endif | 
|---|
|  | 346 | #endif | 
|---|
|  | 347 |  | 
|---|
|  | 348 | /* Set standard debugging functions (not done by default | 
|---|
|  | 349 | * unless CRYPTO_MDEBUG is defined) */ | 
|---|
|  | 350 | void CRYPTO_malloc_debug_init(void); | 
|---|
|  | 351 |  | 
|---|
|  | 352 | int CRYPTO_mem_ctrl(int mode); | 
|---|
|  | 353 | int CRYPTO_is_mem_check_on(void); | 
|---|
|  | 354 |  | 
|---|
|  | 355 | /* for applications */ | 
|---|
|  | 356 | #define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON) | 
|---|
|  | 357 | #define MemCheck_stop() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF) | 
|---|
|  | 358 |  | 
|---|
|  | 359 | /* for library-internal use */ | 
|---|
|  | 360 | #define MemCheck_on()   CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE) | 
|---|
|  | 361 | #define MemCheck_off()  CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE) | 
|---|
|  | 362 | #define is_MemCheck_on() CRYPTO_is_mem_check_on() | 
|---|
|  | 363 |  | 
|---|
|  | 364 | #define OPENSSL_malloc(num)     CRYPTO_malloc((int)num,__FILE__,__LINE__) | 
|---|
|  | 365 | #define OPENSSL_strdup(str)     CRYPTO_strdup((str),__FILE__,__LINE__) | 
|---|
|  | 366 | #define OPENSSL_realloc(addr,num) \ | 
|---|
|  | 367 | CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__) | 
|---|
|  | 368 | #define OPENSSL_realloc_clean(addr,old_num,num) \ | 
|---|
|  | 369 | CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__) | 
|---|
|  | 370 | #define OPENSSL_remalloc(addr,num) \ | 
|---|
|  | 371 | CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__) | 
|---|
|  | 372 | #define OPENSSL_freeFunc        CRYPTO_free | 
|---|
|  | 373 | #define OPENSSL_free(addr)      CRYPTO_free(addr) | 
|---|
|  | 374 |  | 
|---|
|  | 375 | #define OPENSSL_malloc_locked(num) \ | 
|---|
|  | 376 | CRYPTO_malloc_locked((int)num,__FILE__,__LINE__) | 
|---|
|  | 377 | #define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr) | 
|---|
|  | 378 |  | 
|---|
|  | 379 |  | 
|---|
|  | 380 | const char *SSLeay_version(int type); | 
|---|
|  | 381 | unsigned long SSLeay(void); | 
|---|
|  | 382 |  | 
|---|
|  | 383 | int OPENSSL_issetugid(void); | 
|---|
|  | 384 |  | 
|---|
|  | 385 | /* An opaque type representing an implementation of "ex_data" support */ | 
|---|
|  | 386 | typedef struct st_CRYPTO_EX_DATA_IMPL   CRYPTO_EX_DATA_IMPL; | 
|---|
|  | 387 | /* Return an opaque pointer to the current "ex_data" implementation */ | 
|---|
|  | 388 | const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void); | 
|---|
|  | 389 | /* Sets the "ex_data" implementation to be used (if it's not too late) */ | 
|---|
|  | 390 | int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i); | 
|---|
|  | 391 | /* Get a new "ex_data" class, and return the corresponding "class_index" */ | 
|---|
|  | 392 | int CRYPTO_ex_data_new_class(void); | 
|---|
|  | 393 | /* Within a given class, get/register a new index */ | 
|---|
|  | 394 | int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp, | 
|---|
|  | 395 | CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func, | 
|---|
|  | 396 | CRYPTO_EX_free *free_func); | 
|---|
|  | 397 | /* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given | 
|---|
|  | 398 | * class (invokes whatever per-class callbacks are applicable) */ | 
|---|
|  | 399 | int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); | 
|---|
|  | 400 | int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to, | 
|---|
|  | 401 | CRYPTO_EX_DATA *from); | 
|---|
|  | 402 | void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad); | 
|---|
|  | 403 | /* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index | 
|---|
|  | 404 | * (relative to the class type involved) */ | 
|---|
|  | 405 | int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val); | 
|---|
|  | 406 | void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad,int idx); | 
|---|
|  | 407 | /* This function cleans up all "ex_data" state. It mustn't be called under | 
|---|
|  | 408 | * potential race-conditions. */ | 
|---|
|  | 409 | void CRYPTO_cleanup_all_ex_data(void); | 
|---|
|  | 410 |  | 
|---|
|  | 411 | int CRYPTO_get_new_lockid(char *name); | 
|---|
|  | 412 |  | 
|---|
|  | 413 | int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */ | 
|---|
|  | 414 | void CRYPTO_lock(int mode, int type,const char *file,int line); | 
|---|
|  | 415 | void CRYPTO_set_locking_callback(void (*func)(int mode,int type, | 
|---|
|  | 416 | const char *file,int line)); | 
|---|
|  | 417 | void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file, | 
|---|
|  | 418 | int line); | 
|---|
|  | 419 | void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type, | 
|---|
|  | 420 | const char *file, int line)); | 
|---|
|  | 421 | int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type, | 
|---|
|  | 422 | const char *file,int line); | 
|---|
|  | 423 | void CRYPTO_set_id_callback(unsigned long (*func)(void)); | 
|---|
|  | 424 | unsigned long (*CRYPTO_get_id_callback(void))(void); | 
|---|
|  | 425 | unsigned long CRYPTO_thread_id(void); | 
|---|
|  | 426 | const char *CRYPTO_get_lock_name(int type); | 
|---|
|  | 427 | int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file, | 
|---|
|  | 428 | int line); | 
|---|
|  | 429 |  | 
|---|
|  | 430 | void int_CRYPTO_set_do_dynlock_callback( | 
|---|
|  | 431 | void (*do_dynlock_cb)(int mode, int type, const char *file, int line)); | 
|---|
|  | 432 |  | 
|---|
|  | 433 | int CRYPTO_get_new_dynlockid(void); | 
|---|
|  | 434 | void CRYPTO_destroy_dynlockid(int i); | 
|---|
|  | 435 | struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i); | 
|---|
|  | 436 | void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line)); | 
|---|
|  | 437 | void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)); | 
|---|
|  | 438 | void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line)); | 
|---|
|  | 439 | struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line); | 
|---|
|  | 440 | void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line); | 
|---|
|  | 441 | void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line); | 
|---|
|  | 442 |  | 
|---|
|  | 443 | /* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions -- | 
|---|
|  | 444 | * call the latter last if you need different functions */ | 
|---|
|  | 445 | int CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *)); | 
|---|
|  | 446 | int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *)); | 
|---|
|  | 447 | int CRYPTO_set_mem_ex_functions(void *(*m)(size_t,const char *,int), | 
|---|
|  | 448 | void *(*r)(void *,size_t,const char *,int), | 
|---|
|  | 449 | void (*f)(void *)); | 
|---|
|  | 450 | int CRYPTO_set_locked_mem_ex_functions(void *(*m)(size_t,const char *,int), | 
|---|
|  | 451 | void (*free_func)(void *)); | 
|---|
|  | 452 | int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int), | 
|---|
|  | 453 | void (*r)(void *,void *,int,const char *,int,int), | 
|---|
|  | 454 | void (*f)(void *,int), | 
|---|
|  | 455 | void (*so)(long), | 
|---|
|  | 456 | long (*go)(void)); | 
|---|
|  | 457 | void CRYPTO_set_mem_info_functions( | 
|---|
|  | 458 | int  (*push_info_fn)(const char *info, const char *file, int line), | 
|---|
|  | 459 | int  (*pop_info_fn)(void), | 
|---|
|  | 460 | int (*remove_all_info_fn)(void)); | 
|---|
|  | 461 | void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *)); | 
|---|
|  | 462 | void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *)); | 
|---|
|  | 463 | void CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int), | 
|---|
|  | 464 | void *(**r)(void *, size_t,const char *,int), | 
|---|
|  | 465 | void (**f)(void *)); | 
|---|
|  | 466 | void CRYPTO_get_locked_mem_ex_functions(void *(**m)(size_t,const char *,int), | 
|---|
|  | 467 | void (**f)(void *)); | 
|---|
|  | 468 | void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int), | 
|---|
|  | 469 | void (**r)(void *,void *,int,const char *,int,int), | 
|---|
|  | 470 | void (**f)(void *,int), | 
|---|
|  | 471 | void (**so)(long), | 
|---|
|  | 472 | long (**go)(void)); | 
|---|
|  | 473 |  | 
|---|
|  | 474 | void *CRYPTO_malloc_locked(int num, const char *file, int line); | 
|---|
|  | 475 | void CRYPTO_free_locked(void *); | 
|---|
|  | 476 | void *CRYPTO_malloc(int num, const char *file, int line); | 
|---|
|  | 477 | char *CRYPTO_strdup(const char *str, const char *file, int line); | 
|---|
|  | 478 | void CRYPTO_free(void *); | 
|---|
|  | 479 | void *CRYPTO_realloc(void *addr,int num, const char *file, int line); | 
|---|
|  | 480 | void *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file, | 
|---|
|  | 481 | int line); | 
|---|
|  | 482 | void *CRYPTO_remalloc(void *addr,int num, const char *file, int line); | 
|---|
|  | 483 |  | 
|---|
|  | 484 | void OPENSSL_cleanse(void *ptr, size_t len); | 
|---|
|  | 485 |  | 
|---|
|  | 486 | void CRYPTO_set_mem_debug_options(long bits); | 
|---|
|  | 487 | long CRYPTO_get_mem_debug_options(void); | 
|---|
|  | 488 |  | 
|---|
|  | 489 | #define CRYPTO_push_info(info) \ | 
|---|
|  | 490 | CRYPTO_push_info_(info, __FILE__, __LINE__); | 
|---|
|  | 491 | int CRYPTO_push_info_(const char *info, const char *file, int line); | 
|---|
|  | 492 | int CRYPTO_pop_info(void); | 
|---|
|  | 493 | int CRYPTO_remove_all_info(void); | 
|---|
|  | 494 |  | 
|---|
|  | 495 |  | 
|---|
|  | 496 | /* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro; | 
|---|
|  | 497 | * used as default in CRYPTO_MDEBUG compilations): */ | 
|---|
|  | 498 | /* The last argument has the following significance: | 
|---|
|  | 499 | * | 
|---|
|  | 500 | * 0:   called before the actual memory allocation has taken place | 
|---|
|  | 501 | * 1:   called after the actual memory allocation has taken place | 
|---|
|  | 502 | */ | 
|---|
|  | 503 | void CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p); | 
|---|
|  | 504 | void CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p); | 
|---|
|  | 505 | void CRYPTO_dbg_free(void *addr,int before_p); | 
|---|
|  | 506 | /* Tell the debugging code about options.  By default, the following values | 
|---|
|  | 507 | * apply: | 
|---|
|  | 508 | * | 
|---|
|  | 509 | * 0:                           Clear all options. | 
|---|
|  | 510 | * V_CRYPTO_MDEBUG_TIME (1):    Set the "Show Time" option. | 
|---|
|  | 511 | * V_CRYPTO_MDEBUG_THREAD (2):  Set the "Show Thread Number" option. | 
|---|
|  | 512 | * V_CRYPTO_MDEBUG_ALL (3):     1 + 2 | 
|---|
|  | 513 | */ | 
|---|
|  | 514 | void CRYPTO_dbg_set_options(long bits); | 
|---|
|  | 515 | long CRYPTO_dbg_get_options(void); | 
|---|
|  | 516 |  | 
|---|
|  | 517 | int CRYPTO_dbg_push_info(const char *info, const char *file, int line); | 
|---|
|  | 518 | int CRYPTO_dbg_pop_info(void); | 
|---|
|  | 519 | int CRYPTO_dbg_remove_all_info(void); | 
|---|
|  | 520 |  | 
|---|
|  | 521 | #ifndef OPENSSL_NO_FP_API | 
|---|
|  | 522 | void CRYPTO_mem_leaks_fp(FILE *); | 
|---|
|  | 523 | #endif | 
|---|
|  | 524 | void CRYPTO_mem_leaks(struct bio_st *bio); | 
|---|
|  | 525 | /* unsigned long order, char *file, int line, int num_bytes, char *addr */ | 
|---|
|  | 526 | typedef void *CRYPTO_MEM_LEAK_CB(unsigned long, const char *, int, int, void *); | 
|---|
|  | 527 | void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb); | 
|---|
|  | 528 |  | 
|---|
|  | 529 | /* die if we have to */ | 
|---|
|  | 530 | void OpenSSLDie(const char *file,int line,const char *assertion); | 
|---|
|  | 531 | #define OPENSSL_assert(e)       (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1)) | 
|---|
|  | 532 |  | 
|---|
|  | 533 | unsigned long *OPENSSL_ia32cap_loc(void); | 
|---|
|  | 534 | #define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc())) | 
|---|
|  | 535 | int OPENSSL_isservice(void); | 
|---|
|  | 536 |  | 
|---|
|  | 537 | #ifdef OPENSSL_FIPS | 
|---|
|  | 538 | #define FIPS_ERROR_IGNORED(alg) OpenSSLDie(__FILE__, __LINE__, \ | 
|---|
|  | 539 | alg " previous FIPS forbidden algorithm error ignored"); | 
|---|
|  | 540 |  | 
|---|
|  | 541 | #define FIPS_BAD_ABORT(alg) OpenSSLDie(__FILE__, __LINE__, \ | 
|---|
|  | 542 | #alg " Algorithm forbidden in FIPS mode"); | 
|---|
|  | 543 |  | 
|---|
|  | 544 | #ifdef OPENSSL_FIPS_STRICT | 
|---|
|  | 545 | #define FIPS_BAD_ALGORITHM(alg) FIPS_BAD_ABORT(alg) | 
|---|
|  | 546 | #else | 
|---|
|  | 547 | #define FIPS_BAD_ALGORITHM(alg) \ | 
|---|
|  | 548 | { \ | 
|---|
|  | 549 | FIPSerr(FIPS_F_HASH_FINAL,FIPS_R_NON_FIPS_METHOD); \ | 
|---|
|  | 550 | ERR_add_error_data(2, "Algorithm=", #alg); \ | 
|---|
|  | 551 | return 0; \ | 
|---|
|  | 552 | } | 
|---|
|  | 553 | #endif | 
|---|
|  | 554 |  | 
|---|
|  | 555 | /* Low level digest API blocking macro */ | 
|---|
|  | 556 |  | 
|---|
|  | 557 | #define FIPS_NON_FIPS_MD_Init(alg) \ | 
|---|
|  | 558 | int alg##_Init(alg##_CTX *c) \ | 
|---|
|  | 559 | { \ | 
|---|
|  | 560 | if (FIPS_mode()) \ | 
|---|
|  | 561 | FIPS_BAD_ALGORITHM(alg) \ | 
|---|
|  | 562 | return private_##alg##_Init(c); \ | 
|---|
|  | 563 | } \ | 
|---|
|  | 564 | int private_##alg##_Init(alg##_CTX *c) | 
|---|
|  | 565 |  | 
|---|
|  | 566 | /* For ciphers the API often varies from cipher to cipher and each needs to | 
|---|
|  | 567 | * be treated as a special case. Variable key length ciphers (Blowfish, RC4, | 
|---|
|  | 568 | * CAST) however are very similar and can use a blocking macro. | 
|---|
|  | 569 | */ | 
|---|
|  | 570 |  | 
|---|
|  | 571 | #define FIPS_NON_FIPS_VCIPHER_Init(alg) \ | 
|---|
|  | 572 | void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) \ | 
|---|
|  | 573 | { \ | 
|---|
|  | 574 | if (FIPS_mode()) \ | 
|---|
|  | 575 | FIPS_BAD_ABORT(alg) \ | 
|---|
|  | 576 | private_##alg##_set_key(key, len, data); \ | 
|---|
|  | 577 | } \ | 
|---|
|  | 578 | void private_##alg##_set_key(alg##_KEY *key, int len, \ | 
|---|
|  | 579 | const unsigned char *data) | 
|---|
|  | 580 |  | 
|---|
|  | 581 | #else | 
|---|
|  | 582 |  | 
|---|
|  | 583 | #define FIPS_NON_FIPS_VCIPHER_Init(alg) \ | 
|---|
|  | 584 | void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) | 
|---|
|  | 585 |  | 
|---|
|  | 586 | #define FIPS_NON_FIPS_MD_Init(alg) \ | 
|---|
|  | 587 | int alg##_Init(alg##_CTX *c) | 
|---|
|  | 588 |  | 
|---|
|  | 589 | #endif /* def OPENSSL_FIPS */ | 
|---|
|  | 590 |  | 
|---|
|  | 591 | /* BEGIN ERROR CODES */ | 
|---|
|  | 592 | /* The following lines are auto generated by the script mkerr.pl. Any changes | 
|---|
|  | 593 | * made after this point may be overwritten when the script is next run. | 
|---|
|  | 594 | */ | 
|---|
|  | 595 | void ERR_load_CRYPTO_strings(void); | 
|---|
|  | 596 |  | 
|---|
|  | 597 | #define OPENSSL_HAVE_INIT       1 | 
|---|
|  | 598 | void OPENSSL_init(void); | 
|---|
|  | 599 |  | 
|---|
|  | 600 | /* Error codes for the CRYPTO functions. */ | 
|---|
|  | 601 |  | 
|---|
|  | 602 | /* Function codes. */ | 
|---|
|  | 603 | #define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX                 100 | 
|---|
|  | 604 | #define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID                103 | 
|---|
|  | 605 | #define CRYPTO_F_CRYPTO_GET_NEW_LOCKID                   101 | 
|---|
|  | 606 | #define CRYPTO_F_CRYPTO_SET_EX_DATA                      102 | 
|---|
|  | 607 | #define CRYPTO_F_DEF_ADD_INDEX                           104 | 
|---|
|  | 608 | #define CRYPTO_F_DEF_GET_CLASS                           105 | 
|---|
|  | 609 | #define CRYPTO_F_INT_DUP_EX_DATA                         106 | 
|---|
|  | 610 | #define CRYPTO_F_INT_FREE_EX_DATA                        107 | 
|---|
|  | 611 | #define CRYPTO_F_INT_NEW_EX_DATA                         108 | 
|---|
|  | 612 |  | 
|---|
|  | 613 | /* Reason codes. */ | 
|---|
|  | 614 | #define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK              100 | 
|---|
|  | 615 |  | 
|---|
|  | 616 | #ifdef  __cplusplus | 
|---|
|  | 617 | } | 
|---|
|  | 618 | #endif | 
|---|
|  | 619 | #endif | 
|---|