summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/bn/bn.h21
-rw-r--r--crypto/bn/bn_lib.c8
-rw-r--r--crypto/bn/bn_nist.c31
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 */