lkml.org 
[lkml]   [2007]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] get_random_long() and AT_ENTROPY for auxv, kernel 2.6.21.5
    Hi,

    http://dev.gentoo.org/~pappy/kernel/linux-2.6.21.5-get_urandom_long-AT_ENTROPY.patch

    this patch adds the function drivers/char/random.c:get_random_long()
    and adds an AT_ENTROPY field in the auxv without config option
    (the config option was removed as suggested by Arjan on LKML).

    README: get_random_long() and AT_ENTROPY support for auxv
    NAME: Alexander Gabert
    EMAIL: pappy@gentoo.org



    diff -Nru linux-2.6.21.5.ORIG/drivers/char/random.c
    linux-2.6.21.5/drivers/char/random.c
    --- linux-2.6.21.5.ORIG/drivers/char/random.c 2007-06-11
    20:37:06.000000000 +0200
    +++ linux-2.6.21.5/drivers/char/random.c 2007-06-20
    17:00:35.000000000 +0200
    @@ -1654,6 +1654,53 @@
    }

    /*
    + * get_random_long() returns a randomized unsigned long word.
    + * It recycles it's entropy cache for a given time period and
    + * uses half_md4_transform to generate a unique return value.
    + * Every REKEY_INTERVAL the cache is reloaded with fresh
    + * randomization data using get_random_bytes().
    + * This function is not intended for strong cryptographic routines.
    + */
    +unsigned long get_random_long(void)
    +{
    + /* remember the last time we refreshed the cache with random entropy */
    + static time_t rekey_time;
    +
    + time_t t;
    +
    + /*
    + * the following data in the buffer is unchanged during REKEY_INTERVAL:
    + * |----|----|KKKK|KKKK|KKKK|KKKK|KKKK|KKKK|----|----|----|----|
    + * ___0____1____2____3____4____5____6____7____8____9___10___11__
    + *
    + * the following data is updated during the first half_md4_transform call
    + * |----|YYYY|----|----|----|----|----|----|ZZZZ|ZZZZ|ZZZZ|ZZZZ|
    + * ___0____1____2____3____4____5____6____7____8____9___10___11__
    + *
    + * the following data is updated during the second half_md4_transform
    + * |XXXX|----|----|----|----|----|----|----|ZZZZ|ZZZZ|ZZZZ|ZZZZ|
    + * ___0____1____2____3____4____5____6____7____8____9___10___11__
    + */
    + static __u32 entropycache[12];
    +
    + /* get the current time in seconds */
    + t = get_seconds();
    +
    + /* check for REKEY_INTERVAL */
    + if (t && (!rekey_time || ((t - rekey_time) > REKEY_INTERVAL))) {
    + rekey_time = t;
    + /* refresh with random entropy */
    + get_random_bytes(entropycache, sizeof(entropycache));
    + }
    +
    + /* transform the buffer to a new state, thus generating new return
    value */
    + entropycache[1] = half_md4_transform(entropycache+8, entropycache);
    + entropycache[0] = half_md4_transform(entropycache+8, entropycache);
    +
    + return *(unsigned long *)entropycache;
    +}
    +
    +/*
    * randomize_range() returns a start address such that
    *
    * [...... <range> .....]
    diff -Nru linux-2.6.21.5.ORIG/fs/binfmt_elf.c linux-2.6.21.5/fs/binfmt_elf.c
    --- linux-2.6.21.5.ORIG/fs/binfmt_elf.c 2007-06-11 20:37:06.000000000
    +0200
    +++ linux-2.6.21.5/fs/binfmt_elf.c 2007-06-20 17:02:59.000000000 +0200
    @@ -201,6 +201,7 @@
    NEW_AUX_ENT(AT_GID, tsk->gid);
    NEW_AUX_ENT(AT_EGID, tsk->egid);
    NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
    + NEW_AUX_ENT(AT_ENTROPY, get_random_long());
    if (k_platform) {
    NEW_AUX_ENT(AT_PLATFORM,
    (elf_addr_t)(unsigned long)u_platform);
    diff -Nru linux-2.6.21.5.ORIG/include/linux/auxvec.h
    linux-2.6.21.5/include/linux/auxvec.h
    --- linux-2.6.21.5.ORIG/include/linux/auxvec.h 2007-06-11
    20:37:06.000000000 +0200
    +++ linux-2.6.21.5/include/linux/auxvec.h 2007-06-20
    16:47:44.000000000 +0200
    @@ -26,6 +26,8 @@

    #define AT_SECURE 23 /* secure mode boolean */

    -#define AT_VECTOR_SIZE 44 /* Size of auxiliary table. */
    +#define AT_ENTROPY 24 /* kernel entropy in auxv */
    +
    +#define AT_VECTOR_SIZE 45 /* Size of auxiliary table in. */

    #endif /* _LINUX_AUXVEC_H */
    diff -Nru linux-2.6.21.5.ORIG/include/linux/random.h
    linux-2.6.21.5/include/linux/random.h
    --- linux-2.6.21.5.ORIG/include/linux/random.h 2007-06-11
    20:37:06.000000000 +0200
    +++ linux-2.6.21.5/include/linux/random.h 2007-06-20
    16:19:02.000000000 +0200
    @@ -67,6 +67,9 @@
    #endif

    unsigned int get_random_int(void);
    +
    +unsigned long get_random_long(void);
    +
    unsigned long randomize_range(unsigned long start, unsigned long end,
    unsigned long len);

    u32 random32(void);


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-06-20 17:37    [W:0.031 / U:63.924 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site