aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorJarod Wilson <jarod@redhat.com>2011-11-08 23:04:06 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2011-11-08 23:04:06 -0500
commit505172e11f5a0d9916e20e40d3b0a6f87d3a59b6 (patch)
treede5c671a37c3b3479595c1c9c891848953199985 /crypto
parentbae6d3038b7faff187f4207448a40b9912cf787d (diff)
crypto: ansi_cprng - enforce key != seed in fips mode
Apparently, NIST is tightening up its requirements for FIPS validation with respect to RNGs. Its always been required that in fips mode, the ansi cprng not be fed key and seed material that was identical, but they're now interpreting FIPS 140-2, section AS07.09 as requiring that the implementation itself must enforce the requirement. Easy fix, we just do a memcmp of key and seed in fips_cprng_reset and call it a day. v2: Per Neil's advice, ensure slen is sufficiently long before we compare key and seed to avoid looking at potentially unallocated mem. CC: Stephan Mueller <smueller@atsec.com> CC: Steve Grubb <sgrubb@redhat.com> Signed-off-by: Jarod Wilson <jarod@redhat.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/ansi_cprng.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c
index ffa0245e2abc..6ddd99e6114b 100644
--- a/crypto/ansi_cprng.c
+++ b/crypto/ansi_cprng.c
@@ -414,10 +414,18 @@ static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
414static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen) 414static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
415{ 415{
416 u8 rdata[DEFAULT_BLK_SZ]; 416 u8 rdata[DEFAULT_BLK_SZ];
417 u8 *key = seed + DEFAULT_BLK_SZ;
417 int rc; 418 int rc;
418 419
419 struct prng_context *prng = crypto_rng_ctx(tfm); 420 struct prng_context *prng = crypto_rng_ctx(tfm);
420 421
422 if (slen < DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ)
423 return -EINVAL;
424
425 /* fips strictly requires seed != key */
426 if (!memcmp(seed, key, DEFAULT_PRNG_KSZ))
427 return -EINVAL;
428
421 rc = cprng_reset(tfm, seed, slen); 429 rc = cprng_reset(tfm, seed, slen);
422 430
423 if (!rc) 431 if (!rc)