[RFC] Support for /dev/urandom in kdelibs

Michael Buesch mbuesch at freenet.de
Sun Dec 26 20:45:58 GMT 2004


Quoting Michael Buesch <mbuesch at freenet.de>:
> Quoting Albert Astals Cid <astals11 at terra.es>:
> > KApplication::random() code seems to use /dev/urandom
> 
> Ok, I see. But it's for "int" only.
> and KApplication::randomString() is for QString only.
> My idea was to standardize all random sequence generation in KDE.
> So that we can deprecate KApplication::random(), KApplication::randomString()
> and KRandomSequence and have it all in one central and easy to use class.
> 
> 
> BTW, the code of KApplication::random() looks a little bit strange to me.
> The comments in the following source snippet are mine.
> 
> int KApplication::random()
> {
>    static int init = false;
> //        ^^^ Why not bool?
>    if (!init)
>    {
>       unsigned int seed;
>       init = true;
>       int fd = open("/dev/urandom", O_RDONLY);
> // Why only read the seed from /dev/urandom and not directly
> // the random data itself?
>       if (fd <= 0 || ::read(fd, &seed, sizeof(seed)) != sizeof(seed))
> // fd == 0 is not an invalid fd.
> // glibc doc: "In the case of an error, a value of -1 is returned instead."
> // So this should be  if (fd == -1
> // Another aspect is, that we execute the ::read in every case, if we have
> // a valid fd or not. This is unclean.
>       {
>             srand(getpid());
>             seed = rand()+time(0);
>       }
>       if (fd >= 0) close(fd);
> // should be  if (fd != -1)
> // glibc docu does not say that negative fds other than
> // -1 are invalid. So -34 may be a perfectly fine fd.

ok, that part is wrong. ;)
So this  if (fd >= 0)  is ok.
But the above is still valid.

>       srand(seed);
>    }
>    return rand();
> }
> 
> 
> > Albert
> > 
> > A Diumenge 26 Desembre 2004 13:49, Michael Buesch va escriure:
> > > Hi,
> > >
> > > Is there a possibility to get support for a cryptographically strong
> > > randomizer into the kdelibs for KDE-4?
> > > If I did not miss something, there is only KRandomSequence which
> > > generates random values based on a seed.
> > >
> > > What about something like the following class:
> > > http://webcvs.kde.org/kdeextragear-3/pwmanager/pwmanager/randomizer/randomi
> > >zer.h?rev=1.2&view=markup
> > > http://webcvs.kde.org/kdeextragear-3/pwmanager/pwmanager/randomizer/randomi
> > >zer.cpp?rev=1.2&view=markup
> > >
> > > I use this class in my program PwManager.
> > > It probes for the availability of strong randomizers in the
> > > system. In the unlikely case that there is neither /dev/urandom,
> > > /dev/random nor a running EGD, it falls back to the stdlib randomizer.
> > > (Yes, there is room for improvement at the stdlib rand() fallback.
> > > It's not reentrant yet and it's very bad).
> > >
> > > Usage of the class is as follows:
> > >
> > > int foo;
> > > Randomizer rnd;
> > > rnd >> foo;
> > > // foo has a random value now.
> > >
> > > [SNIP]
> > >
> > > QByteArray foo(666);
> > > Randomizer rnd;
> > > rnd >> foo;
> > > // foo is a QByteArray with 666 random bytes.
> > >
> > > [SNIP]
> > >
> > > char foo[123];
> > > Randomizer rnd;
> > > rnd.nextSize(sizeof(foo));
> > > rnd >> foo;
> > > // foo is a char array with sizeof(foo) == 123 random bytes.
> > 
> > 
> 

-- 
Regards Michael Buesch  [ http://www.tuxsoft.de.vu ]


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20041226/8290c957/attachment.sig>


More information about the kde-core-devel mailing list