Эх сурвалжийг харах

crypto: rng - Mark crypto_rng_reset seed as const

There is no reason why crypto_rng_reset should modify the seed
so this patch marks it as const.  Since our algorithms don't
export a const seed function yet we have to go through some
contortions for now.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Herbert Xu 10 жил өмнө
parent
commit
3c5d8fa9f5

+ 25 - 2
crypto/rng.c

@@ -42,7 +42,29 @@ static int generate(struct crypto_rng *tfm, const u8 *src, unsigned int slen,
 	return crypto_rng_alg(tfm)->rng_make_random(tfm, dst, dlen);
 	return crypto_rng_alg(tfm)->rng_make_random(tfm, dst, dlen);
 }
 }
 
 
-static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
+static int rngapi_reset(struct crypto_rng *tfm, const u8 *seed,
+			unsigned int slen)
+{
+	u8 *buf = NULL;
+	u8 *src = (u8 *)seed;
+	int err;
+
+	if (slen) {
+		buf = kmalloc(slen, GFP_KERNEL);
+		if (!buf)
+			return -ENOMEM;
+
+		memcpy(buf, seed, slen);
+		src = buf;
+	}
+
+	err = crypto_rng_alg(tfm)->rng_reset(tfm, src, slen);
+
+	kzfree(buf);
+	return err;
+}
+
+int crypto_rng_reset(struct crypto_rng *tfm, const u8 *seed, unsigned int slen)
 {
 {
 	u8 *buf = NULL;
 	u8 *buf = NULL;
 	int err;
 	int err;
@@ -56,11 +78,12 @@ static int rngapi_reset(struct crypto_rng *tfm, u8 *seed, unsigned int slen)
 		seed = buf;
 		seed = buf;
 	}
 	}
 
 
-	err = crypto_rng_alg(tfm)->rng_reset(tfm, seed, slen);
+	err = tfm->seed(tfm, seed, slen);
 
 
 	kfree(buf);
 	kfree(buf);
 	return err;
 	return err;
 }
 }
+EXPORT_SYMBOL_GPL(crypto_rng_reset);
 
 
 static int crypto_rng_init_tfm(struct crypto_tfm *tfm)
 static int crypto_rng_init_tfm(struct crypto_tfm *tfm)
 {
 {

+ 3 - 6
include/crypto/rng.h

@@ -19,7 +19,7 @@ struct crypto_rng {
 	int (*generate)(struct crypto_rng *tfm,
 	int (*generate)(struct crypto_rng *tfm,
 			const u8 *src, unsigned int slen,
 			const u8 *src, unsigned int slen,
 			u8 *dst, unsigned int dlen);
 			u8 *dst, unsigned int dlen);
-	int (*seed)(struct crypto_rng *tfm, u8 *seed, unsigned int slen);
+	int (*seed)(struct crypto_rng *tfm, const u8 *seed, unsigned int slen);
 	struct crypto_tfm base;
 	struct crypto_tfm base;
 };
 };
 
 
@@ -139,11 +139,8 @@ static inline int crypto_rng_get_bytes(struct crypto_rng *tfm,
  *
  *
  * Return: 0 if the setting of the key was successful; < 0 if an error occurred
  * Return: 0 if the setting of the key was successful; < 0 if an error occurred
  */
  */
-static inline int crypto_rng_reset(struct crypto_rng *tfm,
-				   u8 *seed, unsigned int slen)
-{
-	return tfm->seed(tfm, seed, slen);
-}
+int crypto_rng_reset(struct crypto_rng *tfm, const u8 *seed,
+		     unsigned int slen);
 
 
 /**
 /**
  * crypto_rng_seedsize() - obtain seed size of RNG
  * crypto_rng_seedsize() - obtain seed size of RNG