diff options
-rw-r--r-- | crypto/bn/bn.h | 21 | ||||
-rw-r--r-- | crypto/bn/bn_lib.c | 8 | ||||
-rw-r--r-- | crypto/bn/bn_nist.c | 31 |
3 files changed, 45 insertions, 15 deletions
diff --git a/crypto/bn/bn.h b/crypto/bn/bn.h index 686b3b3079..44ba175247 100644 --- a/crypto/bn/bn.h +++ b/crypto/bn/bn.h @@ -252,6 +252,27 @@ typedef struct bignum_st int flags; } BIGNUM; +/* Declaring static BIGNUMs as constant is tricky in C; the 'd' data can't be + * pre-declared const without having to cast away the const when declaring the + * BIGNUM. We use this alternative type for declaring const BIGNUMs. See + * bn_nist.c for examples. */ +typedef struct bignum_c_st + { + const BN_ULONG *d; + int top; + int dmax; + int neg; + int flags; + } BIGNUM_C; +#ifdef BN_DEBUG +/* Use a function to do this so that we can type-check the pointer we're + * casting */ +const BIGNUM *BIGNUM_CONST(const BIGNUM_C *bn); +#else +/* Use a macro instead */ +#define BIGNUM_CONST(bn) ((const BIGNUM *)bn) +#endif + /* Used for temp variables (declaration hidden in bn_lcl.h) */ typedef struct bignum_ctx BN_CTX; diff --git a/crypto/bn/bn_lib.c b/crypto/bn/bn_lib.c index 783881d3a6..f63232b9fb 100644 --- a/crypto/bn/bn_lib.c +++ b/crypto/bn/bn_lib.c @@ -874,3 +874,11 @@ int bn_cmp_part_words(const BN_ULONG *a, const BN_ULONG *b, } return bn_cmp_words(a,b,cl); } + +/* See the comments surrounding BIGNUM_C in bn.h */ +#ifdef BN_DEBUG +const BIGNUM *BIGNUM_CONST(const BIGNUM_C *bn) + { + return (const BIGNUM *)bn; + } +#endif diff --git a/crypto/bn/bn_nist.c b/crypto/bn/bn_nist.c index 2ababfbed1..ed148d845c 100644 --- a/crypto/bn/bn_nist.c +++ b/crypto/bn/bn_nist.c @@ -127,39 +127,40 @@ const static BN_ULONG _nist_p_521[] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x01}; #endif +static const BIGNUM_C bn_nist_p_192 = + { _nist_p_192, BN_NIST_192_TOP, BN_NIST_192_TOP, 0, BN_FLG_STATIC_DATA }; +static const BIGNUM_C bn_nist_p_224 = + { _nist_p_224, BN_NIST_224_TOP, BN_NIST_224_TOP, 0, BN_FLG_STATIC_DATA }; +static const BIGNUM_C bn_nist_p_256 = + { _nist_p_256, BN_NIST_256_TOP, BN_NIST_256_TOP, 0, BN_FLG_STATIC_DATA }; +static const BIGNUM_C bn_nist_p_384 = + { _nist_p_384, BN_NIST_384_TOP, BN_NIST_384_TOP, 0, BN_FLG_STATIC_DATA }; +static const BIGNUM_C bn_nist_p_521 = + { _nist_p_521, BN_NIST_521_TOP, BN_NIST_521_TOP, 0, BN_FLG_STATIC_DATA }; + const BIGNUM *BN_get0_nist_prime_192(void) { - static BIGNUM const_nist_192={(BN_ULONG *)_nist_p_192,BN_NIST_192_TOP, - BN_NIST_192_TOP, 0, BN_FLG_STATIC_DATA}; - return &const_nist_192; + return BIGNUM_CONST(&bn_nist_p_192); } const BIGNUM *BN_get0_nist_prime_224(void) { - static BIGNUM const_nist_224={(BN_ULONG *)_nist_p_224,BN_NIST_224_TOP, - BN_NIST_224_TOP, 0, BN_FLG_STATIC_DATA}; - return &const_nist_224; + return BIGNUM_CONST(&bn_nist_p_224); } const BIGNUM *BN_get0_nist_prime_256(void) { - static BIGNUM const_nist_256={(BN_ULONG *)_nist_p_256,BN_NIST_256_TOP, - BN_NIST_256_TOP, 0, BN_FLG_STATIC_DATA}; - return &const_nist_256; + return BIGNUM_CONST(&bn_nist_p_256); } const BIGNUM *BN_get0_nist_prime_384(void) { - static BIGNUM const_nist_384={(BN_ULONG *)_nist_p_384,BN_NIST_384_TOP, - BN_NIST_384_TOP, 0, BN_FLG_STATIC_DATA}; - return &const_nist_384; + return BIGNUM_CONST(&bn_nist_p_384); } const BIGNUM *BN_get0_nist_prime_521(void) { - static BIGNUM const_nist_521={(BN_ULONG *)_nist_p_521,BN_NIST_521_TOP, - BN_NIST_521_TOP, 0, BN_FLG_STATIC_DATA}; - return &const_nist_521; + return BIGNUM_CONST(&bn_nist_p_521); } /* some misc internal functions */ |