From: Sascha Hauer <s.hauer@pengutronix.de>
To: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH 2/7] add md5 support
Date: Thu, 16 Sep 2010 17:43:13 +0200 [thread overview]
Message-ID: <20100916154313.GA1473@pengutronix.de> (raw)
In-Reply-To: <1284040793-32145-2-git-send-email-plagnioj@jcrosoft.com>
On Thu, Sep 09, 2010 at 03:59:48PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> ---
> lib/Kconfig | 4 +
> lib/Makefile | 1 +
> lib/md5.c | 317 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 322 insertions(+), 0 deletions(-)
> create mode 100644 lib/md5.c
>
> diff --git a/lib/Kconfig b/lib/Kconfig
> index a571ba8..e8776a7 100644
> --- a/lib/Kconfig
> +++ b/lib/Kconfig
> @@ -15,6 +15,10 @@ menuconfig DIGEST
>
> if DIGEST
>
> +config MD5
> + bool "MD5"
> + default y
Please no default y here.
Sascha
> +
> endif
>
> config GENERIC_FIND_NEXT_BIT
> diff --git a/lib/Makefile b/lib/Makefile
> index 8c5df08..6a1fb5d 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -34,3 +34,4 @@ obj-y += lzo/
> obj-y += show_progress.o
> obj-$(CONFIG_LZO_DECOMPRESS) += decompress_unlzo.o
> obj-$(CONFIG_PROCESS_ESCAPE_SEQUENCE) += process_escape_sequence.o
> +obj-$(CONFIG_MD5) += md5.o
> diff --git a/lib/md5.c b/lib/md5.c
> new file mode 100644
> index 0000000..6c4ca1d
> --- /dev/null
> +++ b/lib/md5.c
> @@ -0,0 +1,317 @@
> +/*
> + * This file was transplanted with slight modifications from Linux sources
> + * (fs/cifs/md5.c) into U-Boot by Bartlomiej Sieka <tur@semihalf.com>.
> + */
> +
> +/*
> + * This code implements the MD5 message-digest algorithm.
> + * The algorithm is due to Ron Rivest. This code was
> + * written by Colin Plumb in 1993, no copyright is claimed.
> + * This code is in the public domain; do with it what you wish.
> + *
> + * Equivalent code is available from RSA Data Security, Inc.
> + * This code has been tested against that, and is equivalent,
> + * except that you don't need to include two pages of legalese
> + * with every copy.
> + *
> + * To compute the message digest of a chunk of bytes, declare an
> + * MD5Context structure, pass it to MD5Init, call MD5Update as
> + * needed on buffers full of bytes, and then call MD5Final, which
> + * will fill a supplied 16-byte array with the digest.
> + */
> +
> +/* This code slightly modified to fit into Samba by
> + abartlet@samba.org Jun 2001
> + and to fit the cifs vfs by
> + Steve French sfrench@us.ibm.com */
> +
> +#include <common.h>
> +#include <digest.h>
> +#include <init.h>
> +
> +struct MD5Context {
> + __u32 buf[4];
> + __u32 bits[2];
> + unsigned char in[64];
> +};
> +
> +static void
> +MD5Transform(__u32 buf[4], __u32 const in[16]);
> +
> +/*
> + * Note: this code is harmless on little-endian machines.
> + */
> +static void
> +byteReverse(unsigned char *buf, unsigned longs)
> +{
> + __u32 t;
> + do {
> + t = (__u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
> + ((unsigned) buf[1] << 8 | buf[0]);
> + *(__u32 *) buf = t;
> + buf += 4;
> + } while (--longs);
> +}
> +
> +/*
> + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
> + * initialization constants.
> + */
> +static void
> +MD5Init(struct MD5Context *ctx)
> +{
> + ctx->buf[0] = 0x67452301;
> + ctx->buf[1] = 0xefcdab89;
> + ctx->buf[2] = 0x98badcfe;
> + ctx->buf[3] = 0x10325476;
> +
> + ctx->bits[0] = 0;
> + ctx->bits[1] = 0;
> +}
> +
> +/*
> + * Update context to reflect the concatenation of another buffer full
> + * of bytes.
> + */
> +static void
> +MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
> +{
> + register __u32 t;
> +
> + /* Update bitcount */
> +
> + t = ctx->bits[0];
> + if ((ctx->bits[0] = t + ((__u32) len << 3)) < t)
> + ctx->bits[1]++; /* Carry from low to high */
> + ctx->bits[1] += len >> 29;
> +
> + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
> +
> + /* Handle any leading odd-sized chunks */
> +
> + if (t) {
> + unsigned char *p = (unsigned char *) ctx->in + t;
> +
> + t = 64 - t;
> + if (len < t) {
> + memmove(p, buf, len);
> + return;
> + }
> + memmove(p, buf, t);
> + byteReverse(ctx->in, 16);
> + MD5Transform(ctx->buf, (__u32 *) ctx->in);
> + buf += t;
> + len -= t;
> + }
> + /* Process data in 64-byte chunks */
> +
> + while (len >= 64) {
> + memmove(ctx->in, buf, 64);
> + byteReverse(ctx->in, 16);
> + MD5Transform(ctx->buf, (__u32 *) ctx->in);
> + buf += 64;
> + len -= 64;
> + }
> +
> + /* Handle any remaining bytes of data. */
> +
> + memmove(ctx->in, buf, len);
> +}
> +
> +/*
> + * Final wrapup - pad to 64-byte boundary with the bit pattern
> + * 1 0* (64-bit count of bits processed, MSB-first)
> + */
> +static void
> +MD5Final(unsigned char digest[16], struct MD5Context *ctx)
> +{
> + unsigned int count;
> + unsigned char *p;
> +
> + /* Compute number of bytes mod 64 */
> + count = (ctx->bits[0] >> 3) & 0x3F;
> +
> + /* Set the first char of padding to 0x80. This is safe since there is
> + always at least one byte free */
> + p = ctx->in + count;
> + *p++ = 0x80;
> +
> + /* Bytes of padding needed to make 64 bytes */
> + count = 64 - 1 - count;
> +
> + /* Pad out to 56 mod 64 */
> + if (count < 8) {
> + /* Two lots of padding: Pad the first block to 64 bytes */
> + memset(p, 0, count);
> + byteReverse(ctx->in, 16);
> + MD5Transform(ctx->buf, (__u32 *) ctx->in);
> +
> + /* Now fill the next block with 56 bytes */
> + memset(ctx->in, 0, 56);
> + } else {
> + /* Pad block to 56 bytes */
> + memset(p, 0, count - 8);
> + }
> + byteReverse(ctx->in, 14);
> +
> + /* Append length in bits and transform */
> + ((__u32 *) ctx->in)[14] = ctx->bits[0];
> + ((__u32 *) ctx->in)[15] = ctx->bits[1];
> +
> + MD5Transform(ctx->buf, (__u32 *) ctx->in);
> + byteReverse((unsigned char *) ctx->buf, 4);
> + memmove(digest, ctx->buf, 16);
> + memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
> +}
> +
> +/* The four core functions - F1 is optimized somewhat */
> +
> +/* #define F1(x, y, z) (x & y | ~x & z) */
> +#define F1(x, y, z) (z ^ (x & (y ^ z)))
> +#define F2(x, y, z) F1(z, x, y)
> +#define F3(x, y, z) (x ^ y ^ z)
> +#define F4(x, y, z) (y ^ (x | ~z))
> +
> +/* This is the central step in the MD5 algorithm. */
> +#define MD5STEP(f, w, x, y, z, data, s) \
> + ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
> +
> +/*
> + * The core of the MD5 algorithm, this alters an existing MD5 hash to
> + * reflect the addition of 16 longwords of new data. MD5Update blocks
> + * the data and converts bytes into longwords for this routine.
> + */
> +static void
> +MD5Transform(__u32 buf[4], __u32 const in[16])
> +{
> + register __u32 a, b, c, d;
> +
> + a = buf[0];
> + b = buf[1];
> + c = buf[2];
> + d = buf[3];
> +
> + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
> + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
> + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
> + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
> + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
> + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
> + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
> + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
> + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
> + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
> + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
> + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
> + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
> + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
> + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
> + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
> +
> + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
> + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
> + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
> + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
> + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
> + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
> + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
> + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
> + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
> + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
> + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
> + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
> + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
> + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
> + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
> + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
> +
> + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
> + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
> + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
> + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
> + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
> + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
> + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
> + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
> + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
> + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
> + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
> + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
> + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
> + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
> + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
> + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
> +
> + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
> + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
> + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
> + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
> + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
> + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
> + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
> + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
> + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
> + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
> + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
> + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
> + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
> + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
> + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
> + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
> +
> + buf[0] += a;
> + buf[1] += b;
> + buf[2] += c;
> + buf[3] += d;
> +}
> +
> +struct md5 {
> + struct MD5Context context;
> + struct digest d;
> +};
> +
> +static int digest_md5_init(struct digest *d)
> +{
> + struct md5 *m = container_of(d, struct md5, d);
> +
> + MD5Init(&m->context);
> +
> + return 0;
> +}
> +
> +static int digest_md5_update(struct digest *d, const void *data,
> + unsigned long len)
> +{
> + struct md5 *m = container_of(d, struct md5, d);
> +
> + MD5Update(&m->context, data, len);
> +
> + return 0;
> +}
> +
> +static int digest_md5_final(struct digest *d, unsigned char *md)
> +{
> + struct md5 *m = container_of(d, struct md5, d);
> +
> + MD5Final(md, &m->context);
> +
> + return 0;
> +}
> +
> +static struct md5 m = {
> + .d = {
> + .name = "md5",
> + .init = digest_md5_init,
> + .update = digest_md5_update,
> + .final = digest_md5_final,
> + .length = 16,
> + }
> +};
> +
> +static int md5_digest_register(void)
> +{
> + digest_register(&m.d);
> +
> + return 0;
> +}
> +device_initcall(md5_digest_register);
> --
> 1.7.1
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2010-09-16 15:43 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-09 13:55 [PATCH 0/7] Digest and login/password Frameworks Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 1/7] add digest framework Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 2/7] add md5 support Jean-Christophe PLAGNIOL-VILLARD
2010-09-16 15:43 ` Sascha Hauer [this message]
2010-09-17 4:42 ` Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 3/7] add sha1 support Jean-Christophe PLAGNIOL-VILLARD
2010-09-16 15:53 ` Sascha Hauer
2010-09-16 15:59 ` Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 4/7] add sha256 support Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 5/7] add password framework Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 6/7] add passwd command Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 13:59 ` [PATCH 7/7] add login support Jean-Christophe PLAGNIOL-VILLARD
2010-09-09 14:01 ` [PATCH 0/7] Digest and login/password Frameworks Jean-Christophe PLAGNIOL-VILLARD
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100916154313.GA1473@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=barebox@lists.infradead.org \
--cc=plagnioj@jcrosoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.