From: Stephan Mueller <smueller@chronox.de>
To: Neil Horman <nhorman@tuxdriver.com>
Cc: George Spelvin <linux@horizon.com>,
herbert@gondor.apana.org.au, jarod@redhat.com,
linux-crypto@vger.kernel.org
Subject: Re: Is ansi_cprng.c supposed to be an implmentation of X9.31?
Date: Sun, 30 Nov 2014 15:31:10 +0100 [thread overview]
Message-ID: <15947662.NrEOFplJdZ@tauon> (raw)
In-Reply-To: <20141129175856.GB15743@localhost.localdomain>
Am Samstag, 29. November 2014, 12:58:56 schrieb Neil Horman:
Hi Neil,
>On Fri, Nov 28, 2014 at 06:23:51PM -0500, George Spelvin wrote:
>> I've been trying to understand the crypto layer, and it's a bit of a
>> struggle because I'm trying to learn how it's supposed to work by
>> reading the code, and I keep finding code I want to fix.
>
>Patches welcome.
>
>> ansi_cprng.c is the current itch I'm eager to scratch.
>>
>> Other than enough implementation stupidities to make me scream
>> (particularly the "rand_data_valid" variable name which is actually a
>
>Its actually a counter of the number of valid random data bytes in the
>buffer being returned to a caller, as well as an index into the
>internal buffer from which to draw fresh random data. Sorry if you
>don't get that, but it seems pretty clear.
>
>> count of INvalid data, and keeping 5 blocks of state, including
>> sensitive previous output, when only 3 are needed), one thing I
>> can't help noticing
>Not sure where you're getting that from, only 1 block of random data is
>stored at any one time to return to a caller
>
>> is that this is definitely NOT conformant with the X9.17/X9.31 spec.
>
>This is the document it was based of off:
>http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
As this implementation has successfully being checked with the FIPS
140-2 reference implementation, we all must assume it is in total
compliance with the spec.
>
>From my read, it seems to be in complete compliance.
>
>> That's because the spec requires a timestamp for each output block
>> to provide additional entropy, and a counter won't cut it.
>
>The document places no constrints on the value or progression of DT.
>As such a counter is as valid as any other implementation. You're
>welcome to enhance that however, as I said, patches welcome.
>
>> I'm fixing the obvious things, but on this point, I have two choices:
>>
>> 1. Add some comments clarifying that the "Based on" part of the
>> header
>>
>> is anything but a claim of compliance; those specs are for an RNG,
>> while this is a PRNG.
>
>Please read more closely, the header clearly states this is a PRNG
>implementation, and a quick google search of the terms in the header
>bring up the document referenced above, with which this cprng is in
>compliance with.
>> And probably delete all the FIPS stuff, as
>>
>> there's no spec to claim compliance with. Or
>
>Maybe do some research before making big claims like this:
>http://csrc.nist.gov/publications/fips/fips140-2/fips1402annexc.pdf
Supporting to that is FIPS 140-2 standard section 4.9.2 which requires
the continuous self test.
>
>Its just a draft, but digging through the NIST site will bring up the
It is kept draft deliberately to allow NIST to make changes without some
government big-wig to sign up on it (and cause a delay of a couple of
years.
>approved version. Both show that a 3 DES CPRNG based on ANSI X9.31 is
>valid, and provides a reference to the paper above as the
>implementation guideline.
>> 2. Fix the code to use random_get_entropy() and jiffies for the
>>
>> DT seed vector.
>
>Sure, knock yourself out. I don't consider it more or less valid to do
>so, but patches are welcome.
There is NO need for additional entropy at this point as the X9.31 DRNG
does not claim prediction resistance with a constant reseeding.
>
>> In the latter case, I'd have to leave the current deterministic code
>> as an option for self-testing, but I'd drop the recommended seedsize
>> to DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ (one key and one IV), and have
>> an internal flag indicating whether to use an incrementing DT vector
>> or generate it fresh.
>
>Yup. Strictly speaking the API is in-kernel only, so you don't really
>have to worry about handling backwards compatibility, but if you don't
>allow for DT to be specified as an initial value, you won't be able to
>validate against any of the test vectors that NIST provides:
>http://csrc.nist.gov/groups/STM/cavp/documents/rng/RNGVS.pdf
>
>I will also point out that CPRNG's are designed such that peers
>communicating with a cprng are expected to be able to predect the
>cprng output, which implies that the DT value needs to remain
>predictable as well. Using an actual date time vector is going to
>make communication like that very unstable if there is even a little
>clock drift on either system. As such, while its less entropy, using
>a simple arbitrary vector with an increment on each random data
>generation leads to greater stability and predictability for those
>with the key. The data provided in the validation test in Appendix
>B.1.5 of the above document supports that, as the DT value is
>arbitrary and incremented by one on each iteration.
>> If some code (like the current self-test code) provides an extra
>> DEFAULT_BLK_SZ of seed material, it would go into determinsitic mode,
>> but if it's missing, DT would be generated dynamically.
>
>Sure, patches welcome.
>
>> But that's a question of design intent, and I can't intuit that from
>> the code. Can someome enlighten me as to which option is preferred?
>Definately keep the ability to support external setting of DT, as you
>can't pass any validation tests without it.
Ciao
Stephan
--
next prev parent reply other threads:[~2014-11-30 14:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-28 23:23 Is ansi_cprng.c supposed to be an implmentation of X9.31? George Spelvin
2014-11-29 17:58 ` Neil Horman
2014-11-29 19:32 ` George Spelvin
2014-11-30 1:16 ` Neil Horman
2014-11-30 14:36 ` Stephan Mueller
2014-12-02 4:55 ` George Spelvin
2014-12-02 13:22 ` Neil Horman
2014-12-02 17:56 ` George Spelvin
2014-11-30 14:31 ` Stephan Mueller [this message]
2014-11-30 14:26 ` Stephan Mueller
2014-12-02 5:39 ` George Spelvin
2014-12-02 13:44 ` Neil Horman
2014-12-02 19:43 ` George Spelvin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=15947662.NrEOFplJdZ@tauon \
--to=smueller@chronox.de \
--cc=herbert@gondor.apana.org.au \
--cc=jarod@redhat.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux@horizon.com \
--cc=nhorman@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox