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;
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,
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;
}
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;
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.
/* 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;
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);
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
#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
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) {
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) {
_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:
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;
}
.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,
/* [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
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
/* [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);
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();
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)