forked from enlightenment/enlightenment
added utility function for md5 sum
item_changed event now says what has changed SVN revision: 48680
This commit is contained in:
parent
836bc51c7e
commit
4c8e8f64ce
|
@ -92,7 +92,13 @@ typedef unsigned int Evry_Type;
|
||||||
if (EVRY_ITEM(_it)->detail) eina_stringshare_del(EVRY_ITEM(_it)->detail); \
|
if (EVRY_ITEM(_it)->detail) eina_stringshare_del(EVRY_ITEM(_it)->detail); \
|
||||||
EVRY_ITEM(_it)->detail = eina_stringshare_add(_detail);
|
EVRY_ITEM(_it)->detail = eina_stringshare_add(_detail);
|
||||||
|
|
||||||
|
#define EVRY_ITEM_LABEL_SET(_it, _label) \
|
||||||
|
if (EVRY_ITEM(_it)->label) eina_stringshare_del(EVRY_ITEM(_it)->label); \
|
||||||
|
EVRY_ITEM(_it)->label = eina_stringshare_add(_label);
|
||||||
|
|
||||||
|
#define EVRY_ITEM_CONTEXT_SET(_it, _context) \
|
||||||
|
if (EVRY_ITEM(_it)->context) eina_stringshare_del(EVRY_ITEM(_it)->context); \
|
||||||
|
EVRY_ITEM(_it)->context = eina_stringshare_add(_context);
|
||||||
|
|
||||||
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
|
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
|
||||||
(_base *) evry_item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
|
(_base *) evry_item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
|
||||||
|
@ -372,6 +378,8 @@ struct _Evry_View
|
||||||
struct _Evry_Event_Item_Changed
|
struct _Evry_Event_Item_Changed
|
||||||
{
|
{
|
||||||
Evry_Item *item;
|
Evry_Item *item;
|
||||||
|
int changed_selection;
|
||||||
|
int changed_icon;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FIXME this should be exposed.
|
/* FIXME this should be exposed.
|
||||||
|
@ -523,6 +531,8 @@ EAPI Eina_Bool evry_util_module_config_check(const char *module_name, int conf,
|
||||||
EAPI Evas_Object *evry_util_icon_get(Evry_Item *it, Evas *e);
|
EAPI Evas_Object *evry_util_icon_get(Evry_Item *it, Evas *e);
|
||||||
EAPI int evry_util_plugin_items_add(Evry_Plugin *p, Eina_List *items, const char *input, int match_detail, int set_usage);
|
EAPI int evry_util_plugin_items_add(Evry_Plugin *p, Eina_List *items, const char *input, int match_detail, int set_usage);
|
||||||
EAPI int evry_items_sort_func(const void *data1, const void *data2);
|
EAPI int evry_items_sort_func(const void *data1, const void *data2);
|
||||||
|
EAPI void evry_event_item_changed(Evry_Item *it, int change_icon, int change_selected);
|
||||||
|
EAPI char *evry_util_md5_sum(const char *str);
|
||||||
|
|
||||||
EAPI const char *evry_file_path_get(Evry_Item_File *file);
|
EAPI const char *evry_file_path_get(Evry_Item_File *file);
|
||||||
EAPI const char *evry_file_uri_get(Evry_Item_File *file);
|
EAPI const char *evry_file_uri_get(Evry_Item_File *file);
|
||||||
|
|
|
@ -36,7 +36,9 @@ module_la_SOURCES = $(EVRYHEADERS) \
|
||||||
evry_plug_view_thumb.c \
|
evry_plug_view_thumb.c \
|
||||||
evry_plug_view_help.c \
|
evry_plug_view_help.c \
|
||||||
evry_plug_clipboard.c \
|
evry_plug_clipboard.c \
|
||||||
evry_plug_text.c
|
evry_plug_text.c \
|
||||||
|
md5.h \
|
||||||
|
md5.c
|
||||||
|
|
||||||
module_la_LIBADD = @e_libs@ @dlopen_libs@
|
module_la_LIBADD = @e_libs@ @dlopen_libs@
|
||||||
module_la_LDFLAGS = -module -avoid-version
|
module_la_LDFLAGS = -module -avoid-version
|
||||||
|
|
|
@ -1365,28 +1365,36 @@ _cb_item_changed(void *data, int type, void *event)
|
||||||
EINA_LIST_FOREACH(sd->items, l, it)
|
EINA_LIST_FOREACH(sd->items, l, it)
|
||||||
if (it->item == ev->item)
|
if (it->item == ev->item)
|
||||||
{
|
{
|
||||||
if (it->item->selected)
|
if (ev->changed_selection)
|
||||||
_pan_item_select(v->span, it, 1);
|
{
|
||||||
|
if (it->item->selected)
|
||||||
|
_pan_item_select(v->span, it, 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!it->visible) break;
|
if (!it->visible) break;
|
||||||
|
|
||||||
edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
|
edje_object_part_text_set(it->frame, "e.text.label", it->item->label);
|
||||||
|
|
||||||
if (it->do_thumb) e_thumb_icon_end(it->thumb);
|
if (ev->changed_icon)
|
||||||
if (it->thumb) evas_object_del(it->thumb);
|
{
|
||||||
if (it->image) evas_object_del(it->image);
|
if (it->do_thumb) e_thumb_icon_end(it->thumb);
|
||||||
|
if (it->thumb) evas_object_del(it->thumb);
|
||||||
|
if (it->image) evas_object_del(it->image);
|
||||||
|
|
||||||
it->thumb = NULL;
|
it->thumb = NULL;
|
||||||
it->image = NULL;
|
it->image = NULL;
|
||||||
|
|
||||||
it->have_thumb = EINA_FALSE;
|
it->have_thumb = EINA_FALSE;
|
||||||
it->do_thumb = EINA_FALSE;
|
it->do_thumb = EINA_FALSE;
|
||||||
|
|
||||||
if (!eina_list_data_find(sd->queue, it))
|
if (!eina_list_data_find(sd->queue, it))
|
||||||
sd->queue = eina_list_append(sd->queue, it);
|
sd->queue = eina_list_append(sd->queue, it);
|
||||||
|
|
||||||
if (!sd->thumb_idler)
|
if (!sd->thumb_idler)
|
||||||
sd->thumb_idler = ecore_timer_add(0.01,_thumb_idler, sd);
|
sd->thumb_idler = ecore_timer_add(0.01,_thumb_idler, sd);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "Evry.h"
|
#include "Evry.h"
|
||||||
|
#include "md5.h"
|
||||||
|
|
||||||
#define MAX_FUZZ 100
|
#define MAX_FUZZ 100
|
||||||
#define MAX_WORDS 5
|
#define MAX_WORDS 5
|
||||||
|
@ -840,3 +841,50 @@ evry_file_uri_get(Evry_Item_File *file)
|
||||||
|
|
||||||
return file->url;
|
return file->url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cb_free_item_changed(void *data, void *event)
|
||||||
|
{
|
||||||
|
Evry_Event_Item_Changed *ev = event;
|
||||||
|
|
||||||
|
evry_item_free(ev->item);
|
||||||
|
E_FREE(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
evry_event_item_changed(Evry_Item *it, int icon, int selected)
|
||||||
|
{
|
||||||
|
Evry_Event_Item_Changed *ev;
|
||||||
|
ev = E_NEW(Evry_Event_Item_Changed, 1);
|
||||||
|
ev->item = it;
|
||||||
|
ev->changed_selection = selected;
|
||||||
|
ev->changed_icon = icon;
|
||||||
|
evry_item_ref(it);
|
||||||
|
ecore_event_add(EVRY_EVENT_ITEM_CHANGED, ev, _cb_free_item_changed, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char thumb_buf[4096];
|
||||||
|
static const char hex[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
EAPI char *
|
||||||
|
evry_util_md5_sum(const char *str)
|
||||||
|
{
|
||||||
|
MD5_CTX ctx;
|
||||||
|
unsigned char hash[MD5_HASHBYTES];
|
||||||
|
int n;
|
||||||
|
char md5out[(2 * MD5_HASHBYTES) + 1];
|
||||||
|
MD5Init (&ctx);
|
||||||
|
MD5Update (&ctx, (unsigned char const*)str,
|
||||||
|
(unsigned)strlen (str));
|
||||||
|
MD5Final (hash, &ctx);
|
||||||
|
|
||||||
|
for (n = 0; n < MD5_HASHBYTES; n++)
|
||||||
|
{
|
||||||
|
md5out[2 * n] = hex[hash[n] >> 4];
|
||||||
|
md5out[2 * n + 1] = hex[hash[n] & 0x0f];
|
||||||
|
}
|
||||||
|
md5out[2 * n] = '\0';
|
||||||
|
|
||||||
|
return strdup(md5out);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,251 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h> /* for memcpy() */
|
||||||
|
#include "md5.h"
|
||||||
|
|
||||||
|
#if (__BYTE_ORDER == 1234)
|
||||||
|
#define byteReverse(buf, len) /* Nothing */
|
||||||
|
#else
|
||||||
|
void byteReverse(unsigned char *buf, unsigned longs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note: this code is harmless on little-endian machines.
|
||||||
|
*/
|
||||||
|
void byteReverse(unsigned char *buf, unsigned longs)
|
||||||
|
{
|
||||||
|
uint32_t t;
|
||||||
|
do {
|
||||||
|
t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
|
||||||
|
((unsigned) buf[1] << 8 | buf[0]);
|
||||||
|
*(uint32_t *) buf = t;
|
||||||
|
buf += 4;
|
||||||
|
} while (--longs);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
|
||||||
|
* initialization constants.
|
||||||
|
*/
|
||||||
|
void MD5Init(MD5_CTX *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.
|
||||||
|
*/
|
||||||
|
void MD5Update(MD5_CTX *ctx, unsigned char const *buf, unsigned len)
|
||||||
|
{
|
||||||
|
uint32_t t;
|
||||||
|
|
||||||
|
/* Update bitcount */
|
||||||
|
|
||||||
|
t = ctx->bits[0];
|
||||||
|
if ((ctx->bits[0] = t + ((uint32_t) 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) {
|
||||||
|
memcpy(p, buf, len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy(p, buf, t);
|
||||||
|
byteReverse(ctx->in, 16);
|
||||||
|
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
||||||
|
buf += t;
|
||||||
|
len -= t;
|
||||||
|
}
|
||||||
|
/* Process data in 64-byte chunks */
|
||||||
|
|
||||||
|
while (len >= 64) {
|
||||||
|
memcpy(ctx->in, buf, 64);
|
||||||
|
byteReverse(ctx->in, 16);
|
||||||
|
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
||||||
|
buf += 64;
|
||||||
|
len -= 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle any remaining bytes of data. */
|
||||||
|
|
||||||
|
memcpy(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)
|
||||||
|
*/
|
||||||
|
void MD5Final(unsigned char digest[16], MD5_CTX *ctx)
|
||||||
|
{
|
||||||
|
unsigned 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, (uint32_t *) 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 */
|
||||||
|
((uint32_t *) ctx->in)[14] = ctx->bits[0];
|
||||||
|
((uint32_t *) ctx->in)[15] = ctx->bits[1];
|
||||||
|
|
||||||
|
MD5Transform(ctx->buf, (uint32_t *) ctx->in);
|
||||||
|
byteReverse((unsigned char *) ctx->buf, 4);
|
||||||
|
memcpy(digest, ctx->buf, 16);
|
||||||
|
memset((char *) 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.
|
||||||
|
*/
|
||||||
|
void MD5Transform(uint32_t buf[4], uint32_t const in[16])
|
||||||
|
{
|
||||||
|
register uint32_t 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;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef _MD5_H_
|
||||||
|
#define _MD5_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#define MD5_HASHBYTES 16
|
||||||
|
|
||||||
|
typedef struct MD5Context {
|
||||||
|
uint32_t buf[4];
|
||||||
|
uint32_t bits[2];
|
||||||
|
unsigned char in[64];
|
||||||
|
} MD5_CTX;
|
||||||
|
|
||||||
|
extern void MD5Init(MD5_CTX *context);
|
||||||
|
extern void MD5Update(MD5_CTX *context,unsigned char const *buf,unsigned len);
|
||||||
|
extern void MD5Final(unsigned char digest[MD5_HASHBYTES], MD5_CTX *context);
|
||||||
|
|
||||||
|
extern void MD5Transform(uint32_t buf[4], uint32_t const in[16]);
|
||||||
|
extern char *MD5End(MD5_CTX *, char *);
|
||||||
|
extern char *MD5File(const char *, char *);
|
||||||
|
extern char *MD5Data (const unsigned char *, unsigned int, char *);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue