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;
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 */