summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2013-11-19 13:32:48 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2013-11-27 11:41:43 +0100
commit0be38cfe07cbbbd902814c61a2e41ed44c758bb8 (patch)
treef829e35769802f7e6220e1deb9f25a8618d25ff1 /lib
parent4293b9ae12d07c863f882c5c0915eeccc76ed1d2 (diff)
downloadgnutls-0be38cfe07cbbbd902814c61a2e41ed44c758bb8.tar.gz
Added _gnutls_mpi_random_modp() and _gnutls_mpi_modm() to replace _gnutls_mpi_mod().
Diffstat (limited to 'lib')
-rw-r--r--lib/auth/srp.c2
-rw-r--r--lib/crypto-backend.h8
-rw-r--r--lib/gnutls_dh.c6
-rw-r--r--lib/gnutls_mpi.c28
-rw-r--r--lib/gnutls_mpi.h3
-rw-r--r--lib/gnutls_srp.c4
-rw-r--r--lib/libgnutls.map1
-rw-r--r--lib/nettle/mpi.c16
-rw-r--r--lib/nettle/pk.c8
9 files changed, 35 insertions, 41 deletions
diff --git a/lib/auth/srp.c b/lib/auth/srp.c
index ae30cd4ed7..520f906cd7 100644
--- a/lib/auth/srp.c
+++ b/lib/auth/srp.c
@@ -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;
diff --git a/lib/crypto-backend.h b/lib/crypto-backend.h
index ef3cd0ad76..f7bcd53fa5 100644
--- a/lib/crypto-backend.h
+++ b/lib/crypto-backend.h
@@ -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,
diff --git a/lib/gnutls_dh.c b/lib/gnutls_dh.c
index be41bb08ef..da40cffe34 100644
--- a/lib/gnutls_dh.c
+++ b/lib/gnutls_dh.c
@@ -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.
diff --git a/lib/gnutls_mpi.c b/lib/gnutls_mpi.c
index aad82a0b0d..39560c4b1c 100644
--- a/lib/gnutls_mpi.c
+++ b/lib/gnutls_mpi.c
@@ -35,19 +35,19 @@
/* 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);
diff --git a/lib/gnutls_mpi.h b/lib/gnutls_mpi.h
index 6011911064..f0a20790d3 100644
--- a/lib/gnutls_mpi.h
+++ b/lib/gnutls_mpi.h
@@ -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
diff --git a/lib/gnutls_srp.c b/lib/gnutls_srp.c
index be0143ff1a..8b26afc945 100644
--- a/lib/gnutls_srp.c
+++ b/lib/gnutls_srp.c
@@ -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) {
diff --git a/lib/libgnutls.map b/lib/libgnutls.map
index 8ddd32dcb5..9b6506cccf 100644
--- a/lib/libgnutls.map
+++ b/lib/libgnutls.map
@@ -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:
diff --git a/lib/nettle/mpi.c b/lib/nettle/mpi.c
index 994f84198c..bd37b10d56 100644
--- a/lib/nettle/mpi.c
+++ b/lib/nettle/mpi.c
@@ -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,
diff --git a/lib/nettle/pk.c b/lib/nettle/pk.c
index 9a8de61673..ae16f5aca0 100644
--- a/lib/nettle/pk.c
+++ b/lib/nettle/pk.c
@@ -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);