lkml.org 
[lkml]   [2005]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH 4/12] random pt4: Cleanup SHA interface
    Date
    On Friday 21 January 2005 23:41, Matt Mackall wrote:
    > Clean up SHA hash function for moving to lib/
    > Do proper endian conversion
    > Provide sha_init function
    > Add kerneldoc
    >
    > Signed-off-by: Matt Mackall <mpm@selenic.com>
    >
    > Index: rnd2/drivers/char/random.c
    > ===================================================================
    > --- rnd2.orig/drivers/char/random.c 2005-01-20 12:28:27.979725732 -0800
    > +++ rnd2/drivers/char/random.c 2005-01-20 12:28:34.506893589 -0800
    > @@ -671,29 +671,6 @@
    >
    > EXPORT_SYMBOL(add_disk_randomness);
    >
    > -/******************************************************************
    > - *
    > - * Hash function definition
    > - *
    > - *******************************************************************/
    > -
    > -/*
    > - * This chunk of code defines a function
    > - * void sha_transform(__u32 digest[HASH_BUFFER_SIZE + HASH_EXTRA_SIZE],
    > - * __u32 const data[16])
    > - *
    > - * The function hashes the input data to produce a digest in the first
    > - * HASH_BUFFER_SIZE words of the digest[] array, and uses HASH_EXTRA_SIZE
    > - * more words for internal purposes. (This buffer is exported so the
    > - * caller can wipe it once rather than this code doing it each call,
    > - * and tacking it onto the end of the digest[] array is the quick and
    > - * dirty way of doing it.)
    > - *
    > - * For /dev/random purposes, the length of the data being hashed is
    > - * fixed in length, so appending a bit count in the usual way is not
    > - * cryptographically necessary.
    > - */
    > -
    > #define HASH_BUFFER_SIZE 5
    > #define EXTRACT_SIZE 10
    > #define HASH_EXTRA_SIZE 80
    > @@ -717,20 +694,32 @@
    > #define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */
    > #define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */
    >
    > -static void sha_transform(__u32 digest[85], __u32 const data[16])
    > +/*
    > + * sha_transform: single block SHA1 transform
    > + *
    > + * @digest: 160 bit digest to update
    > + * @data: 512 bytes of data to hash
    > + * @W: 80 words of workspace
    > + *
    > + * This function generates a SHA1 digest for a single. Be warned, it
    > + * does not handle padding and message digest, do not confuse it with
    > + * the full FIPS 180-1 digest algorithm for variable length messages.
    > + */
    > +static void sha_transform(__u32 digest[5], const char *data, __u32 W[80])
    > {
    > - __u32 A, B, C, D, E; /* Local vars */
    > + __u32 A, B, C, D, E;
    > __u32 TEMP;
    > int i;
    > -#define W (digest + HASH_BUFFER_SIZE) /* Expanded data array */
    >
    > + memset(W, 0, sizeof(W));

    Hmm..... Parameter decays into pointer, sizeof(W) != 80*4. See:
    # cat tt.c
    #include <stdio.h>
    void f(char w[80]) {
    printf("%d\n", sizeof(w));
    }
    int main() {
    f(0);
    return 0;
    }
    # gcc tt.c; ./a.out
    4
    # gcc --version
    gcc (GCC) 3.4.3
    In light of this, if your sha1 passed regression tests,
    I conclude that we don't need that memset at all.

    > + for (i = 0; i < 16; i++)
    > + W[i] = be32_to_cpu(((const __u32 *)data)[i]);
    > /*
    > * Do the preliminary expansion of 16 to 80 words. Doing it
    > * out-of-line line this is faster than doing it in-line on
    > * register-starved machines like the x86, and not really any
    > * slower on real processors.
    > */
    > - memcpy(W, data, 16*sizeof(__u32));
    > for (i = 0; i < 64; i++) {
    > TEMP = W[i] ^ W[i+2] ^ W[i+8] ^ W[i+13];
    > W[i+16] = rol32(TEMP, 1);
    > @@ -768,7 +757,6 @@
    > digest[4] += E;
    >
    > /* W is wiped by the caller */
    > -#undef W
    > }
    >
    > #undef f1
    > @@ -780,6 +768,20 @@
    > #undef K3
    > #undef K4
    >
    > +/*
    > + * sha_init: initialize the vectors for a SHA1 digest
    > + *
    > + * @buf: vector to initialize
    > + */
    > +static void sha_init(__u32 *buf)
    > +{
    > + buf[0] = 0x67452301;
    > + buf[1] = 0xefcdab89;
    > + buf[2] = 0x98badcfe;
    > + buf[3] = 0x10325476;
    > + buf[4] = 0xc3d2e1f0;
    > +}
    > +
    > /*********************************************************************
    > *
    > * Entropy extraction routines
    > @@ -870,13 +872,7 @@
    > int i, x;
    > __u32 data[16], buf[85];
    >
    > - /* Hash the pool to get the output */
    > - buf[0] = 0x67452301;
    > - buf[1] = 0xefcdab89;
    > - buf[2] = 0x98badcfe;
    > - buf[3] = 0x10325476;
    > - buf[4] = 0xc3d2e1f0;
    > -
    > + sha_init(buf);
    > /*
    > * As we hash the pool, we mix intermediate values of
    > * the hash back into the pool. This eliminates
    > @@ -886,7 +882,7 @@
    > * function can be inverted.
    > */
    > for (i = 0, x = 0; i < r->poolinfo->poolwords; i += 16, x+=2) {
    > - sha_transform(buf, r->pool+i);
    > + sha_transform(buf, (__u8 *)r->pool+i, buf + 5);
    > add_entropy_words(r, &buf[x % 5], 1);
    > }
    >
    > @@ -896,7 +892,7 @@
    > * final time.
    > */
    > __add_entropy_words(r, &buf[x % 5], 1, data);
    > - sha_transform(buf, data);
    > + sha_transform(buf, (__u8 *)data, buf + 5);
    >
    > /*
    > * In case the hash function has some recognizable
    > @@ -1771,7 +1767,7 @@
    > tmp[0]=saddr;
    > tmp[1]=daddr;
    > tmp[2]=(sport << 16) + dport;
    > - sha_transform(tmp+16, tmp);
    > + sha_transform(tmp+16, (__u8 *)tmp, tmp + 16 + 5);
    > seq = tmp[17] + sseq + (count << COOKIEBITS);
    >
    > memcpy(tmp + 3, syncookie_secret[1], sizeof(syncookie_secret[1]));
    > @@ -1779,7 +1775,7 @@
    > tmp[1]=daddr;
    > tmp[2]=(sport << 16) + dport;
    > tmp[3] = count; /* minute counter */
    > - sha_transform(tmp + 16, tmp);
    > + sha_transform(tmp + 16, (__u8 *)tmp, tmp + 16 + 5);
    >
    > /* Add in the second hash and the data */
    > return seq + ((tmp[17] + data) & COOKIEMASK);
    > @@ -1808,7 +1804,7 @@
    > tmp[0]=saddr;
    > tmp[1]=daddr;
    > tmp[2]=(sport << 16) + dport;
    > - sha_transform(tmp + 16, tmp);
    > + sha_transform(tmp + 16, (__u8 *)tmp, tmp + 16 + 5);
    > cookie -= tmp[17] + sseq;
    > /* Cookie is now reduced to (count * 2^24) ^ (hash % 2^24) */
    >
    > -
    > 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/
    >
    >

    -
    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: 2005-03-22 14:09    [W:0.113 / U:0.252 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site