psk->size = 16;
- ret = gnutls_rnd (GNUTLS_RND_NONCE, (char *) psk->data, 16);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, (char *) psk->data, 16);
if (ret < 0)
{
gnutls_assert ();
/* we do not need strong random numbers here.
*/
- ret = gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
session->key->key.size);
if (ret < 0)
{
return GNUTLS_E_MEMORY_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, session->key->key.data,
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, session->key->key.data,
session->key->key.size);
if (ret < 0)
{
/* we do not need strong random numbers here.
*/
- ret = gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, session->key->key.data,
session->key->key.size);
if (ret < 0)
{
return GNUTLS_E_INTERNAL_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
if (ret < 0)
{
gnutls_assert ();
return GNUTLS_E_MEMORY_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, entry->v.data, 20);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, entry->v.data, 20);
if (ret < 0)
{
gnutls_assert ();
return GNUTLS_E_MEMORY_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_NONCE, entry->salt.data, entry->salt.size);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, entry->salt.data, entry->salt.size);
if (ret < 0)
{
gnutls_assert ();
return GNUTLS_E_MEMORY_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, key->data, key->size);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, key->data, key->size);
if (ret < 0)
{
gnutls_assert ();
}
epriv.ptr = priv;
- ret = gnutls_rnd (GNUTLS_RND_NONCE, priv->session_ticket_IV, IV_SIZE);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, priv->session_ticket_IV, IV_SIZE);
if (ret < 0)
{
gnutls_assert ();
break;
case CIPHER_BLOCK:
- ret = gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, &rnd, 1);
if (ret < 0)
return gnutls_assert_val(ret);
{
/* copy the random IV.
*/
- ret = gnutls_rnd (GNUTLS_RND_NONCE, data_ptr, blocksize);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, data_ptr, blocksize);
if (ret < 0)
return gnutls_assert_val(ret);
/* generate server random value */
_gnutls_write_uint32 (tim, dst);
- ret = gnutls_rnd (GNUTLS_RND_NONCE, &dst[4], GNUTLS_RANDOM_SIZE - 4);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, &dst[4], GNUTLS_RANDOM_SIZE - 4);
if (ret < 0)
{
gnutls_assert ();
*len = TLS_MAX_SESSION_ID_SIZE;
- ret = gnutls_rnd (GNUTLS_RND_NONCE, session_id, *len);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, session_id, *len);
if (ret < 0)
{
gnutls_assert ();
}
- ret = gnutls_rnd (level, buf, size);
+ ret = _gnutls_rnd (level, buf, size);
if (ret < 0)
{
gnutls_assert ();
return GNUTLS_E_INTERNAL_ERROR;
}
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, ps, psize);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, ps, psize);
if (ret < 0)
{
gnutls_assert ();
for (i = 0; i < psize; i++)
while (ps[i] == 0)
{
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, &ps[i], 1);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, &ps[i], 1);
if (ret < 0)
{
gnutls_assert ();
#define PRIME_CHECK_PARAM 8
-
/*
- * Copyright (C) 2010 Free
- * Software Foundation, Inc.
+ * Copyright (C) 2010 Free Software Foundation, Inc.
*
* Author: Nikos Mavrogiannopoulos
*
/* generate a prime of the form p=2qw+1
* The algorithm is simple but probably it has to be modified to gcrypt's
- * since it is really really slow. Nature did not want 2qw+1 to be prime.
+ * since it is slow. Nature did not want 2qw+1 to be prime.
* The generator will be the generator of a subgroup of order q-1.
*
* Algorithm based on the algorithm in "A Computational Introduction to Number
* Theory and Algebra" by V. Shoup, sec 11.1 Finding a generator for Z^{*}_p
+ *
*/
inline static int
gen_group (mpz_t * prime, mpz_t * generator, unsigned int nbits)
if (nbits % 8 != 0)
p_bytes++;
+ w_bits = nbits - q_bytes * 8;
+ w_bytes = w_bits / 8;
+ if (w_bits % 8 != 0)
+ w_bytes++;
+
_gnutls_debug_log
("Generating group of prime of %u bits and format of 2wq+1. q_size=%u bits\n",
nbits, q_bytes * 8);
*/
for (;;)
{
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, q_bytes);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, buffer, w_bytes);
if (ret < 0)
{
gnutls_assert ();
goto fail;
}
- nettle_mpz_set_str_256_u (q, q_bytes, buffer);
+ nettle_mpz_set_str_256_u (w, w_bytes, buffer);
/* always odd */
mpz_setbit (q, 0);
- ret = mpz_probab_prime_p (q, PRIME_CHECK_PARAM);
+ ret = mpz_probab_prime_p (w, PRIME_CHECK_PARAM);
if (ret > 0)
{
break;
}
}
- /* now generate w of size p_bytes - q_bytes */
-
- w_bits = nbits - wrap_nettle_mpi_get_nbits (&q);
+ /* now generate q of size p_bytes - w_bytes */
_gnutls_debug_log
- ("Found prime q of %u bits. Will look for w of %u bits...\n",
- wrap_nettle_mpi_get_nbits (&q), w_bits);
-
- w_bytes = w_bits / 8;
- if (w_bits % 8 != 0)
- w_bytes++;
+ ("Found prime w of %u bits. Will look for q of %u bits...\n",
+ wrap_nettle_mpi_get_nbits (&w), q_bytes*8);
for (;;)
{
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, w_bytes);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, buffer, q_bytes);
if (ret < 0)
{
gnutls_assert ();
return ret;
}
- nettle_mpz_set_str_256_u (w, w_bytes, buffer);
+ nettle_mpz_set_str_256_u (q, q_bytes, buffer);
/* always odd */
mpz_setbit (w, 0);
- ret = mpz_probab_prime_p (w, PRIME_CHECK_PARAM);
+ ret = mpz_probab_prime_p (q, PRIME_CHECK_PARAM);
if (ret == 0)
{
continue;
}
}
- _gnutls_debug_log ("Found prime w of %u bits. Looking for generator...\n",
- wrap_nettle_mpi_get_nbits (&w));
+ _gnutls_debug_log ("Found prime q of %u bits. Looking for generator...\n",
+ wrap_nettle_mpi_get_nbits (&q));
/* finally a prime! Let calculate generator
*/
for (;;)
{
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, buffer, r_bytes);
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, buffer, r_bytes);
if (ret < 0)
{
gnutls_assert ();
static void
rnd_func (void *_ctx, unsigned length, uint8_t * data)
{
- gnutls_rnd (GNUTLS_RND_RANDOM, data, length);
+ _gnutls_rnd (GNUTLS_RND_RANDOM, data, length);
}
static void
RND_LOCK;
- ret = do_trivia_source (0);
- if (ret < 0)
+ if (level != GNUTLS_RND_NONCE)
{
- RND_UNLOCK;
- gnutls_assert ();
- return ret;
- }
+ ret = do_trivia_source (0);
+ if (ret < 0)
+ {
+ RND_UNLOCK;
+ gnutls_assert ();
+ return ret;
+ }
- ret = do_device_source (0);
- if (ret < 0)
- {
- RND_UNLOCK;
- gnutls_assert ();
- return ret;
+ ret = do_device_source (0);
+ if (ret < 0)
+ {
+ RND_UNLOCK;
+ gnutls_assert ();
+ return ret;
+ }
}
yarrow256_random (&yctx, datasize, data);
FILE *fp;
int fd, i;
- gnutls_rnd (GNUTLS_RND_NONCE, rnd, DIM (rnd));
+ _gnutls_rnd (GNUTLS_RND_NONCE, rnd, DIM (rnd));
for (i = 0; i < DIM (rnd) - 1; i++)
{
char c = letters[(unsigned char) rnd[i] % 26];
}
/* generate a unique ID */
- ret = gnutls_rnd (GNUTLS_RND_NONCE, id, sizeof (id));
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE, id, sizeof (id));
if (ret < 0)
{
gnutls_assert ();
#include <gnutls_errors.h>
#include <random.h>
-static void *rnd_ctx;
+void *gnutls_rnd_ctx;
int
_gnutls_rnd_init (void)
{
if (_gnutls_rnd_ops.init != NULL)
{
- if (_gnutls_rnd_ops.init (&rnd_ctx) < 0)
+ if (_gnutls_rnd_ops.init (&gnutls_rnd_ctx) < 0)
{
gnutls_assert ();
return GNUTLS_E_RANDOM_FAILED;
{
if (_gnutls_rnd_ops.deinit != NULL)
{
- _gnutls_rnd_ops.deinit (rnd_ctx);
+ _gnutls_rnd_ops.deinit (gnutls_rnd_ctx);
}
return;
int
gnutls_rnd (gnutls_rnd_level_t level, void *data, size_t len)
{
- if (len > 0)
- {
- return _gnutls_rnd_ops.rnd (rnd_ctx, level, data, len);
- }
- return 0;
+ return _gnutls_rnd(level, data, len);
}
#include <crypto-backend.h>
extern int crypto_rnd_prio;
+extern void* gnutls_rnd_ctx;
extern gnutls_crypto_rnd_st _gnutls_rnd_ops;
+inline static int
+_gnutls_rnd (gnutls_rnd_level_t level, void *data, size_t len)
+{
+ if (len > 0)
+ {
+ return _gnutls_rnd_ops.rnd (gnutls_rnd_ctx, level, data, len);
+ }
+ return 0;
+}
+
void _gnutls_rnd_deinit (void);
int _gnutls_rnd_init (void);
/* Generate the salt.
*/
- result = gnutls_rnd (GNUTLS_RND_NONCE, salt, sizeof (salt));
+ result = _gnutls_rnd (GNUTLS_RND_NONCE, salt, sizeof (salt));
if (result < 0)
{
gnutls_assert ();
opaque rnd[2];
int ret;
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, rnd, 2);
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, rnd, 2);
if (ret < 0)
{
gnutls_assert ();
return GNUTLS_E_INVALID_REQUEST;
}
- ret = gnutls_rnd (GNUTLS_RND_RANDOM, kdf_params->salt,
+ ret = _gnutls_rnd (GNUTLS_RND_RANDOM, kdf_params->salt,
kdf_params->salt_size);
if (ret < 0)
{
if (enc_params->iv_size)
{
- ret = gnutls_rnd (GNUTLS_RND_NONCE,
+ ret = _gnutls_rnd (GNUTLS_RND_NONCE,
enc_params->iv, enc_params->iv_size);
if (ret < 0)
{