Index: openssl/crypto/bn/bn.h |
=================================================================== |
--- openssl/crypto/bn/bn.h (revision 105093) |
+++ openssl/crypto/bn/bn.h (working copy) |
@@ -56,6 +56,59 @@ |
* [including the GNU Public Licence.] |
*/ |
/* ==================================================================== |
+ * Copyright (c) 1998-2006 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). |
+ * |
+ */ |
+/* ==================================================================== |
* Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
* |
* Portions of the attached software ("Contribution") are developed by |
@@ -77,6 +130,7 @@ |
#include <stdio.h> /* FILE */ |
#endif |
#include <openssl/ossl_typ.h> |
+#include <openssl/crypto.h> |
#ifdef __cplusplus |
extern "C" { |
@@ -94,9 +148,11 @@ |
/* #define BN_DEBUG */ |
/* #define BN_DEBUG_RAND */ |
+#ifndef OPENSSL_SMALL_FOOTPRINT |
#define BN_MUL_COMBA |
#define BN_SQR_COMBA |
#define BN_RECURSION |
+#endif |
/* This next option uses the C libraries (2 word)/(1 word) function. |
* If it is not defined, I use my C version (which is slower). |
@@ -137,6 +193,8 @@ |
#define BN_DEC_FMT1 "%lu" |
#define BN_DEC_FMT2 "%019lu" |
#define BN_DEC_NUM 19 |
+#define BN_HEX_FMT1 "%lX" |
+#define BN_HEX_FMT2 "%016lX" |
#endif |
/* This is where the long long data type is 64 bits, but long is 32. |
@@ -162,85 +220,57 @@ |
#define BN_DEC_FMT1 "%llu" |
#define BN_DEC_FMT2 "%019llu" |
#define BN_DEC_NUM 19 |
+#define BN_HEX_FMT1 "%llX" |
+#define BN_HEX_FMT2 "%016llX" |
#endif |
#ifdef THIRTY_TWO_BIT |
#ifdef BN_LLONG |
-# if defined(OPENSSL_SYS_WIN32) && !defined(__GNUC__) |
+# if defined(_WIN32) && !defined(__GNUC__) |
# define BN_ULLONG unsigned __int64 |
+# define BN_MASK (0xffffffffffffffffI64) |
# else |
# define BN_ULLONG unsigned long long |
+# define BN_MASK (0xffffffffffffffffLL) |
# endif |
#endif |
-#define BN_ULONG unsigned long |
-#define BN_LONG long |
+#define BN_ULONG unsigned int |
+#define BN_LONG int |
#define BN_BITS 64 |
#define BN_BYTES 4 |
#define BN_BITS2 32 |
#define BN_BITS4 16 |
-#ifdef OPENSSL_SYS_WIN32 |
-/* VC++ doesn't like the LL suffix */ |
-#define BN_MASK (0xffffffffffffffffL) |
-#else |
-#define BN_MASK (0xffffffffffffffffLL) |
-#endif |
#define BN_MASK2 (0xffffffffL) |
#define BN_MASK2l (0xffff) |
#define BN_MASK2h1 (0xffff8000L) |
#define BN_MASK2h (0xffff0000L) |
#define BN_TBIT (0x80000000L) |
#define BN_DEC_CONV (1000000000L) |
-#define BN_DEC_FMT1 "%lu" |
-#define BN_DEC_FMT2 "%09lu" |
+#define BN_DEC_FMT1 "%u" |
+#define BN_DEC_FMT2 "%09u" |
#define BN_DEC_NUM 9 |
+#define BN_HEX_FMT1 "%X" |
+#define BN_HEX_FMT2 "%08X" |
#endif |
-#ifdef SIXTEEN_BIT |
-#ifndef BN_DIV2W |
-#define BN_DIV2W |
-#endif |
-#define BN_ULLONG unsigned long |
-#define BN_ULONG unsigned short |
-#define BN_LONG short |
-#define BN_BITS 32 |
-#define BN_BYTES 2 |
-#define BN_BITS2 16 |
-#define BN_BITS4 8 |
-#define BN_MASK (0xffffffff) |
-#define BN_MASK2 (0xffff) |
-#define BN_MASK2l (0xff) |
-#define BN_MASK2h1 (0xff80) |
-#define BN_MASK2h (0xff00) |
-#define BN_TBIT (0x8000) |
-#define BN_DEC_CONV (100000) |
-#define BN_DEC_FMT1 "%u" |
-#define BN_DEC_FMT2 "%05u" |
-#define BN_DEC_NUM 5 |
-#endif |
+/* 2011-02-22 SMS. |
+ * In various places, a size_t variable or a type cast to size_t was |
+ * used to perform integer-only operations on pointers. This failed on |
+ * VMS with 64-bit pointers (CC /POINTER_SIZE = 64) because size_t is |
+ * still only 32 bits. What's needed in these cases is an integer type |
+ * with the same size as a pointer, which size_t is not certain to be. |
+ * The only fix here is VMS-specific. |
+ */ |
+#if defined(OPENSSL_SYS_VMS) |
+# if __INITIAL_POINTER_SIZE == 64 |
+# define PTR_SIZE_INT long long |
+# else /* __INITIAL_POINTER_SIZE == 64 */ |
+# define PTR_SIZE_INT int |
+# endif /* __INITIAL_POINTER_SIZE == 64 [else] */ |
+#else /* defined(OPENSSL_SYS_VMS) */ |
+# define PTR_SIZE_INT size_t |
+#endif /* defined(OPENSSL_SYS_VMS) [else] */ |
-#ifdef EIGHT_BIT |
-#ifndef BN_DIV2W |
-#define BN_DIV2W |
-#endif |
-#define BN_ULLONG unsigned short |
-#define BN_ULONG unsigned char |
-#define BN_LONG char |
-#define BN_BITS 16 |
-#define BN_BYTES 1 |
-#define BN_BITS2 8 |
-#define BN_BITS4 4 |
-#define BN_MASK (0xffff) |
-#define BN_MASK2 (0xff) |
-#define BN_MASK2l (0xf) |
-#define BN_MASK2h1 (0xf8) |
-#define BN_MASK2h (0xf0) |
-#define BN_TBIT (0x80) |
-#define BN_DEC_CONV (100) |
-#define BN_DEC_FMT1 "%u" |
-#define BN_DEC_FMT2 "%02u" |
-#define BN_DEC_NUM 2 |
-#endif |
- |
#define BN_DEFAULT_BITS 1280 |
#define BN_FLG_MALLOCED 0x01 |
@@ -303,12 +333,8 @@ |
BIGNUM N; /* The modulus */ |
BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 |
* (Ni is only stored for bignum algorithm) */ |
-#if 0 |
- /* OpenSSL 0.9.9 preview: */ |
- BN_ULONG n0[2];/* least significant word(s) of Ni */ |
-#else |
- BN_ULONG n0; /* least significant word of Ni */ |
-#endif |
+ BN_ULONG n0[2];/* least significant word(s) of Ni; |
+ (type changed with 0.9.9, was "BN_ULONG n0;" before) */ |
int flags; |
}; |
@@ -504,6 +530,7 @@ |
char * BN_bn2dec(const BIGNUM *a); |
int BN_hex2bn(BIGNUM **a, const char *str); |
int BN_dec2bn(BIGNUM **a, const char *str); |
+int BN_asc2bn(BIGNUM **a, const char *str); |
int BN_gcd(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); |
int BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); /* returns -2 for error */ |
BIGNUM *BN_mod_inverse(BIGNUM *ret, |
@@ -531,17 +558,6 @@ |
int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, |
int do_trial_division, BN_GENCB *cb); |
-int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); |
- |
-int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
- const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2, |
- const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb); |
-int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, |
- BIGNUM *Xp1, BIGNUM *Xp2, |
- const BIGNUM *Xp, |
- const BIGNUM *e, BN_CTX *ctx, |
- BN_GENCB *cb); |
- |
BN_MONT_CTX *BN_MONT_CTX_new(void ); |
void BN_MONT_CTX_init(BN_MONT_CTX *ctx); |
int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b, |
@@ -560,19 +576,22 @@ |
#define BN_BLINDING_NO_UPDATE 0x00000001 |
#define BN_BLINDING_NO_RECREATE 0x00000002 |
-BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, /* const */ BIGNUM *mod); |
+BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod); |
void BN_BLINDING_free(BN_BLINDING *b); |
int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx); |
int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); |
int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx); |
int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *); |
int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *); |
+#ifndef OPENSSL_NO_DEPRECATED |
unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *); |
void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long); |
+#endif |
+CRYPTO_THREADID *BN_BLINDING_thread_id(BN_BLINDING *); |
unsigned long BN_BLINDING_get_flags(const BN_BLINDING *); |
void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long); |
BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b, |
- const BIGNUM *e, /* const */ BIGNUM *m, BN_CTX *ctx, |
+ const BIGNUM *e, BIGNUM *m, BN_CTX *ctx, |
int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx), |
BN_MONT_CTX *m_ctx); |
@@ -625,24 +644,24 @@ |
* t^p[0] + t^p[1] + ... + t^p[k] |
* where m = p[0] > p[1] > ... > p[k] = 0. |
*/ |
-int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]); |
+int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]); |
/* r = a mod p */ |
int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
- const unsigned int p[], BN_CTX *ctx); /* r = (a * b) mod p */ |
-int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], |
+ const int p[], BN_CTX *ctx); /* r = (a * b) mod p */ |
+int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[], |
BN_CTX *ctx); /* r = (a * a) mod p */ |
-int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[], |
+int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[], |
BN_CTX *ctx); /* r = (1 / b) mod p */ |
int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
- const unsigned int p[], BN_CTX *ctx); /* r = (a / b) mod p */ |
+ const int p[], BN_CTX *ctx); /* r = (a / b) mod p */ |
int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
- const unsigned int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */ |
+ const int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */ |
int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, |
- const unsigned int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ |
+ const int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */ |
int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, |
- const unsigned int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ |
-int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max); |
-int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a); |
+ const int p[], BN_CTX *ctx); /* r^2 + r = a mod p */ |
+int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max); |
+int BN_GF2m_arr2poly(const int p[], BIGNUM *a); |
/* faster mod functions for the 'NIST primes' |
* 0 <= a < p^2 */ |
@@ -751,10 +770,12 @@ |
#define bn_correct_top(a) \ |
{ \ |
BN_ULONG *ftl; \ |
- if ((a)->top > 0) \ |
+ int tmp_top = (a)->top; \ |
+ if (tmp_top > 0) \ |
{ \ |
- for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \ |
- if (*(ftl--)) break; \ |
+ for (ftl= &((a)->d[tmp_top-1]); tmp_top > 0; tmp_top--) \ |
+ if (*(ftl--)) break; \ |
+ (a)->top = tmp_top; \ |
} \ |
bn_pollute(a); \ |
} |