Mercurial > dropbear
view libtomcrypt/src/math/rand_bn.c @ 1655:f52919ffd3b1
update ltm to 1.1.0 and enable FIPS 186.4 compliant key-generation (#79)
* make key-generation compliant to FIPS 186.4
* fix includes in tommath_class.h
* update fuzzcorpus instead of error-out
* fixup fuzzing make-targets
* update Makefile.in
* apply necessary patches to ltm sources
* clean-up not required ltm files
* update to vanilla ltm 1.1.0
this already only contains the required files
* remove set/get double
author | Steffen Jaeckel <s_jaeckel@gmx.de> |
---|---|
date | Mon, 16 Sep 2019 15:50:38 +0200 |
parents | 6dba84798cd5 |
children | e9dba7abd939 |
line wrap: on
line source
/* 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" #ifdef LTC_MDSA /** Generate a random number N with given bitlength (note: MSB can be 0) */ int rand_bn_bits(void *N, int bits, prng_state *prng, int wprng) { int res, bytes; unsigned char *buf, mask; LTC_ARGCHK(N != NULL); LTC_ARGCHK(bits > 1); /* check PRNG */ if ((res = prng_is_valid(wprng)) != CRYPT_OK) return res; bytes = (bits+7) >> 3; mask = 0xff << (8 - bits % 8); /* allocate buffer */ if ((buf = XCALLOC(1, bytes)) == NULL) return CRYPT_MEM; /* generate random bytes */ if (prng_descriptor[wprng].read(buf, bytes, prng) != (unsigned long)bytes) { res = CRYPT_ERROR_READPRNG; goto cleanup; } /* mask bits */ buf[0] &= ~mask; /* load value */ if ((res = mp_read_unsigned_bin(N, buf, bytes)) != CRYPT_OK) goto cleanup; res = CRYPT_OK; cleanup: #ifdef LTC_CLEAN_STACK zeromem(buf, bytes); #endif XFREE(buf); return res; } /** Generate a random number N in a range: 1 <= N < limit */ int rand_bn_upto(void *N, void *limit, prng_state *prng, int wprng) { int res, bits; LTC_ARGCHK(N != NULL); LTC_ARGCHK(limit != NULL); bits = mp_count_bits(limit); do { res = rand_bn_bits(N, bits, prng, wprng); if (res != CRYPT_OK) return res; } while (mp_cmp_d(N, 0) != LTC_MP_GT || mp_cmp(N, limit) != LTC_MP_LT); return CRYPT_OK; } #endif /* ref: $Format:%D$ */ /* git commit: $Format:%H$ */ /* commit time: $Format:%ai$ */