* [PATCH 1/2] crypto: hwrng use rng source with best quality
2017-07-11 7:36 [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice Harald Freudenberger
@ 2017-07-11 7:36 ` Harald Freudenberger
2017-07-11 7:36 ` [PATCH 2/2] crypto: hwrng remember rng chosen by user Harald Freudenberger
2017-07-18 10:39 ` [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice Herbert Xu
2 siblings, 0 replies; 4+ messages in thread
From: Harald Freudenberger @ 2017-07-11 7:36 UTC (permalink / raw)
To: linux-crypto
Cc: herbert, arnd, gregkh, prasannatsmkumar, schwidefsky,
Harald Freudenberger
This patch rewoks the hwrng to always use the
rng source with best entropy quality.
On registation and unregistration the hwrng now
tries to choose the best (= highest quality value)
rng source. The handling of the internal list
of registered rng sources is now always sorted
by quality and the top most rng chosen.
Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Reviewed-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com>
---
drivers/char/hw_random/core.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
index 503a41d..e9dda16 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -29,6 +29,7 @@
static struct hwrng *current_rng;
static struct task_struct *hwrng_fill;
+/* list of registered rngs, sorted decending by quality */
static LIST_HEAD(rng_list);
/* Protects rng_list and current_rng */
static DEFINE_MUTEX(rng_mutex);
@@ -417,6 +418,7 @@ int hwrng_register(struct hwrng *rng)
{
int err = -EINVAL;
struct hwrng *old_rng, *tmp;
+ struct list_head *rng_list_ptr;
if (!rng->name || (!rng->data_read && !rng->read))
goto out;
@@ -432,14 +434,25 @@ int hwrng_register(struct hwrng *rng)
init_completion(&rng->cleanup_done);
complete(&rng->cleanup_done);
+ /* rng_list is sorted by decreasing quality */
+ list_for_each(rng_list_ptr, &rng_list) {
+ tmp = list_entry(rng_list_ptr, struct hwrng, list);
+ if (tmp->quality < rng->quality)
+ break;
+ }
+ list_add_tail(&rng->list, rng_list_ptr);
+
old_rng = current_rng;
err = 0;
- if (!old_rng) {
+ if (!old_rng || (rng->quality > old_rng->quality)) {
+ /*
+ * Set new rng as current as the new rng source
+ * provides better entropy quality.
+ */
err = set_current_rng(rng);
if (err)
goto out_unlock;
}
- list_add_tail(&rng->list, &rng_list);
if (old_rng && !rng->init) {
/*
@@ -466,12 +479,12 @@ void hwrng_unregister(struct hwrng *rng)
list_del(&rng->list);
if (current_rng == rng) {
drop_current_rng();
+ /* rng_list is sorted by quality, use the best (=first) one */
if (!list_empty(&rng_list)) {
- struct hwrng *tail;
-
- tail = list_entry(rng_list.prev, struct hwrng, list);
+ struct hwrng *new_rng;
- set_current_rng(tail);
+ new_rng = list_entry(rng_list.next, struct hwrng, list);
+ set_current_rng(new_rng);
}
}
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH 2/2] crypto: hwrng remember rng chosen by user
2017-07-11 7:36 [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice Harald Freudenberger
2017-07-11 7:36 ` [PATCH 1/2] crypto: hwrng use rng source with best quality Harald Freudenberger
@ 2017-07-11 7:36 ` Harald Freudenberger
2017-07-18 10:39 ` [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice Herbert Xu
2 siblings, 0 replies; 4+ messages in thread
From: Harald Freudenberger @ 2017-07-11 7:36 UTC (permalink / raw)
To: linux-crypto
Cc: herbert, arnd, gregkh, prasannatsmkumar, schwidefsky,
Harald Freudenberger
When a user chooses a rng source via sysfs attribute
this rng should be sticky, even when other sources
with better quality to register. This patch introduces
a simple way to remember the user's choice. This is
reflected by a new sysfs attribute file 'rng_selected'
which shows if the current rng has been chosen by
userspace. The new attribute file shows '1' for user
selected rng and '0' otherwise.
Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Reviewed-by: PrasannaKumar Muralidharan <prasannatsmkumar@gmail.com>
---
drivers/char/hw_random/core.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
index e9dda16..9701ac7 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -28,6 +28,8 @@
#define RNG_MODULE_NAME "hw_random"
static struct hwrng *current_rng;
+/* the current rng has been explicitly chosen by user via sysfs */
+static int cur_rng_set_by_user;
static struct task_struct *hwrng_fill;
/* list of registered rngs, sorted decending by quality */
static LIST_HEAD(rng_list);
@@ -304,6 +306,7 @@ static ssize_t hwrng_attr_current_store(struct device *dev,
list_for_each_entry(rng, &rng_list, list) {
if (sysfs_streq(rng->name, buf)) {
err = 0;
+ cur_rng_set_by_user = 1;
if (rng != current_rng)
err = set_current_rng(rng);
break;
@@ -352,16 +355,27 @@ static ssize_t hwrng_attr_available_show(struct device *dev,
return strlen(buf);
}
+static ssize_t hwrng_attr_selected_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n", cur_rng_set_by_user);
+}
+
static DEVICE_ATTR(rng_current, S_IRUGO | S_IWUSR,
hwrng_attr_current_show,
hwrng_attr_current_store);
static DEVICE_ATTR(rng_available, S_IRUGO,
hwrng_attr_available_show,
NULL);
+static DEVICE_ATTR(rng_selected, S_IRUGO,
+ hwrng_attr_selected_show,
+ NULL);
static struct attribute *rng_dev_attrs[] = {
&dev_attr_rng_current.attr,
&dev_attr_rng_available.attr,
+ &dev_attr_rng_selected.attr,
NULL
};
@@ -444,10 +458,12 @@ int hwrng_register(struct hwrng *rng)
old_rng = current_rng;
err = 0;
- if (!old_rng || (rng->quality > old_rng->quality)) {
+ if (!old_rng ||
+ (!cur_rng_set_by_user && rng->quality > old_rng->quality)) {
/*
* Set new rng as current as the new rng source
- * provides better entropy quality.
+ * provides better entropy quality and was not
+ * chosen by userspace.
*/
err = set_current_rng(rng);
if (err)
@@ -479,6 +495,7 @@ void hwrng_unregister(struct hwrng *rng)
list_del(&rng->list);
if (current_rng == rng) {
drop_current_rng();
+ cur_rng_set_by_user = 0;
/* rng_list is sorted by quality, use the best (=first) one */
if (!list_empty(&rng_list)) {
struct hwrng *new_rng;
--
2.7.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice
2017-07-11 7:36 [PATCH v2 0/2] crypto hwrng consider quality value, remember user choice Harald Freudenberger
2017-07-11 7:36 ` [PATCH 1/2] crypto: hwrng use rng source with best quality Harald Freudenberger
2017-07-11 7:36 ` [PATCH 2/2] crypto: hwrng remember rng chosen by user Harald Freudenberger
@ 2017-07-18 10:39 ` Herbert Xu
2 siblings, 0 replies; 4+ messages in thread
From: Herbert Xu @ 2017-07-18 10:39 UTC (permalink / raw)
To: Harald Freudenberger
Cc: linux-crypto, arnd, gregkh, prasannatsmkumar, schwidefsky
On Tue, Jul 11, 2017 at 09:36:21AM +0200, Harald Freudenberger wrote:
> The hwrng core implementation currently doesn't consider the
> quality field of the struct hwrng. So the first registered rng
> is the winner and further rng sources even with much better
> quality are ignored.
>
> The behavior should be that always the best rng with the highest
> quality rate should be used as current rng source. Only if the
> user explicitly chooses a rng source (via writing a rng name
> to /sys/class/misc/hw_random/rng_current) the decision for the
> best quality should be suppressed.
>
> This two patches make hwrng always hold a list of registered
> rng sources sorted decreasing by quality. On registration of a new
> hwrng source the list is updated and if the current rng source was
> not chosen by user and the new rng provides better quality set as
> new current rng source. Similar on unregistration of an rng, if it
> was the current used rng source the one with the next highest quality
> is used. If a rng source has been set via sysfs from userland as
> long as this one doesn't unregister it is kept as current rng
> regardless of registration of 'better' rng sources.
>
> Patch 1 introduces the sorted list of registered rngs and the
> always use the best quality behavior.
>
> Patch 2 makes hwrng remember that the user has selected an
> rng via echo to /sys/class/misc/hw_random/rng_current and
> adds a new sysfs attribute file 'rng_selected' to the rng core.
>
> Harald Freudenberger (2):
> crypto: hwrng use rng source with best quality
> crypto: hwrng remember rng chosen by user
All patches applied. Thanks.
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply [flat|nested] 4+ messages in thread