]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Added _gnutls_mpi_random_modp() and _gnutls_mpi_modm() to replace _gnutls_mpi_mod().
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Tue, 19 Nov 2013 12:32:48 +0000 (13:32 +0100)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Wed, 27 Nov 2013 10:41:43 +0000 (11:41 +0100)
lib/auth/srp.c
lib/crypto-backend.h
lib/gnutls_dh.c
lib/gnutls_mpi.c
lib/gnutls_mpi.h
lib/gnutls_srp.c
lib/libgnutls.map
lib/nettle/mpi.c
lib/nettle/pk.c
tests/mpi.c

index ae30cd4ed7131322770cfec9f60b92205ec71c67..520f906cd70bde8fe0af4df91c67bda563f871f8 100644 (file)
@@ -71,7 +71,7 @@ inline static int check_param_mod_n(bigint_t a, bigint_t n, int is_a)
        int ret, err = 0;
        bigint_t r;
 
-       r = _gnutls_mpi_mod(a, n);
+       r = _gnutls_mpi_modm(NULL, a, n);
        if (r == NULL) {
                gnutls_assert();
                return GNUTLS_E_MEMORY_ERROR;
index ef3cd0ad7603e94710be875f53f85706985409b5..f7bcd53fa5910fe8b5b93ed26e850926fc893da0 100644 (file)
@@ -118,12 +118,12 @@ typedef struct gnutls_crypto_bigint {
        int (*bigint_cmp) (const bigint_t m1, const bigint_t m2);
        /* as bigint_cmp */
        int (*bigint_cmp_ui) (const bigint_t m1, unsigned long m2);
-       /* ret = a % b */
-        bigint_t(*bigint_mod) (const bigint_t a, const bigint_t b);
+       /* r = a % b */
+       bigint_t (*bigint_modm) (bigint_t r, const bigint_t a, const bigint_t b);
        /* a = b -> ret == a */
-        bigint_t(*bigint_set) (bigint_t a, const bigint_t b);
+       bigint_t (*bigint_set) (bigint_t a, const bigint_t b);
        /* a = b -> ret == a */
-        bigint_t(*bigint_set_ui) (bigint_t a, unsigned long b);
+       bigint_t (*bigint_set_ui) (bigint_t a, unsigned long b);
        unsigned int (*bigint_get_nbits) (const bigint_t a);
        /* w = b ^ e mod m */
         bigint_t(*bigint_powm) (bigint_t w, const bigint_t b,
index be41bb08ef5f44873bf329e60d6278bffb712ee6..da40cffe348af5d1a5bfb3adea22d8ccac3944d7 100644 (file)
@@ -65,7 +65,7 @@ gnutls_calc_dh_secret(bigint_t * ret_y, bigint_t * ret_x, bigint_t g,
                return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
        }
 
-       x = _gnutls_mpi_new(x_size);
+       x = _gnutls_mpi_new(x_size + 64);
        if (x == NULL) {
                gnutls_assert();
                ret = GNUTLS_E_MEMORY_ERROR;
@@ -80,7 +80,7 @@ gnutls_calc_dh_secret(bigint_t * ret_y, bigint_t * ret_x, bigint_t g,
        }
 
        do {
-               if (_gnutls_mpi_randomize(x, x_size, GNUTLS_RND_RANDOM) ==
+               if (_gnutls_mpi_random_modp(x, prime, GNUTLS_RND_RANDOM) ==
                    NULL) {
                        gnutls_assert();
                        ret = GNUTLS_E_INTERNAL_ERROR;
@@ -114,7 +114,7 @@ gnutls_calc_dh_key(bigint_t * key, bigint_t f, bigint_t x, bigint_t prime)
        unsigned int bits;
        int ret;
 
-       ff = _gnutls_mpi_mod(f, prime);
+       ff = _gnutls_mpi_modm(NULL, f, prime);
        _gnutls_mpi_add_ui(ff, ff, 1);
 
        /* check if f==0,1,p-1. 
index aad82a0b0ddf245cc642991406f04af3f0bc70d8..39560c4b1c1509564d76c3864800a900fb725bbf 100644 (file)
 /* Functions that refer to the mpi library.
  */
 
-#define clearbit(v,n)    ((unsigned char)(v) & ~( (unsigned char)(1) << (unsigned)(n)))
-
+/* Returns a random number r, 0 < r < p */
 bigint_t
-_gnutls_mpi_randomize(bigint_t r, unsigned int bits,
+_gnutls_mpi_random_modp(bigint_t r, bigint_t p,
                      gnutls_rnd_level_t level)
 {
-       size_t size = 1 + (bits / 8);
+       size_t size;
        int ret;
-       int rem, i;
        bigint_t tmp;
        uint8_t tmpbuf[512];
        uint8_t *buf;
        int buf_release = 0;
+       
+       size = ((_gnutls_mpi_get_nbits(p)+64)/8) + 1;
 
        if (size < sizeof(tmpbuf)) {
                buf = tmpbuf;
@@ -60,28 +60,22 @@ _gnutls_mpi_randomize(bigint_t r, unsigned int bits,
                buf_release = 1;
        }
 
-
        ret = _gnutls_rnd(level, buf, size);
        if (ret < 0) {
                gnutls_assert();
                goto cleanup;
        }
-
-       /* mask the bits that weren't requested */
-       rem = bits % 8;
-
-       if (rem == 0) {
-               buf[0] = 0;
-       } else {
-               for (i = 8; i >= rem; i--)
-                       buf[0] = clearbit(buf[0], i);
-       }
-
+       
        ret = _gnutls_mpi_scan(&tmp, buf, size);
        if (ret < 0) {
                gnutls_assert();
                goto cleanup;
        }
+       
+       _gnutls_mpi_modm(tmp, tmp, p);
+
+       if (_gnutls_mpi_cmp_ui(tmp, 0) == 0)
+               _gnutls_mpi_add_ui(tmp, tmp, 1);
 
        if (buf_release != 0) {
                gnutls_free(buf);
index 6011911064c9236074c2df48ce33353a7cbc6a26..f0a20790d37edb24e833c0bdf03ea534e5a82499 100644 (file)
@@ -30,7 +30,7 @@
 extern int crypto_bigint_prio;
 extern gnutls_crypto_bigint_st _gnutls_mpi_ops;
 
-bigint_t _gnutls_mpi_randomize(bigint_t, unsigned int bits,
+bigint_t _gnutls_mpi_random_modp(bigint_t, bigint_t p,
                               gnutls_rnd_level_t level);
 
 #define _gnutls_mpi_new _gnutls_mpi_ops.bigint_new
@@ -38,6 +38,7 @@ bigint_t _gnutls_mpi_randomize(bigint_t, unsigned int bits,
 #define _gnutls_mpi_cmp _gnutls_mpi_ops.bigint_cmp
 #define _gnutls_mpi_cmp_ui _gnutls_mpi_ops.bigint_cmp_ui
 #define _gnutls_mpi_mod _gnutls_mpi_ops.bigint_mod
+#define _gnutls_mpi_modm _gnutls_mpi_ops.bigint_modm
 #define _gnutls_mpi_set _gnutls_mpi_ops.bigint_set
 #define _gnutls_mpi_set_ui _gnutls_mpi_ops.bigint_set_ui
 #define _gnutls_mpi_get_nbits _gnutls_mpi_ops.bigint_get_nbits
index be0143ff1acf92e9741b1e8f5e4c5c37d5a38ebe..8b26afc94515d08edec107bc2cdd9ccefca9c719 100644 (file)
@@ -108,7 +108,7 @@ _gnutls_calc_srp_B(bigint_t * ret_b, bigint_t g, bigint_t n, bigint_t v)
                goto error;
        }
 
-       b = _gnutls_mpi_randomize(NULL, bits, GNUTLS_RND_RANDOM);
+       b = _gnutls_mpi_random_modp(NULL, n, GNUTLS_RND_RANDOM);
 
        tmpB = _gnutls_mpi_new(bits);
        if (tmpB == NULL) {
@@ -251,7 +251,7 @@ bigint_t _gnutls_calc_srp_A(bigint_t * a, bigint_t g, bigint_t n)
        int bits;
 
        bits = _gnutls_mpi_get_nbits(n);
-       tmpa = _gnutls_mpi_randomize(NULL, bits, GNUTLS_RND_RANDOM);
+       tmpa = _gnutls_mpi_random_modp(NULL, n, GNUTLS_RND_RANDOM);
 
        A = _gnutls_mpi_new(bits);
        if (A == NULL) {
index 8ddd32dcb5fa0cca7cfb3020cd4810af8e9f69cc..9b6506cccf9099566c67cd5279cc2bcaed2f8265 100644 (file)
@@ -982,7 +982,6 @@ GNUTLS_PRIVATE {
     _gnutls_pbkdf2_sha1;
     # Internal symbols needed by tests/mpi:
     _gnutls_mpi_ops;
-    _gnutls_mpi_randomize;
     _gnutls_mpi_log;
     _gnutls_mpi_release;
     # Internal symbols needed by tests/pkcs12_s2k:
index 994f84198c9f55fa1c37c57de346713aa425a955..bd37b10d56ce01a76a923de4c3c691c64cf753aa 100644 (file)
@@ -191,15 +191,15 @@ static void wrap_nettle_mpi_clear(bigint_t a)
               TOMPZ(a)[0]._mp_alloc * sizeof(mp_limb_t));
 }
 
-static bigint_t wrap_nettle_mpi_mod(const bigint_t a, const bigint_t b)
+static bigint_t wrap_nettle_mpi_modm(bigint_t r, const bigint_t a, const bigint_t b)
 {
-       bigint_t r = wrap_nettle_mpi_new(wrap_nettle_mpi_get_nbits(b));
-
-       if (r == NULL)
-               return NULL;
-
+       if (r == NULL) {
+                r = wrap_nettle_mpi_new(wrap_nettle_mpi_get_nbits(b));
+                if (r == NULL) return NULL;
+       }
+       
        mpz_mod(TOMPZ(r), TOMPZ(a), TOMPZ(b));
-
+       
        return r;
 }
 
@@ -584,7 +584,7 @@ gnutls_crypto_bigint_st _gnutls_mpi_ops = {
        .bigint_new = wrap_nettle_mpi_new,
        .bigint_cmp = wrap_nettle_mpi_cmp,
        .bigint_cmp_ui = wrap_nettle_mpi_cmp_ui,
-       .bigint_mod = wrap_nettle_mpi_mod,
+       .bigint_modm = wrap_nettle_mpi_modm,
        .bigint_set = wrap_nettle_mpi_set,
        .bigint_set_ui = wrap_nettle_mpi_set_ui,
        .bigint_get_nbits = wrap_nettle_mpi_get_nbits,
index 9a8de616730b622ffd9ddcfe26e0c9ed84ee3476..ae16f5aca01d4e922dbc43fc5a1481906ccd260c 100644 (file)
@@ -881,7 +881,7 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo,
                        /* [RSA_PRIME1] = d % p-1, [RSA_PRIME2] = d % q-1 */
                        _gnutls_mpi_sub_ui(t1, params->params[RSA_PRIME1],
                                           1);
-                       t2 = _gnutls_mpi_mod(params->params[RSA_PRIV], t1);
+                       t2 = _gnutls_mpi_modm(NULL, params->params[RSA_PRIV], t1);
                        if (t2 == NULL) {
                                ret =
                                    gnutls_assert_val
@@ -901,7 +901,7 @@ wrap_nettle_pk_verify_params(gnutls_pk_algorithm_t algo,
                                           1);
                        zrelease_mpi_key(&t2);
 
-                       t2 = _gnutls_mpi_mod(params->params[RSA_PRIV], t1);
+                       t2 = _gnutls_mpi_modm(NULL, params->params[RSA_PRIV], t1);
                        if (t2 == NULL) {
                                ret =
                                    gnutls_assert_val
@@ -1051,11 +1051,11 @@ static int calc_rsa_exp(gnutls_pk_params_st * params)
        /* [6] = d % p-1, [7] = d % q-1 */
        _gnutls_mpi_sub_ui(tmp, params->params[3], 1);
        params->params[6] =
-           _gnutls_mpi_mod(params->params[2] /*d */ , tmp);
+           _gnutls_mpi_modm(NULL, params->params[2] /*d */ , tmp);
 
        _gnutls_mpi_sub_ui(tmp, params->params[4], 1);
        params->params[7] =
-           _gnutls_mpi_mod(params->params[2] /*d */ , tmp);
+           _gnutls_mpi_modm(NULL, params->params[2] /*d */ , tmp);
 
        zrelease_mpi_key(&tmp);
 
index 40788fd72d5fc595070474c2b95cb240763154f7..3d2179f321b22c15dee9a9e887b16af7252d01be 100644 (file)
@@ -37,10 +37,8 @@ static void tls_log_func(int level, const char *str)
        fprintf(stderr, "|<%d>| %s", level, str);
 }
 
-#define RND_BITS 510           /* not multiple of 8 */
 void doit(void)
 {
-       int rc;
        bigint_t n1, n2, n3, n4;
 
        global_init();
@@ -61,13 +59,9 @@ void doit(void)
        if (n3 == NULL)
                fail("mpi_set_ui failed\n");
 
-       _gnutls_mpi_randomize(n1, RND_BITS, GNUTLS_RND_NONCE);
-
-       _gnutls_mpi_log("rand:", n1);
-
-       rc = _gnutls_mpi_get_nbits(n1);
-       if (rc > RND_BITS)
-               fail("mpi_get_nbits failed... returned %d\n", rc);
+       n1 = _gnutls_mpi_set_ui(NULL, 12498924);
+       if (n3 == NULL)
+               fail("mpi_set_ui failed\n");
 
        n4 = _gnutls_mpi_addm(NULL, n1, n3, n2);
        if (n4 == NULL)