diff --git a/crypto/bn/bn.h b/crypto/bn/bn.h index 686b3b3079fcb5231397d096bebf5f2ad24cc1ff..44ba175247b0bd2ea181ce0e22001de1e6aa7d47 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 783881d3a6977964c8993a25a8673d4128c462d1..f63232b9fbc4f7ca0a427231b1da388669165d1a 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 2ababfbed1ae81f106ad7a91e5a8cb5aadc13b85..ed148d845ce63b553c4dd09bb726764f77a9a82f 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 */