Revert "ARM: tegra: tegratab: dummy change"
[linux-2.6.git] / crypto / ansi_cprng.c
index 027176a..6ddd99e 100644 (file)
@@ -83,7 +83,7 @@ static void xor_vectors(unsigned char *in1, unsigned char *in2,
 }
 /*
  * Returns DEFAULT_BLK_SZ bytes of random data per call
- * returns 0 if generation succeded, <0 if something went wrong
+ * returns 0 if generation succeeded, <0 if something went wrong
  */
 static int _get_more_prng_bytes(struct prng_context *ctx, int cont_test)
 {
@@ -193,9 +193,6 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx,
        int err;
 
 
-       if (nbytes < 0)
-               return -EINVAL;
-
        spin_lock_bh(&ctx->prng_lock);
 
        err = -EINVAL;
@@ -360,14 +357,6 @@ static int cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
        return get_prng_bytes(rdata, dlen, prng, 0);
 }
 
-static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
-                           unsigned int dlen)
-{
-       struct prng_context *prng = crypto_rng_ctx(tfm);
-
-       return get_prng_bytes(rdata, dlen, prng, 1);
-}
-
 /*
  *  This is the cprng_registered reset method the seed value is
  *  interpreted as the tuple { V KEY DT}
@@ -393,26 +382,6 @@ static int cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
        return 0;
 }
 
-static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
-{
-       u8 rdata[DEFAULT_BLK_SZ];
-       int rc;
-
-       struct prng_context *prng = crypto_rng_ctx(tfm);
-
-       rc = cprng_reset(tfm, seed, slen);
-
-       if (!rc)
-               goto out;
-
-       /* this primes our continuity test */
-       rc = get_prng_bytes(rdata, DEFAULT_BLK_SZ, prng, 0);
-       prng->rand_data_valid = DEFAULT_BLK_SZ;
-
-out:
-       return rc;
-}
-
 static struct crypto_alg rng_alg = {
        .cra_name               = "stdrng",
        .cra_driver_name        = "ansi_cprng",
@@ -434,6 +403,42 @@ static struct crypto_alg rng_alg = {
 };
 
 #ifdef CONFIG_CRYPTO_FIPS
+static int fips_cprng_get_random(struct crypto_rng *tfm, u8 *rdata,
+                           unsigned int dlen)
+{
+       struct prng_context *prng = crypto_rng_ctx(tfm);
+
+       return get_prng_bytes(rdata, dlen, prng, 1);
+}
+
+static int fips_cprng_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
+{
+       u8 rdata[DEFAULT_BLK_SZ];
+       u8 *key = seed + DEFAULT_BLK_SZ;
+       int rc;
+
+       struct prng_context *prng = crypto_rng_ctx(tfm);
+
+       if (slen < DEFAULT_PRNG_KSZ + DEFAULT_BLK_SZ)
+               return -EINVAL;
+
+       /* fips strictly requires seed != key */
+       if (!memcmp(seed, key, DEFAULT_PRNG_KSZ))
+               return -EINVAL;
+
+       rc = cprng_reset(tfm, seed, slen);
+
+       if (!rc)
+               goto out;
+
+       /* this primes our continuity test */
+       rc = get_prng_bytes(rdata, DEFAULT_BLK_SZ, prng, 0);
+       prng->rand_data_valid = DEFAULT_BLK_SZ;
+
+out:
+       return rc;
+}
+
 static struct crypto_alg fips_rng_alg = {
        .cra_name               = "fips(ansi_cprng)",
        .cra_driver_name        = "fips_ansi_cprng",