* [PATCH v2 02/11] random32: introduce random32_get_bytes() and random32_get_bytes_state()
2012-11-03 15:43 [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Akinobu Mita
@ 2012-11-03 15:43 ` Akinobu Mita
2012-11-03 15:43 ` [PATCH v2 03/11] bnx2x: use random32_get_bytes() Akinobu Mita
2012-11-06 5:14 ` [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Valdis.Kletnieks
2 siblings, 0 replies; 6+ messages in thread
From: Akinobu Mita @ 2012-11-03 15:43 UTC (permalink / raw)
To: linux-kernel, akpm
Cc: Akinobu Mita, Theodore Ts'o, Artem Bityutskiy, Adrian Hunter,
David Woodhouse, linux-mtd, Eilon Greenstein, netdev
Add functions to get the requested number of pseudo-random bytes.
The difference from get_random_bytes() is that it generates pseudo-random
numbers by random32(). It is fast, suitable for generating random bytes
for testing, and reproducible if random32_get_bytes_state() is used.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: linux-mtd@lists.infradead.org
Cc: Eilon Greenstein <eilong@broadcom.com>
Cc: netdev@vger.kernel.org
---
* v2
- rename prandom32_get_bytes to random32_get_bytes_state
include/linux/random.h | 2 ++
lib/random32.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/include/linux/random.h b/include/linux/random.h
index bb96f79..4176762 100644
--- a/include/linux/random.h
+++ b/include/linux/random.h
@@ -27,8 +27,10 @@ unsigned long randomize_range(unsigned long start, unsigned long end, unsigned l
u32 random32(void);
void srandom32(u32 seed);
+void random32_get_bytes(void *buf, int nbytes);
u32 random32_state(struct rnd_state *);
+void random32_get_bytes_state(struct rnd_state *state, void *buf, int nbytes);
/*
* Handle minimum values for seeds
diff --git a/lib/random32.c b/lib/random32.c
index 7a3e0c7..9557417 100644
--- a/lib/random32.c
+++ b/lib/random32.c
@@ -61,6 +61,44 @@ u32 random32_state(struct rnd_state *state)
EXPORT_SYMBOL(random32_state);
/**
+ * random32_get_bytes_state - get the pseudo-random bytes
+ * @state: pointer to state structure holding seeded state.
+ * @buf: where to copy the pseudo-random bytes to
+ * @bytes: the requested number of bytes
+ *
+ * This is used for pseudo-randomness with no outside seeding.
+ * For more random results, use random32_get_bytes().
+ */
+void random32_get_bytes_state(struct rnd_state *state, void *buf, int bytes)
+{
+ unsigned char *p = buf;
+
+ for (; bytes > 0 && ((unsigned long)p) % sizeof(u32); bytes--, p++)
+ *p = random32_state(state);
+
+ for (; bytes > sizeof(u32) - 1; bytes -= sizeof(u32), p += sizeof(u32))
+ *(u32 *)p = random32_state(state);
+
+ for (; bytes > 0; bytes--, p++)
+ *p = random32_state(state);
+}
+EXPORT_SYMBOL(random32_get_bytes_state);
+
+/**
+ * random32_get_bytes - get the requested number of pseudo-random bytes
+ * @buf: where to copy the pseudo-random bytes to
+ * @bytes: the requested number of bytes
+ */
+void random32_get_bytes(void *buf, int bytes)
+{
+ struct rnd_state *state = &get_cpu_var(net_rand_state);
+
+ random32_get_bytes_state(state, buf, bytes);
+ put_cpu_var(state);
+}
+EXPORT_SYMBOL(random32_get_bytes);
+
+/**
* random32 - pseudo random number generator
*
* A 32 bit pseudo-random number is generated using a fast
--
1.7.11.7
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v2 03/11] bnx2x: use random32_get_bytes()
2012-11-03 15:43 [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Akinobu Mita
2012-11-03 15:43 ` [PATCH v2 02/11] random32: " Akinobu Mita
@ 2012-11-03 15:43 ` Akinobu Mita
2012-11-06 5:14 ` [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Valdis.Kletnieks
2 siblings, 0 replies; 6+ messages in thread
From: Akinobu Mita @ 2012-11-03 15:43 UTC (permalink / raw)
To: linux-kernel, akpm; +Cc: Akinobu Mita, Eilon Greenstein, netdev
Use random32_get_bytes() to fill rss key with pseudo-random bytes.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Eilon Greenstein <eilong@broadcom.com>
Cc: netdev@vger.kernel.org
---
new patch from v2
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 4833b6a..9a25658 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -1741,7 +1741,6 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
bool config_hash)
{
struct bnx2x_config_rss_params params = {NULL};
- int i;
/* Although RSS is meaningless when there is a single HW queue we
* still need it enabled in order to have HW Rx hash generated.
@@ -1773,9 +1772,7 @@ int bnx2x_config_rss_pf(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
if (config_hash) {
/* RSS keys */
- for (i = 0; i < sizeof(params.rss_key) / 4; i++)
- params.rss_key[i] = random32();
-
+ random32_get_bytes(params.rss_key, sizeof(params.rss_key));
__set_bit(BNX2X_RSS_SET_SRCH, ¶ms.rss_flags);
}
--
1.7.11.7
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state()
2012-11-03 15:43 [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Akinobu Mita
2012-11-03 15:43 ` [PATCH v2 02/11] random32: " Akinobu Mita
2012-11-03 15:43 ` [PATCH v2 03/11] bnx2x: use random32_get_bytes() Akinobu Mita
@ 2012-11-06 5:14 ` Valdis.Kletnieks
2012-11-06 11:18 ` David Laight
2 siblings, 1 reply; 6+ messages in thread
From: Valdis.Kletnieks @ 2012-11-06 5:14 UTC (permalink / raw)
To: Akinobu Mita
Cc: linux-kernel, akpm, Theodore Ts'o, Artem Bityutskiy,
Adrian Hunter, David Woodhouse, linux-mtd, Eilon Greenstein,
netdev, Robert Love, devel, Michel Lespinasse
[-- Attachment #1: Type: text/plain, Size: 919 bytes --]
On Sun, 04 Nov 2012 00:43:31 +0900, Akinobu Mita said:
> This patchset introduces new functions into random32 library for
> getting the requested number of pseudo-random bytes.
>
> Before introducing these new functions into random32 library,
> prandom32() and prandom32_seed() with "prandom32" prefix are
> renamed to random32_state() and srandom32_state() respectively.
>
> The purpose of this renaming is to prevent some kernel developers
> from assuming that prandom32() and random32() might imply that only
> prandom32() was the one using a pseudo-random number generator by
> prandom32's "p", and the result may be a very embarassing security
> exposure.
Out of curiosity, why the '32'? I'm just waiting for some kernel developer to
do something stupid with this on a 64-bit arch because they think it's a 32-bit API. ;)
Should we bite the bullet and lose the 32, as long as we're churning the code *anyhow*?
[-- Attachment #2: Type: application/pgp-signature, Size: 865 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state()
2012-11-06 5:14 ` [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state() Valdis.Kletnieks
@ 2012-11-06 11:18 ` David Laight
2012-11-06 13:04 ` Akinobu Mita
0 siblings, 1 reply; 6+ messages in thread
From: David Laight @ 2012-11-06 11:18 UTC (permalink / raw)
To: Valdis.Kletnieks, Akinobu Mita
Cc: linux-kernel, akpm, Theodore Ts'o, Artem Bityutskiy,
Adrian Hunter, David Woodhouse, linux-mtd, Eilon Greenstein,
netdev, Robert Love, devel, Michel Lespinasse
> On Sun, 04 Nov 2012 00:43:31 +0900, Akinobu Mita said:
> > This patchset introduces new functions into random32 library for
> > getting the requested number of pseudo-random bytes.
> >
> > Before introducing these new functions into random32 library,
> > prandom32() and prandom32_seed() with "prandom32" prefix are
> > renamed to random32_state() and srandom32_state() respectively.
> >
> > The purpose of this renaming is to prevent some kernel developers
> > from assuming that prandom32() and random32() might imply that only
> > prandom32() was the one using a pseudo-random number generator by
> > prandom32's "p", and the result may be a very embarassing security
> > exposure.
>
> Out of curiosity, why the '32'? I'm just waiting for some kernel developer to
> do something stupid with this on a 64-bit arch because they think it's a 32-bit API. ;)
>
> Should we bite the bullet and lose the 32, as long as we're churning the code *anyhow*?
Also why remove the 'pseudo' part of the name?
It is an important part of the name.
David
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 00/11] introduce random32_get_bytes() and random32_get_bytes_state()
2012-11-06 11:18 ` David Laight
@ 2012-11-06 13:04 ` Akinobu Mita
0 siblings, 0 replies; 6+ messages in thread
From: Akinobu Mita @ 2012-11-06 13:04 UTC (permalink / raw)
To: David Laight
Cc: Valdis.Kletnieks, linux-kernel, akpm, Theodore Ts'o,
Artem Bityutskiy, Adrian Hunter, David Woodhouse, linux-mtd,
Eilon Greenstein, netdev, Robert Love, devel, Michel Lespinasse
2012/11/6 David Laight <David.Laight@aculab.com>:
>> On Sun, 04 Nov 2012 00:43:31 +0900, Akinobu Mita said:
>> > This patchset introduces new functions into random32 library for
>> > getting the requested number of pseudo-random bytes.
>> >
>> > Before introducing these new functions into random32 library,
>> > prandom32() and prandom32_seed() with "prandom32" prefix are
>> > renamed to random32_state() and srandom32_state() respectively.
>> >
>> > The purpose of this renaming is to prevent some kernel developers
>> > from assuming that prandom32() and random32() might imply that only
>> > prandom32() was the one using a pseudo-random number generator by
>> > prandom32's "p", and the result may be a very embarassing security
>> > exposure.
>>
>> Out of curiosity, why the '32'? I'm just waiting for some kernel developer to
>> do something stupid with this on a 64-bit arch because they think it's a 32-bit API. ;)
>>
>> Should we bite the bullet and lose the 32, as long as we're churning the code *anyhow*?
>
> Also why remove the 'pseudo' part of the name?
> It is an important part of the name.
Thanks for the heads-up. Then, what is the ideal function name for
pseudo-random library?
I propose the following renaming, 'p' prefix is restored and '32' is
removed for not returning 32bit pseudo-random number functions.
void prandom_seed(u32 seed); /* rename from srandom32() */
u32 prandom32(void); /* rename from random32() */
void prandom_get_byte(void *buf, int bytes);
void prandom_seed_state(struct rnd_state *state, u64 seed);
/* rename from prandom32_seed() */
u32 prandom32_state(struct rnd_state *state); /* rename from prandom32() */
void prandom_get_byte_state(struct rnd_state *state, void *buf, int bytes);
^ permalink raw reply [flat|nested] 6+ messages in thread