lkml.org 
[lkml]   [2018]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 167/196] random: add new ioctl RNDRESEEDCRNG
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Theodore Ts'o <tytso@mit.edu>

    commit d848e5f8e1ebdb227d045db55fe4f825e82965fa upstream.

    Add a new ioctl which forces the the crng to be reseeded.

    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/char/random.c | 13 ++++++++++++-
    include/uapi/linux/random.h | 3 +++
    2 files changed, 15 insertions(+), 1 deletion(-)

    --- a/drivers/char/random.c
    +++ b/drivers/char/random.c
    @@ -429,6 +429,7 @@ struct crng_state primary_crng = {
    static int crng_init = 0;
    #define crng_ready() (likely(crng_init > 1))
    static int crng_init_cnt = 0;
    +static unsigned long crng_global_init_time = 0;
    #define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE)
    static void _extract_crng(struct crng_state *crng,
    __u32 out[CHACHA20_BLOCK_WORDS]);
    @@ -932,7 +933,8 @@ static void _extract_crng(struct crng_st
    unsigned long v, flags;

    if (crng_ready() &&
    - time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL))
    + (time_after(crng_global_init_time, crng->init_time) ||
    + time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL)))
    crng_reseed(crng, crng == &primary_crng ? &input_pool : NULL);
    spin_lock_irqsave(&crng->lock, flags);
    if (arch_get_random_long(&v))
    @@ -1759,6 +1761,7 @@ static int rand_initialize(void)
    init_std_data(&input_pool);
    init_std_data(&blocking_pool);
    crng_initialize(&primary_crng);
    + crng_global_init_time = jiffies;
    return 0;
    }
    early_initcall(rand_initialize);
    @@ -1932,6 +1935,14 @@ static long random_ioctl(struct file *f,
    input_pool.entropy_count = 0;
    blocking_pool.entropy_count = 0;
    return 0;
    + case RNDRESEEDCRNG:
    + if (!capable(CAP_SYS_ADMIN))
    + return -EPERM;
    + if (crng_init < 2)
    + return -ENODATA;
    + crng_reseed(&primary_crng, NULL);
    + crng_global_init_time = jiffies - 1;
    + return 0;
    default:
    return -EINVAL;
    }
    --- a/include/uapi/linux/random.h
    +++ b/include/uapi/linux/random.h
    @@ -35,6 +35,9 @@
    /* Clear the entropy pool and associated counters. (Superuser only.) */
    #define RNDCLEARPOOL _IO( 'R', 0x06 )

    +/* Reseed CRNG. (Superuser only.) */
    +#define RNDRESEEDCRNG _IO( 'R', 0x07 )
    +
    struct rand_pool_info {
    int entropy_count;
    int buf_size;

    \
     
     \ /
      Last update: 2018-04-22 17:48    [W:4.261 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site