This is the least unacceptable way I've found for declaring the bignum data
authorGeoff Thorpe <geoff@openssl.org>
Tue, 4 Nov 2003 00:29:09 +0000 (00:29 +0000)
committerGeoff Thorpe <geoff@openssl.org>
Tue, 4 Nov 2003 00:29:09 +0000 (00:29 +0000)
and structures as constant without having to cast away const at any point.
There is still plenty of other code that makes gcc's "-Wcast-qual" unhappy,
but crypto/bn/ is now ok. Purists are welcome to suggest alternatives.

crypto/bn/bn.h
crypto/bn/bn_lib.c
crypto/bn/bn_nist.c

index 686b3b3..44ba175 100644 (file)
@@ -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;
 
index 783881d..f63232b 100644 (file)
@@ -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
index 2ababfb..ed148d8 100644 (file)
@@ -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 */