1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-11 20:28:21 +03:00

pgcrypto update:

Reserve px_get_random_bytes() for strong randomness,
add new function px_get_pseudo_random_bytes() for
weak randomness and use it in gen_salt().

On openssl case, use RAND_pseudo_bytes() for
px_get_pseudo_random_bytes().

Final result is that is user has not configured random
souce but kept the 'silly' one, gen_salt() keeps
working, but pgp_encrypt() will throw error.

Marko Kreen
This commit is contained in:
Neil Conway
2005-03-21 05:22:14 +00:00
parent 1ea9169b42
commit 19b676869a
4 changed files with 48 additions and 16 deletions

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $PostgreSQL: pgsql/contrib/pgcrypto/random.c,v 1.9 2005/03/21 05:19:55 neilc Exp $
* $PostgreSQL: pgsql/contrib/pgcrypto/random.c,v 1.10 2005/03/21 05:22:14 neilc Exp $
*/
@ -78,10 +78,16 @@ px_get_random_bytes(uint8 *dst, unsigned count)
return res;
}
int
px_get_pseudo_random_bytes(uint8 *dst, unsigned count)
{
return px_get_random_bytes(dst, count);
}
#elif defined(RAND_SILLY)
int
px_get_random_bytes(uint8 *dst, unsigned count)
px_get_pseudo_random_bytes(uint8 *dst, unsigned count)
{
int i;
@ -90,6 +96,12 @@ px_get_random_bytes(uint8 *dst, unsigned count)
return i;
}
int
px_get_random_bytes(uint8 *dst, unsigned count)
{
return PXE_NO_RANDOM;
}
#elif defined(RAND_OPENSSL)
#include <openssl/evp.h>
@ -99,22 +111,24 @@ px_get_random_bytes(uint8 *dst, unsigned count)
static int openssl_random_init = 0;
/*
* OpenSSL random should re-feeded occasionally. From /dev/urandom
* preferably.
*/
static void init_openssl()
{
if (RAND_get_rand_method() == NULL)
RAND_set_rand_method(RAND_SSLeay());
openssl_random_init = 1;
}
int
px_get_random_bytes(uint8 *dst, unsigned count)
{
int res;
if (!openssl_random_init)
{
if (RAND_get_rand_method() == NULL)
RAND_set_rand_method(RAND_SSLeay());
openssl_random_init = 1;
}
/*
* OpenSSL random should re-feeded occasionally. From /dev/urandom
* preferably.
*/
init_openssl();
res = RAND_bytes(dst, count);
if (res == 1)
@ -123,6 +137,21 @@ px_get_random_bytes(uint8 *dst, unsigned count)
return PXE_OSSL_RAND_ERROR;
}
int
px_get_pseudo_random_bytes(uint8 *dst, unsigned count)
{
int res;
if (!openssl_random_init)
init_openssl();
res = RAND_pseudo_bytes(dst, count);
if (res == 0 || res == 1)
return count;
return PXE_OSSL_RAND_ERROR;
}
#else
#error "Invalid random source"
#endif