Hi again,

On Thursday 11 September 2008 09:32:14 Geoff Thorpe wrote:
> On Thursday 11 September 2008 09:06:39 Harald Welte wrote:
> > On Thu, Sep 11, 2008 at 10:22:38PM +1200, Michal Ludvig wrote:
> > > Have a look here:
> > > http://marc.info/?l=openssl-dev&m=109113625526391&w=2
> > > and in the corresponding thread for the discussion.
> > >
> > > FWIW even in the Linux kernel the hardware RNGs (incl. VIA PadLock) are
> > > not used directly for RNG output but instead to feed the entropy pool.
> > > I quite agree with the reasons why OpenSSL shouldn't use whatever it
> > > gets from PadLock RNG *directly* as a stream of random numbers.
> > > Unfortunately as soon as PadLock engine registers as a RNG provider
> > > OpenSSL won't do any post-processing of the random data and therefore
> > > the best bet at that time was not to use PadLock's RNG.
> >
> > Yes, after reviewing the discussion and documentation I tend to agree. 
> > So the best option really is to make OpenSSL use the userspace interface
> > for the kernel random number generator, and feed that kernel RNG's
> > entropy pool from the hardware RNG.
>
> Ohhhh, right, I see know. Yes this is a bit crap. The problem IMHO is that
> RAND_METHOD is the "wholesale replacement" interface. Ie. the entire
> software PRNG sits behind that interface, no matter how it obtains its
> entropy, and using an alternative RAND_METHOD will completely bypass the
> software PRNG. This makes sense for the other ***_METHOD interfaces,
> because they're alternatives to the s/w implementations - they can be used
> simultaneously, but work on completely separated contexts. In the case of
> the PRNG, there are no "separated contexts" nor point to having s/w and
> replacement PRNGs working independently. I think the sensible thing would
> be to stick with the s/w PRNG implementation and have it expose an inner
> interface for its entropy sources and let engines plug themselves into
> *that*, rather than acting as alternatives/replacements for the entire
> PRNG.

Looking at this in more detail, the current s/w PRNG implementation keeps a 
running 'entropy' count and when that reaches a certain threshold, it stops 
maintaining an entropy counter because the PRNG is considered sufficiently 
seeded. Each platform (roughly speaking) has its own implementation of 
RAND_poll() which does some canonical seeding, which may be enough to get the 
PRNG off the ground, or if not, the application will need to RAND_add() (or 
RAND_seed()) some more entropy before the PRNG is ready. In any case, this 
doesn't adapt so well to a model where entropy sources live as callbacks and 
get called by the PRNG when required. It's more a model where an entropy 
source should just stuff its entropy into the PRNG as soon as it gets a 
chance, and preferably as much of the stuff as it has handy. It can always 
add more later and no harm will be done, but there's no obvious way to add a 
hook to ask for entropy automatically.

With this in mind, I'm wondering if the simplest thing to do isn't just to 
have the padlock (or any other) engine call RAND_add() with some entropy 
during the init() handler of the ENGINE itself (rather than in a 
RAND_METHOD). That doesn't solve the problem of adding more entropy as time 
goes by, but it's better than the current situation (only having a 
RAND_METHOD mechanism you can't use at all), and moreover it requires no 
interface changes, just implementation...

Thoughts?

Cheers,
Geoff

-- 
Un terrien, c'est un singe avec des clefs de char...
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to