make mp_word private mp_word is an internal type and it is problematic if it is exposed in the public api. See for example #216 - MSVC does not support 128 bit mp_words. But it is perfectly ok to use those internally in the library, as long as the library is compiled with GCC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
diff --git a/demo/shared.h b/demo/shared.h
index b32def7..872465d 100644
--- a/demo/shared.h
+++ b/demo/shared.h
@@ -19,6 +19,6 @@
#endif
#define MP_WUR /* TODO: result checks disabled for now */
-#include "tommath.h"
+#include "tommath_private.h"
extern void ndraw(mp_int* a, const char* name);
diff --git a/demo/test.c b/demo/test.c
index a5ca63d..82825b5 100644
--- a/demo/test.c
+++ b/demo/test.c
@@ -1,5 +1,4 @@
#include "shared.h"
-#include "tommath_private.h"
static long rand_long(void)
{
diff --git a/tommath.h b/tommath.h
index d70eef6..20a6462 100644
--- a/tommath.h
+++ b/tommath.h
@@ -55,14 +55,14 @@ extern "C" {
*/
#ifdef MP_8BIT
typedef uint8_t mp_digit;
-typedef uint16_t mp_word;
+typedef uint16_t private_mp_word;
# define MP_SIZEOF_MP_DIGIT 1
# ifdef MP_DIGIT_BIT
# error You must not define MP_DIGIT_BIT when using MP_8BIT
# endif
#elif defined(MP_16BIT)
typedef uint16_t mp_digit;
-typedef uint32_t mp_word;
+typedef uint32_t private_mp_word;
# define MP_SIZEOF_MP_DIGIT 2
# ifdef MP_DIGIT_BIT
# error You must not define MP_DIGIT_BIT when using MP_16BIT
@@ -70,14 +70,14 @@ typedef uint32_t mp_word;
#elif defined(MP_64BIT)
/* for GCC only on supported platforms */
typedef uint64_t mp_digit;
-typedef unsigned long mp_word __attribute__((mode(TI)));
+typedef unsigned long private_mp_word __attribute__((mode(TI)));
# define MP_DIGIT_BIT 60
#else
/* this is the default case, 28-bit digits */
/* this is to make porting into LibTomCrypt easier :-) */
typedef uint32_t mp_digit;
-typedef uint64_t mp_word;
+typedef uint64_t private_mp_word;
# ifdef MP_31BIT
/* this is an extension that uses 31-bit digits */
@@ -89,6 +89,9 @@ typedef uint64_t mp_word;
# endif
#endif
+/* mp_word is a private type */
+#define mp_word MP_DEPRECATED_PRAGMA("mp_word has been made private") private_mp_word
+
/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */
#ifndef MP_DIGIT_BIT
# define MP_DIGIT_BIT (((CHAR_BIT * MP_SIZEOF_MP_DIGIT) - 1)) /* bits per digit */
@@ -172,7 +175,7 @@ TOOM_SQR_CUTOFF;
#endif
/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
-#define PRIVATE_MP_WARRAY (1uLL << (((CHAR_BIT * sizeof(mp_word)) - (2 * MP_DIGIT_BIT)) + 1))
+#define PRIVATE_MP_WARRAY (1uLL << (((CHAR_BIT * sizeof(private_mp_word)) - (2 * MP_DIGIT_BIT)) + 1))
#define MP_WARRAY (MP_DEPRECATED_PRAGMA("MP_WARRAY is an internal macro") PRIVATE_MP_WARRAY)
#if defined(__GNUC__) && __GNUC__ >= 4
diff --git a/tommath_private.h b/tommath_private.h
index 3bf4e7c..2c07683 100644
--- a/tommath_private.h
+++ b/tommath_private.h
@@ -131,6 +131,10 @@ extern void MP_FREE(void *mem, size_t size);
#undef MP_WARRAY
#define MP_WARRAY PRIVATE_MP_WARRAY
+/* TODO: Remove private_mp_word as soon as deprecated mp_word is removed from tommath. */
+#undef mp_word
+typedef private_mp_word mp_word;
+
#define MP_MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MP_MAX(x, y) (((x) > (y)) ? (x) : (y))