[PATCH] Custom random number generation function.

Niels Möller nisse at lysator.liu.se
Fri Sep 3 10:23:32 CEST 2010

Pedro Gimeno <gmpdevel at formauri.es> writes:

> Exposing the full struct is a possibility, but such struct should
> preferably be kept opaque and only expose an interface to set the
> functions it contains. Example:
> void
> gmp_randinit_generic (gmp_randstate_t    rstate,
>                       gmp_randseed_fn_t  randseed_fn,
>                       gmp_randget_fn_t   randget_fn,
>                       gmp_randclear_fn_t randclear_fn,
>                       gmp_randiset_fn_t  randiset_fn);

What's the use case for this? To me, if you have a custom generator, e.g.,
one with decent cryptographic properties, and want to use it with gmp,
it makes no sense to me at all to have gmp know about seeding the
generator or save and restore its insternal state.

It's the application's job to seed and maintain the generator, and gmp
should just use it when generating various random numbers. A typical
interface of a cryptographic randomness source is something like this
(from the Nettle library):

  typedef void (nettle_random_func)(void *ctx,
				    unsigned length, uint8_t *dst);

To get GMP to use a function like that, it has to be given the function
pointer and corresponding ctx pointer.

If you want to use a randinit-style function to do that, that would be

  gmp_randinit_custom (gmp_randstate_t rstate,
                       nettle_random_func *random, /* Or whatever name
                                                      you prefer for
                                                      the typedef */
                       void *ctx);


PS. I'm replying to gmp-discuss, at Torbjörns request. I'm not
subscribed, so keep me in cc: if you want me to follow the discussion.

Niels Möller. PGP-encrypted email is preferred. Keyid C0B98E26.
Internet email is subject to wholesale government surveillance.

More information about the gmp-discuss mailing list