tomcrypt/src/math/rand_prime.c

89 lines
1.9 KiB
C
Raw Normal View History

2005-08-01 16:36:47 +00:00
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
*
* LibTomCrypt is a library that provides various cryptographic
* algorithms in a highly modular and flexible manner.
*
* The library is free for all purposes without any express
* guarantee it works.
*/
#include "tomcrypt.h"
2017-02-28 21:21:39 +01:00
#if defined(LTC_MRSA) || (!defined(LTC_NO_MATH) && !defined(LTC_NO_PRNGS))
2005-08-01 16:36:47 +00:00
/**
@file rand_prime.c
Generate a random prime, Tom St Denis
2015-12-20 17:05:58 +01:00
*/
2005-08-01 16:36:47 +00:00
#define USE_BBS 1
int rand_prime(void *N, long len, prng_state *prng, int wprng)
{
int err, res, type;
unsigned char *buf;
LTC_ARGCHK(N != NULL);
/* get type */
if (len < 0) {
type = USE_BBS;
len = -len;
} else {
type = 0;
}
/* allow sizes between 2 and 512 bytes for a prime size */
2015-12-20 17:05:58 +01:00
if (len < 2 || len > 512) {
2005-08-01 16:36:47 +00:00
return CRYPT_INVALID_PRIME_SIZE;
}
2015-12-20 17:05:58 +01:00
2005-08-01 16:36:47 +00:00
/* valid PRNG? Better be! */
if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
2015-12-20 17:05:58 +01:00
return err;
2005-08-01 16:36:47 +00:00
}
/* allocate buffer to work with */
buf = XCALLOC(1, len);
if (buf == NULL) {
return CRYPT_MEM;
}
do {
/* generate value */
if (prng_descriptor[wprng].read(buf, len, prng) != (unsigned long)len) {
XFREE(buf);
return CRYPT_ERROR_READPRNG;
}
/* munge bits */
buf[0] |= 0x80 | 0x40;
buf[len-1] |= 0x01 | ((type & USE_BBS) ? 0x02 : 0x00);
2015-12-20 17:05:58 +01:00
2005-08-01 16:36:47 +00:00
/* load value */
if ((err = mp_read_unsigned_bin(N, buf, len)) != CRYPT_OK) {
XFREE(buf);
return err;
}
/* test */
if ((err = mp_prime_is_prime(N, 8, &res)) != CRYPT_OK) {
XFREE(buf);
return err;
}
} while (res == LTC_MP_NO);
#ifdef LTC_CLEAN_STACK
zeromem(buf, len);
#endif
XFREE(buf);
return CRYPT_OK;
}
2015-12-20 17:05:58 +01:00
#endif /* LTC_NO_MATH */
2005-08-01 16:36:47 +00:00
2017-06-19 13:43:49 +02:00
/* ref: $Format:%D$ */
/* git commit: $Format:%H$ */
/* commit time: $Format:%ai$ */