Commit 6e3dae5625d7375fcfdb3d748cac1eb083815de7

Daniel Mendler 2019-10-08T21:47:57

add MP_BUF error

diff --git a/bn_mp_pack.c b/bn_mp_pack.c
index 6b90c1e..48da1b2 100644
--- a/bn_mp_pack.c
+++ b/bn_mp_pack.c
@@ -16,7 +16,7 @@ mp_err mp_pack(void *rop, size_t maxcount, size_t *writtencount, mp_order order,
    mp_int t;
 
    if (maxcount == 0u) {
-      return MP_VAL;
+      return MP_BUF;
    }
 
    if ((err = mp_init_copy(&t, op)) != MP_OKAY) {
@@ -38,8 +38,8 @@ mp_err mp_pack(void *rop, size_t maxcount, size_t *writtencount, mp_order order,
 
    for (i = 0u; i < count; ++i) {
       if (i >= maxcount) {
-          err = MP_VAL;
-          break;
+         err = MP_BUF;
+         break;
       }
       for (j = 0u; j < size; ++j) {
          unsigned char *byte = (unsigned char *)rop +
diff --git a/bn_mp_to_radix.c b/bn_mp_to_radix.c
index 3793a6f..e0613b4 100644
--- a/bn_mp_to_radix.c
+++ b/bn_mp_to_radix.c
@@ -16,14 +16,11 @@ mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, i
    mp_digit d;
    char   *_s = str;
 
-
-   /* If we want to fill a bucket we need a bucket in the first place. */
-   if (str == NULL) {
-      return MP_VAL;
-   }
-
    /* check range of radix and size*/
-   if ((maxlen < 2u) || (radix < 2) || (radix > 64)) {
+   if (maxlen < 2u) {
+      return MP_BUF;
+   }
+   if ((radix < 2) || (radix > 64)) {
       return MP_VAL;
    }
 
@@ -57,9 +54,7 @@ mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, i
    while (!MP_IS_ZERO(&t)) {
       if (--maxlen < 1u) {
          /* no more room */
-         /* TODO: It could mimic mp_to_radix_n if that is not an error
-                  or at least not this error (MP_ITER or a new one?). */
-         err = MP_VAL;
+         err = MP_BUF;
          break;
       }
       if ((err = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) {
diff --git a/bn_mp_to_sbin.c b/bn_mp_to_sbin.c
index e28dcce..3e194ca 100644
--- a/bn_mp_to_sbin.c
+++ b/bn_mp_to_sbin.c
@@ -8,7 +8,7 @@ mp_err mp_to_sbin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *wr
 {
    mp_err err;
    if (maxlen == 0u) {
-      return MP_VAL;
+      return MP_BUF;
    }
 
    if ((err = mp_to_ubin(a, buf + 1, maxlen - 1u, written)) != MP_OKAY) {
diff --git a/bn_mp_to_ubin.c b/bn_mp_to_ubin.c
index 797cd1a..cfa391a 100644
--- a/bn_mp_to_ubin.c
+++ b/bn_mp_to_ubin.c
@@ -11,7 +11,7 @@ mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *wr
    mp_int  t;
 
    if (maxlen == 0u) {
-      return MP_VAL;
+      return MP_BUF;
    }
 
    if ((err = mp_init_copy(&t, a)) != MP_OKAY) {
@@ -21,7 +21,7 @@ mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *wr
    x = 0u;
    while (!MP_IS_ZERO(&t)) {
       if (maxlen == 0u) {
-         err = MP_VAL;
+         err = MP_BUF;
          goto LBL_ERR;
       }
       maxlen--;
diff --git a/demo/test.c b/demo/test.c
index c306d50..8cad788 100644
--- a/demo/test.c
+++ b/demo/test.c
@@ -1260,8 +1260,6 @@ static int test_mp_read_radix(void)
    if (mp_init_multi(&a, NULL)!= MP_OKAY)                                       goto LTM_ERR;
 
    if ((err = mp_read_radix(&a, "123456", 10)) != MP_OKAY)                     goto LTM_ERR;
-   /* Must fail */
-   if ((err = mp_to_radix(&a, NULL, SIZE_MAX, NULL, 10)) != MP_VAL)             goto LTM_ERR;
 
    if ((err = mp_to_radix(&a, buf, SIZE_MAX, &written, 10)) != MP_OKAY)        goto LTM_ERR;
    printf(" '123456' a == %s, length = %zu\n", buf, written);
diff --git a/tommath.h b/tommath.h
index f5c9250..deb042a 100644
--- a/tommath.h
+++ b/tommath.h
@@ -117,24 +117,25 @@ typedef uint64_t             private_mp_word;
 
 #ifdef MP_USE_ENUMS
 typedef enum {
-   MP_ZPOS = 0,
-   MP_NEG = 1
+   MP_ZPOS = 0,   /* positive */
+   MP_NEG = 1     /* negative */
 } mp_sign;
 typedef enum {
-   MP_LT = -1,
-   MP_EQ = 0,
-   MP_GT = 1
+   MP_LT = -1,    /* less than */
+   MP_EQ = 0,     /* equal */
+   MP_GT = 1      /* greater than */
 } mp_ord;
 typedef enum {
    MP_NO = 0,
    MP_YES = 1
 } mp_bool;
 typedef enum {
-   MP_OKAY  = 0,
-   MP_ERR   = -1,
-   MP_MEM   = -2,
-   MP_VAL   = -3,
-   MP_ITER  = -4
+   MP_OKAY  = 0,   /* no error */
+   MP_ERR   = -1,  /* unknown error */
+   MP_MEM   = -2,  /* out of mem */
+   MP_VAL   = -3,  /* invalid input */
+   MP_ITER  = -4,  /* maximum iterations reached */
+   MP_BUF   = -5,  /* buffer overflow, supplied buffer too small */
 } mp_err;
 typedef enum {
    MP_LSB_FIRST = -1,
@@ -154,15 +155,16 @@ typedef int mp_ord;
 #define MP_EQ         0   /* equal to */
 #define MP_GT         1   /* greater than */
 typedef int mp_bool;
-#define MP_YES        1   /* yes response */
-#define MP_NO         0   /* no response */
+#define MP_YES        1
+#define MP_NO         0
 typedef int mp_err;
-#define MP_OKAY       0   /* ok result */
+#define MP_OKAY       0   /* no error */
 #define MP_ERR        -1  /* unknown error */
 #define MP_MEM        -2  /* out of mem */
 #define MP_VAL        -3  /* invalid input */
 #define MP_RANGE      (MP_DEPRECATED_PRAGMA("MP_RANGE has been deprecated in favor of MP_VAL") MP_VAL)
-#define MP_ITER       -4  /* Max. iterations reached */
+#define MP_ITER       -4  /* maximum iterations reached */
+#define MP_BUF        -5  /* buffer overflow, supplied buffer too small */
 typedef int mp_order;
 #define MP_LSB_FIRST -1
 #define MP_MSB_FIRST  1