Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Dec 2009 20:41:21 +0300
From:      Paul Graphov <graphov@gmail.com>
To:        secteam@freebsd.org
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: yarrow random generator
Message-ID:  <5a5b03660912240941r6b76a839u819a8a1408816386@mail.gmail.com>
In-Reply-To: <4B339F27.6020707@freebsd.org>
References:  <5a5b03660912240445x7df1498dt42e29d93105efebc@mail.gmail.com> <oCmohG1K70vWpt/39IVPMdciTgk@DNdB9ElzNmEFYWRqT2UTVtuts%2BE> <4B339F27.6020707@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Dont these lines (random_yarrow_init function) make it available to set
"seeded" to zero?

            SYSCTL_ADD_PROC(&random_clist,
            SYSCTL_CHILDREN(random_sys_o),
            OID_AUTO, "seeded", CTLTYPE_INT | CTLFLAG_RW,
            &random_systat.seeded, 1, random_check_boolean, "I",
            "Seeded State");

And also according to Schneier it is a good idea to save state of the PRNG
and restore it on boot to make it
"more seeded".

2009/12/24 Colin Percival <cperciva@freebsd.org>

> Hi all,
>
> Looks like there's a bug here, but it doesn't matter since this is dead
> code: .seeded is initialized to 1 and never modified, so we will never
> call into random_yarrow_block.
>
> IIRC this is because there are some places which ask for entropy before
> yarrow is seeded but don't actually need *cryptographic* entropy.
>
> > Thu, Dec 24, 2009 at 03:45:15PM +0300, Paul Graphov wrote:
> >> I've looked at FreeBSD 8.0 cryptographically secure pseudorandom
> >> numbers generator and have a question. It looks like a bug but I'am
> >> not sure.
> >>
> >> In file sys/dev/randomdev.c, function random_read:
> >>
> >>         if (!random_systat.seeded)
> >>                 error = (*random_systat.block)(flag);
> >>
> >> It blocks until PRNG is seeded. For software random generator
> implementation
> >> block method looks as follows, sys/dev/randomdev_soft.c:
> >>
> >> random_yarrow_block(int flag)
> >> {
> >>         int error = 0;
> >>
> >>         mtx_lock(&random_reseed_mtx);
> >>
> >>         /* Blocking logic */
> >>         while (random_systat.seeded && !error) {
> >>                 if (flag & O_NONBLOCK)
> >>                         error = EWOULDBLOCK;
> >>                 else {
> >>                         printf("Entropy device is blocking.\n");
> >>                         error = msleep(&random_systat,
> >>                             &random_reseed_mtx,
> >>                             PUSER | PCATCH, "block", 0);
> >>                 }
> >>         }
> >>         mtx_unlock(&random_reseed_mtx);
> >>
> >>         return error;
> >> }
> >>
> >> It seems that random_systat.seeded in "while" condition should be
> negated.
> >> Or it will never block actually, or block erroneously until next reseed
> >> (under very rare
> >> conditions)
>
> --
> Colin Percival
> Security Officer, FreeBSD | freebsd.org | The power to serve
> Founder / author, Tarsnap | tarsnap.com | Online backups for the truly
> paranoid
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5a5b03660912240941r6b76a839u819a8a1408816386>